haha há 2 anos atrás
commit
ab4e298b34
63 ficheiros alterados com 2118 adições e 0 exclusões
  1. 38 0
      .gitignore
  2. 13 0
      Dockerfile
  3. 101 0
      pom.xml
  4. 2 0
      seec-user-manage-common/README.md
  5. 20 0
      seec-user-manage-common/pom.xml
  6. 11 0
      seec-user-manage-common/src/main/java/com/seecoder/UserManageCommonApplication.java
  7. 14 0
      seec-user-manage-common/src/main/java/com/seecoder/satoken/SaTokenConfig.java
  8. 40 0
      seec-user-manage-common/src/main/java/com/seecoder/satoken/StpInterfaceImpl.java
  9. 38 0
      seec-user-manage-common/src/main/resources/application.yml
  10. 39 0
      seec-user-manage-server/pom.xml
  11. 13 0
      seec-user-manage-server/src/main/java/com/seecoder/UserManageServerApplication.java
  12. 27 0
      seec-user-manage-server/src/main/java/com/seecoder/config/LettuceConnectionValidConfig.java
  13. 88 0
      seec-user-manage-server/src/main/java/com/seecoder/controller/BindController.java
  14. 52 0
      seec-user-manage-server/src/main/java/com/seecoder/controller/PermissionController.java
  15. 64 0
      seec-user-manage-server/src/main/java/com/seecoder/controller/RoleController.java
  16. 25 0
      seec-user-manage-server/src/main/java/com/seecoder/controller/TestController.java
  17. 118 0
      seec-user-manage-server/src/main/java/com/seecoder/controller/UserController.java
  18. 21 0
      seec-user-manage-server/src/main/java/com/seecoder/convertor/RolePermissionConvertor.java
  19. 32 0
      seec-user-manage-server/src/main/java/com/seecoder/convertor/UserConvertor.java
  20. 16 0
      seec-user-manage-server/src/main/java/com/seecoder/dao/PermissionDao.java
  21. 11 0
      seec-user-manage-server/src/main/java/com/seecoder/dao/PlatformUserDao.java
  22. 14 0
      seec-user-manage-server/src/main/java/com/seecoder/dao/RoleDao.java
  23. 21 0
      seec-user-manage-server/src/main/java/com/seecoder/dao/RolePermissionDao.java
  24. 20 0
      seec-user-manage-server/src/main/java/com/seecoder/dao/UserPermissionDao.java
  25. 20 0
      seec-user-manage-server/src/main/java/com/seecoder/dao/UserRoleDao.java
  26. 12 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/bo/RolePermissionBO.java
  27. 12 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/bo/UserPermissionBO.java
  28. 12 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/bo/UserRoleBO.java
  29. 34 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/po/Permission.java
  30. 47 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/po/PlatformUser.java
  31. 30 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/po/Role.java
  32. 26 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/po/RolePermission.java
  33. 27 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/po/UserPermission.java
  34. 27 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/po/UserRole.java
  35. 11 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/CreateUserRoleBindReq.java
  36. 9 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/LoginReq.java
  37. 13 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/PermissionCreateReq.java
  38. 10 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/ResetPasswordReq.java
  39. 12 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/RoleCreateReq.java
  40. 11 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/RoleGrantPermissionReq.java
  41. 9 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/RolePermissionBindReq.java
  42. 17 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/UserCreateReq.java
  43. 11 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/req/UserGrantPermissionReq.java
  44. 32 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/vo/PlatformUserVO.java
  45. 4 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/vo/RolePermissionVO.java
  46. 21 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/vo/UserPermissionVO.java
  47. 20 0
      seec-user-manage-server/src/main/java/com/seecoder/entity/vo/UserRoleVO.java
  48. 6 0
      seec-user-manage-server/src/main/java/com/seecoder/enums/PermissionStatusEnum.java
  49. 7 0
      seec-user-manage-server/src/main/java/com/seecoder/enums/RoleStatusEnum.java
  50. 35 0
      seec-user-manage-server/src/main/java/com/seecoder/satoken/GlobalExceptionHandler.java
  51. 23 0
      seec-user-manage-server/src/main/java/com/seecoder/satoken/SaTokenConfig.java
  52. 42 0
      seec-user-manage-server/src/main/java/com/seecoder/satoken/StpInterfaceImpl.java
  53. 29 0
      seec-user-manage-server/src/main/java/com/seecoder/service/BindService.java
  54. 19 0
      seec-user-manage-server/src/main/java/com/seecoder/service/PermissionService.java
  55. 28 0
      seec-user-manage-server/src/main/java/com/seecoder/service/PlatformUserService.java
  56. 22 0
      seec-user-manage-server/src/main/java/com/seecoder/service/RoleService.java
  57. 4 0
      seec-user-manage-server/src/main/java/com/seecoder/service/UserRoleService.java
  58. 168 0
      seec-user-manage-server/src/main/java/com/seecoder/service/impl/BindServiceImpl.java
  59. 81 0
      seec-user-manage-server/src/main/java/com/seecoder/service/impl/PermissionServiceImpl.java
  60. 173 0
      seec-user-manage-server/src/main/java/com/seecoder/service/impl/PlatformUserServiceImpl.java
  61. 111 0
      seec-user-manage-server/src/main/java/com/seecoder/service/impl/RoleServiceImpl.java
  62. 65 0
      seec-user-manage-server/src/main/resources/application.yml
  63. 40 0
      settings.xml

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 13 - 0
Dockerfile

@@ -0,0 +1,13 @@
+FROM maven:3.6.1 AS compile_stage
+ENV PROJECT_NAME app
+ENV WORK_PATH /opt/$PROJECT_NAME
+COPY settings.xml /root/.m2/settings.xml
+COPY . $WORK_PATH
+#RUN cd $WORK_PATH && mvn clean install -DskipTests -DfinalName=$PROJECT_NAME
+
+FROM java:8-jre-alpine
+ENV PROJECT_NAME app
+ENV WORK_PATH /opt/$PROJECT_NAME
+WORKDIR /app
+COPY --from=compile_stage $WORK_PATH/seec-user-manage-server/target/${PROJECT_NAME}.jar .
+CMD ["sh", "-c", "java -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n -jar -server /app/${PROJECT_NAME}.jar"]

+ 101 - 0
pom.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.3</version>
+        <relativePath />
+    </parent>
+
+    <groupId>com.seecoder</groupId>
+    <artifactId>seec-user-manage</artifactId>
+    <version>0.0.2</version>
+    <packaging>pom</packaging>
+    <modules>
+        <module>seec-user-manage-common</module>
+        <module>seec-user-manage-server</module>
+    </modules>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <!-- 定义 Sa-Token 版本号 -->
+        <sa-token.version>1.37.0</sa-token.version>
+        <finalName>${project.artifactId}-${project.version}</finalName>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+        <!-- Sa-Token 权限认证 -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>${sa-token.version}</version>
+        </dependency>
+        <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-redis-jackson</artifactId>
+            <version>${sa-token.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+        <!-- Sa-Token插件:权限缓存与业务缓存分离 -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-alone-redis</artifactId>
+            <version>${sa-token.version}</version>
+        </dependency>
+
+
+
+        <!--内部依赖-->
+        <dependency>
+            <groupId>com.seecoder</groupId>
+            <artifactId>common-core</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${finalName}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <distributionManagement>
+        <repository>
+            <id>nexus</id>
+            <url>http://nexus.seecoder.cn/repository/maven-releases</url>
+        </repository>
+    </distributionManagement>
+
+</project>

+ 2 - 0
seec-user-manage-common/README.md

@@ -0,0 +1,2 @@
+## application.yml配置
+sa-token.alone-redis的配置是共享的鉴权缓存redis配置,根据实际情况进行更改。

+ 20 - 0
seec-user-manage-common/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.seecoder</groupId>
+        <artifactId>seec-user-manage</artifactId>
+        <version>0.0.2</version>
+    </parent>
+
+    <artifactId>seec-user-manage-common</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>

+ 11 - 0
seec-user-manage-common/src/main/java/com/seecoder/UserManageCommonApplication.java

@@ -0,0 +1,11 @@
+package com.seecoder;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UserManageCommonApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(UserManageCommonApplication.class, args);
+    }
+}

+ 14 - 0
seec-user-manage-common/src/main/java/com/seecoder/satoken/SaTokenConfig.java

@@ -0,0 +1,14 @@
+package com.seecoder.satoken;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class SaTokenConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
+    }
+}

+ 40 - 0
seec-user-manage-common/src/main/java/com/seecoder/satoken/StpInterfaceImpl.java

@@ -0,0 +1,40 @@
+package com.seecoder.satoken;
+
+import cn.dev33.satoken.stp.StpInterface;
+import cn.dev33.satoken.stp.StpUtil;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class StpInterfaceImpl implements StpInterface {
+    /**
+     * 返回一个账号所拥有的权限码集合
+     * @param loginId 登录Id
+     * @param loginType 登录类型
+     * @return 权限码集合
+     */
+    @Override
+    public List<String> getPermissionList(Object loginId, String loginType) {
+        String permissions = (String) StpUtil.getSession().get("permissions");
+        System.out.println(permissions);
+        return Arrays.stream(permissions.split(",")).collect(Collectors.toList());
+    }
+
+    /**
+     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
+     * @param loginId 登录ID
+     * @param loginType 登录类型
+     * @return 角色标识集合
+     */
+    @Override
+    public List<String> getRoleList(Object loginId, String loginType) {
+        // 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询角色
+        List<String> list = new ArrayList<String>();
+        list.add("admin");
+        list.add("super-admin");
+        System.out.println("roleList:"+list);
+        return list;
+    }
+}

+ 38 - 0
seec-user-manage-common/src/main/resources/application.yml

@@ -0,0 +1,38 @@
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
+sa-token:
+  # token 名称(同时也是 cookie 名称)
+  token-name: Authorization
+  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
+  timeout: 2592000
+  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
+  active-timeout: -1
+  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
+  is-share: true
+  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
+  token-style: uuid
+  # 是否输出操作日志
+  is-log: true
+
+  alone-redis:
+    # Redis数据库索引
+    database: 1
+    # Redis服务器地址
+    host: 139.196.193.252
+    # Redis服务器连接端口
+    port: 6379
+    # Redis服务器连接密码(默认为空)
+    password: NJU67redis
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池最大连接数
+        max-active: 200
+        # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+        # 连接池中的最大空闲连接
+        max-idle: 10
+        # 连接池中的最小空闲连接
+        min-idle: 0

+ 39 - 0
seec-user-manage-server/pom.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.seecoder</groupId>
+        <artifactId>seec-user-manage</artifactId>
+        <version>0.0.2</version>
+    </parent>
+
+    <artifactId>seec-user-manage-server</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <!--持久化-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.28</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.validation</groupId>
+            <artifactId>jakarta.validation-api</artifactId>
+            <version>2.0.2</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 13 - 0
seec-user-manage-server/src/main/java/com/seecoder/UserManageServerApplication.java

@@ -0,0 +1,13 @@
+package com.seecoder;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+public class UserManageServerApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(UserManageServerApplication.class, args);
+    }
+}

+ 27 - 0
seec-user-manage-server/src/main/java/com/seecoder/config/LettuceConnectionValidConfig.java

@@ -0,0 +1,27 @@
+package com.seecoder.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class LettuceConnectionValidConfig implements InitializingBean {
+    @Autowired
+    private RedisConnectionFactory redisConnectionFactory;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        if (redisConnectionFactory instanceof LettuceConnectionFactory) {
+
+            System.out.println("保活监测设置成功");
+            LettuceConnectionFactory c = (LettuceConnectionFactory) redisConnectionFactory;
+            c.setValidateConnection(true);
+            System.out.println(c.getValidateConnection());
+        }
+    }
+}
+

+ 88 - 0
seec-user-manage-server/src/main/java/com/seecoder/controller/BindController.java

@@ -0,0 +1,88 @@
+package com.seecoder.controller;
+
+import com.seecoder.commoncore.util.Response;
+import com.seecoder.entity.bo.RolePermissionBO;
+import com.seecoder.entity.bo.UserPermissionBO;
+import com.seecoder.entity.bo.UserRoleBO;
+import com.seecoder.entity.req.CreateUserRoleBindReq;
+import com.seecoder.entity.vo.UserPermissionVO;
+import com.seecoder.entity.vo.UserRoleVO;
+import com.seecoder.service.BindService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RestController
+@RequestMapping("/bind")
+@RequiredArgsConstructor
+public class BindController {
+    final private BindService bindService;
+
+    @GetMapping("/rolePermission")
+    public Response<List<RolePermissionBO>> getAllRolePermissionBind() {
+        return Response.ok(bindService.getAllRoleBind());
+    }
+
+    @GetMapping("/rolePermissionByParams")
+    public Response<List<RolePermissionBO>> getRolePermissionBindByParams(@RequestParam(required = false) Long roleId, @RequestParam(required = false) Long permissionId) {
+        return Response.ok(bindService.getRoleBindByParams(roleId, permissionId));
+    }
+
+    @GetMapping("deleteRolePermissionBind")
+    public Response<Void> deleteRolePermissionBind(@RequestParam Long id) {
+        bindService.deleteRolePermissionBind(id);
+        return Response.ok();
+    }
+
+    @GetMapping("/userPermission")
+    public Response<List<UserPermissionVO>> getAllUserPermissionBind() {
+        List<UserPermissionBO> boList = bindService.getAllUserBind();
+        List<UserPermissionVO> voList = new ArrayList<>();
+        for (UserPermissionBO bo : boList) {
+            voList.add(new UserPermissionVO(bo));
+        }
+        return Response.ok(voList);
+    }
+
+    @GetMapping("/userPermissionByParams")
+    public Response<List<UserPermissionVO>> getUserPermissionBindByParams(@RequestParam(required = false) Long userId, @RequestParam(required = false) Long permissionId) {
+        List<UserPermissionBO> boList = bindService.getUserBindByParams(userId, permissionId);
+        List<UserPermissionVO> voList = new ArrayList<>();
+        for (UserPermissionBO bo : boList) {
+            voList.add(new UserPermissionVO(bo));
+        }
+        return Response.ok(voList);
+    }
+
+    @GetMapping("deleteUserPermissionBind")
+    public Response<Void> deleteUserPermissionBind(@RequestParam Long id) {
+        bindService.deleteUserPermissionBind(id);
+        return Response.ok();
+    }
+
+    @GetMapping("/userRoleByParams")
+    public Response<List<UserRoleVO>> getUserRoleBindByParams(@RequestParam(required = false) Long userId, @RequestParam(required = false) Long roleId) {
+        List<UserRoleBO> boList = bindService.getUserRoleBindByParams(userId, roleId);
+        List<UserRoleVO> voList = new ArrayList<>();
+        for (UserRoleBO bo : boList) {
+            voList.add(new UserRoleVO(bo));
+        }
+        return Response.ok(voList);
+    }
+
+    @GetMapping("/deleteUserRoleBind")
+    public Response<Void> deleteUserRoleBind(@RequestParam Long id) {
+        bindService.deleteUserRoleBind(id);
+        return Response.ok();
+    }
+
+    @PostMapping("/createUserRoleBind")
+    public Response<Void> createUserRoleBind(@RequestBody CreateUserRoleBindReq req){
+        bindService.createUserRoleBind(req.getUserIdList(),req.getRoleIdList());
+        return Response.ok();
+    }
+
+
+}

+ 52 - 0
seec-user-manage-server/src/main/java/com/seecoder/controller/PermissionController.java

@@ -0,0 +1,52 @@
+package com.seecoder.controller;
+
+import com.seecoder.commoncore.util.Response;
+import com.seecoder.entity.po.Permission;
+import com.seecoder.entity.req.PermissionCreateReq;
+import com.seecoder.enums.PermissionStatusEnum;
+import com.seecoder.service.PermissionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@RestController
+@RequestMapping("/permission")
+@RequiredArgsConstructor
+public class PermissionController {
+    final private PermissionService permissionService;
+
+    @PostMapping("/create")
+    Response<Permission> createPermission(@Valid @RequestBody PermissionCreateReq req) {
+        Permission permission = new Permission();
+        permission.setCode(req.getCode());
+        permission.setName(req.getName());
+        permission.setCreateTime(LocalDateTime.now());
+        permission.setModifiedTime(LocalDateTime.now());
+        permission.setStatus(PermissionStatusEnum.ON);
+        return Response.ok(permissionService.create(permission));
+    }
+
+    @PostMapping("/delete")
+    Response<Long> deletePermission(Long permissionId) {
+        return Response.ok(permissionService.delete(permissionId));
+    }
+
+    @PostMapping("/setStatus")
+    Response<Permission> setStatus(@RequestParam Long permissionId, @RequestParam PermissionStatusEnum status) {
+        return Response.ok(permissionService.setStatus(permissionId,status));
+    }
+    @GetMapping("/getAll")
+    Response<List<Permission>> getAllPermissions() {
+        return Response.ok(permissionService.getAllPermissions());
+    }
+
+    @GetMapping("/get")
+    Response<Permission> getPermission(Long id){
+        return Response.ok(permissionService.get(id));
+    }
+
+
+}

+ 64 - 0
seec-user-manage-server/src/main/java/com/seecoder/controller/RoleController.java

@@ -0,0 +1,64 @@
+package com.seecoder.controller;
+
+
+import com.seecoder.commoncore.util.Response;
+import com.seecoder.entity.po.Role;
+import com.seecoder.entity.req.RoleCreateReq;
+import com.seecoder.entity.req.RoleGrantPermissionReq;
+import com.seecoder.enums.RoleStatusEnum;
+import com.seecoder.service.RoleService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/role")
+@RequiredArgsConstructor
+public class RoleController {
+    private final RoleService roleService;
+
+    @PostMapping("/create")
+    Response<Role> create(@RequestBody RoleCreateReq req) {
+        Role role = new Role();
+        role.setName(req.getName());
+        role.setCode(req.getCode());
+        role.setStatus(req.getStatus());
+        return Response.ok(roleService.create(role));
+    }
+
+    @PostMapping("/delete")
+    Response<Long> delete(@RequestParam Long id) {
+        return Response.ok(roleService.delete(id));
+    }
+
+    @PostMapping("/setStatus")
+    Response<Role> setStatus(@RequestParam Long id, @RequestParam RoleStatusEnum status) {
+        System.out.println(status);
+        return Response.ok(roleService.setStatus(id,status));
+    }
+
+    @GetMapping("/get")
+    Response<Role> get(@RequestParam Long id) {
+        return Response.ok(roleService.get(id));
+    }
+
+    @GetMapping("/getAll")
+    Response<List<Role>> getAll() {
+        return Response.ok(roleService.getAll());
+    }
+
+    @GetMapping("/getByPermissionId")
+    public Response<List<Role>> getByPermissionId(@RequestParam Long permissionId) {
+        System.out.println(permissionId);
+        return Response.ok(roleService.getByPermissionId(permissionId));
+    }
+
+    @PostMapping("/grantPermissions")
+    public Response<Void> grantPermissions(@RequestBody RoleGrantPermissionReq req) {
+        List<Long> roleIdList = req.getRoleIdList();
+        List<Long> permissionIdList = req.getPermissionIdList();
+        roleService.grantPermissionToRoles(roleIdList, permissionIdList);
+        return Response.ok();
+    }
+}

+ 25 - 0
seec-user-manage-server/src/main/java/com/seecoder/controller/TestController.java

@@ -0,0 +1,25 @@
+package com.seecoder.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.seecoder.commoncore.util.Response;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+@RequiredArgsConstructor
+public class TestController {
+
+    @RequestMapping("/user-manage")
+    @SaCheckPermission("USER_MANAGE")
+    Response<Void> testUserManage(){
+        return Response.ok();
+    }
+
+    @RequestMapping("/coder")
+    @SaCheckPermission("CODER")
+    Response<Void> testCoder(){
+        return Response.ok();
+    }
+}

+ 118 - 0
seec-user-manage-server/src/main/java/com/seecoder/controller/UserController.java

@@ -0,0 +1,118 @@
+package com.seecoder.controller;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.util.SaResult;
+import com.seecoder.commoncore.util.Response;
+import com.seecoder.convertor.UserConvertor;
+import com.seecoder.entity.po.PlatformUser;
+import com.seecoder.entity.req.LoginReq;
+import com.seecoder.entity.req.ResetPasswordReq;
+import com.seecoder.entity.req.UserCreateReq;
+import com.seecoder.entity.req.UserGrantPermissionReq;
+import com.seecoder.entity.vo.*;
+import com.seecoder.service.PlatformUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/user")
+@RequiredArgsConstructor
+public class UserController {
+    private final PlatformUserService platformUserService;
+
+    // 创建用户
+    @PostMapping("/create")
+    Response<PlatformUserVO> create(@Valid @RequestBody UserCreateReq req) {
+        PlatformUser platformUser = new PlatformUser();
+        platformUser.setUsername(req.getUsername());
+        platformUser.setEmail(req.getEmail());
+        platformUser.setPhone(req.getPhone());
+        platformUser.setPassword(req.getPassword());
+        return Response.ok(UserConvertor.PO2VO(platformUserService.createUser(platformUser)));
+    }
+
+    // 删除用户
+    @PostMapping("/delete")
+    Response<Long> delete(Long userId){
+        return Response.ok(platformUserService.deleteUser(userId));
+    }
+
+    @PostMapping("/update")
+    Response<PlatformUserVO> update(@RequestBody PlatformUserVO userVO){
+        return Response.ok(UserConvertor.PO2VO(platformUserService.updateUser(userVO)));
+    }
+
+    @PostMapping("/resetPassword")
+    Response<Void> resetPassword(@RequestBody ResetPasswordReq req){
+        platformUserService.resetPassword(req.getUserId(),req.getOriginPassword(),req.getNewPassword());
+        return Response.ok();
+    }
+
+    @GetMapping("/get")
+    Response<PlatformUserVO> get(Long userId){
+        PlatformUser user = platformUserService.getUser(userId);
+        PlatformUserVO vo = UserConvertor.PO2VO(user);
+        return Response.ok(vo);
+    }
+
+    @GetMapping("/getAll")
+    Response<List<PlatformUserVO>> getAllUsers(){
+        List<PlatformUserVO> voList = UserConvertor.poList2VOList(platformUserService.getAllUsers());
+        return Response.ok(voList);
+    }
+
+    @PostMapping("/grantPermissions")
+    public Response<Void> grantPermissions(@RequestBody UserGrantPermissionReq req) {
+        List<Long> userIdList = req.getUserIdList();
+        List<Long> permissionIdList = req.getPermissionIdList();
+        platformUserService.grantPermissionToUsers(userIdList,permissionIdList);
+        return Response.ok();
+    }
+
+    // 测试登录
+    @RequestMapping("/doLogin")
+    public Response<Map<String, String>> doLogin(@RequestBody LoginReq req){
+        try {
+            SaTokenInfo token = platformUserService.login(req.getPhone(), req.getPassword());
+            if (token == null) {
+                throw new NotLoginException("登录失败","","");
+            }
+            Map<String, String> tokenMap = new HashMap<>();
+            tokenMap.put("token", token.getTokenValue());
+            tokenMap.put("tokenHead", token.getTokenName());
+            return Response.ok(tokenMap);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Response.failed(e.getMessage());
+        }
+
+    }
+
+    // 查询登录状态
+    @RequestMapping("/isLogin")
+    public SaResult isLogin() {
+        boolean isLogin = StpUtil.isLogin();
+        return SaResult.ok("当前客户端是否已登录:" + isLogin);
+    }
+
+    // 查询 Token 信息
+    @RequestMapping("/tokenInfo")
+    public SaResult tokenInfo() {
+        return SaResult.data(StpUtil.getTokenInfo());
+    }
+
+    // 测试注销
+    @RequestMapping("/logout")
+    public SaResult logout() {
+        StpUtil.logout();
+        return SaResult.ok();
+    }
+
+}

+ 21 - 0
seec-user-manage-server/src/main/java/com/seecoder/convertor/RolePermissionConvertor.java

@@ -0,0 +1,21 @@
+package com.seecoder.convertor;
+
+import com.seecoder.entity.bo.RolePermissionBO;
+import com.seecoder.entity.po.RolePermission;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RolePermissionConvertor {
+    public static RolePermissionBO po2bo(RolePermission po) {
+        return null;
+    }
+
+    public static List<RolePermissionBO> poList2boList(List<RolePermission> poList) {
+        List<RolePermissionBO> boList = new ArrayList<>();
+        for (RolePermission po : poList) {
+            boList.add(po2bo(po));
+        }
+        return boList;
+    }
+}

+ 32 - 0
seec-user-manage-server/src/main/java/com/seecoder/convertor/UserConvertor.java

@@ -0,0 +1,32 @@
+package com.seecoder.convertor;
+
+
+import com.seecoder.entity.po.PlatformUser;
+import com.seecoder.entity.vo.PlatformUserVO;
+import org.springframework.beans.BeanUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class UserConvertor {
+    public static PlatformUser VO2PO(PlatformUserVO platformUserVO) {
+        PlatformUser platformUser = new PlatformUser();
+        BeanUtils.copyProperties(platformUserVO, platformUser);
+        return platformUser;
+    }
+
+    public static PlatformUserVO PO2VO(PlatformUser platformUser) {
+        PlatformUserVO  platformUserVO= new PlatformUserVO();
+        BeanUtils.copyProperties(platformUser, platformUserVO);
+        return platformUserVO;
+    }
+
+    public static List<PlatformUserVO> poList2VOList(List<PlatformUser> poList){
+        List<PlatformUserVO> voList = new ArrayList<>();
+        for (PlatformUser po : poList){
+            PlatformUserVO vo = PO2VO(po);
+            voList.add(vo);
+        }
+        return voList;
+    }
+}

+ 16 - 0
seec-user-manage-server/src/main/java/com/seecoder/dao/PermissionDao.java

@@ -0,0 +1,16 @@
+package com.seecoder.dao;
+
+
+import com.seecoder.entity.po.Permission;
+import com.seecoder.enums.PermissionStatusEnum;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface PermissionDao extends JpaRepository<Permission, Long> {
+    List<Permission> findByIdIn(List<Long> idList);
+
+    List<Permission> findByIdInAndStatusEquals(List<Long> idList, PermissionStatusEnum status);
+}

+ 11 - 0
seec-user-manage-server/src/main/java/com/seecoder/dao/PlatformUserDao.java

@@ -0,0 +1,11 @@
+package com.seecoder.dao;
+
+import com.seecoder.entity.po.PlatformUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PlatformUserDao extends JpaRepository<PlatformUser, Long> {
+    PlatformUser findFirstByUsername(String username);
+    PlatformUser findFirstByPhone(String phone);
+}

+ 14 - 0
seec-user-manage-server/src/main/java/com/seecoder/dao/RoleDao.java

@@ -0,0 +1,14 @@
+package com.seecoder.dao;
+
+import com.seecoder.entity.po.Role;
+import com.seecoder.enums.RoleStatusEnum;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface RoleDao extends JpaRepository<Role,Long> {
+    List<Role> findByIdIn(List<Long> idList);
+
+    List<Role> findByIdInAndStatusEquals(List<Long> idList, RoleStatusEnum status);
+
+}

+ 21 - 0
seec-user-manage-server/src/main/java/com/seecoder/dao/RolePermissionDao.java

@@ -0,0 +1,21 @@
+package com.seecoder.dao;
+
+import com.seecoder.entity.po.RolePermission;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface RolePermissionDao extends JpaRepository<RolePermission,Long> {
+    List<RolePermission> findByRoleIdIn(List<Long> roleIdList);
+
+    List<RolePermission> findByPermissionId(Long permissionId);
+
+    void deleteByRoleId(Long roleId);
+
+    void deleteByPermissionId(Long permissionId);
+
+
+
+}

+ 20 - 0
seec-user-manage-server/src/main/java/com/seecoder/dao/UserPermissionDao.java

@@ -0,0 +1,20 @@
+package com.seecoder.dao;
+
+import com.seecoder.entity.po.UserPermission;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserPermissionDao extends JpaRepository<UserPermission, Long> {
+    List<UserPermission> findByUserId(Long userId);
+
+    List<UserPermission> findByPermissionId(Long permissionId);
+
+    List<UserPermission> findByPermissionIdIn(List<Long> permissionIdLIst);
+
+    void deleteByPermissionId(Long permissionId);
+
+    void deleteByUserId(Long userId);
+}

+ 20 - 0
seec-user-manage-server/src/main/java/com/seecoder/dao/UserRoleDao.java

@@ -0,0 +1,20 @@
+package com.seecoder.dao;
+
+import com.seecoder.entity.po.UserRole;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface UserRoleDao extends JpaRepository<UserRole, Long> {
+    List<UserRole> findByUserId(Long userId);
+
+    List<UserRole> findByRoleIdIn(List<Long> roleIdList);
+
+    List<UserRole> findByRoleId(Long roleId);
+
+    void deleteByRoleId(Long roleId);
+
+    void deleteByUserId(Long userId);
+}

+ 12 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/bo/RolePermissionBO.java

@@ -0,0 +1,12 @@
+package com.seecoder.entity.bo;
+
+import com.seecoder.entity.po.Permission;
+import com.seecoder.entity.po.Role;
+import lombok.Data;
+
+@Data
+public class RolePermissionBO {
+    Long id;
+    Role role;
+    Permission permission;
+}

+ 12 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/bo/UserPermissionBO.java

@@ -0,0 +1,12 @@
+package com.seecoder.entity.bo;
+
+import com.seecoder.entity.po.Permission;
+import com.seecoder.entity.po.PlatformUser;
+import lombok.Data;
+
+@Data
+public class UserPermissionBO {
+    Long id;
+    PlatformUser user;
+    Permission permission;
+}

+ 12 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/bo/UserRoleBO.java

@@ -0,0 +1,12 @@
+package com.seecoder.entity.bo;
+
+import com.seecoder.entity.po.PlatformUser;
+import com.seecoder.entity.po.Role;
+import lombok.Data;
+
+@Data
+public class UserRoleBO {
+    Long id;
+    PlatformUser user;
+    Role role;
+}

+ 34 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/po/Permission.java

@@ -0,0 +1,34 @@
+package com.seecoder.entity.po;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.seecoder.enums.PermissionStatusEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(name = "permission")
+@ToString
+@EqualsAndHashCode
+@DynamicUpdate
+@Data
+public class Permission implements Serializable {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+    private String name;
+    private String code;
+    private PermissionStatusEnum status;
+    @Column(name = "created_at")
+    private LocalDateTime createTime;
+    @Column(name = "modified_at")
+    private LocalDateTime modifiedTime;
+
+}

+ 47 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/po/PlatformUser.java

@@ -0,0 +1,47 @@
+package com.seecoder.entity.po;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Pattern;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(name = "platform_user")
+@ToString
+@EqualsAndHashCode
+@DynamicUpdate
+@Data
+public class PlatformUser implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    @NotEmpty(message = "用户不允许为空")
+    private String username;
+
+    @Pattern(regexp = "1\\d{10}", message = "手机号格式不正确")
+    private String phone;
+
+    private String password;
+
+    private String email;
+
+    private String uid;
+
+    @Column(name = "created_at")
+    private LocalDateTime createTime;
+
+    @Column(name = "modified_at")
+    private LocalDateTime modifyTime;
+}

+ 30 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/po/Role.java

@@ -0,0 +1,30 @@
+package com.seecoder.entity.po;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.seecoder.enums.RoleStatusEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "role")
+@ToString
+@EqualsAndHashCode
+@DynamicUpdate
+@Data
+public class Role {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+
+    private String name;
+
+    private String code;
+
+    private RoleStatusEnum status;
+}

+ 26 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/po/RolePermission.java

@@ -0,0 +1,26 @@
+package com.seecoder.entity.po;
+
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "role_permission")
+@ToString
+@EqualsAndHashCode
+@DynamicUpdate
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class RolePermission {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+    @Column(name = "role_id")
+    Long roleId;
+    @Column(name = "permission_id")
+    Long permissionId;
+}

+ 27 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/po/UserPermission.java

@@ -0,0 +1,27 @@
+package com.seecoder.entity.po;
+
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "user_permission")
+@ToString
+@EqualsAndHashCode
+@DynamicUpdate
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserPermission implements Serializable {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    Long id;
+    @Column(name = "user_id")
+    Long userId;
+    @Column(name = "permission_id")
+    Long permissionId;
+}

+ 27 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/po/UserRole.java

@@ -0,0 +1,27 @@
+package com.seecoder.entity.po;
+
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "user_role")
+@ToString
+@EqualsAndHashCode
+@DynamicUpdate
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserRole implements Serializable {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Long id;
+    @Column(name = "user_id")
+    Long userId;
+    @Column(name = "role_id")
+    Long roleId;
+}

+ 11 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/CreateUserRoleBindReq.java

@@ -0,0 +1,11 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CreateUserRoleBindReq {
+    List<Long> userIdList;
+    List<Long> roleIdList;
+}

+ 9 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/LoginReq.java

@@ -0,0 +1,9 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+@Data
+public class LoginReq {
+    private String phone;
+    private String password;
+}

+ 13 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/PermissionCreateReq.java

@@ -0,0 +1,13 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+import javax.persistence.Id;
+import java.time.LocalDateTime;
+
+@Data
+public class PermissionCreateReq {
+    @Id
+    private String name;
+    private String code;
+}

+ 10 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/ResetPasswordReq.java

@@ -0,0 +1,10 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+@Data
+public class ResetPasswordReq {
+    Long userId;
+    String originPassword;
+    String newPassword;
+}

+ 12 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/RoleCreateReq.java

@@ -0,0 +1,12 @@
+package com.seecoder.entity.req;
+
+import com.seecoder.enums.RoleStatusEnum;
+import lombok.Data;
+
+@Data
+public class RoleCreateReq {
+    private String name;
+    private String code;
+    private RoleStatusEnum status;
+
+}

+ 11 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/RoleGrantPermissionReq.java

@@ -0,0 +1,11 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class RoleGrantPermissionReq {
+    List<Long> roleIdList;
+    List<Long> permissionIdList;
+}

+ 9 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/RolePermissionBindReq.java

@@ -0,0 +1,9 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+@Data
+public class RolePermissionBindReq {
+    Long roleId;
+    Long permissionId;
+}

+ 17 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/UserCreateReq.java

@@ -0,0 +1,17 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class UserCreateReq {
+    @NotNull
+    private String username;
+    @NotNull
+    private String password;
+    @NotNull
+    private String phone;
+    @NotNull
+    private String email;
+}

+ 11 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/req/UserGrantPermissionReq.java

@@ -0,0 +1,11 @@
+package com.seecoder.entity.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UserGrantPermissionReq {
+    List<Long> userIdList;
+    List<Long> permissionIdList;
+}

+ 32 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/vo/PlatformUserVO.java

@@ -0,0 +1,32 @@
+package com.seecoder.entity.vo;
+
+import com.seecoder.entity.po.Permission;
+import com.seecoder.entity.po.PlatformUser;
+import com.seecoder.entity.po.Role;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Set;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PlatformUserVO {
+    private Long id;
+    private String username;
+    private String phone;
+    private String email;
+    private String uid;
+    private LocalDateTime createTime;
+    private LocalDateTime modifyTime;
+
+    public PlatformUserVO(PlatformUser user){
+        BeanUtils.copyProperties(user,this);
+    }
+
+}

+ 4 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/vo/RolePermissionVO.java

@@ -0,0 +1,4 @@
+package com.seecoder.entity.vo;
+
+public class RolePermissionVO {
+}

+ 21 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/vo/UserPermissionVO.java

@@ -0,0 +1,21 @@
+package com.seecoder.entity.vo;
+
+
+import com.seecoder.entity.bo.UserPermissionBO;
+import com.seecoder.entity.po.Permission;
+import lombok.Data;
+
+@Data
+public class UserPermissionVO {
+    Long id;
+    PlatformUserVO user;
+    Permission permission;
+
+    UserPermissionVO(){}
+
+    public UserPermissionVO(UserPermissionBO bo){
+        this.id = bo.getId();
+        this.user = new PlatformUserVO(bo.getUser());
+        this.permission = bo.getPermission();
+    }
+}

+ 20 - 0
seec-user-manage-server/src/main/java/com/seecoder/entity/vo/UserRoleVO.java

@@ -0,0 +1,20 @@
+package com.seecoder.entity.vo;
+
+import com.seecoder.entity.bo.UserRoleBO;
+import com.seecoder.entity.po.Role;
+import lombok.Data;
+
+@Data
+public class UserRoleVO {
+    Long id;
+    PlatformUserVO user;
+    Role role;
+
+    public UserRoleVO(){}
+
+    public UserRoleVO(UserRoleBO bo){
+        this.id = bo.getId();
+        this.user = new PlatformUserVO(bo.getUser());
+        this.role = bo.getRole();
+    }
+}

+ 6 - 0
seec-user-manage-server/src/main/java/com/seecoder/enums/PermissionStatusEnum.java

@@ -0,0 +1,6 @@
+package com.seecoder.enums;
+
+public enum PermissionStatusEnum {
+    OFF(),
+    ON()
+}

+ 7 - 0
seec-user-manage-server/src/main/java/com/seecoder/enums/RoleStatusEnum.java

@@ -0,0 +1,7 @@
+package com.seecoder.enums;
+
+public enum RoleStatusEnum {
+
+    OFF(),
+    ON()
+}

+ 35 - 0
seec-user-manage-server/src/main/java/com/seecoder/satoken/GlobalExceptionHandler.java

@@ -0,0 +1,35 @@
+package com.seecoder.satoken;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.exception.NotPermissionException;
+import cn.dev33.satoken.exception.SaTokenException;
+import com.seecoder.commoncore.util.Response;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    @ExceptionHandler(SaTokenException.class)
+    @ResponseStatus(HttpStatus.FORBIDDEN)
+    public Response<String> handleException(SaTokenException ste){
+        ste.printStackTrace();
+        if(ste instanceof NotPermissionException){
+            return Response.failed("NOT_PERMISSION",ste.getMessage());
+        }
+
+        if(ste instanceof NotLoginException){
+            return Response.failed("NOT_LOGIN",ste.getMessage());
+        }
+
+        return Response.failed(ste.getMessage());
+    }
+
+    @ExceptionHandler(Exception.class)
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    public Response<String> handleException(Exception e){
+        e.printStackTrace();
+        return Response.failed(e.getMessage());
+    }
+}

+ 23 - 0
seec-user-manage-server/src/main/java/com/seecoder/satoken/SaTokenConfig.java

@@ -0,0 +1,23 @@
+package com.seecoder.satoken;
+
+import cn.dev33.satoken.interceptor.SaInterceptor;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpUtil;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class SaTokenConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new SaInterceptor(handle -> {
+            // 拦截所有URL请求,过滤注册和登录请求
+            SaRouter.match("/**")
+                    .notMatch("/user/doLogin", "/user")
+                    .check(r -> StpUtil.checkLogin());
+        })).addPathPatterns("/**");
+
+    }
+
+}

+ 42 - 0
seec-user-manage-server/src/main/java/com/seecoder/satoken/StpInterfaceImpl.java

@@ -0,0 +1,42 @@
+package com.seecoder.satoken;
+
+import cn.dev33.satoken.session.SaSessionCustomUtil;
+import cn.dev33.satoken.stp.StpInterface;
+import cn.dev33.satoken.stp.StpUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class StpInterfaceImpl implements StpInterface {
+    /**
+     * 返回一个账号所拥有的权限码集合
+     *
+     * @param loginId   登录Id
+     * @param loginType 登录类型
+     * @return 权限码集合
+     */
+    @Override
+    public List<String> getPermissionList(Object loginId, String loginType) {
+        String permissions = (String) StpUtil.getSession().get("permissions");
+        System.out.println("permissionList:" + permissions);
+        return Arrays.stream(permissions.split(",")).collect(Collectors.toList());
+    }
+
+    /**
+     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
+     *
+     * @param loginId   登录ID
+     * @param loginType 登录类型
+     * @return 角色标识集合
+     */
+    @Override
+    public List<String> getRoleList(Object loginId, String loginType) {
+        String roles = (String) StpUtil.getSession().get("roles");
+        System.out.println("roleList:" + roles);
+        return Arrays.stream(roles.split(",")).collect(Collectors.toList());
+    }
+}

+ 29 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/BindService.java

@@ -0,0 +1,29 @@
+package com.seecoder.service;
+
+import com.seecoder.entity.bo.RolePermissionBO;
+import com.seecoder.entity.bo.UserPermissionBO;
+import com.seecoder.entity.bo.UserRoleBO;
+
+import java.util.List;
+
+public interface BindService {
+    List<RolePermissionBO> getAllRoleBind();
+
+    List<RolePermissionBO> getRoleBindByParams(Long roleId, Long permissionId);
+
+    void deleteRolePermissionBind(Long id);
+
+    List<UserPermissionBO> getAllUserBind();
+
+    List<UserPermissionBO> getUserBindByParams(Long userId, Long permissionId);
+
+    void deleteUserPermissionBind(Long id);
+
+    List<UserRoleBO> getAllUserRoleBind();
+
+    List<UserRoleBO> getUserRoleBindByParams(Long userId, Long roleId);
+
+    void deleteUserRoleBind(Long id);
+
+    void createUserRoleBind(List<Long> userIdList,List<Long> roleIdList);
+}

+ 19 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/PermissionService.java

@@ -0,0 +1,19 @@
+package com.seecoder.service;
+
+
+import com.seecoder.entity.po.Permission;
+import com.seecoder.enums.PermissionStatusEnum;
+
+import java.util.List;
+
+public interface PermissionService {
+    Permission create(Permission permission);
+
+    Long delete(Long permissionId);
+
+    Permission setStatus(Long permissionId, PermissionStatusEnum status);
+
+    Permission get(Long id);
+
+    List<Permission> getAllPermissions();
+}

+ 28 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/PlatformUserService.java

@@ -0,0 +1,28 @@
+package com.seecoder.service;
+
+import cn.dev33.satoken.stp.SaTokenInfo;
+import com.seecoder.entity.po.PlatformUser;
+import com.seecoder.entity.vo.PlatformUserVO;
+
+import java.util.List;
+
+public interface PlatformUserService {
+
+    PlatformUser getInfo(String username);
+
+    Long deleteUser(Long userId);
+
+    PlatformUser createUser(PlatformUser platformUser);
+
+    PlatformUser updateUser(PlatformUserVO userVO);
+
+    PlatformUser getUser(Long userId);
+
+    List<PlatformUser> getAllUsers();
+
+    void resetPassword(Long userId,String originPassword,String newPassword);
+
+    void grantPermissionToUsers(List<Long> userIdList,List<Long> permissionIdList);
+
+    SaTokenInfo login(String phone, String password);
+}

+ 22 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/RoleService.java

@@ -0,0 +1,22 @@
+package com.seecoder.service;
+
+import com.seecoder.entity.po.Role;
+import com.seecoder.enums.RoleStatusEnum;
+
+import java.util.List;
+
+public interface RoleService {
+    Role create(Role role);
+
+    Long delete(Long id);
+
+    Role setStatus(Long id, RoleStatusEnum status);
+
+    List<Role> getAll();
+
+    Role get(Long id);
+
+    List<Role> getByPermissionId(Long permissionId);
+
+    void grantPermissionToRoles(List<Long> roleIdList,List<Long> permissionList);
+}

+ 4 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/UserRoleService.java

@@ -0,0 +1,4 @@
+package com.seecoder.service;
+
+public interface UserRoleService {
+}

+ 168 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/impl/BindServiceImpl.java

@@ -0,0 +1,168 @@
+package com.seecoder.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.seecoder.dao.*;
+import com.seecoder.entity.bo.RolePermissionBO;
+import com.seecoder.entity.bo.UserPermissionBO;
+import com.seecoder.entity.bo.UserRoleBO;
+import com.seecoder.entity.po.RolePermission;
+import com.seecoder.entity.po.UserPermission;
+import com.seecoder.entity.po.UserRole;
+import com.seecoder.service.BindService;
+import lombok.RequiredArgsConstructor;
+import org.apache.catalina.User;
+import org.springframework.data.domain.Example;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.transaction.Transactional;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Service
+@RequiredArgsConstructor
+public class BindServiceImpl implements BindService {
+    final private UserPermissionDao userPermissionDao;
+    final private RolePermissionDao rolePermissionDao;
+    final private PlatformUserDao platformUserDao;
+    final private RoleDao roleDao;
+    final private PermissionDao permissionDao;
+    final private UserRoleDao userRoleDao;
+
+    @Override
+    public List<RolePermissionBO> getAllRoleBind() {
+        List<RolePermission> rolePermissionList = rolePermissionDao.findAll();
+        return rolePermissionPOList2BOList(rolePermissionList);
+    }
+
+    @Transactional
+    @Override
+    public List<RolePermissionBO> getRoleBindByParams(Long roleId, Long permissionId) {
+        RolePermission example = RolePermission.builder().roleId(roleId).permissionId(permissionId).build();
+        List<RolePermission> rolePermissionList = rolePermissionDao.findAll(Example.of(example));
+        return rolePermissionPOList2BOList(rolePermissionList);
+    }
+
+    @Override
+    public void deleteRolePermissionBind(Long id) {
+        RolePermission rolePermission = rolePermissionDao.findById(id).orElse(null);
+        if (Objects.isNull(rolePermission)) {
+            return;
+        }
+        Long roleId = rolePermission.getRoleId();
+        List<UserRole> userRoleList = userRoleDao.findByRoleId(roleId);
+        for (UserRole userRole : userRoleList) {
+            StpUtil.logout(userRole.getUserId());
+        }
+        rolePermissionDao.deleteById(id);
+    }
+
+    private List<RolePermissionBO> rolePermissionPOList2BOList(List<RolePermission> rolePermissionList) {
+        List<RolePermissionBO> rolePermissionBOList = new ArrayList<>();
+        for (RolePermission po : rolePermissionList) {
+            RolePermissionBO bo = new RolePermissionBO();
+            bo.setId(po.getId());
+            bo.setRole(roleDao.findById(po.getRoleId()).orElse(null));
+            bo.setPermission(permissionDao.findById(po.getPermissionId()).orElse(null));
+            rolePermissionBOList.add(bo);
+        }
+        return rolePermissionBOList;
+    }
+
+    @Override
+    public List<UserPermissionBO> getAllUserBind() {
+        List<UserPermission> userPermissionList = userPermissionDao.findAll();
+        return userPermissionPOList2BOList(userPermissionList);
+    }
+
+    @Override
+    public List<UserPermissionBO> getUserBindByParams(Long userId, Long permissionId) {
+        UserPermission example = UserPermission.builder().userId(userId).permissionId(permissionId).build();
+        List<UserPermission> userPermissionList = userPermissionDao.findAll(Example.of(example));
+        return userPermissionPOList2BOList(userPermissionList);
+    }
+
+    @Override
+    public void deleteUserPermissionBind(Long id) {
+        UserPermission userPermission = userPermissionDao.findById(id).orElse(null);
+        if (Objects.isNull(userPermission)) {
+            return;
+        }
+        StpUtil.logout(userPermission.getUserId());
+        userPermissionDao.deleteById(id);
+    }
+
+    private List<UserPermissionBO> userPermissionPOList2BOList(List<UserPermission> userPermissionList) {
+        List<UserPermissionBO> userPermissionBOList = new ArrayList<>();
+        for (UserPermission po : userPermissionList) {
+            UserPermissionBO bo = new UserPermissionBO();
+            bo.setId(po.getId());
+            bo.setUser(platformUserDao.findById(po.getUserId()).orElse(null));
+            bo.setPermission(permissionDao.findById(po.getPermissionId()).orElse(null));
+            userPermissionBOList.add(bo);
+        }
+        return userPermissionBOList;
+    }
+
+    @Override
+    public List<UserRoleBO> getAllUserRoleBind() {
+        List<UserRole> userRoleList = userRoleDao.findAll();
+        return userRolePOList2BOList(userRoleList);
+    }
+
+    @Override
+    public List<UserRoleBO> getUserRoleBindByParams(Long userId, Long roleId) {
+        UserRole example = UserRole.builder().userId(userId).roleId(roleId).build();
+        List<UserRole> userRoleList = userRoleDao.findAll(Example.of(example));
+        return userRolePOList2BOList(userRoleList);
+    }
+
+
+    private List<UserRoleBO> userRolePOList2BOList(List<UserRole> userRoleList) {
+        List<UserRoleBO> userRoleBOList = new ArrayList<>();
+        for (UserRole po : userRoleList) {
+            UserRoleBO bo = new UserRoleBO();
+            bo.setId(po.getId());
+            bo.setUser(platformUserDao.findById(po.getUserId()).orElse(null));
+            bo.setRole(roleDao.findById(po.getRoleId()).orElse(null));
+            userRoleBOList.add(bo);
+        }
+        return userRoleBOList;
+    }
+
+    @Override
+    public void deleteUserRoleBind(Long id) {
+        UserRole userRole = userRoleDao.findById(id).orElse(null);
+        if (Objects.isNull(userRole)) {
+            return;
+        }
+        StpUtil.logout(userRole.getUserId());
+        userRoleDao.deleteById(id);
+    }
+
+    @Override
+    public void createUserRoleBind(List<Long> userIdList, List<Long> roleIdList) {
+        if (CollectionUtils.isEmpty(roleIdList) || CollectionUtils.isEmpty(userIdList)) {
+            return;
+        }
+        // 绑定用户-角色
+        List<UserRole> userRoleList = new ArrayList<>();
+        for (Long userId : userIdList) {
+            for (Long roleId : roleIdList) {
+                UserRole userRole = new UserRole();
+                userRole.setUserId(userId);
+                userRole.setRoleId(roleId);
+                userRoleList.add(userRole);
+            }
+        }
+        userRoleDao.saveAll(userRoleList);
+        // 登出用户
+        for (Long userId : userIdList) {
+            StpUtil.logout(userId);
+
+        }
+    }
+
+
+}

+ 81 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/impl/PermissionServiceImpl.java

@@ -0,0 +1,81 @@
+package com.seecoder.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.seecoder.dao.PermissionDao;
+import com.seecoder.dao.RolePermissionDao;
+import com.seecoder.dao.UserPermissionDao;
+import com.seecoder.dao.UserRoleDao;
+import com.seecoder.entity.po.Permission;
+import com.seecoder.entity.po.RolePermission;
+import com.seecoder.entity.po.UserPermission;
+import com.seecoder.entity.po.UserRole;
+import com.seecoder.enums.PermissionStatusEnum;
+import com.seecoder.service.PermissionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class PermissionServiceImpl implements PermissionService {
+    private final PermissionDao permissionDao;
+    private final UserPermissionDao userPermissionDao;
+    private final RolePermissionDao rolePermissionDao;
+    private final UserRoleDao userRoleDao;
+
+    @Override
+    public Permission create(Permission permission) {
+        return permissionDao.save(permission);
+    }
+
+    @Override
+    public Long delete(Long permissionId) {
+        // 删除角色与权限的绑定关系
+        rolePermissionDao.deleteByPermissionId(permissionId);
+        // 删除用户与权限的绑定关系
+        userPermissionDao.deleteByPermissionId(permissionId);
+        // 删除权限
+        permissionDao.deleteById(permissionId);
+        // 注销用户使其重新登录
+        logoutByPermissionId(permissionId);
+        return permissionId;
+    }
+
+    @Override
+    public Permission setStatus(Long permissionId, PermissionStatusEnum status) {
+        // 1.修改权限状态
+        Permission permission = permissionDao.findById(permissionId).orElse(null);
+        if(Objects.isNull(permission)){
+            return null;
+        }
+        permission.setStatus(status);
+        permission = permissionDao.save(permission);
+        // 2.注销用户使其重新登录
+        logoutByPermissionId(permissionId);
+        return permission;
+    }
+
+    private void logoutByPermissionId(Long permissionId){
+        List<Long> userIdListFromUserPermission = userPermissionDao.findByPermissionId(permissionId).stream().map(UserPermission::getUserId).collect(Collectors.toList());
+        Set<Long> userIdSet = new HashSet<>(userIdListFromUserPermission);
+        List<Long> roleIdList = rolePermissionDao.findByPermissionId(permissionId).stream().map(RolePermission::getRoleId).distinct().collect(Collectors.toList());
+        List<Long> userIdListFromRoleBind = userRoleDao.findByRoleIdIn(roleIdList).stream().map(UserRole::getUserId).distinct().collect(Collectors.toList());
+        userIdSet.addAll(userIdListFromRoleBind);
+        for (Long userId : userIdSet) {
+            StpUtil.logout(userId);
+        }
+    }
+
+    @Override
+    public Permission get(Long id) {
+        Optional<Permission> optional = permissionDao.findById(id);
+        return optional.orElse(null);
+    }
+
+    @Override
+    public List<Permission> getAllPermissions() {
+        return permissionDao.findAll();
+    }
+}

+ 173 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/impl/PlatformUserServiceImpl.java

@@ -0,0 +1,173 @@
+package com.seecoder.service.impl;
+
+import cn.dev33.satoken.session.SaSessionCustomUtil;
+import cn.dev33.satoken.stp.SaTokenInfo;
+import cn.dev33.satoken.stp.StpUtil;
+import com.seecoder.convertor.UserConvertor;
+import com.seecoder.dao.*;
+import com.seecoder.entity.po.*;
+import com.seecoder.entity.vo.PlatformUserVO;
+import com.seecoder.enums.PermissionStatusEnum;
+import com.seecoder.enums.RoleStatusEnum;
+import com.seecoder.service.PlatformUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class PlatformUserServiceImpl implements PlatformUserService {
+    private final PlatformUserDao platformUserDao;
+    private final UserPermissionDao userPermissionDao;
+    private final PermissionDao permissionDao;
+    private final UserRoleDao userRoleDao;
+    private final RolePermissionDao rolePermissionDao;
+    private final RoleDao roleDao;
+
+    @Override
+    public PlatformUser getInfo(String username) {
+        return platformUserDao.findFirstByUsername(username);
+    }
+
+    @Transactional
+    @Override
+    public Long deleteUser(Long userId) {
+        // 删除用户与角色的绑定关系
+        userRoleDao.deleteByUserId(userId);
+        // 删除用户与权限的绑定关系
+        userPermissionDao.deleteByUserId(userId);
+        // 删除用户
+        platformUserDao.deleteById(userId);
+        return userId;
+    }
+
+    @Transactional
+    @Override
+    public PlatformUser createUser(PlatformUser platformUser) {
+        platformUser.setCreateTime(LocalDateTime.now());
+        return platformUserDao.save(platformUser);
+
+    }
+
+    @Transactional
+    @Override
+    public PlatformUser updateUser(PlatformUserVO userVO) {
+        PlatformUser user = platformUserDao.findById(userVO.getId()).orElseThrow(()->new RuntimeException("找不到用户"));
+        if(userVO.getPhone() != null){
+            user.setPhone(userVO.getPhone());
+        }
+        if(userVO.getEmail()!=null){
+            user.setEmail(userVO.getEmail());
+        }
+        if(userVO.getUsername()!=null){
+            user.setUsername(userVO.getUsername());
+        }
+        if(userVO.getUid()!=null){
+            user.setUid(userVO.getUid());
+        }
+        user.setModifyTime(LocalDateTime.now());
+        return platformUserDao.save(user);
+    }
+
+    @Override
+    public PlatformUser getUser(Long userId) {
+        return platformUserDao.findById(userId).orElse(null);
+    }
+
+    @Override
+    public List<PlatformUser> getAllUsers() {
+        return platformUserDao.findAll();
+    }
+
+    @Transactional
+    @Override
+    public void resetPassword(Long userId, String originPassword, String newPassword) {
+        // 校验原密码
+        PlatformUser user = platformUserDao.findById(userId).orElseThrow(() -> new RuntimeException("找不到用户"));
+        if (!Objects.equals(user.getPassword(), originPassword)) {
+            throw new RuntimeException("原密码错误");
+        }
+        // 设置新密码
+        user.setPassword(newPassword);
+        platformUserDao.save(user);
+        // 注销登录
+        StpUtil.logout(userId);
+    }
+
+    @Transactional
+    @Override
+    public void grantPermissionToUsers(List<Long> userIdList, List<Long> permissionIdList) {
+        if (CollectionUtils.isEmpty(userIdList) || CollectionUtils.isEmpty(permissionIdList)) {
+            return;
+        }
+        // 授权给对应角色
+        List<UserPermission> userPermissionList = new ArrayList<>();
+        for (Long userId : userIdList) {
+            for (Long permissionId : permissionIdList) {
+                UserPermission up = new UserPermission();
+                up.setUserId(userId);
+                up.setPermissionId(permissionId);
+                userPermissionList.add(up);
+            }
+        }
+        userPermissionDao.saveAll(userPermissionList);
+        // 注销角色所对应的用户的登录状态(使其重新登录并获取新的角色绑定关系)
+        for (Long userId : userIdList) {
+            StpUtil.logout(userId);
+        }
+    }
+
+    @Override
+    @Transactional
+    public SaTokenInfo login(String phone, String password) {
+        PlatformUser platformUser = platformUserDao.findFirstByPhone(phone);
+        if (platformUser == null) {
+            return null;
+        }
+        if (!password.equals(platformUser.getPassword())) {
+            return null;
+        }
+        // 获取用户权限
+        Long userId = platformUser.getId();
+        List<String> permissionList = getUserPermissionList(userId);
+        List<String> roleList = getUserRoleList(userId);
+        StpUtil.login(userId);
+        StpUtil.getSession().set("permissions", String.join(",", permissionList));
+        StpUtil.getSession().set("roles", String.join(",", roleList));
+        return StpUtil.getTokenInfo();
+    }
+
+    private List<String> getUserRoleList(Long userId) {
+        List<Long> roleIdList = userRoleDao.findByUserId(userId)
+                .stream().map(UserRole::getRoleId).distinct().collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(roleIdList)) {
+            return new ArrayList<>();
+        }
+        return roleDao.findByIdInAndStatusEquals(roleIdList, RoleStatusEnum.ON).stream().map(Role::getName).distinct().collect(Collectors.toList());
+    }
+
+    private List<String> getUserPermissionList(Long userId) {
+        // 获取用户的角色
+        List<Long> roleIdList = userRoleDao.findByUserId(userId)
+                .stream().map(UserRole::getRoleId).distinct().collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(roleIdList)) {
+            return new ArrayList<>();
+        }
+        // 获取启用的角色
+        List<Long> onRoleIdList = roleDao.findByIdInAndStatusEquals(roleIdList, RoleStatusEnum.ON).stream().map(Role::getId).distinct().collect(Collectors.toList());
+        // 获取角色对应的权限
+        List<Long> permissionIdList = rolePermissionDao.findByRoleIdIn(onRoleIdList)
+                .stream().map(RolePermission::getPermissionId).distinct().collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(permissionIdList)) {
+            return new ArrayList<>();
+        }
+        // 返回权限Code列表
+        return permissionDao.findByIdInAndStatusEquals(permissionIdList, PermissionStatusEnum.ON)
+                .stream().map(Permission::getCode).collect(Collectors.toList());
+    }
+}

+ 111 - 0
seec-user-manage-server/src/main/java/com/seecoder/service/impl/RoleServiceImpl.java

@@ -0,0 +1,111 @@
+package com.seecoder.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.seecoder.dao.RoleDao;
+import com.seecoder.dao.RolePermissionDao;
+import com.seecoder.dao.UserRoleDao;
+import com.seecoder.entity.po.Role;
+import com.seecoder.entity.po.RolePermission;
+import com.seecoder.entity.po.UserPermission;
+import com.seecoder.entity.po.UserRole;
+import com.seecoder.enums.RoleStatusEnum;
+import com.seecoder.service.RoleService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class RoleServiceImpl implements RoleService {
+    final private RoleDao roleDao;
+    final private RolePermissionDao rolePermissionDao;
+    final private UserRoleDao userRoleDao;
+
+    @Override
+    public Role create(Role role) {
+        return roleDao.save(role);
+    }
+
+    @Override
+    public Long delete(Long id) {
+        // 删除角色与用户的绑定关系
+        userRoleDao.deleteByRoleId(id);
+        // 删除角色与权限的绑定关系
+        rolePermissionDao.deleteByRoleId(id);
+        // 删除角色
+        roleDao.deleteById(id);
+        // 注销用户使其重新登录
+        logoutUserByRoleIdList(Collections.singletonList(id));
+        return id;
+    }
+
+    @Override
+    public Role setStatus(Long id,RoleStatusEnum status) {
+        // 1. 修改角色状态
+        Role role = roleDao.findById(id).orElse(null);
+        if(Objects.isNull(role)){
+            return null;
+        }
+        role.setStatus(status);
+        role = roleDao.save(role);
+        // 2.注销用户使其重新登录
+        logoutUserByRoleIdList(Collections.singletonList(id));
+        return role;
+    }
+
+    @Override
+    public List<Role> getAll() {
+        return roleDao.findAll();
+    }
+
+    @Override
+    public Role get(Long id) {
+        return roleDao.findById(id).orElse(null);
+    }
+
+    @Override
+    public List<Role> getByPermissionId(Long permissionId) {
+        List<RolePermission> rolePermissionList = rolePermissionDao.findByPermissionId(permissionId);
+        System.out.println(rolePermissionList);
+        List<Long> roleIdList = rolePermissionList.stream().map(RolePermission::getRoleId)
+                .distinct().collect(Collectors.toList());
+        System.out.println(roleIdList);
+        if (CollectionUtils.isEmpty(roleIdList)) {
+            return new ArrayList<>();
+        }
+        return roleDao.findByIdIn(roleIdList);
+    }
+
+    @Override
+    public void grantPermissionToRoles(List<Long> roleIdList, List<Long> permissionList) {
+        if(CollectionUtils.isEmpty(roleIdList) || CollectionUtils.isEmpty(permissionList)){
+            return;
+        }
+        // 授权给对应角色
+        List<RolePermission> rolePermissionList = new ArrayList<>();
+        for(Long roleId:roleIdList){
+            for(Long permissionId:permissionList){
+                RolePermission rp = new RolePermission();
+                rp.setRoleId(roleId);
+                rp.setPermissionId(permissionId);
+                rolePermissionList.add(rp);
+            }
+        }
+        rolePermissionDao.saveAll(rolePermissionList);
+        // 注销角色所对应的用户的登录状态(使其重新登录并获取新的角色绑定关系)
+        logoutUserByRoleIdList(roleIdList);
+    }
+
+    private void logoutUserByRoleIdList(List<Long> roleIdList){
+        List<Long> userIdList = userRoleDao.findByRoleIdIn(roleIdList).stream().map(UserRole::getUserId).collect(Collectors.toList());
+        for(Long userId:userIdList){
+            StpUtil.logout(userId);
+        }
+    }
+}

+ 65 - 0
seec-user-manage-server/src/main/resources/application.yml

@@ -0,0 +1,65 @@
+server:
+  # 端口
+  port: 8080
+
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
+sa-token:
+  # token 名称(同时也是 cookie 名称)
+  token-name: Authorization
+  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
+  timeout: 2592000
+  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
+  active-timeout: -1
+  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
+  is-concurrent: true
+  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
+  is-share: true
+  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
+  token-style: uuid
+  # 是否输出操作日志
+  is-log: true
+
+  alone-redis:
+    # Redis数据库索引
+    database: 1
+    # Redis服务器地址
+    host: 101.133.232.246
+    # Redis服务器连接端口
+    port: 6379
+    # Redis服务器连接密码(默认为空)
+    password: NJU67redis
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池最大连接数
+        max-active: 20
+        # 连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+        # 连接池中的最大空闲连接
+        max-idle: 10
+        # 连接池中的最小空闲连接
+        min-idle: 1
+      cluster:
+        refresh:
+          adaptive: true
+          period: 20
+
+spring:
+  datasource:
+    url: jdbc:mysql://localhost:3306/micro?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&useSSL=false
+    username: root
+    password: 123456
+    driverClassName: com.mysql.cj.jdbc.Driver
+  jpa:
+    hibernate:
+      ddl-auto: update
+      naming:
+        implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
+        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
+    database-platform: org.hibernate.dialect.MySQL57InnoDBDialect
+    #    show-sql: true
+    properties:
+      hibernate.enable_lazy_load_no_trans: true
+      #      hibernate.format_sql: true
+    open-in-view: true

+ 40 - 0
settings.xml

@@ -0,0 +1,40 @@
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
+					http://maven.apache.org/xsd/settings-1.0.0.xsd">
+    <mirrors>
+        <mirror>
+            <id>aliyunmaven</id>
+            <mirrorOf>central</mirrorOf>
+            <name>阿里云公共仓库</name>
+            <url>https://maven.aliyun.com/repository/public</url>
+        </mirror>
+    </mirrors>
+    <profiles>
+        <profile>
+            <id>nexus</id>
+            <repositories>
+                <repository>
+                    <id>public</id>
+                    <name>Public Repositories</name>
+                    <url>http://nexus.seecoder.cn/repository/maven-public</url>
+                </repository>
+                <repository>
+                    <id>releases</id>
+                    <name>Public Repositories</name>
+                    <url>http://nexus.seecoder.cn/repository/maven-releases</url>
+                </repository>
+            </repositories>
+        </profile>
+    </profiles>
+    <activeProfiles>
+        <activeProfile>nexus</activeProfile>
+    </activeProfiles>
+    <servers>
+        <server>
+            <id>nexus</id>
+            <username>admin</username>
+            <password>NJU67nexus</password>
+        </server>
+    </servers>
+</settings>