yangdamao 2 years ago
parent
commit
f9566d5957
77 changed files with 5684 additions and 37 deletions
  1. 135 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysConfigController.java
  2. 163 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDeptController.java
  3. 169 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysMenuController.java
  4. 192 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysRoleController.java
  5. 22 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysRoleMenuController.java
  6. 285 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserController.java
  7. 21 0
      zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserRoleController.java
  8. 0 4
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/TopSysUser.java
  9. 79 6
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TokenService.java
  10. 67 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopSysPermissionService.java
  11. 1 4
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopUserDetailsServiceImpl.java
  12. 53 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysConfigAddBo.java
  13. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysConfigEditBo.java
  14. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysConfigQueryBo.java
  15. 62 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysDeptAddBo.java
  16. 66 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysDeptEditBo.java
  17. 63 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysDeptQueryBo.java
  18. 74 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysMenuAddBo.java
  19. 85 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysMenuEditBo.java
  20. 75 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysMenuQueryBo.java
  21. 62 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleAddBo.java
  22. 66 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleEditBo.java
  23. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleMenuAddBo.java
  24. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleMenuEditBo.java
  25. 39 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleMenuQueryBo.java
  26. 60 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleQueryBo.java
  27. 21 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysUserRoleAddBo.java
  28. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysUserRoleEditBo.java
  29. 34 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysUserRoleQueryBo.java
  30. 55 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysConfig.java
  31. 60 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysDept.java
  32. 67 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysMenu.java
  33. 53 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysPost.java
  34. 102 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysRole.java
  35. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysRoleDept.java
  36. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysRoleMenu.java
  37. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysUserPost.java
  38. 31 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysUserRole.java
  39. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysConfigMapper.java
  40. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysDeptMapper.java
  41. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysMenuMapper.java
  42. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysPostMapper.java
  43. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysRoleDeptMapper.java
  44. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysRoleMapper.java
  45. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysRoleMenuMapper.java
  46. 24 3
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysUserMapper.java
  47. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysUserPostMapper.java
  48. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysUserRoleMapper.java
  49. 80 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysConfigService.java
  50. 113 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysDeptService.java
  51. 144 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysMenuService.java
  52. 103 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysPostService.java
  53. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysRoleMenuService.java
  54. 133 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysRoleService.java
  55. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysUserRoleService.java
  56. 85 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysUserService.java
  57. 233 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysConfigServiceImpl.java
  58. 313 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysDeptServiceImpl.java
  59. 434 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysMenuServiceImpl.java
  60. 175 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysPostServiceImpl.java
  61. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysRoleMenuServiceImpl.java
  62. 325 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysRoleServiceImpl.java
  63. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysUserRoleServiceImpl.java
  64. 234 15
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysUserServiceImpl.java
  65. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysConfigVo.java
  66. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysDeptVo.java
  67. 79 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysMenuVo.java
  68. 27 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysRoleMenuVo.java
  69. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysRoleVo.java
  70. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysUserRoleVo.java
  71. 22 0
      zhongzheng-system/src/main/resources/mapper/modules/top/TopSysConfigMapper.xml
  72. 25 0
      zhongzheng-system/src/main/resources/mapper/modules/top/TopSysDeptMapper.xml
  73. 29 0
      zhongzheng-system/src/main/resources/mapper/modules/top/TopSysMenuMapper.xml
  74. 59 0
      zhongzheng-system/src/main/resources/mapper/modules/top/TopSysRoleMapper.xml
  75. 13 0
      zhongzheng-system/src/main/resources/mapper/modules/top/TopSysRoleMenuMapper.xml
  76. 64 3
      zhongzheng-system/src/main/resources/mapper/modules/top/TopSysUserMapper.xml
  77. 13 0
      zhongzheng-system/src/main/resources/mapper/modules/top/TopSysUserRoleMapper.xml

+ 135 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysConfigController.java

@@ -0,0 +1,135 @@
+package com.zhongzheng.controller.top;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.modules.system.vo.SysConfigVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/top/config")
+public class TopSysConfigController extends BaseController {
+    @Autowired
+    private ISysConfigService configService;
+
+    /**
+     * 获取参数配置列表
+     */
+    @ApiOperation("配置列表")
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysConfigVo config)
+    {
+        startPage();
+        List<SysConfigVo> list = configService.selectConfigList(config);
+        return getDataTable(list);
+    }
+
+    /*@Log(title = "参数管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:config:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysConfig config)
+    {
+        List<SysConfig> list = configService.selectConfigList(config);
+        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
+        return util.exportExcel(list, "参数数据");
+    }*/
+
+    /**
+     * 根据参数编号获取详细信息
+     */
+    @ApiOperation("通过ID配置详情")
+    @PreAuthorize("@ss.hasPermi('system:config:query')")
+    @GetMapping(value = "/{configId}")
+    public AjaxResult getInfo(@PathVariable Long configId)
+    {
+        return AjaxResult.success(configService.selectConfigById(configId));
+    }
+
+    /**
+     * 根据参数键名查询参数值
+     */
+    @ApiOperation("通过KEY获取配置详情")
+    @GetMapping(value = "/configKey/{configKey}")
+    public AjaxResult getConfigKey(@PathVariable String configKey)
+    {
+        return AjaxResult.success("配置内容",configService.selectConfigByKey(configKey));
+    }
+
+    /**
+     * 新增参数配置
+     */
+    @ApiOperation("新增配置")
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
+    @Log(title = "参数管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    @RepeatSubmit
+    public AjaxResult add(@Validated @RequestBody SysConfigVo config)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
+        {
+            return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        config.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(configService.insertConfig(config));
+    }
+
+    /**
+     * 修改参数配置
+     */
+    @ApiOperation("修改配置")
+    @PreAuthorize("@ss.hasPermi('system:config:edit')")
+    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysConfigVo config)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
+        {
+            return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        config.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(configService.updateConfig(config));
+    }
+
+    /**
+     * 删除参数配置
+     */
+    @ApiOperation("删除配置")
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "参数管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{configIds}")
+    public AjaxResult remove(@PathVariable Long[] configIds)
+    {
+        return toAjax(configService.deleteConfigByIds(configIds));
+    }
+
+    /**
+     * 清空缓存
+     */
+    @ApiOperation("刷新配置缓存")
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clearCache")
+    public AjaxResult clearCache()
+    {
+        configService.clearCache();
+        return AjaxResult.success();
+    }
+}

+ 163 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysDeptController.java

@@ -0,0 +1,163 @@
+package com.zhongzheng.controller.top;
+
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.core.controller.BaseController;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * 部门Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "部门控制器", tags = {"部门管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/top/dept")
+public class TopSysDeptController extends BaseController {
+    @Autowired
+    private ISysDeptService deptService;
+
+    /**
+     * 获取部门列表
+     */
+    @ApiOperation("部门列表")
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list")
+    public AjaxResult list(SysDept dept)
+    {
+        List<SysDept> depts = deptService.selectDeptList(dept);
+        return AjaxResult.success(depts);
+    }
+
+    /**
+     * 查询部门列表(排除节点)
+     */
+    @ApiOperation("查询部门列表(节点)")
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list/exclude/{deptId}")
+    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
+    {
+        List<SysDept> depts = deptService.selectDeptList(new SysDept());
+        Iterator<SysDept> it = depts.iterator();
+        while (it.hasNext())
+        {
+            SysDept d = (SysDept) it.next();
+            if (d.getDeptId().intValue() == deptId
+                    || ArrayUtils.contains(StrUtil.split(d.getAncestors(), ","), deptId + ""))
+            {
+                it.remove();
+            }
+        }
+        return AjaxResult.success(depts);
+    }
+
+    /**
+     * 根据部门编号获取详细信息
+     */
+    @ApiOperation("根据部门编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:dept:query')")
+    @GetMapping(value = "/{deptId}")
+    public AjaxResult getInfo(@PathVariable Long deptId)
+    {
+        return AjaxResult.success(deptService.selectDeptById(deptId));
+    }
+
+    /**
+     * 获取部门下拉树列表
+     */
+    @ApiOperation("获取部门下拉树列表")
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(SysDept dept)
+    {
+        List<SysDept> depts = deptService.selectDeptList(dept);
+        return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
+    }
+
+    /**
+     * 加载对应角色部门列表树
+     */
+    @ApiOperation("加载对应角色部门列表树")
+    @GetMapping(value = "/roleDeptTreeselect/{roleId}")
+    public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId)
+    {
+        List<SysDept> depts = deptService.selectDeptList(new SysDept());
+        Map<String,Object> map = new HashMap<>();
+        map.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
+        map.put("depts", deptService.buildDeptTreeSelect(depts));
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 新增部门
+     */
+    @ApiOperation("新增部门")
+    @ApiOperationSupport(includeParameters = {"deptName","parentId","orderNum","status"})
+    @PreAuthorize("@ss.hasPermi('system:dept:add')")
+    @Log(title = "部门管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysDept dept)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
+        {
+            return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        }
+        dept.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(deptService.insertDept(dept));
+    }
+
+    /**
+     * 修改部门
+     */
+    @ApiOperation("修改部门")
+    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
+    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody SysDept dept)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
+        {
+            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        }
+        else if (dept.getParentId().equals(dept.getDeptId()))
+        {
+            return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
+        }
+        else if (StrUtil.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
+                && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0)
+        {
+            return AjaxResult.error("该部门包含未停用的子部门!");
+        }
+        dept.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(deptService.updateDept(dept));
+    }
+
+    /**
+     * 删除部门
+     */
+    @ApiOperation("删除部门")
+    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
+    @Log(title = "部门管理", businessType = BusinessType.DELETE)
+    @PostMapping("/delete")
+    public AjaxResult remove(@PathVariable Long deptId)
+    {
+        if (deptService.hasChildByDeptId(deptId))
+        {
+            return AjaxResult.error("存在下级部门,不允许删除");
+        }
+        if (deptService.checkDeptExistUser(deptId))
+        {
+            return AjaxResult.error("部门存在用户,不允许删除");
+        }
+        return toAjax(deptService.deleteDeptById(deptId));
+    }
+}

+ 169 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysMenuController.java

@@ -0,0 +1,169 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.util.StrUtil;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.entity.SysMenu;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.system.service.ISysMenuService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/top/menu")
+public class TopSysMenuController extends BaseController {
+    @Autowired
+    private ISysMenuService menuService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 获取菜单列表
+     */
+    @ApiOperation("获取菜单列表")
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
+    @GetMapping("/list")
+    public AjaxResult list(SysMenu menu)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        List<SysMenu> menus = menuService.selectMenuList(menu, userId);
+        return AjaxResult.success(menus);
+    }
+
+    /**
+     * 根据菜单编号获取详细信息
+     */
+    @ApiOperation("根据菜单编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:menu:query')")
+    @GetMapping(value = "/{menuId}")
+    public AjaxResult getInfo(@PathVariable Long menuId)
+    {
+        return AjaxResult.success(menuService.selectMenuById(menuId));
+    }
+
+    /**
+     * 获取菜单下拉树列表
+     */
+    @ApiOperation("获取菜单下拉树列表")
+    @ApiOperationSupport(includeParameters = {})
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(SysMenu menu)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        List<SysMenu> menus = menuService.selectMenuList(menu, userId);
+        return AjaxResult.success(menuService.buildMenuTreeSelect(menus));
+    }
+
+    /**
+     * 加载对应角色菜单列表树
+     */
+    @ApiOperation("加载对应角色菜单列表树")
+    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
+    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        List<SysMenu> menus = menuService.selectMenuList(loginUser.getUser().getUserId());
+        AjaxResult ajax = AjaxResult.success();
+        ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
+        ajax.put("menus", menuService.buildMenuTreeSelect(menus));
+        return ajax;
+    }
+
+    /**
+     * 新增菜单
+     */
+    @ApiOperation("新增菜单")
+    @ApiOperationSupport(ignoreParameters = {"children","createBy","createTime","menuId","params"
+            ,"parentName","remark","updateBy","updateTime"})
+    @PreAuthorize("@ss.hasPermi('system:menu:add')")
+    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysMenu menu)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
+        {
+            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        }
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
+                && !StrUtil.startWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
+        {
+            return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
+        }
+        menu.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(menuService.insertMenu(menu));
+    }
+
+    /**
+     * 修改菜单
+     */
+    @ApiOperation("修改菜单")
+    @ApiOperationSupport(ignoreParameters = {"children","createBy","createTime","params"
+            ,"parentName","remark","updateBy","updateTime"})
+    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
+    @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody SysMenu menu)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
+        {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        }
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
+                && !StrUtil.startWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
+        {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
+        }
+        else if (menu.getMenuId().equals(menu.getParentId()))
+        {
+            return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
+        }
+        menu.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(menuService.updateMenu(menu));
+    }
+
+    /**
+     * 删除菜单
+     */
+    @ApiOperation("删除菜单")
+    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
+    @Log(title = "菜单管理", businessType = BusinessType.DELETE)
+    @PostMapping("/delete/{menuId}")
+    public AjaxResult remove(@PathVariable Long menuId)
+    {
+        if (menuService.hasChildByMenuId(menuId))
+        {
+            return AjaxResult.error("存在子菜单,不允许删除");
+        }
+        if (menuService.checkMenuExistRole(menuId))
+        {
+            return AjaxResult.error("菜单已分配,不允许删除");
+        }
+        return toAjax(menuService.deleteMenuById(menuId));
+    }
+}

+ 192 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysRoleController.java

@@ -0,0 +1,192 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.lang.Validator;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.entity.SysRole;
+import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.framework.web.service.TopSysPermissionService;
+import com.zhongzheng.modules.top.service.ITopSysRoleService;
+import com.zhongzheng.modules.top.service.ITopSysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 角色信息Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "角色信息控制器", tags = {"角色信息管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/top/role")
+public class TopSysRoleController extends BaseController {
+    @Autowired
+    private ITopSysRoleService topSysRoleService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private TopSysPermissionService topSysPermissionService;
+
+    @Autowired
+    private ITopSysUserService topSysUserService;
+
+    @ApiOperation("角色列表")
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysRole role)
+    {
+        startPage();
+        List<SysRole> list = topSysRoleService.selectRoleList(role);
+        return getDataTable(list);
+    }
+
+    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:role:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysRole role)
+    {
+        List<SysRole> list = topSysRoleService.selectRoleList(role);
+        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
+        return util.exportExcel(list, "角色数据");
+    }
+
+    /**
+     * 根据角色编号获取详细信息
+     */
+    @ApiOperation("根据角色编号获取详细信息")
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping(value = "/{roleId}")
+    public AjaxResult getInfo(@PathVariable Long roleId)
+    {
+        return AjaxResult.success(topSysRoleService.selectRoleById(roleId));
+    }
+
+    /**
+     * 新增角色
+     */
+    @ApiOperation("新增角色")
+    @ApiOperationSupport(ignoreParameters = {"createBy","createTime","dataScope","delFlag","updateTime"
+            ,"flag","params","roleId","updateBy","deptIds","deptCheckStrictly","menuCheckStrictly"})
+    @PreAuthorize("@ss.hasPermi('system:role:add')")
+    @Log(title = "角色管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysRole role)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleNameUnique(role)))
+        {
+            return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleKeyUnique(role)))
+        {
+            return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+        role.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(topSysRoleService.insertRole(role));
+
+    }
+
+    /**
+     * 修改保存角色
+     */
+    @ApiOperation("修改保存角色")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody SysRole role)
+    {
+        topSysRoleService.checkRoleAllowed(role);
+        if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleNameUnique(role)))
+        {
+            return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(topSysRoleService.checkRoleKeyUnique(role)))
+        {
+            return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+        role.setUpdateBy(SecurityUtils.getUsername());
+
+        if (topSysRoleService.updateRole(role) > 0)
+        {
+            // 更新缓存用户权限
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            if (Validator.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
+            {
+                loginUser.setPermissions(topSysPermissionService.getMenuPermission(loginUser.getUser()));
+                loginUser.setUser(topSysUserService.selectUserByUserName(loginUser.getUser().getUserName()));
+                tokenService.setLoginUser(loginUser);
+            }
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
+    }
+
+    /**
+     * 修改保存数据权限
+     */
+    @ApiOperation("修改保存数据权限")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/dataScope")
+    public AjaxResult dataScope(@RequestBody SysRole role)
+    {
+        topSysRoleService.checkRoleAllowed(role);
+        return toAjax(topSysRoleService.authDataScope(role));
+    }
+
+    /**
+     * 状态修改
+     */
+    @ApiOperation("状态修改")
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/changeStatus")
+    public AjaxResult changeStatus(@RequestBody SysRole role)
+    {
+        topSysRoleService.checkRoleAllowed(role);
+        role.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topSysRoleService.updateRoleStatus(role));
+    }
+
+    /**
+     * 删除角色
+     */
+    @ApiOperation("删除角色")
+    @PreAuthorize("@ss.hasPermi('system:role:remove')")
+    @Log(title = "角色管理", businessType = BusinessType.DELETE)
+    @PostMapping("/delete/{roleIds}")
+    public AjaxResult remove(@PathVariable Long[] roleIds)
+    {
+        return toAjax(topSysRoleService.deleteRoleByIds(roleIds));
+    }
+
+    /**
+     * 获取角色选择框列表
+     */
+    @ApiOperation("获取角色选择框列表")
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping("/optionselect")
+    public AjaxResult optionselect()
+    {
+        return AjaxResult.success(topSysRoleService.selectRoleAll());
+    }
+}

+ 22 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysRoleMenuController.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.controller.top;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 【请填写功能名称】Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "【请填写功能名称】控制器", tags = {"【请填写功能名称】管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/top/menu")
+public class TopSysRoleMenuController extends BaseController {
+
+}

+ 285 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserController.java

@@ -0,0 +1,285 @@
+package com.zhongzheng.controller.top;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.zhongzheng.common.annotation.Log;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.bo.SysUserEditBo;
+import com.zhongzheng.common.core.controller.BaseController;
+import com.zhongzheng.common.core.domain.AjaxResult;
+import com.zhongzheng.common.core.domain.entity.TopSysUser;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import com.zhongzheng.common.core.page.TableDataInfo;
+import com.zhongzheng.common.enums.BusinessType;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.ToolsUtils;
+import com.zhongzheng.common.utils.poi.ExcelUtil;
+import com.zhongzheng.framework.web.service.TokenService;
+import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
+import com.zhongzheng.modules.top.domain.TopSysRole;
+import com.zhongzheng.modules.top.service.ITopSysPostService;
+import com.zhongzheng.modules.top.service.ITopSysRoleService;
+import com.zhongzheng.modules.top.service.ITopSysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户信息
+ *
+ * @author zhongzheng
+ */
+@Api(tags ="用户信息管理")
+@RestController
+@RequestMapping("/system/top/user")
+public class TopSysUserController extends BaseController
+{
+    @Autowired
+    private ITopSysUserService topSysUserService;
+
+    @Autowired
+    private ITopSysRoleService topSysRoleService;
+
+    @Autowired
+    private ITopSysPostService topSysPostService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Resource
+    private AuthenticationManager authenticationManager;
+
+    /**
+     * 获取用户列表
+     */
+    @ApiOperation("获取用户列表")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TopSysUser user)
+    {
+        startPage();
+        List<TopSysUser> list = topSysUserService.selectUserList(user);
+        return getDataTable(list);
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
+    @GetMapping("/export")
+    public AjaxResult export(TopSysUser user)
+    {
+        List<TopSysUser> list = topSysUserService.selectUserList(user);
+        ExcelUtil<TopSysUser> util = new ExcelUtil<TopSysUser>(TopSysUser.class);
+        return util.exportExcel(list, "用户数据");
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:import')")
+    @PostMapping("/importData")
+  /*  public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<TopSysUser> util = new ExcelUtil<TopSysUser>(TopSysUser.class);
+        List<TopSysUser> userList = util.importExcel(file.getInputStream());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String operName = loginUser.getUsername();
+        String message = topSysUserService.importUser(userList, updateSupport, operName);
+        return AjaxResult.success(message);
+    }*/
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<TopSysUser> util = new ExcelUtil<TopSysUser>(TopSysUser.class);
+        return util.importTemplateExcel("用户数据");
+    }
+
+    /**
+     * 根据用户编号获取详细信息
+     */
+    @ApiOperation("获取用户详细")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
+    @GetMapping(value = {  "/{userId}" })
+    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
+    {
+        AjaxResult ajax = AjaxResult.success();
+        List<TopSysRole> roles = topSysRoleService.selectRoleAll();
+        TopSysUser sysUser = topSysUserService.selectUserById(userId);
+        ajax.put("roles", TopSysUser.isAdmin(sysUser.getUserId()) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        ajax.put("posts", topSysPostService.selectPostAll());
+        if (Validator.isNotNull(userId))
+        {
+            ajax.put(AjaxResult.DATA_TAG, topSysUserService.selectUserById(userId));
+            ajax.put("postIds", topSysPostService.selectPostListByUserId(userId));
+            ajax.put("roleIds", topSysRoleService.selectRoleListByUserId(userId));
+        }
+        return ajax;
+    }
+
+    /**
+     * 新增用户
+     */
+    @ApiOperation("新增用户")
+    @ApiOperationSupport(ignoreParameters = {"id","orderDate.id"})
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
+    @Log(title = "用户管理", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody TopSysUser user)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(topSysUserService.checkUserNameUnique(user.getUserName())))
+        {
+            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
+        }
+        else if (Validator.isNotEmpty(user.getPhonenumber())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkPhoneUnique(user)))
+        {
+            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
+        }
+        else if (Validator.isNotEmpty(user.getEmail())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkEmailUnique(user)))
+        {
+            return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        }
+        user.setCreateBy(SecurityUtils.getUsername());
+        if(!ToolsUtils.verifPwd(user.getPassword())){
+            throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+        }
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        return toAjax(topSysUserService.insertUser(user));
+    }
+
+    /**
+     * 修改用户
+     */
+    @ApiOperation("更新用户")
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody SysUserEditBo bo)
+    {
+        if (Validator.isNotEmpty(bo.getStatus())&&bo.getStatus().equals(-1)){
+            TopSysUser user = BeanUtil.toBean(bo, TopSysUser.class);
+            int result = topSysUserService.updateUser(user);
+            return toAjax(result);
+        }
+        TopSysUser user = BeanUtil.toBean(bo, TopSysUser.class);
+        topSysUserService.checkUserAllowed(user);
+        TopLoginUser loginUser = tokenService.getTopLoginUser(ServletUtils.getRequest());
+        if(!loginUser.getUser().isAdmin()&& !loginUser.getUser().getUserId().equals(user.getUserId())){
+            return AjaxResult.error("您无权限修改本信息");
+        }
+
+        if (Validator.isNotEmpty(user.getPhonenumber())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkPhoneUnique(user)))
+        {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
+        }
+        else if (Validator.isNotEmpty(user.getEmail())
+                && UserConstants.NOT_UNIQUE.equals(topSysUserService.checkEmailUnique(user)))
+        {
+            return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        }
+        if(Validator.isNotEmpty(user.getPassword())){
+            //重置密码
+            if(!loginUser.getUser().isAdmin()){
+                //普通用户需传入旧密码修改
+                // 旧密码用户验证
+                Authentication authentication = null;
+                try
+                {
+                    // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+                    authentication = authenticationManager
+                            .authenticate(new UsernamePasswordAuthenticationToken(loginUser.getUser().getUserName(), bo.getOldPassword()));
+                }
+                catch (Exception e)
+                {
+                    return AjaxResult.error("旧密码错误");
+                }
+
+            }
+            if(!ToolsUtils.verifPwd(user.getPassword())){
+                throw new CustomException("密码应由8-16位数字、大小写字母、符号组成");
+            }
+            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        }
+        user.setUpdateBy(SecurityUtils.getUsername());
+        int result = topSysUserService.updateUser(user);
+        if(result>0){
+            TopSysUser newUser = topSysUserService.selectUserByUserName(loginUser.getUser().getUserName());
+            //同个用户ID则更新用户信息,admin操作其他用户则不更新
+            if(newUser.getUserId().equals(loginUser.getUser().getUserId())){
+                // 更新缓存用户
+                loginUser.setUser(newUser);
+            }
+            tokenService.setTopLoginUser(loginUser);
+        }
+        return toAjax(result);
+    }
+
+    /**
+     * 删除用户
+     */
+  /*  @ApiOperation("删除用户信息")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
+    @Log(title = "用户管理", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{userIds}")
+    public AjaxResult remove(@PathVariable Long[] userIds)
+    {
+        return toAjax(topSysUserService.deleteUserByIds(userIds));
+    }*/
+
+    /**
+     * 重置密码
+     */
+
+  /*  @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/resetPwd")
+    public AjaxResult resetPwd(@RequestBody TopSysUser user)
+    {
+        topSysUserService.checkUserAllowed(user);
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        user.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topSysUserService.resetPwd(user));
+    }*/
+
+    /**
+     * 状态修改
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public AjaxResult changeStatus(@RequestBody TopSysUser user)
+    {
+        topSysUserService.checkUserAllowed(user);
+        user.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(topSysUserService.updateUserStatus(user));
+    }
+
+    /**
+     * 业务层次获取用户列表
+     */
+    @ApiOperation("业务层次获取用户列表")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/businessPeopleList")
+    public TableDataInfo queryBusinessPeopleList(CourseBusinessQueryBo bo)
+    {
+        startPage();
+        List<TopSysUser> list = topSysUserService.queryBusinessPeopleList(bo);
+        return getDataTable(list);
+    }
+}

+ 21 - 0
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/top/TopSysUserRoleController.java

@@ -0,0 +1,21 @@
+package com.zhongzheng.controller.top;
+
+import com.zhongzheng.common.core.controller.BaseController;
+import io.swagger.annotations.Api;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 用户和角色关联Controller
+ * 
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Api(value = "用户和角色关联控制器", tags = {"用户和角色关联管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/top/role")
+public class TopSysUserRoleController extends BaseController {
+}

+ 0 - 4
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/TopSysUser.java

@@ -150,10 +150,6 @@ public class TopSysUser implements Serializable
     @TableField(exist = false)
     private Long[] postIds;
 
-    public TopSysUser(Long userId)
-    {
-        this.userId = userId;
-    }
 
     public boolean isAdmin()
     {

+ 79 - 6
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TokenService.java

@@ -2,13 +2,11 @@ package com.zhongzheng.framework.web.service;
 
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.http.HttpStatus;
 import cn.hutool.http.useragent.UserAgent;
 import cn.hutool.http.useragent.UserAgentUtil;
-import com.alibaba.fastjson.JSON;
 import com.zhongzheng.common.constant.Constants;
-import com.zhongzheng.common.core.domain.AjaxResult;
 import com.zhongzheng.common.core.domain.model.LoginUser;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.core.redis.RedisCache;
 import com.zhongzheng.common.exception.CustomException;
 import com.zhongzheng.common.exception.user.UserPasswordNotMatchException;
@@ -19,12 +17,10 @@ import com.zhongzheng.common.utils.ip.IpUtils;
 import com.zhongzheng.framework.manager.AsyncManager;
 import com.zhongzheng.framework.manager.factory.AsyncFactory;
 import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.ExpiredJwtException;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -33,7 +29,6 @@ import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -97,6 +92,33 @@ public class TokenService
         return null;
     }
 
+    /**
+     * 获取用户身份信息
+     *
+     * @return 用户信息
+     */
+    public TopLoginUser getTopLoginUser(HttpServletRequest request)  {
+        //测试用户
+        String test_token = request.getHeader("X-Auth-Token");
+        if("test".equals(test_token)){
+            return getTestTopUser();
+        }
+        // 获取请求携带的令牌
+        String token = getToken(request);
+        if (Validator.isNotEmpty(token))
+        {
+            String uuid = "";
+            Claims claims = parseToken(token);
+            // 解析对应的权限以及用户信息
+            uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
+            String userKey = getTokenKey(uuid);
+            TopLoginUser user = redisCache.getCacheObject(userKey);
+            return user;
+        }
+
+        return null;
+    }
+
     private LoginUser getTestUser(){
         Authentication authentication = null;
         try
@@ -123,6 +145,32 @@ public class TokenService
         return loginUser;
     }
 
+    private TopLoginUser getTestTopUser(){
+        Authentication authentication = null;
+        try
+        {
+            // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
+            authentication = authenticationManager
+                    .authenticate(new UsernamePasswordAuthenticationToken("admin", "admin123"));
+        }
+        catch (Exception e)
+        {
+            if (e instanceof BadCredentialsException)
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor("admin", Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                throw new UserPasswordNotMatchException();
+            }
+            else
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor("admin", Constants.LOGIN_FAIL, e.getMessage()));
+                throw new CustomException(e.getMessage());
+            }
+        }
+        TopLoginUser loginUser = (TopLoginUser) authentication.getPrincipal();
+        loginUser.setExpireTime(System.currentTimeMillis()+200);
+        return loginUser;
+    }
+
     /**
      * 设置用户身份信息
      */
@@ -134,6 +182,17 @@ public class TokenService
         }
     }
 
+    /**
+     * 设置用户身份信息
+     */
+    public void setTopLoginUser(TopLoginUser loginUser)
+    {
+        if (Validator.isNotNull(loginUser) && Validator.isNotEmpty(loginUser.getToken()))
+        {
+            refreshTopToken(loginUser);
+        }
+    }
+
     /**
      * 删除用户身份信息
      */
@@ -194,6 +253,20 @@ public class TokenService
         redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
     }
 
+    /**
+     * 刷新令牌有效期
+     *
+     * @param loginUser 登录信息
+     */
+    public void refreshTopToken(TopLoginUser loginUser)
+    {
+        loginUser.setLoginTime(System.currentTimeMillis());
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        // 根据uuid将loginUser缓存
+        String userKey = getTokenKey(loginUser.getToken());
+        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+    }
+
     /**
      * 设置用户代理信息
      *

+ 67 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopSysPermissionService.java

@@ -0,0 +1,67 @@
+package com.zhongzheng.framework.web.service;
+
+import com.zhongzheng.common.core.domain.entity.SysUser;
+import com.zhongzheng.modules.top.service.ITopSysMenuService;
+import com.zhongzheng.modules.top.service.ITopSysRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * 用户权限处理
+ *
+ * @author zhongzheng
+ */
+@Component
+public class TopSysPermissionService
+{
+    @Autowired
+    private ITopSysRoleService topSysRoleService;
+
+    @Autowired
+    private ITopSysMenuService topSysMenuService;
+
+    /**
+     * 获取角色数据权限
+     *
+     * @param user 用户信息
+     * @return 角色权限信息
+     */
+    public Set<String> getRolePermission(SysUser user)
+    {
+        Set<String> roles = new HashSet<String>();
+        // 管理员拥有所有权限
+        if (user.isAdmin())
+        {
+            roles.add("admin");
+        }
+        else
+        {
+            roles.addAll(topSysRoleService.selectRolePermissionByUserId(user.getUserId()));
+        }
+        return roles;
+    }
+
+    /**
+     * 获取菜单数据权限
+     *
+     * @param user 用户信息
+     * @return 菜单权限信息
+     */
+    public Set<String> getMenuPermission(SysUser user)
+    {
+        Set<String> perms = new HashSet<String>();
+        // 管理员拥有所有权限
+        if (user.isAdmin())
+        {
+            perms.add("*:*:*");
+        }
+        else
+        {
+            perms.addAll(topSysMenuService.selectMenuPermsByUserId(user.getUserId()));
+        }
+        return perms;
+    }
+}

+ 1 - 4
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/TopUserDetailsServiceImpl.java

@@ -1,13 +1,10 @@
 package com.zhongzheng.framework.web.service;
 
 import cn.hutool.core.lang.Validator;
-import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.entity.TopSysUser;
-import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.domain.model.TopLoginUser;
 import com.zhongzheng.common.enums.UserStatus;
 import com.zhongzheng.common.exception.BaseException;
-import com.zhongzheng.modules.system.service.ISysUserService;
 import com.zhongzheng.modules.top.service.ITopSysUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,7 +35,7 @@ public class TopUserDetailsServiceImpl implements UserDetailsService
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
     {
         //超级管理系统用户
-        TopSysUser super_user = topUserService.selectUserByUserName(username);
+        TopSysUser super_user = topUserService.selectUserByUserNameByName(username);
         if (Validator.isNull(super_user))
         {
             log.info("登录用户:{} 不存在.", username);

+ 53 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysConfigAddBo.java

@@ -0,0 +1,53 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 【请填写功能名称】添加对象 top_sys_config
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】添加对象")
+public class TopSysConfigAddBo {
+
+    /** 参数名称 */
+    @ApiModelProperty("参数名称")
+    private String configName;
+    /** 参数键名 */
+    @ApiModelProperty("参数键名")
+    private String configKey;
+    /** 参数键值 */
+    @ApiModelProperty("参数键值")
+    private String configValue;
+    /** 系统内置(Y是 N否) */
+    @ApiModelProperty("系统内置(Y是 N否)")
+    private String configType;
+    /** 创建者 */
+    @ApiModelProperty("创建者")
+    private String createBy;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+    /** 备注 */
+    @ApiModelProperty("备注")
+    private String remark;
+    /** 配置模块 */
+    @ApiModelProperty("配置模块")
+    private String configModule;
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysConfigEditBo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 【请填写功能名称】编辑对象 top_sys_config
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】编辑对象")
+public class TopSysConfigEditBo {
+
+    /** 参数主键 */
+    @ApiModelProperty("参数主键")
+    private Long configId;
+
+    /** 参数名称 */
+    @ApiModelProperty("参数名称")
+    private String configName;
+
+    /** 参数键名 */
+    @ApiModelProperty("参数键名")
+    private String configKey;
+
+    /** 参数键值 */
+    @ApiModelProperty("参数键值")
+    private String configValue;
+
+    /** 系统内置(Y是 N否) */
+    @ApiModelProperty("系统内置(Y是 N否)")
+    private String configType;
+
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    @ApiModelProperty("备注")
+    private String remark;
+
+    /** 配置模块 */
+    @ApiModelProperty("配置模块")
+    private String configModule;
+
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysConfigQueryBo.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】分页查询对象 top_sys_config
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("【请填写功能名称】分页查询对象")
+public class TopSysConfigQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 参数名称 */
+	@ApiModelProperty("参数名称")
+	private String configName;
+	/** 参数键名 */
+	@ApiModelProperty("参数键名")
+	private String configKey;
+	/** 参数键值 */
+	@ApiModelProperty("参数键值")
+	private String configValue;
+	/** 系统内置(Y是 N否) */
+	@ApiModelProperty("系统内置(Y是 N否)")
+	private String configType;
+	/** 配置模块 */
+	@ApiModelProperty("配置模块")
+	private String configModule;
+}

+ 62 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysDeptAddBo.java

@@ -0,0 +1,62 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 部门添加对象 top_sys_dept
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("部门添加对象")
+public class TopSysDeptAddBo {
+
+    /** 父部门id */
+    @ApiModelProperty("父部门id")
+    private Long parentId;
+    /** 祖级列表 */
+    @ApiModelProperty("祖级列表")
+    private String ancestors;
+    /** 部门名称 */
+    @ApiModelProperty("部门名称")
+    private String deptName;
+    /** 显示顺序 */
+    @ApiModelProperty("显示顺序")
+    private Long orderNum;
+    /** 负责人 */
+    @ApiModelProperty("负责人")
+    private String leader;
+    /** 联系电话 */
+    @ApiModelProperty("联系电话")
+    private String phone;
+    /** 邮箱 */
+    @ApiModelProperty("邮箱")
+    private String email;
+    /** 部门状态(0正常 1停用) */
+    @ApiModelProperty("部门状态(0正常 1停用)")
+    private String status;
+    /** 删除标志(0代表存在 2代表删除) */
+    @ApiModelProperty("删除标志(0代表存在 2代表删除)")
+    private String delFlag;
+    /** 创建者 */
+    @ApiModelProperty("创建者")
+    private String createBy;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+}

+ 66 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysDeptEditBo.java

@@ -0,0 +1,66 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 部门编辑对象 top_sys_dept
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("部门编辑对象")
+public class TopSysDeptEditBo {
+
+    /** 部门id */
+    @ApiModelProperty("部门id")
+    private Long deptId;
+
+    /** 父部门id */
+    @ApiModelProperty("父部门id")
+    private Long parentId;
+
+    /** 祖级列表 */
+    @ApiModelProperty("祖级列表")
+    private String ancestors;
+
+    /** 部门名称 */
+    @ApiModelProperty("部门名称")
+    private String deptName;
+
+    /** 显示顺序 */
+    @ApiModelProperty("显示顺序")
+    private Long orderNum;
+
+    /** 负责人 */
+    @ApiModelProperty("负责人")
+    private String leader;
+
+    /** 联系电话 */
+    @ApiModelProperty("联系电话")
+    private String phone;
+
+    /** 邮箱 */
+    @ApiModelProperty("邮箱")
+    private String email;
+
+    /** 部门状态(0正常 1停用) */
+    @ApiModelProperty("部门状态(0正常 1停用)")
+    private String status;
+
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+
+}

+ 63 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysDeptQueryBo.java

@@ -0,0 +1,63 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 部门分页查询对象 top_sys_dept
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("部门分页查询对象")
+public class TopSysDeptQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 父部门id */
+	@ApiModelProperty("父部门id")
+	private Long parentId;
+	/** 祖级列表 */
+	@ApiModelProperty("祖级列表")
+	private String ancestors;
+	/** 部门名称 */
+	@ApiModelProperty("部门名称")
+	private String deptName;
+	/** 显示顺序 */
+	@ApiModelProperty("显示顺序")
+	private Long orderNum;
+	/** 负责人 */
+	@ApiModelProperty("负责人")
+	private String leader;
+	/** 联系电话 */
+	@ApiModelProperty("联系电话")
+	private String phone;
+	/** 邮箱 */
+	@ApiModelProperty("邮箱")
+	private String email;
+	/** 部门状态(0正常 1停用) */
+	@ApiModelProperty("部门状态(0正常 1停用)")
+	private String status;
+}

+ 74 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysMenuAddBo.java

@@ -0,0 +1,74 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 【请填写功能名称】添加对象 top_sys_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】添加对象")
+public class TopSysMenuAddBo {
+
+    /** 菜单名称 */
+    @ApiModelProperty("菜单名称")
+    private String menuName;
+    /** 父菜单ID */
+    @ApiModelProperty("父菜单ID")
+    private Long parentId;
+    /** 显示顺序 */
+    @ApiModelProperty("显示顺序")
+    private Long orderNum;
+    /** 路由地址 */
+    @ApiModelProperty("路由地址")
+    private String path;
+    /** 组件路径 */
+    @ApiModelProperty("组件路径")
+    private String component;
+    /** 是否为外链(0是 1否) */
+    @ApiModelProperty("是否为外链(0是 1否)")
+    private Long isFrame;
+    /** 是否缓存(0缓存 1不缓存) */
+    @ApiModelProperty("是否缓存(0缓存 1不缓存)")
+    private Long isCache;
+    /** 菜单类型(M目录 C菜单 F按钮) */
+    @ApiModelProperty("菜单类型(M目录 C菜单 F按钮)")
+    private String menuType;
+    /** 菜单状态(1显示 0隐藏) */
+    @ApiModelProperty("菜单状态(1显示 0隐藏)")
+    private String visible;
+    /** 菜单状态(1正常 0停用) */
+    @ApiModelProperty("菜单状态(1正常 0停用)")
+    private String status;
+    /** 权限标识 */
+    @ApiModelProperty("权限标识")
+    private String perms;
+    /** 菜单图标 */
+    @ApiModelProperty("菜单图标")
+    private String icon;
+    /** 创建者 */
+    @ApiModelProperty("创建者")
+    private String createBy;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+    /** 备注 */
+    @ApiModelProperty("备注")
+    private String remark;
+}

+ 85 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysMenuEditBo.java

@@ -0,0 +1,85 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 【请填写功能名称】编辑对象 top_sys_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】编辑对象")
+public class TopSysMenuEditBo {
+
+    /** 菜单ID */
+    @ApiModelProperty("菜单ID")
+    private Long menuId;
+
+    /** 菜单名称 */
+    @ApiModelProperty("菜单名称")
+    private String menuName;
+
+    /** 父菜单ID */
+    @ApiModelProperty("父菜单ID")
+    private Long parentId;
+
+    /** 显示顺序 */
+    @ApiModelProperty("显示顺序")
+    private Long orderNum;
+
+    /** 路由地址 */
+    @ApiModelProperty("路由地址")
+    private String path;
+
+    /** 组件路径 */
+    @ApiModelProperty("组件路径")
+    private String component;
+
+    /** 是否为外链(0是 1否) */
+    @ApiModelProperty("是否为外链(0是 1否)")
+    private Long isFrame;
+
+    /** 是否缓存(0缓存 1不缓存) */
+    @ApiModelProperty("是否缓存(0缓存 1不缓存)")
+    private Long isCache;
+
+    /** 菜单类型(M目录 C菜单 F按钮) */
+    @ApiModelProperty("菜单类型(M目录 C菜单 F按钮)")
+    private String menuType;
+
+    /** 菜单状态(1显示 0隐藏) */
+    @ApiModelProperty("菜单状态(1显示 0隐藏)")
+    private String visible;
+
+    /** 菜单状态(1正常 0停用) */
+    @ApiModelProperty("菜单状态(1正常 0停用)")
+    private String status;
+
+    /** 权限标识 */
+    @ApiModelProperty("权限标识")
+    private String perms;
+
+    /** 菜单图标 */
+    @ApiModelProperty("菜单图标")
+    private String icon;
+
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 75 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysMenuQueryBo.java

@@ -0,0 +1,75 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】分页查询对象 top_sys_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("【请填写功能名称】分页查询对象")
+public class TopSysMenuQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 菜单名称 */
+	@ApiModelProperty("菜单名称")
+	private String menuName;
+	/** 父菜单ID */
+	@ApiModelProperty("父菜单ID")
+	private Long parentId;
+	/** 显示顺序 */
+	@ApiModelProperty("显示顺序")
+	private Long orderNum;
+	/** 路由地址 */
+	@ApiModelProperty("路由地址")
+	private String path;
+	/** 组件路径 */
+	@ApiModelProperty("组件路径")
+	private String component;
+	/** 是否为外链(0是 1否) */
+	@ApiModelProperty("是否为外链(0是 1否)")
+	private Long isFrame;
+	/** 是否缓存(0缓存 1不缓存) */
+	@ApiModelProperty("是否缓存(0缓存 1不缓存)")
+	private Long isCache;
+	/** 菜单类型(M目录 C菜单 F按钮) */
+	@ApiModelProperty("菜单类型(M目录 C菜单 F按钮)")
+	private String menuType;
+	/** 菜单状态(1显示 0隐藏) */
+	@ApiModelProperty("菜单状态(1显示 0隐藏)")
+	private String visible;
+	/** 菜单状态(1正常 0停用) */
+	@ApiModelProperty("菜单状态(1正常 0停用)")
+	private String status;
+	/** 权限标识 */
+	@ApiModelProperty("权限标识")
+	private String perms;
+	/** 菜单图标 */
+	@ApiModelProperty("菜单图标")
+	private String icon;
+}

+ 62 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleAddBo.java

@@ -0,0 +1,62 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 角色信息添加对象 top_sys_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("角色信息添加对象")
+public class TopSysRoleAddBo {
+
+    /** 角色名称 */
+    @ApiModelProperty("角色名称")
+    private String roleName;
+    /** 角色权限字符串 */
+    @ApiModelProperty("角色权限字符串")
+    private String roleKey;
+    /** 显示顺序 */
+    @ApiModelProperty("显示顺序")
+    private Long roleSort;
+    /** 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) */
+    @ApiModelProperty("数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)")
+    private String dataScope;
+    /** 菜单树选择项是否关联显示 */
+    @ApiModelProperty("菜单树选择项是否关联显示")
+    private Integer menuCheckStrictly;
+    /** 部门树选择项是否关联显示 */
+    @ApiModelProperty("部门树选择项是否关联显示")
+    private Integer deptCheckStrictly;
+    /** 角色状态(1正常 0停用) */
+    @ApiModelProperty("角色状态(1正常 0停用)")
+    private String status;
+    /** 删除标志(0代表存在 2代表删除) */
+    @ApiModelProperty("删除标志(0代表存在 2代表删除)")
+    private String delFlag;
+    /** 创建者 */
+    @ApiModelProperty("创建者")
+    private String createBy;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+    /** 备注 */
+    @ApiModelProperty("备注")
+    private String remark;
+}

+ 66 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleEditBo.java

@@ -0,0 +1,66 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 角色信息编辑对象 top_sys_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("角色信息编辑对象")
+public class TopSysRoleEditBo {
+
+    /** 角色ID */
+    @ApiModelProperty("角色ID")
+    private Long roleId;
+
+    /** 角色名称 */
+    @ApiModelProperty("角色名称")
+    private String roleName;
+
+    /** 角色权限字符串 */
+    @ApiModelProperty("角色权限字符串")
+    private String roleKey;
+
+    /** 显示顺序 */
+    @ApiModelProperty("显示顺序")
+    private Long roleSort;
+
+    /** 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) */
+    @ApiModelProperty("数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)")
+    private String dataScope;
+
+    /** 菜单树选择项是否关联显示 */
+    @ApiModelProperty("菜单树选择项是否关联显示")
+    private Integer menuCheckStrictly;
+
+    /** 部门树选择项是否关联显示 */
+    @ApiModelProperty("部门树选择项是否关联显示")
+    private Integer deptCheckStrictly;
+
+    /** 角色状态(1正常 0停用) */
+    @ApiModelProperty("角色状态(1正常 0停用)")
+    private String status;
+
+    /** 更新者 */
+    @ApiModelProperty("更新者")
+    private String updateBy;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    @ApiModelProperty("备注")
+    private String remark;
+
+
+}

+ 21 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleMenuAddBo.java

@@ -0,0 +1,21 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 【请填写功能名称】添加对象 top_sys_role_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】添加对象")
+public class TopSysRoleMenuAddBo {
+
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleMenuEditBo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 【请填写功能名称】编辑对象 top_sys_role_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】编辑对象")
+public class TopSysRoleMenuEditBo {
+
+    /** 角色ID */
+    @ApiModelProperty("角色ID")
+    private Long roleId;
+
+    /** 菜单ID */
+    @ApiModelProperty("菜单ID")
+    private Long menuId;
+
+}

+ 39 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleMenuQueryBo.java

@@ -0,0 +1,39 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 【请填写功能名称】分页查询对象 top_sys_role_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("【请填写功能名称】分页查询对象")
+public class TopSysRoleMenuQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+}

+ 60 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysRoleQueryBo.java

@@ -0,0 +1,60 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 角色信息分页查询对象 top_sys_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("角色信息分页查询对象")
+public class TopSysRoleQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 角色名称 */
+	@ApiModelProperty("角色名称")
+	private String roleName;
+	/** 角色权限字符串 */
+	@ApiModelProperty("角色权限字符串")
+	private String roleKey;
+	/** 显示顺序 */
+	@ApiModelProperty("显示顺序")
+	private Long roleSort;
+	/** 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) */
+	@ApiModelProperty("数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)")
+	private String dataScope;
+	/** 菜单树选择项是否关联显示 */
+	@ApiModelProperty("菜单树选择项是否关联显示")
+	private Integer menuCheckStrictly;
+	/** 部门树选择项是否关联显示 */
+	@ApiModelProperty("部门树选择项是否关联显示")
+	private Integer deptCheckStrictly;
+	/** 角色状态(1正常 0停用) */
+	@ApiModelProperty("角色状态(1正常 0停用)")
+	private String status;
+}

+ 21 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysUserRoleAddBo.java

@@ -0,0 +1,21 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 用户和角色关联添加对象 top_sys_user_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("用户和角色关联添加对象")
+public class TopSysUserRoleAddBo {
+
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysUserRoleEditBo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.top.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 用户和角色关联编辑对象 top_sys_user_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("用户和角色关联编辑对象")
+public class TopSysUserRoleEditBo {
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /** 角色ID */
+    @ApiModelProperty("角色ID")
+    private Long roleId;
+
+}

+ 34 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/bo/TopSysUserRoleQueryBo.java

@@ -0,0 +1,34 @@
+package com.zhongzheng.modules.top.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 用户和角色关联分页查询对象 top_sys_user_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("用户和角色关联分页查询对象")
+public class TopSysUserRoleQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+}

+ 55 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysConfig.java

@@ -0,0 +1,55 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 【请填写功能名称】对象 top_sys_config
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_config")
+public class TopSysConfig implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 参数主键 */
+    @TableId(value = "config_id")
+    private Long configId;
+    /** 参数名称 */
+    private String configName;
+    /** 参数键名 */
+    private String configKey;
+    /** 参数键值 */
+    private String configValue;
+    /** 系统内置(Y是 N否) */
+    private String configType;
+    /** 创建者 */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    /** 更新者 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+    /** 备注 */
+    private String remark;
+    /** 配置模块 */
+    private String configModule;
+}

+ 60 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysDept.java

@@ -0,0 +1,60 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 部门对象 top_sys_dept
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_dept")
+public class TopSysDept implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 部门id */
+    @TableId(value = "dept_id")
+    private Long deptId;
+    /** 父部门id */
+    private Long parentId;
+    /** 祖级列表 */
+    private String ancestors;
+    /** 部门名称 */
+    private String deptName;
+    /** 显示顺序 */
+    private Long orderNum;
+    /** 负责人 */
+    private String leader;
+    /** 联系电话 */
+    private String phone;
+    /** 邮箱 */
+    private String email;
+    /** 部门状态(0正常 1停用) */
+    private String status;
+    /** 删除标志(0代表存在 2代表删除) */
+    @TableLogic
+    private String delFlag;
+    /** 创建者 */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    /** 更新者 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+}

+ 67 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysMenu.java

@@ -0,0 +1,67 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 【请填写功能名称】对象 top_sys_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_menu")
+public class TopSysMenu implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 菜单ID */
+    @TableId(value = "menu_id")
+    private Long menuId;
+    /** 菜单名称 */
+    private String menuName;
+    /** 父菜单ID */
+    private Long parentId;
+    /** 显示顺序 */
+    private Long orderNum;
+    /** 路由地址 */
+    private String path;
+    /** 组件路径 */
+    private String component;
+    /** 是否为外链(0是 1否) */
+    private Long isFrame;
+    /** 是否缓存(0缓存 1不缓存) */
+    private Long isCache;
+    /** 菜单类型(M目录 C菜单 F按钮) */
+    private String menuType;
+    /** 菜单状态(1显示 0隐藏) */
+    private String visible;
+    /** 菜单状态(1正常 0停用) */
+    private String status;
+    /** 权限标识 */
+    private String perms;
+    /** 菜单图标 */
+    private String icon;
+    /** 创建者 */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    /** 更新者 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+    /** 备注 */
+    private String remark;
+}

+ 53 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysPost.java

@@ -0,0 +1,53 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 【请填写功能名称】对象 top_sys_post
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_post")
+public class TopSysPost implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 岗位ID */
+    @TableId(value = "post_id")
+    private Long postId;
+    /** 岗位编码 */
+    private String postCode;
+    /** 岗位名称 */
+    private String postName;
+    /** 显示顺序 */
+    private Long postSort;
+    /** 状态(0正常 1停用) */
+    private String status;
+    /** 创建者 */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    /** 更新者 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+    /** 备注 */
+    private String remark;
+}

+ 102 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysRole.java

@@ -0,0 +1,102 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色信息对象 top_sys_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_role")
+public class TopSysRole implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 角色ID */
+    @TableId(value = "role_id")
+    private Long roleId;
+    /** 角色名称 */
+    private String roleName;
+    /** 角色权限字符串 */
+    private String roleKey;
+    /** 显示顺序 */
+    private Long roleSort;
+    /** 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) */
+    private String dataScope;
+    /** 菜单树选择项是否关联显示 */
+    private Integer menuCheckStrictly;
+    /** 部门树选择项是否关联显示 */
+    private Integer deptCheckStrictly;
+    /** 角色状态(1正常 0停用) */
+    private String status;
+    /** 删除标志(0代表存在 2代表删除) */
+    @TableLogic
+    private String delFlag;
+    /** 创建者 */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    /** 更新者 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+    /** 备注 */
+    private String remark;
+    /**
+     * 请求参数
+     */
+    @TableField(exist = false)
+    private Map<String, Object> params = new HashMap<>();
+
+    /** 用户是否存在此角色标识 默认不存在 */
+    @TableField(exist = false)
+    private boolean flag = false;
+
+    /** 菜单组 */
+    @ApiModelProperty(value ="菜单数组")
+    @TableField(exist = false)
+    private Long[] menuIds;
+
+    /** 部门组(数据权限) */
+    @TableField(exist = false)
+    private Long[] deptIds;
+
+    @TableField(exist = false)
+    private List<String> statusArray;
+    /** 业务层次ID */
+    @TableField(exist = false)
+    private List<Long> businessIds;
+
+    public TopSysRole(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public boolean isAdmin()
+    {
+        return isAdmin(this.roleId);
+    }
+
+    public static boolean isAdmin(Long roleId)
+    {
+        return roleId != null && 1L == roleId;
+    }
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysRoleDept.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 【请填写功能名称】对象 top_sys_role_dept
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_role_dept")
+public class TopSysRoleDept implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 角色ID */
+    @TableId(value = "role_id")
+    private Long roleId;
+    /** 部门ID */
+    @TableId(value = "dept_id")
+    private Long deptId;
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysRoleMenu.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 【请填写功能名称】对象 top_sys_role_menu
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_role_menu")
+public class TopSysRoleMenu implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 角色ID */
+    @TableId(value = "role_id")
+    private Long roleId;
+    /** 菜单ID */
+    @TableId(value = "menu_id")
+    private Long menuId;
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysUserPost.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 【请填写功能名称】对象 top_sys_user_post
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_user_post")
+public class TopSysUserPost implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 用户ID */
+    @TableId(value = "user_id")
+    private Long userId;
+    /** 岗位ID */
+    @TableId(value = "post_id")
+    private Long postId;
+}

+ 31 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/domain/TopSysUserRole.java

@@ -0,0 +1,31 @@
+package com.zhongzheng.modules.top.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 用户和角色关联对象 top_sys_user_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_user_role")
+public class TopSysUserRole implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 用户ID */
+    @TableId(value = "user_id")
+    private Long userId;
+    /** 角色ID */
+    @TableId(value = "role_id")
+    private Long roleId;
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysConfigMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysConfig;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysConfigMapper extends BaseMapper<TopSysConfig> {
+
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysDeptMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysDept;
+
+/**
+ * 部门Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysDeptMapper extends BaseMapper<TopSysDept> {
+
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysMenuMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysMenu;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysMenuMapper extends BaseMapper<TopSysMenu> {
+
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysPostMapper.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.top.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysPost;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysPostMapper extends BaseMapper<TopSysPost> {
+
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysRoleDeptMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysRoleDept;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysRoleDeptMapper extends BaseMapper<TopSysRoleDept> {
+
+}

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysRoleMapper.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.top.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.common.core.domain.entity.SysRole;
+import com.zhongzheng.modules.top.domain.TopSysRole;
+
+import java.util.List;
+
+/**
+ * 角色信息Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+ interface TopSysRoleMapper extends BaseMapper<TopSysRole> {
+
+    /**
+     * 根据用户ID查询角色
+     *
+     * @param userId 用户ID
+     * @return 角色列表
+     */
+     List<SysRole> selectRolePermissionByUserId(Long userId);
+
+
+    /**
+     * 根据用户ID获取角色选择框列表
+     *
+     * @param userId 用户ID
+     * @return 选中角色ID列表
+     */
+     List<Integer> selectRoleListByUserId(Long userId);
+
+    /**
+     * 根据用户ID查询角色
+     *
+     * @param userName 用户名
+     * @return 角色列表
+     */
+     List<SysRole> selectRolesByUserName(String userName);
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysRoleMenuMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysRoleMenu;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysRoleMenuMapper extends BaseMapper<TopSysRoleMenu> {
+
+}

+ 24 - 3
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysUserMapper.java

@@ -1,8 +1,10 @@
 package com.zhongzheng.modules.top.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.entity.TopSysUser;
+import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
+
+import java.util.List;
 
 /**
  * SAAS用户信息Mapper接口
@@ -10,7 +12,7 @@ import com.zhongzheng.common.core.domain.entity.TopSysUser;
  * @author ruoyi
  * @date 2021-08-04
  */
-public interface TopSysUserMapper extends BaseMapper<TopSysUser> {
+interface TopSysUserMapper extends BaseMapper<TopSysUser> {
 
     /**
      * 通过用户名查询用户
@@ -18,6 +20,25 @@ public interface TopSysUserMapper extends BaseMapper<TopSysUser> {
      * @param userName 用户名
      * @return 用户对象信息
      */
-    public TopSysUser selectUserByUserName(String userName);
+    TopSysUser selectUserByUserName(String userName);
+
+    /**
+     * 根据条件分页查询用户列表
+     *
+     * @param sysUser 用户信息
+     * @return 用户信息集合信息
+     */
+    List<TopSysUser> selectUserList(TopSysUser sysUser);
+
+    List<TopSysUser> queryBusinessPeopleList(CourseBusinessQueryBo bo);
+
+
+    /**
+     * 通过用户ID查询用户
+     *
+     * @param userId 用户ID
+     * @return 用户对象信息
+     */
+    TopSysUser selectUserById(Long userId);
 
 }

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysUserPostMapper.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.top.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysUserPost;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysUserPostMapper extends BaseMapper<TopSysUserPost> {
+
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/mapper/TopSysUserRoleMapper.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.top.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.top.domain.TopSysUserRole;
+
+/**
+ * 用户和角色关联Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface TopSysUserRoleMapper extends BaseMapper<TopSysUserRole> {
+
+}

+ 80 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysConfigService.java

@@ -0,0 +1,80 @@
+package com.zhongzheng.modules.top.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.system.domain.SysConfig;
+import com.zhongzheng.modules.system.vo.SysConfigVo;
+import com.zhongzheng.modules.top.domain.TopSysConfig;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface ITopSysConfigService extends IService<TopSysConfig> {
+    /**
+     * 查询参数配置信息
+     *
+     * @param configId 参数配置ID
+     * @return 参数配置信息
+     */
+    public SysConfig selectConfigById(Long configId);
+
+    /**
+     * 根据键名查询参数配置信息
+     *
+     * @param configKey 参数键名
+     * @return 参数键值
+     */
+    public String selectConfigByKey(String configKey);
+
+    public String selectConfigByKeyNoCache(String configKey);
+
+    /**
+     * 查询参数配置列表
+     *
+     * @param config 参数配置信息
+     * @return 参数配置集合
+     */
+    public List<SysConfigVo> selectConfigList(SysConfigVo config);
+
+    /**
+     * 新增参数配置
+     *
+     * @param config 参数配置信息
+     * @return 结果
+     */
+    public int insertConfig(SysConfigVo config);
+
+    /**
+     * 修改参数配置
+     *
+     * @param config 参数配置信息
+     * @return 结果
+     */
+    public int updateConfig(SysConfigVo config);
+
+    /**
+     * 批量删除参数信息
+     *
+     * @param configIds 需要删除的参数ID
+     * @return 结果
+     */
+    public int deleteConfigByIds(Long[] configIds);
+
+    /**
+     * 清空缓存数据
+     */
+    public void clearCache();
+
+    /**
+     * 校验参数键名是否唯一
+     *
+     * @param config 参数信息
+     * @return 结果
+     */
+    public String checkConfigKeyUnique(SysConfigVo config);
+
+    SysConfig getSysConfigByKeyTenant(String key, Long tenantId);
+}

+ 113 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysDeptService.java

@@ -0,0 +1,113 @@
+package com.zhongzheng.modules.top.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.common.core.domain.TreeSelect;
+import com.zhongzheng.common.core.domain.entity.SysDept;
+import com.zhongzheng.modules.top.domain.TopSysDept;
+
+import java.util.List;
+
+/**
+ * 部门Service接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface ITopSysDeptService extends IService<TopSysDept> {
+    /**
+     * 查询部门管理数据
+     *
+     * @param dept 部门信息
+     * @return 部门信息集合
+     */
+    public List<SysDept> selectDeptList(SysDept dept);
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param depts 部门列表
+     * @return 树结构列表
+     */
+    public List<SysDept> buildDeptTree(List<SysDept> depts);
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param depts 部门列表
+     * @return 下拉树结构列表
+     */
+    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts);
+
+    /**
+     * 根据角色ID查询部门树信息
+     *
+     * @param roleId 角色ID
+     * @return 选中部门列表
+     */
+    public List<Integer> selectDeptListByRoleId(Long roleId);
+
+    /**
+     * 根据部门ID查询信息
+     *
+     * @param deptId 部门ID
+     * @return 部门信息
+     */
+    public SysDept selectDeptById(Long deptId);
+
+    /**
+     * 根据ID查询所有子部门(正常状态)
+     *
+     * @param deptId 部门ID
+     * @return 子部门数
+     */
+    public int selectNormalChildrenDeptById(Long deptId);
+
+    /**
+     * 是否存在部门子节点
+     *
+     * @param deptId 部门ID
+     * @return 结果
+     */
+    public boolean hasChildByDeptId(Long deptId);
+
+    /**
+     * 查询部门是否存在用户
+     *
+     * @param deptId 部门ID
+     * @return 结果 true 存在 false 不存在
+     */
+    public boolean checkDeptExistUser(Long deptId);
+
+    /**
+     * 校验部门名称是否唯一
+     *
+     * @param dept 部门信息
+     * @return 结果
+     */
+    public String checkDeptNameUnique(SysDept dept);
+
+    /**
+     * 新增保存部门信息
+     *
+     * @param dept 部门信息
+     * @return 结果
+     */
+    public int insertDept(SysDept dept);
+
+    /**
+     * 修改保存部门信息
+     *
+     * @param dept 部门信息
+     * @return 结果
+     */
+    public int updateDept(SysDept dept);
+
+    /**
+     * 删除部门管理信息
+     *
+     * @param deptId 部门ID
+     * @return 结果
+     */
+    public int deleteDeptById(Long deptId);
+}

+ 144 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysMenuService.java

@@ -0,0 +1,144 @@
+package com.zhongzheng.modules.top.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.common.core.domain.TreeSelect;
+import com.zhongzheng.common.core.domain.entity.SysMenu;
+import com.zhongzheng.modules.system.domain.vo.RouterVo;
+import com.zhongzheng.modules.top.domain.TopSysMenu;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface ITopSysMenuService extends IService<TopSysMenu> {
+    /**
+     * 根据用户查询系统菜单列表
+     *
+     * @param userId 用户ID
+     * @return 菜单列表
+     */
+    public List<SysMenu> selectMenuList(Long userId);
+
+    /**
+     * 根据用户查询系统菜单列表
+     *
+     * @param menu   菜单信息
+     * @param userId 用户ID
+     * @return 菜单列表
+     */
+    public List<SysMenu> selectMenuList(SysMenu menu, Long userId);
+
+    /**
+     * 根据用户ID查询权限
+     *
+     * @param userId 用户ID
+     * @return 权限列表
+     */
+    public Set<String> selectMenuPermsByUserId(Long userId);
+
+    /**
+     * 根据用户ID查询菜单树信息
+     *
+     * @param userId 用户ID
+     * @return 菜单列表
+     */
+    public List<SysMenu> selectMenuTreeByUserId(Long userId);
+
+    /**
+     * 根据角色ID查询菜单树信息
+     *
+     * @param roleId 角色ID
+     * @return 选中菜单列表
+     */
+    public List<Integer> selectMenuListByRoleId(Long roleId);
+
+    /**
+     * 构建前端路由所需要的菜单
+     *
+     * @param menus 菜单列表
+     * @return 路由列表
+     */
+    public List<RouterVo> buildMenus(List<SysMenu> menus);
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param menus 菜单列表
+     * @return 树结构列表
+     */
+    public List<SysMenu> buildMenuTree(List<SysMenu> menus);
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param menus 菜单列表
+     * @return 下拉树结构列表
+     */
+    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);
+
+    /**
+     * 根据菜单ID查询信息
+     *
+     * @param menuId 菜单ID
+     * @return 菜单信息
+     */
+    public SysMenu selectMenuById(Long menuId);
+
+    /**
+     * 是否存在菜单子节点
+     *
+     * @param menuId 菜单ID
+     * @return 结果 true 存在 false 不存在
+     */
+    public boolean hasChildByMenuId(Long menuId);
+
+    /**
+     * 查询菜单是否存在角色
+     *
+     * @param menuId 菜单ID
+     * @return 结果 true 存在 false 不存在
+     */
+    public boolean checkMenuExistRole(Long menuId);
+
+    /**
+     * 新增保存菜单信息
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    public int insertMenu(SysMenu menu);
+
+    /**
+     * 修改保存菜单信息
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    public int updateMenu(SysMenu menu);
+
+    /**
+     * 删除菜单管理信息
+     *
+     * @param menuId 菜单ID
+     * @return 结果
+     */
+    public int deleteMenuById(Long menuId);
+
+    /**
+     * 校验菜单名称是否唯一
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    public String checkMenuNameUnique(SysMenu menu);
+
+    List<SysMenu> listSysMenuByTenant(Long tenantId);
+
+    Integer updateParentById(SysMenu newMenus);
+}

+ 103 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysPostService.java

@@ -0,0 +1,103 @@
+package com.zhongzheng.modules.top.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.system.domain.SysPost;
+import com.zhongzheng.modules.top.domain.TopSysPost;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface ITopSysPostService extends IService<TopSysPost> {
+    /**
+     * 查询岗位信息集合
+     *
+     * @param post 岗位信息
+     * @return 岗位列表
+     */
+    public List<SysPost> selectPostList(SysPost post);
+
+    /**
+     * 查询所有岗位
+     *
+     * @return 岗位列表
+     */
+    public List<SysPost> selectPostAll();
+
+    /**
+     * 通过岗位ID查询岗位信息
+     *
+     * @param postId 岗位ID
+     * @return 角色对象信息
+     */
+    public SysPost selectPostById(Long postId);
+
+    /**
+     * 根据用户ID获取岗位选择框列表
+     *
+     * @param userId 用户ID
+     * @return 选中岗位ID列表
+     */
+    public List<Integer> selectPostListByUserId(Long userId);
+
+    /**
+     * 校验岗位名称
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    public String checkPostNameUnique(SysPost post);
+
+    /**
+     * 校验岗位编码
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    public String checkPostCodeUnique(SysPost post);
+
+    /**
+     * 通过岗位ID查询岗位使用数量
+     *
+     * @param postId 岗位ID
+     * @return 结果
+     */
+    public int countUserPostById(Long postId);
+
+    /**
+     * 删除岗位信息
+     *
+     * @param postId 岗位ID
+     * @return 结果
+     */
+    public int deletePostById(Long postId);
+
+    /**
+     * 批量删除岗位信息
+     *
+     * @param postIds 需要删除的岗位ID
+     * @return 结果
+     * @throws Exception 异常
+     */
+    public int deletePostByIds(Long[] postIds);
+
+    /**
+     * 新增保存岗位信息
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    public int insertPost(SysPost post);
+
+    /**
+     * 修改保存岗位信息
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    public int updatePost(SysPost post);
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysRoleMenuService.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.top.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.top.domain.TopSysRoleMenu;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface ITopSysRoleMenuService extends IService<TopSysRoleMenu> {
+
+}

+ 133 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysRoleService.java

@@ -0,0 +1,133 @@
+package com.zhongzheng.modules.top.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.top.domain.TopSysRole;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 角色信息Service接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+ interface ITopSysRoleService extends IService<TopSysRole> {
+    /**
+     * 根据条件分页查询角色数据
+     *
+     * @param role 角色信息
+     * @return 角色数据集合信息
+     */
+     List<TopSysRole> selectRoleList(TopSysRole role);
+
+    /**
+     * 根据用户ID查询角色
+     *
+     * @param userId 用户ID
+     * @return 权限列表
+     */
+     Set<String> selectRolePermissionByUserId(Long userId);
+
+    /**
+     * 查询所有角色
+     *
+     * @return 角色列表
+     */
+     List<TopSysRole> selectRoleAll();
+
+    /**
+     * 根据用户ID获取角色选择框列表
+     *
+     * @param userId 用户ID
+     * @return 选中角色ID列表
+     */
+     List<Integer> selectRoleListByUserId(Long userId);
+
+    /**
+     * 通过角色ID查询角色
+     *
+     * @param roleId 角色ID
+     * @return 角色对象信息
+     */
+     TopSysRole selectRoleById(Long roleId);
+
+    /**
+     * 校验角色名称是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+     String checkRoleNameUnique(TopSysRole role);
+
+    /**
+     * 校验角色权限是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+     String checkRoleKeyUnique(TopSysRole role);
+
+    /**
+     * 校验角色是否允许操作
+     *
+     * @param role 角色信息
+     */
+     void checkRoleAllowed(TopSysRole role);
+
+    /**
+     * 通过角色ID查询角色使用数量
+     *
+     * @param roleId 角色ID
+     * @return 结果
+     */
+     int countUserRoleByRoleId(Long roleId);
+
+    /**
+     * 新增保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+     int insertRole(TopSysRole role);
+
+    /**
+     * 修改保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+     int updateRole(TopSysRole role);
+
+    /**
+     * 修改角色状态
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+     int updateRoleStatus(TopSysRole role);
+
+    /**
+     * 修改数据权限信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+     int authDataScope(TopSysRole role);
+
+    /**
+     * 通过角色ID删除角色
+     *
+     * @param roleId 角色ID
+     * @return 结果
+     */
+     int deleteRoleById(Long roleId);
+
+    /**
+     * 批量删除角色信息
+     *
+     * @param roleIds 需要删除的角色ID
+     * @return 结果
+     */
+     int deleteRoleByIds(Long[] roleIds);
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysUserRoleService.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.top.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.top.domain.TopSysUserRole;
+
+/**
+ * 用户和角色关联Service接口
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+public interface ITopSysUserRoleService extends IService<TopSysUserRole> {
+}

+ 85 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/ITopSysUserService.java

@@ -2,8 +2,8 @@ package com.zhongzheng.modules.top.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.entity.TopSysUser;
+import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
 import com.zhongzheng.modules.top.bo.TopSysUserAddBo;
 import com.zhongzheng.modules.top.bo.TopSysUserEditBo;
 import com.zhongzheng.modules.top.bo.TopSysUserQueryBo;
@@ -43,7 +43,7 @@ public interface ITopSysUserService extends IService<TopSysUser> {
 	 * @param userName 用户名
 	 * @return 用户对象信息
 	 */
-	public TopSysUser selectUserByUserName(String userName);
+	public TopSysUser selectUserByUserNameByName(String userName);
 
 	/**
 	 * 根据编辑业务对象修改SAAS用户信息
@@ -59,4 +59,87 @@ public interface ITopSysUserService extends IService<TopSysUser> {
 	 * @return
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+	/**
+	 * 根据条件分页查询用户列表
+	 *
+	 * @param user 用户信息
+	 * @return 用户信息集合信息
+	 */
+	List<TopSysUser> selectUserList(TopSysUser user);
+
+	List<TopSysUser> queryBusinessPeopleList(CourseBusinessQueryBo bo);
+
+	/**
+	 * 通过用户名查询用户
+	 *
+	 * @param userName 用户名
+	 * @return 用户对象信息
+	 */
+	TopSysUser selectUserByUserName(String userName);
+
+	/**
+	 * 通过用户ID查询用户
+	 *
+	 * @param userId 用户ID
+	 * @return 用户对象信息
+	 */
+	TopSysUser selectUserById(Long userId);
+
+
+	/**
+	 * 校验用户名称是否唯一
+	 *
+	 * @param userName 用户名称
+	 * @return 结果
+	 */
+	String checkUserNameUnique(String userName);
+
+	/**
+	 * 校验手机号码是否唯一
+	 *
+	 * @param user 用户信息
+	 * @return 结果
+	 */
+	String checkPhoneUnique(TopSysUser user);
+
+	/**
+	 * 校验email是否唯一
+	 *
+	 * @param user 用户信息
+	 * @return 结果
+	 */
+	String checkEmailUnique(TopSysUser user);
+
+	/**
+	 * 校验用户是否允许操作
+	 *
+	 * @param user 用户信息
+	 */
+	void checkUserAllowed(TopSysUser user);
+
+	/**
+	 * 新增用户信息
+	 *
+	 * @param user 用户信息
+	 * @return 结果
+	 */
+	int insertUser(TopSysUser user);
+
+	/**
+	 * 修改用户信息
+	 *
+	 * @param user 用户信息
+	 * @return 结果
+	 */
+	int updateUser(TopSysUser user);
+
+	/**
+	 * 修改用户状态
+	 *
+	 * @param user 用户信息
+	 * @return 结果
+	 */
+	 int updateUserStatus(TopSysUser user);
+
 }

+ 233 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysConfigServiceImpl.java

@@ -0,0 +1,233 @@
+package com.zhongzheng.modules.top.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.annotation.DataSource;
+import com.zhongzheng.common.constant.Constants;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.enums.DataSourceType;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.modules.system.domain.SysConfig;
+import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.vo.SysConfigVo;
+import com.zhongzheng.modules.top.domain.TopSysConfig;
+import com.zhongzheng.modules.top.mapper.TopSysConfigMapper;
+import com.zhongzheng.modules.top.service.ITopSysConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Service
+public class TopSysConfigServiceImpl extends ServiceImpl<TopSysConfigMapper, TopSysConfig> implements ITopSysConfigService {
+    @Autowired
+    private RedisCache redisCache;
+
+    @Autowired
+    private ISysTenantService iSysTenantService;
+
+    /**
+     * 项目启动时,初始化参数到缓存
+     */
+    @PostConstruct
+    public void init() {
+      /*  List<SysConfig> configsList = baseMapper.selectList(new LambdaQueryWrapper<>());
+        for (SysConfig config : configsList) {
+            redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+        }*/
+    }
+
+    /**
+     * 查询参数配置信息
+     *
+     * @param configId 参数配置ID
+     * @return 参数配置信息
+     */
+    @Override
+    @DataSource(DataSourceType.MASTER)
+    public SysConfig selectConfigById(Long configId) {
+        return baseMapper.selectById(configId);
+    }
+
+    /**
+     * 根据键名查询参数配置信息
+     *
+     * @param configKey 参数key
+     * @return 参数键值
+     */
+    @Override
+    public String selectConfigByKey(String configKey) {
+        String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
+        if (Validator.isNotEmpty(configValue)) {
+            return configValue;
+        }
+        SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysConfig>()
+                .eq(SysConfig::getConfigKey, configKey));
+        if (Validator.isNotNull(retConfig)) {
+            redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue(),120, TimeUnit.MINUTES);
+            return retConfig.getConfigValue();
+        }
+        return StrUtil.EMPTY;
+    }
+
+    @Override
+    public String selectConfigByKeyNoCache(String configKey) {
+        SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysConfig>()
+                .eq(SysConfig::getConfigKey, configKey));
+        if (Validator.isNotNull(retConfig)) {
+            return retConfig.getConfigValue();
+        }
+        return StrUtil.EMPTY;
+    }
+
+    /**
+     * 查询参数配置列表
+     *
+     * @param config 参数配置信息
+     * @return 参数配置集合
+     */
+    @Override
+    public List<SysConfigVo> selectConfigList(SysConfigVo config) {
+        LambdaQueryWrapper<SysConfig> lqw = new LambdaQueryWrapper<>();
+        lqw.like(StrUtil.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName());
+        lqw.eq(StrUtil.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType());
+        lqw.eq(StrUtil.isNotBlank(config.getConfigModule()), SysConfig::getConfigModule, config.getConfigModule());
+        lqw.like(StrUtil.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey());
+        Map<String, Object> params = config.getParams();
+        lqw.apply(Validator.isNotEmpty(params.get("beginTime")),
+                "date_format(create_time,'%y%m%d') >= date_format(#{0},'%y%m%d')",
+                params.get("beginTime"));
+        lqw.apply(Validator.isNotEmpty(params.get("endTime")),
+                "date_format(create_time,'%y%m%d') >= date_format(#{0},'%y%m%d')",
+                params.get("endTime"));
+        List<SysConfig> sysConfigs = baseMapper.selectList(lqw);
+        if (CollectionUtils.isEmpty(sysConfigs)){
+            return new ArrayList<>();
+        }
+        return sysConfigs.stream().map(x -> BeanUtil.toBean(x,SysConfigVo.class)).collect(Collectors.toList());
+    }
+
+    /**
+     * 新增参数配置
+     *
+     * @param config 参数配置信息
+     * @return 结果
+     */
+    @Override
+    public int insertConfig(SysConfigVo config) {
+        SysConfig sysConfig = BeanUtil.toBean(config, SysConfig.class);
+        sysConfig.setTenantId(Long.valueOf(config.getTenantId()));
+        int row = baseMapper.insert(sysConfig);
+        if (row > 0) {
+            redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+        }
+        return row;
+    }
+
+    /**
+     * 修改参数配置
+     *
+     * @param config 参数配置信息
+     * @return 结果
+     */
+    @Override
+    public int updateConfig(SysConfigVo config) {
+        SysConfig sysConfig = BeanUtil.toBean(config, SysConfig.class);
+        sysConfig.setTenantId(Long.valueOf(config.getTenantId()));
+        int row = baseMapper.updateById(sysConfig);
+        if (row > 0) {
+            redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue());
+            if(config.getConfigKey().equals("home.mobile")){
+                /*JSONObject jsonObject = (JSONObject) JSONObject.parse(config.getConfigValue());
+                String hostPc = jsonObject.getString("hostPc");
+                String hostH5 = jsonObject.getString("hostH5");
+                String hostLive = jsonObject.getString("hostLive");
+                LambdaUpdateWrapper<SysTenant> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                objectLambdaUpdateWrapper.eq(SysTenant::getTenantId, Long.valueOf(config.getTenantId()));
+                objectLambdaUpdateWrapper.set(SysTenant::getHostPc, hostPc);
+                objectLambdaUpdateWrapper.set(SysTenant::getHostH5, hostH5);
+                objectLambdaUpdateWrapper.set(SysTenant::getHostLive, hostLive);
+                objectLambdaUpdateWrapper.set(SysTenant::getUpdateTime, DateUtils.getNowTime());
+                iSysTenantService.update(null, objectLambdaUpdateWrapper);*/
+            }
+        }
+        return row;
+    }
+
+    /**
+     * 批量删除参数信息
+     *
+     * @param configIds 需要删除的参数ID
+     * @return 结果
+     */
+    @Override
+    public int deleteConfigByIds(Long[] configIds) {
+        for (Long configId : configIds) {
+            SysConfig config = selectConfigById(configId);
+            if (StrUtil.equals(UserConstants.YES, config.getConfigType())) {
+                throw new CustomException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
+            }
+        }
+        int count = baseMapper.deleteBatchIds(Arrays.asList(configIds));
+        if (count > 0) {
+            Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*");
+            redisCache.deleteObject(keys);
+        }
+        return count;
+    }
+
+    /**
+     * 清空缓存数据
+     */
+    @Override
+    public void clearCache() {
+        Collection<String> keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*");
+        redisCache.deleteObject(keys);
+    }
+
+    /**
+     * 校验参数键名是否唯一
+     *
+     * @param config 参数配置信息
+     * @return 结果
+     */
+    @Override
+    public String checkConfigKeyUnique(SysConfigVo config) {
+        Long configId = Validator.isNull(config.getConfigId()) ? -1L : config.getConfigId();
+        SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getConfigKey, config.getConfigKey()));
+        if (Validator.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    @Override
+    public SysConfig getSysConfigByKeyTenant(String key, Long tenantId) {
+        return baseMapper.getSysConfigByKeyTenant(key, tenantId);
+    }
+
+    /**
+     * 设置cache key
+     *
+     * @param configKey 参数键
+     * @return 缓存键key
+     */
+    private String getCacheKey(String configKey) {
+        return Constants.SYS_CONFIG_KEY + configKey;
+    }
+}

+ 313 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysDeptServiceImpl.java

@@ -0,0 +1,313 @@
+package com.zhongzheng.modules.top.service.impl;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.annotation.DataScope;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.domain.TreeSelect;
+import com.zhongzheng.common.core.domain.entity.SysDept;
+import com.zhongzheng.common.core.domain.entity.SysRole;
+import com.zhongzheng.common.core.domain.entity.SysUser;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.modules.system.mapper.SysRoleMapper;
+import com.zhongzheng.modules.system.mapper.SysUserMapper;
+import com.zhongzheng.modules.top.domain.TopSysDept;
+import com.zhongzheng.modules.top.mapper.TopSysDeptMapper;
+import com.zhongzheng.modules.top.service.ITopSysDeptService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 部门Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Service
+public class TopSysDeptServiceImpl extends ServiceImpl<TopSysDeptMapper, TopSysDept> implements ITopSysDeptService {
+
+    @Autowired
+    private SysRoleMapper roleMapper;
+
+    @Autowired
+    private SysUserMapper userMapper;
+
+    /**
+     * 查询部门管理数据
+     *
+     * @param dept 部门信息
+     * @return 部门信息集合
+     */
+    @Override
+    @DataScope(deptAlias = "d")
+    public List<SysDept> selectDeptList(SysDept dept) {
+        Object dataScope = dept.getParams().get("dataScope");
+        return list(new LambdaQueryWrapper<SysDept>()
+                .eq(dept.getParentId() != null && dept.getParentId() != 0,
+                        SysDept::getParentId, dept.getParentId())
+                .like(StrUtil.isNotBlank(dept.getDeptName()), SysDept::getDeptName, dept.getDeptName())
+                .eq(StrUtil.isNotBlank(dept.getStatus()), SysDept::getStatus, dept.getStatus())
+                .in(dept.getStatusArray()!=null, SysDept::getStatus, dept.getStatusArray())
+                .apply(dataScope != null, dataScope != null ? dataScope.toString() : null)
+                .orderByAsc(SysDept::getParentId)
+                .orderByAsc(SysDept::getOrderNum));
+    }
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param depts 部门列表
+     * @return 树结构列表
+     */
+    @Override
+    public List<SysDept> buildDeptTree(List<SysDept> depts) {
+        List<SysDept> returnList = new ArrayList<SysDept>();
+        List<Long> tempList = new ArrayList<Long>();
+        for (SysDept dept : depts) {
+            tempList.add(dept.getDeptId());
+        }
+        for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext(); ) {
+            SysDept dept = (SysDept) iterator.next();
+            // 如果是顶级节点, 遍历该父节点的所有子节点
+            if (!tempList.contains(dept.getParentId())) {
+                recursionFn(depts, dept);
+                returnList.add(dept);
+            }
+        }
+        if (returnList.isEmpty()) {
+            returnList = depts;
+        }
+        return returnList;
+    }
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param depts 部门列表
+     * @return 下拉树结构列表
+     */
+    @Override
+    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) {
+        List<SysDept> deptTrees = buildDeptTree(depts);
+        return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    /**
+     * 根据角色ID查询部门树信息
+     *
+     * @param roleId 角色ID
+     * @return 选中部门列表
+     */
+    @Override
+    public List<Integer> selectDeptListByRoleId(Long roleId) {
+        SysRole role = roleMapper.selectById(roleId);
+        return baseMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
+    }
+
+    /**
+     * 根据部门ID查询信息
+     *
+     * @param deptId 部门ID
+     * @return 部门信息
+     */
+    @Override
+    public SysDept selectDeptById(Long deptId) {
+        return getById(deptId);
+    }
+
+    /**
+     * 根据ID查询所有子部门(正常状态)
+     *
+     * @param deptId 部门ID
+     * @return 子部门数
+     */
+    @Override
+    public int selectNormalChildrenDeptById(Long deptId) {
+        return count(new LambdaQueryWrapper<SysDept>()
+                .eq(SysDept::getStatus, 0)
+                .apply("find_in_set({0}, ancestors)", deptId));
+    }
+
+    /**
+     * 是否存在子节点
+     *
+     * @param deptId 部门ID
+     * @return 结果
+     */
+    @Override
+    public boolean hasChildByDeptId(Long deptId) {
+        int result = count(new LambdaQueryWrapper<SysDept>()
+                .eq(SysDept::getParentId, deptId)
+                .last("limit 1"));
+        return result > 0 ? true : false;
+    }
+
+    /**
+     * 查询部门是否存在用户
+     *
+     * @param deptId 部门ID
+     * @return 结果 true 存在 false 不存在
+     */
+    @Override
+    public boolean checkDeptExistUser(Long deptId) {
+        int result = userMapper.selectCount(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getDeptId, deptId));
+        return result > 0 ? true : false;
+    }
+
+    /**
+     * 校验部门名称是否唯一
+     *
+     * @param dept 部门信息
+     * @return 结果
+     */
+    @Override
+    public String checkDeptNameUnique(SysDept dept) {
+        Long deptId = Validator.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
+        SysDept info = getOne(new LambdaQueryWrapper<SysDept>()
+                .eq(SysDept::getDeptName, dept.getDeptName())
+                .eq(SysDept::getParentId, dept.getParentId())
+                .last("limit 1"));
+        if (Validator.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 新增保存部门信息
+     *
+     * @param dept 部门信息
+     * @return 结果
+     */
+    @Override
+    public int insertDept(SysDept dept) {
+        if(dept.getParentId()>0){
+            SysDept info = getById(dept.getParentId());
+            // 如果父节点不为正常状态,则不允许新增子节点
+            if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
+                throw new CustomException("部门停用,不允许新增");
+            }
+            dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
+        }else{
+            dept.setAncestors("0");
+        }
+
+        return baseMapper.insert(dept);
+    }
+
+    /**
+     * 修改保存部门信息
+     *
+     * @param dept 部门信息
+     * @return 结果
+     */
+    @Override
+    public int updateDept(SysDept dept) {
+        SysDept newParentDept = getById(dept.getParentId());
+        SysDept oldDept = getById(dept.getDeptId());
+        if (Validator.isNotNull(newParentDept) && Validator.isNotNull(oldDept)) {
+            String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
+            String oldAncestors = oldDept.getAncestors();
+            dept.setAncestors(newAncestors);
+            updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
+        }
+        int result = baseMapper.updateById(dept);
+        if (UserConstants.DEPT_NORMAL.equals(dept.getStatus())) {
+            // 如果该部门是启用状态,则启用该部门的所有上级部门
+            updateParentDeptStatus(dept);
+        }
+        return result;
+    }
+
+    /**
+     * 修改该部门的父级部门状态
+     *
+     * @param dept 当前部门
+     */
+    private void updateParentDeptStatus(SysDept dept) {
+        String updateBy = dept.getUpdateBy();
+        dept = getById(dept.getDeptId());
+        dept.setUpdateBy(updateBy);
+        update(null,new LambdaUpdateWrapper<SysDept>()
+                .set(StrUtil.isNotBlank(dept.getStatus()),
+                        SysDept::getStatus,dept.getStatus())
+                .set(StrUtil.isNotBlank(dept.getUpdateBy()),
+                        SysDept::getUpdateBy,dept.getUpdateBy())
+                .in(SysDept::getDeptId, Arrays.asList(dept.getAncestors().split(","))));
+    }
+
+    /**
+     * 修改子元素关系
+     *
+     * @param deptId       被修改的部门ID
+     * @param newAncestors 新的父ID集合
+     * @param oldAncestors 旧的父ID集合
+     */
+    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
+        List<SysDept> children = list(new LambdaQueryWrapper<SysDept>()
+                .apply("find_in_set({0},ancestors)",deptId));
+        for (SysDept child : children) {
+            child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors));
+        }
+        if (children.size() > 0) {
+            updateBatchById(children);
+        }
+    }
+
+    /**
+     * 删除部门管理信息
+     *
+     * @param deptId 部门ID
+     * @return 结果
+     */
+    @Override
+    public int deleteDeptById(Long deptId) {
+        return baseMapper.deleteById(deptId);
+    }
+
+    /**
+     * 递归列表
+     */
+    private void recursionFn(List<SysDept> list, SysDept t) {
+        // 得到子节点列表
+        List<SysDept> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (SysDept tChild : childList) {
+            if (hasChild(list, tChild)) {
+                recursionFn(list, tChild);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<SysDept> getChildList(List<SysDept> list, SysDept t) {
+        List<SysDept> tlist = new ArrayList<SysDept>();
+        Iterator<SysDept> it = list.iterator();
+        while (it.hasNext()) {
+            SysDept n = (SysDept) it.next();
+            if (Validator.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<SysDept> list, SysDept t) {
+        return getChildList(list, t).size() > 0 ? true : false;
+    }
+}

+ 434 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysMenuServiceImpl.java

@@ -0,0 +1,434 @@
+package com.zhongzheng.modules.top.service.impl;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.domain.TreeSelect;
+import com.zhongzheng.common.core.domain.entity.SysMenu;
+import com.zhongzheng.common.core.domain.entity.SysRole;
+import com.zhongzheng.common.core.domain.entity.SysUser;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.modules.system.domain.SysRoleMenu;
+import com.zhongzheng.modules.system.domain.vo.MetaVo;
+import com.zhongzheng.modules.system.domain.vo.RouterVo;
+import com.zhongzheng.modules.system.mapper.SysRoleMapper;
+import com.zhongzheng.modules.system.mapper.SysRoleMenuMapper;
+import com.zhongzheng.modules.system.service.ISysUserService;
+import com.zhongzheng.modules.top.domain.TopSysMenu;
+import com.zhongzheng.modules.top.mapper.TopSysMenuMapper;
+import com.zhongzheng.modules.top.service.ITopSysMenuService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Service
+public class TopSysMenuServiceImpl extends ServiceImpl<TopSysMenuMapper, TopSysMenu> implements ITopSysMenuService {
+    public static final String PREMISSION_STRING = "perms[\"{0}\"]";
+
+    @Autowired
+    private SysRoleMapper roleMapper;
+
+    @Autowired
+    private SysRoleMenuMapper roleMenuMapper;
+
+    @Autowired
+    private ISysUserService userService;
+
+    /**
+     * 根据用户查询系统菜单列表
+     *
+     * @param userId 用户ID
+     * @return 菜单列表
+     */
+    @Override
+    public List<SysMenu> selectMenuList(Long userId) {
+        return selectMenuList(new SysMenu(), userId);
+    }
+
+    /**
+     * 查询系统菜单列表
+     *
+     * @param menu 菜单信息
+     * @return 菜单列表
+     */
+    @Override
+    public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
+        List<SysMenu> menuList = null;
+        SysUser sysUser = userService.selectUserById(userId);
+        // 管理员显示所有菜单信息
+        if (SysUser.isAdmin(sysUser.getUserName())) {
+            menuList = list(new LambdaQueryWrapper<SysMenu>()
+                    .like(StrUtil.isNotBlank(menu.getMenuName()),SysMenu::getMenuName,menu.getMenuName())
+                    .eq(StrUtil.isNotBlank(menu.getVisible()),SysMenu::getVisible,menu.getVisible())
+                    .eq(StrUtil.isNotBlank(menu.getStatus()),SysMenu::getStatus,menu.getStatus())
+                    .orderByAsc(SysMenu::getParentId)
+                    .orderByAsc(SysMenu::getOrderNum));
+        } else {
+            menu.getParams().put("userId", userId);
+            menuList = baseMapper.selectMenuListByUserId(menu);
+        }
+        return menuList;
+    }
+
+    /**
+     * 根据用户ID查询权限
+     *
+     * @param userId 用户ID
+     * @return 权限列表
+     */
+    @Override
+    public Set<String> selectMenuPermsByUserId(Long userId) {
+        List<String> perms = baseMapper.selectMenuPermsByUserId(userId);
+        Set<String> permsSet = new HashSet<>();
+        for (String perm : perms) {
+            if (Validator.isNotEmpty(perm)) {
+                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
+            }
+        }
+        return permsSet;
+    }
+
+    /**
+     * 根据用户ID查询菜单
+     *
+     * @param userId 用户名称
+     * @return 菜单列表
+     */
+    @Override
+    public List<SysMenu> selectMenuTreeByUserId(Long userId) {
+        List<SysMenu> menus = null;
+        if (SecurityUtils.isAdmin(userId)) {
+            menus = baseMapper.selectMenuTreeAll();
+        } else {
+            menus = baseMapper.selectMenuTreeByUserId(userId);
+        }
+        return getChildPerms(menus, 0);
+    }
+
+    /**
+     * 根据角色ID查询菜单树信息
+     *
+     * @param roleId 角色ID
+     * @return 选中菜单列表
+     */
+    @Override
+    public List<Integer> selectMenuListByRoleId(Long roleId) {
+        SysRole role = roleMapper.selectById(roleId);
+        return baseMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
+    }
+
+    /**
+     * 构建前端路由所需要的菜单
+     *
+     * @param menus 菜单列表
+     * @return 路由列表
+     */
+    @Override
+    public List<RouterVo> buildMenus(List<SysMenu> menus) {
+        List<RouterVo> routers = new LinkedList<RouterVo>();
+        for (SysMenu menu : menus) {
+            RouterVo router = new RouterVo();
+            router.setMenuId(menu.getMenuId());
+            router.setHidden("1".equals(menu.getVisible()));
+            router.setName(getRouteName(menu));
+            router.setPath(getRouterPath(menu));
+            router.setComponent(getComponent(menu));
+            router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StrUtil.equals("1", menu.getIsCache())));
+            List<SysMenu> cMenus = menu.getChildren();
+            if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) {
+                router.setAlwaysShow(true);
+                router.setRedirect("noRedirect");
+                router.setChildren(buildMenus(cMenus));
+            } else if (isMenuFrame(menu)) {
+                router.setMeta(null);
+                List<RouterVo> childrenList = new ArrayList<RouterVo>();
+                RouterVo children = new RouterVo();
+                children.setPath(menu.getPath());
+                children.setComponent(menu.getComponent());
+                children.setName(StrUtil.upperFirst(menu.getPath()));
+                children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StrUtil.equals("1", menu.getIsCache())));
+                childrenList.add(children);
+                router.setChildren(childrenList);
+            }
+            routers.add(router);
+        }
+        return routers;
+    }
+
+    /**
+     * 构建前端所需要树结构
+     *
+     * @param menus 菜单列表
+     * @return 树结构列表
+     */
+    @Override
+    public List<SysMenu> buildMenuTree(List<SysMenu> menus) {
+        List<SysMenu> returnList = new ArrayList<SysMenu>();
+        List<Long> tempList = new ArrayList<Long>();
+        for (SysMenu dept : menus) {
+            tempList.add(dept.getMenuId());
+        }
+        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 menus 菜单列表
+     * @return 下拉树结构列表
+     */
+    @Override
+    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) {
+        List<SysMenu> menuTrees = buildMenuTree(menus);
+        return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    /**
+     * 根据菜单ID查询信息
+     *
+     * @param menuId 菜单ID
+     * @return 菜单信息
+     */
+    @Override
+    public SysMenu selectMenuById(Long menuId) {
+        return getById(menuId);
+    }
+
+    /**
+     * 是否存在菜单子节点
+     *
+     * @param menuId 菜单ID
+     * @return 结果
+     */
+    @Override
+    public boolean hasChildByMenuId(Long menuId) {
+        int result = count(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId,menuId));
+        return result > 0 ? true : false;
+    }
+
+    /**
+     * 查询菜单使用数量
+     *
+     * @param menuId 菜单ID
+     * @return 结果
+     */
+    @Override
+    public boolean checkMenuExistRole(Long menuId) {
+        int result = roleMenuMapper.selectCount(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getMenuId,menuId));
+        return result > 0 ? true : false;
+    }
+
+    /**
+     * 新增保存菜单信息
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    @Override
+    public int insertMenu(SysMenu menu) {
+        return baseMapper.insert(menu);
+    }
+
+    /**
+     * 修改保存菜单信息
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    @Override
+    public int updateMenu(SysMenu menu) {
+        return baseMapper.updateById(menu);
+    }
+
+    /**
+     * 删除菜单管理信息
+     *
+     * @param menuId 菜单ID
+     * @return 结果
+     */
+    @Override
+    public int deleteMenuById(Long menuId) {
+        return baseMapper.deleteById(menuId);
+    }
+
+    /**
+     * 校验菜单名称是否唯一
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    @Override
+    public String checkMenuNameUnique(SysMenu menu) {
+        Long menuId = Validator.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
+        SysMenu info = getOne(new LambdaQueryWrapper<SysMenu>()
+                .eq(SysMenu::getMenuName,menu.getMenuName())
+                .eq(SysMenu::getParentId,menu.getParentId())
+                .last("limit 1"));
+        if (Validator.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    @Override
+    public List<SysMenu> listSysMenuByTenant(Long tenantId) {
+        return baseMapper.listSysMenuByTenant(tenantId);
+    }
+
+    @Override
+    public Integer updateParentById(SysMenu newMenus) {
+        return baseMapper.updateParentById(newMenus);
+    }
+
+    /**
+     * 获取路由名称
+     *
+     * @param menu 菜单信息
+     * @return 路由名称
+     */
+    public String getRouteName(SysMenu menu) {
+        String routerName = StrUtil.upperFirst(menu.getPath());
+        // 非外链并且是一级目录(类型为目录)
+        if (isMenuFrame(menu)) {
+            routerName = StrUtil.EMPTY;
+        }
+        return routerName;
+    }
+
+    /**
+     * 获取路由地址
+     *
+     * @param menu 菜单信息
+     * @return 路由地址
+     */
+    public String getRouterPath(SysMenu menu) {
+        String routerPath = menu.getPath();
+        // 非外链并且是一级目录(类型为目录)
+        if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType())
+                && UserConstants.NO_FRAME.equals(menu.getIsFrame())) {
+            routerPath = "/" + menu.getPath();
+        }
+        // 非外链并且是一级目录(类型为菜单)
+        else if (isMenuFrame(menu)) {
+            routerPath = "/";
+        }
+        return routerPath;
+    }
+
+    /**
+     * 获取组件信息
+     *
+     * @param menu 菜单信息
+     * @return 组件信息
+     */
+    public String getComponent(SysMenu menu) {
+        String component = UserConstants.LAYOUT;
+        if (StrUtil.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) {
+            component = menu.getComponent();
+        } else if (StrUtil.isEmpty(menu.getComponent()) && isParentView(menu)) {
+            component = UserConstants.PARENT_VIEW;
+        }
+        return component;
+    }
+
+    /**
+     * 是否为菜单内部跳转
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    public boolean isMenuFrame(SysMenu menu) {
+        return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType())
+                && menu.getIsFrame().equals(UserConstants.NO_FRAME);
+    }
+
+    /**
+     * 是否为parent_view组件
+     *
+     * @param menu 菜单信息
+     * @return 结果
+     */
+    public boolean isParentView(SysMenu menu) {
+        return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType());
+    }
+
+    /**
+     * 根据父节点的ID获取所有子节点
+     *
+     * @param list     分类表
+     * @param parentId 传入的父节点ID
+     * @return String
+     */
+    public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
+        List<SysMenu> returnList = new ArrayList<SysMenu>();
+        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext(); ) {
+            SysMenu t = (SysMenu) iterator.next();
+            // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
+            if (t.getParentId() == parentId) {
+                recursionFn(list, t);
+                returnList.add(t);
+            }
+        }
+        return returnList;
+    }
+
+    /**
+     * 递归列表
+     *
+     * @param list
+     * @param t
+     */
+    private void recursionFn(List<SysMenu> list, SysMenu t) {
+        // 得到子节点列表
+        List<SysMenu> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (SysMenu tChild : childList) {
+            if (hasChild(list, tChild)) {
+                recursionFn(list, tChild);
+            }
+        }
+    }
+
+    /**
+     * 得到子节点列表
+     */
+    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t) {
+        List<SysMenu> tlist = new ArrayList<SysMenu>();
+        Iterator<SysMenu> it = list.iterator();
+        while (it.hasNext()) {
+            SysMenu n = (SysMenu) it.next();
+            if (n.getParentId().longValue() == t.getMenuId().longValue()) {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 判断是否有子节点
+     */
+    private boolean hasChild(List<SysMenu> list, SysMenu t) {
+        return getChildList(list, t).size() > 0 ? true : false;
+    }
+}

+ 175 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysPostServiceImpl.java

@@ -0,0 +1,175 @@
+package com.zhongzheng.modules.top.service.impl;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.modules.system.domain.SysPost;
+import com.zhongzheng.modules.system.domain.SysUserPost;
+import com.zhongzheng.modules.system.mapper.SysUserPostMapper;
+import com.zhongzheng.modules.top.domain.TopSysPost;
+import com.zhongzheng.modules.top.mapper.TopSysPostMapper;
+import com.zhongzheng.modules.top.service.ITopSysPostService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Service
+public class TopSysPostServiceImpl extends ServiceImpl<TopSysPostMapper, TopSysPost> implements ITopSysPostService {
+
+    @Autowired
+    private SysUserPostMapper userPostMapper;
+
+    /**
+     * 查询岗位信息集合
+     *
+     * @param post 岗位信息
+     * @return 岗位信息集合
+     */
+    @Override
+    public List<SysPost> selectPostList(SysPost post) {
+        return list(new LambdaQueryWrapper<SysPost>()
+                .like(StrUtil.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode())
+                .eq(StrUtil.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus())
+                .in(post.getStatusArray()!=null, SysPost::getStatus, post.getStatusArray())
+                .like(StrUtil.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName()));
+    }
+
+    /**
+     * 查询所有岗位
+     *
+     * @return 岗位列表
+     */
+    @Override
+    public List<SysPost> selectPostAll() {
+        return list();
+    }
+
+    /**
+     * 通过岗位ID查询岗位信息
+     *
+     * @param postId 岗位ID
+     * @return 角色对象信息
+     */
+    @Override
+    public SysPost selectPostById(Long postId) {
+        return getById(postId);
+    }
+
+    /**
+     * 根据用户ID获取岗位选择框列表
+     *
+     * @param userId 用户ID
+     * @return 选中岗位ID列表
+     */
+    @Override
+    public List<Integer> selectPostListByUserId(Long userId) {
+        return baseMapper.selectPostListByUserId(userId);
+    }
+
+    /**
+     * 校验岗位名称是否唯一
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    @Override
+    public String checkPostNameUnique(SysPost post) {
+        Long postId = Validator.isNull(post.getPostId()) ? -1L : post.getPostId();
+        SysPost info = getOne(new LambdaQueryWrapper<SysPost>()
+                .eq(SysPost::getPostName, post.getPostName()).last("limit 1"));
+        if (Validator.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 校验岗位编码是否唯一
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    @Override
+    public String checkPostCodeUnique(SysPost post) {
+        Long postId = Validator.isNull(post.getPostId()) ? -1L : post.getPostId();
+        SysPost info = getOne(new LambdaQueryWrapper<SysPost>()
+                .eq(SysPost::getPostCode, post.getPostCode()).last("limit 1"));
+        if (Validator.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 通过岗位ID查询岗位使用数量
+     *
+     * @param postId 岗位ID
+     * @return 结果
+     */
+    @Override
+    public int countUserPostById(Long postId) {
+        return userPostMapper.selectCount(new LambdaQueryWrapper<SysUserPost>().eq(SysUserPost::getPostId,postId));
+    }
+
+    /**
+     * 删除岗位信息
+     *
+     * @param postId 岗位ID
+     * @return 结果
+     */
+    @Override
+    public int deletePostById(Long postId) {
+        return baseMapper.deleteById(postId);
+    }
+
+    /**
+     * 批量删除岗位信息
+     *
+     * @param postIds 需要删除的岗位ID
+     * @return 结果
+     * @throws Exception 异常
+     */
+    @Override
+    public int deletePostByIds(Long[] postIds) {
+        for (Long postId : postIds) {
+            SysPost post = selectPostById(postId);
+            if (countUserPostById(postId) > 0) {
+                throw new CustomException(String.format("%1$s已分配,不能删除", post.getPostName()));
+            }
+        }
+        return baseMapper.deleteBatchIds(Arrays.asList(postIds));
+    }
+
+    /**
+     * 新增保存岗位信息
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    @Override
+    public int insertPost(SysPost post) {
+        return baseMapper.insert(post);
+    }
+
+    /**
+     * 修改保存岗位信息
+     *
+     * @param post 岗位信息
+     * @return 结果
+     */
+    @Override
+    public int updatePost(SysPost post) {
+        return baseMapper.updateById(post);
+    }
+}

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysRoleMenuServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.top.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.top.domain.TopSysRoleMenu;
+import com.zhongzheng.modules.top.mapper.TopSysRoleMenuMapper;
+import com.zhongzheng.modules.top.service.ITopSysRoleMenuService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Service
+public class TopSysRoleMenuServiceImpl extends ServiceImpl<TopSysRoleMenuMapper, TopSysRoleMenu> implements ITopSysRoleMenuService {
+
+}

+ 325 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysRoleServiceImpl.java

@@ -0,0 +1,325 @@
+package com.zhongzheng.modules.top.service.impl;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.common.annotation.DataScope;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.spring.SpringUtils;
+import com.zhongzheng.modules.system.domain.SysRoleDept;
+import com.zhongzheng.modules.system.domain.SysRoleMenu;
+import com.zhongzheng.modules.top.domain.TopSysRole;
+import com.zhongzheng.modules.top.domain.TopSysRoleDept;
+import com.zhongzheng.modules.top.domain.TopSysRoleMenu;
+import com.zhongzheng.modules.top.domain.TopSysUserRole;
+import com.zhongzheng.modules.top.mapper.TopSysRoleDeptMapper;
+import com.zhongzheng.modules.top.mapper.TopSysRoleMapper;
+import com.zhongzheng.modules.top.mapper.TopSysRoleMenuMapper;
+import com.zhongzheng.modules.top.mapper.TopSysUserRoleMapper;
+import com.zhongzheng.modules.top.service.ITopSysRoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+/**
+ * 角色信息Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Service
+public class TopSysRoleServiceImpl extends ServiceImpl<TopSysRoleMapper, TopSysRole> implements ITopSysRoleService {
+
+    @Autowired
+    private TopSysRoleMenuMapper topSysRoleMenuMapper;
+
+    @Autowired
+    private TopSysUserRoleMapper topSysUserRoleMapper;
+
+    @Autowired
+    private TopSysRoleDeptMapper topSysRoleDeptMapper;
+    
+
+    /**
+     * 根据条件分页查询角色数据
+     *
+     * @param role 角色信息
+     * @return 角色数据集合信息
+     */
+    @Override
+    @DataScope(deptAlias = "d")
+    public List<TopSysRole> selectRoleList(TopSysRole role) {
+        Map<String, Object> params = role.getParams();
+        Object dataScope = params.get("dataScope");
+        return list(new LambdaQueryWrapper<TopSysRole>()
+                .like(StrUtil.isNotBlank(role.getRoleName()), TopSysRole::getRoleName, role.getRoleName())
+                .eq(StrUtil.isNotBlank(role.getStatus()), TopSysRole::getStatus, role.getStatus())
+                .in(role.getStatusArray()!=null, TopSysRole::getStatus, role.getStatusArray())
+                .like(StrUtil.isNotBlank(role.getRoleKey()), TopSysRole::getRoleKey, role.getRoleKey())
+                .apply(Validator.isNotEmpty(params.get("beginTime")),
+                        "date_format(create_time,'%y%m%d') >= date_format({0},'%y%m%d')",
+                        params.get("beginTime"))
+                .apply(Validator.isNotEmpty(params.get("endTime")),
+                        "date_format(create_time,'%y%m%d') <= date_format({0},'%y%m%d')",
+                        params.get("endTime"))
+                .apply(dataScope != null, dataScope != null ? dataScope.toString() : null)
+                .orderByAsc(TopSysRole::getRoleSort));
+    }
+
+    /**
+     * 根据用户ID查询权限
+     *
+     * @param userId 用户ID
+     * @return 权限列表
+     */
+    @Override
+    public Set<String> selectRolePermissionByUserId(Long userId) {
+        List<TopSysRole> perms = baseMapper.selectRolePermissionByUserId(userId);
+        Set<String> permsSet = new HashSet<>();
+        for (TopSysRole perm : perms) {
+            if (Validator.isNotNull(perm)) {
+                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
+            }
+        }
+        return permsSet;
+    }
+
+    /**
+     * 查询所有角色
+     *
+     * @return 角色列表
+     */
+    @Override
+    public List<TopSysRole> selectRoleAll() {
+        return SpringUtils.getAopProxy(this).selectRoleList(new TopSysRole());
+    }
+
+    /**
+     * 根据用户ID获取角色选择框列表
+     *
+     * @param userId 用户ID
+     * @return 选中角色ID列表
+     */
+    @Override
+    public List<Integer> selectRoleListByUserId(Long userId) {
+        return baseMapper.selectRoleListByUserId(userId);
+    }
+
+    /**
+     * 通过角色ID查询角色
+     *
+     * @param roleId 角色ID
+     * @return 角色对象信息
+     */
+    @Override
+    public TopSysRole selectRoleById(Long roleId) {
+        TopSysRole sysRole = getById(roleId);
+        return sysRole;
+    }
+
+    /**
+     * 校验角色名称是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    public String checkRoleNameUnique(TopSysRole role) {
+        Long roleId = Validator.isNull(role.getRoleId()) ? -1L : role.getRoleId();
+        TopSysRole info = getOne(new LambdaQueryWrapper<TopSysRole>()
+                .eq(TopSysRole::getRoleName, role.getRoleName()).last("limit 1"));
+        if (Validator.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 校验角色权限是否唯一
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    public String checkRoleKeyUnique(TopSysRole role) {
+        Long roleId = Validator.isNull(role.getRoleId()) ? -1L : role.getRoleId();
+        TopSysRole info = getOne(new LambdaQueryWrapper<TopSysRole>()
+                .eq(TopSysRole::getRoleKey, role.getRoleKey()).last("limit 1"));
+        if (Validator.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 校验角色是否允许操作
+     *
+     * @param role 角色信息
+     */
+    @Override
+    public void checkRoleAllowed(TopSysRole role) {
+        if (Validator.isNotNull(role.getRoleId()) && role.isAdmin()) {
+            throw new CustomException("不允许操作超级管理员角色");
+        }
+    }
+
+    /**
+     * 通过角色ID查询角色使用数量
+     *
+     * @param roleId 角色ID
+     * @return 结果
+     */
+    @Override
+    public int countUserRoleByRoleId(Long roleId) {
+        return topSysUserRoleMapper.selectCount(new LambdaQueryWrapper<TopSysUserRole>().eq(TopSysUserRole::getRoleId, roleId));
+    }
+
+    /**
+     * 新增保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int insertRole(TopSysRole role) {
+        // 新增角色信息
+        baseMapper.insert(role);
+        return insertRoleMenu(role);
+    }
+
+    /**
+     * 修改保存角色信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int updateRole(TopSysRole role) {
+        // 修改角色信息
+        baseMapper.updateById(role);
+        // 删除角色与菜单关联
+        topSysRoleMenuMapper.delete(new LambdaQueryWrapper<TopSysRoleMenu>().eq(TopSysRoleMenu::getRoleId, role.getRoleId()));
+        return insertRoleMenu(role);
+    }
+
+    /**
+     * 修改角色状态
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    public int updateRoleStatus(TopSysRole role) {
+        return baseMapper.updateById(role);
+    }
+
+    /**
+     * 修改数据权限信息
+     *
+     * @param role 角色信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int authDataScope(TopSysRole role) {
+        // 修改角色信息
+        baseMapper.updateById(role);
+        // 删除角色与部门关联
+        topSysRoleDeptMapper.delete(new LambdaQueryWrapper<TopSysRoleDept>().eq(TopSysRoleDept::getRoleId, role.getRoleId()));
+        // 新增角色和部门信息(数据权限)
+        return insertRoleDept(role);
+    }
+
+    /**
+     * 新增角色菜单信息
+     *
+     * @param role 角色对象
+     */
+    public int insertRoleMenu(TopSysRole role) {
+        int rows = 1;
+        // 新增用户与角色管理
+        List<TopSysRoleMenu> list = new ArrayList<TopSysRoleMenu>();
+        for (Long menuId : role.getMenuIds()) {
+            TopSysRoleMenu rm = new TopSysRoleMenu();
+            rm.setRoleId(role.getRoleId());
+            rm.setMenuId(menuId);
+            list.add(rm);
+        }
+        if (list.size() > 0) {
+            for (TopSysRoleMenu sysRoleMenu : list) {
+                rows += topSysRoleMenuMapper.insert(sysRoleMenu);
+            }
+        }
+        return rows;
+    }
+
+    /**
+     * 新增角色部门信息(数据权限)
+     *
+     * @param role 角色对象
+     */
+    public int insertRoleDept(TopSysRole role) {
+        int rows = 1;
+        // 新增角色与部门(数据权限)管理
+        List<TopSysRoleDept> list = new ArrayList<TopSysRoleDept>();
+        for (Long deptId : role.getDeptIds()) {
+            TopSysRoleDept rd = new TopSysRoleDept();
+            rd.setRoleId(role.getRoleId());
+            rd.setDeptId(deptId);
+            list.add(rd);
+        }
+        if (list.size() > 0) {
+            for (TopSysRoleDept sysRoleDept : list) {
+                rows += topSysRoleDeptMapper.insert(sysRoleDept);
+            }
+        }
+        return rows;
+    }
+
+    /**
+     * 通过角色ID删除角色
+     *
+     * @param roleId 角色ID
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int deleteRoleById(Long roleId) {
+        // 删除角色与菜单关联
+        topSysRoleMenuMapper.delete(new LambdaQueryWrapper<TopSysRoleMenu>().eq(TopSysRoleMenu::getRoleId, roleId));
+        // 删除角色与部门关联
+        topSysRoleDeptMapper.delete(new LambdaQueryWrapper<TopSysRoleDept>().eq(TopSysRoleDept::getRoleId, roleId));
+        return baseMapper.deleteById(roleId);
+    }
+
+    /**
+     * 批量删除角色信息
+     *
+     * @param roleIds 需要删除的角色ID
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int deleteRoleByIds(Long[] roleIds) {
+        for (Long roleId : roleIds) {
+            checkRoleAllowed(new TopSysRole(roleId));
+            TopSysRole role = selectRoleById(roleId);
+            if (countUserRoleByRoleId(roleId) > 0) {
+                throw new CustomException(String.format("%1$s已分配,不能删除", role.getRoleName()));
+            }
+        }
+        List<Long> ids = Arrays.asList(roleIds);
+        // 删除角色与菜单关联
+        topSysRoleMenuMapper.delete(new LambdaQueryWrapper<TopSysRoleMenu>().in(TopSysRoleMenu::getRoleId, ids));
+        // 删除角色与部门关联
+        topSysRoleDeptMapper.delete(new LambdaQueryWrapper<TopSysRoleDept>().in(TopSysRoleDept::getRoleId, ids));
+        return baseMapper.deleteBatchIds(ids);
+    }
+
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysUserRoleServiceImpl.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.top.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.top.domain.TopSysUserRole;
+import com.zhongzheng.modules.top.mapper.TopSysUserRoleMapper;
+import com.zhongzheng.modules.top.service.ITopSysUserRoleService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户和角色关联Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Service
+public class TopSysUserRoleServiceImpl extends ServiceImpl<TopSysUserRoleMapper, TopSysUserRole> implements ITopSysUserRoleService {
+
+
+}

+ 234 - 15
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/service/impl/TopSysUserServiceImpl.java

@@ -3,23 +3,36 @@ package com.zhongzheng.modules.top.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.annotation.DataScope;
+import com.zhongzheng.common.constant.UserConstants;
+import com.zhongzheng.common.core.domain.entity.SysRole;
 import com.zhongzheng.common.core.domain.entity.TopSysUser;
-import com.zhongzheng.common.utils.DateUtils;
-import com.zhongzheng.modules.course.domain.MajorCategory;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.modules.course.bo.CourseBusinessQueryBo;
+import com.zhongzheng.modules.system.domain.SysUserPost;
+import com.zhongzheng.modules.system.domain.SysUserRole;
 import com.zhongzheng.modules.top.bo.TopSysUserAddBo;
 import com.zhongzheng.modules.top.bo.TopSysUserEditBo;
 import com.zhongzheng.modules.top.bo.TopSysUserQueryBo;
+import com.zhongzheng.modules.top.domain.TopSysUserPost;
+import com.zhongzheng.modules.top.domain.TopSysUserRole;
+import com.zhongzheng.modules.top.mapper.TopSysPostMapper;
 import com.zhongzheng.modules.top.mapper.TopSysUserMapper;
+import com.zhongzheng.modules.top.mapper.TopSysUserPostMapper;
+import com.zhongzheng.modules.top.mapper.TopSysUserRoleMapper;
 import com.zhongzheng.modules.top.service.ITopSysUserService;
 import com.zhongzheng.modules.top.vo.TopSysUserVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.github.pagehelper.Page;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -31,6 +44,13 @@ import java.util.stream.Collectors;
  */
 @Service
 public class TopSysUserServiceImpl extends ServiceImpl<TopSysUserMapper, TopSysUser> implements ITopSysUserService {
+    
+    @Autowired
+    private TopSysUserRoleMapper topSysUserRoleMapper;
+
+    @Autowired
+    private TopSysUserPostMapper topSysUserPostMapper;
+    
 
     @Override
     public TopSysUserVo queryById(Long userId){
@@ -83,7 +103,7 @@ public class TopSysUserServiceImpl extends ServiceImpl<TopSysUserMapper, TopSysU
     }
 
     @Override
-    public TopSysUser selectUserByUserName(String userName) {
+    public TopSysUser selectUserByUserNameByName(String userName) {
         return baseMapper.selectUserByUserName(userName);
     }
 
@@ -94,22 +114,221 @@ public class TopSysUserServiceImpl extends ServiceImpl<TopSysUserMapper, TopSysU
         return this.updateById(update);
     }
 
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+
+    /**
+     * 根据条件分页查询用户列表
+     *
+     * @param user 用户信息
+     * @return 用户信息集合信息
+     */
+    @Override
+    @DataScope(deptAlias = "d", userAlias = "u")
+    public List<TopSysUser> selectUserList(TopSysUser user) {
+        List<TopSysUser> sysUsers = baseMapper.selectUserList(user);
+        for (TopSysUser sysUser : sysUsers) {
+            List<Long> testList = new ArrayList();
+            for (SysRole role : sysUser.getRoles()) {
+                testList.add(role.getRoleId());
+            }
+            //初始化需要得到的数组
+            Long[] array = new Long[testList.size()];
+
+            //使用for循环得到数组
+            for(int i = 0; i < testList.size();i++){
+                array[i] = testList.get(i);
+            }
+
+            sysUser.setRoleIds(array);
+        }
+        return sysUsers;
+    }
+
+    @Override
+    public List<TopSysUser> queryBusinessPeopleList(CourseBusinessQueryBo bo) {
+        return baseMapper.queryBusinessPeopleList(bo);
+    }
+
+    /**
+     * 通过用户名查询用户
+     *
+     * @param userName 用户名
+     * @return 用户对象信息
+     */
+    @Override
+    public TopSysUser selectUserByUserName(String userName) {
+        return baseMapper.selectUserByUserName(userName);
+    }
+
+    /**
+     * 通过用户ID查询用户
+     *
+     * @param userId 用户ID
+     * @return 用户对象信息
+     */
+    @Override
+    public TopSysUser selectUserById(Long userId) {
+        return baseMapper.selectUserById(userId);
+    }
+
+
+    /**
+     * 校验用户名称是否唯一
+     *
+     * @param userName 用户名称
+     * @return 结果
+     */
+    @Override
+    public String checkUserNameUnique(String userName) {
+        int count = count(new LambdaQueryWrapper<TopSysUser>().eq(TopSysUser::getUserName, userName).ne(TopSysUser::getStatus, -1).last("limit 1"));
+        if (count > 0) {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+
+    /**
+     * 校验用户是否允许操作
+     *
+     * @param user 用户信息
+     */
+    @Override
+    public void checkUserAllowed(TopSysUser user) {
+        if (Validator.isNotNull(user.getUserId()) && user.isAdmin()) {
+            throw new CustomException("不允许操作超级管理员用户");
+        }
+    }
+
+    /**
+     * 新增保存用户信息
+     *
+     * @param user 用户信息
+     * @return 结果
+     */
+    @Override
+    @Transactional
+    public int insertUser(TopSysUser user) {
+        validEntityBeforeSave(user);
+        int rows = baseMapper.insert(user);
+        // 新增用户岗位关联
+        insertUserPost(user);
+        // 新增用户与角色管理
+        insertUserRole(user);
+        return rows;
+    }
+
     /**
-     * 保存前的数据校验
+     * 修改保存用户信息
      *
-     * @param entity 实体类数据
+     * @param user 用户信息
+     * @return 结果
      */
+    @Override
+    @Transactional
+    public int updateUser(TopSysUser user) {
+        validEntityBeforeSave(user);
+        // 新增用户与角色管理
+        if (!user.getStatus().equals(-1)) {
+            insertUserRole(user);
+        }
+        // 新增用户与岗位管理
+        if (!user.getStatus().equals(-1)) {
+            insertUserPost(user);
+        }
+        return baseMapper.updateById(user);
+    }
+
     private void validEntityBeforeSave(TopSysUser entity){
         //TODO 做一些数据校验,如唯一约束
+        if(checkNameUnique(entity)){
+            throw new CustomException("账号名称重复");
+        }
     }
 
-    @Override
-    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 做一些业务上的校验,判断是否需要校验
+    private boolean checkNameUnique(TopSysUser entity) {
+        TopSysUser info = baseMapper.selectUserByUserName(entity.getUserName());
+        if (Validator.isNotNull(info)) {
+            if(Validator.isNotEmpty(entity.getUserId())){
+                if(entity.getUserId().longValue() != info.getUserId().longValue()){
+                    return true;
+                }
+            }else{
+                return true;
+            }
         }
-        return this.removeByIds(ids);
+        return false;
+    }
+
+    /**
+     * 修改用户状态
+     *
+     * @param user 用户信息
+     * @return 结果
+     */
+    @Override
+    public int updateUserStatus(TopSysUser user) {
+        return baseMapper.updateById(user);
     }
 
 
+    /**
+     * 新增用户角色信息
+     *
+     * @param user 用户对象
+     */
+    public void insertUserRole(TopSysUser user) {
+        Long[] roles = user.getRoleIds();
+        if (Validator.isNotNull(roles)) {
+            // 删除用户与角色关联
+            topSysUserRoleMapper.delete(new LambdaQueryWrapper<TopSysUserRole>().eq(TopSysUserRole::getUserId,user.getUserId()));
+            // 新增用户与角色管理
+            List<TopSysUserRole> list = new ArrayList<TopSysUserRole>();
+            for (Long roleId : roles) {
+                TopSysUserRole ur = new TopSysUserRole();
+                ur.setUserId(user.getUserId());
+                ur.setRoleId(roleId);
+                list.add(ur);
+            }
+            if (list.size() > 0) {
+                for (TopSysUserRole sysUserRole : list) {
+                    topSysUserRoleMapper.insert(sysUserRole);
+                }
+            }
+        }
+    }
+
+    /**
+     * 新增用户岗位信息
+     *
+     * @param user 用户对象
+     */
+    public void insertUserPost(TopSysUser user) {
+        Long[] posts = user.getPostIds();
+        if (Validator.isNotNull(posts)) {
+            // 删除用户与岗位关联
+            topSysUserPostMapper.delete(new LambdaQueryWrapper<TopSysUserPost>().eq(TopSysUserPost::getUserId,user.getUserId()));
+            // 新增用户与岗位管理
+            List<TopSysUserPost> list = new ArrayList<TopSysUserPost>();
+            for (Long postId : posts) {
+                TopSysUserPost up = new TopSysUserPost();
+                up.setUserId(user.getUserId());
+                up.setPostId(postId);
+                list.add(up);
+            }
+            if (list.size() > 0) {
+                for (TopSysUserPost sysUserPost : list) {
+                    topSysUserPostMapper.insert(sysUserPost);
+                }
+            }
+        }
+    }
 }

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysConfigVo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.top.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 【请填写功能名称】视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】视图对象")
+public class TopSysConfigVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 参数主键 */
+	@ApiModelProperty("参数主键")
+	private Long configId;
+
+	/** 参数名称 */
+	@Excel(name = "参数名称")
+	@ApiModelProperty("参数名称")
+	private String configName;
+	/** 参数键名 */
+	@Excel(name = "参数键名")
+	@ApiModelProperty("参数键名")
+	private String configKey;
+	/** 参数键值 */
+	@Excel(name = "参数键值")
+	@ApiModelProperty("参数键值")
+	private String configValue;
+	/** 系统内置(Y是 N否) */
+	@Excel(name = "系统内置" , readConverterExp = "Y=是,N=否")
+	@ApiModelProperty("系统内置(Y是 N否)")
+	private String configType;
+	/** 备注 */
+	@Excel(name = "备注")
+	@ApiModelProperty("备注")
+	private String remark;
+	/** 配置模块 */
+	@Excel(name = "配置模块")
+	@ApiModelProperty("配置模块")
+	private String configModule;
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysDeptVo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.top.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+ * 部门视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("部门视图对象")
+public class TopSysDeptVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 部门id */
+	@ApiModelProperty("部门id")
+	private Long deptId;
+
+	/** 父部门id */
+	@Excel(name = "父部门id")
+	@ApiModelProperty("父部门id")
+	private Long parentId;
+	/** 祖级列表 */
+	@Excel(name = "祖级列表")
+	@ApiModelProperty("祖级列表")
+	private String ancestors;
+	/** 部门名称 */
+	@Excel(name = "部门名称")
+	@ApiModelProperty("部门名称")
+	private String deptName;
+	/** 显示顺序 */
+	@Excel(name = "显示顺序")
+	@ApiModelProperty("显示顺序")
+	private Long orderNum;
+	/** 负责人 */
+	@Excel(name = "负责人")
+	@ApiModelProperty("负责人")
+	private String leader;
+	/** 联系电话 */
+	@Excel(name = "联系电话")
+	@ApiModelProperty("联系电话")
+	private String phone;
+	/** 邮箱 */
+	@Excel(name = "邮箱")
+	@ApiModelProperty("邮箱")
+	private String email;
+	/** 部门状态(0正常 1停用) */
+	@Excel(name = "部门状态" , readConverterExp = "0=正常,1=停用")
+	@ApiModelProperty("部门状态(0正常 1停用)")
+	private String status;
+}

+ 79 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysMenuVo.java

@@ -0,0 +1,79 @@
+package com.zhongzheng.modules.top.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 【请填写功能名称】视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】视图对象")
+public class TopSysMenuVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 菜单ID */
+	@ApiModelProperty("菜单ID")
+	private Long menuId;
+
+	/** 菜单名称 */
+	@Excel(name = "菜单名称")
+	@ApiModelProperty("菜单名称")
+	private String menuName;
+	/** 父菜单ID */
+	@Excel(name = "父菜单ID")
+	@ApiModelProperty("父菜单ID")
+	private Long parentId;
+	/** 显示顺序 */
+	@Excel(name = "显示顺序")
+	@ApiModelProperty("显示顺序")
+	private Long orderNum;
+	/** 路由地址 */
+	@Excel(name = "路由地址")
+	@ApiModelProperty("路由地址")
+	private String path;
+	/** 组件路径 */
+	@Excel(name = "组件路径")
+	@ApiModelProperty("组件路径")
+	private String component;
+	/** 是否为外链(0是 1否) */
+	@Excel(name = "是否为外链" , readConverterExp = "0=是,1=否")
+	@ApiModelProperty("是否为外链(0是 1否)")
+	private Long isFrame;
+	/** 是否缓存(0缓存 1不缓存) */
+	@Excel(name = "是否缓存" , readConverterExp = "0=缓存,1=不缓存")
+	@ApiModelProperty("是否缓存(0缓存 1不缓存)")
+	private Long isCache;
+	/** 菜单类型(M目录 C菜单 F按钮) */
+	@Excel(name = "菜单类型" , readConverterExp = "M=目录,C=菜单,F=按钮")
+	@ApiModelProperty("菜单类型(M目录 C菜单 F按钮)")
+	private String menuType;
+	/** 菜单状态(1显示 0隐藏) */
+	@Excel(name = "菜单状态" , readConverterExp = "1=显示,0=隐藏")
+	@ApiModelProperty("菜单状态(1显示 0隐藏)")
+	private String visible;
+	/** 菜单状态(1正常 0停用) */
+	@Excel(name = "菜单状态" , readConverterExp = "1=正常,0=停用")
+	@ApiModelProperty("菜单状态(1正常 0停用)")
+	private String status;
+	/** 权限标识 */
+	@Excel(name = "权限标识")
+	@ApiModelProperty("权限标识")
+	private String perms;
+	/** 菜单图标 */
+	@Excel(name = "菜单图标")
+	@ApiModelProperty("菜单图标")
+	private String icon;
+	/** 备注 */
+	@Excel(name = "备注")
+	@ApiModelProperty("备注")
+	private String remark;
+}

+ 27 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysRoleMenuVo.java

@@ -0,0 +1,27 @@
+package com.zhongzheng.modules.top.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 【请填写功能名称】视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("【请填写功能名称】视图对象")
+public class TopSysRoleMenuVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 角色ID */
+	@ApiModelProperty("角色ID")
+	private Long roleId;
+
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysRoleVo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.top.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+ * 角色信息视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("角色信息视图对象")
+public class TopSysRoleVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 角色ID */
+	@ApiModelProperty("角色ID")
+	private Long roleId;
+
+	/** 角色名称 */
+	@Excel(name = "角色名称")
+	@ApiModelProperty("角色名称")
+	private String roleName;
+	/** 角色权限字符串 */
+	@Excel(name = "角色权限字符串")
+	@ApiModelProperty("角色权限字符串")
+	private String roleKey;
+	/** 显示顺序 */
+	@Excel(name = "显示顺序")
+	@ApiModelProperty("显示顺序")
+	private Long roleSort;
+	/** 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) */
+	@Excel(name = "数据范围" , readConverterExp = "1=:全部数据权限,2=:自定数据权限,3=:本部门数据权限,4=:本部门及以下数据权限")
+	@ApiModelProperty("数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)")
+	private String dataScope;
+	/** 菜单树选择项是否关联显示 */
+	@Excel(name = "菜单树选择项是否关联显示")
+	@ApiModelProperty("菜单树选择项是否关联显示")
+	private Integer menuCheckStrictly;
+	/** 部门树选择项是否关联显示 */
+	@Excel(name = "部门树选择项是否关联显示")
+	@ApiModelProperty("部门树选择项是否关联显示")
+	private Integer deptCheckStrictly;
+	/** 角色状态(1正常 0停用) */
+	@Excel(name = "角色状态" , readConverterExp = "1=正常,0=停用")
+	@ApiModelProperty("角色状态(1正常 0停用)")
+	private String status;
+	/** 备注 */
+	@Excel(name = "备注")
+	@ApiModelProperty("备注")
+	private String remark;
+}

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/top/vo/TopSysUserRoleVo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.top.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+ * 用户和角色关联视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@ApiModel("用户和角色关联视图对象")
+public class TopSysUserRoleVo {
+	private static final long serialVersionUID = 1L;
+
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+
+}

+ 22 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopSysConfigMapper.xml

@@ -0,0 +1,22 @@
+<?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.zhongzheng.system.mapper.TopSysConfigMapper">
+
+    <resultMap type="com.zhongzheng.system.domain.TopSysConfig" id="TopSysConfigResult">
+        <result property="configId" column="config_id"/>
+        <result property="configName" column="config_name"/>
+        <result property="configKey" column="config_key"/>
+        <result property="configValue" column="config_value"/>
+        <result property="configType" column="config_type"/>
+        <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"/>
+        <result property="configModule" column="config_module"/>
+    </resultMap>
+
+
+</mapper>

+ 25 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopSysDeptMapper.xml

@@ -0,0 +1,25 @@
+<?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.zhongzheng.system.mapper.TopSysDeptMapper">
+
+    <resultMap type="com.zhongzheng.system.domain.TopSysDept" id="TopSysDeptResult">
+        <result property="deptId" column="dept_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="ancestors" column="ancestors"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="leader" column="leader"/>
+        <result property="phone" column="phone"/>
+        <result property="email" column="email"/>
+        <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"/>
+    </resultMap>
+
+
+</mapper>

+ 29 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopSysMenuMapper.xml

@@ -0,0 +1,29 @@
+<?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.zhongzheng.system.mapper.TopSysMenuMapper">
+
+    <resultMap type="com.zhongzheng.system.domain.TopSysMenu" id="TopSysMenuResult">
+        <result property="menuId" column="menu_id"/>
+        <result property="menuName" column="menu_name"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="path" column="path"/>
+        <result property="component" column="component"/>
+        <result property="isFrame" column="is_frame"/>
+        <result property="isCache" column="is_cache"/>
+        <result property="menuType" column="menu_type"/>
+        <result property="visible" column="visible"/>
+        <result property="status" column="status"/>
+        <result property="perms" column="perms"/>
+        <result property="icon" column="icon"/>
+        <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>
+
+
+</mapper>

+ 59 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopSysRoleMapper.xml

@@ -0,0 +1,59 @@
+<?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.zhongzheng.modules.top.mapper.TopSysRoleMapper">
+
+    <resultMap type="com.zhongzheng.modules.top.domain.TopSysRole" id="TopSysRoleResult">
+        <result 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="selectRolePermissionByUserId" parameterType="Long" resultMap="TopSysRoleResult">
+        <include refid="selectRoleVo"/>
+        WHERE r.del_flag = '0' and ur.user_id = #{userId}
+    </select>
+
+    <select id="selectRoleListByUserId" parameterType="Long" resultType="Integer">
+        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="selectRolesByUserName" parameterType="String" resultMap="TopSysRoleResult">
+        <include refid="selectRoleVo"/>
+        WHERE r.del_flag = '0' and u.user_name = #{userName}
+    </select>
+</mapper>

+ 13 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopSysRoleMenuMapper.xml

@@ -0,0 +1,13 @@
+<?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.zhongzheng.system.mapper.TopSysRoleMenuMapper">
+
+    <resultMap type="com.zhongzheng.system.domain.TopSysRoleMenu" id="TopSysRoleMenuResult">
+        <result property="roleId" column="role_id"/>
+        <result property="menuId" column="menu_id"/>
+    </resultMap>
+
+
+</mapper>

+ 64 - 3
zhongzheng-system/src/main/resources/mapper/modules/top/TopSysUserMapper.xml

@@ -9,7 +9,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="deptId" column="dept_id"/>
         <result property="userName" column="user_name"/>
         <result property="nickName" column="nick_name"/>
-        <result property="userType" column="user_type"/>
         <result property="email" column="email"/>
         <result property="phonenumber" column="phonenumber"/>
         <result property="sex" column="sex"/>
@@ -61,8 +60,70 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                  left join top_sys_role r on r.role_id = ur.role_id
     </sql>
 
-    <select id="selectUserByUserName" parameterType="String" resultMap="TopSysUserResult">
+
+    <select id="selectUserList" parameterType="com.zhongzheng.common.core.domain.entity.TopSysUser" resultType="com.zhongzheng.common.core.domain.entity.TopSysUser">
+        select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex,
+        u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader,
+        u.code from
+        top_sys_user u
+        left join top_sys_dept d on u.dept_id = d.dept_id
+        <if test="roleName != null and roleName != ''">
+            left join top_sys_user_role ur on ur.user_id = u.user_id
+            left join top_sys_role r on ur.role_id = r.role_id
+        </if>
+        where u.del_flag = '0'
+        <if test="roleName != null and roleName != ''">
+            AND r.role_name = #{roleName}
+        </if>
+        <if test="userName != null and userName != ''">
+            AND u.user_name like concat('%', #{userName}, '%')
+        </if>
+        <if test="status != null and status != ''">
+            AND u.status = #{status}
+        </if>
+        <if test="phonenumber != null and phonenumber != ''">
+            AND u.phonenumber like concat('%', #{phonenumber}, '%')
+        </if>
+        <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
+            AND date_format(u.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(u.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
+        </if>
+        <if test="deptId != null and deptId != 0">
+            AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM top_sys_dept t WHERE find_in_set(#{deptId},
+            ancestors) ))
+        </if>
+        <if test="statusArray != null and statusArray.size()!=0 ">
+            AND u.status in
+            <foreach collection="statusArray" item="item" index="index" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        order by u.create_time desc
+        <!-- 数据范围过滤 -->
+        ${params.dataScope}
+    </select>
+
+    <select id="selectUserByUserName" parameterType="String" resultType="com.zhongzheng.common.core.domain.entity.TopSysUser">
         <include refid="selectTopUserVo"/>
-        where u.user_name = #{userName}
+        where u.user_name = #{userName} and u.`status` != -1
+    </select>
+
+    <select id="selectUserById" parameterType="Long" resultType="com.zhongzheng.common.core.domain.entity.TopSysUser">
+        <include refid="selectTopUserVo"/>
+        where u.user_id = #{userId}
+    </select>
+
+    <select id="queryBusinessPeopleList" parameterType="com.zhongzheng.modules.course.bo.CourseBusinessQueryBo"  resultType="com.zhongzheng.common.core.domain.entity.TopSysUser">
+        SELECT
+            u.*
+        FROM
+            sys_role_business b
+                JOIN top_sys_user_role r ON b.role_id = r.role_id
+                AND b.business_id = #{id}
+                JOIN top_sys_user u ON r.user_id = u.user_id
+        where u.`status` = 1
+
     </select>
 </mapper>

+ 13 - 0
zhongzheng-system/src/main/resources/mapper/modules/top/TopSysUserRoleMapper.xml

@@ -0,0 +1,13 @@
+<?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.zhongzheng.system.mapper.TopSysUserRoleMapper">
+
+    <resultMap type="com.zhongzheng.system.domain.TopSysUserRole" id="TopSysUserRoleResult">
+        <result property="userId" column="user_id"/>
+        <result property="roleId" column="role_id"/>
+    </resultMap>
+
+
+</mapper>