Skip to content

权限管理模块开发文档

迭代编号: sprint-2
模块: 权限管理模块
状态: ✅ 已完成


开发任务

  • [√] 权限资源管理页面
  • [√] 权限资源管理API
  • [√] 权限树组件
  • [√] 权限分配功能
  • [√] 权限自动扫描同步
  • [√] 权限批量操作

技术方案

架构设计

┌─────────────────────────────────────────────────────────────┐
│                      权限管理模块                            │
├─────────────────────────────────────────────────────────────┤
│  前端层                                                       │
│  ├── PermissionList.vue        权限列表页面                  │
│  ├── PermissionForm.vue        权限表单页面                  │
│  ├── PermissionTree.vue        权限树组件                    │
│  └── PermissionBatch.vue       权限批量操作                  │
├─────────────────────────────────────────────────────────────┤
│  API层                                                        │
│  ├── PermissionController      权限管理接口                  │
│  ├── PermissionTreeService     权限树服务                    │
│  └── PermissionScanService     权限扫描服务                  │
├─────────────────────────────────────────────────────────────┤
│  数据层                                                       │
│  ├── sys_permission            权限资源表                    │
│  └── sys_role_permission       角色权限关联表                │
└─────────────────────────────────────────────────────────────┘

数据库设计

权限资源表 (sys_permission)

字段名类型长度必填说明
idbigint20主键ID
parent_idbigint20父权限ID
permission_codevarchar100权限编码
permission_namevarchar100权限名称
permission_typetinyint1类型:1-菜单 2-按钮 3-API
pathvarchar200路由路径/API路径
componentvarchar200前端组件
iconvarchar50图标
sort_orderint11排序
statustinyint1状态:0-禁用 1-启用
descriptionvarchar500描述
create_timedatetime-创建时间
update_timedatetime-更新时间
create_bybigint20创建人
update_bybigint20更新人
deletedtinyint1删除标记

角色权限关联表 (sys_role_permission)

字段名类型长度必填说明
idbigint20主键ID
role_idbigint20角色ID
permission_idbigint20权限ID
create_timedatetime-创建时间

权限树结构

system:permission                   # 系统权限根节点
├── system:user                     # 用户管理
│   ├── system:user:view            # 查看用户
│   ├── system:user:create          # 创建用户
│   ├── system:user:update          # 更新用户
│   └── system:user:delete          # 删除用户
├── system:role                     # 角色管理
│   ├── system:role:view
│   ├── system:role:create
│   ├── system:role:update
│   └── system:role:delete
└── system:permission               # 权限管理
    ├── system:permission:view
    ├── system:permission:create
    ├── system:permission:update
    └── system:permission:delete

权限自动扫描机制

java
@Component
public class PermissionScanService {
    
    @PostConstruct
    public void scanPermissions() {
        // 扫描所有Controller
        Map<String, Object> controllers = applicationContext.getBeansWithAnnotation(RestController.class);
        
        for (Object controller : controllers.values()) {
            Class<?> clazz = controller.getClass();
            RequestMapping baseMapping = clazz.getAnnotation(RequestMapping.class);
            String basePath = baseMapping != null ? baseMapping.value()[0] : "";
            
            // 扫描所有方法
            for (Method method : clazz.getDeclaredMethods()) {
                RequiresPermission annotation = method.getAnnotation(RequiresPermission.class);
                if (annotation != null) {
                    String permissionCode = annotation.value();
                    String permissionName = annotation.name();
                    // 保存或更新权限
                    saveOrUpdatePermission(permissionCode, permissionName, basePath);
                }
            }
        }
    }
}

接口定义

权限管理接口

1. 获取权限列表

yaml
接口: GET /api/v1/sys/permission/list
描述: 分页查询权限列表
参数:
  - pageNum: 页码 (默认1)
  - pageSize: 每页条数 (默认10)
  - permissionName: 权限名称 (模糊查询)
  - permissionType: 权限类型
  - status: 状态
响应:
  code: 200
  data:
    list: 权限列表
    total: 总条数

2. 获取权限树

yaml
接口: GET /api/v1/sys/permission/tree
描述: 获取权限树结构
参数:
  - includeDisabled: 是否包含禁用节点 (默认false)
响应:
  code: 200
  data: 树形结构数据

3. 创建权限

yaml
接口: POST /api/v1/sys/permission
描述: 创建权限资源
请求体:
  parentId: 父权限ID
  permissionCode: 权限编码
  permissionName: 权限名称
  permissionType: 权限类型
  path: 路径
  component: 组件
  icon: 图标
  sortOrder: 排序
  description: 描述
响应:
  code: 200
  data: 创建的权限信息

4. 更新权限

yaml
接口: PUT /api/v1/sys/permission/{id}
描述: 更新权限资源
请求体: 同创建
响应:
  code: 200
  data: 更新后的权限信息

5. 删除权限

yaml
接口: DELETE /api/v1/sys/permission/{id}
描述: 删除权限资源
参数:
  - id: 权限ID
响应:
  code: 200
  message: 删除成功

6. 批量操作权限

yaml
接口: POST /api/v1/sys/permission/batch
描述: 批量操作权限
请求体:
  operation: 操作类型 (enable/disable/delete)
  ids: 权限ID列表
响应:
  code: 200
  message: 操作成功

7. 同步权限

yaml
接口: POST /api/v1/sys/permission/sync
描述: 手动触发权限同步
响应:
  code: 200
  data:
    added: 新增数量
    updated: 更新数量
    deleted: 删除数量

测试用例

功能测试用例

用例编号用例名称前置条件测试步骤预期结果状态
TC-PERM-001创建权限已登录管理员1. 进入权限管理
2. 点击新增
3. 填写信息
4. 保存
权限创建成功[√] 通过
TC-PERM-002编辑权限存在权限数据1. 选择权限
2. 点击编辑
3. 修改信息
4. 保存
权限更新成功[√] 通过
TC-PERM-003删除权限存在权限数据1. 选择权限
2. 点击删除
3. 确认删除
权限删除成功[√] 通过
TC-PERM-004查看权限树已登录1. 进入权限管理
2. 查看树形结构
树形结构正确显示[√] 通过
TC-PERM-005权限搜索存在多条权限1. 输入关键字
2. 点击搜索
搜索结果正确[√] 通过
TC-PERM-006批量启用选中多条禁用权限1. 选择多条权限
2. 点击批量启用
权限状态变为启用[√] 通过
TC-PERM-007批量禁用选中多条启用权限1. 选择多条权限
2. 点击批量禁用
权限状态变为禁用[√] 通过
TC-PERM-008权限同步已登录管理员1. 点击同步按钮
2. 等待同步完成
同步结果正确显示[√] 通过

性能测试用例

用例编号用例名称测试场景预期结果状态
PERF-PERM-001权限树加载1000+权限节点加载时间<500ms[√] 通过
PERF-PERM-002权限列表查询10000+权限数据查询时间<200ms[√] 通过
PERF-PERM-003权限同步扫描100个Controller同步时间<5s[√] 通过

开发记录

日期工作内容完成状态负责人
2026-04-13权限资源表设计[√] 已完成钱七
2026-04-13权限列表页面开发[√] 已完成赵六
2026-04-14权限树查询API开发[√] 已完成钱七
2026-04-14权限表单页面开发[√] 已完成赵六
2026-04-15权限自动扫描功能[√] 已完成钱七
2026-04-15权限树组件开发[√] 已完成赵六
2026-04-16权限批量操作功能[√] 已完成赵六
2026-04-16权限单元测试[√] 已完成孙八
2026-04-17权限集成测试[√] 已完成孙八
2026-04-17权限接口文档编写[√] 已完成钱七
2026-04-17权限前端组件文档[√] 已完成赵六

代码片段

权限校验注解

java
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermission {
    String value();  // 权限编码
    String name() default "";  // 权限名称
    Logical logical() default Logical.AND;  // 逻辑关系
}

public enum Logical {
    AND, OR
}

权限校验拦截器

java
@Component
public class PermissionInterceptor implements HandlerInterceptor {
    
    @Autowired
    private PermissionService permissionService;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            RequiresPermission annotation = handlerMethod.getMethodAnnotation(RequiresPermission.class);
            
            if (annotation != null) {
                String permissionCode = annotation.value();
                Long userId = SecurityUtils.getCurrentUserId();
                
                // 校验权限
                if (!permissionService.hasPermission(userId, permissionCode)) {
                    throw new AccessDeniedException("无权限访问");
                }
            }
        }
        return true;
    }
}

前端权限树组件

vue
<template>
  <el-tree
    ref="permissionTree"
    :data="treeData"
    :props="defaultProps"
    node-key="id"
    show-checkbox
    :default-expand-all="false"
    :expand-on-click-node="false"
    @check-change="handleCheckChange"
  >
    <template #default="{ node, data }">
      <span class="custom-tree-node">
        <el-icon><component :is="data.icon || 'Folder'" /></el-icon>
        <span>{{ data.permissionName }}</span>
        <el-tag size="small" :type="getTypeTag(data.permissionType)">
          {{ getTypeText(data.permissionType) }}
        </el-tag>
      </span>
    </template>
  </el-tree>
</template>

<script setup>
const props = defineProps({
  value: Array
});

const emit = defineEmits(['update:value']);

const treeData = ref([]);
const permissionTree = ref(null);

// 加载权限树
const loadTree = async () => {
  const res = await getPermissionTree();
  treeData.value = res.data;
};

// 获取选中的权限
const getCheckedKeys = () => {
  return permissionTree.value.getCheckedKeys();
};

// 设置选中的权限
const setCheckedKeys = (keys) => {
  permissionTree.value.setCheckedKeys(keys);
};

defineExpose({
  getCheckedKeys,
  setCheckedKeys
});
</script>

问题记录

问题编号问题描述解决方案状态
ISSUE-001权限树大数据量加载慢采用虚拟滚动+懒加载[√] 已解决
ISSUE-002权限编码重复导致冲突增加唯一索引,前端实时校验[√] 已解决
ISSUE-003权限同步时事务超时分批处理,异步同步[√] 已解决

文档创建: 2026-04-13
最后更新: 2026-04-17
负责人: 钱七、赵六

Released under the MIT License.