123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606 |
- <?php
- // +----------------------------------------------------------------------
- // | 海豚PHP框架 [ DolphinPHP ]
- // +----------------------------------------------------------------------
- // | 版权所有 2016~2019 广东卓锐软件有限公司 [ http://www.zrthink.com ]
- // +----------------------------------------------------------------------
- // | 官方网站: http://dolphinphp.com
- // +----------------------------------------------------------------------
- namespace app\user\admin;
- use app\admin\controller\Admin;
- use app\common\builder\ZBuilder;
- use app\user\model\User as UserModel;
- use app\user\model\Role as RoleModel;
- use app\admin\model\Module as ModuleModel;
- use app\admin\model\Access as AccessModel;
- use util\Tree;
- use think\Db;
- use think\facade\Hook;
- /**
- * 用户默认控制器
- * @package app\user\admin
- */
- class Index extends Admin
- {
- /**
- * 用户首页
- * @author 蔡伟明 <314013107@qq.com>
- * @return mixed
- * @throws \think\Exception
- * @throws \think\exception\DbException
- */
- public function index()
- {
- cookie('__forward__', $_SERVER['REQUEST_URI']);
- // 获取查询条件
- $map = $this->getMap();
- // 非超级管理员检查可管理角色
- if (session('user_auth.role') != 1) {
- $role_list = RoleModel::getChildsId(session('user_auth.role'));
- $map[] = ['role', 'in', $role_list];
- }
- // 数据列表
- $data_list = UserModel::where($map)->order('sort,role,id desc')->paginate();
- // 授权按钮
- $btn_access = [
- 'title' => '授权',
- 'icon' => 'fa fa-fw fa-key',
- 'href' => url('access', ['uid' => '__id__'])
- ];
- // 角色列表
- if (session('user_auth.role') != 1) {
- $role_list = RoleModel::getTree(null, false, session('user_auth.role'));
- } else {
- $role_list = RoleModel::getTree();
- }
- // 使用ZBuilder快速创建数据表格
- return ZBuilder::make('table')
- ->setPageTitle('用户管理') // 设置页面标题
- ->setTableName('admin_user') // 设置数据表名
- ->setSearch(['id' => 'ID', 'username' => '用户名', 'email' => '邮箱']) // 设置搜索参数
- ->addColumns([ // 批量添加列
- ['id', 'ID'],
- ['username', '用户名'],
- ['nickname', '昵称'],
- ['role', '角色', $role_list],
- ['email', '邮箱'],
- ['mobile', '手机号'],
- ['create_time', '创建时间', 'datetime'],
- ['status', '状态', 'switch'],
- ['right_button', '操作', 'btn']
- ])
- ->addTopButtons('add,enable,disable,delete') // 批量添加顶部按钮
- ->addRightButton('custom', $btn_access) // 添加授权按钮
- ->addRightButtons('edit,delete') // 批量添加右侧按钮
- ->setRowList($data_list) // 设置表格数据
- ->fetch(); // 渲染页面
- }
- /**
- * 新增
- * @author 蔡伟明 <314013107@qq.com>
- * @return mixed
- * @throws \think\Exception
- */
- public function add()
- {
- // 保存数据
- if ($this->request->isPost()) {
- $data = $this->request->post();
- // 验证
- $result = $this->validate($data, 'User');
- // 验证失败 输出错误信息
- if(true !== $result) $this->error($result);
- // 非超级管理需要验证可选择角色
- if (session('user_auth.role') != 1) {
- if ($data['role'] == session('user_auth.role')) {
- $this->error('禁止创建与当前角色同级的用户');
- }
- $role_list = RoleModel::getChildsId(session('user_auth.role'));
- if (!in_array($data['role'], $role_list)) {
- $this->error('权限不足,禁止创建非法角色的用户');
- }
- if (isset($data['roles'])) {
- $deny_role = array_diff($data['roles'], $role_list);
- if ($deny_role) {
- $this->error('权限不足,附加角色设置错误');
- }
- }
- }
- $data['roles'] = isset($data['roles']) ? implode(',', $data['roles']) : '';
- if ($user = UserModel::create($data)) {
- Hook::listen('user_add', $user);
- // 记录行为
- action_log('user_add', 'admin_user', $user['id'], UID);
- $this->success('新增成功', url('index'));
- } else {
- $this->error('新增失败');
- }
- }
- // 角色列表
- if (session('user_auth.role') != 1) {
- $role_list = RoleModel::getTree(null, false, session('user_auth.role'));
- } else {
- $role_list = RoleModel::getTree(null, false);
- }
- // 使用ZBuilder快速创建表单
- return ZBuilder::make('form')
- ->setPageTitle('新增') // 设置页面标题
- ->addFormItems([ // 批量添加表单项
- ['text', 'username', '用户名', '必填,可由英文字母、数字组成'],
- ['text', 'nickname', '昵称', '可以是中文'],
- ['select', 'role', '主角色', '非超级管理员,禁止创建与当前角色同级的用户', $role_list],
- ['select', 'roles', '副角色', '可多选', $role_list, '', 'multiple'],
- ['text', 'email', '邮箱', ''],
- ['password', 'password', '密码', '必填,6-20位'],
- ['text', 'mobile', '手机号'],
- ['image', 'avatar', '头像'],
- ['radio', 'status', '状态', '', ['禁用', '启用'], 1]
- ])
- ->fetch();
- }
- /**
- * 编辑
- * @param null $id 用户id
- * @author 蔡伟明 <314013107@qq.com>
- * @return mixed
- * @throws \think\Exception
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function edit($id = null)
- {
- if ($id === null) $this->error('缺少参数');
- // 非超级管理员检查可编辑用户
- if (session('user_auth.role') != 1) {
- $role_list = RoleModel::getChildsId(session('user_auth.role'));
- $user_list = UserModel::where('role', 'in', $role_list)->column('id');
- if (!in_array($id, $user_list)) {
- $this->error('权限不足,没有可操作的用户');
- }
- }
- // 保存数据
- if ($this->request->isPost()) {
- $data = $this->request->post();
- // 禁止修改超级管理员的角色和状态
- if ($data['id'] == 1 && $data['role'] != 1) {
- $this->error('禁止修改超级管理员角色');
- }
- // 禁止修改超级管理员的状态
- if ($data['id'] == 1 && $data['status'] != 1) {
- $this->error('禁止修改超级管理员状态');
- }
- // 验证
- $result = $this->validate($data, 'User.update');
- // 验证失败 输出错误信息
- if(true !== $result) $this->error($result);
- // 如果没有填写密码,则不更新密码
- if ($data['password'] == '') {
- unset($data['password']);
- }
- // 非超级管理需要验证可选择角色
- if (session('user_auth.role') != 1) {
- if ($data['role'] == session('user_auth.role')) {
- $this->error('禁止修改为当前角色同级的用户');
- }
- $role_list = RoleModel::getChildsId(session('user_auth.role'));
- if (!in_array($data['role'], $role_list)) {
- $this->error('权限不足,禁止修改为非法角色的用户');
- }
- if (isset($data['roles'])) {
- $deny_role = array_diff($data['roles'], $role_list);
- if ($deny_role) {
- $this->error('权限不足,附加角色设置错误');
- }
- }
- }
- $data['roles'] = isset($data['roles']) ? implode(',', $data['roles']) : '';
- if (UserModel::update($data)) {
- $user = UserModel::get($data['id']);
- Hook::listen('user_edit', $user);
- // 记录行为
- action_log('user_edit', 'admin_user', $user['id'], UID, get_nickname($user['id']));
- $this->success('编辑成功', cookie('__forward__'));
- } else {
- $this->error('编辑失败');
- }
- }
- // 获取数据
- $info = UserModel::where('id', $id)->field('password', true)->find();
- // 角色列表
- if (session('user_auth.role') != 1) {
- $role_list = RoleModel::getTree(null, false, session('user_auth.role'));
- } else {
- $role_list = RoleModel::getTree(null, false);
- }
- // 使用ZBuilder快速创建表单
- return ZBuilder::make('form')
- ->setPageTitle('编辑') // 设置页面标题
- ->addFormItems([ // 批量添加表单项
- ['hidden', 'id'],
- ['static', 'username', '用户名', '不可更改'],
- ['text', 'nickname', '昵称', '可以是中文'],
- ['select', 'role', '主角色', '非超级管理员,禁止创建与当前角色同级的用户', $role_list],
- ['select', 'roles', '副角色', '可多选', $role_list, '', 'multiple'],
- ['text', 'email', '邮箱', ''],
- ['password', 'password', '密码', '必填,6-20位'],
- ['text', 'mobile', '手机号'],
- ['image', 'avatar', '头像'],
- ['radio', 'status', '状态', '', ['禁用', '启用']]
- ])
- ->setFormData($info) // 设置表单数据
- ->fetch();
- }
- /**
- * 授权
- * @param string $module 模块名
- * @param int $uid 用户id
- * @param string $tab 分组tab
- * @author 蔡伟明 <314013107@qq.com>
- * @return mixed
- * @throws \think\Exception
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- * @throws \think\exception\PDOException
- */
- public function access($module = '', $uid = 0, $tab = '')
- {
- if ($uid === 0) $this->error('缺少参数');
- // 非超级管理员检查可编辑用户
- if (session('user_auth.role') != 1) {
- $role_list = RoleModel::getChildsId(session('user_auth.role'));
- $user_list = UserModel::where('role', 'in', $role_list)->column('id');
- if (!in_array($uid, $user_list)) {
- $this->error('权限不足,没有可操作的用户');
- }
- }
- // 获取所有授权配置信息
- $list_module = ModuleModel::where('access', 'neq', '')
- ->where('access', 'neq', '')
- ->where('status', 1)
- ->column('name,title,access');
- if ($list_module) {
- // tab分组信息
- $tab_list = [];
- foreach ($list_module as $key => $value) {
- $list_module[$key]['access'] = json_decode($value['access'], true);
- // 配置分组信息
- $tab_list[$value['name']] = [
- 'title' => $value['title'],
- 'url' => url('access', [
- 'module' => $value['name'],
- 'uid' => $uid
- ])
- ];
- }
- $module = $module == '' ? current(array_keys($list_module)) : $module;
- $this->assign('tab_nav', [
- 'tab_list' => $tab_list,
- 'curr_tab' => $module
- ]);
- // 读取授权内容
- $access = $list_module[$module]['access'];
- foreach ($access as $key => $value) {
- $access[$key]['url'] = url('access', [
- 'module' => $module,
- 'uid' => $uid,
- 'tab' => $key
- ]);
- }
- // 当前分组
- $tab = $tab == '' ? current(array_keys($access)) : $tab;
- // 当前授权
- $curr_access = $access[$tab];
- if (!isset($curr_access['nodes'])) {
- $this->error('模块:'.$module.' 数据授权配置缺少nodes信息');
- }
- $curr_access_nodes = $curr_access['nodes'];
- $this->assign('tab', $tab);
- $this->assign('access', $access);
- if ($this->request->isPost()) {
- $post = $this->request->param();
- if (isset($post['nodes'])) {
- $data_node = [];
- foreach ($post['nodes'] as $node) {
- list($group, $nid) = explode('|', $node);
- $data_node[] = [
- 'module' => $module,
- 'group' => $group,
- 'uid' => $uid,
- 'nid' => $nid,
- 'tag' => $post['tag']
- ];
- }
- // 先删除原有授权
- $map['module'] = $post['module'];
- $map['tag'] = $post['tag'];
- $map['uid'] = $post['uid'];
- if (false === AccessModel::where($map)->delete()) {
- $this->error('清除旧授权失败');
- }
- // 添加新的授权
- $AccessModel = new AccessModel;
- if (!$AccessModel->saveAll($data_node)) {
- $this->error('操作失败');
- }
- // 调用后置方法
- if (isset($curr_access_nodes['model_name']) && $curr_access_nodes['model_name'] != '') {
- if (strpos($curr_access_nodes['model_name'], '/')) {
- list($module, $model_name) = explode('/', $curr_access_nodes['model_name']);
- } else {
- $model_name = $curr_access_nodes['model_name'];
- }
- $class = "app\\{$module}\\model\\".$model_name;
- $model = new $class;
- try{
- $model->afterAccessUpdate($post);
- }catch(\Exception $e){}
- }
- // 记录行为
- $nids = implode(',', $post['nodes']);
- $details = "模块($module),分组(".$post['tag']."),授权节点ID($nids)";
- action_log('user_access', 'admin_user', $uid, UID, $details);
- $this->success('操作成功', url('access', ['uid' => $post['uid'], 'module' => $module, 'tab' => $tab]));
- } else {
- // 清除所有数据授权
- $map['module'] = $post['module'];
- $map['tag'] = $post['tag'];
- $map['uid'] = $post['uid'];
- if (false === AccessModel::where($map)->delete()) {
- $this->error('清除旧授权失败');
- } else {
- $this->success('操作成功');
- }
- }
- } else {
- $nodes = [];
- if (isset($curr_access_nodes['model_name']) && $curr_access_nodes['model_name'] != '') {
- if (strpos($curr_access_nodes['model_name'], '/')) {
- list($module, $model_name) = explode('/', $curr_access_nodes['model_name']);
- } else {
- $model_name = $curr_access_nodes['model_name'];
- }
- $class = "app\\{$module}\\model\\".$model_name;
- $model = new $class;
- try{
- $nodes = $model->access();
- }catch(\Exception $e){
- $this->error('模型:'.$class."缺少“access”方法");
- }
- } else {
- // 没有设置模型名,则按表名获取数据
- $fields = [
- $curr_access_nodes['primary_key'],
- $curr_access_nodes['parent_id'],
- $curr_access_nodes['node_name']
- ];
- $nodes = Db::name($curr_access_nodes['table_name'])->order($curr_access_nodes['primary_key'])->field($fields)->select();
- $tree_config = [
- 'title' => $curr_access_nodes['node_name'],
- 'id' => $curr_access_nodes['primary_key'],
- 'pid' => $curr_access_nodes['parent_id']
- ];
- $nodes = Tree::config($tree_config)->toLayer($nodes);
- }
- // 查询当前用户的权限
- $map = [
- 'module' => $module,
- 'tag' => $tab,
- 'uid' => $uid
- ];
- $node_access = AccessModel::where($map)->select();
- $user_access = [];
- foreach ($node_access as $item) {
- $user_access[$item['group'].'|'.$item['nid']] = 1;
- }
- $nodes = $this->buildJsTree($nodes, $curr_access_nodes, $user_access);
- $this->assign('nodes', $nodes);
- }
- $page_tips = isset($curr_access['page_tips']) ? $curr_access['page_tips'] : '';
- $tips_type = isset($curr_access['tips_type']) ? $curr_access['tips_type'] : 'info';
- $this->assign('page_tips', $page_tips);
- $this->assign('tips_type', $tips_type);
- }
- $this->assign('module', $module);
- $this->assign('uid', $uid);
- $this->assign('tab', $tab);
- $this->assign('page_title', '数据授权');
- return $this->fetch();
- }
- /**
- * 构建jstree代码
- * @param array $nodes 节点
- * @param array $curr_access 当前授权信息
- * @param array $user_access 用户授权信息
- * @author 蔡伟明 <314013107@qq.com>
- * @return string
- */
- private function buildJsTree($nodes = [], $curr_access = [], $user_access = [])
- {
- $result = '';
- if (!empty($nodes)) {
- $option = [
- 'opened' => true,
- 'selected' => false
- ];
- foreach ($nodes as $node) {
- $key = $curr_access['group'].'|'.$node[$curr_access['primary_key']];
- $option['selected'] = isset($user_access[$key]) ? true : false;
- if (isset($node['child'])) {
- $curr_access_child = isset($curr_access['child']) ? $curr_access['child'] : $curr_access;
- $result .= '<li id="'.$key.'" data-jstree=\''.json_encode($option).'\'>'.$node[$curr_access['node_name']].$this->buildJsTree($node['child'], $curr_access_child, $user_access).'</li>';
- } else {
- $result .= '<li id="'.$key.'" data-jstree=\''.json_encode($option).'\'>'.$node[$curr_access['node_name']].'</li>';
- }
- }
- }
- return '<ul>'.$result.'</ul>';
- }
- /**
- * 删除用户
- * @param array $ids 用户id
- * @author 蔡伟明 <314013107@qq.com>
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function delete($ids = [])
- {
- Hook::listen('user_delete', $ids);
- return $this->setStatus('delete');
- }
- /**
- * 启用用户
- * @param array $ids 用户id
- * @author 蔡伟明 <314013107@qq.com>
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function enable($ids = [])
- {
- Hook::listen('user_enable', $ids);
- return $this->setStatus('enable');
- }
- /**
- * 禁用用户
- * @param array $ids 用户id
- * @author 蔡伟明 <314013107@qq.com>
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function disable($ids = [])
- {
- Hook::listen('user_disable', $ids);
- return $this->setStatus('disable');
- }
- /**
- * 设置用户状态:删除、禁用、启用
- * @param string $type 类型:delete/enable/disable
- * @param array $record
- * @author 蔡伟明 <314013107@qq.com>
- * @throws \think\Exception
- * @throws \think\exception\PDOException
- */
- public function setStatus($type = '', $record = [])
- {
- $ids = $this->request->isPost() ? input('post.ids/a') : input('param.ids');
- $ids = (array)$ids;
- // 当前用户所能操作的用户
- $role_list = RoleModel::getChildsId(session('user_auth.role'));
- $user_list = UserModel::where('role', 'in', $role_list)->column('id');
- if (session('user_auth.role') != 1 && !$user_list) {
- $this->error('权限不足,没有可操作的用户');
- }
- $ids = array_intersect($user_list, $ids);
- if (!$ids) {
- $this->error('权限不足,没有可操作的用户');
- }
- switch ($type) {
- case 'enable':
- if (false === UserModel::where('id', 'in', $ids)->setField('status', 1)) {
- $this->error('启用失败');
- }
- break;
- case 'disable':
- if (false === UserModel::where('id', 'in', $ids)->setField('status', 0)) {
- $this->error('禁用失败');
- }
- break;
- case 'delete':
- if (false === UserModel::where('id', 'in', $ids)->delete()) {
- $this->error('删除失败');
- }
- break;
- default:
- $this->error('非法操作');
- }
- action_log('user_'.$type, 'admin_user', '', UID);
- $this->success('操作成功');
- }
- /**
- * 快速编辑
- * @param array $record 行为日志
- * @author 蔡伟明 <314013107@qq.com>
- * @return mixed
- */
- public function quickEdit($record = [])
- {
- $id = input('post.pk', '');
- $id == UID && $this->error('禁止操作当前账号');
- $field = input('post.name', '');
- $value = input('post.value', '');
- // 非超级管理员检查可操作的用户
- if (session('user_auth.role') != 1) {
- $role_list = RoleModel::getChildsId(session('user_auth.role'));
- $user_list = UserModel::where('role', 'in', $role_list)->column('id');
- if (!in_array($id, $user_list)) {
- $this->error('权限不足,没有可操作的用户');
- }
- }
- $config = UserModel::where('id', $id)->value($field);
- $details = '字段(' . $field . '),原值(' . $config . '),新值:(' . $value . ')';
- return parent::quickEdit(['user_edit', 'admin_user', $id, UID, $details]);
- }
- }
|