Yii2 Day 5: 建立用户模块

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

模块设计

先后台用户分离

一般一个应用会存在前台用户和后台用户,这两个用户的Session变量必须是分开的,否则就乱套了。所以,天然地想到用两个组件来分别控制前台用户和后台用户,分别是web

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

Yii2 对用户Session的存储与Yii1不一样,原来适用于Yii1的先后台分类的方式,再也不适用于Yii2,不过稍作修改就能够了,web.php里的相关代码片断以下:数据库

<!-- lang: 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, 须要设置不一样。缓存

数据表设计

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

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

安装这两个原则,增长一个Migration, 具体的内容以下:frontend

<!-- lang: php -->
$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的查询缓存。yii

登录,登出入口

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

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

目录结构

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

用户模块目录结构

从扩展上考虑,UserService组件封装全部数据库操做,若是未来须要进行分布式部署,只须要重写这部分的操做就能够了。模块化

相关文章
相关标签/搜索