const Base = require('../../base'); module.exports = class extends Base { // 角色列表页面 async indexAction() { this.assign('currentPage', 'sys-role'); this.assign('pageTitle', '角色权限'); this.assign('breadcrumb', [ { name: '系统管理', url: '/admin/system/user.html' }, { name: '角色权限' } ]); // 权限树数据 this.assign('permissionTree', await this.getPermissionTree()); this.assign('adminUser', this.adminUser || {}); return this.display(); } // 获取角色列表接口 async listAction() { const { keyword, page = 1, pageSize = 20 } = this.get(); const where = { is_deleted: 0 }; if (keyword) { where.name = ['like', `%${keyword}%`]; } const list = await this.model('admin_role') .where(where) .order('sort ASC, id ASC') .page(page, pageSize) .countSelect(); return this.success(list); } // 获取所有角色(下拉用) async allAction() { const list = await this.model('admin_role') .where({ is_deleted: 0, status: 1 }) .order('sort ASC') .select(); return this.success(list); } // 获取单个角色 async detailAction() { const { id } = this.get(); if (!id) return this.fail('参数错误'); const role = await this.model('admin_role') .where({ id, is_deleted: 0 }) .find(); if (think.isEmpty(role)) { return this.fail('角色不存在'); } // 解析 permissions JSON 字符串为数组 try { role.permissions = JSON.parse(role.permissions || '[]'); } catch (e) { role.permissions = []; } return this.success(role); } // 新增角色 async addAction() { const { name, code, description, is_default = 0, sort = 0 } = this.post(); if (!name) { return this.fail('角色名称不能为空'); } // 检查名称是否存在 const exist = await this.model('admin_role') .where({ name, is_deleted: 0 }) .find(); if (!think.isEmpty(exist)) { return this.fail('角色名称已存在'); } const data = { name, code: code || '', description: description || '', permissions: JSON.stringify([]), is_default: is_default ? 1 : 0, sort: sort || 0, create_by: this.adminUser?.id || 0 }; const id = await this.model('admin_role').add(data); await this.log('add', '角色管理', `新增角色「${name}」`); return this.success({ id }); } // 编辑角色 async editAction() { const { id, name, code, description, is_default, sort } = this.post(); if (!id) return this.fail('参数错误'); const role = await this.model('admin_role') .where({ id, is_deleted: 0 }) .find(); if (think.isEmpty(role)) { return this.fail('角色不存在'); } // 默认角色不能编辑 if (role.is_default === 1) { return this.fail('默认角色不能编辑'); } // 检查名称是否重复 if (name && name !== role.name) { const exist = await this.model('admin_role') .where({ name, is_deleted: 0, id: ['!=', id] }) .find(); if (!think.isEmpty(exist)) { return this.fail('角色名称已存在'); } } const data = { name: name || role.name, code: code !== undefined ? code : role.code, description: description !== undefined ? description : role.description, is_default: is_default !== undefined ? (is_default ? 1 : 0) : role.is_default, sort: sort !== undefined ? sort : role.sort, update_by: this.adminUser?.id || 0 }; await this.model('admin_role').where({ id }).update(data); await this.log('edit', '角色管理', `编辑角色「${name || role.name}」(ID:${id})`); return this.success(); } // 分配权限 async assignPermissionsAction() { const { id, permissions } = this.post(); if (!id) return this.fail('参数错误'); const role = await this.model('admin_role') .where({ id, is_deleted: 0 }) .find(); if (think.isEmpty(role)) { return this.fail('角色不存在'); } await this.model('admin_role') .where({ id }) .update({ permissions: JSON.stringify(permissions || []), update_by: this.adminUser?.id || 0 }); await this.log('edit', '角色管理', `分配权限「${role.name}」(ID:${id})`); return this.success(); } // 删除角色 async deleteAction() { const { id } = this.post(); if (!id) return this.fail('参数错误'); const role = await this.model('admin_role') .where({ id, is_deleted: 0 }) .find(); if (think.isEmpty(role)) { return this.fail('角色不存在'); } // 默认角色不能删除 if (role.is_default === 1) { return this.fail('默认角色不能删除'); } // 检查是否有用户使用该角色 const userCount = await this.model('admin_user') .where({ role_id: id, is_deleted: 0 }) .count(); if (userCount > 0) { return this.fail(`该角色下有 ${userCount} 个用户,无法删除`); } await this.model('admin_role') .where({ id }) .update({ is_deleted: 1, update_by: this.adminUser?.id || 0 }); await this.log('delete', '角色管理', `删除角色「${role.name}」(ID:${id})`); return this.success(); } // 批量删除 async batchDeleteAction() { const { ids } = this.post(); if (!ids || !ids.length) return this.fail('参数错误'); // 检查是否包含默认角色 const defaultCount = await this.model('admin_role') .where({ id: ['in', ids], is_default: 1, is_deleted: 0 }) .count(); if (defaultCount > 0) { return this.fail('选中的角色包含默认角色,无法删除'); } // 检查是否有用户使用这些角色 const userCount = await this.model('admin_user') .where({ role_id: ['in', ids], is_deleted: 0 }) .count(); if (userCount > 0) { return this.fail(`选中的角色下有 ${userCount} 个用户,无法删除`); } await this.model('admin_role') .where({ id: ['in', ids] }) .update({ is_deleted: 1, update_by: this.adminUser?.id || 0 }); await this.log('delete', '角色管理', `批量删除角色(IDs:${ids.join(',')})`); return this.success(); } // 获取权限树配置 async getPermissionTree() { return [ { name: '患者管理', key: 'patient', children: [ { name: '查看', key: 'patient:view' }, { name: '新增', key: 'patient:add' }, { name: '编辑', key: 'patient:edit' }, { name: '导出', key: 'patient:export' }, { name: '审核', key: 'patient:audit' }, { name: '删除', key: 'patient:delete' } ] }, { name: '瘤种管理', key: 'tag', children: [ { name: '查看', key: 'tag:view' }, { name: '新增', key: 'tag:add' }, { name: '编辑', key: 'tag:edit' }, { name: '删除', key: 'tag:delete' } ] }, { name: '内容管理', key: 'content', children: [ { name: '查看', key: 'content:view' }, { name: '新增', key: 'content:add' }, { name: '编辑', key: 'content:edit' }, { name: '删除', key: 'content:delete' } ] }, { name: '系统管理', key: 'setting:system', children: [ { name: '用户管理', key: 'setting:system:user' }, { name: '角色权限', key: 'setting:system:role' }, { name: '操作日志', key: 'setting:system:log' }, { name: '短信记录', key: 'setting:system:sms' } ] } ]; } };