Files
hzdyjs/出国登记审批权限配置总结.md
T
2025-10-14 16:41:19 +08:00

324 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 出国登记审批权限配置总结
## 📋 配置概览
**菜单名称**: 出国登记审批
**权限标识规范**: 二段式(`模块:操作`)
**按钮数量**: 4个
**最后更新**: 2025-10-08 v1.1
---
## 🔐 完整权限清单
### 1️⃣ 菜单权限(1个)
| 菜单名称 | 权限标识 | 说明 |
|---------|---------|------|
| 出国登记审批 | `rs:registration:list` | 菜单访问权限 |
---
### 2️⃣ 按钮权限(4个)
| 序号 | 按钮名称 | 权限标识 | 说明 |
|-----|---------|---------|------|
| 1 | 查询/查看详情 | `rs:registration:query` | 查询列表、查看详情 |
| 2 | 审批通过 | `rs:registration:approve` | 审批通过操作 |
| 3 | 审批拒绝 | `rs:registration:approve` | 审批拒绝操作(复用approve) |
| 4 | 导出 | `rs:registration:export` | 导出Excel |
**总计**: 1个菜单 + 4个按钮 = **5条sys_menu记录**
---
## 💡 核心设计原则
### ✅ 二段式权限标识
- **格式**: `模块:操作`
- **示例**: `rs:registration:approve`
- **优势**: 简洁明了,易于管理
### ✅ 权限复用策略
**审批通过和拒绝使用同一个权限**:`rs:registration:approve`
**原因**:
1. 业务逻辑统一:有审批权限的人,自然可以通过或拒绝
2. 简化权限管理:不需要为每个操作单独配置
3. 降低配置复杂度
### ✅ 删除批量操作
**已删除**:
- ~~批量审批通过~~
- ~~批量审批拒绝~~
**原因**:
- 简化权限配置
- 保持菜单简洁
- 后续如需批量操作,可在业务层实现
---
## 📊 菜单结构
```
📁 人事管理 / 出国管理
📄 出国登记审批 (rs:registration:list)
🔘 查询 (rs:registration:query)
🔘 审批通过 (rs:registration:approve)
🔘 审批拒绝 (rs:registration:approve)
🔘 导出 (rs:registration:export)
```
---
## 🗂️ 数据库配置
### sys_menu 表记录
| menu_id | menu_name | parent_id | order_num | menu_type | perms | remark |
|---------|-----------|-----------|-----------|-----------|-------|--------|
| 2001 | 出国登记审批 | 父菜单ID | 1 | C | rs:registration:list | 菜单 |
| 2001001 | 出国登记审批查询 | 2001 | 1 | F | rs:registration:query | 查询按钮 |
| 2001002 | 审批通过 | 2001 | 2 | F | rs:registration:approve | 审批通过按钮 |
| 2001003 | 审批拒绝 | 2001 | 3 | F | rs:registration:approve | 审批拒绝按钮 |
| 2001004 | 导出 | 2001 | 4 | F | rs:registration:export | 导出按钮 |
**注意**:menu_id 实际使用雪花ID
---
## 🚀 快速部署指南
### Step 1:查询父菜单ID
```sql
SELECT menu_id, menu_name
FROM sys_menu
WHERE menu_name LIKE '%出国%' OR menu_name LIKE '%人事%';
```
### Step 2:修改SQL脚本
打开 `出国登记审批菜单权限配置-快速版.sql`
修改第14行:
```sql
SET @parent_menu_id = 2000; -- 改为实际的父菜单ID
```
### Step 3:执行SQL脚本
在数据库工具中执行快速版SQL脚本
### Step 4:分配角色权限
1. 登录系统 → 【系统管理】→【角色管理】
2. 编辑需要审批权限的角色(如:人事管理员)
3. 勾选"出国登记审批"菜单及其4个按钮
4. 保存
### Step 5:验证测试
- ✅ 菜单是否显示
- ✅ 按钮是否显示
- ✅ 审批功能是否正常
---
## 🎯 前端权限控制
### Vue组件示例
```vue
<template>
<!-- 查看详情按钮 -->
<el-button
link
type="primary"
icon="View"
@click="handleView(scope.row)"
v-hasPermi="['rs:registration:query']">
</el-button>
<!-- 审批通过按钮 -->
<el-button
type="success"
icon="Check"
@click="handleApprove(scope.row)"
v-hasPermi="['rs:registration:approve']">
审批通过
</el-button>
<!-- 审批拒绝按钮 -->
<el-button
type="danger"
icon="Close"
@click="handleReject(scope.row)"
v-hasPermi="['rs:registration:approve']">
审批拒绝
</el-button>
<!-- 导出按钮 -->
<el-button
icon="Download"
@click="handleExport"
v-hasPermi="['rs:registration:export']">
导出
</el-button>
</template>
```
---
## ⚙️ 后端权限控制
### Controller示例
```java
/**
* 查询出国登记审批列表
*/
@SaCheckPermission("rs:registration:query")
@GetMapping("/list")
public TableDataInfo<RsOverseasRegistrationVo> list(RsOverseasRegistrationBo bo, PageQuery pageQuery) {
return iRsOverseasRegistrationService.queryPageList(bo, pageQuery);
}
/**
* 审批通过
*/
@SaCheckPermission("rs:registration:approve")
@Log(title = "出国登记审批", businessType = BusinessType.UPDATE)
@PutMapping("/approve/{registrationId}")
public R<Void> approve(@PathVariable Long registrationId, @RequestBody Map<String, String> data) {
// 审批通过逻辑
return R.ok();
}
/**
* 审批拒绝
*/
@SaCheckPermission("rs:registration:approve")
@Log(title = "出国登记审批", businessType = BusinessType.UPDATE)
@PutMapping("/reject/{registrationId}")
public R<Void> reject(@PathVariable Long registrationId, @RequestBody Map<String, String> data) {
// 审批拒绝逻辑
return R.ok();
}
/**
* 导出
*/
@SaCheckPermission("rs:registration:export")
@Log(title = "出国登记审批", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(RsOverseasRegistrationBo bo, HttpServletResponse response) {
// 导出逻辑
}
```
---
## 🔍 常见问题排查
### 问题1:菜单不显示
**可能原因**:
- 菜单权限未分配给角色
- 菜单状态为停用或隐藏
**解决方法**:
```sql
-- 检查菜单配置
SELECT menu_id, menu_name, perms, visible, status
FROM sys_menu
WHERE menu_name = '出国登记审批';
-- 检查角色权限
SELECT r.role_name, m.menu_name, m.perms
FROM sys_role r
INNER JOIN sys_role_menu rm ON r.role_id = rm.role_id
INNER JOIN sys_menu m ON rm.menu_id = m.menu_id
WHERE m.menu_name = '出国登记审批';
```
### 问题2:按钮不显示
**可能原因**:
- 按钮权限未分配
- 前端权限标识不匹配
**解决方法**:
1. 检查角色是否勾选了按钮权限
2. 检查 `v-hasPermi` 权限标识是否正确
3. 清除浏览器缓存重新登录
### 问题3:接口403无权限
**可能原因**:
- 后端权限注解不匹配
- Token过期
**解决方法**:
1. 检查 `@SaCheckPermission` 权限标识
2. 重新登录获取新Token
---
## 📚 相关文档
### SQL配置脚本
- ✅ **出国登记审批菜单权限配置-快速版.sql** ⭐ 推荐
- ✅ **出国登记审批菜单权限配置.sql** - 详细版
### 说明文档
- ✅ **出国登记审批权限标识对照表.md** - 详细权限说明
- ✅ **出国登记审批权限配置总结.md** - 本文档
### 前端代码
- `web/src/views/rs/overseas-registration/approval.vue` - 审批页面
- `web/src/api/rs/overseas-registration.ts` - API接口
### 后端代码
- 待开发
---
## ✅ 配置检查清单
### SQL配置
- [ ] 查询父菜单ID
- [ ] 修改SQL脚本中的 `@parent_menu_id`
- [ ] 执行SQL脚本
- [ ] 检查sys_menu表(应有5条记录)
### 角色权限
- [ ] 分配菜单权限给角色
- [ ] 勾选所有按钮权限
- [ ] 保存配置
### 前端验证
- [ ] 菜单是否显示
- [ ] 4个按钮是否都显示
- [ ] 权限标识是否正确
### 后端验证
- [ ] Controller权限注解是否正确
- [ ] 接口是否正常调用
- [ ] 无权限时是否返回403
---
## 📝 版本记录
| 版本 | 日期 | 说明 | 维护人 |
|-----|------|------|--------|
| v1.0 | 2025-10-08 | 创建权限配置,采用二段式权限标识 | AI Assistant |
| v1.1 | 2025-10-08 | 删除批量审批按钮,保留4个基础按钮 | AI Assistant |
---
## 🎯 配置要点
1. ✅ **权限标识统一为二段式**:`rs:registration:操作`
2. ✅ **审批操作复用权限**:通过和拒绝都使用 `approve`
3. ✅ **菜单结构简洁**:1个菜单 + 4个按钮
4. ✅ **前后端权限一致**:确保权限标识完全匹配
5. ✅ **删除批量操作**:简化权限配置
---
**🎉 配置完成后,出国登记审批菜单即可正常使用!**