feat(permission): 添加菜单数据权限功能

- 新增菜单数据规则表和角色菜单数据规则关联表
- 实现菜单数据权限切面和处理器
- 添加数据规则条件和变量枚举
- 实现变量替换工具类和规则构建逻辑
- 在权限分配中集成菜单数据规则关联功能
- 优化部门ID解析逻辑,支持从用户信息中获取默认部门
- 添加菜单组件查询方法和公司访问上下文拦截器改进
This commit is contained in:
wuzongyong
2026-01-28 09:13:23 +08:00
parent b3e4055b55
commit 6c94476a8d
37 changed files with 2288 additions and 1 deletions

View File

@@ -11,6 +11,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;
/**
* @author chenbowen
*/
@@ -45,13 +47,31 @@ public class CompanyVisitContextInterceptor implements HandlerInterceptor {
}
Long deptId = WebFrameworkUtils.getDeptId(request);
// 部门信息同样遵循请求头 -> 请求属性 -> 登录缓存的回退顺序
// 部门信息同样遵循"请求头 -> 请求属性 -> 登录缓存"的回退顺序
if (deptId == null || deptId <= 0L) {
Long attrDeptId = resolveLong(request.getAttribute(WebFrameworkUtils.HEADER_VISIT_DEPT_ID));
if (attrDeptId != null && attrDeptId > 0L) {
deptId = attrDeptId;
} else if (loginUser != null && loginUser.getVisitDeptId() != null && loginUser.getVisitDeptId() > 0L) {
deptId = loginUser.getVisitDeptId();
} else if (loginUser != null) {
// 如果以上都没有尝试从用户info中获取第一个部门作为默认值
Map<String, String> info = loginUser.getInfo();
if (info != null) {
String deptIdsStr = info.get(LoginUser.INFO_KEY_DEPT_IDS);
if (deptIdsStr != null && !deptIdsStr.isEmpty() && !"[]".equals(deptIdsStr)) {
try {
// 解析JSON数组取第一个部门ID
deptIdsStr = deptIdsStr.trim();
if (deptIdsStr.startsWith("[") && deptIdsStr.length() > 2) {
String firstId = deptIdsStr.substring(1, deptIdsStr.indexOf(']')).split(",")[0].trim();
deptId = Long.parseLong(firstId);
}
} catch (Exception e) {
log.warn("[CompanyVisitContextInterceptor][解析用户默认部门失败: {}]", deptIdsStr, e);
}
}
}
}
}