Pārlūkot izejas kodu

所有功能完善前后端校验及权限按钮

xusl 2 gadi atpakaļ
vecāks
revīzija
ef5a30795b
35 mainītis faili ar 592 papildinājumiem un 321 dzēšanām
  1. 27 0
      backend/src/main/java/com/jiayue/ssi/constant/PermissionContextHolder.java
  2. 1 1
      backend/src/main/java/com/jiayue/ssi/controller/ServerController.java
  3. 13 0
      backend/src/main/java/com/jiayue/ssi/controller/SysLogininforController.java
  4. 20 9
      backend/src/main/java/com/jiayue/ssi/controller/SysMenuController.java
  5. 14 0
      backend/src/main/java/com/jiayue/ssi/controller/SysOperlogController.java
  6. 10 0
      backend/src/main/java/com/jiayue/ssi/controller/SysParameterController.java
  7. 68 202
      backend/src/main/java/com/jiayue/ssi/controller/SysRoleController.java
  8. 28 1
      backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java
  9. 1 1
      backend/src/main/java/com/jiayue/ssi/controller/UserLoginController.java
  10. 1 1
      backend/src/main/java/com/jiayue/ssi/entity/SysParameter.java
  11. 2 2
      backend/src/main/java/com/jiayue/ssi/entity/SysUser.java
  12. 1 1
      backend/src/main/java/com/jiayue/ssi/mapper/SysMenuMapper.java
  13. 14 14
      backend/src/main/java/com/jiayue/ssi/mapper/SysRoleMapper.java
  14. 14 6
      backend/src/main/java/com/jiayue/ssi/service/SysMenuService.java
  15. 28 16
      backend/src/main/java/com/jiayue/ssi/service/SysRoleService.java
  16. 169 0
      backend/src/main/java/com/jiayue/ssi/service/impl/PermissionService.java
  17. 27 7
      backend/src/main/java/com/jiayue/ssi/service/impl/SysMenuServiceImpl.java
  18. 33 0
      backend/src/main/java/com/jiayue/ssi/service/impl/SysPermissionService.java
  19. 63 35
      backend/src/main/java/com/jiayue/ssi/service/impl/SysRoleServiceImpl.java
  20. 3 3
      backend/src/main/resources/mapper/system/SysMenuMapper.xml
  21. 5 1
      ui/src/directive/permission/hasPermi.js
  22. 4 4
      ui/src/layout/components/Navbar.vue
  23. 2 1
      ui/src/main.js
  24. 1 1
      ui/src/permission.js
  25. 1 1
      ui/src/store/index.js
  26. 0 5
      ui/src/store/modules/user.js
  27. 4 0
      ui/src/views/auditManager/logininfo/index.vue
  28. 4 0
      ui/src/views/auditManager/operlog/index.vue
  29. 2 2
      ui/src/views/dashboard/index.vue
  30. 7 2
      ui/src/views/sysManager/roleManager/index.vue
  31. 7 0
      ui/src/views/sysManager/sysMenu/index.vue
  32. 10 3
      ui/src/views/sysManager/sysParameter/index.vue
  33. 6 0
      ui/src/views/sysManager/userManager/index.vue
  34. 1 1
      ui/src/views/sysManager/userManager/profile/index.vue
  35. 1 1
      ui/src/views/sysManager/userManager/profile/resetPwd.vue

+ 27 - 0
backend/src/main/java/com/jiayue/ssi/constant/PermissionContextHolder.java

@@ -0,0 +1,27 @@
+package com.jiayue.ssi.constant;
+
+import cn.hutool.core.convert.Convert;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+
+/**
+ * 权限信息
+ *
+ * @author ruoyi
+ */
+public class PermissionContextHolder
+{
+    private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT";
+
+    public static void setContext(String permission)
+    {
+        RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission,
+                RequestAttributes.SCOPE_REQUEST);
+    }
+
+    public static String getContext()
+    {
+        return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES,
+                RequestAttributes.SCOPE_REQUEST));
+    }
+}

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/controller/ServerController.java

@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/monitor/server")
 public class ServerController {
-    // @PreAuthorize("@ss.hasPermi('monitor:server:list')")
+    @PreAuthorize("@ss.hasPermi('monitor:server:list')")
     @GetMapping()
     @InterfaceLimit
     public ResponseVO getInfo() throws Exception {

+ 13 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysLogininforController.java

@@ -35,9 +35,20 @@ public class SysLogininforController {
      */
     @GetMapping(value = "/getAll")
     @InterfaceLimit
+    @PreAuthorize("@ss.hasPermi('auditManager:logininfor:list')")
     public ResponseVO getAll(Integer currentPage, Integer pageSize, String ipaddr, String userName,
                              String status,String startLoginTime,String endLoginTime) {
         try {
+            if (StringUtils.isNotEmpty(ipaddr)) {
+                if (ipaddr.length() > 128) {
+                    return ResponseVO.fail("登录地址长度不能超过128个字符!");
+                }
+            }
+            if (StringUtils.isNotEmpty(userName)) {
+                if (userName.length() > 50) {
+                    return ResponseVO.fail("用户名称长度不能超过50个字符!");
+                }
+            }
             QueryWrapper<SysLogininfor> wrapper = new QueryWrapper<>();
             if (StringUtils.isNotEmpty(ipaddr)) {
                 wrapper.eq("ipaddr", ipaddr);
@@ -69,6 +80,7 @@ public class SysLogininforController {
     @PostMapping(value = "/delLoginInfo")
     @InterfaceLimit
     @OperateLog(title = "登录日志", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('auditManager:logininfor:remove')")
     public ResponseVO delLoginInfo(String infoId) {
         if (StringUtils.isEmpty(infoId)) {
             return ResponseVO.fail("id不能为空!");
@@ -93,6 +105,7 @@ public class SysLogininforController {
     @PostMapping("/cleanLogininfor")
     @InterfaceLimit
     @OperateLog(title = "登录日志", businessType = BusinessType.CLEAN)
+    @PreAuthorize("@ss.hasPermi('auditManager:logininfor:remove')")
     public ResponseVO cleanLogininfor() {
         try {
             boolean bo = sysLogininforService.cleanLogininfor();

+ 20 - 9
backend/src/main/java/com/jiayue/ssi/controller/SysMenuController.java

@@ -12,6 +12,7 @@ import com.jiayue.ssi.entity.SysMenu;
 import com.jiayue.ssi.service.SysMenuService;
 import com.jiayue.ssi.util.RyStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import com.jiayue.ssi.annotation.InterfaceLimit;
 import com.jiayue.ssi.util.ResponseVO;
@@ -35,11 +36,14 @@ public class SysMenuController {
     /**
      * 获取菜单列表
      */
-    // @PreAuthorize("@ss.hasPermi('system:menu:list')")
     @GetMapping("/list")
     @InterfaceLimit
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
     public ResponseVO list(SysMenu menu) {
         try {
+            if (menu.getMenuName().length() > 50) {
+                return ResponseVO.fail("菜单名长度不能超过50个字符!");
+            }
             List<SysMenu> menus = sysMenuService.selectMenuList(menu, SecurityContextUtil.getSysUser().getId());
             return ResponseVO.success(menus);
         } catch (Exception e) {
@@ -55,16 +59,19 @@ public class SysMenuController {
     @PostMapping
     @InterfaceLimit
     @OperateLog(title = "菜单管理", businessType = BusinessType.INSERT)
+    @PreAuthorize("@ss.hasPermi('system:menu:add')")
     public ResponseVO add(@RequestBody SysMenu menu) {
         if (RyStringUtils.isEmpty(menu.getMenuName())) {
             return ResponseVO.fail("菜单名称不能为空!");
         } else if (menu.getMenuName().length() > 50) {
             return ResponseVO.fail("菜单名长度不能超过50个字符!");
         }
-        if (RyStringUtils.isEmpty(menu.getPath())) {
-            return ResponseVO.fail("路由地址不能为空!");
-        } else if (menu.getPath().length() > 200) {
-            return ResponseVO.fail("路由地址长度不能超过200个字符!");
+        if (!"F".equals(menu.getMenuType())){
+            if (RyStringUtils.isEmpty(menu.getPath())) {
+                return ResponseVO.fail("路由地址不能为空!");
+            } else if (menu.getPath().length() > 200) {
+                return ResponseVO.fail("路由地址长度不能超过200个字符!");
+            }
         }
         if (menu.getOrderNum() == null) {
             return ResponseVO.fail("排序不能为空!");
@@ -118,6 +125,7 @@ public class SysMenuController {
     @PutMapping
     @InterfaceLimit
     @OperateLog(title = "菜单管理", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
     public ResponseVO update(@RequestBody SysMenu menu) {
         if (menu.getMenuId() == null) {
             return ResponseVO.fail("主键为空不能修改!");
@@ -127,10 +135,12 @@ public class SysMenuController {
         } else if (menu.getMenuName().length() > 50) {
             return ResponseVO.fail("菜单名长度不能超过50个字符!");
         }
-        if (RyStringUtils.isEmpty(menu.getPath())) {
-            return ResponseVO.fail("路由地址不能为空!");
-        } else if (menu.getPath().length() > 200) {
-            return ResponseVO.fail("路由地址长度不能超过200个字符!");
+        if (!"F".equals(menu.getMenuType())){
+            if (RyStringUtils.isEmpty(menu.getPath())) {
+                return ResponseVO.fail("路由地址不能为空!");
+            } else if (menu.getPath().length() > 200) {
+                return ResponseVO.fail("路由地址长度不能超过200个字符!");
+            }
         }
         if (menu.getOrderNum() == null) {
             return ResponseVO.fail("排序不能为空!");
@@ -200,6 +210,7 @@ public class SysMenuController {
     @DeleteMapping
     @InterfaceLimit
     @OperateLog(title = "菜单管理", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
     public ResponseVO delete(String menuId) {
         if (org.apache.commons.lang3.StringUtils.isEmpty(menuId)) {
             return ResponseVO.fail("删除菜单的id不能为空!");

+ 14 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysOperlogController.java

@@ -13,6 +13,7 @@ import com.jiayue.ssi.util.ResponseVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -33,9 +34,20 @@ public class SysOperlogController {
      */
     @GetMapping(value = "/getAll")
     @InterfaceLimit
+    @PreAuthorize("@ss.hasPermi('auditManager:operlog:list')")
     public ResponseVO getAll(Integer currentPage, Integer pageSize, String title, String operName,
                              String businessType, String status,String startOperTime, String endOperTime) {
         try {
+            if (StringUtils.isNotEmpty(title)) {
+                if (title.length() > 50) {
+                    return ResponseVO.fail("系统模块长度不能超过50个字符!");
+                }
+            }
+            if (StringUtils.isNotEmpty(operName)) {
+                if (operName.length() > 50) {
+                    return ResponseVO.fail("操作人员长度不能超过50个字符!");
+                }
+            }
             QueryWrapper<SysOperLog> wrapper = new QueryWrapper<>();
             if (StringUtils.isNotEmpty(title)) {
                 wrapper.like("title", title);
@@ -69,6 +81,7 @@ public class SysOperlogController {
     @PostMapping(value = "/delOperlog")
     @InterfaceLimit
     @OperateLog(title = "操作日志", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('auditManager:operlog:remove')")
     public ResponseVO delOperlog(String operId) {
         if (StringUtils.isEmpty(operId)) {
             return ResponseVO.fail("id不能为空!");
@@ -93,6 +106,7 @@ public class SysOperlogController {
     @PostMapping("/cleanOperLog")
     @InterfaceLimit
     @OperateLog(title = "操作日志", businessType = BusinessType.CLEAN)
+    @PreAuthorize("@ss.hasPermi('auditManager:operlog:remove')")
     public ResponseVO cleanOperLog() {
         try {
             boolean bo = sysOperLogService.cleanOperLog();

+ 10 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysParameterController.java

@@ -11,6 +11,7 @@ import com.jiayue.ssi.service.SysParameterService;
 import com.jiayue.ssi.util.ResponseVO;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import lombok.extern.slf4j.Slf4j;
@@ -37,6 +38,7 @@ public class SysParameterController {
     @InterfaceLimit
     @PostMapping()
     @OperateLog(title = "参数管理", businessType = BusinessType.INSERT)
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
     public ResponseVO add(@RequestBody SysParameter sysParameter) {
         if (StringUtils.isEmpty(sysParameter.getSysKey())) {
             return ResponseVO.fail("参数名不能为空!");
@@ -85,6 +87,7 @@ public class SysParameterController {
     @InterfaceLimit
     @PutMapping
     @OperateLog(title = "参数管理", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('system:config:edit')")
     public ResponseVO update(@RequestBody SysParameter sysParameter) {
         SysParameter existSysParameter = sysParameterService.getById(sysParameter.getId());
         if (existSysParameter == null) {
@@ -137,6 +140,7 @@ public class SysParameterController {
     @DeleteMapping
     @InterfaceLimit
     @OperateLog(title = "参数管理", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
     public ResponseVO delete(String id) {
         if (StringUtils.isEmpty(id)) {
             return ResponseVO.fail("id不能为空!");
@@ -167,8 +171,14 @@ public class SysParameterController {
      */
     @GetMapping(value = "/getAll")
     @InterfaceLimit
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
     public ResponseVO getAll(Integer currentPage, Integer pageSize, String keywords) {
         try {
+            if (StringUtils.isNotEmpty(keywords)) {
+                if (keywords.length() > 200) {
+                    return ResponseVO.fail("参数描述长度不能超过200个字符!");
+                }
+            }
             QueryWrapper<SysParameter> wrapper = new QueryWrapper<>();
             if (StringUtils.isNotEmpty(keywords)) {
                 wrapper.like("sys_describe", keywords);

+ 68 - 202
backend/src/main/java/com/jiayue/ssi/controller/SysRoleController.java

@@ -7,6 +7,7 @@ import com.jiayue.ssi.annotation.InterfaceLimit;
 
 import com.jiayue.ssi.annotation.OperateLog;
 import com.jiayue.ssi.backenum.BusinessType;
+import com.jiayue.ssi.constant.UserConstants;
 import com.jiayue.ssi.entity.SysParameter;
 import com.jiayue.ssi.entity.SysRole;
 
@@ -56,8 +57,19 @@ public class SysRoleController {
     //    @PreAuthorize("@ss.hasPermi('system:role:list')")
     @GetMapping(value = "/getAll")
     @InterfaceLimit
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
     public ResponseVO getAll(Integer currentPage, Integer pageSize, String roleName, String status, String roleKey) {
         try {
+            if (StringUtils.isNotEmpty(roleName)) {
+                if (roleName.length() > 15) {
+                    return ResponseVO.fail("角色名称不能超过15个字符!");
+                }
+            }
+            if (StringUtils.isNotEmpty(roleKey)) {
+                if (roleKey.length() > 50) {
+                    return ResponseVO.fail("角色权限不能超过50个字符!");
+                }
+            }
             QueryWrapper<SysRole> wrapper = new QueryWrapper<>();
             if (StringUtils.isNotEmpty(roleName)) {
                 wrapper.like("role_name", roleName);
@@ -86,9 +98,31 @@ public class SysRoleController {
     @InterfaceLimit
     @PostMapping()
     @OperateLog(title = "角色管理", businessType = BusinessType.INSERT)
+    @PreAuthorize("@ss.hasPermi('system:role:add')")
     public ResponseVO add(@RequestBody SysRole role) {
         try {
-            ///////加校验/////
+            if (StringUtils.isEmpty(role.getRoleName())) {
+                return ResponseVO.fail("角色名称不能为空!");
+            } else if (role.getRoleName().length() > 15) {
+                return ResponseVO.fail("角色名称不能超过15个字符!");
+            }
+            if (StringUtils.isEmpty(role.getRoleKey())) {
+                return ResponseVO.fail("角色权限不能为空!");
+            } else if (role.getRoleKey().length() > 50) {
+                return ResponseVO.fail("角色权限不能超过50个字符!");
+            }
+            if (role.getRoleSort() == null) {
+                return ResponseVO.fail("角色排序不能为空!");
+            }
+            if (StringUtils.isEmpty(role.getStatus())) {
+                return ResponseVO.fail("角色状态不能为空!");
+            }
+            if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) {
+                return ResponseVO.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+            }
+            if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
+                return ResponseVO.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+            }
             role.setCreateBy(SecurityContextUtil.getSysUser().getUsername());
             int i = roleService.insertRole(role);
             if (i > 0) {
@@ -113,13 +147,40 @@ public class SysRoleController {
     @InterfaceLimit
     @PutMapping
     @OperateLog(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
     public ResponseVO update(@RequestBody SysRole role) {
-        SysRole existRole = roleService.getById(role.getRoleId());
-        if (existRole == null) {
-            return ResponseVO.fail("非法访问不能修改!");
-        }
-///////加校验/////
         try {
+            SysRole existRole = roleService.getById(role.getRoleId());
+            if (existRole == null) {
+                return ResponseVO.fail("非法访问不能修改!");
+            }
+            if (StringUtils.isEmpty(role.getRoleName())) {
+                return ResponseVO.fail("角色名称不能为空!");
+            } else if (role.getRoleName().length() > 15) {
+                return ResponseVO.fail("角色名称不能超过15个字符!");
+            }
+            if (StringUtils.isEmpty(role.getRoleKey())) {
+                return ResponseVO.fail("角色权限不能为空!");
+            } else if (role.getRoleKey().length() > 50) {
+                return ResponseVO.fail("角色权限不能超过50个字符!");
+            }
+            if (role.getRoleSort() == null) {
+                return ResponseVO.fail("角色排序不能为空!");
+            }
+            if (StringUtils.isEmpty(role.getStatus())) {
+                return ResponseVO.fail("角色状态不能为空!");
+            }
+            if (!existRole.getRoleName().equals(role.getRoleName())) {
+                if (roleService.queryRoleName(role.getRoleName()) != null) {
+                    return ResponseVO.fail(role.getRoleName() + "角色名称已存在!");
+                }
+            }
+            if (!existRole.getRoleKey().equals(role.getRoleKey())) {
+                if (roleService.queryRoleKey(role.getRoleKey()) != null) {
+                    return ResponseVO.fail(role.getRoleKey() + "角色权限已存在!");
+                }
+            }
+
             if (roleService.updateRole(role) > 0) {
                 return ResponseVO.success("修改角色信息成功");
             } else {
@@ -147,6 +208,7 @@ public class SysRoleController {
     @PostMapping(value = "/delRole")
     @InterfaceLimit
     @OperateLog(title = "角色管理", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('system:role:remove')")
     public ResponseVO delRole(String roleId) {
         if (StringUtils.isEmpty(roleId)) {
             return ResponseVO.fail("id不能为空!");
@@ -165,200 +227,4 @@ public class SysRoleController {
             return ResponseVO.error(e);
         }
     }
-
-//    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
-//    @PreAuthorize("@ss.hasPermi('system:role:export')")
-//    @PostMapping("/export")
-//    public void export(HttpServletResponse response, SysRole role)
-//    {
-//        List<SysRole> list = roleService.selectRoleList(role);
-//        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
-//        util.exportExcel(response, list, "角色数据");
-//    }
-//
-//    /**
-//     * 根据角色编号获取详细信息
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:query')")
-//    @GetMapping(value = "/{roleId}")
-//    public AjaxResult getInfo(@PathVariable Long roleId)
-//    {
-//        roleService.checkRoleDataScope(roleId);
-//        return success(roleService.selectRoleById(roleId));
-//    }
-//
-//    /**
-//     * 新增角色
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:add')")
-//    @Log(title = "角色管理", businessType = BusinessType.INSERT)
-//    @PostMapping
-//    public AjaxResult add(@Validated @RequestBody SysRole role)
-//    {
-//        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
-//        {
-//            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
-//        }
-//        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
-//        {
-//            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
-//        }
-//        role.setCreateBy(getUsername());
-//        return toAjax(roleService.insertRole(role));
-//
-//    }
-//
-//    /**
-//     * 修改保存角色
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-//    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-//    @PutMapping
-//    public AjaxResult edit(@Validated @RequestBody SysRole role)
-//    {
-//        roleService.checkRoleAllowed(role);
-//        roleService.checkRoleDataScope(role.getRoleId());
-//        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
-//        {
-//            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
-//        }
-//        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
-//        {
-//            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
-//        }
-//        role.setUpdateBy(getUsername());
-//
-//        if (roleService.updateRole(role) > 0)
-//        {
-//            // 更新缓存用户权限
-//            LoginUser loginUser = getLoginUser();
-//            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
-//            {
-//                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
-//                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
-//                tokenService.setLoginUser(loginUser);
-//            }
-//            return success();
-//        }
-//        return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
-//    }
-//
-//    /**
-//     * 修改保存数据权限
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-//    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-//    @PutMapping("/dataScope")
-//    public AjaxResult dataScope(@RequestBody SysRole role)
-//    {
-//        roleService.checkRoleAllowed(role);
-//        roleService.checkRoleDataScope(role.getRoleId());
-//        return toAjax(roleService.authDataScope(role));
-//    }
-//
-//    /**
-//     * 状态修改
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-//    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-//    @PutMapping("/changeStatus")
-//    public AjaxResult changeStatus(@RequestBody SysRole role)
-//    {
-//        roleService.checkRoleAllowed(role);
-//        roleService.checkRoleDataScope(role.getRoleId());
-//        role.setUpdateBy(getUsername());
-//        return toAjax(roleService.updateRoleStatus(role));
-//    }
-//
-//    /**
-//     * 删除角色
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:remove')")
-//    @Log(title = "角色管理", businessType = BusinessType.DELETE)
-//    @DeleteMapping("/{roleIds}")
-//    public AjaxResult remove(@PathVariable Long[] roleIds)
-//    {
-//        return toAjax(roleService.deleteRoleByIds(roleIds));
-//    }
-//
-//    /**
-//     * 获取角色选择框列表
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:query')")
-//    @GetMapping("/optionselect")
-//    public AjaxResult optionselect()
-//    {
-//        return success(roleService.selectRoleAll());
-//    }
-//
-//    /**
-//     * 查询已分配用户角色列表
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:list')")
-//    @GetMapping("/authUser/allocatedList")
-//    public TableDataInfo allocatedList(SysUser user)
-//    {
-//        startPage();
-//        List<SysUser> list = userService.selectAllocatedList(user);
-//        return getDataTable(list);
-//    }
-//
-//    /**
-//     * 查询未分配用户角色列表
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:list')")
-//    @GetMapping("/authUser/unallocatedList")
-//    public TableDataInfo unallocatedList(SysUser user)
-//    {
-//        startPage();
-//        List<SysUser> list = userService.selectUnallocatedList(user);
-//        return getDataTable(list);
-//    }
-//
-//    /**
-//     * 取消授权用户
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-//    @Log(title = "角色管理", businessType = BusinessType.GRANT)
-//    @PutMapping("/authUser/cancel")
-//    public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
-//    {
-//        return toAjax(roleService.deleteAuthUser(userRole));
-//    }
-//
-//    /**
-//     * 批量取消授权用户
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-//    @Log(title = "角色管理", businessType = BusinessType.GRANT)
-//    @PutMapping("/authUser/cancelAll")
-//    public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
-//    {
-//        return toAjax(roleService.deleteAuthUsers(roleId, userIds));
-//    }
-//
-//    /**
-//     * 批量选择用户授权
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-//    @Log(title = "角色管理", businessType = BusinessType.GRANT)
-//    @PutMapping("/authUser/selectAll")
-//    public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
-//    {
-//        roleService.checkRoleDataScope(roleId);
-//        return toAjax(roleService.insertAuthUsers(roleId, userIds));
-//    }
-//
-//    /**
-//     * 获取对应角色部门树列表
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:role:query')")
-//    @GetMapping(value = "/deptTree/{roleId}")
-//    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
-//    {
-//        AjaxResult ajax = AjaxResult.success();
-//        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
-//        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
-//        return ajax;
-//    }
 }

+ 28 - 1
backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java

@@ -10,12 +10,17 @@ import com.jiayue.ssi.backenum.BusinessType;
 import com.jiayue.ssi.config.SendMailUtil;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.service.SysUserService;
+import com.jiayue.ssi.service.impl.SysPermissionService;
 import com.jiayue.ssi.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 用户信息接口
@@ -31,6 +36,8 @@ public class SysUserController {
     SysUserService sysUserService;
     @Autowired
     SendMailUtil sendMailUtil;
+    @Autowired
+    private SysPermissionService sysPermissionService;
 
     /**
      * 获取用户分页信息
@@ -39,9 +46,20 @@ public class SysUserController {
      */
     @GetMapping(value = "/getAll")
     @InterfaceLimit
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
     public ResponseVO getAll(Integer currentPage, Integer pageSize, String username, String phonenumber,
         String status) {
         try {
+            if (StringUtils.isNotEmpty(username)) {
+                if (username.length() > 20) {
+                    return ResponseVO.fail("用户账号长度不能超过20个字符!");
+                }
+            }
+            if (StringUtils.isNotEmpty(phonenumber)) {
+                if (phonenumber.length() > 11) {
+                    return ResponseVO.fail("手机号码长度不能超过11个字符!");
+                }
+            }
             QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
             if (StringUtils.isNotEmpty(username)) {
                 wrapper.eq("username", username);
@@ -71,7 +89,12 @@ public class SysUserController {
     public ResponseVO getCurrentUser() {
         try {
             SysUser sysUser = SecurityContextUtil.getSysUser();
-            return ResponseVO.success(sysUser);
+            // 权限集合
+            Set<String> permissions = sysPermissionService.getMenuPermission(sysUser.getId());
+            Map<String,Object> map = new HashMap<>();
+            map.put("sysUser",sysUser);
+            map.put("permissions",permissions);
+            return ResponseVO.success(map);
         } catch (Exception e) {
             e.printStackTrace();
             log.error("获取当前用户异常");
@@ -85,6 +108,7 @@ public class SysUserController {
     @PostMapping
     @InterfaceLimit
     @OperateLog(title = "用户管理", businessType = BusinessType.INSERT)
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
     public ResponseVO add(@RequestBody SysUser user) {
         if (StringUtils.isEmpty(user.getUsername())) {
             return ResponseVO.fail("用户账号不能为空!");
@@ -145,6 +169,7 @@ public class SysUserController {
      */
     @PutMapping
     @OperateLog(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
     public ResponseVO update(@RequestBody SysUser user) {
         SysUser existUser = sysUserService.getById(user.getId());
         if (existUser == null) {
@@ -210,6 +235,7 @@ public class SysUserController {
     @PostMapping(value = "/resetPassword")
     @InterfaceLimit
     @OperateLog(title = "用户管理", businessType = BusinessType.OTHER)
+    @PreAuthorize("@ss.hasPermi('system:user:send')")
     public ResponseVO resetPassword(String id) {
         if (StringUtils.isEmpty(id)) {
             return ResponseVO.fail("重置密码缺失id!");
@@ -240,6 +266,7 @@ public class SysUserController {
     @PostMapping(value = "/delUser")
     @InterfaceLimit
     @OperateLog(title = "用户管理", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
     public ResponseVO delete(String id) {
         if (StringUtils.isEmpty(id)) {
             return ResponseVO.fail("id不能为空!");

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/controller/UserLoginController.java

@@ -163,7 +163,7 @@ public class UserLoginController {
      */
     @GetMapping("getRouters")
     public ResponseVO getRouters() {
-        Integer userId = SecurityContextUtil.getSysUser().getId();
+        Long userId = SecurityContextUtil.getSysUser().getId();
         List<SysMenu> menus = sysMenuService.selectMenuTreeByUserId(userId);
         return ResponseVO.success(sysMenuService.buildMenus(menus));
     }

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/entity/SysParameter.java

@@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode;
  */
 @EqualsAndHashCode(callSuper = true)
 @Data
-@TableName(value = "t_sys_parameter")
+@TableName(value = "sys_parameter")
 public class SysParameter extends BaseEntity {
 
     @TableId(value = "id", type = IdType.AUTO)

+ 2 - 2
backend/src/main/java/com/jiayue/ssi/entity/SysUser.java

@@ -19,10 +19,10 @@ import java.util.Date;
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
-@TableName(value = "t_sys_user")
+@TableName(value = "sys_user")
 public class SysUser extends BaseEntity implements UserDetails {
     @TableId(value = "id", type = IdType.AUTO)
-    private Integer id;
+    private Long id;
 
     /**
      * 用户账号

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/mapper/SysMenuMapper.java

@@ -67,7 +67,7 @@ public interface SysMenuMapper  extends BaseMapper<SysMenu> {
      * @param userId 用户ID
      * @return 菜单列表
      */
-    public List<SysMenu> selectMenuTreeByUserId(Integer userId);
+    public List<SysMenu> selectMenuTreeByUserId(Long userId);
 
     /**
      * 根据角色ID查询菜单树信息

+ 14 - 14
backend/src/main/java/com/jiayue/ssi/mapper/SysRoleMapper.java

@@ -74,21 +74,21 @@ public interface SysRoleMapper extends BaseMapper<SysRole> {
 //     */
 //    public List<SysRole> selectRolesByUserName(String userName);
 //
-//    /**
-//     * 校验角色名称是否唯一
-//     *
-//     * @param roleName 角色名称
-//     * @return 角色信息
-//     */
-//    public SysRole checkRoleNameUnique(String roleName);
+    /**
+     * 校验角色名称是否唯一
+     *
+     * @param roleName 角色名称
+     * @return 角色信息
+     */
+    public SysRole checkRoleNameUnique(String roleName);
 //
-//    /**
-//     * 校验角色权限是否唯一
-//     *
-//     * @param roleKey 角色权限
-//     * @return 角色信息
-//     */
-//    public SysRole checkRoleKeyUnique(String roleKey);
+    /**
+     * 校验角色权限是否唯一
+     *
+     * @param roleKey 角色权限
+     * @return 角色信息
+     */
+    public SysRole checkRoleKeyUnique(String roleKey);
 //
 //    /**
 //     * 修改角色信息

+ 14 - 6
backend/src/main/java/com/jiayue/ssi/service/SysMenuService.java

@@ -1,6 +1,7 @@
 package com.jiayue.ssi.service;
 
 import java.util.List;
+import java.util.Set;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jiayue.ssi.entity.SysMenu;
@@ -20,7 +21,7 @@ public interface SysMenuService  extends IService<SysMenu> {
      * @param userId 用户ID
      * @return 菜单列表
      */
-    List<SysMenu> selectMenuTreeByUserId(Integer userId);
+    List<SysMenu> selectMenuTreeByUserId(Long userId);
     /**
      * 构建前端路由所需要的菜单
      *
@@ -34,7 +35,7 @@ public interface SysMenuService  extends IService<SysMenu> {
      * @param menu 菜单信息
      * @return 菜单列表
      */
-    List<SysMenu> selectMenuList(SysMenu menu, Integer userId);
+    List<SysMenu> selectMenuList(SysMenu menu, Long userId);
     /**
      * 校验菜单名称是否唯一
      *
@@ -83,26 +84,33 @@ public interface SysMenuService  extends IService<SysMenu> {
      * @param menus 菜单列表
      * @return 下拉树结构列表
      */
-    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);
+    List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);
     /**
      * 构建前端所需要树结构
      *
      * @param menus 菜单列表
      * @return 树结构列表
      */
-    public List<SysMenu> buildMenuTree(List<SysMenu> menus);
+    List<SysMenu> buildMenuTree(List<SysMenu> menus);
     /**
      * 根据用户查询系统菜单列表
      *
      * @param userId 用户ID
      * @return 菜单列表
      */
-    List<SysMenu> selectMenuList(Integer userId);
+    List<SysMenu> selectMenuList(Long userId);
     /**
      * 根据角色ID查询菜单树信息
      *
      * @param roleId 角色ID
      * @return 选中菜单列表
      */
-    public List<Long> selectMenuListByRoleId(Long roleId);
+    List<Long> selectMenuListByRoleId(Long roleId);
+    /**
+     * 根据用户ID查询权限
+     *
+     * @param userId 用户ID
+     * @return 权限列表
+     */
+    Set<String> selectMenuPermsByUserId(Long userId);
 }

+ 28 - 16
backend/src/main/java/com/jiayue/ssi/service/SysRoleService.java

@@ -2,6 +2,7 @@ package com.jiayue.ssi.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jiayue.ssi.entity.SysRole;
+import com.jiayue.ssi.entity.SysUser;
 
 /**
  * 角色业务层
@@ -56,21 +57,21 @@ public interface SysRoleService extends IService<SysRole> {
      */
     public SysRole selectRoleById(Long roleId);
 //
-//    /**
-//     * 校验角色名称是否唯一
-//     *
-//     * @param role 角色信息
-//     * @return 结果
-//     */
-//    public String checkRoleNameUnique(SysRole role);
+    /**
+     * 校验角色名称是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    String checkRoleNameUnique(SysRole role);
 //
-//    /**
-//     * 校验角色权限是否唯一
-//     *
-//     * @param role 角色信息
-//     * @return 结果
-//     */
-//    public String checkRoleKeyUnique(SysRole role);
+    /**
+     * 校验角色权限是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    String checkRoleKeyUnique(SysRole role);
 //
 //    /**
 //     * 校验角色是否允许操作
@@ -132,8 +133,19 @@ public interface SysRoleService extends IService<SysRole> {
      * @param roleId 角色ID
      * @return 结果
      */
-    public int deleteRoleById(Long roleId);
-
+    int deleteRoleById(Long roleId);
+    /**
+     * 根据角色名称查找
+     * @param roleName
+     * @return SysRole
+     */
+    SysRole queryRoleName(String roleName);
+    /**
+     * 根据角色权限查找
+     * @param roleKey
+     * @return SysRole
+     */
+    SysRole queryRoleKey(String roleKey);
 //
 //    /**
 //     * 取消授权用户角色

+ 169 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/PermissionService.java

@@ -0,0 +1,169 @@
+package com.jiayue.ssi.service.impl;
+
+import com.jiayue.ssi.constant.PermissionContextHolder;
+import com.jiayue.ssi.entity.SysUser;
+import com.jiayue.ssi.util.RyStringUtils;
+import com.jiayue.ssi.util.SecurityContextUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Set;
+
+/**
+ * RuoYi首创 自定义权限实现,ss取自SpringSecurity首字母
+ *
+ * @author ruoyi
+ */
+@Service("ss")
+public class PermissionService
+{
+    /** 所有权限标识 */
+    private static final String ALL_PERMISSION = "*:*:*";
+
+    /** 管理员角色权限标识 */
+    private static final String SUPER_ADMIN = "admin";
+
+    private static final String ROLE_DELIMETER = ",";
+
+    private static final String PERMISSION_DELIMETER = ",";
+    @Autowired
+    SysPermissionService sysPermissionService;
+    /**
+     * 验证用户是否具备某权限
+     *
+     * @param permission 权限字符串
+     * @return 用户是否具备某权限
+     */
+    public boolean hasPermi(String permission)
+    {
+        if (RyStringUtils.isEmpty(permission))
+        {
+            return false;
+        }
+        SysUser loginUser = SecurityContextUtil.getSysUser();
+        if (RyStringUtils.isNull(loginUser)) {
+            return false;
+        }
+        PermissionContextHolder.setContext(permission);
+        Set<String> permissions = sysPermissionService.getMenuPermission(loginUser.getId());
+        return hasPermissions(permissions, permission);
+    }
+
+    /**
+     * 验证用户是否不具备某权限,与 hasPermi逻辑相反
+     *
+     * @param permission 权限字符串
+     * @return 用户是否不具备某权限
+     */
+    public boolean lacksPermi(String permission)
+    {
+        return hasPermi(permission) != true;
+    }
+
+//    /**
+//     * 验证用户是否具有以下任意一个权限
+//     *
+//     * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
+//     * @return 用户是否具有以下任意一个权限
+//     */
+//    public boolean hasAnyPermi(String permissions)
+//    {
+//        if (StringUtils.isEmpty(permissions))
+//        {
+//            return false;
+//        }
+//        LoginUser loginUser = SecurityUtils.getLoginUser();
+//        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()))
+//        {
+//            return false;
+//        }
+//        PermissionContextHolder.setContext(permissions);
+//        Set<String> authorities = loginUser.getPermissions();
+//        for (String permission : permissions.split(PERMISSION_DELIMETER))
+//        {
+//            if (permission != null && hasPermissions(authorities, permission))
+//            {
+//                return true;
+//            }
+//        }
+//        return false;
+//    }
+
+//    /**
+//     * 判断用户是否拥有某个角色
+//     *
+//     * @param role 角色字符串
+//     * @return 用户是否具备某角色
+//     */
+//    public boolean hasRole(String role)
+//    {
+//        if (StringUtils.isEmpty(role))
+//        {
+//            return false;
+//        }
+//        LoginUser loginUser = SecurityUtils.getLoginUser();
+//        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
+//        {
+//            return false;
+//        }
+//        for (SysRole sysRole : loginUser.getUser().getRoles())
+//        {
+//            String roleKey = sysRole.getRoleKey();
+//            if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role)))
+//            {
+//                return true;
+//            }
+//        }
+//        return false;
+//    }
+
+//    /**
+//     * 验证用户是否不具备某角色,与 isRole逻辑相反。
+//     *
+//     * @param role 角色名称
+//     * @return 用户是否不具备某角色
+//     */
+//    public boolean lacksRole(String role)
+//    {
+//        return hasRole(role) != true;
+//    }
+
+//    /**
+//     * 验证用户是否具有以下任意一个角色
+//     *
+//     * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
+//     * @return 用户是否具有以下任意一个角色
+//     */
+//    public boolean hasAnyRoles(String roles)
+//    {
+//        if (StringUtils.isEmpty(roles))
+//        {
+//            return false;
+//        }
+//        LoginUser loginUser = SecurityUtils.getLoginUser();
+//        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
+//        {
+//            return false;
+//        }
+//        for (String role : roles.split(ROLE_DELIMETER))
+//        {
+//            if (hasRole(role))
+//            {
+//                return true;
+//            }
+//        }
+//        return false;
+//    }
+
+    /**
+     * 判断是否包含权限
+     *
+     * @param permissions 权限列表
+     * @param permission 权限字符串
+     * @return 用户是否具备某权限
+     */
+    private boolean hasPermissions(Set<String> permissions, String permission)
+    {
+        return permissions.contains(ALL_PERMISSION) || permissions.contains(RyStringUtils.trim(permission));
+    }
+}

+ 27 - 7
backend/src/main/java/com/jiayue/ssi/service/impl/SysMenuServiceImpl.java

@@ -118,13 +118,13 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuTreeByUserId(Integer userId) {
+    public List<SysMenu> selectMenuTreeByUserId(Long userId) {
         List<SysMenu> menus = null;
-        if (userId == 1) {
-            menus = menuMapper.selectMenuTreeAll();
-        } else {
+//        if (userId == 1) {
+//            menus = menuMapper.selectMenuTreeAll();
+//        } else {
             menus = menuMapper.selectMenuTreeByUserId(userId);
-        }
+//        }
         return getChildPerms(menus, 0);
     }
 
@@ -135,7 +135,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuList(SysMenu menu, Integer userId) {
+    public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
         // 管理员显示所有菜单信息
         return menuMapper.selectMenuList(menu);
     }
@@ -406,7 +406,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
      * @return 菜单列表
      */
     @Override
-    public List<SysMenu> selectMenuList(Integer userId)
+    public List<SysMenu> selectMenuList(Long userId)
     {
         return selectMenuList(new SysMenu(), userId);
     }
@@ -422,4 +422,24 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
         SysRole role = roleMapper.selectRoleById(roleId);
         return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
     }
+    /**
+     * 根据用户ID查询权限
+     *
+     * @param userId 用户ID
+     * @return 权限列表
+     */
+    @Override
+    public Set<String> selectMenuPermsByUserId(Long userId)
+    {
+        List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
+        Set<String> permsSet = new HashSet<>();
+        for (String perm : perms)
+        {
+            if (RyStringUtils.isNotEmpty(perm))
+            {
+                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
+            }
+        }
+        return permsSet;
+    }
 }

+ 33 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/SysPermissionService.java

@@ -0,0 +1,33 @@
+package com.jiayue.ssi.service.impl;
+
+import com.jiayue.ssi.service.SysMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 用户权限处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class SysPermissionService {
+    @Autowired
+    private SysMenuService sysMenuService;
+
+    /**
+     * 获取菜单数据权限
+     *
+     * @param userId 用户id
+     * @return 菜单权限信息
+     */
+    public Set<String> getMenuPermission(Long userId)
+    {
+        Set<String> perms = new HashSet<String>();
+        perms.addAll(sysMenuService.selectMenuPermsByUserId(userId));
+        return perms;
+    }
+}

+ 63 - 35
backend/src/main/java/com/jiayue/ssi/service/impl/SysRoleServiceImpl.java

@@ -1,14 +1,18 @@
 package com.jiayue.ssi.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ssi.constant.UserConstants;
 import com.jiayue.ssi.entity.SysRole;
 
 import com.jiayue.ssi.entity.SysRoleMenu;
+import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.mapper.SysRoleMapper;
 
 import com.jiayue.ssi.mapper.SysRoleMenuMapper;
 import com.jiayue.ssi.service.SysRoleService;
 
+import com.jiayue.ssi.util.RyStringUtils;
 import com.jiayue.ssi.util.SecurityContextUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -193,42 +197,66 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         roleMenuMapper.deleteRoleMenuByRoleId(SecurityContextUtil.getSysUser().getUsername(), role.getRoleId());
         return insertRoleMenu(role);
     }
+
+    /**
+     * 校验角色名称是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    public String checkRoleNameUnique(SysRole role)
+    {
+        Long roleId = RyStringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
+        SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName());
+        if (RyStringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
 //
-//    /**
-//     * 校验角色名称是否唯一
-//     *
-//     * @param role 角色信息
-//     * @return 结果
-//     */
-//    @Override
-//    public String checkRoleNameUnique(SysRole role)
-//    {
-//        Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
-//        SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName());
-//        if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
-//        {
-//            return UserConstants.NOT_UNIQUE;
-//        }
-//        return UserConstants.UNIQUE;
-//    }
-//
-//    /**
-//     * 校验角色权限是否唯一
-//     *
-//     * @param role 角色信息
-//     * @return 结果
-//     */
-//    @Override
-//    public String checkRoleKeyUnique(SysRole role)
-//    {
-//        Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
-//        SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey());
-//        if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
-//        {
-//            return UserConstants.NOT_UNIQUE;
-//        }
-//        return UserConstants.UNIQUE;
-//    }
+    /**
+     * 校验角色权限是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    public String checkRoleKeyUnique(SysRole role)
+    {
+        Long roleId = RyStringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
+        SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey());
+        if (RyStringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+    /**
+     * 根据角色名称查找
+     * @param roleName
+     * @return SysUser
+     */
+    @Override
+    public SysRole queryRoleName(String roleName){
+        LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysRole::getRoleName,roleName);
+        SysRole sysRole = roleMapper.selectOne(queryWrapper);
+        return sysRole;
+    }
+    /**
+     * 根据角色权限查找
+     * @param roleKey
+     * @return SysRole
+     */
+    @Override
+    public SysRole queryRoleKey(String roleKey){
+        LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysRole::getRoleKey,roleKey);
+        SysRole sysRole = roleMapper.selectOne(queryWrapper);
+        return sysRole;
+    }
 //
 //    /**
 //     * 校验角色是否允许操作

+ 3 - 3
backend/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -81,8 +81,8 @@
 			 left join sys_role_menu rm on m.menu_id = rm.menu_id
 			 left join sys_user_role ur on rm.role_id = ur.role_id
 			 left join sys_role ro on ur.role_id = ro.role_id
-			 left join sys_user u on ur.user_id = u.user_id
-		where u.user_id = #{userId} and m.menu_type in ('M', 'C') and m.status = 0  AND ro.status = 0 and m.del_flag=0 and u.del_flag=0
+			 left join sys_user u on ur.user_id = u.id
+		where u.id = #{userId} and m.menu_type in ('M', 'C') and m.status = 0  AND ro.status = 0 and m.del_flag=0 and u.del_flag=0
 		order by m.parent_id, m.order_num
 	</select>
 
@@ -112,7 +112,7 @@
 			 left join sys_role_menu rm on m.menu_id = rm.menu_id
 			 left join sys_user_role ur on rm.role_id = ur.role_id
 			 left join sys_role r on r.role_id = ur.role_id
-		where m.status = '0' and r.status = '0' and ur.user_id = #{userId} and del_flag=0
+		where m.status = '0' and r.status = '0' and ur.user_id = #{userId} and m.del_flag=0 and ur.del_flag=0 and rm.del_flag=0
 	</select>
 
 	<select id="selectMenuPermsByRoleId" parameterType="Long" resultType="String">

+ 5 - 1
ui/src/directive/permission/hasPermi.js

@@ -4,12 +4,16 @@
  */
 
 import store from '@/store'
+ import {userinfoDecrypt} from "@/utils/smutil";
 
 export default {
   inserted(el, binding, vnode) {
     const { value } = binding
     const all_permission = "*:*:*";
-    const permissions = store.getters && store.getters.permissions
+    // const permissions = store.getters && store.getters.permissions
+    // 用户信息解密
+    let decryptUserInfo = userinfoDecrypt(sessionStorage.getItem('userinfo'))
+    const permissions = JSON.parse(decryptUserInfo).permissions
     if (value && value instanceof Array && value.length > 0) {
       const permissionFlag = value
 

+ 4 - 4
ui/src/layout/components/Navbar.vue

@@ -17,7 +17,7 @@
 <!--          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
 <!--        </el-tooltip>-->
 
-<!--        <screenfull id="screenfull" class="right-menu-item hover-effect" />-->
+        <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
 <!--        <el-tooltip content="布局大小" effect="dark" placement="bottom">-->
 <!--          <size-select id="size-select" class="right-menu-item hover-effect" />-->
@@ -49,7 +49,7 @@ import Breadcrumb from '@/components/Breadcrumb'
 import TopNav from '@/components/TopNav'
 import Hamburger from '@/components/Hamburger'
 import {removeToken} from "@/utils/auth";
-// import Screenfull from '@/components/Screenfull'
+import Screenfull from '@/components/Screenfull'
 // import SizeSelect from '@/components/SizeSelect'
 // import Search from '@/components/HeaderSearch'
 // import RuoYiGit from '@/components/RuoYi/Git'
@@ -59,8 +59,8 @@ export default {
   components: {
     Breadcrumb,
     TopNav,
-    Hamburger
-    // Screenfull,
+    Hamburger,
+    Screenfull,
     // SizeSelect,
     // Search,
     // RuoYiGit,

+ 2 - 1
ui/src/main.js

@@ -1,5 +1,5 @@
 import Vue from 'vue'
-
+import directive from './directive'
 import 'normalize.css/normalize.css' // A modern alternative to CSS resets
 import ElementUI, {Message, MessageBox} from 'element-ui'
 import 'element-ui/lib/theme-chalk/index.css'
@@ -28,6 +28,7 @@ Vue.prototype.$echarts = echarts
 Vue.prototype.$axios = service
 Vue.use(VXETable)
 Vue.use(plugins)
+Vue.use(directive)
 Vue.prototype.handleTree = handleTree
 /**
  * If you don't want to use mock-server

+ 1 - 1
ui/src/permission.js

@@ -42,7 +42,7 @@ router.beforeEach(async (to, from, next) => {
         // 用户信息解密
         // let decryptUserInfo = userinfoDecrypt(store.getters.userinfo)
         let decryptUserInfo = userinfoDecrypt(sessionStorage.getItem('userinfo'))
-        let user = JSON.parse(decryptUserInfo)
+        let user = JSON.parse(decryptUserInfo).sysUser
         if (user.lastUpdatePwdTime==null){
           Message({
             type: 'warning',

+ 1 - 1
ui/src/store/index.js

@@ -6,7 +6,7 @@ import settings from './modules/settings'
 import user from './modules/user'
 import tagsView from './modules/tagsView'
 import permission from './modules/permission'
-import createPersistedState from 'vuex-persistedstate'
+// import createPersistedState from 'vuex-persistedstate'
 
 Vue.use(Vuex)
 

+ 0 - 5
ui/src/store/modules/user.js

@@ -11,7 +11,6 @@ const state = {
 const mutations = {
   updateUser: (state, user) => {
     state.userinfo = user
-    console.log(state.userinfo)
   }
   // SET_TOKEN: (state, token) => {
   //   state.token = token
@@ -25,16 +24,12 @@ const mutations = {
   // SET_ROLES: (state, roles) => {
   //   state.roles = roles
   // },
-  // SET_PERMISSIONS: (state, permissions) => {
-  //   state.permissions = permissions
-  // }
 }
 
 const actions = {
   changeSetting({ commit }, user) {
     commit('updateUser', user)
   },
-
   // get user info
   getInfo({ commit, state }) {
     return state.userinfo

+ 4 - 0
ui/src/views/auditManager/logininfo/index.vue

@@ -3,6 +3,7 @@
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="登录地址" prop="ipaddr">
         <el-input
+          maxlength="128"
           v-model="queryParams.ipaddr"
           placeholder="请输入登录地址"
           clearable
@@ -11,6 +12,7 @@
       </el-form-item>
       <el-form-item label="用户名称" prop="userName">
         <el-input
+          maxlength="50"
           v-model="queryParams.userName"
           placeholder="请输入用户名称"
           clearable
@@ -57,6 +59,7 @@
           icon="el-icon-delete"
           size="mini"
           @click="handleDelete"
+          v-hasPermi="['auditManager:logininfor:remove']"
         >删除</el-button>
       </el-col>
       <el-col :span="1.5">
@@ -66,6 +69,7 @@
           icon="el-icon-delete"
           size="mini"
           @click="handleClean"
+          v-hasPermi="['auditManager:logininfor:remove']"
         >清空</el-button>
       </el-col>
     </el-row>

+ 4 - 0
ui/src/views/auditManager/operlog/index.vue

@@ -3,6 +3,7 @@
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="系统模块" prop="title">
         <el-input
+          maxlength="50"
           v-model="queryParams.title"
           placeholder="请输入系统模块"
           clearable
@@ -11,6 +12,7 @@
       </el-form-item>
       <el-form-item label="操作人员" prop="operName">
         <el-input
+          maxlength="50"
           v-model="queryParams.operName"
           placeholder="请输入操作人员"
           clearable
@@ -72,6 +74,7 @@
           icon="el-icon-delete"
           size="mini"
           @click="handleDelete"
+          v-hasPermi="['auditManager:operlog:remove']"
         >删除
         </el-button>
       </el-col>
@@ -82,6 +85,7 @@
           icon="el-icon-delete"
           size="mini"
           @click="handleClean"
+          v-hasPermi="['auditManager:operlog:remove']"
         >清空
         </el-button>
       </el-col>

+ 2 - 2
ui/src/views/dashboard/index.vue

@@ -26,11 +26,11 @@ export default {
     /** 获取当前用户的最后修改密码时间 */
     getCurrentUser() {
       this.$axios.get('/sysUserController/getCurrentUser').then((res) => {
-        // 用户信息加密存储
+        // 用户信息+菜单权限加密存储
         let encryptUserInfo = userinfoEncrypt(JSON.stringify(res.data))
         // this.$store.dispatch('user/changeSetting',encryptUserInfo)
         sessionStorage.setItem('userinfo',encryptUserInfo)
-        var user = res.data
+        var user = res.data.sysUser
         if (user.lastUpdatePwdTime==null){
             this.$message({
               type: 'warning',

+ 7 - 2
ui/src/views/sysManager/roleManager/index.vue

@@ -3,6 +3,7 @@
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
       <el-form-item label="角色名称" prop="roleName">
         <el-input
+          maxlength="15"
           v-model="queryParams.roleName"
           placeholder="请输入角色名称"
           clearable
@@ -12,6 +13,7 @@
       </el-form-item>
       <el-form-item label="权限字符" prop="roleKey">
         <el-input
+          maxlength="50"
           v-model="queryParams.roleKey"
           placeholder="请输入权限字符"
           clearable
@@ -48,6 +50,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
+          v-hasPermi="['system:role:add']"
         >新增
         </el-button>
       </el-col>
@@ -58,6 +61,7 @@
           icon="el-icon-edit"
           size="mini"
           @click="handleUpdate"
+          v-hasPermi="['system:role:edit']"
         >修改
         </el-button>
       </el-col>
@@ -68,6 +72,7 @@
           icon="el-icon-delete"
           size="mini"
           @click="handleDelete"
+          v-hasPermi="['system:role:remove']"
         >删除
         </el-button>
       </el-col>
@@ -113,7 +118,7 @@
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
         <el-form-item label="角色名称" prop="roleName">
-          <el-input v-model="form.roleName" placeholder="请输入角色名称"/>
+          <el-input v-model="form.roleName" maxlength="15" placeholder="请输入角色名称"/>
         </el-form-item>
         <el-form-item prop="roleKey">
           <span slot="label">
@@ -122,7 +127,7 @@
             </el-tooltip>
             权限字符
           </span>
-          <el-input v-model="form.roleKey" placeholder="请输入权限字符"/>
+          <el-input v-model="form.roleKey" maxlength="50" placeholder="请输入权限字符"/>
         </el-form-item>
         <el-form-item label="角色顺序" prop="roleSort">
           <el-input-number v-model="form.roleSort" controls-position="right" :min="0"/>

+ 7 - 0
ui/src/views/sysManager/sysMenu/index.vue

@@ -3,6 +3,7 @@
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
       <el-form-item label="菜单名称" prop="menuName">
         <el-input
+          maxlength="50"
           v-model="queryParams.menuName"
           placeholder="请输入菜单名称"
           clearable
@@ -443,6 +444,12 @@ export default {
     },500),
     /** 提交按钮 */
     submitForm:debounce(function(){
+      // if(this.form.menuType=='C'){
+      //   this.$refs['form'].clearValidate("path");
+      // }
+      // else{
+      //   this.$refs['form'].addValidate("path");
+      // }
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.menuId != undefined) {

+ 10 - 3
ui/src/views/sysManager/sysParameter/index.vue

@@ -10,9 +10,11 @@
         icon="el-icon-plus"
         size="mini"
         @click="insertEvent"
+        v-hasPermi="['system:config:add']"
       >新增
       </el-button>
       <el-input
+        maxlength="200"
         v-model="keywords"
         placeholder="通过描述搜索参数"
         clearable
@@ -84,6 +86,7 @@
                     icon="el-icon-edit"
                     :loading="btnLonding"
                     @click="editRowEvent(row)"
+                    v-hasPermi="['system:config:edit']"
                   >编辑
                   </el-button>
                   <el-button
@@ -92,6 +95,7 @@
                   size="mini"
                   icon="el-icon-delete"
                   @click="removeEvent(row)"
+                  v-hasPermi="['system:config:remove']"
                   :loading=btnLonding>删除
                   </el-button>
                 </template>
@@ -132,13 +136,16 @@ export default {
       total: 0,
       rules: {
         sysKey: [
-          { required: true, message: '参数名不能为空' }
+          { required: true, message: '参数名不能为空' },
+          { max: 50, message: '参数名不能超过50个字符', trigger: 'blur'}
         ],
         sysValue: [
-          { required: true, message: '参数值不能为空' }
+          { required: true, message: '参数值不能为空' },
+          { max: 50, message: '参数值不能超过50个字符', trigger: 'blur'}
         ],
         sysDescribe: [
-          { required: true, message: '参数描述不能为空' }
+          { required: true, message: '参数描述不能为空' },
+          { max: 200, message: '参数描述不能超过200个字符', trigger: 'blur'}
         ]
       }
     }

+ 6 - 0
ui/src/views/sysManager/userManager/index.vue

@@ -6,6 +6,7 @@
         <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px">
           <el-form-item label="用户账号" prop="username">
             <el-input
+              maxlength="20"
               v-model="queryParams.username"
               placeholder="请输入用户账号"
               clearable
@@ -15,6 +16,7 @@
           </el-form-item>
           <el-form-item label="手机号码" prop="phonenumber">
             <el-input
+              maxlength="11"
               v-model="queryParams.phonenumber"
               placeholder="请输入手机号码"
               clearable
@@ -50,6 +52,7 @@
               icon="el-icon-plus"
               size="mini"
               @click="handleAdd"
+              v-hasPermi="['system:user:add']"
             >新增
             </el-button>
           </el-col>
@@ -60,6 +63,7 @@
               icon="el-icon-edit"
               size="mini"
               @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
             >修改
             </el-button>
           </el-col>
@@ -70,6 +74,7 @@
               icon="el-icon-delete"
               size="mini"
               @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
             >删除
             </el-button>
           </el-col>
@@ -103,6 +108,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="handleResetPwd(scope.row)"
+                  v-hasPermi="['system:user:send']"
                 >初始/重置密码
                 </el-button>
                 <el-button

+ 1 - 1
ui/src/views/sysManager/userManager/profile/index.vue

@@ -55,7 +55,7 @@ export default {
   created() {
     // 用户信息解密
     let decryptUserInfo = userinfoDecrypt(sessionStorage.getItem('userinfo'))
-    this.user = JSON.parse(decryptUserInfo)
+    this.user = JSON.parse(decryptUserInfo).sysUser
   },
   methods: {
     getUser() {

+ 1 - 1
ui/src/views/sysManager/userManager/profile/resetPwd.vue

@@ -117,7 +117,7 @@ export default {
           }
           // 用户信息解密
           let decryptUserInfo = userinfoDecrypt(sessionStorage.getItem('userinfo'))
-          this.user = JSON.parse(decryptUserInfo)
+          this.user = JSON.parse(decryptUserInfo).sysUser
           const param = {
             id: this.user.id,
             oldPassword: this.pwd.oldPassword,