首页 > 代码库 > Yii2 Day 5: 创建用户模块

Yii2 Day 5: 创建用户模块

在确定了模块化开发应用的方向后,可以尝试写一个模块练练手啦。首先想到的就是用户模块。

模块设计

前后台用户分离

通常一个应用会存在前台用户和后台用户,这两个用户的Session变量必须是分开的,不然就乱套了。因此,自然地想到用两个组件来分别控制前台用户和后台用户,分别是

  1. user: 对应前台用户
  2. adminUser: 对应后台用户

Yii2 对用户Session的存储与Yii1不同,原来适用于Yii1的前后台分类的方式,不再适用于Yii2,不过稍做修改就可以了,web.php里的相关代码片段如下:

‘user‘ =>  [      // Webuser for the frontend
        ‘class‘             => ‘\yii\web\User‘,
        ‘loginUrl‘          => array(‘/user/login/member‘),
        ‘identityClass‘     => ‘app\modules\user\models\MemberIdentify‘,
        ‘idParam‘           => ‘_mId‘,
        ‘identityCookie‘    => [‘name‘=>‘_ff‘,‘httpOnly‘ => true],
    ],
    ‘adminUser‘ => array(   // Webuser for the admin area (admin)
        ‘class‘             => ‘\yii\web\User‘,
        ‘loginUrl‘          => array(‘/user/login/admin‘),
        ‘identityClass‘     => ‘app\modules\user\models\AdminIdentify‘,
        ‘idParam‘           => ‘_aId‘,
        ‘identityCookie‘    => [‘name‘=>‘_aa‘,‘httpOnly‘ => true],
    ),

关键点在于idParam, 需要设置不同。

数据表设计

数据表设计遵循的原则是:

  1. 尽量不分表,不影响现有的ActiveRecord的使用
  2. 尽量使用MySQL自带的查询缓存,因此尽可能使用纵向拆分的方式。

安装这两个原则,增加一个Migration, 具体的内容如下:

$this->createTable(‘{{member}}‘, [
        ‘id‘ => ‘pk‘,
        ‘username‘ => ‘varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL‘,
        ‘password‘ => ‘varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL‘,
        ‘source‘=>‘int unsigned not null‘,
        ‘create_time‘=>‘int unsigned not null‘,
    ],‘ENGINE InnoDB DEFAULT CHARSET utf8
        PARTITION BY RANGE (id) (
        PARTITION p0 VALUES LESS THAN (3),
        PARTITION p1 VALUES LESS THAN (6),
        PARTITION p2 VALUES LESS THAN (9),
        PARTITION p3 VALUES LESS THAN (12),
        PARTITION p4 VALUES LESS THAN MAXVALUE
        )‘
    );

借助MySQL的表分区功能,以id为基础进行表分区。为了最大化利用查询缓存,减少表更新操作的影响,这里把通常用户表会有的last_visited, update_time等移到另外一个表里,从而保证在反复查询用户验证信息时,能利用MySQL的查询缓存。

登陆,登出入口

用户模块的两个主控制器,登陆控制器和登出控制器,处理所有的用户登录登出逻辑,以LoginController为例,包含的action包括:

  1. 本站注册用户登陆
  2. 来自SNS(QQ\Weibo\Kaixin\RenRen..)等第三方用户登录

目录结构

根据上述的设计方案,目录结构如下:

用户模块目录结构

从扩展上考虑,UserService组件封装所有数据库操作,如果将来需要进行分布式部署,只需要重写这部分的操作就可以了。

代码

创建了一个开源工程,方便大家查看代码。http://git.oschina.net/linwx/Meta

Yii2 Day 5: 创建用户模块