On this page
管理员登录
控制器 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'
]
],
...
];