ソースを参照

角色修改功能,首页邮箱口令通过参数配置显示

xusl 2 年 前
コミット
a77150c7fc
23 ファイル変更1835 行追加113 行削除
  1. 19 1
      backend/src/main/java/com/jiayue/ssi/config/WebConfig.java
  2. 3 3
      backend/src/main/java/com/jiayue/ssi/config/WebSecurityConfig.java
  3. 4 0
      backend/src/main/java/com/jiayue/ssi/constant/CacheConstants.java
  4. 37 16
      backend/src/main/java/com/jiayue/ssi/controller/SysMenuController.java
  5. 29 1
      backend/src/main/java/com/jiayue/ssi/controller/SysParameterController.java
  6. 336 0
      backend/src/main/java/com/jiayue/ssi/controller/SysRoleController.java
  7. 1 1
      backend/src/main/java/com/jiayue/ssi/controller/UserLoginController.java
  8. 3 0
      backend/src/main/java/com/jiayue/ssi/entity/SysMenu.java
  9. 53 0
      backend/src/main/java/com/jiayue/ssi/entity/SysRole.java
  10. 48 0
      backend/src/main/java/com/jiayue/ssi/entity/SysRoleMenu.java
  11. 76 0
      backend/src/main/java/com/jiayue/ssi/entity/TreeSelect.java
  12. 3 3
      backend/src/main/java/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.java
  13. 40 36
      backend/src/main/java/com/jiayue/ssi/filter/MailCodeFilter.java
  14. 124 0
      backend/src/main/java/com/jiayue/ssi/mapper/SysRoleMapper.java
  15. 48 0
      backend/src/main/java/com/jiayue/ssi/mapper/SysRoleMenuMapper.java
  16. 29 0
      backend/src/main/java/com/jiayue/ssi/service/SysMenuService.java
  17. 170 0
      backend/src/main/java/com/jiayue/ssi/service/SysRoleService.java
  18. 71 1
      backend/src/main/java/com/jiayue/ssi/service/impl/SysMenuServiceImpl.java
  19. 483 0
      backend/src/main/java/com/jiayue/ssi/service/impl/SysRoleServiceImpl.java
  20. 154 0
      backend/src/main/resources/mapper/system/SysRoleMapper.xml
  21. 34 0
      backend/src/main/resources/mapper/system/SysRoleMenuMapper.xml
  22. 17 2
      ui/src/views/login/index.vue
  23. 53 49
      ui/src/views/sysManager/roleManager/index.vue

+ 19 - 1
backend/src/main/java/com/jiayue/ssi/config/WebConfig.java

@@ -1,10 +1,16 @@
 package com.jiayue.ssi.config;
 
+import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.interceptor.TokenStatusInterceptor;
+import com.jiayue.ssi.service.SysParameterService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
+import java.util.List;
+
 /**
 * MVC配置
 *
@@ -13,10 +19,22 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 */
 @Configuration
 public class WebConfig implements WebMvcConfigurer {
+    @Autowired
+    SysParameterService sysParameterService;
+
     @Override
     public void addInterceptors(InterceptorRegistry registry){
         // 刷新token拦截器注册
         registry.addInterceptor(new TokenStatusInterceptor()).addPathPatterns("/**")
-                .excludePathPatterns("/refreshToken","/error","/getMailCode","/getVerifyCode","/login","/index.html","/user/login","/css/**","/images/**","/js/**","/fonts/**");
+                .excludePathPatterns("/sysParameterController/getUseSendMail","/refreshToken","/error","/getMailCode","/getVerifyCode","/login","/index.html","/user/login","/css/**","/images/**","/js/**","/fonts/**");
+    }
+    /**
+     * 初始加载
+     */
+    @Bean
+    public void initLoad() {
+        // 加载上报对象缓存
+        String useSendMail = sysParameterService.queryByKey("useSendMail", "true");
+        CacheConstants.use_send_mail = Boolean.parseBoolean(useSendMail);
     }
 }

+ 3 - 3
backend/src/main/java/com/jiayue/ssi/config/WebSecurityConfig.java

@@ -66,8 +66,8 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     protected void configure(HttpSecurity httpSecurity) throws Exception {
         httpSecurity.addFilterBefore(new InterfaceLimitFilter(), UsernamePasswordAuthenticationFilter.class);
         httpSecurity.addFilterBefore(new VerifySmFilter(), UsernamePasswordAuthenticationFilter.class);
-//        httpSecurity.addFilterBefore(new VerifyCodeFilter(), UsernamePasswordAuthenticationFilter.class);
-//        httpSecurity.addFilterBefore(new MailCodeFilter(), UsernamePasswordAuthenticationFilter.class);
+        httpSecurity.addFilterBefore(new VerifyCodeFilter(), UsernamePasswordAuthenticationFilter.class);
+        httpSecurity.addFilterBefore(new MailCodeFilter(), UsernamePasswordAuthenticationFilter.class);
         httpSecurity.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
         httpSecurity
                 // 由于使用的是JWT,我们这里不需要csrf
@@ -93,6 +93,6 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
     @Override
     public void configure(WebSecurity web) throws Exception {
         /*super.configure(web);*/
-        web.ignoring().antMatchers("/static/**", "/assets/**","/getVerifyCode","/getMailCode");
+        web.ignoring().antMatchers("/static/**", "/assets/**","/getVerifyCode","/getMailCode","/sysParameterController/getUseSendMail");
     }
 }

+ 4 - 0
backend/src/main/java/com/jiayue/ssi/constant/CacheConstants.java

@@ -55,4 +55,8 @@ public class CacheConstants
      * 登录token存储,map<用户名,token:授权时间>
      */
     public static final Map<String,String> LOGIN_TOKEN_MAP = new ConcurrentHashMap<String,String>();
+    /**
+     * 是否使用邮箱口令 默认:true使用
+     */
+    public static boolean use_send_mail = true;
 }

+ 37 - 16
backend/src/main/java/com/jiayue/ssi/controller/SysMenuController.java

@@ -1,6 +1,8 @@
 package com.jiayue.ssi.controller;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import cn.hutool.core.util.NumberUtil;
 import com.jiayue.ssi.constant.UserConstants;
@@ -89,6 +91,7 @@ public class SysMenuController {
         }
 
         try {
+            menu.setCreateBy(SecurityContextUtil.getSysUser().getUsername());
             int bo = sysMenuService.insertMenu(menu);
             if (bo == 1) {
                 return ResponseVO.success("添加菜单成功");
@@ -115,40 +118,37 @@ public class SysMenuController {
         if (menu.getMenuId() == null) {
             return ResponseVO.fail("主键为空不能修改!");
         }
-        if (RyStringUtils.isEmpty(menu.getMenuName())){
+        if (RyStringUtils.isEmpty(menu.getMenuName())) {
             return ResponseVO.fail("菜单名称不能为空!");
-        }
-        else if (menu.getMenuName().length()> 50){
+        } else if (menu.getMenuName().length() > 50) {
             return ResponseVO.fail("菜单名长度不能超过50个字符!");
         }
-        if (RyStringUtils.isEmpty(menu.getPath())){
+        if (RyStringUtils.isEmpty(menu.getPath())) {
             return ResponseVO.fail("路由地址不能为空!");
-        }
-        else if (menu.getPath().length()> 200){
+        } else if (menu.getPath().length() > 200) {
             return ResponseVO.fail("路由地址长度不能超过200个字符!");
         }
-        if (menu.getOrderNum()==null){
+        if (menu.getOrderNum() == null) {
             return ResponseVO.fail("排序不能为空!");
-        }
-        else if (!NumberUtil.isInteger(menu.getOrderNum()+"")){
+        } else if (!NumberUtil.isInteger(menu.getOrderNum() + "")) {
             return ResponseVO.fail("排序不是整型数值!");
         }
-        if (RyStringUtils.isNotEmpty(menu.getComponent())){
-            if (menu.getComponent().length()> 200){
+        if (RyStringUtils.isNotEmpty(menu.getComponent())) {
+            if (menu.getComponent().length() > 200) {
                 return ResponseVO.fail("组件路径长度不能超过200个字符!");
             }
         }
-        if (RyStringUtils.isNotEmpty(menu.getQuery())){
-            if (menu.getQuery().length()> 200){
+        if (RyStringUtils.isNotEmpty(menu.getQuery())) {
+            if (menu.getQuery().length() > 200) {
                 return ResponseVO.fail("路由参数长度不能超过200个字符!");
             }
         }
-        if (RyStringUtils.isNotEmpty(menu.getPerms())){
-            if (menu.getPerms().length()> 100){
+        if (RyStringUtils.isNotEmpty(menu.getPerms())) {
+            if (menu.getPerms().length() > 100) {
                 return ResponseVO.fail("权限字符长度不能超过100个字符!");
             }
         }
-        if (sysMenuService.selectMenuById(menu.getMenuId())==null){
+        if (sysMenuService.selectMenuById(menu.getMenuId()) == null) {
             return ResponseVO.fail("非法访问不能修改!");
         }
         if (UserConstants.NOT_UNIQUE.equals(sysMenuService.checkMenuNameUnique(menu))) {
@@ -221,4 +221,25 @@ public class SysMenuController {
             return ResponseVO.error(e);
         }
     }
+
+    /**
+     * 获取菜单下拉树列表
+     */
+    @GetMapping("/treeselect")
+    public ResponseVO treeselect(SysMenu menu) {
+        List<SysMenu> menus = sysMenuService.selectMenuList(menu, SecurityContextUtil.getSysUser().getId());
+        return ResponseVO.success(sysMenuService.buildMenuTreeSelect(menus));
+    }
+
+    /**
+     * 加载对应角色菜单列表树
+     */
+    @GetMapping(value = "/roleMenuTreeselect")
+    public ResponseVO roleMenuTreeselect(Long roleId) {
+        List<SysMenu> menus = sysMenuService.selectMenuList(SecurityContextUtil.getSysUser().getId());
+        Map<String, Object> map = new HashMap<>();
+        map.put("checkedKeys", sysMenuService.selectMenuListByRoleId(roleId));
+        map.put("menus", sysMenuService.buildMenuTreeSelect(menus));
+        return ResponseVO.success(map);
+    }
 }

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

@@ -3,6 +3,7 @@ package com.jiayue.ssi.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jiayue.ssi.annotation.InterfaceLimit;
+import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.entity.SysParameter;
 import com.jiayue.ssi.service.SysParameterService;
 import com.jiayue.ssi.util.ResponseVO;
@@ -19,7 +20,7 @@ import lombok.extern.slf4j.Slf4j;
  * @since 2023/03/20
  */
 @RestController
-@RequestMapping(value = "sysParameterController")
+@RequestMapping(value = "/sysParameterController")
 @Slf4j
 public class SysParameterController {
     @Autowired
@@ -57,6 +58,9 @@ public class SysParameterController {
         try {
             boolean bo = sysParameterService.save(sysParameter);
             if (bo) {
+                if ("useSendMail".equals(sysParameter.getSysKey())){
+                    CacheConstants.use_send_mail = Boolean.parseBoolean(sysParameter.getSysValue());
+                }
                 return ResponseVO.success("添加参数信息成功");
             } else {
                 log.error("添加参数信息失败");
@@ -107,6 +111,9 @@ public class SysParameterController {
         try {
             boolean bo = sysParameterService.updateById(sysParameter);
             if (bo) {
+                if ("useSendMail".equals(sysParameter.getSysKey())){
+                    CacheConstants.use_send_mail = Boolean.parseBoolean(sysParameter.getSysValue());
+                }
                 return ResponseVO.success("修改参数信息成功");
             } else {
                 log.error("修改参数信息失败");
@@ -129,6 +136,10 @@ public class SysParameterController {
             return ResponseVO.fail("id不能为空!");
         }
         try {
+            SysParameter sysParameter = sysParameterService.getById(Integer.parseInt(id));
+            if ("useSendMail".equals(sysParameter.getSysKey())){
+                CacheConstants.use_send_mail = true;
+            }
             boolean bo = sysParameterService.removeById(Integer.parseInt(id));
             if (bo) {
                 return ResponseVO.success("删除参数信息成功");
@@ -164,4 +175,21 @@ public class SysParameterController {
             return ResponseVO.error(null);
         }
     }
+    /**
+     * 获取是否邮箱口令参数
+     *
+     * @return 邮箱口令
+     */
+    @GetMapping(value = "/getUseSendMail")
+    @InterfaceLimit
+    public ResponseVO getUseSendMail() {
+        try {
+            String useSendMail = sysParameterService.queryByKey("useSendMail", "true");
+            return ResponseVO.success(useSendMail);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获取邮箱口令参数异常");
+            return ResponseVO.error(null);
+        }
+    }
 }

+ 336 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysRoleController.java

@@ -0,0 +1,336 @@
+package com.jiayue.ssi.controller;
+
+import cn.hutool.core.lang.Validator;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jiayue.ssi.annotation.InterfaceLimit;
+
+import com.jiayue.ssi.entity.SysParameter;
+import com.jiayue.ssi.entity.SysRole;
+
+import com.jiayue.ssi.entity.SysUser;
+import com.jiayue.ssi.service.SysRoleService;
+import com.jiayue.ssi.util.ResponseVO;
+import com.jiayue.ssi.util.SecurityContextUtil;
+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.*;
+
+
+/**
+ * 角色接口
+ *
+ * @author xsl
+ * @since 2023/03/21
+ */
+@RestController
+@RequestMapping("/sysRoleController")
+@Slf4j
+public class SysRoleController {
+    @Autowired
+    SysRoleService roleService;
+//
+//    @Autowired
+//    private TokenService tokenService;
+//
+//    @Autowired
+//    private SysPermissionService permissionService;
+//
+//    @Autowired
+//    private ISysUserService userService;
+//
+//    @Autowired
+//    private ISysDeptService deptService;
+
+
+
+    /**
+     * 获取参数分页信息
+     *
+     * @return 参数信息
+     */
+    //    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping(value = "/getAll")
+    @InterfaceLimit
+    public ResponseVO getAll(Integer currentPage, Integer pageSize,String roleName,String status, String roleKey) {
+        try {
+            QueryWrapper<SysRole> wrapper = new QueryWrapper<>();
+            if (StringUtils.isNotEmpty(roleName)) {
+                wrapper.like("role_name", roleName);
+            }
+            if (StringUtils.isNotEmpty(status)) {
+                wrapper.eq("status", status);
+            }
+            if (StringUtils.isNotEmpty(roleKey)) {
+                wrapper.like("role_key", roleKey);
+            }
+            Page<SysRole> result = roleService.page(new Page<>(currentPage, pageSize), wrapper);
+            return ResponseVO.success(result);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获取参数异常");
+            return ResponseVO.error(null);
+        }
+    }
+
+    /**
+     * 新增角色
+     *
+     * @param role 角色
+     * @return 执行结果
+     */
+    @InterfaceLimit
+    @PostMapping()
+    public ResponseVO add(@RequestBody SysRole role) {
+        try {
+            ///////加校验/////
+            role.setCreateBy(SecurityContextUtil.getSysUser().getUsername());
+            int i = roleService.insertRole(role);
+            if (i>0) {
+                return ResponseVO.success("添加角色成功");
+            } else {
+                log.error("添加角色失败");
+                return ResponseVO.fail("添加角色失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("添加角色异常");
+            return ResponseVO.error(e);
+        }
+    }
+
+    /**
+     * 更新角色
+     *
+     * @param role 参数
+     * @return 执行结果
+     */
+    @PutMapping
+    public ResponseVO update(@RequestBody SysRole role) {
+        SysRole existRole = roleService.getById(role.getRoleId());
+        if (existRole == null) {
+            return ResponseVO.fail("非法访问不能修改!");
+        }
+///////加校验/////
+        try {
+            if (roleService.updateRole(role)>0) {
+                return ResponseVO.success("修改用户信息成功");
+            } else {
+                log.error("修改用户信息失败");
+                return ResponseVO.fail("修改用户信息失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("修改用户信息异常");
+            return ResponseVO.error(e);
+        }
+    }
+
+    /**
+     * 根据角色编号获取详细信息
+     */
+    @GetMapping(value = "getInfo")
+    public ResponseVO getInfo(Long roleId)
+    {
+        return ResponseVO.success(roleService.selectRoleById(roleId));
+    }
+
+//    @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;
+//    }
+}

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

@@ -52,7 +52,7 @@ public class UserLoginController {
      * @throws IOException
      */
     @GetMapping("/getVerifyCode")
-    @InterfaceLimit(value = 2,time = 1000)
+    @InterfaceLimit(value = 5,time = 1000)
     public ResponseVO getVerifyCode(HttpServletResponse httpServletResponse) throws IOException {
         // gif类型
         // GifCaptcha captcha = new GifCaptcha(130, 48);

+ 3 - 0
backend/src/main/java/com/jiayue/ssi/entity/SysMenu.java

@@ -9,6 +9,8 @@ import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
@@ -23,6 +25,7 @@ public class SysMenu extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
     /** 菜单ID */
+    @TableId(type = IdType.AUTO)
     private Long menuId;
 
     /** 菜单名称 */

+ 53 - 0
backend/src/main/java/com/jiayue/ssi/entity/SysRole.java

@@ -0,0 +1,53 @@
+package com.jiayue.ssi.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.Set;
+
+/**
+ * 角色表
+ *
+ * @author xsl
+ * @version 3.0
+ */
+@Data
+public class SysRole extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 角色ID */
+    @TableId(type = IdType.AUTO)
+    private Long roleId;
+
+    /** 角色名称 */
+    private String roleName;
+
+    /** 角色权限 */
+    private String roleKey;
+
+    /** 角色排序 */
+    private Integer roleSort;
+
+    /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */
+    private String dataScope;
+
+    /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */
+    private boolean menuCheckStrictly;
+
+    /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */
+    private boolean deptCheckStrictly;
+
+    /** 角色状态(0正常 1停用) */
+    private String status;
+
+    /** 菜单组 */
+    @TableField(exist = false)
+    private Long[] menuIds;
+}

+ 48 - 0
backend/src/main/java/com/jiayue/ssi/entity/SysRoleMenu.java

@@ -0,0 +1,48 @@
+package com.jiayue.ssi.entity;
+
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 角色表
+ *
+ * @author xsl
+ * @version 3.0
+ */
+@Data
+public class SysRoleMenu extends BaseEntity {
+    /** 角色ID */
+    private Long roleId;
+
+    /** 菜单ID */
+    private Long menuId;
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public Long getMenuId()
+    {
+        return menuId;
+    }
+
+    public void setMenuId(Long menuId)
+    {
+        this.menuId = menuId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("roleId", getRoleId())
+            .append("menuId", getMenuId())
+            .toString();
+    }
+}

+ 76 - 0
backend/src/main/java/com/jiayue/ssi/entity/TreeSelect.java

@@ -0,0 +1,76 @@
+package com.jiayue.ssi.entity;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Treeselect树结构实体类
+ *
+ * @author ruoyi
+ */
+public class TreeSelect implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 节点ID */
+    private Long id;
+
+    /** 节点名称 */
+    private String label;
+
+    /** 子节点 */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<TreeSelect> children;
+
+    public TreeSelect()
+    {
+
+    }
+
+//    public TreeSelect(SysDept dept)
+//    {
+//        this.id = dept.getDeptId();
+//        this.label = dept.getDeptName();
+//        this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+//    }
+
+    public TreeSelect(SysMenu menu)
+    {
+        this.id = menu.getMenuId();
+        this.label = menu.getMenuName();
+        this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public String getLabel()
+    {
+        return label;
+    }
+
+    public void setLabel(String label)
+    {
+        this.label = label;
+    }
+
+    public List<TreeSelect> getChildren()
+    {
+        return children;
+    }
+
+    public void setChildren(List<TreeSelect> children)
+    {
+        this.children = children;
+    }
+}

+ 3 - 3
backend/src/main/java/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.java

@@ -25,9 +25,9 @@ import com.jiayue.ssi.util.JwtTokenUtil;
 import lombok.RequiredArgsConstructor;
 
 /**
- * @description:
- * @author: yh
- * @create: 2020-03-19 13:05
+ * jwt过滤器
+ * @author xsl
+ * @since 2023/02/20
  **/
 @Component
 @Order(10)

+ 40 - 36
backend/src/main/java/com/jiayue/ssi/filter/MailCodeFilter.java

@@ -27,47 +27,51 @@ import lombok.RequiredArgsConstructor;
 public class MailCodeFilter extends OncePerRequestFilter {
     private String defaultFilterProcessUrl = "/user/login";
 
+
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
         if ("POST".equalsIgnoreCase(request.getMethod()) && defaultFilterProcessUrl.equals(request.getServletPath())) {
-            // 验证码验证
-            String username = request.getParameter("username");
-            Object mailCode = LocalCache.get(CacheConstants.MAIL_CODE_KEY + username);
+            // 是否需要邮箱口令验证
+            if (CacheConstants.use_send_mail) {
+                // 验证码验证
+                String username = request.getParameter("username");
+                Object mailCode = LocalCache.get(CacheConstants.MAIL_CODE_KEY + username);
 
-            // 校验服务端验证码
-            if (mailCode==null || "".equals(mailCode)){
-                response.addHeader("Access-Control-Allow-Origin", "*");
-                response.setContentType("text/html;charset=UTF-8");
-                response.setStatus(401);
-                response.getWriter().write("邮箱口令无效,需要重新获取!");
-                return;
-            }
-            // 页面录入的邮箱口令
-            String mailbox = request.getParameter("mailbox");
+                // 校验服务端验证码
+                if (mailCode == null || "".equals(mailCode)) {
+                    response.addHeader("Access-Control-Allow-Origin", "*");
+                    response.setContentType("text/html;charset=UTF-8");
+                    response.setStatus(401);
+                    response.getWriter().write("邮箱口令无效,需要重新获取!");
+                    return;
+                }
+                // 页面录入的邮箱口令
+                String mailbox = request.getParameter("mailbox");
 
-            // 校验页面验证码
-            if (StringUtils.isEmpty(mailbox)) {
-                response.addHeader("Access-Control-Allow-Origin", "*");
-                response.setContentType("text/html;charset=UTF-8");
-                response.setStatus(401);
-                response.getWriter().write("非法访问,邮箱口令错误!");
-                return;
-            }
-            if (mailbox.length()!=6){
-                response.addHeader("Access-Control-Allow-Origin", "*");
-                response.setContentType("text/html;charset=UTF-8");
-                response.setStatus(401);
-                response.getWriter().write("需要6位邮箱口令!");
-                return;
-            }
-            if (!String.valueOf(mailCode).toLowerCase().equals(mailbox.toLowerCase())) {
-                // 删除缓存邮箱口令
-                LocalCache.remove(CacheConstants.MAIL_CODE_KEY + username);
-                response.addHeader("Access-Control-Allow-Origin", "*");
-                response.setContentType("text/html;charset=UTF-8");
-                response.setStatus(401);
-                response.getWriter().write("邮箱口令错误!");
-                return;
+                // 校验页面验证码
+                if (StringUtils.isEmpty(mailbox)) {
+                    response.addHeader("Access-Control-Allow-Origin", "*");
+                    response.setContentType("text/html;charset=UTF-8");
+                    response.setStatus(401);
+                    response.getWriter().write("非法访问,邮箱口令错误!");
+                    return;
+                }
+                if (mailbox.length() != 6) {
+                    response.addHeader("Access-Control-Allow-Origin", "*");
+                    response.setContentType("text/html;charset=UTF-8");
+                    response.setStatus(401);
+                    response.getWriter().write("需要6位邮箱口令!");
+                    return;
+                }
+                if (!String.valueOf(mailCode).toLowerCase().equals(mailbox.toLowerCase())) {
+                    // 删除缓存邮箱口令
+                    LocalCache.remove(CacheConstants.MAIL_CODE_KEY + username);
+                    response.addHeader("Access-Control-Allow-Origin", "*");
+                    response.setContentType("text/html;charset=UTF-8");
+                    response.setStatus(401);
+                    response.getWriter().write("邮箱口令错误!");
+                    return;
+                }
             }
         }
         filterChain.doFilter(request, response);

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

@@ -0,0 +1,124 @@
+package com.jiayue.ssi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ssi.entity.SysRole;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 角色表 数据层
+ *
+ * @author ruoyi
+ */
+@Mapper
+public interface SysRoleMapper extends BaseMapper<SysRole> {
+    /**
+     * 新增角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    public int insertRole(SysRole role);
+    /**
+     * 通过角色ID查询角色
+     *
+     * @param roleId 角色ID
+     * @return 角色对象信息
+     */
+    public SysRole selectRoleById(Long roleId);
+//    /**
+//     * 根据条件分页查询角色数据
+//     *
+//     * @param role 角色信息
+//     * @return 角色数据集合信息
+//     */
+//    public List<SysRole> selectRoleList(SysRole role);
+//
+//    /**
+//     * 根据用户ID查询角色
+//     *
+//     * @param userId 用户ID
+//     * @return 角色列表
+//     */
+//    public List<SysRole> selectRolePermissionByUserId(Long userId);
+//
+//    /**
+//     * 查询所有角色
+//     *
+//     * @return 角色列表
+//     */
+//    public List<SysRole> selectRoleAll();
+//
+//    /**
+//     * 根据用户ID获取角色选择框列表
+//     *
+//     * @param userId 用户ID
+//     * @return 选中角色ID列表
+//     */
+//    public List<Long> selectRoleListByUserId(Long userId);
+//
+//    /**
+//     * 通过角色ID查询角色
+//     *
+//     * @param roleId 角色ID
+//     * @return 角色对象信息
+//     */
+//    public SysRole selectRoleById(Long roleId);
+//
+//    /**
+//     * 根据用户ID查询角色
+//     *
+//     * @param userName 用户名
+//     * @return 角色列表
+//     */
+//    public List<SysRole> selectRolesByUserName(String userName);
+//
+//    /**
+//     * 校验角色名称是否唯一
+//     *
+//     * @param roleName 角色名称
+//     * @return 角色信息
+//     */
+//    public SysRole checkRoleNameUnique(String roleName);
+//
+//    /**
+//     * 校验角色权限是否唯一
+//     *
+//     * @param roleKey 角色权限
+//     * @return 角色信息
+//     */
+//    public SysRole checkRoleKeyUnique(String roleKey);
+//
+//    /**
+//     * 修改角色信息
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    public int updateRole(SysRole role);
+//
+//    /**
+//     * 新增角色信息
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    public int insertRole(SysRole role);
+//
+//    /**
+//     * 通过角色ID删除角色
+//     *
+//     * @param roleId 角色ID
+//     * @return 结果
+//     */
+//    public int deleteRoleById(Long roleId);
+//
+//    /**
+//     * 批量删除角色信息
+//     *
+//     * @param roleIds 需要删除的角色ID
+//     * @return 结果
+//     */
+//    public int deleteRoleByIds(Long[] roleIds);
+}

+ 48 - 0
backend/src/main/java/com/jiayue/ssi/mapper/SysRoleMenuMapper.java

@@ -0,0 +1,48 @@
+package com.jiayue.ssi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ssi.entity.SysRole;
+import com.jiayue.ssi.entity.SysRoleMenu;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 角色与菜单关联表 数据层
+ *
+ * @author ruoyi
+ */
+@Mapper
+public interface SysRoleMenuMapper extends BaseMapper<SysRole> {
+    /**
+     * 查询菜单使用数量
+     *
+     * @param menuId 菜单ID
+     * @return 结果
+     */
+    public int checkMenuExistRole(Long menuId);
+
+    /**
+     * 通过角色ID删除角色和菜单关联
+     *
+     * @param roleId 角色ID
+     * @return 结果
+     */
+    public int deleteRoleMenuByRoleId(String update_by,Long roleId);
+
+    /**
+     * 批量删除角色菜单关联信息
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteRoleMenu(Long[] ids);
+
+    /**
+     * 批量新增角色菜单信息
+     *
+     * @param roleMenuList 角色菜单列表
+     * @return 结果
+     */
+    public int batchRoleMenu(List<SysRoleMenu> roleMenuList);
+}

+ 29 - 0
backend/src/main/java/com/jiayue/ssi/service/SysMenuService.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.jiayue.ssi.entity.SysMenu;
 import com.jiayue.ssi.entity.SysParameter;
+import com.jiayue.ssi.entity.TreeSelect;
 import com.jiayue.ssi.entity.vo.RouterVo;
 
 /**
@@ -76,4 +77,32 @@ public interface SysMenuService  extends IService<SysMenu> {
      * @return 结果
      */
     int deleteMenuById(Long menuId);
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param menus 菜单列表
+     * @return 下拉树结构列表
+     */
+    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param menus 菜单列表
+     * @return 树结构列表
+     */
+    public List<SysMenu> buildMenuTree(List<SysMenu> menus);
+    /**
+     * 根据用户查询系统菜单列表
+     *
+     * @param userId 用户ID
+     * @return 菜单列表
+     */
+    List<SysMenu> selectMenuList(Integer userId);
+    /**
+     * 根据角色ID查询菜单树信息
+     *
+     * @param roleId 角色ID
+     * @return 选中菜单列表
+     */
+    public List<Long> selectMenuListByRoleId(Long roleId);
 }

+ 170 - 0
backend/src/main/java/com/jiayue/ssi/service/SysRoleService.java

@@ -0,0 +1,170 @@
+package com.jiayue.ssi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ssi.entity.SysRole;
+
+/**
+ * 角色业务层
+ *
+ * @author ruoyi
+ */
+public interface SysRoleService extends IService<SysRole> {
+//    /**
+//     * 根据条件分页查询角色数据
+//     *
+//     * @param role 角色信息
+//     * @return 角色数据集合信息
+//     */
+//    public List<SysRole> selectRoleList(SysRole role);
+//
+//    /**
+//     * 根据用户ID查询角色列表
+//     *
+//     * @param userId 用户ID
+//     * @return 角色列表
+//     */
+//    public List<SysRole> selectRolesByUserId(Long userId);
+//
+//    /**
+//     * 根据用户ID查询角色权限
+//     *
+//     * @param userId 用户ID
+//     * @return 权限列表
+//     */
+//    public Set<String> selectRolePermissionByUserId(Long userId);
+//
+//    /**
+//     * 查询所有角色
+//     *
+//     * @return 角色列表
+//     */
+//    public List<SysRole> selectRoleAll();
+//
+//    /**
+//     * 根据用户ID获取角色选择框列表
+//     *
+//     * @param userId 用户ID
+//     * @return 选中角色ID列表
+//     */
+//    public List<Long> selectRoleListByUserId(Long userId);
+//
+    /**
+     * 通过角色ID查询角色
+     *
+     * @param roleId 角色ID
+     * @return 角色对象信息
+     */
+    public SysRole selectRoleById(Long roleId);
+//
+//    /**
+//     * 校验角色名称是否唯一
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    public String checkRoleNameUnique(SysRole role);
+//
+//    /**
+//     * 校验角色权限是否唯一
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    public String checkRoleKeyUnique(SysRole role);
+//
+//    /**
+//     * 校验角色是否允许操作
+//     *
+//     * @param role 角色信息
+//     */
+//    public void checkRoleAllowed(SysRole role);
+//
+//    /**
+//     * 校验角色是否有数据权限
+//     *
+//     * @param roleId 角色id
+//     */
+//    public void checkRoleDataScope(Long roleId);
+//
+//    /**
+//     * 通过角色ID查询角色使用数量
+//     *
+//     * @param roleId 角色ID
+//     * @return 结果
+//     */
+//    public int countUserRoleByRoleId(Long roleId);
+//
+    /**
+     * 新增保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    public int insertRole(SysRole role);
+//
+    /**
+     * 修改保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    public int updateRole(SysRole role);
+//
+//    /**
+//     * 修改角色状态
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    public int updateRoleStatus(SysRole role);
+//
+//    /**
+//     * 修改数据权限信息
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    public int authDataScope(SysRole role);
+//
+//    /**
+//     * 通过角色ID删除角色
+//     *
+//     * @param roleId 角色ID
+//     * @return 结果
+//     */
+//    public int deleteRoleById(Long roleId);
+//
+//    /**
+//     * 批量删除角色信息
+//     *
+//     * @param roleIds 需要删除的角色ID
+//     * @return 结果
+//     */
+//    public int deleteRoleByIds(Long[] roleIds);
+//
+//    /**
+//     * 取消授权用户角色
+//     *
+//     * @param userRole 用户和角色关联信息
+//     * @return 结果
+//     */
+//    public int deleteAuthUser(SysUserRole userRole);
+//
+//    /**
+//     * 批量取消授权用户角色
+//     *
+//     * @param roleId 角色ID
+//     * @param userIds 需要取消授权的用户数据ID
+//     * @return 结果
+//     */
+//    public int deleteAuthUsers(Long roleId, Long[] userIds);
+//
+//    /**
+//     * 批量选择授权用户角色
+//     *
+//     * @param roleId 角色ID
+//     * @param userIds 需要删除的用户数据ID
+//     * @return 结果
+//     */
+//    public int insertAuthUsers(Long roleId, Long[] userIds);
+}

+ 71 - 1
backend/src/main/java/com/jiayue/ssi/service/impl/SysMenuServiceImpl.java

@@ -1,14 +1,18 @@
 package com.jiayue.ssi.service.impl;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jiayue.ssi.constant.Constants;
 import com.jiayue.ssi.constant.UserConstants;
 import com.jiayue.ssi.entity.SysMenu;
+import com.jiayue.ssi.entity.SysRole;
+import com.jiayue.ssi.entity.TreeSelect;
 import com.jiayue.ssi.entity.vo.MetaVo;
 import com.jiayue.ssi.entity.vo.RouterVo;
 import com.jiayue.ssi.mapper.SysMenuMapper;
+import com.jiayue.ssi.mapper.SysRoleMapper;
 import com.jiayue.ssi.service.SysMenuService;
 import com.jiayue.ssi.util.SecurityContextUtil;
 import com.jiayue.ssi.util.RyStringUtils;
@@ -26,6 +30,9 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
 
     @Autowired
     SysMenuMapper menuMapper;
+    @Autowired
+    SysRoleMapper roleMapper;
+
 
     /**
      * 构建前端路由所需要的菜单
@@ -291,7 +298,6 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
      */
     @Override
     public int insertMenu(SysMenu menu) {
-        menu.setCreateBy(SecurityContextUtil.getSysUser().getUsername());
         return menuMapper.insertMenu(menu);
     }
 
@@ -352,4 +358,68 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
     public int deleteMenuById(Long menuId) {
         return menuMapper.deleteMenuById(SecurityContextUtil.getSysUser().getUsername(),menuId);
     }
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param menus 菜单列表
+     * @return 下拉树结构列表
+     */
+    @Override
+    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus)
+    {
+        List<SysMenu> menuTrees = buildMenuTree(menus);
+        return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param menus 菜单列表
+     * @return 树结构列表
+     */
+    @Override
+    public List<SysMenu> buildMenuTree(List<SysMenu> menus)
+    {
+        List<SysMenu> returnList = new ArrayList<SysMenu>();
+        List<Long> tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList());
+        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();)
+        {
+            SysMenu menu = (SysMenu) iterator.next();
+            // 如果是顶级节点, 遍历该父节点的所有子节点
+            if (!tempList.contains(menu.getParentId()))
+            {
+                recursionFn(menus, menu);
+                returnList.add(menu);
+            }
+        }
+        if (returnList.isEmpty())
+        {
+            returnList = menus;
+        }
+        return returnList;
+    }
+    /**
+     * 根据用户查询系统菜单列表
+     *
+     * @param userId 用户ID
+     * @return 菜单列表
+     */
+    @Override
+    public List<SysMenu> selectMenuList(Integer userId)
+    {
+        return selectMenuList(new SysMenu(), userId);
+    }
+    /**
+     * 根据角色ID查询菜单树信息
+     *
+     * @param roleId 角色ID
+     * @return 选中菜单列表
+     */
+    @Override
+    public List<Long> selectMenuListByRoleId(Long roleId)
+    {
+        SysRole role = roleMapper.selectRoleById(roleId);
+        return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
+    }
 }

+ 483 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/SysRoleServiceImpl.java

@@ -0,0 +1,483 @@
+package com.jiayue.ssi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ssi.entity.SysRole;
+
+import com.jiayue.ssi.entity.SysRoleMenu;
+import com.jiayue.ssi.mapper.SysRoleMapper;
+
+import com.jiayue.ssi.mapper.SysRoleMenuMapper;
+import com.jiayue.ssi.service.SysRoleService;
+
+import com.jiayue.ssi.util.SecurityContextUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 角色 业务层处理
+ *
+ * @author ruoyi
+ */
+@Service
+public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
+    @Autowired
+    SysRoleMapper roleMapper;
+    @Autowired
+    SysRoleMenuMapper roleMenuMapper;
+
+
+    /**
+     * 新增保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int insertRole(SysRole role)
+    {
+        // 新增角色信息
+        roleMapper.insertRole(role);
+        return insertRoleMenu(role);
+    }
+
+
+    /**
+     * 新增角色菜单信息
+     *
+     * @param role 角色对象
+     */
+    public int insertRoleMenu(SysRole role)
+    {
+        int rows = 1;
+        // 新增用户与角色管理
+        List<SysRoleMenu> list = new ArrayList<SysRoleMenu>();
+        for (Long menuId : role.getMenuIds())
+        {
+            SysRoleMenu rm = new SysRoleMenu();
+            rm.setRoleId(role.getRoleId());
+            rm.setMenuId(menuId);
+            rm.setDelFlag("0");
+            rm.setCreateBy(SecurityContextUtil.getSysUser().getCreateBy());
+            rm.setCreateTime(new Date());
+            list.add(rm);
+        }
+        if (list.size() > 0)
+        {
+            rows = roleMenuMapper.batchRoleMenu(list);
+        }
+        return rows;
+    }
+
+
+//    @Autowired
+//    SysRoleMapper sysRoleMapper;
+
+//    @Autowired
+//    private SysRoleMenuMapper roleMenuMapper;
+//
+//    @Autowired
+//    private SysUserRoleMapper userRoleMapper;
+//
+//    @Autowired
+//    private SysRoleDeptMapper roleDeptMapper;
+
+    /**
+     * 根据条件分页查询角色数据
+     *
+     * @param role 角色信息
+     * @return 角色数据集合信息
+     */
+//    @Override
+//    @DataScope(deptAlias = "d")
+//    public List<SysRole> selectRoleList(SysRole role)
+//    {
+//        return roleMapper.selectRoleList(role);
+//    }
+//
+//    /**
+//     * 根据用户ID查询角色
+//     *
+//     * @param userId 用户ID
+//     * @return 角色列表
+//     */
+//    @Override
+//    public List<SysRole> selectRolesByUserId(Long userId)
+//    {
+//        List<SysRole> userRoles = roleMapper.selectRolePermissionByUserId(userId);
+//        List<SysRole> roles = selectRoleAll();
+//        for (SysRole role : roles)
+//        {
+//            for (SysRole userRole : userRoles)
+//            {
+//                if (role.getRoleId().longValue() == userRole.getRoleId().longValue())
+//                {
+//                    role.setFlag(true);
+//                    break;
+//                }
+//            }
+//        }
+//        return roles;
+//    }
+//
+//    /**
+//     * 根据用户ID查询权限
+//     *
+//     * @param userId 用户ID
+//     * @return 权限列表
+//     */
+//    @Override
+//    public Set<String> selectRolePermissionByUserId(Long userId)
+//    {
+//        List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId);
+//        Set<String> permsSet = new HashSet<>();
+//        for (SysRole perm : perms)
+//        {
+//            if (StringUtils.isNotNull(perm))
+//            {
+//                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
+//            }
+//        }
+//        return permsSet;
+//    }
+//
+//    /**
+//     * 查询所有角色
+//     *
+//     * @return 角色列表
+//     */
+//    @Override
+//    public List<SysRole> selectRoleAll()
+//    {
+//        return SpringUtils.getAopProxy(this).selectRoleList(new SysRole());
+//    }
+//
+//    /**
+//     * 根据用户ID获取角色选择框列表
+//     *
+//     * @param userId 用户ID
+//     * @return 选中角色ID列表
+//     */
+//    @Override
+//    public List<Long> selectRoleListByUserId(Long userId)
+//    {
+//        return roleMapper.selectRoleListByUserId(userId);
+//    }
+//
+    /**
+     * 通过角色ID查询角色
+     *
+     * @param roleId 角色ID
+     * @return 角色对象信息
+     */
+    @Override
+    public SysRole selectRoleById(Long roleId)
+    {
+        return this.getById(roleId);
+    }
+    /**
+     * 修改保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int updateRole(SysRole role)
+    {
+        // 修改角色信息
+        this.updateById(role);
+        // 删除角色与菜单关联
+        roleMenuMapper.deleteRoleMenuByRoleId(SecurityContextUtil.getSysUser().getUsername(),role.getRoleId());
+        return insertRoleMenu(role);
+    }
+//
+//    /**
+//     * 校验角色名称是否唯一
+//     *
+//     * @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 角色信息
+//     */
+//    @Override
+//    public void checkRoleAllowed(SysRole role)
+//    {
+//        if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin())
+//        {
+//            throw new ServiceException("不允许操作超级管理员角色");
+//        }
+//    }
+//
+//    /**
+//     * 校验角色是否有数据权限
+//     *
+//     * @param roleId 角色id
+//     */
+//    @Override
+//    public void checkRoleDataScope(Long roleId)
+//    {
+//        if (!SysUser.isAdmin(SecurityUtils.getUserId()))
+//        {
+//            SysRole role = new SysRole();
+//            role.setRoleId(roleId);
+//            List<SysRole> roles = SpringUtils.getAopProxy(this).selectRoleList(role);
+//            if (StringUtils.isEmpty(roles))
+//            {
+//                throw new ServiceException("没有权限访问角色数据!");
+//            }
+//        }
+//    }
+//
+//    /**
+//     * 通过角色ID查询角色使用数量
+//     *
+//     * @param roleId 角色ID
+//     * @return 结果
+//     */
+//    @Override
+//    public int countUserRoleByRoleId(Long roleId)
+//    {
+//        return userRoleMapper.countUserRoleByRoleId(roleId);
+//    }
+//
+//    /**
+//     * 新增保存角色信息
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    @Override
+//    @Transactional
+//    public int insertRole(SysRole role)
+//    {
+//        // 新增角色信息
+//        roleMapper.insertRole(role);
+//        return insertRoleMenu(role);
+//    }
+//
+//    /**
+//     * 修改保存角色信息
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    @Override
+//    @Transactional
+//    public int updateRole(SysRole role)
+//    {
+//        // 修改角色信息
+//        roleMapper.updateRole(role);
+//        // 删除角色与菜单关联
+//        roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId());
+//        return insertRoleMenu(role);
+//    }
+//
+//    /**
+//     * 修改角色状态
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    @Override
+//    public int updateRoleStatus(SysRole role)
+//    {
+//        return roleMapper.updateRole(role);
+//    }
+//
+//    /**
+//     * 修改数据权限信息
+//     *
+//     * @param role 角色信息
+//     * @return 结果
+//     */
+//    @Override
+//    @Transactional
+//    public int authDataScope(SysRole role)
+//    {
+//        // 修改角色信息
+//        roleMapper.updateRole(role);
+//        // 删除角色与部门关联
+//        roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId());
+//        // 新增角色和部门信息(数据权限)
+//        return insertRoleDept(role);
+//    }
+//
+//    /**
+//     * 新增角色菜单信息
+//     *
+//     * @param role 角色对象
+//     */
+//    public int insertRoleMenu(SysRole role)
+//    {
+//        int rows = 1;
+//        // 新增用户与角色管理
+//        List<SysRoleMenu> list = new ArrayList<SysRoleMenu>();
+//        for (Long menuId : role.getMenuIds())
+//        {
+//            SysRoleMenu rm = new SysRoleMenu();
+//            rm.setRoleId(role.getRoleId());
+//            rm.setMenuId(menuId);
+//            list.add(rm);
+//        }
+//        if (list.size() > 0)
+//        {
+//            rows = roleMenuMapper.batchRoleMenu(list);
+//        }
+//        return rows;
+//    }
+//
+//    /**
+//     * 新增角色部门信息(数据权限)
+//     *
+//     * @param role 角色对象
+//     */
+//    public int insertRoleDept(SysRole role)
+//    {
+//        int rows = 1;
+//        // 新增角色与部门(数据权限)管理
+//        List<SysRoleDept> list = new ArrayList<SysRoleDept>();
+//        for (Long deptId : role.getDeptIds())
+//        {
+//            SysRoleDept rd = new SysRoleDept();
+//            rd.setRoleId(role.getRoleId());
+//            rd.setDeptId(deptId);
+//            list.add(rd);
+//        }
+//        if (list.size() > 0)
+//        {
+//            rows = roleDeptMapper.batchRoleDept(list);
+//        }
+//        return rows;
+//    }
+//
+//    /**
+//     * 通过角色ID删除角色
+//     *
+//     * @param roleId 角色ID
+//     * @return 结果
+//     */
+//    @Override
+//    @Transactional
+//    public int deleteRoleById(Long roleId)
+//    {
+//        // 删除角色与菜单关联
+//        roleMenuMapper.deleteRoleMenuByRoleId(roleId);
+//        // 删除角色与部门关联
+//        roleDeptMapper.deleteRoleDeptByRoleId(roleId);
+//        return roleMapper.deleteRoleById(roleId);
+//    }
+//
+//    /**
+//     * 批量删除角色信息
+//     *
+//     * @param roleIds 需要删除的角色ID
+//     * @return 结果
+//     */
+//    @Override
+//    @Transactional
+//    public int deleteRoleByIds(Long[] roleIds)
+//    {
+//        for (Long roleId : roleIds)
+//        {
+//            checkRoleAllowed(new SysRole(roleId));
+//            checkRoleDataScope(roleId);
+//            SysRole role = selectRoleById(roleId);
+//            if (countUserRoleByRoleId(roleId) > 0)
+//            {
+//                throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName()));
+//            }
+//        }
+//        // 删除角色与菜单关联
+//        roleMenuMapper.deleteRoleMenu(roleIds);
+//        // 删除角色与部门关联
+//        roleDeptMapper.deleteRoleDept(roleIds);
+//        return roleMapper.deleteRoleByIds(roleIds);
+//    }
+//
+//    /**
+//     * 取消授权用户角色
+//     *
+//     * @param userRole 用户和角色关联信息
+//     * @return 结果
+//     */
+//    @Override
+//    public int deleteAuthUser(SysUserRole userRole)
+//    {
+//        return userRoleMapper.deleteUserRoleInfo(userRole);
+//    }
+//
+//    /**
+//     * 批量取消授权用户角色
+//     *
+//     * @param roleId 角色ID
+//     * @param userIds 需要取消授权的用户数据ID
+//     * @return 结果
+//     */
+//    @Override
+//    public int deleteAuthUsers(Long roleId, Long[] userIds)
+//    {
+//        return userRoleMapper.deleteUserRoleInfos(roleId, userIds);
+//    }
+//
+//    /**
+//     * 批量选择授权用户角色
+//     *
+//     * @param roleId 角色ID
+//     * @param userIds 需要授权的用户数据ID
+//     * @return 结果
+//     */
+//    @Override
+//    public int insertAuthUsers(Long roleId, Long[] userIds)
+//    {
+//        // 新增用户与角色管理
+//        List<SysUserRole> list = new ArrayList<SysUserRole>();
+//        for (Long userId : userIds)
+//        {
+//            SysUserRole ur = new SysUserRole();
+//            ur.setUserId(userId);
+//            ur.setRoleId(roleId);
+//            list.add(ur);
+//        }
+//        return userRoleMapper.batchUserRole(list);
+//    }
+}

+ 154 - 0
backend/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jiayue.ssi.mapper.SysRoleMapper">
+
+	<resultMap type="SysRole" id="SysRoleResult">
+		<id     property="roleId"             column="role_id"               />
+		<result property="roleName"           column="role_name"             />
+		<result property="roleKey"            column="role_key"              />
+		<result property="roleSort"           column="role_sort"             />
+		<result property="dataScope"          column="data_scope"            />
+		<result property="menuCheckStrictly"  column="menu_check_strictly"   />
+		<result property="deptCheckStrictly"  column="dept_check_strictly"   />
+		<result property="status"             column="status"                />
+		<result property="delFlag"            column="del_flag"              />
+		<result property="createBy"           column="create_by"             />
+		<result property="createTime"         column="create_time"           />
+		<result property="updateBy"           column="update_by"             />
+		<result property="updateTime"         column="update_time"           />
+		<result property="remark"             column="remark"                />
+	</resultMap>
+
+	<sql id="selectRoleVo">
+	    select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly,
+            r.status, r.del_flag, r.create_time, r.remark
+        from sys_role r
+-- 	        left join sys_user_role ur on ur.role_id = r.role_id
+-- 	        left join sys_user u on u.user_id = ur.user_id
+-- 	        left join sys_dept d on u.dept_id = d.dept_id
+    </sql>
+
+    <select id="selectRoleList" parameterType="SysRole" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		where r.del_flag = '0'
+		<if test="roleId != null and roleId != 0">
+			AND r.role_id = #{roleId}
+		</if>
+		<if test="roleName != null and roleName != ''">
+			AND r.role_name like concat('%', #{roleName}, '%')
+		</if>
+		<if test="status != null and status != ''">
+			AND r.status = #{status}
+		</if>
+		<if test="roleKey != null and roleKey != ''">
+			AND r.role_key like concat('%', #{roleKey}, '%')
+		</if>
+		<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
+			and date_format(r.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
+		</if>
+		<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
+			and date_format(r.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
+		</if>
+		<!-- 数据范围过滤 -->
+		${params.dataScope}
+		order by r.role_sort
+	</select>
+
+	<select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		WHERE r.del_flag = '0' and ur.user_id = #{userId}
+	</select>
+
+	<select id="selectRoleAll" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+	</select>
+
+	<select id="selectRoleListByUserId" parameterType="Long" resultType="Long">
+		select r.role_id
+        from sys_role r
+	        left join sys_user_role ur on ur.role_id = r.role_id
+	        left join sys_user u on u.user_id = ur.user_id
+	    where u.user_id = #{userId}
+	</select>
+
+	<select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		where r.role_id = #{roleId}
+	</select>
+
+	<select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		WHERE r.del_flag = '0' and u.user_name = #{userName}
+	</select>
+
+	<select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		 where r.role_name=#{roleName} and r.del_flag = '0' limit 1
+	</select>
+
+	<select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		 where r.role_key=#{roleKey} and r.del_flag = '0' limit 1
+	</select>
+
+ 	<insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId">
+ 		insert into sys_role(
+ 			<if test="roleId != null and roleId != 0">role_id,</if>
+ 			<if test="roleName != null and roleName != ''">role_name,</if>
+ 			<if test="roleKey != null and roleKey != ''">role_key,</if>
+ 			<if test="roleSort != null">role_sort,</if>
+ 			<if test="dataScope != null and dataScope != ''">data_scope,</if>
+ 			<if test="menuCheckStrictly != null">menu_check_strictly,</if>
+ 			<if test="deptCheckStrictly != null">dept_check_strictly,</if>
+ 			<if test="status != null and status != ''">status,</if>
+ 			<if test="remark != null and remark != ''">remark,</if>
+ 			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			create_time,
+			del_flag
+ 		)values(
+ 			<if test="roleId != null and roleId != 0">#{roleId},</if>
+ 			<if test="roleName != null and roleName != ''">#{roleName},</if>
+ 			<if test="roleKey != null and roleKey != ''">#{roleKey},</if>
+ 			<if test="roleSort != null">#{roleSort},</if>
+ 			<if test="dataScope != null and dataScope != ''">#{dataScope},</if>
+ 			<if test="menuCheckStrictly != null">#{menuCheckStrictly},</if>
+ 			<if test="deptCheckStrictly != null">#{deptCheckStrictly},</if>
+ 			<if test="status != null and status != ''">#{status},</if>
+ 			<if test="remark != null and remark != ''">#{remark},</if>
+ 			<if test="createBy != null and createBy != ''">#{createBy},</if>
+ 			sysdate(),
+ 		    0
+ 		)
+	</insert>
+
+	<update id="updateRole" parameterType="SysRole">
+ 		update sys_role
+ 		<set>
+ 			<if test="roleName != null and roleName != ''">role_name = #{roleName},</if>
+ 			<if test="roleKey != null and roleKey != ''">role_key = #{roleKey},</if>
+ 			<if test="roleSort != null">role_sort = #{roleSort},</if>
+ 			<if test="dataScope != null and dataScope != ''">data_scope = #{dataScope},</if>
+ 			<if test="menuCheckStrictly != null">menu_check_strictly = #{menuCheckStrictly},</if>
+ 			<if test="deptCheckStrictly != null">dept_check_strictly = #{deptCheckStrictly},</if>
+ 			<if test="status != null and status != ''">status = #{status},</if>
+ 			<if test="remark != null">remark = #{remark},</if>
+ 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+ 			update_time = sysdate()
+ 		</set>
+ 		where role_id = #{roleId} and del_flag=0
+	</update>
+
+	<delete id="deleteRoleById" parameterType="Long">
+ 		update sys_role set del_flag = '2' where role_id = #{roleId}
+ 	</delete>
+
+ 	<delete id="deleteRoleByIds" parameterType="Long">
+ 	    update sys_role set del_flag = '2' where role_id in
+ 		<foreach collection="array" item="roleId" open="(" separator="," close=")">
+ 			#{roleId}
+        </foreach>
+ 	</delete>
+
+</mapper>

+ 34 - 0
backend/src/main/resources/mapper/system/SysRoleMenuMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jiayue.ssi.mapper.SysRoleMenuMapper">
+
+	<resultMap type="SysRoleMenu" id="SysRoleMenuResult">
+		<result property="roleId"     column="role_id"      />
+		<result property="menuId"     column="menu_id"      />
+	</resultMap>
+
+	<select id="checkMenuExistRole" resultType="Integer">
+	    select count(1) from sys_role_menu where menu_id = #{menuId}
+	</select>
+
+	<delete id="deleteRoleMenuByRoleId">
+		update sys_role_menu set del_flag=1,update_by=#{update_by},update_time=sysdate() where role_id=#{roleId} and del_flag=0
+	</delete>
+
+	<delete id="deleteRoleMenu" parameterType="Long">
+ 		delete from sys_role_menu where role_id in
+ 		<foreach collection="array" item="roleId" open="(" separator="," close=")">
+ 			#{roleId}
+        </foreach>
+ 	</delete>
+
+	<insert id="batchRoleMenu">
+		insert into sys_role_menu(role_id, menu_id,del_flag,create_by,create_time) values
+		<foreach item="item" index="index" collection="list" separator=",">
+			(#{item.roleId},#{item.menuId},#{item.delFlag},#{item.createBy},#{item.createTime})
+		</foreach>
+	</insert>
+
+</mapper>

+ 17 - 2
ui/src/views/login/index.vue

@@ -46,7 +46,7 @@
         </div>
       </el-form-item>
 
-      <el-form-item prop="mailbox">
+      <el-form-item prop="mailbox" v-if="useSendMail">
         <el-input
           v-model="loginForm.mailbox"
           auto-complete="off"
@@ -98,6 +98,8 @@ export default {
         mailbox: ''
       },
       verifyuuid: '',
+      // 是否使用邮箱口令
+      useSendMail:false,
       // 是否已经发送了验证码
       isMailSend: false,
       // 计时器对象
@@ -138,6 +140,19 @@ export default {
       immediate: true
     }
   },
+  created(){
+    // 获取是否邮箱口令
+    this.$axios.get('/sysParameterController/getUseSendMail').then((res) => {
+      this.useSendMail = JSON.parse(res.data)
+    }).catch((error) => {
+      // 登录失败刷新验证码
+      this.updateCaptcha()
+      this.loginForm.verifyCode = ''
+      this.loginForm.mailbox = ''
+      this.reset()
+      this.loading = false
+    })
+  },
   mounted() {
     this.getCaptcha()
   },
@@ -236,7 +251,7 @@ export default {
             username: this.loginForm.username,
             password: this.loginForm.password,
             code: this.loginForm.verifyCode,
-            verifyuuid: this.loginForm.verifyuuid,
+            verifyuuid: this.verifyuuid,
             mailbox: this.loginForm.mailbox
           }
           this.$axios.post('/user/login', param).then((res) => {

+ 53 - 49
ui/src/views/sysManager/roleManager/index.vue

@@ -57,7 +57,6 @@
           plain
           icon="el-icon-edit"
           size="mini"
-          :disabled="single"
           @click="handleUpdate"
         >修改
         </el-button>
@@ -68,7 +67,6 @@
           plain
           icon="el-icon-delete"
           size="mini"
-          :disabled="multiple"
           @click="handleDelete"
         >删除
         </el-button>
@@ -384,17 +382,17 @@ export default {
     },
     /** 根据角色ID查询菜单树结构 */
     getRoleMenuTreeselect(roleId) {
-      return roleMenuTreeselect(roleId).then(response => {
-        this.menuOptions = response.menus;
-        return response;
-      });
-    },
-    /** 根据角色ID查询部门树结构 */
-    getDeptTree(roleId) {
-      return deptTreeSelect(roleId).then(response => {
-        this.deptOptions = response.depts;
-        return response;
-      });
+      var param = {
+        roleId: roleId
+      }
+      this.$axios.get('/sysMenuController/roleMenuTreeselect',
+        {params: param}).then((res) => {
+          console.log(res.data)
+        this.menuOptions = res.data.menus;
+        return res.data
+      }).catch((error) => {
+        // this.$message.error('获取数据出错' + error)
+      })
     },
     // 角色状态修改
     handleStatusChange(row) {
@@ -459,9 +457,6 @@ export default {
     // 更多操作触发
     handleCommand(command, row) {
       switch (command) {
-        case "handleDataScope":
-          this.handleDataScope(row);
-          break;
         case "handleAuthUser":
           this.handleAuthUser(row);
           break;
@@ -507,47 +502,45 @@ export default {
       this.title = "添加角色";
     }, 500),
     /** 修改按钮操作 */
-    handleUpdate(row) {
+    handleUpdate:debounce(function () {
       this.reset();
-      const roleId = row.roleId || this.ids
-      const roleMenu = this.getRoleMenuTreeselect(roleId);
-      getRole(roleId).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.$nextTick(() => {
-          roleMenu.then(res => {
-            let checkedKeys = res.checkedKeys
+      const _selectData = this.$refs.xTable.getRadioRecord(true)
+      if (_selectData == null) {
+        this.$message({
+          type: 'warning',
+          message: '请选择记录!'
+        });
+        return
+      }
+      const roleId = _selectData.roleId
+      // const roleMenu = this.getRoleMenuTreeselect(roleId);
+        var param = {
+          roleId: roleId
+        }
+        this.$axios.get('/sysRoleController/getInfo',
+          {params: param}).then((res2) => {
+          this.form = res2.data;
+          this.open = true;
+          this.$axios.get('/sysMenuController/roleMenuTreeselect',
+            {params: param}).then((res) => {
+            this.menuOptions = res.data.menus;
+            let checkedKeys = res.data.checkedKeys
+            console.log(checkedKeys)
             checkedKeys.forEach((v) => {
               this.$nextTick(() => {
                 this.$refs.menu.setChecked(v, true, false);
               })
             })
-          });
-        });
+          })
+        })
         this.title = "修改角色";
-      });
-    },
+    }, 500),
     /** 选择角色权限范围触发 */
     dataScopeSelectChange(value) {
       if (value !== '2') {
         this.$refs.dept.setCheckedKeys([]);
       }
     },
-    /** 分配数据权限操作 */
-    handleDataScope(row) {
-      this.reset();
-      const deptTreeSelect = this.getDeptTree(row.roleId);
-      getRole(row.roleId).then(response => {
-        this.form = response.data;
-        this.openDataScope = true;
-        this.$nextTick(() => {
-          deptTreeSelect.then(res => {
-            this.$refs.dept.setCheckedKeys(res.checkedKeys);
-          });
-        });
-        this.title = "分配数据权限";
-      });
-    },
     /** 分配用户操作 */
     handleAuthUser: function (row) {
       const roleId = row.roleId;
@@ -559,11 +552,22 @@ export default {
         if (valid) {
           if (this.form.roleId != undefined) {
             this.form.menuIds = this.getMenuAllCheckedKeys();
-            updateRole(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
+            // 更新操作
+            this.$axios.put('/sysRoleController', this.form).then((res) => {
+              if (res.code == 0) {
+                this.$message.success('修改成功')
+                this.open = false;
+                this.reset();
+                this.getList();
+              }
+              if (res.code == 1) {
+                this.$message.error(res.data)
+              }
+              this.loading = false
+            }).catch((error) => {
+              // this.$message.error(error)
+              this.loading = false
+            })
           } else {
             this.form.menuIds = this.getMenuAllCheckedKeys();