月度存档: 1 月 2020 - 第2页

基于yii2的blog系统开发7-评论审核

接上一篇 基于yii2的blog系统开发6:

第十三步 评论管理页面的完善

5.1video_url:https://v.youku.com/v_show/id_XMTc2MzEzNzkxNg==.html

1.GridView里面content内容缩短显示

方法一(不推荐):

修改backend/views/comment/index.php:

['attribute'=>'content',
                'value'=>function($model){
                    $ts = strip_tags($model->content); //去掉html标签
                    $tlen = mb_strlen($ts);
                    return mb_substr($ts,0,5,'utf-8').($tlen>5?'...':'');
                }
            ],

方法二(推荐):在comment模型里面添加一个mycontent的只读属性

修改backend/views/comment/index.php:

 ['attribute'=>'content',
                'value'=>'mycontent',
            ],

修改common/models/comment.php:

public function getMycontent()
    {
        $ts = strip_tags($this->content); //去掉html标签
        $tlen = mb_strlen($ts);
        return mb_substr($ts,0,5,'utf-8').($tlen>5?'...':'');
    }

php小知识:

*在strlen计算时,对待一个UTF8的中文字符是3个长度,所以’中文a字1符’长度是3×4+2=14;在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以’中文a字1符’长度是6. *

2.添加评论审核功能

1.修改视图文件backend/views/comment/index.php:

['class' => 'yii\grid\ActionColumn',
                'template'=>'{view}{update}{delete}{approve}',
                'buttons'=>[
                    'approve'=>function($url,$model,$key){
                        $options=[
                            'title'=>Yii::t('yii','审核'),
                            'aria-label'=>Yii::t('yii','审核'),
                            'data-confirm'=>Yii::t('yii','确定审核通过吗?'),
                            'data-method'=>'post',
                            'data-pjax'=>'0',
                        ];
                        return Html::a('<span class="glyphicon glyphicon-check"></span>',$url,$options);
                    },
                ],

            ],

2.修改comment控制器和模型类

//backend/controllers/CommentController.php
public function actionApprove($id)
    {
        $m = $this->findModel($id);
        if($m->approve())
        {
            return $this->redirect(['index']);
        }
    }
//common/models/Comment.php
public function approve()
    {
        $this->status = 2;
        return ($this->save()?true:false);
    }

3.导航栏提示待评论审核气泡

//1.modify common/models/Comment.php
public static function getCcount()
    {
        return Comment::find()->where(['status'=>1])->count();
    }
//2.modify backend/views/layouts/main.php
 ['label' => '评论管理', 'url' => ['/comment/index']],
        '<li><span class="badge badge-inverse">'.Comment::getCcount().'</span></li>',

基于yii2的blog系统开发6-关联字段过滤

接上一节:基于yii2的blog系统开发5:

第十二步 完善文章管理首页

1.关联字段的展示

修改backend/views/post/index.php:

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
           // ['class' => 'yii\grid\SerialColumn'],//序列号

            'id',
            'title',
            //'author_id',
            [
                'attribute'=>'author_id',
                'value'=>'author.nickname',
            ],
            //'content:ntext',
            'tags:ntext',
            //'status',
             [
                'attribute'=>'status',
                'value'=>'status0.name',
            ],
            //'create_time:datetime',
            //'update_time:datetime',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>

2.关联字段的搜索

方法一:在GridView部件里面直接添加filter,记得index页面上引用模型类:

use common\models\Poststatus;

[
                'attribute'=>'status',
                'value'=>'status0.name',
                'filter'=>Poststatus::find()
                ->select(['name','id'])
                ->orderBy('position')
                ->indexBy('id')
                ->column(),
    'filterInputOptions' => ['prompt'=>'全部','class'=>'form-control'],
            //改背景颜色  'contentOptions'=>function($model)
                {
                    return ($model->status==1)?['class'=>'bg-danger']:[];
                }
            ],

ps:这种方法适用于数据记录比较少的情况,数据记录多的话建议用方法二

方法二:在common/models/PostSearch.php里添加新属性用于搜索

//1.给搜索模型类添加属性,也可以在Post.php里直接声明public $authorName,效果一样
    public function attributes()
    {
        return array_merge(parent::attributes(),["authorName"]);
    }
//2.添加验证规则
    public function rules()
    {
        return [
            [['id', 'status', 'create_time', 'update_time', 'author_id'], 'integer'],
            [['title', 'content', 'tags','authorName'], 'safe'],
        ];
    }

public function search($params){
    ......
//3.关联表添加过滤
     $query->join('INNER JOIN','adminuser','post.author_id=adminuser.id');
        $query->andFilterWhere(['like', 'adminuser.nickname',$this->authorName]);
    return $dataProvider;
}

4.修改backend/views/post/index.php:

 [
                'attribute'=>'authorName',
                'value'=>'author.nickname',
            ],

3.默认字段的排序及记录分页

修改common/models/PostSearch.php里的search函数:

   $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination'=>['pageSize'=>6],//每页6条记录
            'sort'=>[
                        'defaultOrder'=>[
                           // 'id'=>SORT_ASC,
                        'id'=>SORT_DESC,
                        ],
                        'attributes'=>['id','title'], //排序设置方法一
                    ]
        ]);

//排序设置方法二
$dataProvider->sort->attributes['authorName']=
        [
            'asc'=>['adminuser.nickname'=>SORT_ASC],
            'desc'=>['adminuser.nickname'=>SORT_DESC],
        ];
//默认排序
$dataProvider->sort->defaultOrder=
        [
            'status'=>SORT_ASC,
            'id'=>SORT_DESC,
        ]; 

基于yii2的blog系统开发5-标签处理

接上一篇 基于yii2的blog系统开发4:

第十一步 标签处理

老师视频4.8节地址:https://v.youku.com/v_show/id_XMTczODc4MTkyNA==.html
修改common/models/Post.php,增加如下代码:

//标签处理
    private $_oldTags;
    public function afterFind()
    {
        parent::afterFind();
        $this->_oldTags = $this->tags;
    }

    public function afterSave($insert,$changedAttributes)
    {
        parent::afterSave($insert,$changedAttributes);
        Tag::updateFrequency($this->_oldTags,$this->tags);
    }

    public function afterDelete()
    {
        parent::afterDelete();
        Tag::updateFrequency($this->tags,'');
    }

修改common/models/Tag.php,增加如下代码:

 public function stringToArray($tag)
    {
        $tmp = explode(',', $tag);
        return $tmp;
    }

    public function updateFrequency($oldt,$newt)
    {
        $old = self::stringToArray($oldt);
        $new = self::stringToArray($newt);
        $del = array_diff($old, $new);
        $add = array_diff($new, $old); //$new里有而$old里没有的值

        foreach($del as $item1){
            $one = Tag::findOne(['name'=>$item1]);
            if($one){
                if($one->frequency>1)
               {
                    $one->frequency-=1;
                    $one->save();
                }else{
                    $one->delete();
                }
            }
        }

        foreach($add as $item2){
            $one2 = Tag::findOne(['name'=>$item2]);
            if($one2){
                    $one2->frequency+=1;
                    $one2->save();
            }else{
                $one2 = new Tag();
                $one2->frequency=1;
                $one2->name = $item2;
                $one2->save();
            }
        }
    }

注意,自定义public函数,在另外一个public函数中调用的时候前面加上self::,否则找不到

基于yii2的blog系统开发4-更新时间自动填充

接上一篇 基于yii2的blog系统开发3:

第十步 文章更新时间和创建时间系统自动填写

backend/views/post/_form.php 里注释

<!--?= $form->field($model, 'create_time')->textInput() ?-->

<!--?= $form->field($model, 'update_time')->textInput() ?-->

方法一(不推荐)

修改backend/controllers/PostController.php的actionUpdate方法:
$model->update_time=time();

方法二.修改common/models/Post.php,重写beforeSave方法:

  /**
     * 实现模型自动添加create_time、update_time 的自动补全
     * @param bool $insert
     * @return bool
     */
    public function beforeSave( $insert )
    {
        if (parent::beforeSave($insert)) {
            if ($this->isNewRecord) //等价于if($insert)
            {
                $this->create_time = time();
                $this->update_time = $this->create_time;

            } else {
                $this->update_time = time();
            }
            return true;
        } else {
            return false;
        }
    }

方法三(推荐):common/models/Post.php里面添加如下代码,但是默认只对数据表字段定义为create_at和update_at有效

use yii\behaviors\TimestampBehavior;
 /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            TimestampBehavior::className(),
        ];
    }

也可以自定义:

<?php
use yii\behaviors\TimestampBehavior;

public function behaviors()
    {
        return [
            [
            'class' => TimestampBehavior::className(),
            'createdAtAttribute' => 'create_time',// 自己根据数据库字段修改
            'updatedAtAttribute' => 'update_time', // 自己根据数据库字段修改
           // 'value' => function(){return time();},
            ],
        ];
    }
?>

ps:注意去掉rules里对应的required规则

  public function rules()
    {
        return [
            [['uid', 'create_time', 'update_time'], 'required'],
              ];
    }

基于yii2的blog系统开发3-下拉菜单&日期格式化

接上一篇 基于yii2的blog系统开发2:

第七步 展示关联表字段

比如把post表里面的状态id换成状态名字显示,作者id换成作者名字显示
以文章详情页为例子:
修改backend/views/post/view.php

 <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'id',
            'title',
            'content:ntext',
            'tags:ntext',
           // 'status',
            [
                'attribute'=>'status',
                'label'=>'状态',
                'value'=>$model->status0->name,
            ],
            'create_time:datetime',
            'update_time:datetime',
             //'author_id',
            [
                'attribute'=>'author_id',
                //'label'=>'作者',
                'value'=>$model->author->username,
            ],
        ],
     //自定义表格格式
      'template'=>'<tr><th style="width:80px">{label}</th><th>{value}</th></tr>',
        'options'=>['class'=>'table table-striped table-bordered detail-view'],
    ]) ?>

第八步 日期格式化显示

修改backend/views/post/view.php

[             'attribute'=>'create_time',
                'value'=>date('Y-m-d H:i:s',$model->create_time),
            ],

第九步 下拉菜单展示关联字段

以backend/views/post/update.php为例,这里面渲染了_form.php,修改这个_form.php文件:
<?= $form->field($model, 'status')->dropDownList([1=>'草稿',2=>'已发布'],['prompt'=>'请选择状态']) ?>
数据不能写死,要从数据库里面拿出来,所以应该这么写:

use common\models\Poststatus;
use yii\helpers\ArrayHelper;
......
<?php
        $data1 = Poststatus::find()->all();
        $data = ArrayHelper::map($data1,'id','name');
    ?>
    <?= $form->field($model, 'status')->dropDownList($data,['prompt'=>'请选择状态']) ?>

weixi老师另外介绍用QueryBuilder的方法

//$data = (new \yii\db\Query())->select(['name','id'])->from('poststatus')->indexBy('id')->column();
//推荐
$data = Poststatus::find()->select(['name','id'])->orderBy('position')->indexBy('id')->column();

关于Array Helper类

1.getValue

class User{public $name=’lq’;}
$array=[‘foo’=>[‘bar’=>new User()]];
php写法:
$value = isset($array['foo']['bar']->name)?$array['foo']['bar']->name:null;
ArrayHelper写法:
$value = ArrayHelper::getValue($array,'foo.bar.name');

2.getColumn

$data=[
['id'=>'123','data'=>'a'],
['id'=>'234','data'=>'b'],
];
$ids = ArrayHelper::getColumn($data,'id');
output:['123','234']

3.map

$result = ArrayHelper::map($data,'id','data');
output:['123'=>'a','234'=>'b']

基于yii2的blog系统开发2-数据库操作

接上一篇 基于yii2的blog系统开发1:

第四步 用gii生成crud的相关文件

1.访问http://yourhost/advanced/backend/web/index.php?r=gii

2.先生成models

post,poststatus,comment,commentstatus,user,adminuser,tag这7个表的model

3.然后生成crud

post,comment,user,adminuser

4.修改backend/views/web.php,在导航栏添加菜单,方便链接到管理页面

......
$menuItems = [
      //  ['label' => 'Home', 'url' => ['/site/index']],
        ['label' => '文章管理', 'url' => ['/post/index']],
        ['label' => '评论管理', 'url' => ['/comment/index']],
        ['label' => '用户管理', 'url' => ['/user/index']],
        ['label' => '管理员用户管理', 'url' => ['/adminuser/index']],
    ];
......

第五步 数据库操作

(这块内容可以先跳过,后面用到时候再详细了解,weixi老师的视频里面先讲到了,我就先记录下来)

第一种方式createCommand

简单,但不推荐,移植数据库不方便,建议只用作测试代码
yii::$app->db->createCommand("select * from post where id=:id")->bindValue(":id",1)->queryOne();//返回数组

User::findBySql('SELECT * FROM user')->all(); 此方法是用 sql 语句查询 user 表里面的所有数据对象数组;

User::findBySql('SELECT * FROM user')->one(); 此方法是用 sql 语句查询 user 表里面的一条数据对象;

1.一个AR类关联一张数据表,每个AR对象对应表中的一行

//查询一条记录
//$model = Post::find()->where(["id"=>1])->one();
$model = Post::findOne(1);//简写
var_dump($model);
exit(0);

//查询多条记录
//$models = Post::find()->where(["status"=>1])->all();
$models = Post::findAll(["status"=>1]);//简写

2.AR对象的属性对应为数据行的列

$model = Post::findOne(1);
echo $model->id;
echo $model->title;

$models = Post::findAll(["status"=>1]);
foreach($models as $item){
    echo $item->id;
    echo $item->title.'<br>';
}

2.利用AR对象特点替代sql执行crud

//create
$post1 = new Post();
$post1->title='haha';
$post1->save();
//read
$post2=Post::findOne($id);
//update
$post2->title="haha2";
$post2->save();
//delete
$post2->delete();


$row = (new \yii\db\Query())->select(['id','email'])->from('user')->where('last_name=>:lname')->addParams([':lname'=>$ln])->orderBy(['id'=>SORT_ASC,'name'=>SORT_DESC])-> limit(10)->indexBy(id)->all();

第六步 面包屑,按钮,文章属性改为中文

面包屑按钮改为中文

修改backend/views/post目录下面对应的页面

文章属性改为中文

修改common/models/Post.php:

public function attributeLabels()
    {
        return [
            'id' => '索引',
            'title' => '标题',
            'content' => '内容',
            'tags' => '标签',
            'status' => '状态',
            'create_time' => '创建时间',
            'update_time' => '更新时间',
            'author_id' => '作者',
        ];
    }

补充关于数据库AR操作

AR查询
$model->find()->all(); //返回所有数据;

$model->findOne($id); //返回 主键 id=1 的一条数据;

$model->find()->select([‘id’,’title’])->all(); //返回指定字段数据

$model->find()->where([’name’ => ’名称’])->one(); //返回 [’name’ => ’小伙儿’] 的一条数据;

$model->find()->where([’name’ => ’名称’])->all(); //返回 [’name’ => ’小伙儿’] 的所有数据;

$model->find()->orderBy(’id DESC’)->all(); //排序查询;

$model->findBySql(’SELECT * FROM user’)->all(); //用 sql 语句查询 user 表里面的所有数据;

$model->findBySql(’SELECT * FROM user’)->one(); //用 sql 语句查询 user 表里面的一条数据;

$model->find()->andWhere([’sex’ => ’男’, ’age’ => ’24’])->count(’id’); //统计符合条件的总条数;

$model->find()->andFilterWhere([’like’, ’name’, ’名称’]); //用 like 查询 name 等于 小伙儿的 数据

$model->find()->one(); //返回一条数据;

$model->find()->all(); //返回所有数据;

$model->find()->count(); //返回记录的数量;

$model->find()->average(); //返回指定列的平均值;

$model->find()->min(); //返回指定列的最小值 ;

$model->find()->max(); //返回指定列的最大值 ;

$model->find()->scalar(); //返回值的第一行第一列的查询结果;

$model->find()->column(); //返回查询结果中的第一列的值;

$model->find()->exists(); //返回一个值指示是否包含查询结果的数据行;

$model->find()->batch(10); //每次取 10 条数据

$model->find()->each(10); //每次取 10 条数据, 迭代查询

Join关联
$_list = $model::find();
$_list->select([‘f.id’,’f.dateline’,’n.itemid’,’n.title’]);
$_list->from(News::tableName() . ‘ as f’);
$_list->where([‘f.userid’=>5]);
$_list->joinWith(‘newsTitle as n’ , false, ‘LEFT JOIN’);

where查询条件总结

  1. static where( $condition )
    其中参数 $condition类型为字符串或者数组1、字符串字符串是最简单的,直接按sql中的where条件写就可以,如

$condition = ’name=’zhidemy.com’ and age>10’;

  1. 如果是数组的情况下,有两种格式的写法。

[’type’ => 1, ’status’ => 2] //生成 (type = 1) AND (status = 2)

[’id’ => [1, 2, 3], ’status’ => 2] //生成 (id IN (1, 2, 3)) AND (status = 2)

[’status’ => null] //生成 status IS NULL

  1. AND 把所有的操作数连接起来。
    [’and’, ’id=1’, ’id=2’] //生成 id=1 AND id=2

如果某个运算数也是数组,那么会按如下格式转换为字符串

[’and’, ’type=1’, [’or’, ’id=1’, ’id=2’]] //生成 type=1 AND (id=1 OR id=2)

or和and类似,只不过是用OR来连接操作数。注意:这个方法不会对进行引用或者编码操作。

  1. between 第一个操作数是列的名称,第二个和第三个操作数为范围的最小值和最大值。
    [’between’, ’id’, 1, 10] //生成 id BETWEEN 1 AND 10

not between:和between相似。

  1. in 第一个操作数为列或者DB表达式,第二个操作数为数组
    [’in’, ’id’, [1, 2, 3]] //生成 id IN (1, 2, 3)

not in和in相似。注意:这个方法会对列进行引用,对数组中的值也会编码。

  1. like 第一个操作数为列或者DB表达式,第二个操作数为字符串或者数组如
    [’like’, ’name’, ’tester’] //生成 name LIKE ’%tester%’

如果值是数组的话,会生成多个like语句,并用AND来连接。如

[’like’, ’name’, [’test’, ’sample’]] //生成 name LIKE ’%test%’ AND name LIKE ’%sample%’

注意:这个方法会对列进行引用,对数组中的值也会编码。有时候你可能需要自己来处理%,那么可以用第三个参数:

[’like’, ’name’, ’%tester’, false] //生成 name LIKE ’%tester’

or like 和 like 相似,只是在第二个参数为数组的情况下用or来连接多个like 语句。
not like和 like 相似。
or not like 和or like相似。

基于yii2的blog系统开发1-高级模版安装配置

这篇文章主要记录weixi老师的视频课程的学习笔记,看视频虽然详细,但是需要时间,所以希望记录这篇文章以后能不看视频也可以达到相同效果。
补充知识:use yii\helpers\VarDumper
VarDumper::dump($user->errors);exit(0);
这个可以帮助调试代码
Yii::$app->request->hostInfo 获取当前域名

第一步 安装yii2高级模版

去官网安装yii2-advanced模版,虽然推荐composer安装,但是考虑到国内网速,我还是选择了直接下载模版
解压到新建的项目目录:
tar zxvf yii-advanced-app-2.0.31.tgz -C /指定项目路径
cd 项目路径
./init

第二步 修改配置文件

修改common/config/main-local.php, 主要是配置好邮件设置和语言汉化:

<?php
return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=数据库名',
            'username' => '数据库用户名',
            'password' => '数据库密码',
            'charset' => 'utf8',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            //'useFileTransport' => true,
             'useFileTransport' =>false,//这句一定有,false发送邮件,true只是生成邮件在runtime文件夹下,不发邮件
             'transport' => [  
                'class' => 'Swift_SmtpTransport',  
                'host' => 'smtp.qq.com',  //每种邮箱的host配置不一样
                'username' => '123456@qq.com',  
                'password' => '密码',  
                'port' => '465',  
                'encryption' => 'ssl',

                ],   
        ],
    ],
     'language' => 'zh-CN',//启用国际化支持
    'sourceLanguage' => 'zh-CN',//源代码采用中文
    'timeZone' => 'Asia/Shanghai', //设置时区
];

修改common/config/params.php:

<?php
return [
    'adminEmail' => '你的邮件地址',
    'supportEmail' => '你的邮件地址',
    'senderEmail' => '12345@qq.com',//注意这个地址要和main-local.php里面配置的地址一样
    'senderName' => 'qblog',
    'user.passwordResetTokenExpire' => 3600,
];

1.0.24版本前端用户注册后发邮件需要把common目录下的mail目录拷贝到frontend目录下

第三步 初始化或者导入数据表

初始化操作

打开控制台终端,执行迁移命令
/path/to/php-bin/php /path/to/yii-application/yii migrate

导入数据表



CREATE TABLE IF NOT EXISTS `adminuser` ( `id` int(11) NOT NULL, `username` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `nickname` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `profile` text COLLATE utf8_unicode_ci, `auth_key` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `password_reset_token` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- 表的结构 `auth_assignment` -- CREATE TABLE IF NOT EXISTS `auth_assignment` ( `item_name` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `user_id` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `created_at` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- 表的结构 `auth_item` -- CREATE TABLE IF NOT EXISTS `auth_item` ( `name` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `type` int(11) NOT NULL, `description` text COLLATE utf8_unicode_ci, `rule_name` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, `data` text COLLATE utf8_unicode_ci, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- 表的结构 `auth_item_child` -- CREATE TABLE IF NOT EXISTS `auth_item_child` ( `parent` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `child` varchar(64) COLLATE utf8_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- 表的结构 `auth_rule` -- CREATE TABLE IF NOT EXISTS `auth_rule` ( `name` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `data` text COLLATE utf8_unicode_ci, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- 表的结构 `comment` -- CREATE TABLE IF NOT EXISTS `comment` ( `id` int(11) NOT NULL, `content` text COLLATE utf8_unicode_ci NOT NULL, `status` int(11) NOT NULL, `create_time` int(11) DEFAULT NULL, `userid` int(11) NOT NULL, `email` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `url` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL, `post_id` int(11) NOT NULL, `remind` int(4) DEFAULT '0' COMMENT '0:未提醒1:已提醒' ) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- 表的结构 `commentstatus` -- CREATE TABLE IF NOT EXISTS `commentstatus` ( `id` int(11) NOT NULL, `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `position` int(11) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- 表的结构 `migration` -- CREATE TABLE IF NOT EXISTS `migration` ( `version` varchar(180) COLLATE utf8_unicode_ci NOT NULL, `apply_time` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- 表的结构 `post` -- CREATE TABLE IF NOT EXISTS `post` ( `id` int(11) NOT NULL, `title` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `content` text COLLATE utf8_unicode_ci NOT NULL, `tags` text COLLATE utf8_unicode_ci, `status` int(11) NOT NULL, `create_time` int(11) DEFAULT NULL, `update_time` int(11) DEFAULT NULL, `author_id` int(11) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- 表的结构 `poststatus` -- CREATE TABLE IF NOT EXISTS `poststatus` ( `id` int(11) NOT NULL, `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `position` int(11) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- 转存表中的数据 `poststatus` -- -- -------------------------------------------------------- -- -- 表的结构 `tag` -- CREATE TABLE IF NOT EXISTS `tag` ( `id` int(11) NOT NULL, `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL, `frequency` int(11) DEFAULT '1' ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -------------------------------------------------------- -- -- 表的结构 `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL, `username` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `auth_key` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `password_hash` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `password_reset_token` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `status` smallint(6) NOT NULL DEFAULT '10', `created_at` int(11) NOT NULL, `updated_at` int(11) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- -- Indexes for dumped tables -- -- -- Indexes for table `adminuser` -- ALTER TABLE `adminuser` ADD PRIMARY KEY (`id`); -- -- Indexes for table `auth_assignment` -- ALTER TABLE `auth_assignment` ADD PRIMARY KEY (`item_name`,`user_id`); -- -- Indexes for table `auth_item` -- ALTER TABLE `auth_item` ADD PRIMARY KEY (`name`), ADD KEY `rule_name` (`rule_name`), ADD KEY `idx-auth_item-type` (`type`); -- -- Indexes for table `auth_item_child` -- ALTER TABLE `auth_item_child` ADD PRIMARY KEY (`parent`,`child`), ADD KEY `child` (`child`); -- -- Indexes for table `auth_rule` -- ALTER TABLE `auth_rule` ADD PRIMARY KEY (`name`); -- -- Indexes for table `comment` -- ALTER TABLE `comment` ADD PRIMARY KEY (`id`), ADD KEY `FK_comment_post` (`post_id`), ADD KEY `FK_comment_user` (`userid`), ADD KEY `FK_comment_status` (`status`); -- -- Indexes for table `commentstatus` -- ALTER TABLE `commentstatus` ADD PRIMARY KEY (`id`); -- -- Indexes for table `migration` -- ALTER TABLE `migration` ADD PRIMARY KEY (`version`); -- -- Indexes for table `post` -- ALTER TABLE `post` ADD PRIMARY KEY (`id`), ADD KEY `FK_post_author` (`author_id`), ADD KEY `FK_post_status` (`status`); -- -- Indexes for table `poststatus` -- ALTER TABLE `poststatus` ADD PRIMARY KEY (`id`); -- -- Indexes for table `tag` -- ALTER TABLE `tag` ADD PRIMARY KEY (`id`); -- -- Indexes for table `user` -- ALTER TABLE `user` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `username` (`username`), ADD UNIQUE KEY `email` (`email`), ADD UNIQUE KEY `password_reset_token` (`password_reset_token`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `adminuser` -- ALTER TABLE `adminuser` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6; -- -- AUTO_INCREMENT for table `comment` -- ALTER TABLE `comment` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=109; -- -- AUTO_INCREMENT for table `commentstatus` -- ALTER TABLE `commentstatus` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3; -- -- AUTO_INCREMENT for table `post` -- ALTER TABLE `post` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=43; -- -- AUTO_INCREMENT for table `poststatus` -- ALTER TABLE `poststatus` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4; -- -- AUTO_INCREMENT for table `tag` -- ALTER TABLE `tag` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=76; -- -- AUTO_INCREMENT for table `user` -- ALTER TABLE `user` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3; -- -- 限制导出的表 -- -- -- 限制表 `auth_assignment` -- ALTER TABLE `auth_assignment` ADD CONSTRAINT `auth_assignment_ibfk_1` FOREIGN KEY (`item_name`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE; -- -- 限制表 `auth_item` -- ALTER TABLE `auth_item` ADD CONSTRAINT `auth_item_ibfk_1` FOREIGN KEY (`rule_name`) REFERENCES `auth_rule` (`name`) ON DELETE SET NULL ON UPDATE CASCADE; -- -- 限制表 `auth_item_child` -- ALTER TABLE `auth_item_child` ADD CONSTRAINT `auth_item_child_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE, ADD CONSTRAINT `auth_item_child_ibfk_2` FOREIGN KEY (`child`) REFERENCES `auth_item` (`name`) ON DELETE CASCADE ON UPDATE CASCADE; -- -- 限制表 `comment` -- ALTER TABLE `comment` ADD CONSTRAINT `FK_comment_post` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `FK_comment_status` FOREIGN KEY (`status`) REFERENCES `commentstatus` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `FK_comment_user` FOREIGN KEY (`userid`) REFERENCES `user` (`id`) ON DELETE CASCADE; -- -- 限制表 `post` -- ALTER TABLE `post` ADD CONSTRAINT `FK_post_author` FOREIGN KEY (`author_id`) REFERENCES `adminuser` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `FK_post_status` FOREIGN KEY (`status`) REFERENCES `poststatus` (`id`) ON DELETE CASCADE;

yii2汉化及时区设置

修改common/main-local.php:

<?php
return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=',
            'username' => '',
            'password' => '',
            'charset' => 'utf8',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            //'useFileTransport' => true,
             'useFileTransport' =>false,//这句一定有,false发送邮件,true只是生成邮件在runtime文件夹下,不发邮件
             'transport' => [  
                'class' => 'Swift_SmtpTransport',  
                'host' => 'smtp.qq.com',  //每种邮箱的host配置不一样
                'username' => '7138784@qq.com',  
                'password' => '',  
                'port' => '465',  
                'encryption' => 'ssl',

                ],   
        ],
    ],
     'language' => 'zh-CN',//启用国际化支持
    'sourceLanguage' => 'zh-CN',//源代码采用中文
    'timeZone' => 'Asia/Shanghai', //设置时区
];

mac添加虚拟域名

mac添加虚拟的域名:
sudo vim /private/etc/hosts