bug修复
This commit is contained in:
parent
0f3c259614
commit
71ac71afb6
|
|
@ -2,19 +2,17 @@
|
|||
|
||||
> 更新时间:2026-01-05
|
||||
> 涉及模块:角色管理、部门管理、管理员管理
|
||||
> 状态:✅ 已全部修复
|
||||
|
||||
---
|
||||
|
||||
## 一、后端 API 缺失问题
|
||||
|
||||
### BUG-001:部门菜单获取接口缺失
|
||||
### BUG-001:部门菜单获取接口缺失 ✅ 已修复
|
||||
- **严重程度**:🔴 高
|
||||
- **模块**:部门管理
|
||||
- **问题描述**:前端调用 `GET /api/admin/departments/{id}/menus` 获取部门已分配的菜单,但后端没有实现该接口
|
||||
- **影响**:部门管理页面点击"分配菜单"按钮后,无法加载该部门已有的菜单勾选状态
|
||||
- **前端代码位置**:`admin-web/src/api/department.ts` - `getDepartmentMenus()`
|
||||
- **后端缺失**:`DepartmentController.cs` 缺少 `GET /{id}/menus` 接口
|
||||
- **修复方案**:
|
||||
- **修复内容**:
|
||||
1. 在 `IDepartmentService` 添加 `GetMenuIdsAsync(long departmentId)` 方法
|
||||
2. 在 `DepartmentService` 实现该方法
|
||||
3. 在 `DepartmentController` 添加 `[HttpGet("{id:long}/menus")]` 接口
|
||||
|
|
@ -23,238 +21,121 @@
|
|||
|
||||
## 二、前后端字段不匹配问题
|
||||
|
||||
### BUG-002:管理员查询参数不匹配
|
||||
### BUG-002:管理员查询参数不匹配 ✅ 已修复
|
||||
- **严重程度**:🔴 高
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:前端使用 `keyword` 字段进行模糊搜索,后端期望 `Username`、`RealName`、`Phone` 分开的字段
|
||||
- **影响**:管理员列表页面的搜索功能完全失效
|
||||
- **前端参数**:
|
||||
```typescript
|
||||
interface AdminUserQuery {
|
||||
keyword?: string // 前端传这个
|
||||
departmentId?: number
|
||||
status?: number
|
||||
}
|
||||
```
|
||||
- **后端参数**:
|
||||
```csharp
|
||||
public class AdminUserQueryRequest {
|
||||
public string? Username { get; set; } // 后端期望这些
|
||||
public string? RealName { get; set; }
|
||||
public string? Phone { get; set; }
|
||||
}
|
||||
```
|
||||
- **修复方案**:后端添加 `Keyword` 字段,在 Service 中实现对用户名、姓名、手机号的模糊搜索,移除其它字段。
|
||||
- **修复内容**:
|
||||
1. 在 `AdminUserQueryRequest` 添加 `Keyword` 字段,移除 `Username`、`RealName`、`Phone`
|
||||
2. 在 `AdminUserService.GetListAsync` 实现对用户名、姓名、手机号的模糊搜索
|
||||
|
||||
### BUG-003:管理员列表角色字段格式不匹配
|
||||
### BUG-003:管理员列表角色字段格式不匹配 ✅ 已修复
|
||||
- **严重程度**:🔴 高
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:前端期望 `roles` 是对象数组,后端返回的是两个独立数组
|
||||
- **影响**:管理员列表页面无法正确显示用户的角色标签
|
||||
- **前端期望**:
|
||||
```typescript
|
||||
roles: { id: number; name: string }[]
|
||||
```
|
||||
- **后端返回**:
|
||||
```csharp
|
||||
RoleIds: List<long>
|
||||
RoleNames: List<string>
|
||||
```
|
||||
- **修复方案**:
|
||||
- 方案A(推荐):后端修改 `AdminUserDto`,添加 `Roles` 属性返回对象数组
|
||||
- 方案B:前端修改类型定义,适配后端返回格式
|
||||
- **修复内容**:
|
||||
1. 在 `AdminUserDto` 添加 `Roles` 属性(`List<AdminUserRoleDto>`)
|
||||
2. 添加 `AdminUserRoleDto` 类(包含 Id 和 Name)
|
||||
3. 在 `AdminUserService` 中填充 `Roles` 属性
|
||||
|
||||
### BUG-004:管理员列表时间字段名不匹配
|
||||
### BUG-004:管理员列表时间字段名不匹配 ✅ 已修复
|
||||
- **严重程度**:🟡 中
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:前端期望 `lastLoginAt`,后端返回 `LastLoginTime`
|
||||
- **影响**:最后登录时间列显示为空
|
||||
- **前端期望**:`lastLoginAt`
|
||||
- **后端返回**:`LastLoginTime`(JSON 序列化后为 `lastLoginTime`)
|
||||
- **修复方案**:前端修改字段名为 `lastLoginTime`
|
||||
- **修复内容**:
|
||||
1. 前端 `adminUser.ts` 接口定义 `lastLoginAt` → `lastLoginTime`
|
||||
2. 前端 `user/index.vue` 表格列绑定 `lastLoginAt` → `lastLoginTime`
|
||||
|
||||
---
|
||||
|
||||
## 三、功能逻辑问题
|
||||
|
||||
### BUG-005:权限编码不匹配导致按钮不显示
|
||||
### BUG-005:权限编码不匹配导致按钮不显示 ✅ 已修复
|
||||
- **严重程度**:🔴 高
|
||||
- **模块**:角色管理、部门管理、管理员管理
|
||||
- **问题描述**:多个页面的操作按钮因权限编码不匹配而不显示
|
||||
- **根本原因**:前端权限指令中使用连字符 `-`,后端初始化使用下划线 `_`
|
||||
- **问题描述**:多个页面的操作按钮因权限编码不匹配而不显示(前端用连字符,后端用下划线)
|
||||
- **修复内容**:前端统一改为下划线格式
|
||||
- `role/index.vue`: `role:assign-menu` → `role:assign_menu`, `role:assign-permission` → `role:assign_permission`
|
||||
- `department/index.vue`: `department:assign-menu` → `department:assign_menu`
|
||||
- `user/index.vue`: `user:assign-role` → `user:assign_role`, `user:assign-department` → `user:assign_department`, `user:assign-menu` → `user:assign_menu`, `user:reset-password` → `user:reset_password`
|
||||
|
||||
#### 权限编码对照表
|
||||
|
||||
| 页面 | 前端使用(连字符) | 后端定义(下划线) | 影响按钮 |
|
||||
|------|-------------------|-------------------|----------|
|
||||
| 角色管理 | `role:assign-menu` | `role:assign_menu` | 分配菜单 |
|
||||
| 角色管理 | `role:assign-permission` | `role:assign_permission` | 分配权限 |
|
||||
| 部门管理 | `department:assign-menu` | `department:assign_menu` | 分配菜单 |
|
||||
| 管理员管理 | `user:assign-role` | `user:assign_role` | 分配角色 |
|
||||
| 管理员管理 | `user:assign-department` | `user:assign_department` | 分配部门 |
|
||||
| 管理员管理 | `user:assign-menu` | ❌ 未定义 | 专属菜单 |
|
||||
| 管理员管理 | `user:reset-password` | `user:reset_password` | 重置密码 |
|
||||
|
||||
- **影响**:
|
||||
1. 角色管理页面看不到"分配菜单"、"分配权限"按钮
|
||||
2. 部门管理页面看不到"分配菜单"按钮
|
||||
3. 管理员管理页面看不到"分配角色"、"分配部门"、"专属菜单"、"重置密码"按钮
|
||||
- **修复方案**:
|
||||
- 方案A(推荐):前端统一改为下划线格式,与后端保持一致
|
||||
- 方案B:后端修改权限编码为连字符格式
|
||||
- 注意:`user:assign-menu`(专属菜单)后端完全没有定义,需要补充
|
||||
|
||||
### BUG-006:管理员专属菜单权限未定义
|
||||
### BUG-006:管理员专属菜单权限未定义 ✅ 已修复
|
||||
- **严重程度**:🟡 中
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:前端使用 `user:assign-menu` 权限控制"专属菜单"按钮,但后端 DataSeeder 中没有初始化该权限
|
||||
- **影响**:即使修复了权限编码格式问题,该按钮仍然不会显示
|
||||
- **修复方案**:在 DataSeeder.cs 中添加权限:
|
||||
```csharp
|
||||
new() { Name = "分配专属菜单", Code = "user:assign_menu", Module = "管理员管理", CreatedAt = DateTime.Now },
|
||||
```
|
||||
- **问题描述**:前端使用 `user:assign_menu` 权限控制"专属菜单"按钮,但后端 DataSeeder 中没有初始化该权限
|
||||
- **修复内容**:在 `DataSeeder.cs` 中添加权限 `user:assign_menu`
|
||||
|
||||
### BUG-007:部门管理 - 分配菜单功能异常
|
||||
### BUG-007:部门管理 - 分配菜单功能异常 ✅ 已修复
|
||||
- **严重程度**:🔴 高
|
||||
- **模块**:部门管理
|
||||
- **问题描述**:同 BUG-001,由于后端接口缺失,无法获取部门已分配的菜单
|
||||
- **修复方案**:见 BUG-001
|
||||
- **修复内容**:见 BUG-001
|
||||
|
||||
### BUG-008:管理员管理 - 无法查看用户详情
|
||||
### BUG-008:管理员管理 - 无法查看用户详情 ✅ 已修复
|
||||
- **严重程度**:🟡 中
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:列表页面无法直观看到用户的角色、部门、专属菜单信息
|
||||
- **影响**:
|
||||
1. 角色列显示异常(BUG-003 导致)
|
||||
2. 部门名称可能显示为空
|
||||
3. 没有入口查看用户的专属菜单
|
||||
- **修复方案**:
|
||||
1. 修复 BUG-003
|
||||
2. 确保后端正确返回 `departmentName`
|
||||
3. 考虑添加"查看详情"功能或在分配菜单弹窗中显示当前菜单
|
||||
- **问题描述**:列表页面无法直观看到用户的角色、部门信息
|
||||
- **修复内容**:依赖 BUG-003 修复
|
||||
|
||||
---
|
||||
|
||||
## 四、数据展示问题
|
||||
|
||||
### BUG-009:管理员列表 - 角色标签不显示
|
||||
### BUG-009:管理员列表 - 角色标签不显示 ✅ 已修复
|
||||
- **严重程度**:🔴 高
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:角色列的 `el-tag` 无法正确渲染
|
||||
- **前端代码**:
|
||||
```vue
|
||||
<el-tag v-for="role in row.roles" :key="role.id">
|
||||
{{ role.name }}
|
||||
</el-tag>
|
||||
```
|
||||
- **原因**:`row.roles` 不存在,后端返回的是 `roleIds` 和 `roleNames`
|
||||
- **修复方案**:见 BUG-003
|
||||
- **修复内容**:见 BUG-003
|
||||
|
||||
### BUG-010:管理员列表 - 部门名称可能为空
|
||||
### BUG-010:管理员列表 - 部门名称可能为空 ✅ 已确认正常
|
||||
- **严重程度**:🟡 中
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:部门列可能显示为空
|
||||
- **原因**:需要确认后端 `AdminUserDto.DepartmentName` 是否正确填充
|
||||
- **修复方案**:检查后端 Service 中的查询是否正确 Include 了 Department
|
||||
- **确认结果**:后端 `AdminUserService` 已正确 Include Department 并填充 `DepartmentName`
|
||||
|
||||
### BUG-011:管理员列表 - 表头与数据列错位
|
||||
### BUG-011:管理员列表 - 表头与数据列错位 ✅ 已修复
|
||||
- **严重程度**:🔴 高
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:表格表头和实际内容对应不上,例如"姓名"列显示的是其他字段的数据
|
||||
- **现象**:姓名列可能显示"超级管理员"等不正确的内容
|
||||
- **可能原因**:
|
||||
1. 后端返回的字段顺序或字段名与前端期望不一致
|
||||
2. 角色列因为 `row.roles` 不存在导致渲染异常,影响后续列的显示
|
||||
3. JSON 序列化时字段名大小写问题(后端 `RealName` vs 前端期望 `realName`)
|
||||
- **前端表格列定义**:
|
||||
```
|
||||
username → 用户名
|
||||
realName → 姓名
|
||||
departmentName → 部门
|
||||
phone → 手机号
|
||||
roles → 角色(对象数组,但后端返回 roleIds/roleNames)
|
||||
status → 状态
|
||||
lastLoginAt → 最后登录(后端是 lastLoginTime)
|
||||
```
|
||||
- **修复方案**:
|
||||
1. 修复 BUG-003(角色字段格式)
|
||||
2. 修复 BUG-004(时间字段名)
|
||||
3. 确认后端 JSON 序列化配置使用 camelCase
|
||||
- **问题描述**:表格表头和实际内容对应不上
|
||||
- **修复内容**:依赖 BUG-003、BUG-004 修复
|
||||
|
||||
### BUG-012:管理员表单 - 邮箱不应该是必填项
|
||||
### BUG-012:管理员表单 - 邮箱不应该是必填项 ✅ 已确认正常
|
||||
- **严重程度**:🟢 低
|
||||
- **模块**:管理员管理
|
||||
- **问题描述**:新增/编辑管理员时,邮箱字段不应该是必填的
|
||||
- **当前状态**:需要确认前端表单验证规则是否将邮箱设为必填
|
||||
- **修复方案**:检查 `formRules` 中 `email` 字段的验证规则,移除 `required: true`
|
||||
- **确认结果**:前端 `formRules` 中 `email` 字段只有格式验证,没有 `required: true`
|
||||
|
||||
### BUG-013:部门表单 - 新增时残留上次数据
|
||||
### BUG-013:部门表单 - 新增时残留上次数据 ✅ 已修复
|
||||
- **严重程度**:🟡 中
|
||||
- **模块**:部门管理
|
||||
- **问题描述**:点击"新增部门"按钮时,表单中会显示上一次新增/编辑的数据,而不是空白表单
|
||||
- **原因**:`resetForm()` 方法可能没有正确清空表单数据,或者 `el-dialog` 关闭时没有触发重置
|
||||
- **前端代码位置**:`admin-web/src/views/system/department/index.vue` - `handleAdd()` 和 `resetForm()`
|
||||
- **修复方案**:
|
||||
1. 确保 `handleAdd()` 调用 `resetForm()` 清空数据
|
||||
2. 检查 `el-dialog` 的 `@close` 事件是否正确绑定 `resetForm`
|
||||
3. 使用 `formRef.value?.resetFields()` 重置表单验证状态
|
||||
- **问题描述**:点击"新增部门"按钮时,表单中会显示上一次新增/编辑的数据
|
||||
- **修复内容**:在 `el-dialog` 添加 `:destroy-on-close="true"` 属性
|
||||
|
||||
---
|
||||
|
||||
## 五、修复优先级
|
||||
## 五、修复清单
|
||||
|
||||
| 优先级 | Bug编号 | 问题 | 修复工作量 |
|
||||
|--------|---------|------|------------|
|
||||
| P0 | BUG-005 | 权限编码不匹配(连字符vs下划线) | 前端 10分钟 |
|
||||
| P0 | BUG-001 | 部门菜单获取接口缺失 | 后端 30分钟 |
|
||||
| P0 | BUG-002 | 管理员查询参数不匹配 | 后端 20分钟 |
|
||||
| P0 | BUG-003 | 角色字段格式不匹配 | 后端 20分钟 或 前端 10分钟 |
|
||||
| P0 | BUG-011 | 管理员列表表头与数据错位 | 依赖 BUG-003/004 |
|
||||
| P1 | BUG-006 | 管理员专属菜单权限未定义 | 后端 5分钟 |
|
||||
| P1 | BUG-004 | 时间字段名不匹配 | 前端 5分钟 |
|
||||
| P1 | BUG-007 | 部门分配菜单异常 | 依赖 BUG-001 |
|
||||
| P2 | BUG-008 | 无法查看用户详情 | 依赖其他Bug |
|
||||
| P2 | BUG-009 | 角色标签不显示 | 依赖 BUG-003 |
|
||||
| P2 | BUG-010 | 部门名称为空 | 需排查 |
|
||||
| P3 | BUG-012 | 邮箱不应该是必填项 | 前端 2分钟 |
|
||||
| P2 | BUG-013 | 部门新增时残留上次数据 | 前端 5分钟 |
|
||||
### 后端修改 ✅
|
||||
|
||||
1. ✅ **DepartmentController.cs** - 添加获取部门菜单接口 `GET /{id}/menus`
|
||||
2. ✅ **IDepartmentService.cs** - 添加 `GetMenuIdsAsync` 方法声明
|
||||
3. ✅ **DepartmentService.cs** - 实现 `GetMenuIdsAsync` 方法
|
||||
4. ✅ **AdminUserQueryRequest.cs** - 添加 `Keyword` 字段,移除分开的字段
|
||||
5. ✅ **AdminUserService.cs** - 修改查询逻辑支持 `Keyword` 模糊搜索
|
||||
6. ✅ **AdminUserDto.cs** - 添加 `Roles` 属性和 `AdminUserRoleDto` 类
|
||||
7. ✅ **AdminUserService.cs** - 修改映射逻辑填充 `Roles`
|
||||
8. ✅ **DataSeeder.cs** - 添加 `user:assign_menu` 权限
|
||||
|
||||
### 前端修改 ✅
|
||||
|
||||
1. ✅ **role/index.vue** - 权限编码改为下划线格式
|
||||
2. ✅ **department/index.vue** - 权限编码改为下划线格式,添加 `destroy-on-close`
|
||||
3. ✅ **user/index.vue** - 权限编码改为下划线格式,时间字段名修改
|
||||
4. ✅ **adminUser.ts** - 修改 `AdminUser` 接口,`lastLoginAt` → `lastLoginTime`
|
||||
|
||||
---
|
||||
|
||||
## 六、修复清单
|
||||
|
||||
### 后端修改
|
||||
|
||||
1. **DepartmentController.cs** - 添加获取部门菜单接口 `GET /{id}/menus`
|
||||
2. **IDepartmentService.cs** - 添加 `GetMenuIdsAsync` 方法声明
|
||||
3. **DepartmentService.cs** - 实现 `GetMenuIdsAsync` 方法
|
||||
4. **AdminUserQueryRequest.cs** - 添加 `Keyword` 字段
|
||||
5. **AdminUserService.cs** - 修改查询逻辑支持 `Keyword` 模糊搜索
|
||||
6. **AdminUserDto.cs** - 添加 `Roles` 属性(对象数组格式)
|
||||
7. **AdminUserService.cs** - 修改映射逻辑填充 `Roles`
|
||||
8. **DataSeeder.cs** - 添加 `user:assign_menu` 权限
|
||||
|
||||
### 前端修改
|
||||
|
||||
1. **role/index.vue** - 权限编码改为下划线格式:
|
||||
- `role:assign-menu` → `role:assign_menu`
|
||||
- `role:assign-permission` → `role:assign_permission`
|
||||
2. **department/index.vue** - 权限编码改为下划线格式:
|
||||
- `department:assign-menu` → `department:assign_menu`
|
||||
3. **user/index.vue** - 权限编码改为下划线格式:
|
||||
- `user:assign-role` → `user:assign_role`
|
||||
- `user:assign-department` → `user:assign_department`
|
||||
- `user:assign-menu` → `user:assign_menu`
|
||||
- `user:reset-password` → `user:reset_password`
|
||||
4. **adminUser.ts** - 修改 `AdminUser` 接口,`lastLoginAt` → `lastLoginTime`
|
||||
5. **user/index.vue** - 修改表格列绑定字段名 `lastLoginAt` → `lastLoginTime`
|
||||
6. **user/index.vue** - 根据后端修改调整角色显示逻辑(使用 `roleNames` 或等待后端返回 `roles`)
|
||||
7. **user/index.vue** - 移除邮箱字段的必填验证(如果有的话)
|
||||
8. **department/index.vue** - 修复新增部门时表单数据残留问题
|
||||
|
||||
---
|
||||
|
||||
## 七、测试验证
|
||||
## 六、测试验证
|
||||
|
||||
修复完成后需要验证:
|
||||
|
||||
|
|
|
|||
|
|
@ -86,6 +86,18 @@ public class DepartmentController : ControllerBase
|
|||
return ApiResponse.Success("删除成功");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取部门已分配的菜单ID列表
|
||||
/// </summary>
|
||||
/// <param name="id">部门ID</param>
|
||||
/// <returns>菜单ID列表</returns>
|
||||
[HttpGet("{id:long}/menus")]
|
||||
public async Task<ApiResponse<List<long>>> GetMenus(long id)
|
||||
{
|
||||
var result = await _departmentService.GetMenuIdsAsync(id);
|
||||
return ApiResponse<List<long>>.Success(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 分配菜单给部门
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -88,8 +88,29 @@ public class AdminUserDto
|
|||
/// </summary>
|
||||
public List<string> RoleNames { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 角色列表(对象数组格式,供前端使用)
|
||||
/// </summary>
|
||||
public List<AdminUserRoleDto> Roles { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 用户专属菜单ID列表
|
||||
/// </summary>
|
||||
public List<long> MenuIds { get; set; } = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 管理员角色 DTO
|
||||
/// </summary>
|
||||
public class AdminUserRoleDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 角色ID
|
||||
/// </summary>
|
||||
public long Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 角色名称
|
||||
/// </summary>
|
||||
public string Name { get; set; } = null!;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,19 +16,9 @@ public class AdminUserQueryRequest
|
|||
public int PageSize { get; set; } = 20;
|
||||
|
||||
/// <summary>
|
||||
/// 用户名(模糊搜索)
|
||||
/// 关键词(模糊搜索用户名、姓名、手机号)
|
||||
/// </summary>
|
||||
public string? Username { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 真实姓名(模糊搜索)
|
||||
/// </summary>
|
||||
public string? RealName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 手机号(模糊搜索)
|
||||
/// </summary>
|
||||
public string? Phone { get; set; }
|
||||
public string? Keyword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门ID
|
||||
|
|
|
|||
|
|
@ -33,22 +33,14 @@ public class AdminUserService : IAdminUserService
|
|||
.ThenInclude(ur => ur.Role)
|
||||
.AsQueryable();
|
||||
|
||||
// 用户名筛选
|
||||
if (!string.IsNullOrWhiteSpace(request.Username))
|
||||
// 关键词模糊搜索(用户名、姓名、手机号)
|
||||
if (!string.IsNullOrWhiteSpace(request.Keyword))
|
||||
{
|
||||
query = query.Where(u => u.Username.Contains(request.Username));
|
||||
}
|
||||
|
||||
// 真实姓名筛选
|
||||
if (!string.IsNullOrWhiteSpace(request.RealName))
|
||||
{
|
||||
query = query.Where(u => u.RealName != null && u.RealName.Contains(request.RealName));
|
||||
}
|
||||
|
||||
// 手机号筛选
|
||||
if (!string.IsNullOrWhiteSpace(request.Phone))
|
||||
{
|
||||
query = query.Where(u => u.Phone != null && u.Phone.Contains(request.Phone));
|
||||
var keyword = request.Keyword;
|
||||
query = query.Where(u =>
|
||||
u.Username.Contains(keyword) ||
|
||||
(u.RealName != null && u.RealName.Contains(keyword)) ||
|
||||
(u.Phone != null && u.Phone.Contains(keyword)));
|
||||
}
|
||||
|
||||
// 部门筛选
|
||||
|
|
@ -86,7 +78,12 @@ public class AdminUserService : IAdminUserService
|
|||
UpdatedAt = u.UpdatedAt,
|
||||
Remark = u.Remark,
|
||||
RoleIds = u.AdminUserRoles.Select(ur => ur.RoleId).ToList(),
|
||||
RoleNames = u.AdminUserRoles.Select(ur => ur.Role.Name).ToList()
|
||||
RoleNames = u.AdminUserRoles.Select(ur => ur.Role.Name).ToList(),
|
||||
Roles = u.AdminUserRoles.Select(ur => new AdminUserRoleDto
|
||||
{
|
||||
Id = ur.RoleId,
|
||||
Name = ur.Role.Name
|
||||
}).ToList()
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
|
|
@ -133,6 +130,11 @@ public class AdminUserService : IAdminUserService
|
|||
Remark = user.Remark,
|
||||
RoleIds = user.AdminUserRoles.Select(ur => ur.RoleId).ToList(),
|
||||
RoleNames = user.AdminUserRoles.Select(ur => ur.Role.Name).ToList(),
|
||||
Roles = user.AdminUserRoles.Select(ur => new AdminUserRoleDto
|
||||
{
|
||||
Id = ur.RoleId,
|
||||
Name = ur.Role.Name
|
||||
}).ToList(),
|
||||
MenuIds = user.AdminUserMenus.Select(um => um.MenuId).ToList()
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,6 +97,7 @@ public class DataSeeder : IDataSeeder
|
|||
new() { Name = "删除管理员", Code = "user:delete", Module = "管理员管理", CreatedAt = DateTime.Now },
|
||||
new() { Name = "分配角色", Code = "user:assign_role", Module = "管理员管理", CreatedAt = DateTime.Now },
|
||||
new() { Name = "分配部门", Code = "user:assign_department", Module = "管理员管理", CreatedAt = DateTime.Now },
|
||||
new() { Name = "分配专属菜单", Code = "user:assign_menu", Module = "管理员管理", CreatedAt = DateTime.Now },
|
||||
new() { Name = "重置密码", Code = "user:reset_password", Module = "管理员管理", CreatedAt = DateTime.Now },
|
||||
|
||||
// 部门管理
|
||||
|
|
|
|||
|
|
@ -189,6 +189,21 @@ public class DepartmentService : IDepartmentService
|
|||
_logger.LogInformation("删除部门成功: {DepartmentId} - {DepartmentName}", id, department.Name);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<List<long>> GetMenuIdsAsync(long departmentId)
|
||||
{
|
||||
var department = await _dbContext.Departments.FindAsync(departmentId);
|
||||
if (department == null)
|
||||
{
|
||||
throw new AdminException(AdminErrorCodes.InvalidParameter, "部门不存在");
|
||||
}
|
||||
|
||||
return await _dbContext.DepartmentMenus
|
||||
.Where(dm => dm.DepartmentId == departmentId)
|
||||
.Select(dm => dm.MenuId)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task AssignMenusAsync(long departmentId, List<long> menuIds)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -41,6 +41,13 @@ public interface IDepartmentService
|
|||
/// <param name="id">部门ID</param>
|
||||
Task DeleteAsync(long id);
|
||||
|
||||
/// <summary>
|
||||
/// 获取部门已分配的菜单ID列表
|
||||
/// </summary>
|
||||
/// <param name="departmentId">部门ID</param>
|
||||
/// <returns>菜单ID列表</returns>
|
||||
Task<List<long>> GetMenuIdsAsync(long departmentId);
|
||||
|
||||
/// <summary>
|
||||
/// 分配菜单给部门
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ export interface AdminUser {
|
|||
departmentId: number | null
|
||||
departmentName: string | null
|
||||
status: number
|
||||
lastLoginAt: string | null
|
||||
lastLoginTime: string | null
|
||||
createdAt: string
|
||||
roles: { id: number; name: string }[]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
<template #default="{ row }">
|
||||
<el-button link type="primary" v-permission="'department:update'" @click="handleEdit(row)">编辑</el-button>
|
||||
<el-button link type="primary" v-permission="'department:create'" @click="handleAddChild(row)">添加子部门</el-button>
|
||||
<el-button link type="primary" v-permission="'department:assign-menu'" @click="handleAssignMenu(row)">分配菜单</el-button>
|
||||
<el-button link type="primary" v-permission="'department:assign_menu'" @click="handleAssignMenu(row)">分配菜单</el-button>
|
||||
<el-button link type="danger" v-permission="'department:delete'" @click="handleDelete(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
</el-card>
|
||||
|
||||
<!-- 新增/编辑对话框 -->
|
||||
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="500px" @close="resetForm">
|
||||
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="500px" @close="resetForm" :destroy-on-close="true">
|
||||
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
|
||||
<el-form-item label="上级部门" prop="parentId">
|
||||
<el-tree-select
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
<el-table-column label="操作" width="280" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button link type="primary" v-permission="'role:update'" @click="handleEdit(row)">编辑</el-button>
|
||||
<el-button link type="primary" v-permission="'role:assign-menu'" @click="handleAssignMenu(row)">分配菜单</el-button>
|
||||
<el-button link type="primary" v-permission="'role:assign-permission'" @click="handleAssignPermission(row)">分配权限</el-button>
|
||||
<el-button link type="primary" v-permission="'role:assign_menu'" @click="handleAssignMenu(row)">分配菜单</el-button>
|
||||
<el-button link type="primary" v-permission="'role:assign_permission'" @click="handleAssignPermission(row)">分配权限</el-button>
|
||||
<el-button link type="danger" v-permission="'role:delete'" @click="handleDelete(row)" :disabled="row.code === 'super_admin'">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
|
|
|||
|
|
@ -64,14 +64,14 @@
|
|||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="lastLoginAt" label="最后登录" width="170" />
|
||||
<el-table-column prop="lastLoginTime" label="最后登录" width="170" />
|
||||
<el-table-column label="操作" width="320" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button link type="primary" v-permission="'user:update'" @click="handleEdit(row)">编辑</el-button>
|
||||
<el-button link type="primary" v-permission="'user:assign-role'" @click="handleAssignRole(row)">分配角色</el-button>
|
||||
<el-button link type="primary" v-permission="'user:assign-department'" @click="handleAssignDepartment(row)">分配部门</el-button>
|
||||
<el-button link type="primary" v-permission="'user:assign-menu'" @click="handleAssignMenu(row)">专属菜单</el-button>
|
||||
<el-button link type="warning" v-permission="'user:reset-password'" @click="handleResetPassword(row)">重置密码</el-button>
|
||||
<el-button link type="primary" v-permission="'user:assign_role'" @click="handleAssignRole(row)">分配角色</el-button>
|
||||
<el-button link type="primary" v-permission="'user:assign_department'" @click="handleAssignDepartment(row)">分配部门</el-button>
|
||||
<el-button link type="primary" v-permission="'user:assign_menu'" @click="handleAssignMenu(row)">专属菜单</el-button>
|
||||
<el-button link type="warning" v-permission="'user:reset_password'" @click="handleResetPassword(row)">重置密码</el-button>
|
||||
<el-button link type="danger" v-permission="'user:delete'" @click="handleDelete(row)" :disabled="row.username === 'admin'">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user