feat: restrict permission roles

This commit is contained in:
Frudrax Cheng
2026-06-06 13:50:56 +08:00
parent a55f515930
commit 5edb25ac4e
17 changed files with 229 additions and 175 deletions
+25 -21
View File
@@ -46,7 +46,7 @@ backend-go/
├── logger/ # 日志管理
│ └── logger.go # 结构化日志(使用 Zap)
├── middleware/ # 中间件层
│ └── auth.go # JWT 认证、管理员/技术员权限检查
│ └── auth.go # JWT 认证、管理员/工单角色权限检查
├── models/ # 数据模型和 DTO
│ └── models.go # User、Company、EmployeeSerial、ProductTrace、AftersalesOrder、ProjectOrder 等模型定义
├── routes/ # 路由配置
@@ -298,12 +298,12 @@ go run github.com/swaggo/swag/cmd/swag@v1.16.6 init -g main.go
| GET | `/api/project-orders/:serialNumber/query` | 公开查询项目工单 | 否 | 任何 |
| POST | `/api/project-orders/:serialNumber/site-images` | 上传现场图片 | 否 | 任何 |
| POST | `/api/project-orders/:serialNumber/complete` | 工程师提交完成 | 否 | 任何 |
| POST | `/api/project-orders` | 创建项目工单 | 是 | 管理员/技术员 |
| GET | `/api/project-orders` | 项目工单列表 | 是 | 管理员/技术员 |
| GET | `/api/project-orders/:serialNumber` | 项目工单详情 | 是 | 管理员/技术员 |
| PATCH | `/api/project-orders/:serialNumber` | 更新项目工单 | 是 | 管理员/技术员 |
| POST | `/api/project-orders/:serialNumber/qrcode` | 生成项目工单二维码 | 是 | 管理员/技术员 |
| POST | `/api/project-orders/:serialNumber/submit` | 后台提交项目完成 | 是 | 管理员/技术员 |
| POST | `/api/project-orders` | 创建项目工单 | 是 | 管理员 |
| GET | `/api/project-orders` | 项目工单列表 | 是 | 管理员/工单角色 |
| GET | `/api/project-orders/:serialNumber` | 项目工单详情 | 是 | 管理员/工单角色 |
| PATCH | `/api/project-orders/:serialNumber` | 更新项目工单 | 是 | 管理员/工单角色 |
| POST | `/api/project-orders/:serialNumber/qrcode` | 生成项目工单二维码 | 是 | 管理员/工单角色 |
| POST | `/api/project-orders/:serialNumber/submit` | 后台提交项目完成 | 是 | 管理员/工单角色 |
| POST | `/api/project-orders/:serialNumber/reassign` | 工单分配 | 是 | 管理员 |
| POST | `/api/project-orders/:serialNumber/force-close` | 强制完成 | 是 | 管理员 |
| DELETE | `/api/project-orders/:serialNumber` | 删除项目工单 | 是 | 管理员 |
@@ -313,6 +313,7 @@ go run github.com/swaggo/swag/cmd/swag@v1.16.6 init -g main.go
- 工单号格式: `zjbf-xm-YYMMDDNN`
- 现场图片最多 18 张
- 仅需要工程师签名,无客户签字环节
- 软件工程师、硬件工程师、商务经理、项目经理只能处理管理员分配给自己的项目工单
- 完成状态使用 `已完成`
### 售后工单
@@ -321,13 +322,13 @@ go run github.com/swaggo/swag/cmd/swag@v1.16.6 init -g main.go
| ------ | --------------------------------------------- | -------------------------- | -------- | --------------- |
| GET | `/api/aftersales/:serialNumber/query` | 公开查询工单(脱敏) | 否 | 任何 |
| POST | `/api/aftersales/:serialNumber/confirm` | 客户授权/未授权确认 | 否 | 任何 |
| POST | `/api/aftersales` | 创建售后工单 | 是 | 管理员/技术员 |
| GET | `/api/aftersales` | 工单列表(支持筛选) | 是 | 管理员/技术员 |
| GET | `/api/aftersales/:serialNumber` | 工单详情 | 是 | 管理员/技术员 |
| PATCH | `/api/aftersales/:serialNumber` | 更新工单(仅负责人或管理员)| 是 | 管理员/技术员 |
| POST | `/api/aftersales/:serialNumber/qrcode` | 生成工单二维码 | 是 | 管理员/技术员 |
| POST | `/api/aftersales/:serialNumber/submit` | 提交客户确认 | 是 | 管理员/技术员 |
| POST | `/api/aftersales/:serialNumber/reassign` | 工单分配(重新分配技术员 | 是 | 管理员 |
| POST | `/api/aftersales` | 创建售后工单 | 是 | 管理员 |
| GET | `/api/aftersales` | 工单列表(支持筛选) | 是 | 管理员/工单角色 |
| GET | `/api/aftersales/:serialNumber` | 工单详情 | 是 | 管理员/工单角色 |
| PATCH | `/api/aftersales/:serialNumber` | 更新工单(仅负责人或管理员)| 是 | 管理员/工单角色 |
| POST | `/api/aftersales/:serialNumber/qrcode` | 生成工单二维码 | 是 | 管理员/工单角色 |
| POST | `/api/aftersales/:serialNumber/submit` | 提交客户确认 | 是 | 管理员/工单角色 |
| POST | `/api/aftersales/:serialNumber/reassign` | 工单分配(重新分配工单负责人) | 是 | 管理员 |
| POST | `/api/aftersales/:serialNumber/force-close` | 强制关闭工单 | 是 | 管理员 |
| DELETE | `/api/aftersales/:serialNumber` | 删除工单 | 是 | 管理员 |
@@ -336,6 +337,7 @@ go run github.com/swaggo/swag/cmd/swag@v1.16.6 init -g main.go
- 工单号格式: `zjbf-sh-YYMMDDNN`(年份后 2 位 + 月份 2 位 + 日期 2 位 + 当天序号至少 2 位,例:`zjbf-sh-26052801`
- 序号按天重置,软删除工单不释放编号(避免回收造成混淆)
- 工单里的企业名称是售后客户信息,只保存在工单中
- 软件工程师、硬件工程师、商务经理、项目经理只能处理管理员分配给自己的售后工单
- 二维码扫码后客户在网页签名(canvas)后点「已授权」确认;选择「未授权」需填写退回原因
- 签名以 PNG dataURL 形式持久化到工单(`signature` 字段),管理员详情页可查看留底
- 签名校验:必须为 `data:image/png;base64,``data:image/jpeg;base64,` 前缀,解码后 200B500KB
@@ -347,22 +349,24 @@ go run github.com/swaggo/swag/cmd/swag@v1.16.6 init -g main.go
| 方法 | 路径 | 描述 | 需要认证 | 角色 |
| ------ | ----------------------------------- | -------------------------- | -------- | ------------- |
| GET | `/api/users/assignable` | 可分配用户列表(用于售后) | 是 | 管理员/技术员 |
| GET | `/api/users/assignable` | 可分配工单负责人列表 | 是 | 管理员 |
| POST | `/api/employees` | 创建员工并自动生成员工码 | 是 | 管理员 |
| GET | `/api/employees` | 员工列表(分页+筛选) | 是 | 管理员 |
| PATCH | `/api/employees/:id` | 更新员工姓名/电话/工号/岗位/角色 | 是 | 管理员 |
| POST | `/api/employees/:id/reset-password` | 重置后台账号密码 | 是 | 管理员 |
| DELETE | `/api/employees/:id` | 删除员工 | 是 | 管理员 |
**员工角色**:
- `admin`:管理员,拥有全部后台权限,包括权限管理、产品溯源、工单分配、强制关闭和删除工单
- `technician`:技术员,仅拥有工单模块权限,可创建/处理工单,可使用 `assignable` 查询可分配同事
- `employee`:员工,无后台登录权限,不需要密码,仅用于员工主档和员工码查询
**角色规则**:
- `admin`系统管理员,拥有全部后台权限,包括权限管理、产品溯源、创建工单、工单分配、强制关闭和删除工单
- 权限管理只能创建/编辑四个对等工单角色:`software_engineer`(软件工程师)、`hardware_engineer`(硬件工程师)、`business_manager`(商务经理)、`project_manager`(项目经理)
- 四个工单角色只能登录后台处理管理员分配给自己的项目工单和售后工单,不能访问控制台、权限管理、产品溯源等其他模块
- `technician` 是旧数据兼容角色,不再作为新建选项
- `employee` 是旧普通员工角色,无后台登录权限,不再作为新建选项
**保护规则**:
- 不能删除自己;不能将自己的 admin 角色降级;不能删除最后一个 admin
- 创建 `admin` / `technician` 必须设置初始密码,密码 bcrypt 加密存储
- 创建 `employee` 不要求密码,且不能登录后台
- 创建四个工单角色必须设置初始密码,密码 bcrypt 加密存储
- 不允许通过权限管理创建 `admin``employee`
## 测试