快速開始laravel項(xiàng)目较鼓,集成了laravel-admin,日志违柏, 調(diào)試博烂, 圖片上傳等第三方包。

代碼已放在 github 上漱竖,歡迎參考和提出 issue:laravel-quick-start github地址

環(huán)境+包

一共需要安裝的包

// 不需要手動(dòng)引入服務(wù)提供者
"arcanedev/log-viewer": "^4.3",
// 不需要手動(dòng)引入服務(wù)提供者
"barryvdh/laravel-debugbar": "^2.4",
// 不需要手動(dòng)引入服務(wù)提供者
"encore/laravel-admin": "1.4.*",
// 不需要手動(dòng)引入服務(wù)提供者
"laracasts/flash": "^3.0",
// 不需要手動(dòng)引入服務(wù)提供者
"predis/predis": "^1.1",
// 不需要手動(dòng)引入服務(wù)提供者
"prettus/l5-repository": "^2.6",
// 不需要手動(dòng)引入服務(wù)提供者
"zgldh/qiniu-laravel-storage": "^0.7.0"
// 不需要手動(dòng)引入服務(wù)提供者
"spatie/laravel-backup": "^4.18",
// 不需要手動(dòng)引入服務(wù)提供者
"intervention/image": "^2.4",
// 不需要手動(dòng)引入服務(wù)提供者
"maatwebsite/excel": "^2.1",
// 直接安裝
"doctrine/dbal": "^2.5",
// 直接安裝
"spatie/eloquent-sortable": "^3.3",


/**
 * tian 引入 `axdlee/laravel-config-writer`【生成配置文件】-可以不要
 */
Axdlee\Config\ConfigServiceProvider::class,
"axdlee/laravel-config-writer": "^1.0",
"hassankhan/config": "^0.10.0",

初始化項(xiàng)目

laravel new 項(xiàng)目名

修改時(shí)區(qū)

config/app.php 里面修改時(shí)區(qū)

'timezone' => 'UTC',

改為

'timezone' => 'PRC',

session 存在 redis

  • 安裝包 composer require predis/predis

  • config\database.php 中的 redis 添加

// tian add session saved to redis
'session' => [
    'host'     => env('REDIS_HOST', 'localhost'),
    'password' => env('REDIS_PASSWORD', null),
    'port'     => env('REDIS_PORT', 6379),
    'database' => 1,
],
  • config\session.php 中修改
// tian add session saved to redis
// 'connection' => null,
'connection' => 'session',
  • .env 里面修改
# tian add session saved to redis
SESSION_DRIVER=redis

引入自定義類和函數(shù)

引入自定義類

app 目錄下新建文件夾 Classes

本來是需要在 composer.json 里面引入, 但是因?yàn)槭窃?app 目錄下面 psr-4 了所以不需要

    "autoload": {
        "classmap": [
            "database",
            "app/Classes"http:// 這行, 引入自定義類
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "app/helpers.php"http:// 這行, 引入自定義函數(shù)
        ]
    },

引入自定義函數(shù)

app 目錄下新建文件 helpers.php

使用 laravel-admin

  • 安裝 composer require encore/laravel-admin

  • 然后運(yùn)行下面的命令來發(fā)布資源:php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

  • 自定義(重載) 修改默認(rèn)的 9 張表, 在 config/admin.php 里的 database 的表名加上 laravel_ 前綴.

  • 防止執(zhí)行數(shù)據(jù)遷移報(bào)錯(cuò), 先解決字符長度問題

  • 安裝 php artisan admin:install

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2016_01_04_173148_create_admin_tables
Migrated:  2016_01_04_173148_create_admin_tables
Admin directory was created: \app\Admin
HomeController file was created: \app\Admin/Controllers/HomeController.php
ExampleController file was created: \app\Admin/Controllers/ExampleController.php

Bootstrap file was created: \app\Admin/bootstrap.php
Routes file was created: \app\Admin/routes.php
  • 配置圖片圖片上傳, 配置 config/filesystems.php
'admin' => [
    'driver' => 'local',
    'root' => public_path('uploads'),
    'visibility' => 'public',
    'url' => env('APP_URL').'/uploads',
],
  • 自定義視圖目錄

復(fù)制 vendor/encore/laravel-admin/resources/views 到項(xiàng)目的 resources/views/laravel-admin禽篱,然后在
app/Admin/bootstrap.php 文件中加入代碼:app('view')->prependNamespace('admin', resource_path('views/laravel-admin'));

  • 自定義語言包

復(fù)制 vendor/encore/laravel-admin/lang 到項(xiàng)目的 resources/lang/laravel-admin,然后在 app/Admin/bootstrap.php 文件中加入代碼:app('translator')->addNamespace('admin', resource_path('lang/laravel-admin'));

/**
 * 忽略 `map`, `editor` 控件
 */
Encore\Admin\Form::forget(['map', 'editor']);

/**
 * 修改命名空間
 */
// tian 修改 `laravel-admin` view, 便于修改, 這樣就不需要?jiǎng)?`laravel-admin` 的源碼馍惹。復(fù)制 `vendor/encore/laravel-admin/views` 到項(xiàng)目的 `resources/views/laravel-admin`
app('view')->prependNamespace('admin', resource_path('views/laravel-admin'));
// tian 修改 `laravel-admin` 的語言包, 復(fù)制 `vendor/encore/laravel-admin/lang` 到項(xiàng)目的 `resources/lang/admin`躺率。如果將系統(tǒng)語言locale設(shè)置為 `zh-cn`, 可以將 `resources/lang/admin` 目錄下的 `zh_CN` 目錄重命名為 `zh-cn` 即可
app('translator')->addNamespace('admin', resource_path('lang/laravel-admin'));

laravel-admin 要做的修改:

自定義(重載)

修改默認(rèn)的 9 張表

config/admin.php 里的 database 的表名加上 laravel_ 前綴

關(guān)于自定義視圖

復(fù)制 vendor/encore/laravel-admin/resources/views 到項(xiàng)目的 resources/views/laravel-admin,然后在 app/Admin/bootstrap.php 文件中加入代碼:

app('view')->prependNamespace('admin', resource_path('views/laravel-admin'));

這樣就用 resources/views/admin 下的視圖覆蓋了 laravel-admin 的視圖万矾,要注意的問題是悼吱,更新 laravel-admin 的時(shí)候,如果遇到視圖方面的問題良狈,需要重新復(fù)制 vendor/encore/laravel-admin/views 到項(xiàng)目的 resources/views/admin 中后添,注意備份原來已經(jīng)修改過的視圖。

設(shè)置語言

完成安裝之后薪丁,默認(rèn)語言為英文 (en) 遇西,如果要使用中文,打開 config/app.php严嗜,將 locale 設(shè)置為 zh-CN即可努溃。

自定義語言

如果需要修改 laravel-admin 的語言包,可以用下面的方式解決, 復(fù)制 vendor/encore/laravel-admin/lang 到項(xiàng)目的 resources/lang/admin阻问,然后在 app/Admin/bootstrap.php 文件中加入代碼:

app('translator')->addNamespace('admin', resource_path('lang/admin'));

如果將系統(tǒng)語言 locale 設(shè)置為 zh-CN梧税,可以將 resources/lang/admin 目錄下的 zh_CN 目錄重命名為 zh-CN 即可,更新 laravel-admin 的時(shí)候,要做相應(yīng)修改第队。

更新靜態(tài)資源

如果遇到更新之后,部分組件不能正常使用,那有可能是 laravel-admin 自帶的靜態(tài)資源有更新了,所以需要手動(dòng)去用 vendor/encore/laravel-admin/assets 的靜態(tài)資源覆蓋掉 public/packages 目錄下的靜態(tài)資源文件,覆蓋完成之后不要忘記清理瀏覽器緩存.

自定義登陸頁面和登陸邏輯

在路由文件 app/Admin/routes.php 中哮塞,覆蓋掉登陸頁面和登陸邏輯的路由,即可實(shí)現(xiàn)自定義的功能

Route::group([
    'prefix'        => config('admin.prefix'),
    'namespace'     => Admin::controllerNamespace(),
    'middleware'    => ['web', 'admin'],
], function (Router $router) {

    $router->get('auth/login', 'AuthController@getLogin');
    $router->post('auth/login', 'AuthController@postLogin');

});

在自定義的路由器 AuthController 中的 getLogin凳谦、postLogin 方法里分別實(shí)現(xiàn)自己的登陸頁面和登陸邏輯忆畅。

使用日志包 arcanedev/log-viewer

  • composer require arcanedev/log-viewer

  • 自動(dòng)引入服務(wù)提供者, 所以不需要添加 providers

  • php artisan log-viewer:publish

   __                   _
  / /  ___   __ _/\   /(_) _____      _____ _ __
 / /  / _ \ / _` \ \ / / |/ _ \ \ /\ / / _ \ '__|
/ /__| (_) | (_| |\ V /| |  __/\ V  V /  __/ |
\____/\___/ \__, | \_/ |_|\___| \_/\_/ \___|_|
            |___/

Version 4.5.1 - Created by ARCANEDEV?

Copied File [\vendor\arcanedev\log-viewer\config\log-viewer.php] To [\config\log
-viewer.php]
Copied Directory [\vendor\arcanedev\log-viewer\resources\views] To [\resources\v
iews\vendor\log-viewer]
Copied Directory [\vendor\arcanedev\log-viewer\resources\lang] To [\resources\la
ng\vendor\log-viewer]
Publishing complete.
  • 修改日志級(jí)別

修改 .env 中的 LOG_CHANNEL=stack 改為為 daily

laravel5.5及之前:

'log' => env('APP_LOG', 'single'),

'log_level' => env('APP_LOG_LEVEL', 'debug'),
  • 修改語言

將語言修改為中文,在 config/log-viewer.php 中的 locale='auto' 修改為 locale='zh'

  • 修改路由和中間件
    'route'         => [
        'enabled'    => true,

        'attributes' => [
            // 'prefix'     => 'log-viewer',
            // 修改路由前綴
            'prefix'     => 'admin/log-viewer',

            // 'middleware' => env('ARCANEDEV_LOGVIEWER_MIDDLEWARE') ? explode(',', env('ARCANEDEV_LOGVIEWER_MIDDLEWARE')) : null,
            // 修改中間件, 或者直接在 `.env` 里面改為:
ARCANEDEV_LOGVIEWER_MIDDLEWARE=web,admin,admin.bootstrap,admin.pjax,admin.log,admin.bootstrap,admin.permission
            'middleware' => ['web', 'admin', 'admin.bootstrap', 'admin.pjax', 'admin.log', 'admin.bootstrap', 'admin.permission'],
        ],
    ],
  • 訪問

原鏈接: http://127.0.0.1:8000/log-viewer

改路由前綴后: http://127.0.0.1:8000/admin/log-viewer

使用調(diào)試包 barryvdh/laravel-debugbar

  • composer require barryvdh/laravel-debugbar

  • Barryvdh\Debugbar\ServiceProvider::class,【不需要了, 自動(dòng)引入服務(wù)提供者】

  • 'Debugbar' => Barryvdh\Debugbar\Facade::class,【不需要 alias, 自動(dòng)引入了】

  • php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"

Copied File [\vendor\barryvdh\laravel-debugbar\config\debugbar.php] To [\config\
debugbar.php]
Publishing complete.
  • 非調(diào)試環(huán)境下,關(guān)閉debug,將 .env=true 改為 .env=false ,默認(rèn)debug是開啟狀態(tài).

數(shù)據(jù)庫備份 spatie/laravel-backup

  • composer require spatie/laravel-backup

  • 自動(dòng)引入服務(wù)提供者

  • php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

Copied File [\vendor\spatie\laravel-backup\config\backup.php] To [\config\backup
.php]
Copied Directory [\vendor\spatie\laravel-backup\resources\lang] To [\resources\l
ang\vendor\backup]
Publishing complete.
  • 用這個(gè)包, 需要安裝 composer require guzzlehttp/guzzle , 因?yàn)樾枰玫秸?qǐng)求

  • 如果要備份到 自定義目錄 可以進(jìn)行一下配置

app/config/filesystems.php:

'disks'   => [

    // 添加laravel-backup備份文件目錄
    'backup' => [
        'driver'     => 'local',
        'root'       => env('BACKUP_PATH'),
        'visibility' => 'public',
    ], 
],

app/config/laravel-backup.php:

'destination' => [

    /*
    * The disk names on which the backups will be stored. 
    */
    'disks' => [
        // 'local',
        'backup',
        //'admin',
    ],
],
  • 命令說明

如果要備份到特定磁盤而不是所有磁盤,請(qǐng)運(yùn)行:

php artisan backup:run --only-to-disk=name-of-your-disk

備份文件和數(shù)據(jù)庫:

php artisan backup:run

只備份db:

php artisan backup:run --only-db

只備份文件:

php artisan backup:run --only-files

清理備份:

php artisan backup:clean

查看所有受監(jiān)視的目標(biāo)文件系統(tǒng)的狀態(tài):

php artisan backup:list
    'monitorBackups' => [
        [
            'name' => config('app.name'),
            'disks' => ['local'],
            'newestBackupsShouldNotBeOlderThanDays' => 1,
            'storageUsedMayNotBeHigherThanMegabytes' => 5000,
        ],

        /*
        [
            'name' => 'name of the second app',
            'disks' => ['local', 's3'],
            'newestBackupsShouldNotBeOlderThanDays' => 1,
            'storageUsedMayNotBeHigherThanMegabytes' => 5000,
        ],
        */
    ],

引入自定義路由-(因?yàn)榇a是自動(dòng)吐出的, 路由是分目錄的)

加載 routes/web 文件夾下的路由

app/Providers/RouteServiceProvider.php

map() 方法中,添加以下代碼:

// tian add `mapCustomRoutes`
$this->mapCustomRoutes();

新增以下方法:

    /**
     * tian add
     * Define the "Custom" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapCustomRoutes()
    {
        /**
         * 加載 routes/web 文件夾下的路由
         */
        Route::group([
            // `laravel-admin` 有的中間件 'admin.auth', 'admin.pjax', 'admin.log', 'admin.bootstrap', 'admin.permission'
            'middleware' => ['web', 'admin', 'admin.bootstrap', 'admin.pjax', 'admin.log', 'admin.bootstrap', 'admin.permission'],
            'namespace'  => 'App\Http\Controllers',
            'prefix'     => 'admin',
        ], function ($router) {
            $routePath = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . 'routes' . DIRECTORY_SEPARATOR . 'web';
            $this->getFilePath($routePath);
        });
    }

    /**
     * [getFilePath 遞歸遍歷文件]
     * @param  string $path [description]
     * @return [type]       [description]
     */
    protected function getFilePath($path = '.')
    {
        // opendir()返回一個(gè)目錄句柄, 失敗返回false
        $current_dir = opendir($path);
        // readdir()返回打開目錄句柄中的一個(gè)條目
        while (($file = readdir($current_dir)) !== false) {
            // 構(gòu)建子目錄路徑
            $sub_dir = $path . DIRECTORY_SEPARATOR . $file;
            if ($file == '.' || $file == '..') {
                continue;
                // 如果是目錄,進(jìn)行遞歸
            } else if (is_dir($sub_dir)) {
                $this->getFilePath($sub_dir);
            } else {
                if (is_dir($sub_dir)) {
                    $this->getFilePath($sub_dir);
                }
                if (is_file($sub_dir)) {
                    require_once $sub_dir;
                }
                // 如果是文件,直接輸出
                // $path = substr($path, strrpos($path, 'routes'));
                // echo base_path($path . DIRECTORY_SEPARATOR . $file) . '<br />';
                // require base_path($path . DIRECTORY_SEPARATOR . $file);
            }
        }
    }

安裝數(shù)據(jù)庫抽象層 prettus/l5-repository【對(duì)模型的一層封裝】

  • composer require prettus/l5-repository

  • 自動(dòng)引入服務(wù)提供者

  • php artisan vendor:publish --provider "Prettus\Repository\Providers\RepositoryServiceProvider"

Copied File [\vendor\prettus\l5-repository\src\resources\config\repository.php]
To [\config\repository.php]
Publishing complete.

安裝提示包 laracasts/flash【提示框】

  • composer require laracasts/flash

  • 需要引入服務(wù)提供者【現(xiàn)在不需要了, laravel5.5后自動(dòng)引入服務(wù)提供者】

  • 需要在 config/app.php 里的 aliases 加入 Facades【不需要 alias, 自動(dòng)引入了】

將提示信息可以顯示在 laravel-admin 框架中

resources\views\laravel-admin\content.blade.php 里的 <section class="content"> 下添加如下代碼:

{{-- tian add flash --}}
@include('flash::message')

doctrine/dbal【使用 migration 作為數(shù)據(jù)庫的版本控制工具尸执,當(dāng)需要對(duì)已存在的數(shù)據(jù)表作更改家凯,需要額外引入 doctrine/dbal 擴(kuò)展∪缡В】

  • composer require doctrine/dbal

安裝圖像處理包 intervention/image

  • composer require intervention/image

  • 自動(dòng)引入服務(wù)提供者

  • php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"

Copied File [\vendor\intervention\image\src\config\config.php] To [\config\image
.php]
Publishing complete.

請(qǐng)求 guzzlehttp/guzzle【發(fā)送http請(qǐng)求】

  • composer require guzzlehttp/guzzle

七牛云 zgldh/qiniu-laravel-storage【選擇性安裝】

  • composer require zgldh/qiniu-laravel-storage

  • 自動(dòng)引入服務(wù)提供者

excel處理 maatwebsite/excel【選擇性安裝】

  • composer require maatwebsite/excel

  • 自動(dòng)引入服務(wù)提供者

  • php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

模型排序 spatie/eloquent-sortable【選擇性安裝】

  • composer require spatie/eloquent-sortable

問題

問題1: 執(zhí)行 php artisan migrate 后報(bào)錯(cuò) SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

問題分析: MySql 支持的 utf8 編碼最大字符長度為3字節(jié)绊诲,如果遇到4字節(jié)的寬字符就會(huì)出現(xiàn)插入異常。三個(gè)字節(jié)UTF-8最大能編碼的Unicode字符是 0xffff褪贵,即Unicode中的基本多文種平面(BMP)掂之。因而包括 Emoji 表情(Emoji是一種特殊的Unicode編碼)在內(nèi)的非基本多文種平面的Unicode字符都無法使用MySql的utf8字符集存儲(chǔ)。

這也應(yīng)該就是 Laravel 5.4 改用 4 字節(jié)長度的 utf8mb4 字符編碼的原因之一脆丁。不過要注意的是世舰,只有MySql 5.5.3版本以后才開始支持 utf8mb4 字符編碼(查看版本-mysql命令:SELECT VERSION( )

解決方案:AppServiceProvider 中調(diào)用 Schema::defaultStringLength 方法來實(shí)現(xiàn)配置

use Illuminate\Support\Facades\Schema;

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
   Schema::defaultStringLength(191);
}
  • 問題2: 使用 laravel new yunjuji-generator 報(bào)錯(cuò) Script "post-install-cmd" is not defined in this package

解決方案: 問題不解決也可以, 如需解決請(qǐng)執(zhí)行 composer global update 或者 composer global require "laravel/installer"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末槽卫,一起剝皮案震驚了整個(gè)濱河市跟压,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歼培,老刑警劉巖裆馒,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丐怯,居然都是意外死亡喷好,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門读跷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梗搅,“玉大人,你說我怎么就攤上這事效览∥耷校” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵丐枉,是天一觀的道長哆键。 經(jīng)常有香客問我,道長瘦锹,這世上最難降的妖魔是什么籍嘹? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任闪盔,我火速辦了婚禮,結(jié)果婚禮上辱士,老公的妹妹穿的比我還像新娘泪掀。我一直安慰自己,他們只是感情好颂碘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布异赫。 她就那樣靜靜地躺著,像睡著了一般头岔。 火紅的嫁衣襯著肌膚如雪塔拳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天峡竣,我揣著相機(jī)與錄音靠抑,去河邊找鬼。 笑死澎胡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娩鹉。 我是一名探鬼主播攻谁,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼弯予!你這毒婦竟也來了戚宦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤锈嫩,失蹤者是張志新(化名)和其女友劉穎受楼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呼寸,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艳汽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了对雪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河狐。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瑟捣,靈堂內(nèi)的尸體忽然破棺而出馋艺,到底是詐尸還是另有隱情,我是刑警寧澤迈套,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布捐祠,位于F島的核電站,受9級(jí)特大地震影響桑李,放射性物質(zhì)發(fā)生泄漏踱蛀。R本人自食惡果不足惜窿给,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望星岗。 院中可真熱鬧填大,春花似錦、人聲如沸俏橘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寥掐。三九已至靴寂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間召耘,已是汗流浹背百炬。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留污它,地道東北人剖踊。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像衫贬,于是被迫代替她去往敵國和親德澈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容