Bladeren bron

优化单体代码结构

hubin 2 jaren geleden
bovenliggende
commit
480424e486
75 gewijzigde bestanden met toevoegingen van 3586 en 7 verwijderingen
  1. 1 3
      build.gradle
  2. 0 4
      src/main/java/com/aizuda/boot/BootApplication.java
  3. 41 0
      src/main/java/com/aizuda/boot/auth/controller/LoginController.java
  4. 29 0
      src/main/java/com/aizuda/boot/auth/param/LoginParam.java
  5. 32 0
      src/main/java/com/aizuda/boot/auth/service/IAuthService.java
  6. 65 0
      src/main/java/com/aizuda/boot/auth/service/impl/AuthServiceImpl.java
  7. 65 0
      src/main/java/com/aizuda/boot/config/Authorization.java
  8. 72 0
      src/main/java/com/aizuda/boot/system/controller/SysAppController.java
  9. 72 0
      src/main/java/com/aizuda/boot/system/controller/SysConfigureController.java
  10. 81 0
      src/main/java/com/aizuda/boot/system/controller/SysDepartmentController.java
  11. 80 0
      src/main/java/com/aizuda/boot/system/controller/SysDictController.java
  12. 73 0
      src/main/java/com/aizuda/boot/system/controller/SysPostController.java
  13. 72 0
      src/main/java/com/aizuda/boot/system/controller/SysRegionController.java
  14. 101 0
      src/main/java/com/aizuda/boot/system/controller/SysResourceController.java
  15. 105 0
      src/main/java/com/aizuda/boot/system/controller/SysRoleController.java
  16. 100 0
      src/main/java/com/aizuda/boot/system/controller/SysUserController.java
  17. 62 0
      src/main/java/com/aizuda/boot/system/entity/SysApp.java
  18. 53 0
      src/main/java/com/aizuda/boot/system/entity/SysConfigure.java
  19. 65 0
      src/main/java/com/aizuda/boot/system/entity/SysDepartment.java
  20. 60 0
      src/main/java/com/aizuda/boot/system/entity/SysDict.java
  21. 52 0
      src/main/java/com/aizuda/boot/system/entity/SysPost.java
  22. 57 0
      src/main/java/com/aizuda/boot/system/entity/SysRegion.java
  23. 83 0
      src/main/java/com/aizuda/boot/system/entity/SysResource.java
  24. 41 0
      src/main/java/com/aizuda/boot/system/entity/SysResourceApi.java
  25. 53 0
      src/main/java/com/aizuda/boot/system/entity/SysRole.java
  26. 37 0
      src/main/java/com/aizuda/boot/system/entity/SysRoleResource.java
  27. 76 0
      src/main/java/com/aizuda/boot/system/entity/SysUser.java
  28. 37 0
      src/main/java/com/aizuda/boot/system/entity/SysUserRole.java
  29. 34 0
      src/main/java/com/aizuda/boot/system/entity/enums/ResourceType.java
  30. 32 0
      src/main/java/com/aizuda/boot/system/entity/param/AssignRolesParam.java
  31. 34 0
      src/main/java/com/aizuda/boot/system/entity/param/ResetPasswordParam.java
  32. 29 0
      src/main/java/com/aizuda/boot/system/entity/param/ResourceParam.java
  33. 32 0
      src/main/java/com/aizuda/boot/system/entity/param/RoleResourceParam.java
  34. 28 0
      src/main/java/com/aizuda/boot/system/entity/param/SysUserParam.java
  35. 27 0
      src/main/java/com/aizuda/boot/system/entity/vo/MenuVO.java
  36. 26 0
      src/main/java/com/aizuda/boot/system/entity/vo/ResourceTreeVO.java
  37. 21 0
      src/main/java/com/aizuda/boot/system/entity/vo/SysDepartmentVO.java
  38. 22 0
      src/main/java/com/aizuda/boot/system/entity/vo/SysRegionVO.java
  39. 23 0
      src/main/java/com/aizuda/boot/system/entity/vo/SysUserVO.java
  40. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysAppMapper.java
  41. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysConfigureMapper.java
  42. 33 0
      src/main/java/com/aizuda/boot/system/mapper/SysDepartmentMapper.java
  43. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysDictMapper.java
  44. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysPostMapper.java
  45. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysRegionMapper.java
  46. 28 0
      src/main/java/com/aizuda/boot/system/mapper/SysResourceApiMapper.java
  47. 34 0
      src/main/java/com/aizuda/boot/system/mapper/SysResourceMapper.java
  48. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysRoleMapper.java
  49. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysRoleResourceMapper.java
  50. 31 0
      src/main/java/com/aizuda/boot/system/mapper/SysUserMapper.java
  51. 23 0
      src/main/java/com/aizuda/boot/system/mapper/SysUserRoleMapper.java
  52. 22 0
      src/main/java/com/aizuda/boot/system/service/ISysAppService.java
  53. 22 0
      src/main/java/com/aizuda/boot/system/service/ISysConfigureService.java
  54. 26 0
      src/main/java/com/aizuda/boot/system/service/ISysDepartmentService.java
  55. 29 0
      src/main/java/com/aizuda/boot/system/service/ISysDictService.java
  56. 22 0
      src/main/java/com/aizuda/boot/system/service/ISysPostService.java
  57. 23 0
      src/main/java/com/aizuda/boot/system/service/ISysRegionService.java
  58. 38 0
      src/main/java/com/aizuda/boot/system/service/ISysResourceApiService.java
  59. 48 0
      src/main/java/com/aizuda/boot/system/service/ISysResourceService.java
  60. 45 0
      src/main/java/com/aizuda/boot/system/service/ISysRoleResourceService.java
  61. 45 0
      src/main/java/com/aizuda/boot/system/service/ISysRoleService.java
  62. 45 0
      src/main/java/com/aizuda/boot/system/service/ISysUserRoleService.java
  63. 31 0
      src/main/java/com/aizuda/boot/system/service/ISysUserService.java
  64. 31 0
      src/main/java/com/aizuda/boot/system/service/impl/SysAppServiceImpl.java
  65. 31 0
      src/main/java/com/aizuda/boot/system/service/impl/SysConfigureServiceImpl.java
  66. 92 0
      src/main/java/com/aizuda/boot/system/service/impl/SysDepartmentServiceImpl.java
  67. 72 0
      src/main/java/com/aizuda/boot/system/service/impl/SysDictServiceImpl.java
  68. 31 0
      src/main/java/com/aizuda/boot/system/service/impl/SysPostServiceImpl.java
  69. 95 0
      src/main/java/com/aizuda/boot/system/service/impl/SysRegionServiceImpl.java
  70. 40 0
      src/main/java/com/aizuda/boot/system/service/impl/SysResourceApiServiceImpl.java
  71. 178 0
      src/main/java/com/aizuda/boot/system/service/impl/SysResourceServiceImpl.java
  72. 68 0
      src/main/java/com/aizuda/boot/system/service/impl/SysRoleResourceServiceImpl.java
  73. 70 0
      src/main/java/com/aizuda/boot/system/service/impl/SysRoleServiceImpl.java
  74. 77 0
      src/main/java/com/aizuda/boot/system/service/impl/SysUserRoleServiceImpl.java
  75. 122 0
      src/main/java/com/aizuda/boot/system/service/impl/SysUserServiceImpl.java

+ 1 - 3
build.gradle

@@ -66,9 +66,7 @@ dependencyManagement {
 }
 
 dependencies {
-    implementation("com.aizuda:aizuda-service-auth:1.0.0") {
-        exclude module: "spring-boot-starter-logging"
-    }
+    implementation("com.aizuda:aizuda-service-parent:1.0.0")
     implementation("com.lmax:disruptor:3.4.4")
     // 监控
     implementation("com.aizuda:aizuda-monitor")

+ 0 - 4
src/main/java/com/aizuda/boot/BootApplication.java

@@ -11,10 +11,7 @@
 package com.aizuda.boot;
 
 import com.aizuda.service.Aizuda;
-import com.aizuda.service.auth.AuthApplication;
-import com.aizuda.service.system.SystemApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Import;
 
 /**
  * 爱组搭 http://aizuda.com
@@ -22,7 +19,6 @@ import org.springframework.context.annotation.Import;
  * @author 青苗
  * @since 2021-10-28
  */
-@Import({AuthApplication.class, SystemApplication.class})
 @SpringBootApplication
 public class BootApplication {
 

+ 41 - 0
src/main/java/com/aizuda/boot/auth/controller/LoginController.java

@@ -0,0 +1,41 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.auth.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.service.auth.param.LoginParam;
+import com.aizuda.service.auth.service.IAuthService;
+import com.baomidou.kisso.annotation.LoginIgnore;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * 登录 前端控制器
+ *
+ * @author 青苗
+ * @since 2021-12-27
+ */
+@Tag(name = "授权")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/auth/login")
+public class LoginController extends ApiController {
+    private IAuthService authService;
+
+    @Operation(summary = "登录系统")
+    @LoginIgnore
+    @PostMapping("/system")
+    public Map<String, Object> loginSystem(@RequestBody LoginParam loginParam) {
+        return authService.login(request, response, loginParam);
+    }
+}

+ 29 - 0
src/main/java/com/aizuda/boot/auth/param/LoginParam.java

@@ -0,0 +1,29 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.auth.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * 登录参数
+ *
+ * @author 青苗
+ * @since 2021-12-27
+ */
+@Getter
+@Setter
+@Schema(name = "LoginParam", description = "登录参数")
+public class LoginParam implements Serializable {
+    @Schema(description = "登录名称")
+    private String username;
+    @Schema(description = "登录密码")
+    private String password;
+
+}

+ 32 - 0
src/main/java/com/aizuda/boot/auth/service/IAuthService.java

@@ -0,0 +1,32 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.auth.service;
+
+import com.aizuda.boot.auth.param.LoginParam;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.util.Map;
+
+/**
+ * 授权 服务
+ *
+ * @author 青苗
+ * @since 2021-12-27
+ */
+public interface IAuthService {
+
+    /**
+     * 登录设置 COOKIE
+     *
+     * @param request    请求
+     * @param response   响应
+     * @param loginParam 登录参数
+     * @return 菜单权限 Map
+     */
+    Map<String, Object> login(HttpServletRequest request, HttpServletResponse response, LoginParam loginParam);
+
+}

+ 65 - 0
src/main/java/com/aizuda/boot/auth/service/impl/AuthServiceImpl.java

@@ -0,0 +1,65 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.auth.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.boot.auth.param.LoginParam;
+import com.aizuda.boot.auth.service.IAuthService;
+import com.aizuda.boot.system.entity.SysUser;
+import com.aizuda.boot.system.service.ISysUserService;
+import com.baomidou.kisso.common.encrypt.MD5Salt;
+import com.baomidou.kisso.enums.TokenOrigin;
+import com.baomidou.kisso.security.token.SSOToken;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 授权 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-12-27
+ */
+@Service
+@AllArgsConstructor
+public class AuthServiceImpl implements IAuthService {
+    private ISysUserService sysUserService;
+
+    @Override
+    public Map<String, Object> login(HttpServletRequest request, HttpServletResponse response, LoginParam loginParam) {
+        ApiAssert.fail(StringUtils.isEmpty(loginParam.getUsername())
+                || StringUtils.isEmpty(loginParam.getPassword()), "用户名密码不能为空");
+        List<SysUser> userList = sysUserService.list(Wrappers.<SysUser>query().eq("username", loginParam.getUsername()));
+        ApiAssert.fail(null == userList || userList.size() != 1, "用户不存或异常数据");
+        SysUser user = userList.get(0);
+        ApiAssert.fail(Objects.equals(0, user.getStatus()), "用户已禁用,请联系管理员");
+        ApiAssert.fail(!MD5Salt.isValid(user.getUsername() + user.getSalt()
+                , user.getPassword(), loginParam.getPassword()), "登录密码错误");
+        // 设置登录 COOKIE
+        SSOToken st = new SSOToken();
+        st.setId(user.getId());
+        st.setIssuer(user.getUsername());
+        st.setUserAgent(request);
+        st.setOrigin(TokenOrigin.HTML5);
+        // 登录信息
+        Map<String, Object> loginInfo = new HashMap<>(4);
+        loginInfo.put("token", st.getToken());
+        loginInfo.put("userInfo", new HashMap<String, Object>(2) {{
+            put("userId", user.getId());
+            put("userName", user.getNickName());
+        }});
+        return loginInfo;
+    }
+
+}

+ 65 - 0
src/main/java/com/aizuda/boot/config/Authorization.java

@@ -0,0 +1,65 @@
+package com.aizuda.boot.config;
+
+import com.aizuda.boot.system.service.ISysResourceApiService;
+import com.aizuda.service.web.UserSession;
+import com.baomidou.kisso.SSOAuthorization;
+import com.baomidou.kisso.security.token.SSOToken;
+import com.github.benmanes.caffeine.cache.Cache;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import jakarta.annotation.Resource;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 权限授权处理器
+ *
+ * @author hubin
+ * @since 2021-11-16
+ */
+@Component
+public class Authorization implements SSOAuthorization {
+    @Resource
+    private ISysResourceApiService sysResourceApiService;
+
+    /**
+     * 用户权限编码列表缓存 15 分钟
+     */
+    protected Cache<Long, List<String>> codeListCache = Caffeine.newBuilder()
+            .expireAfterWrite(15, TimeUnit.MINUTES)
+            .maximumSize(1000)
+            .build();
+
+    /**
+     * 用户权限编码校验缓存 5 分钟
+     */
+    protected Cache<String, Boolean> codeCache = Caffeine.newBuilder()
+            .expireAfterWrite(5, TimeUnit.MINUTES)
+            .maximumSize(6000)
+            .build();
+
+    @Override
+    public boolean isPermitted(SSOToken token, String permission) {
+        Long userId = Long.valueOf(token.getId());
+        if (UserSession.isAdmin(userId)) {
+            // 超级管理员免鉴权
+            return true;
+        }
+        final String key = userId + permission;
+        Boolean legalKey = codeCache.getIfPresent(key);
+        if (null != legalKey) {
+            return legalKey;
+        }
+        List<String> codeList = codeListCache.getIfPresent(userId);
+        if (CollectionUtils.isEmpty(codeList)) {
+            codeList = sysResourceApiService.listCodesByUserId(userId);
+            codeListCache.put(userId, codeList);
+        }
+        // 判断当前权限编码是否存在
+        legalKey = codeList.contains(permission);
+        codeCache.put(key, legalKey);
+        return legalKey;
+    }
+}

+ 72 - 0
src/main/java/com/aizuda/boot/system/controller/SysAppController.java

@@ -0,0 +1,72 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.entity.SysApp;
+import com.aizuda.boot.system.service.ISysAppService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 应用 前端控制器
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Tag(name = "应用")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/app")
+public class SysAppController extends ApiController {
+    private ISysAppService sysAppService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:app:page")
+    @PostMapping("/page")
+    public Page<SysApp> getPage(@RequestBody PageParam<SysApp> dto) {
+        return sysAppService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:app:get")
+    @GetMapping("/get")
+    public SysApp get(@RequestParam Long id) {
+        return sysAppService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:app:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysApp sysApp) {
+        return sysAppService.updateById(sysApp);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:app:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysApp sysApp) {
+        return sysAppService.save(sysApp);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:app:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysAppService.removeByIds(ids);
+    }
+}

+ 72 - 0
src/main/java/com/aizuda/boot/system/controller/SysConfigureController.java

@@ -0,0 +1,72 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.entity.SysConfigure;
+import com.aizuda.boot.system.service.ISysConfigureService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 扩展配置 前端控制器
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Tag(name = "扩展配置")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/configure")
+public class SysConfigureController extends ApiController {
+    private ISysConfigureService sysConfigureService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:configure:page")
+    @PostMapping("/page")
+    public Page<SysConfigure> getPage(@RequestBody PageParam<SysConfigure> dto) {
+        return sysConfigureService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:configure:get")
+    @GetMapping("/get")
+    public SysConfigure get(@RequestParam Long id) {
+        return sysConfigureService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:configure:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysConfigure sysConfigure) {
+        return sysConfigureService.updateById(sysConfigure);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:configure:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysConfigure sysConfigure) {
+        return sysConfigureService.save(sysConfigure);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:configure:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysConfigureService.removeByIds(ids);
+    }
+}

+ 81 - 0
src/main/java/com/aizuda/boot/system/controller/SysDepartmentController.java

@@ -0,0 +1,81 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.config.SystemAutoConfiguration;
+import com.aizuda.boot.system.entity.SysDepartment;
+import com.aizuda.boot.system.entity.vo.SysDepartmentVO;
+import com.aizuda.boot.system.service.ISysDepartmentService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 部门 前端控制器
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Tag(name = "部门")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/department")
+public class SysDepartmentController extends ApiController {
+    private ISysDepartmentService sysDepartmentService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:department:page")
+    @PostMapping("/page")
+    public Page<SysDepartment> getPage(@RequestBody PageParam<SysDepartment> dto) {
+        return sysDepartmentService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "树列表")
+    @Permission("sys:department:listTree")
+    @PostMapping("/list-tree")
+    public List<SysDepartmentVO> listTree(@RequestBody SysDepartment sysDepartment) {
+        return sysDepartmentService.listTree(sysDepartment);
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:department:get")
+    @GetMapping("/get")
+    public SysDepartment get(@RequestParam Long id) {
+        return sysDepartmentService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:department:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysDepartment sysDepartment) {
+        return sysDepartmentService.updateById(sysDepartment);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:department:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysDepartment sysDepartment) {
+        return sysDepartmentService.save(sysDepartment);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:department:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysDepartmentService.removeByIds(ids);
+    }
+}

+ 80 - 0
src/main/java/com/aizuda/boot/system/controller/SysDictController.java

@@ -0,0 +1,80 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.config.SystemAutoConfiguration;
+import com.aizuda.boot.system.entity.SysDict;
+import com.aizuda.boot.system.service.ISysDictService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 系统字典 前端控制器
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Tag(name = "系统字典")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/dict")
+public class SysDictController extends ApiController {
+    private ISysDictService sysDictService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:dict:page")
+    @PostMapping("/page")
+    public Page<SysDict> getPage(@RequestBody PageParam<SysDict> dto) {
+        return sysDictService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "父级字典列表")
+    @Permission("sys:dict:listParent")
+    @GetMapping("/list-parent")
+    public List<SysDict> listParent() {
+        return sysDictService.listParent();
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:dict:get")
+    @GetMapping("/get")
+    public SysDict get(@RequestParam Long id) {
+        return sysDictService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:dict:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysDict sysDict) {
+        return sysDictService.updateById(sysDict);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:dict:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysDict sysDict) {
+        return sysDictService.save(sysDict);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:dict:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysDictService.removeByIds(ids);
+    }
+}

+ 73 - 0
src/main/java/com/aizuda/boot/system/controller/SysPostController.java

@@ -0,0 +1,73 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.config.SystemAutoConfiguration;
+import com.aizuda.boot.system.entity.SysPost;
+import com.aizuda.boot.system.service.ISysPostService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 岗位 前端控制器
+ *
+ * @author 青苗
+ * @since 2022-02-18
+ */
+@Tag(name = "岗位")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/post")
+public class SysPostController extends ApiController {
+    private ISysPostService sysPostService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:post:page")
+    @PostMapping("/page")
+    public Page<SysPost> getPage(@RequestBody PageParam<SysPost> dto) {
+        return sysPostService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:post:get")
+    @GetMapping("/get")
+    public SysPost get(@RequestParam Long id) {
+        return sysPostService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:post:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysPost sysPost) {
+        return sysPostService.updateById(sysPost);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:post:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysPost sysPost) {
+        return sysPostService.save(sysPost);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:post:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysPostService.removeByIds(ids);
+    }
+}

+ 72 - 0
src/main/java/com/aizuda/boot/system/controller/SysRegionController.java

@@ -0,0 +1,72 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.config.SystemAutoConfiguration;
+import com.aizuda.boot.system.entity.SysRegion;
+import com.aizuda.boot.system.entity.vo.SysRegionVO;
+import com.aizuda.boot.system.service.ISysRegionService;
+import com.baomidou.kisso.annotation.Permission;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 行政区域 前端控制器
+ *
+ * @author 青苗
+ * @since 2022-02-22
+ */
+@Tag(name = "行政区域")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/region")
+public class SysRegionController extends ApiController {
+    private ISysRegionService sysRegionService;
+
+    @Operation(summary = "树列表")
+    @Permission("sys:region:listTree")
+    @PostMapping("/list-tree")
+    public List<SysRegionVO> listTree(@RequestBody SysRegion sysRegion) {
+        return sysRegionService.listTree(sysRegion);
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:region:get")
+    @GetMapping("/get")
+    public SysRegion get(@RequestParam Long id) {
+        return sysRegionService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:region:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysRegion sysRegion) {
+        return sysRegionService.updateById(sysRegion);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:region:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysRegion sysRegion) {
+        return sysRegionService.save(sysRegion);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:region:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysRegionService.removeByIds(ids);
+    }
+}

+ 101 - 0
src/main/java/com/aizuda/boot/system/controller/SysResourceController.java

@@ -0,0 +1,101 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.config.SystemAutoConfiguration;
+import com.aizuda.boot.system.entity.SysResource;
+import com.aizuda.boot.system.entity.SysResourceApi;
+import com.aizuda.boot.system.entity.param.ResourceParam;
+import com.aizuda.boot.system.entity.vo.ResourceTreeVO;
+import com.aizuda.boot.system.service.ISysResourceApiService;
+import com.aizuda.boot.system.service.ISysResourceService;
+import com.aizuda.service.web.UserSession;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统资源 前端控制器
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Tag(name = "系统资源")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/resource")
+public class SysResourceController extends ApiController {
+    private ISysResourceService sysResourceService;
+    private ISysResourceApiService sysResourceApiService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:resource:page")
+    @PostMapping("/page")
+    public Page<SysResource> getPage(@RequestBody PageParam<SysResource> dto) {
+        return sysResourceService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "树列表")
+    @Permission("sys:resource:listTree")
+    @GetMapping("/list-tree")
+    public List<ResourceTreeVO> listTree() {
+        return sysResourceService.listTree();
+    }
+
+    @Operation(summary = "接口列表")
+    @Permission("sys:resource:listApi")
+    @GetMapping("/list-api")
+    public List<SysResourceApi> listApi(@RequestParam Long id) {
+        return sysResourceApiService.listByResourceId(id);
+    }
+
+    @Operation(summary = "权限菜单列表")
+    @Permission(ignore = true)
+    @GetMapping("/list-menu-permissions")
+    public Map<String, Object> listMenuPermissions() {
+        return sysResourceService.listMenuPermissions(UserSession.getLoginInfo());
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:resource:get")
+    @GetMapping("/get")
+    public SysResource get(@RequestParam Long id) {
+        return sysResourceService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:resource:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody ResourceParam param) {
+        return sysResourceService.updateByResourceParam(param);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:resource:create")
+    @PostMapping("/create")
+    public Long create(@Validated(Create.class) @RequestBody SysResource sysResource) {
+        return sysResourceService.save(sysResource) ? sysResource.getId() : null;
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:resource:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysResourceService.removeByIds(ids);
+    }
+}

+ 105 - 0
src/main/java/com/aizuda/boot/system/controller/SysRoleController.java

@@ -0,0 +1,105 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.config.SystemAutoConfiguration;
+import com.aizuda.boot.system.entity.SysRole;
+import com.aizuda.boot.system.entity.param.RoleResourceParam;
+import com.aizuda.boot.system.service.ISysRoleResourceService;
+import com.aizuda.boot.system.service.ISysRoleService;
+import com.aizuda.service.vo.TreeVO;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 系统角色 前端控制器
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Tag(name = "系统角色")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/role")
+public class SysRoleController extends ApiController {
+    private ISysRoleService sysRoleService;
+    private ISysRoleResourceService sysRoleResourceService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:role:page")
+    @PostMapping("/page")
+    public Page<SysRole> getPage(@RequestBody PageParam<SysRole> dto) {
+        return sysRoleService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "列表树")
+    @Permission("sys:role:listTree")
+    @GetMapping("/list-tree")
+    public List<TreeVO> listTree() {
+        return sysRoleService.listTree();
+    }
+
+    @Operation(summary = "列表(显示所有角色)")
+    @Permission("sys:role:listAll")
+    @GetMapping("/list-all")
+    public List<SysRole> listAll() {
+        return sysRoleService.listAll();
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:role:get")
+    @GetMapping("/get")
+    public SysRole get(@RequestParam Long id) {
+        return sysRoleService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:role:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysRole sysRole) {
+        return sysRoleService.updateById(sysRole);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:role:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysRole sysRole) {
+        return sysRoleService.save(sysRole);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:role:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysRoleService.removeCheckByIds(ids);
+    }
+
+    @Operation(summary = "设置角色资源权限")
+    @Permission("sys:role:resourceSet")
+    @PostMapping("/resource-set")
+    public boolean resourceSet(@Validated @RequestBody RoleResourceParam param) {
+        return sysRoleResourceService.saveByRoleResourceParam(param);
+    }
+
+    @Operation(summary = "查询角色资源权限ID列表")
+    @Permission("sys:role:resourceIds")
+    @GetMapping("/resource-ids")
+    public List<Long> resourceIds(@RequestParam Long id) {
+        return sysRoleResourceService.listByRoleId(id);
+    }
+}

+ 100 - 0
src/main/java/com/aizuda/boot/system/controller/SysUserController.java

@@ -0,0 +1,100 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.system.config.SystemAutoConfiguration;
+import com.aizuda.boot.system.entity.SysUser;
+import com.aizuda.boot.system.entity.param.AssignRolesParam;
+import com.aizuda.boot.system.entity.param.ResetPasswordParam;
+import com.aizuda.boot.system.entity.param.SysUserParam;
+import com.aizuda.boot.system.entity.vo.SysUserVO;
+import com.aizuda.boot.system.service.ISysUserRoleService;
+import com.aizuda.boot.system.service.ISysUserService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 系统用户 前端控制器
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Tag(name = "系统用户")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/sys/user")
+public class SysUserController extends ApiController {
+    private ISysUserService sysUserService;
+    private ISysUserRoleService sysUserRoleService;
+
+    @Operation(summary = "分页列表")
+    @Permission("sys:user:page")
+    @PostMapping("/page")
+    public Page<SysUser> getPage(@RequestBody PageParam<SysUserVO> dto) {
+        return sysUserService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("sys:user:get")
+    @GetMapping("/get")
+    public SysUser get(@RequestParam Long id) {
+        return sysUserService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("sys:user:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody SysUserParam param) {
+        return sysUserService.updateById(param);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("sys:user:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody SysUserParam param) {
+        return sysUserService.save(param);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("sys:user:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return sysUserService.removeByIds(ids);
+    }
+
+    @Operation(summary = "分配角色")
+    @Permission("sys:user:assignRoles")
+    @PostMapping("/assign-roles")
+    public boolean assignRoles(@Validated @RequestBody AssignRolesParam assignRoleParam) {
+        return sysUserRoleService.assignRoles(assignRoleParam);
+    }
+
+    @Operation(summary = "根据用户ID查询关联角色ID列表")
+    @Permission("sys:user:roleIds")
+    @PostMapping("/role-ids")
+    public List<Long> roleIds(@RequestParam Long id) {
+        return sysUserRoleService.listRoleIdsByUserId(id);
+    }
+
+    @Operation(summary = "重置密码")
+    @Permission("sys:user:resetPassword")
+    @PostMapping("/reset-password")
+    public boolean resetPassword(@Validated @RequestBody ResetPasswordParam param) {
+        return sysUserService.resetPassword(param);
+    }
+}

+ 62 - 0
src/main/java/com/aizuda/boot/system/entity/SysApp.java

@@ -0,0 +1,62 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.ApiConstants;
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 应用
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Getter
+@Setter
+@Schema(name = "SysApp", description = "应用")
+public class SysApp extends BaseEntity {
+
+	@Schema(description = "标识")
+	@NotBlank(groups = Create.class)
+	@Size(max = 100)
+	private String identification;
+
+	@Schema(description = "名称")
+	@NotBlank(groups = Create.class)
+	@Size(max = 100)
+	private String name;
+
+	@Schema(description = "密钥")
+	@NotBlank(groups = Create.class)
+	@Size(max = 255)
+	private String secretKey;
+
+	@Schema(description = "状态 0、禁用 1、正常")
+	private Integer status;
+
+	@Schema(description = "授权到期")
+	@NotNull(groups = Create.class)
+	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = ApiConstants.DATE_MM_SS, timezone = ApiConstants.GMT8)
+	private Date expire;
+
+	@Schema(description = "排序")
+	@PositiveOrZero
+	@OrderBy
+	private Integer sort;
+
+}

+ 53 - 0
src/main/java/com/aizuda/boot/system/entity/SysConfigure.java

@@ -0,0 +1,53 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 扩展配置
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Getter
+@Setter
+@Schema(name = "SysConfigure", description = "扩展配置")
+public class SysConfigure extends BaseEntity {
+
+	@Schema(description = "分类")
+	@NotBlank(groups = Create.class)
+	@Size(max = 255)
+	private String category;
+
+	@Schema(description = "关键字")
+	@NotBlank(groups = Create.class)
+	@Size(max = 255)
+	private String key;
+
+	@Schema(description = "内容")
+	@NotBlank(groups = Create.class)
+	private String content;
+
+	@Schema(description = "标题")
+	@NotBlank(groups = Create.class)
+	@Size(max = 255)
+	private String title;
+
+	@Schema(description = "排序")
+	@PositiveOrZero
+	@OrderBy
+	private Integer sort;
+
+}

+ 65 - 0
src/main/java/com/aizuda/boot/system/entity/SysDepartment.java

@@ -0,0 +1,65 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import com.baomidou.mybatisplus.annotation.SqlCondition;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 部门
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Getter
+@Setter
+@Schema(name = "SysDepartment", description = "部门")
+public class SysDepartment extends BaseEntity {
+
+	@Schema(description = "父ID")
+	@NotNull(groups = Create.class)
+	@PositiveOrZero
+	private Long pid;
+
+	@Schema(description = "名称")
+	@NotBlank(groups = Create.class)
+	@Size(max = 30)
+	@TableField(condition = SqlCondition.LIKE)
+	private String name;
+
+	@Schema(description = "编码")
+	@NotBlank(groups = Create.class)
+	@Size(max = 30)
+	private String code;
+
+	@Schema(description = "排序")
+	@PositiveOrZero
+	@OrderBy
+	private Integer sort;
+
+	@Schema(description = "主管ID")
+	@PositiveOrZero
+	private Long directorId;
+
+	@Schema(description = "备注")
+	@Size(max = 255)
+	private String remark;
+
+	@Schema(description = "状态 0、禁用 1、正常")
+	@PositiveOrZero
+	private Integer status;
+
+}

+ 60 - 0
src/main/java/com/aizuda/boot/system/entity/SysDict.java

@@ -0,0 +1,60 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 系统字典
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Getter
+@Setter
+@Schema(name = "SysDict", description = "系统字典")
+public class SysDict extends BaseEntity {
+
+    @Schema(description = "父ID")
+    @PositiveOrZero
+    private Long pid;
+
+    @Schema(description = "名称")
+    @NotBlank(groups = Create.class)
+    @Size(max = 100)
+    private String name;
+
+    @Schema(description = "编码")
+    @NotBlank(groups = Create.class)
+    @Size(max = 100)
+    private String code;
+
+    @Schema(description = "内容")
+    @Size(max = 100)
+    private String content;
+
+    @Schema(description = "状态 0、禁用 1、正常")
+    @PositiveOrZero
+    private Integer status;
+
+    @Schema(description = "排序")
+    @PositiveOrZero
+    @OrderBy
+    private Integer sort;
+
+    @Schema(description = "备注")
+    @Size(max = 255)
+    private String remark;
+
+}

+ 52 - 0
src/main/java/com/aizuda/boot/system/entity/SysPost.java

@@ -0,0 +1,52 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 岗位
+ *
+ * @author 青苗
+ * @since 2022-02-18
+ */
+@Getter
+@Setter
+@Schema(name = "SysPost", description = "岗位")
+public class SysPost extends BaseEntity {
+
+	@Schema(description = "名称")
+	@NotBlank(groups = Create.class)
+	@Size(max = 30)
+	private String name;
+
+	@Schema(description = "编码")
+	@NotBlank(groups = Create.class)
+	@Size(max = 30)
+	private String code;
+
+	@Schema(description = "排序")
+	@PositiveOrZero
+	@OrderBy
+	private Integer sort;
+
+	@Schema(description = "状态 0、禁用 1、正常")
+	@PositiveOrZero
+	private Integer status;
+
+	@Schema(description = "备注")
+	@Size(max = 255)
+	private String remark;
+
+}

+ 57 - 0
src/main/java/com/aizuda/boot/system/entity/SysRegion.java

@@ -0,0 +1,57 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import com.baomidou.mybatisplus.annotation.SqlCondition;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 行政区域
+ *
+ * @author 青苗
+ * @since 2022-02-22
+ */
+@Getter
+@Setter
+@Schema(name = "SysRegion", description = "行政区域")
+public class SysRegion extends BaseEntity {
+
+	@Schema(description = "父ID")
+	@NotNull(groups = Create.class)
+	@PositiveOrZero
+	private Long pid;
+
+	@Schema(description = "名称")
+	@NotBlank(groups = Create.class)
+	@Size(max = 30)
+	@TableField(condition = SqlCondition.LIKE)
+	private String name;
+
+	@Schema(description = "编码")
+	@NotBlank(groups = Create.class)
+	@Size(max = 30)
+	private String code;
+
+	@Schema(description = "排序")
+	@PositiveOrZero
+	@OrderBy
+	private Integer sort;
+
+	@Schema(description = "级别 0、省份直辖市 1、地市 2、区县")
+	@PositiveOrZero
+	private Integer level;
+
+}

+ 83 - 0
src/main/java/com/aizuda/boot/system/entity/SysResource.java

@@ -0,0 +1,83 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 系统资源
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Getter
+@Setter
+@Schema(name = "SysResource", description = "系统资源")
+public class SysResource extends BaseEntity {
+
+	@Schema(description = "父ID")
+	@NotNull(groups = Create.class)
+	@PositiveOrZero
+	private Long pid;
+
+	@Schema(description = "名称")
+	@NotBlank(groups = Create.class)
+	@Size(max = 60)
+	private String title;
+
+	@Schema(description = "别名")
+	@Size(max = 60)
+	private String alias;
+
+	@Schema(description = "类型 0,菜单 1,iframe 2,外链 3,按钮")
+	@NotNull(groups = Create.class)
+	@PositiveOrZero
+	private Integer type;
+
+	@Schema(description = "编码")
+	@Size(max = 100)
+	private String code;
+
+	@Schema(description = "重定向")
+	@Size(max = 100)
+	private String redirect;
+
+	@Schema(description = "文件路径")
+	@Size(max = 100)
+	private String path;
+
+	@Schema(description = "图标")
+	@Size(max = 30)
+	private String icon;
+
+	@Schema(description = "状态 0、禁用 1、正常")
+	@PositiveOrZero
+	private Integer status;
+
+	@Schema(description = "排序")
+	@PositiveOrZero
+	private Integer sort;
+
+	@Schema(description = "视图")
+	@Size(max = 255)
+	private String component;
+
+	@Schema(description = "颜色")
+	@Size(max = 30)
+	private String color;
+
+	@Schema(description = "隐藏菜单")
+	private Boolean hidden;
+
+}

+ 41 - 0
src/main/java/com/aizuda/boot/system/entity/SysResourceApi.java

@@ -0,0 +1,41 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.SuperEntity;
+import com.aizuda.core.validation.Create;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 系统资源接口
+ *
+ * @author 青苗
+ * @since 2022-02-26
+ */
+@Getter
+@Setter
+@Schema(name = "SysResourceApi", description = "系统资源")
+public class SysResourceApi extends SuperEntity {
+
+	@Schema(description = "资源ID")
+	@NotNull(groups = Create.class)
+	@PositiveOrZero
+	private Long resourceId;
+
+	@Schema(description = "接口地址")
+	@Size(max = 255)
+	private String url;
+
+	@Schema(description = "编码")
+	@Size(max = 100)
+	private String code;
+
+}

+ 53 - 0
src/main/java/com/aizuda/boot/system/entity/SysRole.java

@@ -0,0 +1,53 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.OrderBy;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 系统角色
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Getter
+@Setter
+@Schema(name = "SysRole", description = "系统角色")
+public class SysRole extends BaseEntity {
+
+    @Schema(description = "名称")
+    @NotBlank(groups = Create.class)
+    @Size(max = 30)
+    private String name;
+
+    @Schema(description = "别名")
+    @NotBlank(groups = Create.class)
+    @Size(max = 30)
+    private String alias;
+
+    @Schema(description = "备注")
+    @Size(max = 255)
+    private String remark;
+
+    @Schema(description = "状态 0、禁用 1、正常")
+    private Integer status;
+
+    @OrderBy
+    @Schema(description = "排序")
+    @NotNull(groups = Create.class)
+    @PositiveOrZero
+    private Integer sort;
+
+}

+ 37 - 0
src/main/java/com/aizuda/boot/system/entity/SysRoleResource.java

@@ -0,0 +1,37 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.SuperEntity;
+import com.aizuda.core.validation.Create;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 系统角色资源
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Getter
+@Setter
+@Schema(name = "SysRoleResource", description = "系统角色资源")
+public class SysRoleResource extends SuperEntity {
+
+    @Schema(description = "角色ID")
+    @NotNull(groups = Create.class)
+    @PositiveOrZero
+    private Long roleId;
+
+    @Schema(description = "资源ID")
+    @NotNull(groups = Create.class)
+    @PositiveOrZero
+    private Long resourceId;
+
+}

+ 76 - 0
src/main/java/com/aizuda/boot/system/entity/SysUser.java

@@ -0,0 +1,76 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 系统用户
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Getter
+@Setter
+@Schema(name = "SysUser", description = "系统用户")
+public class SysUser extends BaseEntity {
+
+    @Schema(description = "账号")
+    @NotBlank(groups = Create.class)
+    @Size(max = 20)
+    private String username;
+
+    @Schema(description = "密码")
+    @NotBlank(groups = Create.class)
+    @Size(max = 32)
+    private String password;
+
+    @JsonIgnore
+    @Schema(description = "随机盐")
+    private String salt;
+
+    @Schema(description = "真实名称")
+    @Size(max = 100)
+    private String realName;
+
+    @Schema(description = "昵称")
+    @Size(max = 20)
+    private String nickName;
+
+    @Schema(description = "头像")
+    @Size(max = 200)
+    private String avatar;
+
+    @Schema(description = "性别")
+    @NotNull(groups = Create.class)
+    private String sex;
+
+    @Schema(description = "手机号")
+    @Size(max = 11)
+    private String phone;
+
+    @Schema(description = "手机号是否验证 0、否 1、是")
+    private Integer phoneVerified;
+
+    @Schema(description = "邮箱")
+    @Size(max = 100)
+    private String email;
+
+    @Schema(description = "邮箱是否验证 0、否 1、是")
+    private Integer emailVerified;
+
+    @Schema(description = "状态 0、禁用 1、正常")
+    private Integer status;
+
+}

+ 37 - 0
src/main/java/com/aizuda/boot/system/entity/SysUserRole.java

@@ -0,0 +1,37 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity;
+
+import com.aizuda.core.bean.SuperEntity;
+import com.aizuda.core.validation.Create;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 系统用户角色
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Getter
+@Setter
+@Schema(name = "SysUserRole", description = "系统用户角色")
+public class SysUserRole extends SuperEntity {
+
+    @Schema(description = "用户ID")
+    @NotNull(groups = Create.class)
+    @PositiveOrZero
+    private Long userId;
+
+    @Schema(description = "角色ID")
+    @NotNull(groups = Create.class)
+    @PositiveOrZero
+    private Long roleId;
+
+}

+ 34 - 0
src/main/java/com/aizuda/boot/system/entity/enums/ResourceType.java

@@ -0,0 +1,34 @@
+package com.aizuda.boot.system.entity.enums;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * 资源类型枚举类
+ *
+ * @author 青苗
+ * @since 2022-01-09
+ */
+public enum ResourceType {
+    menu(0),
+    iframe(1),
+    link(2),
+    button(3);
+
+    private final Integer type;
+
+    ResourceType(final Integer type) {
+        this.type = type;
+    }
+
+    /**
+     * 资源类型数值转换为字符串类型
+     *
+     * @param type 资源类型
+     * o@return
+     */
+    public static String convert(final Integer type) {
+        return Arrays.stream(ResourceType.values()).filter(t -> Objects.equals(t.type, type))
+                .findFirst().orElse(menu).name();
+    }
+}

+ 32 - 0
src/main/java/com/aizuda/boot/system/entity/param/AssignRolesParam.java

@@ -0,0 +1,32 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 分配角色参数,多用户分配多角色
+ *
+ * @author 青苗
+ * @since 2021-11-06
+ */
+@Getter
+@Setter
+public class AssignRolesParam {
+    @Schema(description = "用户ID列表")
+    @NotEmpty
+    private List<Long> userIds;
+
+    @Schema(description = "角色ID列表")
+    @NotEmpty
+    private List<Long> roleIds;
+
+}

+ 34 - 0
src/main/java/com/aizuda/boot/system/entity/param/ResetPasswordParam.java

@@ -0,0 +1,34 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 重置密码参数
+ *
+ * @author 青苗
+ * @since 2022-02-27
+ */
+@Getter
+@Setter
+public class ResetPasswordParam {
+
+    @Schema(description = "用户ID列表")
+    @NotEmpty
+    private List<Long> ids;
+
+    @Schema(description = "登录密码")
+    @NotBlank
+    private String password;
+
+}

+ 29 - 0
src/main/java/com/aizuda/boot/system/entity/param/ResourceParam.java

@@ -0,0 +1,29 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.param;
+
+import com.aizuda.boot.system.entity.SysResource;
+import com.aizuda.boot.system.entity.SysResourceApi;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 资源参数
+ *
+ * @author 青苗
+ * @since 2022-02-27
+ */
+@Getter
+@Setter
+public class ResourceParam extends SysResource {
+
+    @Schema(description = "接口权限")
+    private List<SysResourceApi> apiList;
+
+}

+ 32 - 0
src/main/java/com/aizuda/boot/system/entity/param/RoleResourceParam.java

@@ -0,0 +1,32 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 分配角色资源
+ *
+ * @author 青苗
+ * @since 2022-02-27
+ */
+@Getter
+@Setter
+public class RoleResourceParam {
+
+    @Schema(description = "角色ID")
+    @NotNull
+    private Long roleId;
+
+    @Schema(description = "资源ID列表")
+    private List<Long> resourceIds;
+
+}

+ 28 - 0
src/main/java/com/aizuda/boot/system/entity/param/SysUserParam.java

@@ -0,0 +1,28 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.param;
+
+import com.aizuda.boot.system.entity.SysUser;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 用户参数
+ *
+ * @author 青苗
+ * @since 2022-02-27
+ */
+@Getter
+@Setter
+public class SysUserParam extends SysUser {
+
+    @Schema(description = "角色ID列表")
+    private List<Long> roleIds;
+
+}

+ 27 - 0
src/main/java/com/aizuda/boot/system/entity/vo/MenuVO.java

@@ -0,0 +1,27 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 菜单
+ */
+@Getter
+@Setter
+public class MenuVO implements Serializable {
+    private String name;
+    private String path;
+    private String component;
+    private Map<String, Object> meta;
+    List<MenuVO> children;
+
+}

+ 26 - 0
src/main/java/com/aizuda/boot/system/entity/vo/ResourceTreeVO.java

@@ -0,0 +1,26 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.vo;
+
+import com.aizuda.boot.system.entity.SysResource;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class ResourceTreeVO extends SysResource {
+    /**
+     * 父级菜单名
+     */
+    private String parentName;
+    /**
+     * 子类资源
+     */
+    private List<ResourceTreeVO> children;
+
+}

+ 21 - 0
src/main/java/com/aizuda/boot/system/entity/vo/SysDepartmentVO.java

@@ -0,0 +1,21 @@
+package com.aizuda.boot.system.entity.vo;
+
+import com.aizuda.boot.system.entity.SysDepartment;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class SysDepartmentVO extends SysDepartment {
+    /**
+     * 父级部门
+     */
+    private String parentName;
+    /**
+     * 子部门
+     */
+    private List<SysDepartmentVO> children;
+
+}

+ 22 - 0
src/main/java/com/aizuda/boot/system/entity/vo/SysRegionVO.java

@@ -0,0 +1,22 @@
+package com.aizuda.boot.system.entity.vo;
+
+import com.aizuda.boot.system.entity.SysRegion;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+
+@Getter
+@Setter
+public class SysRegionVO extends SysRegion {
+    /**
+     * 父级单位
+     */
+    private String parentName;
+    /**
+     * 子单位
+     */
+    private List<SysRegionVO> children;
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/entity/vo/SysUserVO.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.entity.vo;
+
+import com.aizuda.boot.system.entity.SysUser;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class SysUserVO extends SysUser {
+
+    @Schema(description = "角色ID")
+    private Long roleId;
+
+    @Schema(description = "所属角色多个英文逗号分割")
+    private String roles;
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysAppMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysApp;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 应用 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Mapper
+public interface SysAppMapper extends CrudMapper<SysApp> {
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysConfigureMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysConfigure;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 扩展配置 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Mapper
+public interface SysConfigureMapper extends CrudMapper<SysConfigure> {
+
+}

+ 33 - 0
src/main/java/com/aizuda/boot/system/mapper/SysDepartmentMapper.java

@@ -0,0 +1,33 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysDepartment;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 部门 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Mapper
+public interface SysDepartmentMapper extends CrudMapper<SysDepartment> {
+
+    /**
+     * 根据 id 递归子类集合
+     */
+    @Select("WITH RECURSIVE r AS (SELECT id FROM sys_department WHERE id=#{id} UNION ALL SELECT c.id FROM sys_department c JOIN r ON c.pid=r.id) SELECT id FROM r")
+    List<Long> selectIdsRecursive(@Param("id") Long id);
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysDictMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysDict;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 系统字典 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Mapper
+public interface SysDictMapper extends CrudMapper<SysDict> {
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysPostMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysPost;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 岗位 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2022-02-18
+ */
+@Mapper
+public interface SysPostMapper extends CrudMapper<SysPost> {
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysRegionMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysRegion;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 行政区域 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2022-02-22
+ */
+@Mapper
+public interface SysRegionMapper extends CrudMapper<SysRegion> {
+
+}

+ 28 - 0
src/main/java/com/aizuda/boot/system/mapper/SysResourceApiMapper.java

@@ -0,0 +1,28 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysResourceApi;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统资源接口 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2022-02-26
+ */
+@Mapper
+public interface SysResourceApiMapper extends CrudMapper<SysResourceApi> {
+
+    @Select("SELECT DISTINCT a.code FROM sys_resource_api a JOIN sys_role_resource s ON a.resource_id=s.resource_id JOIN sys_user_role r ON s.role_id=r.role_id WHERE r.user_id=#{userId}")
+    List<String> selectCodesByUserId(Long userId);
+}

+ 34 - 0
src/main/java/com/aizuda/boot/system/mapper/SysResourceMapper.java

@@ -0,0 +1,34 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysResource;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统资源 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Mapper
+public interface SysResourceMapper extends CrudMapper<SysResource> {
+
+    /**
+     * 根据用户ID查询权限列表
+     *
+     * @param userId 用户ID
+     * @return
+     */
+    @Select("SELECT  r.* FROM sys_resource r WHERE EXISTS (SELECT 1 FROM sys_role_resource s JOIN sys_user_role t ON s.role_id=t.role_id WHERE t.user_id=#{userId} AND r.id=s.resource_id) AND type<3 AND r.deleted=0 AND r.status=1 ORDER BY sort DESC")
+    List<SysResource> selectMenuByUserId(Long userId);
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysRoleMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysRole;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 系统角色 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Mapper
+public interface SysRoleMapper extends CrudMapper<SysRole> {
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysRoleResourceMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysRoleResource;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 系统角色资源 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Mapper
+public interface SysRoleResourceMapper extends CrudMapper<SysRoleResource> {
+
+}

+ 31 - 0
src/main/java/com/aizuda/boot/system/mapper/SysUserMapper.java

@@ -0,0 +1,31 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysUser;
+import com.aizuda.boot.system.entity.vo.SysUserVO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 系统用户 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Mapper
+public interface SysUserMapper extends CrudMapper<SysUser> {
+
+    @Select("SELECT u.* FROM sys_user u JOIN sys_user_role r ON u.id=r.user_id WHERE r.role_id=#{vo.roleId} AND u.deleted=0")
+    List<SysUser> selectPageByVO(Page page, @Param("vo") SysUserVO vo);
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/mapper/SysUserRoleMapper.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.mapper;
+
+import com.aizuda.service.mapper.CrudMapper;
+import com.aizuda.boot.system.entity.SysUserRole;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 系统用户角色 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Mapper
+public interface SysUserRoleMapper extends CrudMapper<SysUserRole> {
+
+}

+ 22 - 0
src/main/java/com/aizuda/boot/system/service/ISysAppService.java

@@ -0,0 +1,22 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysApp;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+ * 应用 服务类
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+public interface ISysAppService extends IBaseService<SysApp> {
+
+    Page<SysApp> page(Page<SysApp> page, SysApp sysApp);
+
+}

+ 22 - 0
src/main/java/com/aizuda/boot/system/service/ISysConfigureService.java

@@ -0,0 +1,22 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysConfigure;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+ * 扩展配置 服务类
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+public interface ISysConfigureService extends IBaseService<SysConfigure> {
+
+    Page<SysConfigure> page(Page<SysConfigure> page, SysConfigure sysConfigure);
+
+}

+ 26 - 0
src/main/java/com/aizuda/boot/system/service/ISysDepartmentService.java

@@ -0,0 +1,26 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysDepartment;
+import com.aizuda.boot.system.entity.vo.SysDepartmentVO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+
+/**
+ * 部门 服务类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+public interface ISysDepartmentService extends IBaseService<SysDepartment> {
+
+    Page<SysDepartment> page(Page<SysDepartment> page, SysDepartment sysDepartment);
+
+    List<SysDepartmentVO> listTree(SysDepartment sysDepartment);
+}

+ 29 - 0
src/main/java/com/aizuda/boot/system/service/ISysDictService.java

@@ -0,0 +1,29 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysDict;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+
+/**
+ * 系统字典 服务类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+public interface ISysDictService extends IBaseService<SysDict> {
+
+    Page<SysDict> page(Page<SysDict> page, SysDict sysDict);
+
+    /**
+     * 父级字典列表
+     */
+    List<SysDict> listParent();
+
+}

+ 22 - 0
src/main/java/com/aizuda/boot/system/service/ISysPostService.java

@@ -0,0 +1,22 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysPost;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+ * 岗位 服务类
+ *
+ * @author 青苗
+ * @since 2022-02-18
+ */
+public interface ISysPostService extends IBaseService<SysPost> {
+
+    Page<SysPost> page(Page<SysPost> page, SysPost sysPost);
+
+}

+ 23 - 0
src/main/java/com/aizuda/boot/system/service/ISysRegionService.java

@@ -0,0 +1,23 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysRegion;
+import com.aizuda.boot.system.entity.vo.SysRegionVO;
+
+import java.util.List;
+
+/**
+ * 行政区域 服务类
+ *
+ * @author 青苗
+ * @since 2022-02-22
+ */
+public interface ISysRegionService extends IBaseService<SysRegion> {
+
+    List<SysRegionVO> listTree(SysRegion sysRegion);
+}

+ 38 - 0
src/main/java/com/aizuda/boot/system/service/ISysResourceApiService.java

@@ -0,0 +1,38 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysResourceApi;
+
+import java.util.List;
+
+/**
+ * 系统资源接口 服务类
+ *
+ * @author 青苗
+ * @since 2022-02-26
+ */
+public interface ISysResourceApiService extends IBaseService<SysResourceApi> {
+
+    /**
+     * 根据资源ID查询接口权限列表
+     *
+     * @param resourceId 资源ID
+     * @return
+     */
+    List<SysResourceApi> listByResourceId(Long resourceId);
+
+    /**
+     * 根据用户ID查询权限编码列表
+     *
+     * @param userId 用户ID
+     * @return
+     */
+    List<String> listCodesByUserId(Long userId);
+
+    boolean removeByResourceId(Long resourceId);
+}

+ 48 - 0
src/main/java/com/aizuda/boot/system/service/ISysResourceService.java

@@ -0,0 +1,48 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysResource;
+import com.aizuda.boot.system.entity.param.ResourceParam;
+import com.aizuda.boot.system.entity.vo.ResourceTreeVO;
+import com.aizuda.service.web.UserSession;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统资源 服务类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+public interface ISysResourceService extends IBaseService<SysResource> {
+
+    Page<SysResource> page(Page<SysResource> page, SysResource sysResource);
+
+    /**
+     * 树列表
+     */
+    List<ResourceTreeVO> listTree();
+
+    /**
+     * 权限菜单列表
+     *
+     * @param userSession {@link UserSession}
+     * @return
+     */
+    Map<String, Object> listMenuPermissions(UserSession userSession);
+
+    /**
+     * 更新菜单
+     *
+     * @param param {@link ResourceParam}
+     * @return
+     */
+    boolean updateByResourceParam(ResourceParam param);
+}

+ 45 - 0
src/main/java/com/aizuda/boot/system/service/ISysRoleResourceService.java

@@ -0,0 +1,45 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysRoleResource;
+import com.aizuda.boot.system.entity.param.RoleResourceParam;
+
+import java.util.List;
+
+/**
+ * 系统角色资源 服务类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+public interface ISysRoleResourceService extends IBaseService<SysRoleResource> {
+
+    /**
+     * 保存角色资源菜单ID关联信息
+     *
+     * @param param {@link RoleResourceParam}
+     * @return
+     */
+    boolean saveByRoleResourceParam(RoleResourceParam param);
+
+    /**
+     * 查询指定角色ID列表
+     *
+     * @param roleId 角色ID
+     * @return
+     */
+    List<Long> listByRoleId(Long roleId);
+
+    /**
+     * 判断是否存在关联角色
+     *
+     * @param roleId 角色ID
+     * @return
+     */
+    boolean existRelByRoleId(Long roleId);
+}

+ 45 - 0
src/main/java/com/aizuda/boot/system/service/ISysRoleService.java

@@ -0,0 +1,45 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysRole;
+import com.aizuda.service.vo.TreeVO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+
+/**
+ * 系统角色 服务类
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+public interface ISysRoleService extends IBaseService<SysRole> {
+
+    /**
+     * 分页
+     */
+    Page<SysRole> page(Page<SysRole> page, SysRole sysRole);
+
+    /**
+     * 列表树
+     */
+    List<TreeVO> listTree();
+
+    /**
+     * 列表(显示所有角色)
+     */
+    List<SysRole> listAll();
+
+    /**
+     * 删除并检测是否允许操作
+     *
+     * @param ids 主键ID列表
+     * @return
+     */
+    boolean removeCheckByIds(List<Long> ids);
+}

+ 45 - 0
src/main/java/com/aizuda/boot/system/service/ISysUserRoleService.java

@@ -0,0 +1,45 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysUserRole;
+import com.aizuda.boot.system.entity.param.AssignRolesParam;
+
+import java.util.List;
+
+/**
+ * 系统用户角色 服务类
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+public interface ISysUserRoleService extends IBaseService<SysUserRole> {
+
+    /**
+     * 用户角色分配
+     *
+     * @param assignRolesParam 分配角色参数对象
+     * @return
+     */
+    boolean assignRoles(AssignRolesParam assignRolesParam);
+
+    /**
+     * 根据用户ID查询关联角色ID列表
+     *
+     * @param userId 用户ID
+     * @return
+     */
+    List<Long> listRoleIdsByUserId(Long userId);
+
+    /**
+     * 判断是否存在关联角色
+     *
+     * @param roleId 角色ID
+     * @return
+     */
+    boolean existRelByRoleId(Long roleId);
+}

+ 31 - 0
src/main/java/com/aizuda/boot/system/service/ISysUserService.java

@@ -0,0 +1,31 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service;
+
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.system.entity.SysUser;
+import com.aizuda.boot.system.entity.param.ResetPasswordParam;
+import com.aizuda.boot.system.entity.param.SysUserParam;
+import com.aizuda.boot.system.entity.vo.SysUserVO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+ * 系统用户 服务类
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+public interface ISysUserService extends IBaseService<SysUser> {
+
+    Page<SysUser> page(Page<SysUser> page, SysUserVO vo);
+
+    boolean save(SysUserParam param);
+
+    boolean updateById(SysUserParam param);
+
+    boolean resetPassword(ResetPasswordParam param);
+
+}

+ 31 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysAppServiceImpl.java

@@ -0,0 +1,31 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysApp;
+import com.aizuda.boot.system.mapper.SysAppMapper;
+import com.aizuda.boot.system.service.ISysAppService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+
+/**
+ * 应用 服务实现类
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Service
+public class SysAppServiceImpl extends BaseServiceImpl<SysAppMapper, SysApp> implements ISysAppService {
+
+    @Override
+    public Page<SysApp> page(Page<SysApp> page, SysApp sysApp) {
+        LambdaQueryWrapper<SysApp> lqw = Wrappers.lambdaQuery(sysApp);
+        return super.page(page, lqw);
+    }
+}

+ 31 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysConfigureServiceImpl.java

@@ -0,0 +1,31 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysConfigure;
+import com.aizuda.boot.system.mapper.SysConfigureMapper;
+import com.aizuda.boot.system.service.ISysConfigureService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+
+/**
+ * 扩展配置 服务实现类
+ *
+ * @author 青苗
+ * @since 2022-02-19
+ */
+@Service
+public class SysConfigureServiceImpl extends BaseServiceImpl<SysConfigureMapper, SysConfigure> implements ISysConfigureService {
+
+    @Override
+    public Page<SysConfigure> page(Page<SysConfigure> page, SysConfigure sysConfigure) {
+        LambdaQueryWrapper<SysConfigure> lqw = Wrappers.lambdaQuery(sysConfigure);
+        return super.page(page, lqw);
+    }
+}

+ 92 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysDepartmentServiceImpl.java

@@ -0,0 +1,92 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysDepartment;
+import com.aizuda.boot.system.entity.vo.SysDepartmentVO;
+import com.aizuda.boot.system.mapper.SysDepartmentMapper;
+import com.aizuda.boot.system.service.ISysDepartmentService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 部门 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Service
+public class SysDepartmentServiceImpl extends BaseServiceImpl<SysDepartmentMapper, SysDepartment> implements ISysDepartmentService {
+
+    @Override
+    public Page<SysDepartment> page(Page<SysDepartment> page, SysDepartment sysDepartment) {
+        LambdaQueryWrapper<SysDepartment> lqw = Wrappers.lambdaQuery(sysDepartment);
+        return super.page(page, lqw);
+    }
+
+    @Override
+    public boolean updateById(SysDepartment sysDepartment) {
+        ApiAssert.isEmpty(sysDepartment.getId(), "主键不存在无法更新");
+        List<Long> ids = baseMapper.selectIdsRecursive(sysDepartment.getId());
+        ApiAssert.fail(CollectionUtils.isNotEmpty(ids) && ids.contains(sysDepartment.getPid()),
+                "父分类不能为子分类,请重新选择父分类");
+        if (null == sysDepartment.getPid()) {
+            // 未设置父ID设置为0
+            sysDepartment.setPid(0L);
+        }
+        return super.updateById(sysDepartment);
+    }
+
+    @Override
+    public List<SysDepartmentVO> listTree(SysDepartment sysDepartment) {
+        List<SysDepartment> sysDepartmentList = super.list(Wrappers.lambdaQuery(sysDepartment));
+        if (CollectionUtils.isEmpty(sysDepartmentList)) {
+            return null;
+        }
+        return sysDepartmentList.stream().filter(e -> Objects.equals(0L, e.getPid())).map(e -> {
+            SysDepartmentVO vo = e.convert(SysDepartmentVO.class);
+            vo.setChildren(this.getChild(vo.getId(), vo.getName(), sysDepartmentList));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    /**
+     * 获取子节点
+     */
+    protected List<SysDepartmentVO> getChild(Long id, String parentName, List<SysDepartment> sysDepartmentList) {
+        // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
+        List<SysDepartment> childList = sysDepartmentList.stream().filter(e -> Objects.equals(id, e.getPid()))
+                .collect(Collectors.toList());
+        if (childList.isEmpty()) {
+            // 没有子节点,返回一个空 List(递归退出)
+            return null;
+        }
+        // 递归
+        return childList.stream().map(e -> {
+            SysDepartmentVO vo = e.convert(SysDepartmentVO.class);
+            vo.setParentName(parentName);
+            vo.setChildren(this.getChild(vo.getId(), vo.getName(), sysDepartmentList));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean removeByIds(Collection<?> list) {
+        this.checkExists(Wrappers.<SysDepartment>lambdaQuery().select(SysDepartment::getId)
+                .in(SysDepartment::getPid, list), "存在子类不允许删除");
+        return super.removeByIds(list);
+    }
+}

+ 72 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysDictServiceImpl.java

@@ -0,0 +1,72 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysDict;
+import com.aizuda.boot.system.mapper.SysDictMapper;
+import com.aizuda.boot.system.service.ISysDictService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 系统字典 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Service
+public class SysDictServiceImpl extends BaseServiceImpl<SysDictMapper, SysDict> implements ISysDictService {
+
+    @Override
+    public Page<SysDict> page(Page<SysDict> page, SysDict sysDict) {
+        LambdaQueryWrapper<SysDict> lqw = Wrappers.lambdaQuery(sysDict);
+        return super.page(page, lqw);
+    }
+
+    @Override
+    public List<SysDict> listParent() {
+        return super.list(Wrappers.<SysDict>lambdaQuery().select(SysDict::getId, SysDict::getName,
+                        SysDict::getCode, SysDict::getRemark, SysDict::getSort)
+                .eq(SysDict::getPid, 0));
+    }
+
+    @Override
+    public boolean save(SysDict sysDict) {
+        this.checkCode(sysDict);
+        return super.save(sysDict);
+    }
+
+    /**
+     * 编码重发校验
+     */
+    private void checkCode(SysDict sysDict) {
+        checkExists(Wrappers.<SysDict>lambdaQuery().select(SysDict::getId)
+                .ne(null != sysDict.getId(), SysDict::getId, sysDict.getId())
+                .eq(SysDict::getPid, sysDict.getPid())
+                .eq(SysDict::getCode, sysDict.getCode()), "编码已存在,请勿重复添加");
+    }
+
+    @Override
+    public boolean updateById(SysDict sysDict) {
+        ApiAssert.isEmpty(sysDict.getId(), "主键不存在无法更新");
+        this.checkCode(sysDict);
+        return super.updateById(sysDict);
+    }
+
+    @Override
+    public boolean removeByIds(Collection<?> ids) {
+        this.checkExists(Wrappers.<SysDict>lambdaQuery().select(SysDict::getId)
+                .in(SysDict::getPid, ids), "字典分类存在子类,请先删除子类");
+        return super.removeByIds(ids);
+    }
+}

+ 31 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysPostServiceImpl.java

@@ -0,0 +1,31 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysPost;
+import com.aizuda.boot.system.mapper.SysPostMapper;
+import com.aizuda.boot.system.service.ISysPostService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+
+/**
+ * 岗位 服务实现类
+ *
+ * @author 青苗
+ * @since 2022-02-18
+ */
+@Service
+public class SysPostServiceImpl extends BaseServiceImpl<SysPostMapper, SysPost> implements ISysPostService {
+
+    @Override
+    public Page<SysPost> page(Page<SysPost> page, SysPost sysPost) {
+        LambdaQueryWrapper<SysPost> lqw = Wrappers.lambdaQuery(sysPost);
+        return super.page(page, lqw);
+    }
+}

+ 95 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysRegionServiceImpl.java

@@ -0,0 +1,95 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysRegion;
+import com.aizuda.boot.system.entity.vo.SysRegionVO;
+import com.aizuda.boot.system.mapper.SysRegionMapper;
+import com.aizuda.boot.system.service.ISysRegionService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * 行政区域 服务实现类
+ *
+ * @author 青苗
+ * @since 2022-02-22
+ */
+@Service
+public class SysRegionServiceImpl extends BaseServiceImpl<SysRegionMapper, SysRegion> implements ISysRegionService {
+
+    @Override
+    public List<SysRegionVO> listTree(SysRegion sysRegion) {
+        LambdaQueryWrapper<SysRegion> lqw = Wrappers.lambdaQuery();
+        // pid 为 0 只查询省份城市信息
+        if (Objects.equals(sysRegion.getPid(), -1L)) {
+            lqw.in(SysRegion::getLevel, Arrays.asList(0, 1));
+            sysRegion.setPid(null);
+        }
+        lqw.setEntity(sysRegion);
+        List<SysRegion> sysRegionList = super.list(lqw);
+        if (CollectionUtils.isEmpty(sysRegionList)) {
+            return null;
+        }
+        return sysRegionList.stream().filter(e -> Objects.equals(0L, e.getPid())).map(e -> {
+            SysRegionVO vo = e.convert(SysRegionVO.class);
+            vo.setChildren(this.getChild(vo.getId(), vo.getName(), sysRegionList));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    /**
+     * 获取子节点
+     */
+    protected List<SysRegionVO> getChild(Long id, String parentName, List<SysRegion> sysRegionList) {
+        // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
+        List<SysRegion> childList = sysRegionList.stream().filter(e -> Objects.equals(id, e.getPid()))
+                .collect(Collectors.toList());
+        if (childList.isEmpty()) {
+            // 没有子节点,返回一个空 List(递归退出)
+            return null;
+        }
+        // 递归
+        return childList.stream().map(e -> {
+            SysRegionVO vo = e.convert(SysRegionVO.class);
+            vo.setParentName(parentName);
+            vo.setChildren(this.getChild(vo.getId(), vo.getName(), sysRegionList));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean updateById(SysRegion sysRegion) {
+        this.updateRegionLevel(sysRegion);
+        return super.updateById(sysRegion);
+    }
+
+    private void updateRegionLevel(SysRegion sysRegion) {
+        // 类型 0、省份直辖市 1、地市 2、区县
+        if (null == sysRegion.getPid() || Objects.equals(0L, sysRegion.getPid())) {
+            sysRegion.setLevel(0);
+        } else {
+            SysRegion parentRegion = this.checkById(sysRegion.getPid());
+            ApiAssert.fail(2 == parentRegion.getLevel(), "区县为最小单位不允许再分");
+            sysRegion.setLevel(parentRegion.getLevel() + 1);
+        }
+    }
+
+    @Override
+    public boolean save(SysRegion sysRegion) {
+        this.updateRegionLevel(sysRegion);
+        return super.save(sysRegion);
+    }
+}

+ 40 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysResourceApiServiceImpl.java

@@ -0,0 +1,40 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysResourceApi;
+import com.aizuda.boot.system.mapper.SysResourceApiMapper;
+import com.aizuda.boot.system.service.ISysResourceApiService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 系统资源接口 服务实现类
+ *
+ * @author 青苗
+ * @since 2022-02-26
+ */
+@Service
+public class SysResourceApiServiceImpl extends BaseServiceImpl<SysResourceApiMapper, SysResourceApi> implements ISysResourceApiService {
+
+    @Override
+    public List<SysResourceApi> listByResourceId(Long resourceId) {
+        return super.list(Wrappers.<SysResourceApi>lambdaQuery().eq(SysResourceApi::getResourceId, resourceId));
+    }
+
+    @Override
+    public List<String> listCodesByUserId(Long userId) {
+        return baseMapper.selectCodesByUserId(userId);
+    }
+
+    @Override
+    public boolean removeByResourceId(Long resourceId) {
+        return super.remove(Wrappers.<SysResourceApi>lambdaQuery().eq(SysResourceApi::getResourceId, resourceId));
+    }
+}

+ 178 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysResourceServiceImpl.java

@@ -0,0 +1,178 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysResource;
+import com.aizuda.boot.system.entity.SysResourceApi;
+import com.aizuda.boot.system.entity.enums.ResourceType;
+import com.aizuda.boot.system.entity.param.ResourceParam;
+import com.aizuda.boot.system.entity.vo.MenuVO;
+import com.aizuda.boot.system.entity.vo.ResourceTreeVO;
+import com.aizuda.boot.system.mapper.SysResourceMapper;
+import com.aizuda.boot.system.service.ISysResourceApiService;
+import com.aizuda.boot.system.service.ISysResourceService;
+import com.aizuda.service.web.UserSession;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 系统资源 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Service
+public class SysResourceServiceImpl extends BaseServiceImpl<SysResourceMapper, SysResource> implements ISysResourceService {
+    @Resource
+    private ISysResourceApiService sysResourceApiService;
+
+    @Override
+    public Page<SysResource> page(Page<SysResource> page, SysResource sysResource) {
+        LambdaQueryWrapper<SysResource> lqw = Wrappers.lambdaQuery(sysResource);
+        return super.page(page, lqw);
+    }
+
+    private List<SysResource> listAll(boolean menu) {
+        return lambdaQuery().eq(SysResource::getStatus, 1)
+                // 菜单不查按钮
+                .ne(menu, SysResource::getType, 3)
+                .orderByDesc(SysResource::getSort).list();
+    }
+
+    @Override
+    public List<ResourceTreeVO> listTree() {
+        List<SysResource> sysResourceList = this.listAll(false);
+        if (CollectionUtils.isEmpty(sysResourceList)) {
+            return null;
+        }
+        return sysResourceList.stream().filter(e -> Objects.equals(0L, e.getPid())).map(e -> {
+            ResourceTreeVO vo = e.convert(ResourceTreeVO.class);
+            vo.setChildren(this.getChild(vo.getId(), vo.getTitle(), sysResourceList));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    /**
+     * 获取子节点
+     */
+    protected List<ResourceTreeVO> getChild(Long id, String parentName, List<SysResource> sysResourceList) {
+        // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
+        List<SysResource> childList = sysResourceList.stream().filter(e -> Objects.equals(id, e.getPid()))
+                .collect(Collectors.toList());
+        if (childList.isEmpty()) {
+            // 没有子节点,返回一个空 List(递归退出)
+            return null;
+        }
+        // 递归
+        return childList.stream().map(e -> {
+            ResourceTreeVO vo = e.convert(ResourceTreeVO.class);
+            vo.setParentName(parentName);
+            vo.setChildren(this.getChild(vo.getId(), vo.getTitle(), sysResourceList));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public Map<String, Object> listMenuPermissions(UserSession userSession) {
+        Map<String, Object> menuMap = new HashMap<>(2);
+        menuMap.put("menu", this.listMenuVO(userSession));
+        menuMap.put("permissions", Arrays.asList("list.add", "list.edit", "list.delete",
+                "user.add", "user.edit", "user.delete"));
+        return menuMap;
+    }
+
+    protected List<MenuVO> listMenuVO(UserSession userSession) {
+        List<SysResource> sysResourceList;
+        if (UserSession.isAdmin(userSession.getId())) {
+            // 管理员设置为所有权限
+            sysResourceList = this.listAll(true);
+        } else {
+            sysResourceList = baseMapper.selectMenuByUserId(userSession.getId());
+        }
+        if (CollectionUtils.isEmpty(sysResourceList)) {
+            return Collections.EMPTY_LIST;
+        }
+        return sysResourceList.stream().filter(e -> Objects.equals(0L, e.getPid()))
+                .map(e -> this.getMenuVO(e, sysResourceList))
+                .collect(Collectors.toList());
+    }
+
+    protected MenuVO getMenuVO(SysResource sysResource, List<SysResource> sysResourceList) {
+        MenuVO vo = new MenuVO();
+        vo.setName(sysResource.getAlias());
+        vo.setPath(sysResource.getPath());
+        vo.setComponent(sysResource.getComponent());
+        vo.setMeta(new HashMap<String, Object>(5) {{
+            put("title", sysResource.getTitle());
+            put("icon", sysResource.getIcon());
+            put("type", ResourceType.convert(sysResource.getType()));
+            if (sysResource.getHidden()) {
+                put("hidden", true);
+            }
+            // put("hiddenBreadcrumb", true);
+        }});
+        vo.setChildren(this.getMenuChild(sysResource.getId(), sysResourceList));
+        return vo;
+    }
+
+    /**
+     * 获取子节点
+     */
+    protected List<MenuVO> getMenuChild(Long id, List<SysResource> sysResourceList) {
+        // 遍历所有节点,将所有菜单的父id与传过来的根节点的id比较
+        List<SysResource> childList = sysResourceList.stream().filter(e -> Objects.equals(id, e.getPid()))
+                .collect(Collectors.toList());
+        if (childList.isEmpty()) {
+            // 没有子节点,返回一个空 List(递归退出)
+            return null;
+        }
+        // 递归
+        return childList.stream().map(e -> this.getMenuVO(e, sysResourceList)).collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean removeByIds(Collection<?> ids) {
+        this.checkExists(Wrappers.<SysResource>lambdaQuery().select(SysResource::getId)
+                .in(SysResource::getPid, ids), "存在子类不允许删除");
+        return super.removeByIds(ids);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateByResourceParam(ResourceParam param) {
+        ApiAssert.isEmpty(param.getId(), "主键不存在无法更新");
+        SysResource sysResource = param.convert(SysResource.class);
+        ApiAssert.fail(!super.updateById(sysResource), "更新失败");
+        // 保存资源接口
+        List<SysResourceApi> apiList = param.getApiList();
+        if (CollectionUtils.isNotEmpty(apiList)) {
+            // 移除空字符串
+            apiList = apiList.stream().filter(t -> StringUtils.isNoneBlank(t.getUrl()) && StringUtils.isNoneBlank(t.getCode()))
+                    .collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(apiList)) {
+                sysResourceApiService.removeByResourceId(param.getId());
+                apiList.forEach(t -> {
+                    t.setResourceId(param.getId());
+                    t.setUrl(t.getUrl().trim());
+                    t.setCode(t.getCode().trim());
+                });
+                ApiAssert.fail(!sysResourceApiService.saveBatch(apiList), "接口权限保存失败");
+            }
+        }
+        return true;
+    }
+}

+ 68 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysRoleResourceServiceImpl.java

@@ -0,0 +1,68 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysRoleResource;
+import com.aizuda.boot.system.entity.param.RoleResourceParam;
+import com.aizuda.boot.system.mapper.SysRoleResourceMapper;
+import com.aizuda.boot.system.service.ISysRoleResourceService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 系统角色资源 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-11-07
+ */
+@Service
+public class SysRoleResourceServiceImpl extends BaseServiceImpl<SysRoleResourceMapper, SysRoleResource> implements ISysRoleResourceService {
+
+    @Override
+    public boolean updateById(SysRoleResource sysRoleResource) {
+        ApiAssert.isEmpty(sysRoleResource.getId(), "主键不存在无法更新");
+        return super.updateById(sysRoleResource);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean saveByRoleResourceParam(RoleResourceParam param) {
+        if (null == param || null == param.getRoleId()) {
+            return false;
+        }
+        super.remove(Wrappers.<SysRoleResource>lambdaQuery().eq(SysRoleResource::getRoleId, param.getRoleId()));
+        if (CollectionUtils.isEmpty(param.getResourceIds())) {
+            // 执行角色权限清空操作,逻辑上返回成功
+            return true;
+        }
+        return super.saveBatch(param.getResourceIds().stream().map(resourceId -> {
+            SysRoleResource srr = new SysRoleResource();
+            srr.setRoleId(param.getRoleId());
+            srr.setResourceId(resourceId);
+            return srr;
+        }).collect(Collectors.toList()));
+    }
+
+    @Override
+    public List<Long> listByRoleId(Long roleId) {
+        List<SysRoleResource> sysRoleResourceList = super.list(Wrappers.<SysRoleResource>lambdaQuery()
+                .select(SysRoleResource::getResourceId).eq(SysRoleResource::getRoleId, roleId));
+        return CollectionUtils.isEmpty(sysRoleResourceList) ? null : sysRoleResourceList.stream().map(t -> t.getResourceId())
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean existRelByRoleId(Long roleId) {
+        return lambdaQuery().eq(SysRoleResource::getRoleId, roleId).count() > 0;
+    }
+}

+ 70 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysRoleServiceImpl.java

@@ -0,0 +1,70 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysRole;
+import com.aizuda.boot.system.mapper.SysRoleMapper;
+import com.aizuda.boot.system.service.ISysRoleResourceService;
+import com.aizuda.boot.system.service.ISysRoleService;
+import com.aizuda.boot.system.service.ISysUserRoleService;
+import com.aizuda.service.vo.TreeVO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 系统角色 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Service
+@AllArgsConstructor
+public class SysRoleServiceImpl extends BaseServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {
+    private ISysUserRoleService sysUserRoleService;
+    private ISysRoleResourceService sysRoleResourceService;
+
+    @Override
+    public Page<SysRole> page(Page<SysRole> page, SysRole sysRole) {
+        LambdaQueryWrapper<SysRole> lqw = Wrappers.lambdaQuery(sysRole);
+        return super.page(page, lqw);
+    }
+
+    @Override
+    public List<TreeVO> listTree() {
+        return Optional.ofNullable(super.list(null)).orElse(null).stream()
+                .map(t -> new TreeVO(t.getId(), t.getName(), null))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<SysRole> listAll() {
+        return super.list();
+    }
+
+    @Override
+    public boolean updateById(SysRole sysRole) {
+        ApiAssert.isEmpty(sysRole.getId(), "主键不存在无法更新");
+        return super.updateById(sysRole);
+    }
+
+    @Override
+    public boolean removeCheckByIds(List<Long> ids) {
+        ids.forEach(id -> {
+            ApiAssert.fail(sysUserRoleService.existRelByRoleId(id), "存在角色关联用户不允许删除");
+            ApiAssert.fail(sysRoleResourceService.existRelByRoleId(id), "存在角色关联菜单权限不允许删除");
+        });
+        return super.removeByIds(ids);
+    }
+}

+ 77 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysUserRoleServiceImpl.java

@@ -0,0 +1,77 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysUserRole;
+import com.aizuda.boot.system.entity.param.AssignRolesParam;
+import com.aizuda.boot.system.mapper.SysUserRoleMapper;
+import com.aizuda.boot.system.service.ISysUserRoleService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 系统用户角色 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Service
+public class SysUserRoleServiceImpl extends BaseServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService {
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean assignRoles(AssignRolesParam assignRolesParam) {
+        // 删除历史
+        List<Long> userIds = assignRolesParam.getUserIds();
+        this.removeByUserIds(userIds);
+        if (CollectionUtils.isEmpty(assignRolesParam.getRoleIds())) {
+            // 无需分配角色
+            return true;
+        }
+
+        // 批量新增
+        List<SysUserRole> sysUserRoleList = new ArrayList<>();
+        userIds.forEach(userId -> sysUserRoleList.addAll(assignRolesParam.getRoleIds().stream()
+                .map(roleId -> {
+                    SysUserRole sysUserRole = new SysUserRole();
+                    sysUserRole.setUserId(userId);
+                    sysUserRole.setRoleId(roleId);
+                    return sysUserRole;
+                }).collect(Collectors.toList())));
+        return super.saveBatch(sysUserRoleList);
+    }
+
+    private boolean removeByUserIds(List<Long> userIds) {
+        return super.remove(Wrappers.<SysUserRole>lambdaQuery().in(SysUserRole::getUserId, userIds));
+    }
+
+    @Override
+    public boolean updateById(SysUserRole sysUserRole) {
+        ApiAssert.isEmpty(sysUserRole.getId(), "主键不存在无法更新");
+        return super.updateById(sysUserRole);
+    }
+
+    @Override
+    public List<Long> listRoleIdsByUserId(Long userId) {
+        List<SysUserRole> sysUserRoleList = super.list(Wrappers.<SysUserRole>lambdaQuery()
+                .select(SysUserRole::getRoleId).eq(SysUserRole::getUserId, userId));
+        return CollectionUtils.isEmpty(sysUserRoleList) ? null : sysUserRoleList.stream().map(t -> t.getRoleId())
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean existRelByRoleId(Long roleId) {
+        return lambdaQuery().eq(SysUserRole::getRoleId, roleId).count() > 0;
+    }
+}

+ 122 - 0
src/main/java/com/aizuda/boot/system/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,122 @@
+/*
+ * 爱组搭 http://aizuda.com 低代码组件化开发平台
+ * ------------------------------------------
+ * 受知识产权保护,请勿删除版权申明
+ */
+package com.aizuda.boot.system.service.impl;
+
+import com.aizuda.common.toolkit.RegexUtils;
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.aizuda.boot.system.entity.SysUser;
+import com.aizuda.boot.system.entity.param.AssignRolesParam;
+import com.aizuda.boot.system.entity.param.ResetPasswordParam;
+import com.aizuda.boot.system.entity.param.SysUserParam;
+import com.aizuda.boot.system.entity.vo.SysUserVO;
+import com.aizuda.boot.system.mapper.SysUserMapper;
+import com.aizuda.boot.system.service.ISysUserRoleService;
+import com.aizuda.boot.system.service.ISysUserService;
+import com.baomidou.kisso.common.encrypt.MD5;
+import com.baomidou.kisso.common.encrypt.MD5Salt;
+import com.baomidou.kisso.common.util.RandomUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Resource;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 系统用户 服务实现类
+ *
+ * @author 青苗
+ * @since 2021-11-03
+ */
+@Service
+public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
+    @Resource
+    private ISysUserRoleService sysUserRoleService;
+
+    @Override
+    public Page<SysUser> page(Page<SysUser> page, SysUserVO vo) {
+        if (null == vo || null == vo.getRoleId()) {
+            return super.page(page);
+        }
+        List<SysUser> sysUsers = baseMapper.selectPageByVO(page, vo);
+        if (CollectionUtils.isNotEmpty(sysUsers)) {
+            // 对外隐藏属性
+            sysUsers.forEach(t -> {
+                t.setPassword(null);
+                t.setSalt(null);
+            });
+        }
+        return page.setRecords(sysUsers);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean save(SysUserParam param) {
+        ApiAssert.fail(!RegexUtils.matches("(^[A-Za-z]{6,50}$)|(^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,50}$)", param.getUsername()),
+                "用户名,必须是 6 到 50 位 字母 或者 字母数字混合 字符串");
+        this.checkPassword(param.getPassword());
+        // 检查登录账号是否存在
+        this.checkExists(Wrappers.<SysUser>lambdaQuery().select(SysUser::getId).eq(SysUser::getUsername, param.getUsername()), "登录账号已存在");
+        param.setSalt(RandomUtil.getCharacterAndNumber(8));
+        param.setPassword(this.encodePassword(param.getUsername(), param.getSalt(), param.getPassword()));
+        ApiAssert.fail(!super.save(param), "用户信息保存失败");
+        if (CollectionUtils.isEmpty(param.getRoleIds())) {
+            // 无需分配角色
+            return true;
+        }
+        return this.assignRoles(param);
+    }
+
+    protected void checkPassword(String password) {
+        ApiAssert.fail(!RegexUtils.isPassword(password), "登录密码必须为6-20位大小写字母数字特殊字符组合");
+    }
+
+    protected String encodePassword(String username, String salt, String password) {
+        return MD5Salt.encode(username + salt, MD5.toMD5(password));
+    }
+
+    protected boolean assignRoles(SysUserParam param) {
+        // 分配角色
+        AssignRolesParam assignRolesParam = new AssignRolesParam();
+        assignRolesParam.setRoleIds(param.getRoleIds());
+        assignRolesParam.setUserIds(Arrays.asList(param.getId()));
+        return sysUserRoleService.assignRoles(assignRolesParam);
+    }
+
+    @Override
+    public boolean updateById(SysUserParam param) {
+        ApiAssert.fail(!super.updateById(param), "用户信息保存失败");
+        // 登录账号,密码,盐不允许更新
+        param.setUsername(null);
+        param.setPassword(null);
+        param.setSalt(null);
+        return this.assignRoles(param);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean resetPassword(ResetPasswordParam param) {
+        this.checkPassword(param.getPassword());
+        List<Long> ids = param.getIds();
+        for (Long id : ids) {
+            SysUser sysUser = super.getOne(Wrappers.<SysUser>lambdaQuery()
+                    .select(SysUser::getUsername, SysUser::getSalt)
+                    .eq(SysUser::getId, id));
+            if (null == sysUser) {
+                continue;
+            }
+            SysUser temp = new SysUser();
+            temp.setId(id);
+            temp.setPassword(this.encodePassword(sysUser.getUsername(), sysUser.getSalt(), param.getPassword()));
+            super.updateById(temp);
+        }
+        return true;
+    }
+}