Skip to content
关注公众号,获取新课通知

管理员登录


控制器 app/controller/admin/Manager.php

php
// 管理员登录
   public function login(Request $request){
       $user = cms_login([
           'data'=>$request->UserModel
       ]);
       // 获取当前用户所有权限
       $data = $this->M->where('id',$user['id'])->with([
       	'role'=>function($query){
       		$query->with([
       			'rules'=>function($q){
       				$q->order('order','desc')
       				->order('id','asc')
       				->where('status',1);
       			}
       		]);
       	}
       ])->find()->toArray();
       $data['token'] = $user['token'];
       
       $data['tree'] = [];
       // 规则名称,按钮级别显示
       $data['ruleNames'] = [];
       // 无限级分类
       $rules = $data['role']['rules'];
       // 超级管理员
       if($data['super'] === 1){
       	$rules = \app\model\admin\Rule::where('status',1)->select()->toArray();
       }
       $data['tree'] = list_to_tree2($rules,'rule_id','child',0,function($item){
       	return $item['menu'] === 1;
       });
       // 权限规则数组
   	foreach ($data['role']['rules'] as $v) {
   		if($v['condition'] && $v['name']){
   			$data['ruleNames'][] = $v['name'];
   		}
   	}
       return showSuccess($data);
   }

自定义方法 app/common.php

php
/**
 * 登录(设置并存储token)
 *
 * @param array $param  参数配置(data,password,tag,expire)
 * @return void
 */
function cms_login(array $param){
    // 获取参数
    $data = getValByKey('data',$param);
    if (!$data) return false;
    // 标签分组
    $tag = getValByKey('tag',$param,'manager');
    // 是否返回密码
    $password = getValByKey('password',$param);
    // 登录有效时间 0为永久
    $expire = getValByKey('expire',$param,0);

    $CacheClass = \think\facade\Cache::store(config('cms.'.$tag.'.token.store'));
    // 生成唯一token
    $token = sha1(md5(uniqid(md5(microtime(true)),true)));
    // 拿到当前用户数据
    $user = is_object($data) ?  $data->toArray() : $data;
    // // 获取之前并删除token(防止重复登录)
	// $token = getValByKey('token',$param);
    // $beforeToken = $CacheClass->get($tag.'_'.$user['id']);
    // // 删除之前token对应的用户信息
    // if ($beforeToken){
    //     cms_logout([
    //         'token'=>$beforeToken,
    //         'tag'=>$tag,
    //     ]);
    // }
    // 存储token - 用户数据
    $CacheClass->set($tag.'_'.$token,$user,$expire);
    // 存储用户id - token
    $CacheClass->set($tag.'_'.$user['id'],$token,$expire);
    // 隐藏密码
    if (!$password) unset($user['password']);
    // 返回token
    $user['token'] = $token;
    return $user;
}

/**
 * 退出登录(删除token)
 *
 * @param array $param 参数配置 (tag,token,password)
 * @return void
 */
function cms_logout(array $param){
    $tag = getValByKey('tag',$param,'manager');
    $token = getValByKey('token',$param);
    
    $user = \think\facade\Cache::store(config('cms.'.$tag.'.token.store'))->pull($tag.'_'.$token);

    if (!empty($user)) \think\facade\Cache::store(config('cms.'.$tag.'.token.store'))->pull($tag.'_'.$user['id']);

    return $user;
}

/**
* 数据集组合分类树(多维数组)
* @param     cate 分类结果集
* @param     child 子树
* @return    array
*/
function list_to_tree2($cate,$field = 'pid',$child = 'child',$pid = 0,$callback = false){
	if(!is_array($cate)) return [];
    $arr = [];
    foreach($cate as $v){
    	$extra = true;
    	if(is_callable($callback)){
        	$extra = $callback($v);
        }
        if($v[$field] == $pid && $extra){
            $v[$child] = list_to_tree2($cate,$field,$child,$v['id'],$callback);
            $arr[]     = $v;
        }
    }
    return $arr;
}

模型关联

php
// app/model/Role.php
// 当前角色的所有权限
public function rules(){
	return $this->belongsToMany('Rule','role_rule');
}

路由 router/admin.php

php
// 不需要验证
Route::group('admin',function(){
    // 管理员登录
    Route::post('login','admin.Manager/login');
})->allowCrossDomain();

验证器 app/validate/admin/Manager.php

php
// 验证规则
protected $rule = [
	...
    'username|管理员用户名'=>'require|min:5|max:20',
    'password'=>'require|min:5|max:20',
	...
];
// 登录场景
public function sceneLogin(){
	return $this->only(['username','password'])->append('password','checklogin');
}
// 自定义验证规则
// 验证账号密码
public function checklogin($value, $rule='', $data='', $field=''){
	// 验证账号
	$M = \app\model\Manager::where('username',$data['username'])->find();
	if (!$M) return '用户名错误';
	// 验证密码
	if (!password_verify($data['password'],$M->password)) {
		return '密码错误';
	}
	// 将当前用户实例挂在到request
	request()->UserModel = $M;
	return true;
}

配置文件 config/cms.php

php
<?php

return [
    // 管理员相关
    'manager'=>[
        // token配置
        'token'=>[
            // 存储引擎 redis,file
            'store'=>'file'
        ]
    ],
    // 用户相关
    'user'=>[
        // token配置
        'token'=>[
            // 存储引擎 redis,file
            'store'=>'file'
        ]
    ],
	...
];