diff --git a/src/main/java/com/jsl/oa/annotations/NeedRoleGroup.java b/src/main/java/com/jsl/oa/annotations/NeedPermission.java similarity index 92% rename from src/main/java/com/jsl/oa/annotations/NeedRoleGroup.java rename to src/main/java/com/jsl/oa/annotations/NeedPermission.java index 2f4c7c2..b4966f8 100644 --- a/src/main/java/com/jsl/oa/annotations/NeedRoleGroup.java +++ b/src/main/java/com/jsl/oa/annotations/NeedPermission.java @@ -14,7 +14,7 @@ import java.lang.annotation.*; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface NeedRoleGroup { +public @interface NeedPermission { /** *

权限名称

*
diff --git a/src/main/java/com/jsl/oa/aspect/CheckUserAbleToUseAspect.java b/src/main/java/com/jsl/oa/aspect/CheckUserAbleToUseAspect.java index 08e4989..4447410 100644 --- a/src/main/java/com/jsl/oa/aspect/CheckUserAbleToUseAspect.java +++ b/src/main/java/com/jsl/oa/aspect/CheckUserAbleToUseAspect.java @@ -31,7 +31,7 @@ public class CheckUserAbleToUseAspect { private final UserDAO userDAO; - @Around("@annotation(com.jsl.oa.annotations.NeedRoleGroup)") + @Around("@annotation(com.jsl.oa.annotations.NeedPermission)") public Object checkUse(ProceedingJoinPoint pjp) throws Throwable { // 从ServletRequest中获取用户信息 ServletRequestAttributes servletRequestAttributes = diff --git a/src/main/java/com/jsl/oa/aspect/CheckUserPermissionAspect.java b/src/main/java/com/jsl/oa/aspect/CheckUserPermissionAspect.java index c0daa7b..8c60eff 100644 --- a/src/main/java/com/jsl/oa/aspect/CheckUserPermissionAspect.java +++ b/src/main/java/com/jsl/oa/aspect/CheckUserPermissionAspect.java @@ -1,6 +1,8 @@ package com.jsl.oa.aspect; -import com.jsl.oa.annotations.NeedRoleGroup; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.exception.library.NotLoginException; import com.jsl.oa.exception.library.PermissionDeniedException; @@ -16,14 +18,16 @@ import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import java.util.List; + /** * 检查用户权限切面 *
* 检查访问的用户是否包含正确的访问权限,若用户有正确的访问权限则允许访问,若没有指定的权限将会返回错误的权限信息。 * - * @since v1.2.0 - * @version v1.2.0 * @author xiao_lfeng + * @version v1.2.0 + * @since v1.2.0 */ @Slf4j @Aspect @@ -32,6 +36,7 @@ import org.springframework.web.context.request.ServletRequestAttributes; public class CheckUserPermissionAspect { private final RoleDAO roleDAO; + private final Gson gson; /** * 检查权限 @@ -41,7 +46,7 @@ public class CheckUserPermissionAspect { * @param pjp {@link ProceedingJoinPoint} * @return {@link Object} */ - @Around("@annotation(com.jsl.oa.annotations.NeedRoleGroup)") + @Around("@annotation(com.jsl.oa.annotations.NeedPermission)") public Object checkPermission(ProceedingJoinPoint pjp) throws Throwable { // 从ServletRequest中获取用户信息 ServletRequestAttributes servletRequestAttributes = @@ -55,20 +60,23 @@ public class CheckUserPermissionAspect { } // 获取方法签名 MethodSignature signature = (MethodSignature) pjp.getSignature(); - NeedRoleGroup checkAccountPermission = signature.getMethod().getAnnotation(NeedRoleGroup.class); + NeedPermission checkAccountPermission = signature.getMethod().getAnnotation(NeedPermission.class); String getRoleAtAnnotation = checkAccountPermission.value(); // 获取用户所在权限组 RoleDO getUserRole = roleDAO.getRoleNameByUid(getUserId); if (getUserRole != null) { - if (getUserRole.getRoleName().equals(getRoleAtAnnotation)) { - return pjp.proceed(); - } else { - throw new PermissionDeniedException("用户组不匹配", getRoleAtAnnotation); + List permissions = gson.fromJson(getUserRole.getPermissions(), new TypeToken>() { + }.getType()); + if (permissions != null) { + for (String it : permissions) { + if (it.equals(getRoleAtAnnotation)) { + return pjp.proceed(); + } + } } - } else { - throw new PermissionDeniedException("用户组不匹配", getRoleAtAnnotation); } + throw new PermissionDeniedException("权限不匹配", getRoleAtAnnotation); } else { throw new RuntimeException("无法获取信息"); } diff --git a/src/main/java/com/jsl/oa/config/startup/StartupConfiguration.java b/src/main/java/com/jsl/oa/config/startup/StartupConfiguration.java index 04ab84b..08aaaeb 100644 --- a/src/main/java/com/jsl/oa/config/startup/StartupConfiguration.java +++ b/src/main/java/com/jsl/oa/config/startup/StartupConfiguration.java @@ -73,7 +73,6 @@ public class StartupConfiguration { prepareData.checkDatabase("oa_message"); prepareData.checkDatabase("oa_news_user"); prepareData.checkDatabase("oa_project_daily"); - prepareData.checkDatabase("oa_role_permissions"); prepareData.checkDatabase("oa_role_user"); prepareData.checkDatabase("oa_user_tags"); }; diff --git a/src/main/java/com/jsl/oa/controllers/PermissionController.java b/src/main/java/com/jsl/oa/controllers/PermissionController.java index 00a49c4..1a4de33 100755 --- a/src/main/java/com/jsl/oa/controllers/PermissionController.java +++ b/src/main/java/com/jsl/oa/controllers/PermissionController.java @@ -1,16 +1,14 @@ package com.jsl.oa.controllers; -import com.jsl.oa.model.vodata.PermissionEditVO; import com.jsl.oa.services.PermissionService; import com.jsl.oa.utils.BaseResponse; import com.jsl.oa.utils.ErrorCode; -import com.jsl.oa.utils.Processing; import com.jsl.oa.utils.ResultUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.BindingResult; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @@ -30,24 +28,6 @@ public class PermissionController { */ private final PermissionService permissionService; - /** - * 添加新的权限。 - * - * @param request HTTP请求对象。 - * @param rid 角色ID。 - * @param pid 权限ID。 - * @return {@link BaseResponse} 对象,包含操作结果。 - */ - @PostMapping("/permission/add") - public BaseResponse permissionAdd(HttpServletRequest request, @RequestParam Long rid, @RequestParam Long pid) { - // 判断是否有参数错误 - if (rid == null || pid == null) { - return ResultUtil.error(ErrorCode.PARAMETER_ERROR); - } else { - return permissionService.permissionAdd(request, rid, pid); - } - } - /** * 获取当前用户的权限信息。 * @@ -75,42 +55,4 @@ public class PermissionController { public BaseResponse permissionGet(HttpServletRequest request) { return permissionService.permissionGet(request); } - - /** - * 编辑权限信息。 - * - * @param permissionEditVo {@link PermissionEditVO} 对象,包含更新后的权限信息。 - * @param bindingResult Binding结果对象,包含任何验证错误。 - * @param request HTTP请求对象。 - * @return {@link BaseResponse} 对象,包含操作结果。 - */ - @PutMapping("/permission/edit") - public BaseResponse permissionEdit( - @RequestBody @Validated PermissionEditVO permissionEditVo, - BindingResult bindingResult, - HttpServletRequest request - ) { - // 判断是否有参数错误 - if (bindingResult.hasErrors()) { - return ResultUtil.error(ErrorCode.REQUEST_BODY_ERROR, Processing.getValidatedErrorList(bindingResult)); - } - return permissionService.permissionEdit(permissionEditVo, request); - } - - /** - * 删除权限。 - * - * @param pid 权限ID。 - * @param request HTTP请求对象。 - * @return {@link BaseResponse} 对象,包含操作结果。 - */ - @DeleteMapping("/permission/delete") - public BaseResponse permissionDelete(@RequestParam Long pid, HttpServletRequest request) { - // 判断是否有参数错误 - if (pid == null) { - return ResultUtil.error(ErrorCode.PARAMETER_ERROR); - } else { - return permissionService.permissionDelete(request, pid); - } - } } diff --git a/src/main/java/com/jsl/oa/dao/PermissionDAO.java b/src/main/java/com/jsl/oa/dao/PermissionDAO.java index d6255f8..e03b62a 100644 --- a/src/main/java/com/jsl/oa/dao/PermissionDAO.java +++ b/src/main/java/com/jsl/oa/dao/PermissionDAO.java @@ -4,7 +4,9 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.jsl.oa.common.constant.BusinessConstants; import com.jsl.oa.mapper.PermissionMapper; +import com.jsl.oa.mapper.RoleMapper; import com.jsl.oa.model.dodata.PermissionDO; +import com.jsl.oa.model.dodata.RoleDO; import com.jsl.oa.utils.redis.RoleRedisUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -30,6 +32,7 @@ public class PermissionDAO { private final PermissionMapper permissionMapper; private final RoleRedisUtil roleRedisUtil; private final Gson gson; + private final RoleMapper roleMapper; /** *

获取用户权限信息

@@ -40,12 +43,13 @@ public class PermissionDAO { * @return {@link List} */ public List getPermission(@NotNull Long uid) { + // 查询用户所在角色组 + RoleDO getRole = roleMapper.getRoleByUserId(uid); List getPermissionForString; String permissionRedisString = roleRedisUtil.getData(BusinessConstants.NONE, uid.toString()); if (permissionRedisString == null) { - List permissionList = permissionMapper.permissionUserPid(uid); - getPermissionForString = new ArrayList<>(); - forPermissionToBuildString(permissionList, getPermissionForString); + String permissionList = permissionMapper.getPermissionByRole(getRole.getRoleName()); + getPermissionForString = gson.fromJson(permissionList, new TypeToken>() { }.getType()); // 存入 Redis roleRedisUtil.setData(BusinessConstants.NONE, uid.toString(), gson.toJson(getPermissionForString), 1440); } else { @@ -55,127 +59,25 @@ public class PermissionDAO { } public List getAllPermissionBuildString() { - List getPermissionForString; + List getPermission; String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "string"); if (getRedisData == null) { + getPermission = new ArrayList<>(); List permissionList = permissionMapper.getAllPermission(); - permissionList.removeIf(it -> it.getPid() != null); - getPermissionForString = new ArrayList<>(); - forPermissionToBuildString(permissionList, getPermissionForString); + permissionList.forEach(it -> getPermission.add(it.getName())); // 存入 Redis roleRedisUtil.setData( BusinessConstants.ALL_PERMISSION, "string", - gson.toJson(getPermissionForString), + gson.toJson(permissionList), 1440); } else { - getPermissionForString = gson.fromJson(getRedisData, new TypeToken>() { }.getType()); + getPermission = gson.fromJson(getRedisData, new TypeToken>() { }.getType()); } - return getPermissionForString; + return getPermission; } - public List getRootPermission() { - String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "all"); - if (getRedisData == null) { - List permissionList = permissionMapper.getAllPermission(); - if (!permissionList.isEmpty()) { - List getPermissionList = new ArrayList<>(); - for (PermissionDO permission : permissionList) { - if (permission.getPid() == null) { - getPermissionList.add(permission); - } - } - roleRedisUtil.setData(BusinessConstants.ALL_PERMISSION, "all", gson.toJson(getPermissionList), 1440); - return getPermissionList; - } else { - return null; - } - } else { - return gson.fromJson(getRedisData, new TypeToken>() { - }.getType()); - } - } - - /** - *

获取全部权限信息

- *
- * 获取全部权限信息 - * - * @param permissionList 权限信息 - * @param getPermissionForString 存储权限信息 - */ - private void forPermissionToBuildString( - @NotNull List permissionList, - List getPermissionForString) { - for (PermissionDO permission : permissionList) { - // 寻找是否存在父亲 - StringBuilder permissionString = new StringBuilder(); - if (permission.getPid() != null) { - // 存在父亲 - this.getFatherPermission(permissionString, permission.getPid()); - } else { - // 不存在父亲 - permissionString.append(permission.getName()); - } - // 寻找子类 - this.getChildPermission(permissionString, permission.getId(), getPermissionForString); - getPermissionForString.add(permissionString.toString()); - } - } - - /** - *

获取子类权限信息

- *
- * 通过父类 ID 获取子类权限信息
- * 递归调用 - * - * @param permissionString 父类权限信息 - * @param id 父类 ID - * @param getPermissionForString 存储权限信息 - */ - private void getChildPermission(StringBuilder permissionString, Long id, List getPermissionForString) { - // 获取子类权限信息 - List permissionList = permissionMapper.getChildPermission(id); - // 判断是否存在子类 - if (!permissionList.isEmpty()) { - // 存在子类 - for (PermissionDO permission : permissionList) { - StringBuilder childPermissionString = new StringBuilder(permissionString); - // 遍历数据检查是否依旧存在子类 - List childPermissionList = permissionMapper.getChildPermission(permission.getId()); - if (!childPermissionList.isEmpty()) { - // 存在子类 - permissionString.append(".").append(permission.getName()); - this.getChildPermission(permissionString, permission.getId(), getPermissionForString); - } else { - // 不存在子类 - permissionString.append(".").append(permission.getName()); - getPermissionForString.add(permissionString.toString()); - } - permissionString = childPermissionString; - } - } - } - - /** - *

获取父类权限信息

- *
- * 通过子类 ID 获取父类权限信息
- * 递归调用 - * - * @param permissionString 父类权限信息 - * @param pid 父类 ID - */ - public void getFatherPermission(StringBuilder permissionString, Long pid) { - // 获取权限信息 - PermissionDO permissionDO = permissionMapper.getPermissionById(pid); - // 判断是否存在父亲 - if (permissionDO.getPid() != null) { - // 存在父亲 - this.getFatherPermission(permissionString, permissionDO.getPid()); - } else { - // 不存在父亲 - permissionString.append(permissionDO.getCode()); - } + public List getAllPermission() { + return permissionMapper.getAllPermission(); } } diff --git a/src/main/java/com/jsl/oa/dao/RoleDAO.java b/src/main/java/com/jsl/oa/dao/RoleDAO.java index b1d571d..c237bee 100644 --- a/src/main/java/com/jsl/oa/dao/RoleDAO.java +++ b/src/main/java/com/jsl/oa/dao/RoleDAO.java @@ -134,4 +134,8 @@ public class RoleDAO { public RoleDO getRoleByRoleName(String roleName) { return roleMapper.getRoleByRoleName(roleName); } + + public RoleDO getRoleByUserId(Long uid) { + return roleMapper.getRoleByUserId(uid); + } } diff --git a/src/main/java/com/jsl/oa/dao/UserDAO.java b/src/main/java/com/jsl/oa/dao/UserDAO.java index 17161ff..a686cc7 100755 --- a/src/main/java/com/jsl/oa/dao/UserDAO.java +++ b/src/main/java/com/jsl/oa/dao/UserDAO.java @@ -123,7 +123,7 @@ public class UserDAO { userCurrentBackVO.setUsers(new ArrayList<>()) .setCount(userMapper.getUsersCount()); userCurrentDO.forEach(it -> userCurrentBackVO.getUsers() - .add(Processing.returnUserInfo(it, roleDAO, permissionDAO))); + .add(Processing.returnUserInfo(it, roleDAO, gson))); return userCurrentBackVO; } @@ -134,7 +134,7 @@ public class UserDAO { userCurrentBackVO.setUsers(new ArrayList<>()) .setCount(userMapper.getUsersCount()); userCurrentDO.forEach(it -> userCurrentBackVO.getUsers() - .add(Processing.returnUserInfo(it, roleDAO, permissionDAO))); + .add(Processing.returnUserInfo(it, roleDAO, gson))); return userCurrentBackVO; } diff --git a/src/main/java/com/jsl/oa/exception/ProcessException.java b/src/main/java/com/jsl/oa/exception/ProcessException.java index b67dcd0..8fc0aee 100755 --- a/src/main/java/com/jsl/oa/exception/ProcessException.java +++ b/src/main/java/com/jsl/oa/exception/ProcessException.java @@ -1,5 +1,6 @@ package com.jsl.oa.exception; +import com.jsl.oa.exception.library.PermissionDeniedException; import com.jsl.oa.utils.BaseResponse; import com.jsl.oa.utils.ErrorCode; import com.jsl.oa.utils.ResultUtil; @@ -103,4 +104,10 @@ public class ProcessException { log.error(e.getMessage(), e); return ResultUtil.error("ServerInternalError", 50002, "服务器内部错误"); } + + @ExceptionHandler(value = PermissionDeniedException.class) + public BaseResponse businessPermissionDeniedException(PermissionDeniedException e) { + log.warn("[EXCEPTION] 无权限操作,需要权限: {}", e.getNeedPermission()); + return ResultUtil.error("需要权限: " + e.getNeedPermission(), ErrorCode.PERMISSION_NOT_EXIST); + } } diff --git a/src/main/java/com/jsl/oa/exception/library/PermissionDeniedException.java b/src/main/java/com/jsl/oa/exception/library/PermissionDeniedException.java index a76cb73..a049c86 100644 --- a/src/main/java/com/jsl/oa/exception/library/PermissionDeniedException.java +++ b/src/main/java/com/jsl/oa/exception/library/PermissionDeniedException.java @@ -13,10 +13,10 @@ import lombok.Getter; */ @Getter public class PermissionDeniedException extends RuntimeException { - private final String needGroup; + private final String needPermission; - public PermissionDeniedException(String message, String needGroup) { + public PermissionDeniedException(String message, String needPermission) { super(message); - this.needGroup = needGroup; + this.needPermission = needPermission; } } diff --git a/src/main/java/com/jsl/oa/mapper/PermissionMapper.java b/src/main/java/com/jsl/oa/mapper/PermissionMapper.java index 78027d1..0587844 100644 --- a/src/main/java/com/jsl/oa/mapper/PermissionMapper.java +++ b/src/main/java/com/jsl/oa/mapper/PermissionMapper.java @@ -1,44 +1,17 @@ package com.jsl.oa.mapper; import com.jsl.oa.model.dodata.PermissionDO; -import com.jsl.oa.model.dodata.RolePermissionDO; -import org.apache.ibatis.annotations.*; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; import java.util.List; @Mapper public interface PermissionMapper { - @Insert("INSERT INTO organize_oa.oa_role_permissions(rid, pid) VALUE (#{rid},#{pid})") - void permissionAdd(Long rid, Long pid); - - @Select("SELECT * FROM organize_oa.oa_permissions WHERE id IN " - + "(SELECT pid FROM organize_oa.oa_role_permissions WHERE rid IN " - + "(SELECT rid FROM organize_oa.oa_role_user WHERE uid = #{uid}))") - List permissionUserPid(Long uid); - - @Select("SELECT * FROM organize_oa.oa_permissions where id=#{id}") - PermissionDO getPermissionById(Long id); - - @Select("SELECT * FROM organize_oa.oa_role_permissions where pid=#{pid}") - RolePermissionDO rolePermissionGetByPid(Long pid); - @Select("SELECT * FROM organize_oa.oa_permissions") List getAllPermission(); - @Update("UPDATE organize_oa.oa_permissions SET pid = #{pid}, name = #{name}, code = #{code}, " - + "type = #{type} WHERE id = #{id}") - boolean updatePermission(PermissionDO permissionDO); - - @Delete("DELETE FROM organize_oa.oa_permissions where id=#{pid}") - boolean deletePermission(Long pid); - - @Select("SELECT * FROM organize_oa.oa_permissions WHERE id IN (#{permissionList})") - List permissionGet(String permissionList); - - @Select("SELECT * FROM organize_oa.oa_permissions WHERE id = #{pid}") - PermissionDO getPermissionByPid(Long pid); - - @Select("SELECT * FROM organize_oa.oa_permissions WHERE pid = #{id}") - List getChildPermission(Long id); + @Select("SELECT permissions FROM organize_oa.oa_role WHERE role_name = #{roleName}") + String getPermissionByRole(String roleName); } diff --git a/src/main/java/com/jsl/oa/mapper/RoleMapper.java b/src/main/java/com/jsl/oa/mapper/RoleMapper.java index 0cf0b78..5bee028 100644 --- a/src/main/java/com/jsl/oa/mapper/RoleMapper.java +++ b/src/main/java/com/jsl/oa/mapper/RoleMapper.java @@ -40,8 +40,6 @@ public interface RoleMapper { @Delete("DELETE FROM organize_oa.oa_role WHERE id=#{id}") boolean roleDelete(Long id); - - - - + @Select("SELECT * FROM organize_oa.oa_role WHERE id = (SELECT rid FROM organize_oa.oa_role_user WHERE uid=#{uid})") + RoleDO getRoleByUserId(Long uid); } diff --git a/src/main/java/com/jsl/oa/model/dodata/PermissionDO.java b/src/main/java/com/jsl/oa/model/dodata/PermissionDO.java index 433dd35..f2d119f 100755 --- a/src/main/java/com/jsl/oa/model/dodata/PermissionDO.java +++ b/src/main/java/com/jsl/oa/model/dodata/PermissionDO.java @@ -19,10 +19,12 @@ import java.sql.Timestamp; @Accessors(chain = true) @JsonInclude(JsonInclude.Include.NON_NULL) public class PermissionDO { + // 主键 private Long id; - private Long pid; + // 权限名称 private String name; - private String code; - private Short type; - private Timestamp deletedAt; + // 权限描述 + private String description; + // 创建时间 + private Timestamp createdAt; } diff --git a/src/main/java/com/jsl/oa/model/dodata/RoleDO.java b/src/main/java/com/jsl/oa/model/dodata/RoleDO.java index 0d752d9..fc4a67f 100755 --- a/src/main/java/com/jsl/oa/model/dodata/RoleDO.java +++ b/src/main/java/com/jsl/oa/model/dodata/RoleDO.java @@ -12,14 +12,21 @@ import java.sql.Timestamp; * * @author 筱锋xiao_lfeng * @since v1.1.0 - * @version v1.1.0 + * @version v1.2.0 */ @Data @Accessors(chain = true) public class RoleDO { + // 角色id private Long id; + // 角色名称 private String roleName; + // 中文描述 private String displayName; + // 用户组权限 + private String permissions; + // 创建时间 private Timestamp createdAt; + // 修改时间 private Timestamp updatedAt; } diff --git a/src/main/java/com/jsl/oa/model/dodata/RolePermissionDO.java b/src/main/java/com/jsl/oa/model/dodata/RolePermissionDO.java deleted file mode 100755 index f3376fb..0000000 --- a/src/main/java/com/jsl/oa/model/dodata/RolePermissionDO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.jsl.oa.model.dodata; - -import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.sql.Timestamp; - -/** - *

role 数据表

- *
- * 映射 oa_role 数据表内容进入自定义实体类 - * - * @author 筱锋xiao_lfeng - * @since v1.1.0 - * @version v1.1.0 - */ -@Data -@Accessors(chain = true) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class RolePermissionDO { - private Long rid; - private Long pid; - private Timestamp createdAt; -} diff --git a/src/main/java/com/jsl/oa/model/vodata/PermissionContentVO.java b/src/main/java/com/jsl/oa/model/vodata/PermissionContentVO.java new file mode 100644 index 0000000..5b5bddd --- /dev/null +++ b/src/main/java/com/jsl/oa/model/vodata/PermissionContentVO.java @@ -0,0 +1,14 @@ +package com.jsl.oa.model.vodata; + +import lombok.Data; + +@Data +public class PermissionContentVO { + // 主键 + private Long id; + // 权限名称 + private String name; + // 权限描述 + private String description; +} + diff --git a/src/main/java/com/jsl/oa/model/vodata/PermissionContentVo.java b/src/main/java/com/jsl/oa/model/vodata/PermissionContentVo.java deleted file mode 100644 index e48833d..0000000 --- a/src/main/java/com/jsl/oa/model/vodata/PermissionContentVo.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.jsl.oa.model.vodata; - -import lombok.Data; - -import java.util.List; - -@Data -public class PermissionContentVo { - - private Long id; - private String name; - private String code; - private Short type; - private List children; - -} - - diff --git a/src/main/java/com/jsl/oa/services/PermissionService.java b/src/main/java/com/jsl/oa/services/PermissionService.java index f81e127..e201dd2 100644 --- a/src/main/java/com/jsl/oa/services/PermissionService.java +++ b/src/main/java/com/jsl/oa/services/PermissionService.java @@ -1,19 +1,12 @@ package com.jsl.oa.services; -import com.jsl.oa.model.vodata.PermissionEditVO; import com.jsl.oa.utils.BaseResponse; import javax.servlet.http.HttpServletRequest; public interface PermissionService { - BaseResponse permissionAdd(HttpServletRequest request, Long rid, Long pid); - BaseResponse permissionUser(HttpServletRequest request, Long uid); BaseResponse permissionGet(HttpServletRequest request); - - BaseResponse permissionEdit(PermissionEditVO permissionEditVo, HttpServletRequest request); - - BaseResponse permissionDelete(HttpServletRequest request, Long pid); } diff --git a/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java index 0abcde9..6ee51ba 100644 --- a/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java @@ -1,6 +1,6 @@ package com.jsl.oa.services.impl; -import com.jsl.oa.annotations.NeedRoleGroup; +import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.dao.InfoDAO; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; @@ -41,7 +41,7 @@ public class InfoServiceImpl implements InfoService { private final RoleDAO roleDAO; @Override - @NeedRoleGroup("info.image.add") + @NeedPermission("info.image.add") public BaseResponse addHeaderImage(HttpServletRequest request, @NotNull CarouselVO carouselVO) { // 获取用户 Long userId = Processing.getAuthHeaderToUserId(request); @@ -74,7 +74,7 @@ public class InfoServiceImpl implements InfoService { } @Override - @NeedRoleGroup("info.image.edit") + @NeedPermission("info.image.edit") public BaseResponse editHeaderImage(HttpServletRequest request, @NotNull CarouselVO carouselVO) { // 获取用户 Long userId = Processing.getAuthHeaderToUserId(request); @@ -124,7 +124,7 @@ public class InfoServiceImpl implements InfoService { } @Override - @NeedRoleGroup("info.image.del") + @NeedPermission("info.image.del") public BaseResponse delHeaderImage(HttpServletRequest request, Integer id) { // 用户权限校验 if (!Processing.checkUserIsConsole(request, roleDAO)) { @@ -146,7 +146,7 @@ public class InfoServiceImpl implements InfoService { } @Override - @NeedRoleGroup("info.image.setting.edit") + @NeedPermission("info.image.setting.edit") public BaseResponse editSettingHeaderImage(HttpServletRequest request, Boolean showType) { // 用户权限校验 if (!Processing.checkUserIsConsole(request, roleDAO)) { diff --git a/src/main/java/com/jsl/oa/services/impl/NewsServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/NewsServiceImpl.java index 0b6f5a1..3de24b1 100644 --- a/src/main/java/com/jsl/oa/services/impl/NewsServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/NewsServiceImpl.java @@ -1,7 +1,7 @@ package com.jsl.oa.services.impl; -import com.jsl.oa.annotations.NeedRoleGroup; +import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.dao.NewsDAO; import com.jsl.oa.model.dodata.NewsDO; import com.jsl.oa.model.vodata.NewsAddVO; @@ -35,7 +35,7 @@ public class NewsServiceImpl implements NewsService { private final NewsDAO newsDAO; @Override - @NeedRoleGroup("news.add") + @NeedPermission("news.add") public BaseResponse newsAdd(NewsAddVO newsAddVO, @NotNull HttpServletRequest request) { // 拷贝新闻数据到实体类 NewsDO newsDO = new NewsDO(); diff --git a/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java index b61d553..7213797 100644 --- a/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java @@ -1,24 +1,22 @@ package com.jsl.oa.services.impl; -import com.jsl.oa.annotations.NeedRoleGroup; import com.jsl.oa.dao.PermissionDAO; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; -import com.jsl.oa.mapper.PermissionMapper; import com.jsl.oa.model.dodata.PermissionDO; import com.jsl.oa.model.dodata.RoleUserDO; -import com.jsl.oa.model.vodata.PermissionContentVo; -import com.jsl.oa.model.vodata.PermissionEditVO; +import com.jsl.oa.model.vodata.PermissionContentVO; import com.jsl.oa.services.PermissionService; import com.jsl.oa.utils.BaseResponse; import com.jsl.oa.utils.ErrorCode; -import com.jsl.oa.utils.Processing; import com.jsl.oa.utils.ResultUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; import java.util.List; /** @@ -26,29 +24,20 @@ import java.util.List; *
* 用于权限服务层的实现类,实现权限的增删改查,以及用户权限的获取 * - * @since v1.0.0 - * @version v1.1.0 * @author xiao_lfeng | xiangZr-hhh | 176yunxuan + * @version v1.1.0 + * @since v1.0.0 */ @Slf4j @Service @RequiredArgsConstructor public class PermissionServiceImpl implements PermissionService { - private final PermissionMapper permissionMapper; private final RoleDAO roleDAO; private final PermissionDAO permissionDAO; private final UserDAO userDAO; @Override - @NeedRoleGroup("permission.add") - public BaseResponse permissionAdd(HttpServletRequest request, Long rid, Long pid) { - permissionMapper.permissionAdd(rid, pid); - return ResultUtil.success(); - } - - @Override - @NeedRoleGroup("permission.user") public BaseResponse permissionUser(HttpServletRequest request, Long uid) { if (userDAO.isExistUser(uid)) { // 此用户是否为管理员 @@ -68,40 +57,11 @@ public class PermissionServiceImpl implements PermissionService { @Override - @NeedRoleGroup("permission.get") public BaseResponse permissionGet(HttpServletRequest request) { //获取所有权限数据 - List permissionDOList = permissionMapper.getAllPermission(); - //将数据按父子类封装 - List permissionContentVos = Processing.convertToVoList(permissionDOList); - - return ResultUtil.success(permissionContentVos); - } - - @Override - @NeedRoleGroup("permission.edit") - public BaseResponse permissionEdit(PermissionEditVO permissionEditVo, HttpServletRequest request) { - //根据id获取对应permission数据 - PermissionDO permissionDO = permissionMapper.getPermissionById(permissionEditVo.getId()); - if (permissionDO == null) { - return ResultUtil.error(ErrorCode.PERMISSION_NOT_EXIST); - } - //传递要编辑的数据 - Processing.copyProperties(permissionEditVo, permissionDO); - //更新permission - if (!permissionMapper.updatePermission(permissionDO)) { - return ResultUtil.error(ErrorCode.DATABASE_UPDATE_ERROR); - } - return ResultUtil.success(); - } - - @Override - @NeedRoleGroup("permission.delete") - public BaseResponse permissionDelete(HttpServletRequest request, Long pid) { - //删除权限 - if (!permissionMapper.deletePermission(pid)) { - return ResultUtil.error(ErrorCode.DATABASE_DELETE_ERROR); - } - return ResultUtil.success(); + List permissionDOList = permissionDAO.getAllPermission(); + List permissionContentVO = new ArrayList<>(); + BeanUtils.copyProperties(permissionDOList, permissionContentVO); + return ResultUtil.success(permissionContentVO); } } diff --git a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java index 1dad3a6..f57a39f 100644 --- a/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/ProjectServiceImpl.java @@ -3,7 +3,7 @@ package com.jsl.oa.services.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.jsl.oa.annotations.NeedRoleGroup; +import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.dao.ProjectDAO; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; @@ -232,7 +232,7 @@ public class ProjectServiceImpl implements ProjectService { } @Override - @NeedRoleGroup("info.project.add") + @NeedPermission("info.project.add") public BaseResponse addHeader(HttpServletRequest request, ProjectShowVO projectShowVO) { // 获取用户 Long userId = Processing.getAuthHeaderToUserId(request); @@ -258,7 +258,7 @@ public class ProjectServiceImpl implements ProjectService { } @Override - @NeedRoleGroup("info.project.del") + @NeedPermission("info.project.del") public BaseResponse delHeader(Integer id, HttpServletRequest request) { // 获取展示信息 ProjectShowDO projectShowDO = projectDAO.getHeader(); @@ -276,7 +276,7 @@ public class ProjectServiceImpl implements ProjectService { } @Override - @NeedRoleGroup("info.project.edit") + @NeedPermission("info.project.edit") public BaseResponse editHeader(HttpServletRequest request, ProjectShowVO projectShowVO, Integer id) { // 获取用户 Long userId = Processing.getAuthHeaderToUserId(request); diff --git a/src/main/java/com/jsl/oa/services/impl/RoleServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/RoleServiceImpl.java index 821faf1..e188e6e 100644 --- a/src/main/java/com/jsl/oa/services/impl/RoleServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/RoleServiceImpl.java @@ -1,6 +1,6 @@ package com.jsl.oa.services.impl; -import com.jsl.oa.annotations.NeedRoleGroup; +import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; import com.jsl.oa.exception.ClassCopyException; @@ -42,7 +42,7 @@ public class RoleServiceImpl implements RoleService { private final UserDAO userDAO; @Override - @NeedRoleGroup("role.add") + @NeedPermission("role.add") public BaseResponse roleAddUser(HttpServletRequest request, Long uid, Long rid) { if (Processing.checkUserIsConsole(request, roleDAO)) { roleDAO.addRoleUser(uid, rid); diff --git a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java index 08364c3..98f3a9c 100755 --- a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java @@ -1,11 +1,11 @@ package com.jsl.oa.services.impl; +import com.google.gson.Gson; +import com.jsl.oa.annotations.NeedPermission; import com.jsl.oa.annotations.UserAbleToUse; import com.jsl.oa.dao.PermissionDAO; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; -import com.jsl.oa.model.dodata.RoleDO; -import com.jsl.oa.model.dodata.RoleUserDO; import com.jsl.oa.model.dodata.UserDO; import com.jsl.oa.model.vodata.*; import com.jsl.oa.services.UserService; @@ -21,8 +21,6 @@ import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; -import java.util.List; -import java.util.Objects; import java.util.regex.Pattern; /** @@ -43,6 +41,7 @@ public class UserServiceImpl implements UserService { private final UserDAO userDAO; private final RoleDAO roleDAO; private final PermissionDAO permissionDAO; + private final Gson gson; @Override public UserDO getUserInfoByUsername(String username) { @@ -125,46 +124,23 @@ public class UserServiceImpl implements UserService { return ResultUtil.success(userCurrentBackVO); } - @SuppressWarnings("checkstyle:NestedIfDepth") @Override @UserAbleToUse - public BaseResponse userCurrent(HttpServletRequest request, - String id, - String username, - String email, - String phone) { + @NeedPermission("user:current") + public BaseResponse userCurrent( + HttpServletRequest request, + String id, + String username, + String email, + String phone + ) { + UserDO userDO; if (id == null && username == null && email == null && phone == null) { // Token获取信息 - UserDO userDO = userDAO.getUserById(Processing.getAuthHeaderToUserId(request)); - if (userDO != null) { - return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, permissionDAO)); - } else { - return ResultUtil.error(ErrorCode.USER_NOT_EXIST); - } + userDO = userDAO.getUserById(Processing.getAuthHeaderToUserId(request)); } else { - // 检查是否是管理员用户 - Long userId = Processing.getAuthHeaderToUserId(request); - if (userId != null) { - List getPermission = permissionDAO.getPermission(userId); - // 匹配权限 - if (!getPermission.contains("user.current")) { - log.info("\t> 用户权限不足,检查是否是管理员"); - // 检查用户是管理员 - RoleUserDO roleUserDO = roleDAO - .getRoleUserByUid(Objects.requireNonNull(Processing.getAuthHeaderToUserId(request))); - if (roleUserDO == null) { - return ResultUtil.error(ErrorCode.NOT_PERMISSION); - } - RoleDO roleDO = roleDAO.getRoleByRoleName("console"); - if (!roleUserDO.getRid().equals(roleDO.getId())) { - return ResultUtil.error(ErrorCode.NOT_PERMISSION); - } - } - } else { - return ResultUtil.error(ErrorCode.TOKEN_NOT_EXIST); - } // 根据顺序优先级进行用户信息获取 - UserDO userDO = null; + userDO = null; if (id != null && !id.isEmpty()) { userDO = userDAO.getUserById(Long.valueOf(id)); } else if (username != null && !username.isEmpty()) { @@ -174,12 +150,12 @@ public class UserServiceImpl implements UserService { } else if (phone != null && !phone.isEmpty()) { userDO = userDAO.getUserByPhone(phone); } - // 返回结果 - if (userDO != null) { - return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, permissionDAO)); - } else { - return ResultUtil.error(ErrorCode.USER_NOT_EXIST); - } + } + // 返回结果 + if (userDO != null) { + return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, gson)); + } else { + return ResultUtil.error(ErrorCode.USER_NOT_EXIST); } } diff --git a/src/main/java/com/jsl/oa/utils/Processing.java b/src/main/java/com/jsl/oa/utils/Processing.java index 28261da..11b3f90 100755 --- a/src/main/java/com/jsl/oa/utils/Processing.java +++ b/src/main/java/com/jsl/oa/utils/Processing.java @@ -3,24 +3,30 @@ package com.jsl.oa.utils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.jsl.oa.dao.PermissionDAO; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.dao.UserDAO; import com.jsl.oa.exception.ClassCopyException; -import com.jsl.oa.model.dodata.*; -import com.jsl.oa.model.vodata.PermissionContentVo; +import com.jsl.oa.model.dodata.ProjectDO; +import com.jsl.oa.model.dodata.RoleDO; +import com.jsl.oa.model.dodata.RoleUserDO; +import com.jsl.oa.model.dodata.UserDO; import com.jsl.oa.model.vodata.ProjectSimpleVO; import com.jsl.oa.model.vodata.UserCurrentBackVO; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.springframework.beans.BeanUtils; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; -import java.sql.Timestamp; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Random; /** *

自定义快捷工具类

@@ -164,7 +170,7 @@ public class Processing { *
* 该方法用于检查用户是否是管理员,类型封装后字节返回结果 * - * @param request 请求 + * @param request 请求 * @return 如果为 true 是管理员,false 不是管理员 */ public static @NotNull Boolean checkUserIsConsole(HttpServletRequest request, @NotNull RoleDAO roleDAO) { @@ -180,7 +186,7 @@ public class Processing { /** * 检查用户是否是老师 * - * @param request 请求 + * @param request 请求 * @return 如果为 true 是老师,false 不是老师 */ public static @NotNull Boolean checkUserIsPrincipal(HttpServletRequest request, @NotNull RoleDAO roleDAO) { @@ -263,9 +269,12 @@ public class Processing { @Contract(pure = true) public static @NotNull String getSex(short sex) { switch (sex) { - case 1: return "男"; - case 2: return "女"; - default: return "保密"; + case 1: + return "男"; + case 2: + return "女"; + default: + return "保密"; } } @@ -278,56 +287,23 @@ public class Processing { * @return {@link BaseResponse} */ public static @NotNull UserCurrentBackVO.UserCurrent returnUserInfo( - @NotNull UserDO userDO, RoleDAO roleDAO, PermissionDAO permissionDAO) { + @NotNull UserDO userDO, RoleDAO roleDAO, Gson gson) { UserCurrentBackVO.UserCurrent userCurrent = new UserCurrentBackVO.UserCurrent(); - // 获取用户角色 - RoleUserDO getUserRole = roleDAO.getRoleUserByUid(userDO.getId()); - if (getUserRole == null) { - getUserRole = new RoleUserDO(); - getUserRole.setRid(0L).setCreatedAt(new Timestamp(System.currentTimeMillis())); - } else { - getUserRole.setUid(null); - } // 获取用户权限 - RoleUserDO roleUserDO = roleDAO.getRoleUserByUid(userDO.getId()); + RoleDO getRole = roleDAO.getRoleByUserId(userDO.getId()); List getPermissionForString; - if (roleUserDO != null) { - // 获取全部根权限 - getPermissionForString = permissionDAO.getAllPermissionBuildString(); - } else { - // 获取权限列表信息 - getPermissionForString = permissionDAO.getPermission(userDO.getId()); - } - RoleDO getRole = roleDAO.getRoleById(getUserRole.getRid()); - String getRoleString; if (getRole != null) { - getRoleString = getRole.getRoleName(); + // 获取全部根权限 + getPermissionForString = gson.fromJson(getRole.getPermissions(), new TypeToken>() { + }.getType()); } else { - getRoleString = "default"; + getPermissionForString = null; } + UserCurrentBackVO.ReturnUser returnUser = new UserCurrentBackVO.ReturnUser(); + BeanUtils.copyProperties(userDO, returnUser); userCurrent - .setUser(new UserCurrentBackVO.ReturnUser() - .setId(userDO.getId()) - .setJobId(userDO.getJobId()) - .setUsername(userDO.getUsername()) - .setAddress(userDO.getAddress()) - .setPhone(userDO.getPhone()) - .setEmail(userDO.getEmail()) - .setAge(userDO.getAge()) - .setSignature(userDO.getSignature()) - .setAvatar(userDO.getAvatar()) - .setNickname(userDO.getNickname()) - .setSex(userDO.getSex()) - .setEnabled(userDO.getEnabled()) - .setAccountNoExpired(userDO.getAccountNoExpired()) - .setCredentialsNoExpired(userDO.getCredentialsNoExpired()) - .setRecommend(userDO.getRecommend()) - .setAccountNoLocked(userDO.getAccountNoLocked()) - .setDescription(userDO.getDescription()) - .setCreatedAt(userDO.getCreatedAt()) - .setUpdatedAt(userDO.getUpdatedAt()) - .setIsDelete(userDO.getIsDelete())) - .setRole(getRoleString) + .setUser(returnUser) + .setRole(getRole != null ? getRole.getRoleName() : "default") .setPermission(getPermissionForString); return userCurrent; } @@ -384,56 +360,6 @@ public class Processing { //return ProjectSimpleVO; } - /** - * @Description: 将Permission归纳为父子关系的json形式 - * @Date: 2024/1/20 - * @Param permissions: 权限实体类 - **/ - public static List convertToVoList(List permissions) { - List vos = new ArrayList<>(); - Map> childrenMap = new HashMap<>(); - - for (PermissionDO permission : permissions) { - if (permission.getPid() != null) { - List children = childrenMap.getOrDefault(permission.getPid(), new ArrayList<>()); - children.add(permission); - childrenMap.put(permission.getPid(), children); - } - } - - for (PermissionDO permission : permissions) { - if (permission.getPid() == null) { - PermissionContentVo vo = convertToVo(permission, childrenMap); - vos.add(vo); - } - } - - return vos; - } - - /** - * @Description: 封装PermissionContentVo的子类,被convertToVoList方法调用 - * @Date: 2024/1/20 - * @Param permission: 权限实体类 - * @Param childrenMap: 要封装的子类 - **/ - public static PermissionContentVo convertToVo(PermissionDO permission, Map> childrenMap) { - PermissionContentVo vo = new PermissionContentVo(); - copyProperties(permission, vo); - - List children = childrenMap.get(permission.getId()); - if (children != null) { - List childVos = new ArrayList<>(); - for (PermissionDO child : children) { - PermissionContentVo childVo = convertToVo(child, childrenMap); - childVos.add(childVo); - } - vo.setChildren(childVos); - } - - return vo; - } - /** * @Description: 转换审核的类别属性为字符串 @@ -443,11 +369,11 @@ public class Processing { public static String turnReviewCategory(short category) { switch (category) { case 0: - return "子系统"; + return "子系统"; case 1: - return "模块"; + return "模块"; default: - return "其他"; + return "其他"; } } @@ -465,7 +391,4 @@ public class Processing { } - - - } diff --git a/src/main/resources/mysql/oa_permissions.sql b/src/main/resources/mysql/oa_permissions.sql index 51105f6..fb9997c 100644 --- a/src/main/resources/mysql/oa_permissions.sql +++ b/src/main/resources/mysql/oa_permissions.sql @@ -1,14 +1,11 @@ create table oa_permissions ( - id bigint unsigned auto_increment comment '主键' + id bigint unsigned auto_increment comment '主键' primary key, - pid bigint unsigned null comment '权限父id', - name varchar(100) not null comment '权限名称', - code varchar(50) not null comment '权限编码', - type tinyint(1) default 1 not null comment '0为菜单,1为权限', - deleted_at timestamp null comment '删除时间(没有删除应当为空)', - constraint oa_permissions_oa_permissions_id_fk - foreign key (pid) references oa_permissions (id) - on update cascade on delete cascade + name varchar(100) not null comment '权限名称', + description varchar(100) not null comment '权限描述', + created_at timestamp default CURRENT_TIMESTAMP not null comment '创建时间', + constraint oa_permissions_name_uindex + unique (name) ) comment '权限表'; \ No newline at end of file diff --git a/src/main/resources/mysql/oa_role.sql b/src/main/resources/mysql/oa_role.sql index 2b40923..379f30b 100644 --- a/src/main/resources/mysql/oa_role.sql +++ b/src/main/resources/mysql/oa_role.sql @@ -4,6 +4,7 @@ create table oa_role primary key, role_name varchar(20) not null comment '角色名称', display_name varchar(10) null comment '中文描述', + permissions json null comment '用户组权限', created_at timestamp default CURRENT_TIMESTAMP not null comment '创建时间', updated_at timestamp null comment '修改时间' )