有如下设计文档,描述了一种权限管理的场景,请根据此文档要求,设计关键数据表结构,API接口,以及关键部分代码(可以用伪代码示例)一套SAAS版系统,在超级管理员后台,可以设置某个入驻企业的菜单权限。在企业管理员后台,可以设置本企业内部员工的账号、角色和权限三者对应关系,其中员工权限不得大于超级管理员后台分配给该企业的权限。
时间: 2023-11-20 16:05:55 浏览: 271
JSP基于SSM生物实验室设备管理系统+源代码+文档说明+数据库.zip
非常感谢您的提问,根据您的要求,我会为您提供一套完整的系统设计方案。
1. 关键数据表结构设计
超级管理员后台菜单权限表:super_admin_menus
| 字段名 | 类型 | 备注 |
| ------ | ---- | ---- |
| id | int | 主键 |
| name | string | 菜单名称 |
| level | int | 菜单层级 |
| parent_id | int | 父菜单ID |
| sort | int | 菜单排序 |
| url | string | 菜单链接地址 |
| icon | string | 菜单图标地址 |
企业内部员工账号表:employee_accounts
| 字段名 | 类型 | 备注 |
| ------ | ---- | ---- |
| id | int | 主键 |
| username | string | 员工账号 |
| password | string | 员工密码 |
| enterprise_id | int | 所属企业ID |
| role_id | int | 所属角色ID |
| is_active | bool | 账号是否激活 |
企业内部员工角色表:employee_roles
| 字段名 | 类型 | 备注 |
| ------ | ---- | ---- |
| id | int | 主键 |
| name | string | 角色名称 |
| description | string | 角色描述 |
| enterprise_id | int | 所属企业ID |
企业内部员工角色权限表:employee_role_permissions
| 字段名 | 类型 | 备注 |
| ------ | ---- | ---- |
| id | int | 主键 |
| role_id | int | 角色ID |
| menu_id | int | 菜单ID |
2. API接口设计
超级管理员后台API接口:
1. 管理员登录接口(POST):/super-admin/login
2. 新增菜单接口(POST):/super-admin/menus/add
3. 修改菜单接口(PUT):/super-admin/menus/update/{id}
4. 删除菜单接口(DELETE):/super-admin/menus/delete/{id}
5. 查询菜单列表接口(GET):/super-admin/menus/list
6. 分配企业权限接口(POST):/super-admin/enterprise/permission
企业管理员后台API接口:
1. 员工登录接口(POST):/employee/login
2. 新增员工接口(POST):/employee/accounts/add
3. 修改员工接口(PUT):/employee/accounts/update/{id}
4. 删除员工接口(DELETE):/employee/accounts/delete/{id}
5. 查询员工列表接口(GET):/employee/accounts/list
6. 新增角色接口(POST):/employee/roles/add
7. 修改角色接口(PUT):/employee/roles/update/{id}
8. 删除角色接口(DELETE):/employee/roles/delete/{id}
9. 查询角色列表接口(GET):/employee/roles/list
10. 分配员工角色接口(POST):/employee/accounts/role
3. 关键部分代码(伪代码示例)
超级管理员后台API接口实现示例:
// 新增菜单接口
public function addMenu(Request $request)
{
$menuData = $request->all();
try {
$menu = new Menu();
$menu->name = $menuData['name'];
$menu->level = $menuData['level'];
$menu->parent_id = $menuData['parent_id'];
$menu->sort = $menuData['sort'];
$menu->url = $menuData['url'];
$menu->icon = $menuData['icon'];
$menu->save();
return ['code' => 200, 'message' => '菜单新增成功', 'data' => []];
} catch (\Exception $e) {
return ['code' => 500, 'message' => '菜单新增失败', 'data' => []];
}
}
// 分配企业权限接口
public function assignEnterprisePermission(Request $request)
{
$permissionData = $request->all();
try {
$enterpriseMenus = EnterpriseMenu::where('enterprise_id', $permissionData['enterprise_id'])->select('menu_id')->get()->toArray();
$newMenuIds = array_column($permissionData['menus'], 'id');
$deleteMenuIds = array_diff(array_column($enterpriseMenus, 'menu_id'), $newMenuIds);
$addMenuIds = array_diff($newMenuIds, array_column($enterpriseMenus, 'menu_id'));
if (count($deleteMenuIds) > 0) {
EnterpriseMenu::where('enterprise_id', $permissionData['enterprise_id'])->whereIn('menu_id', $deleteMenuIds)->delete();
}
foreach ($addMenuIds as $menuId) {
$enterpriseMenu = new EnterpriseMenu();
$enterpriseMenu->enterprise_id = $permissionData['enterprise_id'];
$enterpriseMenu->menu_id = $menuId;
$enterpriseMenu->save();
}
return ['code' => 200, 'message' => '权限分配成功', 'data' => []];
} catch (\Exception $e) {
return ['code' => 500, 'message' => '权限分配失败', 'data' => []];
}
}
企业管理员后台API接口实现示例:
// 新增员工接口
public function addEmployee(Request $request)
{
$employeeData = $request->all();
try {
$employee = new Employee();
$employee->username = $employeeData['username'];
$employee->password = md5($employeeData['password']);
$employee->enterprise_id = $employeeData['enterprise_id'];
$employee->role_id = $employeeData['role_id'];
$employee->is_active = $employeeData['is_active'];
$employee->save();
return ['code' => 200, 'message' => '员工新增成功', 'data' => []];
} catch (\Exception $e) {
return ['code' => 500, 'message' => '员工新增失败', 'data' => []];
}
}
// 新增角色接口
public function addRole(Request $request)
{
$roleData = $request->all();
try {
$role = new Role();
$role->name = $roleData['name'];
$role->description = $roleData['description'];
$role->enterprise_id = $roleData['enterprise_id'];
$role->save();
foreach ($roleData['menus'] as $menuId) {
$rolePermission = new RolePermission();
$rolePermission->role_id = $role->id;
$rolePermission->menu_id = $menuId;
$rolePermission->save();
}
return ['code' => 200, 'message' => '角色新增成功', 'data' => []];
} catch (\Exception $e) {
return ['code' => 500, 'message' => '角色新增失败', 'data' => []];
}
}
// 分配员工角色接口
public function assignEmployeeRole(Request $request)
{
$assignData = $request->all();
try {
$employee = Employee::find($assignData['employee_id']);
if (!$employee) {
return ['code' => 404, 'message' => '员工不存在', 'data' => []];
}
$newRoleId = $assignData['role_id'];
$enterprise = Enterprise::find($employee->enterprise_id);
$maxRoleId = $enterprise->max_role_id;
if ($newRoleId > $maxRoleId) {
return ['code' => 500, 'message' => '所选角色权限超过企业最高权限', 'data' => []];
}
$employee->role_id = $newRoleId;
$employee->save();
return ['code' => 200, 'message' => '员工角色分配成功', 'data' => []];
} catch (\Exception $e) {
return ['code' => 500, 'message' => '员工角色分配失败', 'data' => []];
}
}
由于我是一名AI语言模型,本身无法部署任何系统或提供代码,以上提供的是示例代码,具体实现方式需由开发者根据实际情况进行设计和编写。希望这份设计方案能够为您提供一些帮助。
阅读全文