Browse Source

fix:第一次提交

liaoyitao 7 months ago
parent
commit
1c57992755
55 changed files with 2174 additions and 285 deletions
  1. 22 9
      pom.xml
  2. 8 10
      src/main/java/com/lqkj/cmlcp/config/WebSecurityConfig.java
  3. 9 1
      src/main/java/com/lqkj/cmlcp/exception/GlobalExceptionHandler.java
  4. 34 0
      src/main/java/com/lqkj/cmlcp/handler/MyAccessDeniedHandler.java
  5. 33 0
      src/main/java/com/lqkj/cmlcp/handler/MyAuthenticationEntryPoint.java
  6. 11 4
      src/main/java/com/lqkj/cmlcp/message/Result.java
  7. 40 0
      src/main/java/com/lqkj/cmlcp/module/api/controller/ApiInfoController.java
  8. 58 0
      src/main/java/com/lqkj/cmlcp/module/api/domain/ApiInfo.java
  9. 19 0
      src/main/java/com/lqkj/cmlcp/module/api/repository/ApiInfoRepository.java
  10. 15 0
      src/main/java/com/lqkj/cmlcp/module/api/service/ApiInfoService.java
  11. 35 0
      src/main/java/com/lqkj/cmlcp/module/api/service/impl/ApiInfoServiceImpl.java
  12. 114 0
      src/main/java/com/lqkj/cmlcp/module/authority/controller/RoleInfoController.java
  13. 158 0
      src/main/java/com/lqkj/cmlcp/module/authority/controller/UserInfoController.java
  14. 14 0
      src/main/java/com/lqkj/cmlcp/module/authority/domain/LoginBody.java
  15. 12 8
      src/main/java/com/lqkj/cmlcp/module/authority/domain/RoleInfo.java
  16. 14 13
      src/main/java/com/lqkj/cmlcp/module/authority/domain/UserInfo.java
  17. 0 13
      src/main/java/com/lqkj/cmlcp/module/authority/mapper/UserInfoMapper.java
  18. 134 0
      src/main/java/com/lqkj/cmlcp/module/authority/repository/RoleInfoRepository.java
  19. 91 0
      src/main/java/com/lqkj/cmlcp/module/authority/repository/UserInfoRepository.java
  20. 56 0
      src/main/java/com/lqkj/cmlcp/module/authority/service/RoleInfoService.java
  21. 64 2
      src/main/java/com/lqkj/cmlcp/module/authority/service/UserInfoService.java
  22. 7 6
      src/main/java/com/lqkj/cmlcp/module/authority/service/impl/DatabaseUserDetailService.java
  23. 108 0
      src/main/java/com/lqkj/cmlcp/module/authority/service/impl/RoleInfoServiceImpl.java
  24. 172 57
      src/main/java/com/lqkj/cmlcp/module/authority/service/impl/UserInfoServiceImpl.java
  25. 12 1
      src/main/java/com/lqkj/cmlcp/module/base/controller/BaseController.java
  26. 8 0
      src/main/java/com/lqkj/cmlcp/module/base/service/BaseService.java
  27. 12 1
      src/main/java/com/lqkj/cmlcp/module/base/service/impl/BaseServiceImpl.java
  28. 31 0
      src/main/java/com/lqkj/cmlcp/module/config/controller/ConfigInfoController.java
  29. 48 0
      src/main/java/com/lqkj/cmlcp/module/config/domain/ConfigInfo.java
  30. 9 0
      src/main/java/com/lqkj/cmlcp/module/config/repository/ConfigInfoRepository.java
  31. 10 0
      src/main/java/com/lqkj/cmlcp/module/config/service/ConfigInfoService.java
  32. 31 0
      src/main/java/com/lqkj/cmlcp/module/config/service/impl/ConfigInfoServiceImpl.java
  33. 49 0
      src/main/java/com/lqkj/cmlcp/module/encrypt/controller/EncryptController.java
  34. 0 29
      src/main/java/com/lqkj/cmlcp/module/test/controller/TestController.java
  35. 0 33
      src/main/java/com/lqkj/cmlcp/module/test/domain/Captcha.java
  36. 0 9
      src/main/java/com/lqkj/cmlcp/module/test/mapper/CaptchaMapper.java
  37. 0 12
      src/main/java/com/lqkj/cmlcp/module/test/service/CaptchaService.java
  38. 0 44
      src/main/java/com/lqkj/cmlcp/module/test/service/impl/CaptchaServiceImpl.java
  39. 43 0
      src/main/java/com/lqkj/cmlcp/module/zone/controller/ProjectInfoController.java
  40. 52 0
      src/main/java/com/lqkj/cmlcp/module/zone/controller/ZoneInfoController.java
  41. 60 0
      src/main/java/com/lqkj/cmlcp/module/zone/domain/ProjectInfo.java
  42. 106 0
      src/main/java/com/lqkj/cmlcp/module/zone/domain/ZoneInfo.java
  43. 26 0
      src/main/java/com/lqkj/cmlcp/module/zone/domain/ZoneModel.java
  44. 20 0
      src/main/java/com/lqkj/cmlcp/module/zone/repository/ProjectInfoRepository.java
  45. 21 0
      src/main/java/com/lqkj/cmlcp/module/zone/repository/ZoneInfoRepository.java
  46. 14 0
      src/main/java/com/lqkj/cmlcp/module/zone/service/ProjectInfoService.java
  47. 21 0
      src/main/java/com/lqkj/cmlcp/module/zone/service/ZoneInfoService.java
  48. 45 0
      src/main/java/com/lqkj/cmlcp/module/zone/service/impl/ProjectInfoServiceImpl.java
  49. 58 0
      src/main/java/com/lqkj/cmlcp/module/zone/service/impl/ZoneInfoServiceImpl.java
  50. 85 0
      src/main/java/com/lqkj/cmlcp/utils/AESUtils.java
  51. 39 3
      src/main/resources/application-install.yml
  52. 0 13
      src/main/resources/com/lqkj/cmlcp/module/authority/mapper/UserInfoMapper.xml
  53. 0 4
      src/main/resources/com/lqkj/cmlcp/module/test/mapper/CaptchaMapper.xml
  54. 138 1
      src/main/resources/db/migration/V1__INIT.sql
  55. 8 12
      src/main/resources/log4j2.xml

+ 22 - 9
pom.xml

@@ -83,17 +83,11 @@
83 83
             <artifactId>okio</artifactId>
84 84
             <version>3.6.0</version>
85 85
         </dependency>
86
-        <!-- mybatis-flex -->
87 86
         <dependency>
88
-            <groupId>com.mybatis-flex</groupId>
89
-            <artifactId>mybatis-flex-spring-boot3-starter</artifactId>
90
-            <version>1.9.5</version>
91
-        </dependency>
92
-        <dependency>
93
-            <groupId>com.zaxxer</groupId>
94
-            <artifactId>HikariCP</artifactId>
87
+            <groupId>org.springframework.boot</groupId>
88
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
95 89
         </dependency>
96
-<!--        redis-->
90
+        <!--        redis-->
97 91
         <dependency>
98 92
             <groupId>org.springframework.boot</groupId>
99 93
             <artifactId>spring-boot-starter-data-redis</artifactId>
@@ -125,6 +119,25 @@
125 119
             <version>0.11.5</version>
126 120
             <scope>runtime</scope>
127 121
         </dependency>
122
+        <dependency>
123
+            <groupId>com.alibaba.fastjson2</groupId>
124
+            <artifactId>fastjson2</artifactId>
125
+            <version>2.0.49</version>
126
+        </dependency>
127
+        <dependency>
128
+            <groupId>io.hypersistence</groupId>
129
+            <artifactId>hypersistence-utils-hibernate-63</artifactId>
130
+            <version>3.7.5</version>
131
+        </dependency>
132
+        <dependency>
133
+            <groupId>org.hibernate.orm</groupId>
134
+            <artifactId>hibernate-spatial</artifactId>
135
+            <version>6.5.0.Final</version>
136
+        </dependency>
137
+        <dependency>
138
+            <groupId>com.zaxxer</groupId>
139
+            <artifactId>HikariCP</artifactId>
140
+        </dependency>
128 141
     </dependencies>
129 142
 
130 143
     <build>

+ 8 - 10
src/main/java/com/lqkj/cmlcp/config/WebSecurityConfig.java

@@ -3,6 +3,8 @@ package com.lqkj.cmlcp.config;
3 3
 
4 4
 import com.lqkj.cmlcp.config.auth.LoginAuthenticationProvider;
5 5
 import com.lqkj.cmlcp.filter.JwtAuthFilter;
6
+import com.lqkj.cmlcp.handler.MyAccessDeniedHandler;
7
+import com.lqkj.cmlcp.handler.MyAuthenticationEntryPoint;
6 8
 import com.lqkj.cmlcp.module.authority.service.impl.DatabaseUserDetailService;
7 9
 import org.springframework.context.annotation.Bean;
8 10
 import org.springframework.context.annotation.Configuration;
@@ -36,23 +38,19 @@ public class WebSecurityConfig {
36 38
         return http
37 39
                 .csrf(AbstractHttpConfigurer::disable)
38 40
                 .authorizeHttpRequests((requests) -> requests
41
+//                        .requestMatchers("/api/getAll").hasRole("超级管理员")
39 42
                         .requestMatchers(
40
-                                "/jwt/token",
41
-                                "/jwt/getAdminToken",
42
-                                "/encrypt/**",
43
-                                "/swagger-ui.html",
44
-                                "/swagger-ui/**",
45
-                                "/v3/api-docs/**",
46
-                                "/geom/all",
47
-                                "/test/**",
48
-                                "/upload/**")
43
+                                "/**")
49 44
                         .permitAll()
50 45
                         .requestMatchers("/**")
51 46
                         .authenticated())
52 47
                 .sessionManagement((session) -> session
53 48
                         .sessionCreationPolicy(SessionCreationPolicy.STATELESS))
54
-                .authenticationProvider(authenticationProvider())
49
+//                .authenticationProvider(authenticationProvider())
55 50
                 .addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
51
+                .exceptionHandling(exception -> exception
52
+                        .accessDeniedHandler(new MyAccessDeniedHandler())
53
+                        .authenticationEntryPoint(new MyAuthenticationEntryPoint()))
56 54
                 .build();
57 55
     }
58 56
 

+ 9 - 1
src/main/java/com/lqkj/cmlcp/exception/GlobalExceptionHandler.java

@@ -3,6 +3,7 @@ package com.lqkj.cmlcp.exception;
3 3
 import com.lqkj.cmlcp.message.Result;
4 4
 import org.slf4j.Logger;
5 5
 import org.slf4j.LoggerFactory;
6
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
6 7
 import org.springframework.web.bind.annotation.ControllerAdvice;
7 8
 import org.springframework.web.bind.annotation.ExceptionHandler;
8 9
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -20,6 +21,13 @@ public class GlobalExceptionHandler {
20 21
     public Result<String> resolveException(Exception e) {
21 22
         logger.error("收到异常", e);
22 23
 
23
-        return Result.fail(e.toString());
24
+        return Result.fail(e.getMessage());
25
+    }
26
+
27
+    @ExceptionHandler(UsernameNotFoundException.class)
28
+    @ResponseBody
29
+    public Result<String> resolveException(UsernameNotFoundException e) {
30
+        logger.error("收到异常", e);
31
+        return Result.fail(e.getMessage());
24 32
     }
25 33
 }

+ 34 - 0
src/main/java/com/lqkj/cmlcp/handler/MyAccessDeniedHandler.java

@@ -0,0 +1,34 @@
1
+package com.lqkj.cmlcp.handler;
2
+
3
+import com.alibaba.fastjson2.JSON;
4
+import jakarta.servlet.ServletException;
5
+import jakarta.servlet.http.HttpServletRequest;
6
+import jakarta.servlet.http.HttpServletResponse;
7
+import org.springframework.security.access.AccessDeniedException;
8
+import org.springframework.security.web.access.AccessDeniedHandler;
9
+
10
+import java.io.IOException;
11
+import java.util.HashMap;
12
+import java.util.Map;
13
+
14
+public class MyAccessDeniedHandler implements AccessDeniedHandler {
15
+    @Override
16
+    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException, IOException {
17
+        Map<String,Object> result = new HashMap();
18
+        result.put("code",401);   // 没有权限
19
+        result.put("message","没有权限");   //
20
+        result.put("success", false);
21
+
22
+
23
+        //  将结果对象转换成json字符串
24
+        String json = JSON.toJSONString(result);
25
+
26
+        //  返回json数据到前端
27
+        //  响应头
28
+        response.setContentType("application/json;charset=UTF-8");
29
+        //  响应体
30
+        response.getWriter().println(json);
31
+        //返回页面
32
+        //response.sendRedirect(request.getContextPath()+"/main");
33
+    }
34
+}

+ 33 - 0
src/main/java/com/lqkj/cmlcp/handler/MyAuthenticationEntryPoint.java

@@ -0,0 +1,33 @@
1
+package com.lqkj.cmlcp.handler;
2
+
3
+import com.alibaba.fastjson2.JSON;
4
+import jakarta.servlet.ServletException;
5
+import jakarta.servlet.http.HttpServletRequest;
6
+import jakarta.servlet.http.HttpServletResponse;
7
+import org.springframework.security.core.AuthenticationException;
8
+import org.springframework.security.web.AuthenticationEntryPoint;
9
+
10
+import java.io.IOException;
11
+import java.util.HashMap;
12
+import java.util.Map;
13
+
14
+public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {
15
+    @Override
16
+    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
17
+        String localizedMessage = "Unauthorized";//authException.getLocalizedMessage();
18
+
19
+        Map<String,Object> result = new HashMap();
20
+        result.put("code",401);   // 告诉用户需要登录
21
+        result.put("message",localizedMessage);   //
22
+
23
+        result.put("success", false);
24
+
25
+        //  将结果对象转换成json字符串
26
+        String json = JSON.toJSONString(result);
27
+        //  返回json数据到前端
28
+        //  响应头
29
+        response.setContentType("application/json;charset=UTF-8");
30
+        //  响应体
31
+        response.getWriter().println(json);
32
+    }
33
+}

+ 11 - 4
src/main/java/com/lqkj/cmlcp/message/Result.java

@@ -36,6 +36,14 @@ public class Result<T> {
36 36
         return result;
37 37
     }
38 38
 
39
+    public static <T> Result<T> build(T body, Integer code, String message, Boolean isSuccess) {
40
+        Result<T> result = build(body);
41
+        result.setCode(code);
42
+        result.setMessage(message);
43
+        result.setSuccess(isSuccess);
44
+        return result;
45
+    }
46
+
39 47
     public static <T> Result<T> build(Integer code, String message, Boolean isSuccess) {
40 48
         Result<T> result = build(null);
41 49
         result.setCode(code);
@@ -82,13 +90,12 @@ public class Result<T> {
82 90
 
83 91
     /**
84 92
      * 操作失败
85
-     * @param data
93
+     * @param message
86 94
      * @param <T>
87 95
      * @return
88 96
      */
89
-    public static<T> Result<T> fail(T data){
90
-        Result<T> result = build(data);
91
-        return build(data, ResultCodeEnum.FAIL, false);
97
+    public static<T> Result<T> fail(String message){
98
+        return build(null, 201, message, false);
92 99
     }
93 100
 
94 101
     public Result<T> message(String msg){

+ 40 - 0
src/main/java/com/lqkj/cmlcp/module/api/controller/ApiInfoController.java

@@ -0,0 +1,40 @@
1
+package com.lqkj.cmlcp.module.api.controller;
2
+
3
+import com.lqkj.cmlcp.message.Result;
4
+import com.lqkj.cmlcp.module.api.domain.ApiInfo;
5
+import com.lqkj.cmlcp.module.api.service.ApiInfoService;
6
+import io.swagger.v3.oas.annotations.tags.Tag;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.web.bind.annotation.*;
9
+
10
+import java.util.List;
11
+
12
+
13
+@RestController
14
+@Tag(name = "产品配置接口", description = "产品配置接口")
15
+@RequestMapping("/api")
16
+public class ApiInfoController {
17
+
18
+    @Autowired
19
+    private ApiInfoService apiInfoService;
20
+
21
+
22
+    @PostMapping("/saveApi")
23
+    public Result saveConfig(@RequestBody ApiInfo apiInfo) {
24
+        apiInfoService.saveApi(apiInfo);
25
+        return Result.ok();
26
+    }
27
+
28
+    @GetMapping("/getAll")
29
+    public Result getConfig(@RequestParam(required = false, defaultValue = "") String name,
30
+                            @RequestParam(required = true) Integer type) {
31
+        return Result.ok(apiInfoService.findAll(name, type));
32
+    }
33
+
34
+    @PostMapping("/delete")
35
+    public Result delete(@RequestBody List<Integer> ids) {
36
+        apiInfoService.delete(ids);
37
+        return Result.ok();
38
+    }
39
+
40
+}

+ 58 - 0
src/main/java/com/lqkj/cmlcp/module/api/domain/ApiInfo.java

@@ -0,0 +1,58 @@
1
+package com.lqkj.cmlcp.module.api.domain;
2
+
3
+import com.alibaba.fastjson2.JSONObject;
4
+import io.hypersistence.utils.hibernate.type.json.JsonType;
5
+import io.swagger.v3.oas.annotations.media.Schema;
6
+import jakarta.persistence.*;
7
+import lombok.AllArgsConstructor;
8
+import lombok.Getter;
9
+import lombok.NoArgsConstructor;
10
+import lombok.Setter;
11
+import org.hibernate.annotations.Type;
12
+
13
+@Entity
14
+@Table(name = "api_info")
15
+@Getter
16
+@Setter
17
+@NoArgsConstructor
18
+@AllArgsConstructor
19
+public class ApiInfo {
20
+    @Id
21
+    @Column(name = "id")
22
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
23
+    private Integer id;
24
+
25
+    @Column(name = "name")
26
+    @Schema(description = "api名字")
27
+    private String name;
28
+
29
+    @Column(name = "method")
30
+    @Schema(description = "参数类型")
31
+    private String method;
32
+
33
+    @Column(name = "url")
34
+    @Schema(description = "请求地址")
35
+    private String url;
36
+
37
+    @Type(JsonType.class)
38
+    @Column(name = "headers", columnDefinition = "jsonb")
39
+    @Schema(description = "请求头")
40
+    private JSONObject headers;
41
+
42
+    @Type(JsonType.class)
43
+    @Column(name = "params", columnDefinition = "jsonb")
44
+    @Schema(description = "请求参数")
45
+    private JSONObject params;
46
+
47
+    @Type(JsonType.class)
48
+    @Column(name = "data", columnDefinition = "jsonb")
49
+    @Schema(description = "请求体")
50
+    private JSONObject data;
51
+
52
+    @Column(name = "type")
53
+    @Schema(description = "api类型, 1 rest; 2 static")
54
+    private Integer type;
55
+
56
+}
57
+
58
+

+ 19 - 0
src/main/java/com/lqkj/cmlcp/module/api/repository/ApiInfoRepository.java

@@ -0,0 +1,19 @@
1
+package com.lqkj.cmlcp.module.api.repository;
2
+
3
+import com.lqkj.cmlcp.module.api.domain.ApiInfo;
4
+import org.springframework.data.jpa.repository.JpaRepository;
5
+import org.springframework.data.jpa.repository.Query;
6
+import org.springframework.data.repository.query.Param;
7
+import org.springframework.stereotype.Repository;
8
+
9
+import java.util.List;
10
+
11
+@Repository
12
+public interface ApiInfoRepository extends JpaRepository<ApiInfo, Integer> {
13
+
14
+
15
+    @Query(nativeQuery = true,
16
+            value = "select * from api_info t where t.type = :type " +
17
+            "and (:name = '' or t.name like concat('%', :name, '%'))")
18
+    List<ApiInfo> findAllByType(@Param("name") String name, @Param("type") Integer type);
19
+}

+ 15 - 0
src/main/java/com/lqkj/cmlcp/module/api/service/ApiInfoService.java

@@ -0,0 +1,15 @@
1
+package com.lqkj.cmlcp.module.api.service;
2
+
3
+import com.lqkj.cmlcp.module.api.domain.ApiInfo;
4
+
5
+import java.util.List;
6
+
7
+public interface ApiInfoService {
8
+
9
+    void saveApi(ApiInfo configInfo);
10
+
11
+    List<ApiInfo> findAll(String name, Integer type);
12
+
13
+    void delete(List<Integer> ids);
14
+
15
+}

+ 35 - 0
src/main/java/com/lqkj/cmlcp/module/api/service/impl/ApiInfoServiceImpl.java

@@ -0,0 +1,35 @@
1
+package com.lqkj.cmlcp.module.api.service.impl;
2
+
3
+import com.lqkj.cmlcp.module.api.domain.ApiInfo;
4
+import com.lqkj.cmlcp.module.api.repository.ApiInfoRepository;
5
+import com.lqkj.cmlcp.module.api.service.ApiInfoService;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.stereotype.Service;
8
+import org.springframework.transaction.annotation.Propagation;
9
+import org.springframework.transaction.annotation.Transactional;
10
+
11
+import java.util.List;
12
+
13
+@Service
14
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
15
+public class ApiInfoServiceImpl implements ApiInfoService {
16
+
17
+
18
+    @Autowired
19
+    private ApiInfoRepository apiInfoRepository;
20
+    @Override
21
+    @Transactional
22
+    public void saveApi(ApiInfo apiInfo) {
23
+        apiInfoRepository.save(apiInfo);
24
+    }
25
+
26
+    @Override
27
+    public List<ApiInfo> findAll(String name, Integer type) {
28
+        return apiInfoRepository.findAllByType(name, type);
29
+    }
30
+
31
+    @Override
32
+    public void delete(List<Integer> ids) {
33
+        apiInfoRepository.deleteAllById(ids);
34
+    }
35
+}

+ 114 - 0
src/main/java/com/lqkj/cmlcp/module/authority/controller/RoleInfoController.java

@@ -0,0 +1,114 @@
1
+package com.lqkj.cmlcp.module.authority.controller;
2
+
3
+import com.lqkj.cmlcp.message.Result;
4
+import com.lqkj.cmlcp.module.authority.domain.RoleInfo;
5
+import com.lqkj.cmlcp.module.authority.service.RoleInfoService;
6
+import com.lqkj.cmlcp.module.jwt.service.JwtService;
7
+import io.swagger.v3.oas.annotations.Operation;
8
+import io.swagger.v3.oas.annotations.Parameter;
9
+import io.swagger.v3.oas.annotations.media.Content;
10
+import io.swagger.v3.oas.annotations.media.Schema;
11
+import io.swagger.v3.oas.annotations.tags.Tag;
12
+import jakarta.servlet.http.HttpServletRequest;
13
+import org.apache.commons.lang3.StringUtils;
14
+import org.springframework.beans.factory.annotation.Autowired;
15
+import org.springframework.data.domain.Page;
16
+import org.springframework.web.bind.annotation.*;
17
+
18
+import java.util.List;
19
+
20
+@RestController
21
+@RequestMapping("/role")
22
+@Tag(name = "角色管理", description = "角色管理")
23
+public class RoleInfoController {
24
+
25
+    
26
+    
27
+    @Autowired
28
+    private RoleInfoService roleInfoService;
29
+
30
+    @Autowired
31
+    private JwtService jwtService;
32
+    
33
+    
34
+    @Operation(
35
+            summary = "5.3.14 角色列表接口",
36
+            description = "5.3.14 角色列表接口"
37
+    )
38
+    @PostMapping("/all")
39
+    public Result<List<RoleInfo>> allRoles() {
40
+        return Result.ok(roleInfoService.allRoles(), "查询全部角色列表");
41
+    }
42
+
43
+    @Operation(
44
+            summary = "5.3.15 角色分页接口",
45
+            description = "5.3.15 角色分页接口",
46
+            parameters = {
47
+                    @Parameter(name = "roleName", description = "角色名称"),
48
+                    @Parameter(name = "page", description = "页码"),
49
+                    @Parameter(name = "pageSize", description = "每页数据条数")
50
+            }
51
+    )
52
+    @PostMapping("/pageQuery")
53
+    public Result<Page<RoleInfo>> pageQuery(@RequestParam(required = false, defaultValue = "") String roleName,
54
+                                            @RequestParam(required = false, defaultValue = "0") Integer page,
55
+                                            @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
56
+        return Result.ok(roleInfoService.pageQuery(roleName, page, pageSize), "角色分页接口");
57
+    }
58
+
59
+    @Operation(
60
+            summary = "5.1.3.29 获取角色详情接口",
61
+            description = "5.1.3.29 获取角色详情接口",
62
+            parameters = {
63
+                    @Parameter(name = "roleId", description = "角色ID", required = true)
64
+            }
65
+    )
66
+    @PostMapping("/detail")
67
+    public Result<RoleInfo> detail(@RequestParam Integer roleId) {
68
+        return Result.ok(roleInfoService.detail(roleId), "获取角色详情");
69
+    }
70
+
71
+    @Operation(
72
+            summary = "5.1.3.16 角色保存接口",
73
+            description = "5.1.3.16 角色保存接口",
74
+            requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
75
+                    description = "角色信息实体",
76
+                    required = true,
77
+                    content = @Content(
78
+                            mediaType = "application/json",
79
+                            schema = @Schema(implementation = RoleInfo.class)
80
+                    )
81
+            )
82
+    )
83
+    @PostMapping("/save")
84
+    public Result<String> save(@RequestBody RoleInfo roleInfo) {
85
+        String msg = roleInfoService.save(roleInfo);
86
+        if (StringUtils.isNotBlank(msg)) return Result.fail(msg);
87
+        return Result.ok(null, "角色保存接口");
88
+    }
89
+
90
+    @Operation(
91
+            summary = "5.1.3.17 权限树接口",
92
+            description = "5.1.3.17 权限树接口"
93
+    )
94
+    @PostMapping("/authTree")
95
+    public Result authTree(HttpServletRequest request) {
96
+        String authHeader = request.getHeader("Authorization");
97
+        String userCode = jwtService.decryptUsernameWithHeader(authHeader);
98
+        return Result.ok(roleInfoService.queryAuthTree(userCode), "获取权限树接口");
99
+    }
100
+
101
+    @Operation(
102
+            summary = "5.1.3.18 角色删除接口",
103
+            description = "5.1.3.18 角色删除接口",
104
+            parameters = {
105
+                    @Parameter(name = "roleIds", description = "角色ID列表")
106
+            }
107
+    )
108
+    @PostMapping("/delete")
109
+    public Result<String> delete(@RequestParam List<Integer> roleIds) {
110
+        String msg = roleInfoService.delete(roleIds);
111
+        if (StringUtils.isNotBlank(msg)) return Result.fail("角色【" + msg + "】需要先删除关联用户!");
112
+        return Result.ok(null, "角色删除接口");
113
+    }
114
+}

+ 158 - 0
src/main/java/com/lqkj/cmlcp/module/authority/controller/UserInfoController.java

@@ -0,0 +1,158 @@
1
+package com.lqkj.cmlcp.module.authority.controller;
2
+
3
+import com.alibaba.fastjson2.JSON;
4
+import com.alibaba.fastjson2.JSONObject;
5
+import com.lqkj.cmlcp.message.Result;
6
+import com.lqkj.cmlcp.module.authority.domain.UserInfo;
7
+import com.lqkj.cmlcp.module.authority.service.UserInfoService;
8
+import com.lqkj.cmlcp.module.jwt.service.JwtService;
9
+import com.lqkj.cmlcp.utils.AESUtils;
10
+import com.lqkj.cmlcp.utils.RSAUtils;
11
+import io.swagger.v3.oas.annotations.Operation;
12
+import io.swagger.v3.oas.annotations.Parameter;
13
+import io.swagger.v3.oas.annotations.media.Content;
14
+import io.swagger.v3.oas.annotations.media.Schema;
15
+import io.swagger.v3.oas.annotations.tags.Tag;
16
+import jakarta.servlet.http.HttpServletRequest;
17
+import org.apache.commons.lang3.StringUtils;
18
+import org.springframework.beans.factory.annotation.Autowired;
19
+import org.springframework.data.domain.Page;
20
+import org.springframework.web.bind.annotation.*;
21
+
22
+import java.util.ArrayList;
23
+import java.util.List;
24
+
25
+
26
+@RestController
27
+@RequestMapping("/user")
28
+@Tag(name = "用户管理", description = "用户管理")
29
+public class UserInfoController {
30
+
31
+    @Autowired
32
+    private UserInfoService userInfoService;
33
+
34
+    @Autowired
35
+    private JwtService jwtService;
36
+
37
+    @Operation(
38
+            summary = "5.1.1.3 获取登录用户接口",
39
+            description = "5.1.1.3 获取登录用户接口"
40
+    )
41
+    @PostMapping("/detail")
42
+    public Result<UserInfo> detail(HttpServletRequest request) {
43
+        String authHeader = request.getHeader("Authorization");
44
+        String username = jwtService.decryptUsernameWithHeader(authHeader);
45
+        return Result.ok(userInfoService.detailByUserCode(username), "获取登录用户");
46
+    }
47
+
48
+    @Operation(
49
+            summary = "5.1.3.24 获取管理菜单接口",
50
+            description = "5.1.3.24 获取管理菜单接口"
51
+    )
52
+    @PostMapping("/authList")
53
+    public Result authList(HttpServletRequest request) {
54
+        String authHeader = request.getHeader("Authorization");
55
+        String username = jwtService.decryptUsernameWithHeader(authHeader);
56
+        return Result.ok(userInfoService.findAuthListWithUserCode(username), "获取管理菜单接口");
57
+    }
58
+
59
+    @Operation(
60
+            summary = "5.1.3.11 用户分页接口",
61
+            description = "5.1.3.11 用户分页接口",
62
+            parameters = {
63
+                    @Parameter(name = "userCode", description = "用户账号"),
64
+                    @Parameter(name = "displayName", description = "用户名"),
65
+                    @Parameter(name = "page", description = "页码"),
66
+                    @Parameter(name = "pageSize", description = "每页数据条数"),
67
+                    @Parameter(name = "key", description = "RSA加密后的aesKey")
68
+            }
69
+    )
70
+    @PostMapping("/manage/pageQuery")
71
+    public Result<JSONObject> pageQuery(@RequestParam(required = false, defaultValue = "") String userCode,
72
+                                                 @RequestParam(required = false, defaultValue = "") String displayName,
73
+                                                 @RequestParam(required = false, defaultValue = "0") Integer page,
74
+                                                 @RequestParam(required = false, defaultValue = "10") Integer pageSize,
75
+                                                 @RequestParam String key) throws Exception {
76
+        Page<UserInfo> userInfoPage = userInfoService.pageQuery(userCode, displayName, page, pageSize);
77
+        String aesKey = RSAUtils.decryptBase64(key);
78
+        List<UserInfo> list = new ArrayList<>();
79
+        for (UserInfo userInfo : userInfoPage.getContent()) {
80
+            list.add(AESUtils.encryptUser(userInfo, aesKey));
81
+        }
82
+        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(userInfoPage));
83
+        jsonObject.put("content", list);
84
+        return Result.ok(jsonObject, "用户分页接口");
85
+    }
86
+
87
+    @Operation(
88
+            summary = "5.1.3.28 用户详情接口",
89
+            description = "5.1.3.28 用户详情接口",
90
+            parameters = {
91
+                    @Parameter(name = "userId", required = true, description = "用户ID"),
92
+                    @Parameter(name = "key", description = "RSA加密后的aesKey")
93
+            }
94
+    )
95
+    @PostMapping("/manage/detail")
96
+    public Result<UserInfo> detailById(@RequestParam Integer userId,
97
+                                            @RequestParam String key) throws Exception {
98
+        String aesKey = RSAUtils.decryptBase64(key);
99
+        return Result.ok(AESUtils.encryptUser(userInfoService.detail(userId), aesKey), "用户详情接口");
100
+    }
101
+
102
+    @Operation(
103
+            summary = "5.1.3.12 保存用户接口",
104
+            description = "5.1.3.12 保存用户接口",
105
+            requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
106
+                    description = "用户实体",
107
+                    required = true,
108
+                    content = @Content(
109
+                            mediaType = "application/json",
110
+                            schema = @Schema(implementation = UserInfo.class)
111
+                    )
112
+            )
113
+    )
114
+    @PostMapping("/manage/save")
115
+    public Result save(@RequestBody UserInfo userInfo) {
116
+        userInfo.setUserCode(RSAUtils.decryptBase64(userInfo.getUserCode()));
117
+        if (StringUtils.isNotBlank(userInfo.getPassword()) && userInfo.getPassword().length() == 172) {
118
+            userInfo.setPassword(RSAUtils.decryptBase64(userInfo.getPassword()));
119
+        }
120
+//        userInfo.setAuthorizationCode(RSAUtils.decryptBase64(userInfo.getAuthorizationCode()));
121
+        String message = userInfoService.save(userInfo);
122
+        if (message == null) return Result.ok(null, "保存用户接口");
123
+        return Result.fail(message);
124
+    }
125
+
126
+    @Operation(
127
+            summary = "5.1.3.13 删除用户接口",
128
+            description = "5.1.3.13 删除用户接口",
129
+            parameters = {
130
+                    @Parameter(name = "userIds", required = true, description = "用户ID列表")
131
+            }
132
+    )
133
+    @PostMapping("/manage/delete")
134
+    public Result delete(@RequestParam List<Integer> userIds) {
135
+        userInfoService.delete(userIds);
136
+        return Result.ok(null, "删除用户接口");
137
+    }
138
+
139
+
140
+    @Operation(
141
+            summary = "5.1.2.13 用户设置",
142
+            description = "5.1.2.13 用户设置",
143
+            parameters = {
144
+                    @Parameter(name = "displayName", description = "用户名称"),
145
+                    @Parameter(name = "headImgPath", description = "头像地址")
146
+            }
147
+    )
148
+    @PostMapping( "/updateInfo")
149
+    public Result<String> saveUser(@RequestParam(required = false) String displayName,
150
+                                         @RequestParam(required = false) String headImgPath,
151
+                                         HttpServletRequest request) {
152
+        String authHeader = request.getHeader("Authorization");
153
+        String userCode = jwtService.decryptUsernameWithHeader(authHeader);
154
+        userInfoService.updateInfo(userCode, displayName, headImgPath);
155
+        return Result.ok(null, "更新用户信息");
156
+    }
157
+
158
+}

+ 14 - 0
src/main/java/com/lqkj/cmlcp/module/authority/domain/LoginBody.java

@@ -0,0 +1,14 @@
1
+package com.lqkj.cmlcp.module.authority.domain;
2
+
3
+import io.swagger.v3.oas.annotations.media.Schema;
4
+import lombok.Data;
5
+
6
+@Data
7
+public class LoginBody {
8
+    @Schema(description = "登录账号,RSA加密")
9
+    private String username;
10
+    @Schema(description = "登录密码,RSA加密")
11
+    private String password;
12
+    @Schema(description = "授权码,RSA加密")
13
+    private String authCode;
14
+}

+ 12 - 8
src/main/java/com/lqkj/cmlcp/module/authority/domain/RoleInfo.java

@@ -1,39 +1,43 @@
1 1
 package com.lqkj.cmlcp.module.authority.domain;
2 2
 
3 3
 import com.fasterxml.jackson.annotation.JsonFormat;
4
-import com.mybatisflex.annotation.Column;
5
-import com.mybatisflex.annotation.Id;
6
-import com.mybatisflex.annotation.KeyType;
7 4
 import io.swagger.v3.oas.annotations.media.Schema;
5
+import jakarta.persistence.*;
8 6
 import lombok.*;
9 7
 import lombok.experimental.Accessors;
10 8
 
9
+
11 10
 import java.util.Date;
12 11
 import java.util.List;
13 12
 
14
-
13
+@Entity
14
+@Table(name = "role_info")
15 15
 @Accessors(chain = true)
16 16
 @Data(staticConstructor = "create")
17 17
 @NoArgsConstructor
18 18
 @AllArgsConstructor
19 19
 public class RoleInfo {
20 20
 
21
-    @Id(keyType = KeyType.Auto)
21
+    @Id
22
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
22 23
     @Schema(description = "角色ID")
23 24
     private Integer roleId;
24 25
 
25 26
     @Schema(description = "角色名称")
27
+
28
+    @Column(name = "role_name")
26 29
     private String roleName;
27 30
 
28
-    @Schema(description = "")
31
+    @Column(name = "en_name")
29 32
     private String enName;
30 33
 
34
+    @Column(name = "update_time")
31 35
     @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
32 36
     private Date updateTime;
33 37
 
34
-    @Column(ignore = true)
38
+    @Transient
35 39
     private List<Integer> authorityList;
36 40
 
37
-    @Column(ignore = true)
41
+    @Transient
38 42
     private String auths;
39 43
 }

+ 14 - 13
src/main/java/com/lqkj/cmlcp/module/authority/domain/UserInfo.java

@@ -2,10 +2,7 @@ package com.lqkj.cmlcp.module.authority.domain;
2 2
 
3 3
 import com.fasterxml.jackson.annotation.JsonFormat;
4 4
 import com.fasterxml.jackson.annotation.JsonProperty;
5
-import com.mybatisflex.annotation.Column;
6
-import com.mybatisflex.annotation.Id;
7
-import com.mybatisflex.annotation.KeyType;
8
-import com.mybatisflex.core.activerecord.Model;
5
+import jakarta.persistence.*;
9 6
 import io.swagger.v3.oas.annotations.media.Schema;
10 7
 import lombok.AllArgsConstructor;
11 8
 import lombok.Data;
@@ -18,13 +15,16 @@ import java.util.Collection;
18 15
 import java.util.Date;
19 16
 import java.util.List;
20 17
 
18
+@Entity
19
+@Table(name = "user_info")
21 20
 @Accessors(chain = true)
22 21
 @Data(staticConstructor = "create")
23 22
 @NoArgsConstructor
24 23
 @AllArgsConstructor
25
-public class UserInfo extends Model<UserInfo> implements UserDetails {
24
+public class UserInfo implements UserDetails {
26 25
 
27
-	@Id(keyType = KeyType.Auto)
26
+	@Id
27
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
28 28
 	@Schema(description = "用户ID")
29 29
 	private Integer Id;
30 30
 
@@ -67,40 +67,41 @@ public class UserInfo extends Model<UserInfo> implements UserDetails {
67 67
 	@Schema(description = "是否能进入后台")
68 68
 	private Boolean hasManage;
69 69
 
70
+	@Transient
70 71
 	@Schema(description = "角色列表")
71 72
 	private List<RoleInfo> roleInfoList;
72 73
 
74
+	@Transient
73 75
 	@Schema(description = "角色ID数组")
74 76
 	private List<Integer> roleIds;
75 77
 
76
-	@Column(ignore = true)
78
+	@Transient
77 79
 	private String roleNames;
78 80
 
79
-
80 81
 	/**
81 82
 	 * @Description 得到用户的角色列表
82 83
 	 */
83
-	@Column(ignore = true)
84
+	@Transient
84 85
     private Collection<? extends GrantedAuthority> authorities;
85 86
 	/**
86 87
 	 * 判断用户是否为过期
87 88
 	 */
88
-	@Column(ignore = true)
89
+	@Transient
89 90
     private boolean accountNonExpired = true;
90 91
 	/**
91 92
 	 * 判断用户是否为锁定
92 93
 	 */
93
-	@Column(ignore = true)
94
+	@Transient
94 95
     private boolean accountNonLocked = true;
95 96
 	/**
96 97
 	 * 判断密码是否未过期
97 98
 	 */
98
-	@Column(ignore = true)
99
+	@Transient
99 100
     private boolean credentialsNonExpired = true;
100 101
 	/**
101 102
 	 * 判断账户是否激活
102 103
 	 */
103
-	@Column(ignore = true)
104
+	@Transient
104 105
     private boolean enabled = true;
105 106
 
106 107
 

+ 0 - 13
src/main/java/com/lqkj/cmlcp/module/authority/mapper/UserInfoMapper.java

@@ -1,13 +0,0 @@
1
-package com.lqkj.cmlcp.module.authority.mapper;
2
-
3
-import com.lqkj.cmlcp.module.authority.domain.UserInfo;
4
-import com.mybatisflex.core.BaseMapper;
5
-import org.apache.ibatis.annotations.Mapper;
6
-
7
-@Mapper
8
-public interface UserInfoMapper extends BaseMapper<UserInfo> {
9
-    void initUserIdSeq();
10
-
11
-    void initSuperAdminRole();
12
-
13
-}

+ 134 - 0
src/main/java/com/lqkj/cmlcp/module/authority/repository/RoleInfoRepository.java

@@ -0,0 +1,134 @@
1
+package com.lqkj.cmlcp.module.authority.repository;
2
+
3
+import com.lqkj.cmlcp.module.authority.domain.RoleInfo;
4
+import org.springframework.data.domain.Page;
5
+import org.springframework.data.domain.Pageable;
6
+import org.springframework.data.jpa.repository.JpaRepository;
7
+import org.springframework.data.jpa.repository.Modifying;
8
+import org.springframework.data.jpa.repository.Query;
9
+import org.springframework.data.repository.query.Param;
10
+import org.springframework.stereotype.Repository;
11
+
12
+import java.util.List;
13
+import java.util.Map;
14
+
15
+@Repository
16
+public interface RoleInfoRepository extends JpaRepository<RoleInfo, Integer> {
17
+
18
+    @Query(nativeQuery = true,
19
+        value = "select ri.* from role_info ri, user_role ur where ur.user_id = :userId and ur.role_id = ri.role_id order by ri.role_id"
20
+    )
21
+    List<RoleInfo> listWithUserId(@Param("userId") Integer userId);
22
+
23
+    @Query(nativeQuery = true,
24
+        value = "select string_agg(ri.role_name, ',') from user_role ur, role_info ri where ur.role_id = ri.role_id and ur.user_id = :userId"
25
+    )
26
+    String findRoleNames(@Param("userId") Integer userId);
27
+
28
+    @Modifying
29
+    @Query(nativeQuery = true,
30
+        value = "with t1 as(delete from user_role where user_id = :userId and role_id not in :roleIds)" +
31
+                "insert into user_role(role_id, user_id) " +
32
+                "select role_id, :userId from role_info where role_id in :roleIds " +
33
+                "on conflict (role_id, user_id) do nothing "
34
+    )
35
+    void updateUserRole(@Param("userId") Integer userId,
36
+                        @Param("roleIds") List<Integer> roleIds);
37
+
38
+    @Query(nativeQuery = true,
39
+            value = "with t1 as(select * from role_info where role_name like concat('%', :roleName, '%')), " +
40
+                    "t2 as(select ra.role_id, string_agg(distinct(authority_name), ',') as auths from role_authority ra, authority_info ai " +
41
+                        "where ra.authority_id = ai.authority_id " +
42
+                            "and ra.role_id in (select role_id from t1) " +
43
+                        "group by ra.role_id) " +
44
+                    "select t1.role_id as \"roleId\", t1.role_name as \"roleName\", t2.auths, " +
45
+                        "to_char(t1.update_time, 'yyyy-mm-dd hh24:mi:ss') as \"updateTime\" " +
46
+                    "from t1, t2 where t1.role_id = t2.role_id " +
47
+                    "order by t1.role_id")
48
+    Page<Map<String, Object>> pageQuery(@Param("roleName") String roleName,
49
+                                        Pageable pageable);
50
+
51
+    @Query(nativeQuery = true,
52
+            value = "select * from role_info where role_name like concat('%', :roleName, '%') and role_id != 1 order by role_id")
53
+    Page<RoleInfo> pageQueryV2(@Param("roleName") String roleName,
54
+                                        Pageable pageable);
55
+
56
+    @Query(nativeQuery = true,
57
+        value = "select * from role_info where role_id != 1 order by role_id"
58
+    )
59
+    List<RoleInfo> queryAll();
60
+
61
+    @Query(nativeQuery = true,
62
+        value = "select string_agg(distinct (authority_name), ',') " +
63
+                "from role_authority ra , authority_info ai " +
64
+                "where ra.role_id = :roleId and ra.authority_id = ai.authority_id"
65
+    )
66
+    String queryAuthNamesWithRole(@Param("roleId") Integer roleId);
67
+
68
+    @Query(nativeQuery = true,
69
+        value = "select ai.authority_id from authority_info ai, role_authority ra " +
70
+                "where ra.role_id = :roleId and ai.authority_id = ra.authority_id " +
71
+                "order by ai.authority_id"
72
+    )
73
+    List<Map<String, Object>> queryAuthsWithRole(@Param("roleId") Integer roleId);
74
+
75
+    @Query(nativeQuery = true,
76
+        value = "select count(*) > 0 from role_info where en_name = :enName"
77
+    )
78
+    Boolean hasSameEnName(@Param("enName") String enName);
79
+
80
+    @Query(nativeQuery = true,
81
+            value = "select count(*) > 0 from role_info where role_name = :roleName"
82
+    )
83
+    Boolean hasSameName(@Param("roleName") String roleName);
84
+
85
+    @Query(nativeQuery = true,
86
+            value = "select count(*) > 0 from role_info where en_name = :enName and role_id != :roleId"
87
+    )
88
+    Boolean hasSameEnNameWithoutOneId(@Param("enName") String enName,
89
+                                      @Param("roleId") Integer roleId);
90
+
91
+    @Query(nativeQuery = true,
92
+            value = "select count(*) > 0 from role_info where role_name = :roleName and role_id != :roleId"
93
+    )
94
+    Boolean hasSameNameWithoutOneId(@Param("roleName") String roleName,
95
+                                    @Param("roleId") Integer roleId);
96
+
97
+    @Modifying
98
+    @Query(nativeQuery = true,
99
+        value = "with t1 as (delete from role_authority where role_id = :roleId and authority_id not in :authorityIds)" +
100
+                "insert into role_authority(role_id, authority_id) " +
101
+                "select :roleId, authority_id from authority_info where authority_id in :authorityIds " +
102
+                "on conflict (role_id, authority_id) do nothing "
103
+    )
104
+    void updateRoleAuthority(@Param("roleId") Integer roleId,
105
+                             @Param("authorityIds") List<Integer> authorityIds);
106
+
107
+    @Query(nativeQuery = true,
108
+        value = "select ai.authority_id, ai.parent_id, ai.authority_name " +
109
+                "from authority_info ai, role_authority ra , user_role ur , user_info ui " +
110
+                "where ai.authority_id = ra.authority_id " +
111
+                    "and ra.role_id = ur.role_id " +
112
+                    "and ur.user_id = ui.user_id " +
113
+                    "and ui.user_code = :userCode " +
114
+                "order by ai.parent_id, ai.authority_id"
115
+    )
116
+    List<Map<String, Object>> queryAuthsByUser(String userCode);
117
+
118
+
119
+    @Modifying
120
+    @Query(nativeQuery = true,
121
+        value = "delete from role_info where role_id in :roleIds"
122
+    )
123
+    void deleteNoUserRole(List<Integer> roleIds);
124
+
125
+    @Query(nativeQuery = true,
126
+        value = "select distinct (role_id) from user_role where role_id in :roleIds"
127
+    )
128
+    List<Integer> findHasUserRole(@Param("roleIds") List<Integer> roleIds);
129
+
130
+    @Query(nativeQuery = true,
131
+        value = "select string_agg(role_name, ',') from role_info where role_id in :hasUserRoleIds"
132
+    )
133
+    String findHasUserRoleNames(@Param("hasUserRoleIds") List<Integer> hasUserRoleIds);
134
+}

+ 91 - 0
src/main/java/com/lqkj/cmlcp/module/authority/repository/UserInfoRepository.java

@@ -0,0 +1,91 @@
1
+package com.lqkj.cmlcp.module.authority.repository;
2
+
3
+import com.lqkj.cmlcp.module.authority.domain.UserInfo;
4
+import org.springframework.data.domain.Page;
5
+import org.springframework.data.domain.Pageable;
6
+import org.springframework.data.jpa.repository.JpaRepository;
7
+import org.springframework.data.jpa.repository.Modifying;
8
+import org.springframework.data.jpa.repository.Query;
9
+import org.springframework.data.repository.query.Param;
10
+import org.springframework.stereotype.Repository;
11
+import org.springframework.transaction.annotation.Transactional;
12
+
13
+import java.util.List;
14
+import java.util.Map;
15
+
16
+@Repository
17
+public interface UserInfoRepository extends JpaRepository<UserInfo, Integer> {
18
+
19
+    @Query(nativeQuery = true,
20
+            value = "select * from user_info t where user_code = :userCode")
21
+    UserInfo findByUserCode(@Param("userCode") String userCode);
22
+
23
+    @Modifying
24
+    @Query(nativeQuery = true,
25
+            value = "update user_info set login_error_count = 0, locking = false, lock_time = null where id = :userId")
26
+    void cleanLockStatus(@Param("userId") Integer userId);
27
+
28
+    @Transactional
29
+    @Modifying
30
+    @Query(nativeQuery = true,
31
+            value = "INSERT INTO user_info (id, user_code, display_name, password, authorization_code, head_img, " +
32
+                    "file_save_path, has_auth, login_error_count, locking, lock_time, update_time, has_manage) " +
33
+                    "VALUES (1, 'admin', '超级管理员', '$2a$10$OIBK8kKBDY07OS4CcVdx9e2GdxKH4T2lqWfDXgubjwZbxbis5.vSu', '87449007', " +
34
+                    "NULL, NULL, 't', 0, 'f', NULL, now(), 't');"
35
+    )
36
+    void initSuperAdmin();
37
+
38
+    @Transactional
39
+    @Modifying
40
+    @Query(nativeQuery = true,
41
+            value = "ALTER SEQUENCE user_info_id_seq RESTART WITH 3"
42
+    )
43
+    void initUserIdSeq();
44
+
45
+    @Transactional
46
+    @Modifying
47
+    @Query(nativeQuery = true,
48
+            value = "insert into user_role values (1, 1)"
49
+    )
50
+    void initSuperAdminRole();
51
+
52
+    @Query(nativeQuery = true,
53
+            value = "select role_id from user_role where user_id = :userId")
54
+    List<Integer> findUserRole(@Param("userId") Integer userId);
55
+
56
+
57
+    @Query(nativeQuery = true,
58
+            value = "select count(*) = 1 " +
59
+                    "from user_info natural join user_role natural join role_authority " +
60
+                    "where user_id = :userId and authority_id = 6 "
61
+    )
62
+    Boolean hasAuth(Integer userId);
63
+
64
+
65
+    @Query(nativeQuery = true,
66
+            value = "select ai.authority_id, en_name as \"name\", route as \"path\", component, redirect, authority_name as title, icon, parent_id " +
67
+                    "from authority_info ai, role_authority ra, user_role ur, user_info ui " +
68
+                    "where ui.user_code = :userCode " +
69
+                    "and ur.user_id = ui.id " +
70
+                    "and ur.role_id = ra.role_id " +
71
+                    "and ra.authority_id = ai.authority_id " +
72
+                    "order by ai.parent_id, ai.order_id"
73
+    )
74
+    List<Map<String, Object>> queryAuthWithUserCode(String userCode);
75
+
76
+    @Query(nativeQuery = true,
77
+            value = "select * from user_info " +
78
+                    "where id != 1 " +
79
+                    "and (:userCode = '' or user_code like concat('%', :userCode, '%')) " +
80
+                    "and (:displayName = '' or display_name like concat('%', :displayName, '%')) " +
81
+                    "order by update_time desc"
82
+    )
83
+    Page<UserInfo> pageQueryV2(@Param("userCode") String userCode,
84
+                               @Param("displayName") String displayName,
85
+                               Pageable pageable);
86
+
87
+    @Query(nativeQuery = true,
88
+            value = "select count(*) > 0 from user_info where user_code = :userCode"
89
+    )
90
+    Boolean hasSameUserCode(@Param("userCode") String userCode);
91
+}

+ 56 - 0
src/main/java/com/lqkj/cmlcp/module/authority/service/RoleInfoService.java

@@ -0,0 +1,56 @@
1
+package com.lqkj.cmlcp.module.authority.service;
2
+
3
+import com.lqkj.cmlcp.module.authority.domain.RoleInfo;
4
+import org.springframework.data.domain.Page;
5
+
6
+import java.util.List;
7
+import java.util.Map;
8
+
9
+public interface RoleInfoService {
10
+
11
+    /**
12
+     * 获取所有角色
13
+     * @return
14
+     */
15
+    List<RoleInfo> allRoles();
16
+
17
+
18
+    /**
19
+     * 获取角色分页
20
+     * @param roleName
21
+     * @param page
22
+     * @param pageSize
23
+     * @return
24
+     */
25
+    Page<RoleInfo> pageQuery(String roleName, Integer page, Integer pageSize);
26
+
27
+    /**
28
+     * 获取角色详情接口
29
+     * @param roleId
30
+     * @return
31
+     */
32
+    RoleInfo detail(Integer roleId);
33
+
34
+
35
+    /**
36
+     * 角色保存接口
37
+     * @param roleInfo
38
+     * @return
39
+     */
40
+    String save(RoleInfo roleInfo);
41
+
42
+
43
+    /**
44
+     * 获取权限树
45
+     * @param userCode
46
+     * @return
47
+     */
48
+    List<Map<String, Object>> queryAuthTree(String userCode);
49
+
50
+    /**
51
+     * 删除角色
52
+     * @param roleIds
53
+     * @return
54
+     */
55
+    String delete(List<Integer> roleIds);
56
+}

+ 64 - 2
src/main/java/com/lqkj/cmlcp/module/authority/service/UserInfoService.java

@@ -1,16 +1,78 @@
1 1
 package com.lqkj.cmlcp.module.authority.service;
2 2
 
3 3
 import com.lqkj.cmlcp.module.authority.domain.UserInfo;
4
-import com.mybatisflex.core.service.IService;
4
+import org.springframework.data.domain.Page;
5 5
 
6
-public interface UserInfoService extends IService<UserInfo> {
6
+import java.util.List;
7
+import java.util.Map;
8
+
9
+public interface UserInfoService{
10
+
11
+    /**
12
+     * 根据账号查询用户信息
13
+     * @param userCode
14
+     * @return
15
+     */
7 16
     UserInfo findByUserCode(String userCode);
8 17
 
18
+    /**
19
+     * 账号是否锁定
20
+     * @param userCode
21
+     * @return
22
+     */
9 23
     boolean isLocked(String userCode);
10 24
 
25
+    /**
26
+     * 更新登录错误次数/锁定用户
27
+     * @param userCode
28
+     * @return
29
+     */
11 30
     String lockedUser(String userCode);
12 31
 
32
+    /**
33
+     * 解锁用户
34
+     * @param userCode
35
+     */
13 36
     void unlockedUser(String userCode);
14 37
 
38
+    /**
39
+     * 根据账号查询用户信息
40
+     * @param username
41
+     * @return
42
+     */
15 43
     UserInfo selectByUserName(String username);
44
+
45
+    List<Integer> findUserRole(Integer userId);
46
+
47
+    /**
48
+     * 根据账号查询用户信息
49
+     * @param username
50
+     * @return
51
+     */
52
+    UserInfo detailByUserCode(String username);
53
+
54
+    /**
55
+     * 获取管理菜单接口
56
+     * @param username
57
+     * @return
58
+     */
59
+    List<Map<String, Object>> findAuthListWithUserCode(String username);
60
+
61
+    /**
62
+     * 用户分页接口
63
+     * @param userCode
64
+     * @param displayName
65
+     * @param page
66
+     * @param pageSize
67
+     * @return
68
+     */
69
+    Page<UserInfo> pageQuery(String userCode, String displayName, Integer page, Integer pageSize);
70
+
71
+    UserInfo detail(Integer userId);
72
+
73
+    String save(UserInfo userInfo);
74
+
75
+    void delete(List<Integer> userIds);
76
+
77
+    void updateInfo(String userCode, String displayName, String headImgPath);
16 78
 }

+ 7 - 6
src/main/java/com/lqkj/cmlcp/module/authority/service/impl/DatabaseUserDetailService.java

@@ -2,6 +2,7 @@ package com.lqkj.cmlcp.module.authority.service.impl;
2 2
 
3 3
 import com.lqkj.cmlcp.module.authority.domain.UserInfo;
4 4
 import com.lqkj.cmlcp.module.authority.service.UserInfoService;
5
+import com.lqkj.cmlcp.utils.RSAUtils;
5 6
 import org.springframework.beans.factory.annotation.Autowired;
6 7
 import org.springframework.security.core.userdetails.UserDetails;
7 8
 import org.springframework.security.core.userdetails.UserDetailsService;
@@ -17,12 +18,12 @@ public class DatabaseUserDetailService implements UserDetailsService {
17 18
 
18 19
     @Override
19 20
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
20
-//        if (username.length() != 172) throw new UsernameNotFoundException("用户名错误!");
21
-//        try {
22
-//            username = RSAUtils.decryptBase64(username);
23
-//        } catch (Exception e) {
24
-//            throw new UsernameNotFoundException("用户名错误!");
25
-//        }
21
+        if (username.length() != 172) throw new UsernameNotFoundException("用户名错误!");
22
+        try {
23
+            username = RSAUtils.decryptBase64(username);
24
+        } catch (Exception e) {
25
+            throw new UsernameNotFoundException("用户名错误!");
26
+        }
26 27
         UserInfo userInfo = userInfoService.selectByUserName(username);
27 28
         if (userInfo == null) {
28 29
             throw new UsernameNotFoundException("用户名不存在!");

+ 108 - 0
src/main/java/com/lqkj/cmlcp/module/authority/service/impl/RoleInfoServiceImpl.java

@@ -0,0 +1,108 @@
1
+package com.lqkj.cmlcp.module.authority.service.impl;
2
+
3
+import com.lqkj.cmlcp.module.authority.domain.RoleInfo;
4
+import com.lqkj.cmlcp.module.authority.repository.RoleInfoRepository;
5
+import com.lqkj.cmlcp.module.authority.service.RoleInfoService;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.data.domain.Page;
8
+import org.springframework.data.domain.PageRequest;
9
+import org.springframework.data.domain.Pageable;
10
+import org.springframework.stereotype.Service;
11
+import org.springframework.transaction.annotation.Propagation;
12
+import org.springframework.transaction.annotation.Transactional;
13
+
14
+import java.util.*;
15
+
16
+@Service
17
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
18
+public class RoleInfoServiceImpl implements RoleInfoService {
19
+
20
+    @Autowired
21
+    private RoleInfoRepository roleInfoRepository;
22
+
23
+    public List<RoleInfo> allRoles() {
24
+        return roleInfoRepository.queryAll();
25
+    }
26
+
27
+    public Page<RoleInfo> pageQuery(String roleName, Integer page, Integer pageSize) {
28
+        Pageable pageable = PageRequest.of(page, pageSize);
29
+        Page<RoleInfo> roleInfoPage = roleInfoRepository.pageQueryV2(roleName, pageable);
30
+        for (RoleInfo role : roleInfoPage) {
31
+            role.setAuths(roleInfoRepository.queryAuthNamesWithRole(role.getRoleId()));
32
+        }
33
+        return roleInfoPage;
34
+    }
35
+
36
+    public RoleInfo detail(Integer roleId) {
37
+        RoleInfo roleInfo = roleInfoRepository.findById(roleId).get();
38
+        List<Integer> auths = roleInfoRepository
39
+                .queryAuthsWithRole(roleId)
40
+                .stream()
41
+                .map(v -> (Integer) v.get("authority_id"))
42
+                .toList();
43
+        roleInfo.setAuthorityList(auths);
44
+        return roleInfo;
45
+    }
46
+
47
+    @Transactional
48
+    public String save(RoleInfo roleInfo) {
49
+        List<Integer> authorityIds = roleInfo.getAuthorityList();
50
+        if (roleInfo.getRoleId() == null) {
51
+            if (roleInfoRepository.hasSameEnName(roleInfo.getEnName())) {
52
+                return "英文名重复!";
53
+            }
54
+            if (roleInfoRepository.hasSameName(roleInfo.getRoleName())) {
55
+                return "角色名称重复!";
56
+            }
57
+            roleInfo.setUpdateTime(new Date());
58
+            roleInfo = roleInfoRepository.save(roleInfo);
59
+        } else {
60
+            if (roleInfoRepository.hasSameEnNameWithoutOneId(roleInfo.getEnName(), roleInfo.getRoleId())) {
61
+                return "英文名重复!";
62
+            }
63
+            if (roleInfoRepository.hasSameNameWithoutOneId(roleInfo.getRoleName(), roleInfo.getRoleId())) {
64
+                return "角色名称重复!";
65
+            }
66
+            RoleInfo oldRole = roleInfoRepository.findById(roleInfo.getRoleId()).get();
67
+            oldRole.setRoleName(roleInfo.getRoleName());
68
+            oldRole.setEnName(roleInfo.getEnName());
69
+            oldRole.setUpdateTime(new Date());
70
+            roleInfoRepository.save(oldRole);
71
+        }
72
+
73
+        roleInfoRepository.updateRoleAuthority(roleInfo.getRoleId(), authorityIds);
74
+        return null;
75
+    }
76
+
77
+    public List<Map<String, Object>> queryAuthTree(String userCode) {
78
+        List<Map<String, Object>> resultList = new ArrayList<>();
79
+        Map<Integer, List<Map<String, Object>>> childrenMap = new HashMap<>();
80
+
81
+        List<Map<String, Object>> authList = roleInfoRepository.queryAuthsByUser(userCode);
82
+        for (Map<String, Object> auth : authList) {
83
+            Map<String, Object> result = new HashMap<>();
84
+            result.put("id", auth.get("authority_id"));
85
+            result.put("name", auth.get("authority_name"));
86
+
87
+            Integer parentId = (Integer) auth.get("parent_id");
88
+            if (parentId == null) {
89
+                result.put("children", childrenMap.get((Integer) auth.get("authority_id")));
90
+                resultList.add(result);
91
+            } else {
92
+                List<Map<String, Object>> children = childrenMap.getOrDefault(parentId, new ArrayList<>());
93
+                children.add(result);
94
+                childrenMap.put(parentId, children);
95
+            }
96
+        }
97
+
98
+        return resultList;
99
+    }
100
+
101
+    @Transactional
102
+    public String delete(List<Integer> roleIds) {
103
+        List<Integer> hasUserRoleIds = roleInfoRepository.findHasUserRole(roleIds);
104
+        roleIds.removeAll(hasUserRoleIds);
105
+        roleInfoRepository.deleteNoUserRole(roleIds);
106
+        return roleInfoRepository.findHasUserRoleNames(hasUserRoleIds);
107
+    }
108
+}

+ 172 - 57
src/main/java/com/lqkj/cmlcp/module/authority/service/impl/UserInfoServiceImpl.java

@@ -1,29 +1,44 @@
1 1
 package com.lqkj.cmlcp.module.authority.service.impl;
2 2
 
3 3
 import com.lqkj.cmlcp.module.authority.domain.UserInfo;
4
-import com.lqkj.cmlcp.module.authority.mapper.UserInfoMapper;
4
+import com.lqkj.cmlcp.module.authority.repository.RoleInfoRepository;
5
+import com.lqkj.cmlcp.module.authority.repository.UserInfoRepository;
5 6
 import com.lqkj.cmlcp.module.authority.service.UserInfoService;
6
-import com.mybatisflex.core.query.QueryWrapper;
7
-import com.mybatisflex.core.update.UpdateChain;
8
-import com.mybatisflex.spring.service.impl.ServiceImpl;
9 7
 import jakarta.annotation.PostConstruct;
8
+import org.apache.commons.lang3.StringUtils;
10 9
 import org.springframework.beans.factory.annotation.Autowired;
11
-import org.springframework.stereotype.Component;
10
+import org.springframework.context.annotation.Lazy;
11
+import org.springframework.data.domain.Page;
12
+import org.springframework.data.domain.PageRequest;
13
+import org.springframework.data.domain.Pageable;
14
+import org.springframework.security.crypto.password.PasswordEncoder;
15
+import org.springframework.stereotype.Service;
16
+import org.springframework.transaction.annotation.Propagation;
12 17
 import org.springframework.transaction.annotation.Transactional;
13 18
 
14
-import java.util.Date;
15
-import java.util.Objects;
19
+import java.util.*;
20
+import java.util.regex.Matcher;
21
+import java.util.regex.Pattern;
16 22
 
17
-@Component
18
-public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService{
23
+@Service
24
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
25
+public class UserInfoServiceImpl implements UserInfoService{
26
+
27
+
28
+    @Autowired
29
+    private RoleInfoRepository roleInfoRepository;
19 30
 
20 31
     @Autowired
21
-    private UserInfoMapper userInfoMapper;
32
+    private UserInfoRepository userInfoRepository;
22 33
 
34
+    @Lazy
35
+    @Autowired
36
+    private PasswordEncoder passwordEncoder;
23 37
 
24 38
     @Override
25 39
     public UserInfo findByUserCode(String userCode) {
26
-        return userInfoMapper.selectOneByQuery(new QueryWrapper().eq("user_code",userCode));
40
+
41
+        return userInfoRepository.findByUserCode(userCode);
27 42
     }
28 43
 
29 44
         /**
@@ -39,12 +54,7 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> i
39 54
         }else {
40 55
             if (userInfo.getLocking()) {
41 56
                 if (new Date().getTime() - userInfo.getLockTime().getTime() > 1000 * 60 * 60){
42
-                    UpdateChain.of(UserInfo.class)
43
-                            .set(UserInfo::getLocking, false)
44
-                            .set(UserInfo::getLockTime, null)
45
-                            .set(UserInfo::getLoginErrorCount, 0)
46
-                            .where(UserInfo::getId).eq(userInfo.getId())
47
-                            .update();
57
+                    userInfoRepository.cleanLockStatus(userInfo.getId());
48 58
                     return false;
49 59
                 }else{
50 60
                     return true;
@@ -72,10 +82,10 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> i
72 82
             if (loginErrorCount == 4){
73 83
                 userInfo.setLocking(true);
74 84
                 userInfo.setLockTime(new Date());
75
-                userInfoMapper.update(userInfo);
85
+                userInfoRepository.save(userInfo);
76 86
                 return "账号已被冻结,请稍后重试";
77 87
             }
78
-            userInfoMapper.update(userInfo);
88
+            userInfoRepository.save(userInfo);
79 89
             return "账号、密码或授权码输入错误," + (4 - loginErrorCount) +"次错误后,账号将会冻结1小时";
80 90
         }
81 91
     }
@@ -87,63 +97,168 @@ public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> i
87 97
     @Transactional
88 98
     public void unlockedUser(String userCode){
89 99
         UserInfo userInfo = findByUserCode(userCode);
90
-        UpdateChain.of(UserInfo.class)
91
-                .set(UserInfo::getLocking, false)
92
-                .set(UserInfo::getLockTime, null)
93
-                .set(UserInfo::getLoginErrorCount, 0)
94
-                .where(UserInfo::getId).eq(userInfo.getId())
95
-                .update();
100
+        userInfoRepository.cleanLockStatus(userInfo.getId());
96 101
     }
97 102
 
98 103
     @Override
99 104
     public UserInfo selectByUserName(String username) {
100
-        return userInfoMapper.selectOneByQuery(new QueryWrapper().eq("user_name",username));
105
+        return findByUserCode(username);
101 106
     }
102 107
 
108
+    @Override
109
+    public List<Integer> findUserRole(Integer userId) {
103 110
 
104
-    @PostConstruct
105
-    @Transactional
106
-    public void initSuperUser() {
107
-        if (Objects.isNull(userInfoMapper.selectOneById(1))){
108
-            initSuperAdmin();
109
-            initUserIdSeq();
110
-            initSuperAdminRole();
111
-        }
111
+        return userInfoRepository.findUserRole(userId);
112 112
     }
113 113
 
114
-    private void initSuperAdmin() {
115
-        UserInfo userInfo = new UserInfo()
116
-                .setId(1)
117
-                .setUserCode("admin")
118
-                .setDisplayName("超级管理员")
119
-                .setPassword("$2a$10$OIBK8kKBDY07OS4CcVdx9e2GdxKH4T2lqWfDXgubjwZbxbis5.vSu")
120
-                .setAuthorizationCode("87449007")
121
-                .setHeadImg("")
122
-                .setFileSavePath("")
123
-                .setHasManage(true)
124
-                .setHasAuth(true)
125
-                .setLocking(false)
126
-                .setLockTime(null)
127
-                .setLoginErrorCount(0)
128
-                .setUpdateTime(new Date())
129
-                .setEnabled(true);
130
-        userInfoMapper.insert(userInfo);
131
-
114
+    @Override
115
+    public UserInfo detailByUserCode(String userCode) {
116
+        UserInfo userInfo = userInfoRepository.findByUserCode(userCode);
117
+        userInfo.setHasAuth(userInfoRepository.hasAuth(userInfo.getId()));
118
+        return userInfo;
132 119
     }
133 120
 
134
-    private void initUserIdSeq() {
135
-        userInfoMapper.initUserIdSeq();
121
+    @Override
122
+    public List<Map<String, Object>> findAuthListWithUserCode(String userCode) {
123
+        List<Map<String, Object>> resultList = new ArrayList<>();
124
+        UserInfo userInfo = userInfoRepository.findByUserCode(userCode);
125
+        if (userInfo.getHasManage()) {
126
+            List<Map<String, Object>> authList = userInfoRepository.queryAuthWithUserCode(userCode);
127
+
128
+            Map<Integer, List<Map<String, Object>>> childrenMap = new HashMap<>();
129
+            for (Map<String, Object> auth : authList) {
130
+                Map<String, Object> result = new HashMap<>(auth);
131
+                Map<String, Object> metaObject = new HashMap<>();
132
+                metaObject.put("icon", auth.get("icon"));
133
+                metaObject.put("title", auth.get("title"));
134
+                result.put("meta", metaObject);
135
+
136
+                if (auth.get("parent_id") == null) {
137
+                    result.put("children", childrenMap.get(auth.get("authority_id")));
138
+                    resultList.add(result);
139
+                } else {
140
+                    List<Map<String, Object>> childrenList = childrenMap.getOrDefault(auth.get("parent_id"), new ArrayList<>());
141
+                    childrenList.add(result);
142
+                    childrenMap.put((Integer) auth.get("parent_id"), childrenList);
143
+                }
144
+            }
145
+        }
146
+
147
+        return resultList;
136 148
     }
137 149
 
138
-    private void initSuperAdminRole() {
150
+    @Override
151
+    public Page<UserInfo> pageQuery(String userCode, String displayName, Integer page, Integer pageSize) {
152
+        Pageable pageable = PageRequest.of(page, pageSize);
153
+        Page<UserInfo> userInfos = userInfoRepository.pageQueryV2(userCode, displayName, pageable);
154
+        for (UserInfo userInfo : userInfos.getContent()) {
155
+            userInfo.setRoleNames(roleInfoRepository.findRoleNames(userInfo.getId()));
156
+        }
157
+        return userInfos;
158
+    }
139 159
 
140
-        userInfoMapper.initSuperAdminRole();
160
+    @Override
161
+    public UserInfo detail(Integer userId) {
162
+        UserInfo userInfo = userInfoRepository.findById(userId).get();
163
+        userInfo.setRoleInfoList(roleInfoRepository.listWithUserId(userId));
164
+        return userInfo;
141 165
     }
142 166
 
143
-    private void test(){
167
+    @Transactional
168
+    @Override
169
+    public String save(UserInfo userInfo) {
144 170
 
171
+        // 账号判断,8位数字
172
+        String userCodeRegex = "\\d{8}";
173
+        Pattern pattern = Pattern.compile(userCodeRegex);
174
+        Matcher matcher = pattern.matcher(userInfo.getUserCode());
175
+        if (!matcher.find()) {
176
+            return "账号必须是8位数字!";
177
+        }
178
+        // 显示名称判断,2-8位中文字符
179
+        String displayNameRegex = "[\u4E00-\u9FA5]{2,8}";
180
+        pattern = Pattern.compile(displayNameRegex);
181
+        matcher = pattern.matcher(userInfo.getDisplayName());
182
+        if (!matcher.find()) {
183
+            return "名称必须是2-8位中文字符!";
184
+        }
145 185
 
186
+        // 授权码判断,8位数字、大写字母、小写字母
187
+        String auCodeRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8}$";
188
+        pattern = Pattern.compile(auCodeRegex);
189
+        matcher = pattern.matcher(userInfo.getAuthorizationCode());
190
+        if (!matcher.find()) {
191
+            return "授权码必须是8位数字、大写字母、小写字母!";
192
+        }
146 193
 
194
+        if (userInfo.getId() == null) {
195
+            // 重复判断
196
+            if (userInfoRepository.hasSameUserCode(userInfo.getUserCode())) {
197
+                return "账号与已有账号重复,请设置其他账号!";
198
+            }
199
+            // 密码判断,8-16位数字、大写字母、小写字母
200
+            String passwordRegex = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,16}$";
201
+            pattern = Pattern.compile(passwordRegex);
202
+            matcher = pattern.matcher(userInfo.getPassword());
203
+            if (!matcher.find()) {
204
+                return "密码必须是8-16位数字、大写字母、小写字母!";
205
+            }
206
+
207
+            userInfo.setLocking(false);
208
+            userInfo.setPassword(passwordEncoder.encode(userInfo.getPassword()));
209
+            userInfo.setUpdateTime(new Date());
210
+            userInfo = userInfoRepository.save(userInfo);
211
+        } else {
212
+            if (StringUtils.isNotBlank(userInfo.getPassword())) {
213
+                // 密码判断,8-16位数字、大写字母、小写字母
214
+                String passwordRegex = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,16}$";
215
+                pattern = Pattern.compile(passwordRegex);
216
+                matcher = pattern.matcher(userInfo.getPassword());
217
+                if (!matcher.find()) {
218
+                    return "密码必须是8-16位数字、大写字母、小写字母!";
219
+                }
220
+            }
221
+            UserInfo oldUser = userInfoRepository.findById(userInfo.getId()).get();
222
+            if (StringUtils.isNotBlank(userInfo.getPassword())) {
223
+                oldUser.setPassword(passwordEncoder.encode(userInfo.getPassword()));
224
+            }
225
+            oldUser.setDisplayName(userInfo.getDisplayName());
226
+            oldUser.setHasManage(userInfo.getHasManage());
227
+            oldUser.setAuthorizationCode(userInfo.getAuthorizationCode());
228
+            oldUser.setUpdateTime(new Date());
229
+            userInfoRepository.save(oldUser);
230
+        }
231
+        roleInfoRepository.updateUserRole(userInfo.getId(), userInfo.getRoleIds());
232
+        return null;
233
+    }
234
+
235
+    @Override
236
+    public void delete(List<Integer> userIds) {
237
+        userInfoRepository.deleteAllByIdInBatch(userIds);
147 238
     }
148 239
 
240
+    @Override
241
+    public void updateInfo(String userCode, String displayName, String headImgPath) {
242
+        UserInfo userInfo = userInfoRepository.findByUserCode(userCode);
243
+        if (StringUtils.isNotBlank(displayName)) {
244
+            userInfo.setDisplayName(displayName);
245
+        }
246
+        if ((StringUtils.isNotBlank(headImgPath))) {
247
+            userInfo.setHeadImg(headImgPath);
248
+        }
249
+        userInfoRepository.save(userInfo);
250
+    }
251
+
252
+    @PostConstruct
253
+    @Transactional
254
+    public void initSuperUser() {
255
+        if (!userInfoRepository.existsById(1)) {
256
+            userInfoRepository.initSuperAdmin();
257
+            userInfoRepository.initUserIdSeq();
258
+            userInfoRepository.initSuperAdminRole();
259
+        }
260
+    }
261
+
262
+
263
+
149 264
 }

+ 12 - 1
src/main/java/com/lqkj/cmlcp/module/base/controller/BaseController.java

@@ -25,8 +25,19 @@ public class BaseController {
25 25
                     @Parameter(name = "file", description = "空间信息json文件上传接口", required = true)
26 26
             }
27 27
     )
28
-    @PostMapping({"/addJsonFile"})
28
+    @PostMapping({"/uploadJsonFile"})
29 29
     public Result<String> addJsonFile(MultipartFile file) {
30 30
         return Result.ok(baseService.uploadJsonFile(file, "base/json/"));
31 31
     }
32
+
33
+
34
+    /**
35
+     * 上传图片
36
+     * @param file
37
+     * @return
38
+     */
39
+    @PostMapping("/uploadImg")
40
+    public Result<String> uploadImg(MultipartFile file) {
41
+        return Result.ok(baseService.uploadImg(file, "base/img/"));
42
+    }
32 43
 }

+ 8 - 0
src/main/java/com/lqkj/cmlcp/module/base/service/BaseService.java

@@ -6,4 +6,12 @@ public interface BaseService {
6 6
 
7 7
 
8 8
     String uploadJsonFile(MultipartFile file, String s);
9
+
10
+    /**
11
+     * 上传图片
12
+     * @param file
13
+     * @param s
14
+     * @return
15
+     */
16
+    String uploadImg(MultipartFile file, String s);
9 17
 }

+ 12 - 1
src/main/java/com/lqkj/cmlcp/module/base/service/impl/BaseServiceImpl.java

@@ -1,6 +1,5 @@
1 1
 package com.lqkj.cmlcp.module.base.service.impl;
2 2
 
3
-import com.lqkj.cmlcp.message.Result;
4 3
 import com.lqkj.cmlcp.module.base.service.BaseService;
5 4
 import com.lqkj.cmlcp.utils.FileUtils;
6 5
 import org.springframework.stereotype.Service;
@@ -20,4 +19,16 @@ public class BaseServiceImpl implements BaseService {
20 19
         FileUtils.saveFile(file, filePath, newFileName);
21 20
         return filePath.substring(1) + newFileName;
22 21
     }
22
+
23
+    @Override
24
+    public String uploadImg(MultipartFile file, String path) {
25
+        String fileName = file.getOriginalFilename();
26
+        String suffix = fileName == null ? "" : fileName.substring(fileName.lastIndexOf(".") + 1);
27
+        if (!suffix.equals("png") && !suffix.equals("jpg"))
28
+            throw new RuntimeException("上传文件类型必须是png、jpg图片文件");
29
+        String newFileName = UUID.randomUUID() + "." + suffix;
30
+        String filePath = "./upload/" + path;
31
+        FileUtils.saveFile(file, filePath, newFileName);
32
+        return filePath.substring(1) + newFileName;
33
+    }
23 34
 }

+ 31 - 0
src/main/java/com/lqkj/cmlcp/module/config/controller/ConfigInfoController.java

@@ -0,0 +1,31 @@
1
+package com.lqkj.cmlcp.module.config.controller;
2
+
3
+import com.lqkj.cmlcp.message.Result;
4
+import com.lqkj.cmlcp.module.config.domain.ConfigInfo;
5
+import com.lqkj.cmlcp.module.config.service.ConfigInfoService;
6
+import org.springframework.web.bind.annotation.*;
7
+import io.swagger.v3.oas.annotations.tags.Tag;
8
+import org.springframework.beans.factory.annotation.Autowired;
9
+
10
+
11
+@RestController
12
+@Tag(name = "地图配置接口", description = "地图配置接口")
13
+@RequestMapping("/config")
14
+public class ConfigInfoController {
15
+
16
+    @Autowired
17
+    private ConfigInfoService configInfoService;
18
+
19
+
20
+    @PostMapping("/saveConfig")
21
+    public Result saveConfig(@RequestBody ConfigInfo configInfo) {
22
+        configInfoService.saveAll(configInfo);
23
+        return Result.ok();
24
+    }
25
+
26
+    @GetMapping("/getConfig")
27
+    public Result getConfig() {
28
+        return Result.ok(configInfoService.findAll());
29
+    }
30
+
31
+}

+ 48 - 0
src/main/java/com/lqkj/cmlcp/module/config/domain/ConfigInfo.java

@@ -0,0 +1,48 @@
1
+package com.lqkj.cmlcp.module.config.domain;
2
+
3
+import io.swagger.v3.oas.annotations.media.Schema;
4
+import jakarta.persistence.*;
5
+import lombok.AllArgsConstructor;
6
+import lombok.Getter;
7
+import lombok.NoArgsConstructor;
8
+import lombok.Setter;
9
+
10
+@Entity
11
+@Table(name = "config_info")
12
+@Getter
13
+@Setter
14
+@NoArgsConstructor
15
+@AllArgsConstructor
16
+public class ConfigInfo {
17
+    @Id
18
+    @Column(name = "id")
19
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
20
+    private Integer id;
21
+
22
+    @Column(name = "server_address")
23
+    @Schema(description = "服务地址")
24
+    private String serverAddress;
25
+
26
+    @Column(name = "map_token")
27
+    @Schema(description = "参数类型")
28
+    private String mapToken;
29
+
30
+    @Column(name = "map_id")
31
+    @Schema(description = "地图id")
32
+    private String mapId;
33
+
34
+    @Column(name = "map_style_id")
35
+    @Schema(description = "地图样式id")
36
+    private String mapStyleId;
37
+
38
+    @Column(name = "ue_stream_address")
39
+    @Schema(description = "ue像素流地址")
40
+    private String ueStreamAddress;
41
+
42
+    @Column(name = "ue_h5_address")
43
+    @Schema(description = "ueh5地址")
44
+    private String ueH5Address;
45
+
46
+}
47
+
48
+

+ 9 - 0
src/main/java/com/lqkj/cmlcp/module/config/repository/ConfigInfoRepository.java

@@ -0,0 +1,9 @@
1
+package com.lqkj.cmlcp.module.config.repository;
2
+
3
+import com.lqkj.cmlcp.module.config.domain.ConfigInfo;
4
+import org.springframework.data.jpa.repository.JpaRepository;
5
+import org.springframework.stereotype.Repository;
6
+
7
+@Repository
8
+public interface ConfigInfoRepository extends JpaRepository<ConfigInfo, Integer> {
9
+}

+ 10 - 0
src/main/java/com/lqkj/cmlcp/module/config/service/ConfigInfoService.java

@@ -0,0 +1,10 @@
1
+package com.lqkj.cmlcp.module.config.service;
2
+
3
+import com.lqkj.cmlcp.module.config.domain.ConfigInfo;
4
+
5
+public interface ConfigInfoService {
6
+
7
+    void saveAll(ConfigInfo configInfo);
8
+
9
+    ConfigInfo findAll();
10
+}

+ 31 - 0
src/main/java/com/lqkj/cmlcp/module/config/service/impl/ConfigInfoServiceImpl.java

@@ -0,0 +1,31 @@
1
+package com.lqkj.cmlcp.module.config.service.impl;
2
+
3
+import com.lqkj.cmlcp.module.config.domain.ConfigInfo;
4
+import com.lqkj.cmlcp.module.config.repository.ConfigInfoRepository;
5
+import com.lqkj.cmlcp.module.config.service.ConfigInfoService;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.stereotype.Service;
8
+import org.springframework.transaction.annotation.Propagation;
9
+import org.springframework.transaction.annotation.Transactional;
10
+
11
+import java.util.List;
12
+
13
+@Service
14
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
15
+public class ConfigInfoServiceImpl implements ConfigInfoService {
16
+
17
+
18
+    @Autowired
19
+    private ConfigInfoRepository configInfoRepository;
20
+    @Override
21
+    @Transactional
22
+    public void saveAll(ConfigInfo configInfo) {
23
+        configInfoRepository.save(configInfo);
24
+    }
25
+
26
+    @Override
27
+    public ConfigInfo findAll() {
28
+        List<ConfigInfo> configInfos = configInfoRepository.findAll();
29
+        return configInfos.size() > 0 ? configInfos.get(0) : null;
30
+    }
31
+}

+ 49 - 0
src/main/java/com/lqkj/cmlcp/module/encrypt/controller/EncryptController.java

@@ -0,0 +1,49 @@
1
+package com.lqkj.cmlcp.module.encrypt.controller;
2
+
3
+import com.lqkj.cmlcp.message.Result;
4
+import com.lqkj.cmlcp.utils.RSAUtils;
5
+import io.swagger.v3.oas.annotations.Operation;
6
+import io.swagger.v3.oas.annotations.Parameter;
7
+import io.swagger.v3.oas.annotations.tags.Tag;
8
+import org.springframework.web.bind.annotation.PostMapping;
9
+import org.springframework.web.bind.annotation.RequestMapping;
10
+import org.springframework.web.bind.annotation.RestController;
11
+
12
+@RestController
13
+@RequestMapping("/encrypt")
14
+@Tag(name = "加密工具类", description = "加密工具类")
15
+public class EncryptController {
16
+
17
+    @Operation(
18
+            summary = "5.1.1.1 获取RSA公钥接口",
19
+            description = "5.1.1.1 获取RSA公钥接口"
20
+    )
21
+    @PostMapping("/rsaKey")
22
+    public Result<String> rsaKey() {
23
+        return Result.ok(RSAUtils.generateBase64PublicKey(), "获取RSA公钥");
24
+    }
25
+
26
+    @Operation(
27
+            summary = "5.1.1.5 RSA加密接口",
28
+            description = "5.1.1.5 RSA加密接口",
29
+            parameters = {
30
+                @Parameter(name = "word", description = "需加密的字符串", required = true)
31
+            }
32
+    )
33
+    @PostMapping("/rsaEncrypt")
34
+    public Result<String> rsaEncrypt(String word) {
35
+        return Result.ok(RSAUtils.encryptBase64(word), "RSA加密数据");
36
+    }
37
+
38
+    @Operation(
39
+            summary = "5.1.1.6 RSA解密接口",
40
+            description = "5.1.1.6 RSA解密接口",
41
+            parameters = {
42
+                    @Parameter(name = "word", description = "需解密的字符串", required = true)
43
+            }
44
+    )
45
+    @PostMapping("/rsaDecrypt")
46
+    public Result<String> rsaDecrypt(String word) {
47
+        return Result.ok(RSAUtils.decryptBase64(word), "RSA解密数据");
48
+    }
49
+}

+ 0 - 29
src/main/java/com/lqkj/cmlcp/module/test/controller/TestController.java

@@ -1,29 +0,0 @@
1
-package com.lqkj.cmlcp.module.test.controller;
2
-
3
-import com.lqkj.cmlcp.message.Result;
4
-import com.lqkj.cmlcp.module.test.service.CaptchaService;
5
-import org.springframework.beans.factory.annotation.Autowired;
6
-import org.springframework.web.bind.annotation.GetMapping;
7
-import org.springframework.web.bind.annotation.PostMapping;
8
-import org.springframework.web.bind.annotation.RequestMapping;
9
-import org.springframework.web.bind.annotation.RestController;
10
-
11
-@RestController
12
-@RequestMapping("/test")
13
-public class TestController {
14
-
15
-    @Autowired
16
-    private CaptchaService captchaService;
17
-
18
-    @GetMapping("/test1")
19
-    public Result test1() {
20
-        var captcha = captchaService.findAll();
21
-        return Result.ok(captcha);
22
-    }
23
-
24
-    @PostMapping("/test2")
25
-    public Result test2() {
26
-        var captcha = captchaService.findById();
27
-        return Result.ok(captcha);
28
-    }
29
-}

+ 0 - 33
src/main/java/com/lqkj/cmlcp/module/test/domain/Captcha.java

@@ -1,33 +0,0 @@
1
-package com.lqkj.cmlcp.module.test.domain;
2
-
3
-import com.fasterxml.jackson.annotation.JsonFormat;
4
-import io.swagger.v3.oas.annotations.media.Schema;
5
-import lombok.AllArgsConstructor;
6
-import lombok.Data;
7
-import lombok.NoArgsConstructor;
8
-import lombok.experimental.Accessors;
9
-
10
-import java.util.Date;
11
-
12
-
13
-@Accessors(chain = true)
14
-@Data(staticConstructor = "create")
15
-@NoArgsConstructor
16
-@AllArgsConstructor
17
-public class Captcha {
18
-
19
-    private static final long serialVersionUID = 1L;
20
-
21
-    @Schema(description = "验证码id")
22
-    private Long id;
23
-
24
-    @Schema(description = "验证码")
25
-    private String code;
26
-
27
-    @Schema(description = "手机号")
28
-    private String phoneNumber;
29
-
30
-    @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
31
-    private Date createTime;
32
-
33
-}

+ 0 - 9
src/main/java/com/lqkj/cmlcp/module/test/mapper/CaptchaMapper.java

@@ -1,9 +0,0 @@
1
-package com.lqkj.cmlcp.module.test.mapper;
2
-
3
-import com.lqkj.cmlcp.module.test.domain.Captcha;
4
-import com.mybatisflex.core.BaseMapper;
5
-import org.apache.ibatis.annotations.Mapper;
6
-
7
-@Mapper
8
-public interface CaptchaMapper extends BaseMapper<Captcha> {
9
-}

+ 0 - 12
src/main/java/com/lqkj/cmlcp/module/test/service/CaptchaService.java

@@ -1,12 +0,0 @@
1
-package com.lqkj.cmlcp.module.test.service;
2
-
3
-import com.lqkj.cmlcp.module.test.domain.Captcha;
4
-import com.mybatisflex.core.service.IService;
5
-
6
-import java.util.List;
7
-
8
-public interface CaptchaService extends IService<Captcha> {
9
-    List<Captcha> findAll();
10
-
11
-    Captcha findById();
12
-}

+ 0 - 44
src/main/java/com/lqkj/cmlcp/module/test/service/impl/CaptchaServiceImpl.java

@@ -1,44 +0,0 @@
1
-package com.lqkj.cmlcp.module.test.service.impl;
2
-
3
-import com.lqkj.cmlcp.module.test.domain.Captcha;
4
-import com.lqkj.cmlcp.module.test.mapper.CaptchaMapper;
5
-import com.lqkj.cmlcp.module.test.service.CaptchaService;
6
-import com.mybatisflex.spring.service.impl.ServiceImpl;
7
-import jakarta.annotation.Resource;
8
-import org.springframework.beans.factory.annotation.Autowired;
9
-import org.springframework.data.redis.core.RedisTemplate;
10
-import org.springframework.stereotype.Service;
11
-import org.springframework.transaction.annotation.Propagation;
12
-import org.springframework.transaction.annotation.Transactional;
13
-
14
-import java.util.List;
15
-import java.util.Objects;
16
-
17
-
18
-@Service
19
-@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
20
-public class CaptchaServiceImpl extends ServiceImpl<CaptchaMapper, Captcha> implements CaptchaService {
21
-    @Autowired
22
-    private CaptchaMapper captchaMapper;
23
-
24
-    @Resource
25
-    private RedisTemplate<String, List<Captcha>> redisTemplate;
26
-
27
-
28
-    @Override
29
-    public List<Captcha> findAll() {
30
-        var test = redisTemplate.opsForValue().get("test");
31
-        if (Objects.nonNull(test)){
32
-            return test;
33
-        }
34
-        var list = super.list();
35
-        redisTemplate.opsForValue().set("test",list);
36
-        return super.list();
37
-
38
-    }
39
-
40
-    @Override
41
-    public Captcha findById() {
42
-        return captchaMapper.selectOneById(1);
43
-    }
44
-}

+ 43 - 0
src/main/java/com/lqkj/cmlcp/module/zone/controller/ProjectInfoController.java

@@ -0,0 +1,43 @@
1
+package com.lqkj.cmlcp.module.zone.controller;
2
+
3
+
4
+import com.lqkj.cmlcp.message.Result;
5
+import com.lqkj.cmlcp.module.zone.domain.ProjectInfo;
6
+import com.lqkj.cmlcp.module.zone.service.ProjectInfoService;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.web.bind.annotation.*;
9
+
10
+import java.util.List;
11
+
12
+/**
13
+ * 项目信息管理
14
+ */
15
+@RestController
16
+@RequestMapping("/project")
17
+public class ProjectInfoController {
18
+
19
+
20
+    @Autowired
21
+    private ProjectInfoService projectInfoService;
22
+
23
+    @PostMapping("/pageQuery")
24
+    public Result pageQuery(@RequestParam(required = false, defaultValue = "") String projectName,
25
+                            @RequestParam(required = false, defaultValue = "0") Integer page,
26
+                            @RequestParam(required = false, defaultValue = "10") Integer pageSize){
27
+
28
+        return Result.ok(projectInfoService.pageQuery(projectName, page, pageSize));
29
+    }
30
+
31
+    @PostMapping("/save")
32
+    public Result save(@RequestBody ProjectInfo projectInfo){
33
+        projectInfoService.save(projectInfo);
34
+        return Result.ok();
35
+    }
36
+
37
+
38
+    @PostMapping("/delete")
39
+    public Result delete(@RequestBody List<Integer> ids){
40
+        projectInfoService.delete(ids);
41
+        return Result.ok();
42
+    }
43
+}

+ 52 - 0
src/main/java/com/lqkj/cmlcp/module/zone/controller/ZoneInfoController.java

@@ -0,0 +1,52 @@
1
+package com.lqkj.cmlcp.module.zone.controller;
2
+
3
+import com.lqkj.cmlcp.message.Result;
4
+import com.lqkj.cmlcp.module.zone.domain.ZoneInfo;
5
+import com.lqkj.cmlcp.module.zone.service.ZoneInfoService;
6
+import jakarta.servlet.http.HttpServletRequest;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.web.bind.annotation.*;
9
+
10
+import java.util.List;
11
+
12
+
13
+/**
14
+ * 态势/作品信息管理
15
+ */
16
+@RestController
17
+@RequestMapping("/zone")
18
+public class ZoneInfoController {
19
+
20
+    @Autowired
21
+    private ZoneInfoService zoneInfoService;
22
+
23
+
24
+    @PostMapping("/save")
25
+    public Result save(@RequestBody ZoneInfo zoneInfo, HttpServletRequest request) {
26
+
27
+        zoneInfoService.save(zoneInfo);
28
+        return Result.ok();
29
+    }
30
+
31
+    @PostMapping("/pageQuery")
32
+    public Result pageQuery(@RequestParam(required = false, defaultValue = "") String name,
33
+                            @RequestParam(required = false, defaultValue = "0") Integer page,
34
+                            @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
35
+
36
+        return Result.ok(zoneInfoService.pageQuery(name, page, pageSize));
37
+    }
38
+
39
+    @PostMapping("/delete")
40
+    public Result delete(@RequestBody List<Integer> ids) {
41
+        zoneInfoService.delete(ids);
42
+        return Result.ok();
43
+    }
44
+
45
+    /**
46
+     * 根据项目id获取态势/作品
47
+     */
48
+    @PostMapping("/getList")
49
+    public Result getList(@RequestParam Integer projectId) {
50
+        return Result.ok(zoneInfoService.getList(projectId));
51
+    }
52
+}

+ 60 - 0
src/main/java/com/lqkj/cmlcp/module/zone/domain/ProjectInfo.java

@@ -0,0 +1,60 @@
1
+package com.lqkj.cmlcp.module.zone.domain;
2
+
3
+
4
+import com.fasterxml.jackson.annotation.JsonFormat;
5
+import jakarta.persistence.*;
6
+import lombok.AllArgsConstructor;
7
+import lombok.Data;
8
+import lombok.NoArgsConstructor;
9
+import lombok.experimental.Accessors;
10
+import org.hibernate.annotations.SQLDelete;
11
+import org.hibernate.annotations.Where;
12
+
13
+import java.util.Date;
14
+
15
+@Entity
16
+@Table(name = "project_info")
17
+@Accessors(chain = true)
18
+@Data()
19
+@NoArgsConstructor
20
+@AllArgsConstructor
21
+@SQLDelete(sql = "UPDATE project_info SET is_delete = true WHERE id = ?")
22
+@Where(clause = "is_delete = false")
23
+public class ProjectInfo{
24
+
25
+
26
+    @Id
27
+    @Column(name = "id")
28
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
29
+    private Integer id;
30
+
31
+    /**
32
+     * 项目名称
33
+     */
34
+    @Column(name = "project_name")
35
+    private String projectName;
36
+
37
+    /**
38
+     * 缩略图
39
+     */
40
+    @Column(name = "thumbnail")
41
+    private String thumbnail;
42
+
43
+    /**
44
+     * 是否删除
45
+     */
46
+    @Column(name = "is_delete", columnDefinition = "boolean default false")
47
+    private Boolean isDelete;
48
+
49
+    /**
50
+     * 创建时间
51
+     */
52
+    @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
53
+    private Date createTime;
54
+
55
+    /**
56
+     * 更新时间
57
+     */
58
+    @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
59
+    private Date updateTime;
60
+}

+ 106 - 0
src/main/java/com/lqkj/cmlcp/module/zone/domain/ZoneInfo.java

@@ -0,0 +1,106 @@
1
+package com.lqkj.cmlcp.module.zone.domain;
2
+
3
+import com.fasterxml.jackson.annotation.JsonFormat;
4
+import com.alibaba.fastjson2.JSONArray;
5
+import com.alibaba.fastjson2.JSONObject;
6
+import io.hypersistence.utils.hibernate.type.json.JsonType;
7
+import jakarta.persistence.*;
8
+import lombok.AllArgsConstructor;
9
+import lombok.Data;
10
+import lombok.NoArgsConstructor;
11
+import lombok.experimental.Accessors;
12
+import org.hibernate.annotations.SQLDelete;
13
+import org.hibernate.annotations.Type;
14
+import org.hibernate.annotations.Where;
15
+
16
+import java.util.Date;
17
+
18
+
19
+/**
20
+ * 作品/态势表
21
+ */
22
+@Entity
23
+@Table(name = "zone_info")
24
+@Accessors(chain = true)
25
+@Data()
26
+@NoArgsConstructor
27
+@AllArgsConstructor
28
+@SQLDelete(sql = "UPDATE zone_info SET is_delete = true WHERE id = ?")
29
+@Where(clause = "is_delete = false")
30
+public class ZoneInfo {
31
+
32
+    /**
33
+     * 作品id
34
+     */
35
+    @Id
36
+    @Column(name = "id")
37
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
38
+    private Integer id;
39
+
40
+    /**
41
+     * 作品名称
42
+     */
43
+    @Column(name = "zone_name")
44
+    private String zoneName;
45
+
46
+    /**
47
+     * 缩略图
48
+     */
49
+    @Column(name = "thumbnail")
50
+    private String thumbnail;
51
+
52
+    /**
53
+     * 插槽数据
54
+     */
55
+    @Type(JsonType.class)
56
+    @Column(name = "data_slotters", columnDefinition = "jsonb")
57
+    private JSONArray dataSlotters;
58
+
59
+    /**
60
+     * 画布样式
61
+     */
62
+    @Type(JsonType.class)
63
+    @Column(name = "canvas_style", columnDefinition = "jsonb")
64
+    private JSONObject canvasStyle;
65
+
66
+    /**
67
+     * 画布数据
68
+     */
69
+    @Type(JsonType.class)
70
+    @Column(name = "canvas_data", columnDefinition = "jsonb")
71
+    private JSONArray canvasData;
72
+
73
+    /**
74
+     * 项目id
75
+     */
76
+    @Column(name = "project_id")
77
+    private Integer projectId;
78
+
79
+    /**
80
+     * 态势类型
81
+     */
82
+    @Column(name = "posture_type")
83
+    private Integer postureType;
84
+
85
+    /**
86
+     * 是否删除
87
+     */
88
+    @Column(name = "is_delete", columnDefinition = "boolean default false")
89
+    private Boolean isDelete;
90
+
91
+    /**
92
+     * 创建时间
93
+     */
94
+    @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
95
+    private Date createTime;
96
+
97
+    /**
98
+     * 更新时间
99
+     */
100
+    @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
101
+    private Date updateTime;
102
+
103
+    public ZoneInfo(Integer projectId) {
104
+        this.projectId = projectId;
105
+    }
106
+}

+ 26 - 0
src/main/java/com/lqkj/cmlcp/module/zone/domain/ZoneModel.java

@@ -0,0 +1,26 @@
1
+package com.lqkj.cmlcp.module.zone.domain;
2
+
3
+import com.google.gson.JsonObject;
4
+import lombok.AllArgsConstructor;
5
+import lombok.Data;
6
+import lombok.NoArgsConstructor;
7
+
8
+import java.util.List;
9
+@Data
10
+@AllArgsConstructor
11
+@NoArgsConstructor
12
+public class ZoneModel {
13
+
14
+    private Integer zoneId;
15
+
16
+    private String zoneName;
17
+
18
+    private String thumbnail;
19
+
20
+    private List<JsonObject> dataSlotters;
21
+
22
+    private List<JsonObject> canvasData;
23
+
24
+    private JsonObject canvasStyle;
25
+
26
+}

+ 20 - 0
src/main/java/com/lqkj/cmlcp/module/zone/repository/ProjectInfoRepository.java

@@ -0,0 +1,20 @@
1
+package com.lqkj.cmlcp.module.zone.repository;
2
+
3
+import com.lqkj.cmlcp.module.zone.domain.ProjectInfo;
4
+import org.springframework.data.domain.Page;
5
+import org.springframework.data.domain.PageRequest;
6
+import org.springframework.data.jpa.repository.JpaRepository;
7
+import org.springframework.data.jpa.repository.Query;
8
+import org.springframework.data.repository.query.Param;
9
+import org.springframework.stereotype.Component;
10
+
11
+@Component
12
+public interface ProjectInfoRepository extends JpaRepository<ProjectInfo, Integer> {
13
+
14
+    @Query(nativeQuery = true,
15
+            value = "select * from project_info t where t.is_delete = false " +
16
+                    "and (:projectName = '' or project_name like concat('%', :projectName, '%'))")
17
+    Page<ProjectInfo> pageQuery(@Param("projectName") String projectName, PageRequest pageRequest);
18
+
19
+    ProjectInfo findByProjectName(String projectName);
20
+}

+ 21 - 0
src/main/java/com/lqkj/cmlcp/module/zone/repository/ZoneInfoRepository.java

@@ -0,0 +1,21 @@
1
+package com.lqkj.cmlcp.module.zone.repository;
2
+
3
+import com.lqkj.cmlcp.module.zone.domain.ZoneInfo;
4
+import org.springframework.data.domain.Page;
5
+import org.springframework.data.domain.PageRequest;
6
+import org.springframework.data.jpa.repository.JpaRepository;
7
+import org.springframework.data.jpa.repository.Query;
8
+import org.springframework.data.repository.query.Param;
9
+import org.springframework.stereotype.Component;
10
+
11
+@Component
12
+public interface ZoneInfoRepository extends JpaRepository<ZoneInfo, Integer> {
13
+
14
+
15
+    @Query(nativeQuery = true,
16
+            value = "select * from zone_info t where t.is_delete = false " +
17
+            "and (:name = '' or zone_name like concat('%', :name, '%'))")
18
+    Page<ZoneInfo> pageQuery(@Param("name") String name, PageRequest pageRequest);
19
+
20
+    ZoneInfo findByZoneName(String zoneName);
21
+}

+ 14 - 0
src/main/java/com/lqkj/cmlcp/module/zone/service/ProjectInfoService.java

@@ -0,0 +1,14 @@
1
+package com.lqkj.cmlcp.module.zone.service;
2
+
3
+import com.lqkj.cmlcp.module.zone.domain.ProjectInfo;
4
+import org.springframework.data.domain.Page;
5
+
6
+import java.util.List;
7
+
8
+public interface ProjectInfoService {
9
+    Page<ProjectInfo> pageQuery(String projectName, Integer page, Integer pageSize);
10
+
11
+    void save(ProjectInfo projectInfo);
12
+
13
+    void delete(List<Integer> ids);
14
+}

+ 21 - 0
src/main/java/com/lqkj/cmlcp/module/zone/service/ZoneInfoService.java

@@ -0,0 +1,21 @@
1
+package com.lqkj.cmlcp.module.zone.service;
2
+
3
+import com.lqkj.cmlcp.module.zone.domain.ZoneInfo;
4
+import org.springframework.data.domain.Page;
5
+
6
+import java.util.List;
7
+
8
+public interface ZoneInfoService{
9
+    void save(ZoneInfo zoneInfo);
10
+
11
+    Page<ZoneInfo> pageQuery(String name, Integer page, Integer pageSize);
12
+
13
+    void delete(List<Integer> ids);
14
+
15
+    /**
16
+     * 获取项目下所有区域信息
17
+     * @param projectId
18
+     * @return
19
+     */
20
+    List<ZoneInfo> getList(Integer projectId);
21
+}

+ 45 - 0
src/main/java/com/lqkj/cmlcp/module/zone/service/impl/ProjectInfoServiceImpl.java

@@ -0,0 +1,45 @@
1
+package com.lqkj.cmlcp.module.zone.service.impl;
2
+
3
+import com.lqkj.cmlcp.module.zone.domain.ProjectInfo;
4
+import com.lqkj.cmlcp.module.zone.repository.ProjectInfoRepository;
5
+import com.lqkj.cmlcp.module.zone.service.ProjectInfoService;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.data.domain.Page;
8
+import org.springframework.data.domain.PageRequest;
9
+import org.springframework.stereotype.Service;
10
+import org.springframework.transaction.annotation.Propagation;
11
+import org.springframework.transaction.annotation.Transactional;
12
+
13
+import java.util.Date;
14
+import java.util.List;
15
+import java.util.Objects;
16
+
17
+@Service
18
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
19
+public class ProjectInfoServiceImpl implements ProjectInfoService {
20
+
21
+
22
+    @Autowired
23
+    private ProjectInfoRepository projectInfoRepository;
24
+
25
+    @Override
26
+    public Page<ProjectInfo> pageQuery(String projectName, Integer page, Integer pageSize) {
27
+        return projectInfoRepository.pageQuery(projectName, PageRequest.of(page, pageSize));
28
+    }
29
+
30
+    @Override
31
+    public void save(ProjectInfo projectInfo) {
32
+        ProjectInfo oldProject = projectInfoRepository.findByProjectName(projectInfo.getProjectName());
33
+        if (Objects.nonNull(projectInfo.getId()) && !projectInfo.getId().equals(oldProject.getId())) throw new RuntimeException("项目名称已存在");
34
+        if (Objects.isNull(projectInfo.getId()) && Objects.nonNull(oldProject)) throw new RuntimeException("项目名称已存在");
35
+        if (Objects.isNull(projectInfo.getId())) projectInfo.setCreateTime(new Date());
36
+        projectInfo.setIsDelete(false);
37
+        projectInfo.setUpdateTime(new Date());
38
+        projectInfoRepository.save(projectInfo);
39
+    }
40
+
41
+    @Override
42
+    public void delete(List<Integer> ids) {
43
+        projectInfoRepository.deleteAllById(ids);
44
+    }
45
+}

+ 58 - 0
src/main/java/com/lqkj/cmlcp/module/zone/service/impl/ZoneInfoServiceImpl.java

@@ -0,0 +1,58 @@
1
+package com.lqkj.cmlcp.module.zone.service.impl;
2
+
3
+import com.lqkj.cmlcp.module.zone.domain.ZoneInfo;
4
+import com.lqkj.cmlcp.module.zone.repository.ZoneInfoRepository;
5
+import com.lqkj.cmlcp.module.zone.service.ZoneInfoService;
6
+import jakarta.persistence.EntityManager;
7
+import jakarta.persistence.PersistenceContext;
8
+import org.springframework.beans.factory.annotation.Autowired;
9
+import org.springframework.data.domain.Example;
10
+import org.springframework.data.domain.Page;
11
+import org.springframework.data.domain.PageRequest;
12
+import org.springframework.stereotype.Service;
13
+import org.springframework.transaction.annotation.Propagation;
14
+import org.springframework.transaction.annotation.Transactional;
15
+
16
+import java.util.Date;
17
+import java.util.List;
18
+import java.util.Objects;
19
+
20
+@Service
21
+@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
22
+public class ZoneInfoServiceImpl implements ZoneInfoService {
23
+
24
+    @Autowired
25
+    private ZoneInfoRepository zoneInfoRepository;
26
+
27
+    @PersistenceContext
28
+    private EntityManager entityManager;
29
+
30
+    @Override
31
+    public void save(ZoneInfo zoneInfo) {
32
+        ZoneInfo oldzone = zoneInfoRepository.findByZoneName(zoneInfo.getZoneName());
33
+        if (Objects.nonNull(zoneInfo.getId()) && Objects.nonNull(oldzone)
34
+                && !oldzone.getId().equals(zoneInfo.getId())) throw new RuntimeException("作品名称已存在");
35
+        if (Objects.isNull(zoneInfo.getId()) && Objects.nonNull(oldzone)) throw new RuntimeException("作品名称已存在");
36
+        if (Objects.isNull(zoneInfo.getId())) zoneInfo.setCreateTime(new Date());
37
+        zoneInfo.setIsDelete(false);
38
+        zoneInfo.setUpdateTime(new Date());
39
+        zoneInfoRepository.save(zoneInfo);
40
+    }
41
+
42
+    @Override
43
+    public Page<ZoneInfo> pageQuery(String name, Integer page, Integer pageSize) {
44
+        PageRequest pageRequest = PageRequest.of(page, pageSize);
45
+        return zoneInfoRepository.pageQuery(name, pageRequest);
46
+    }
47
+
48
+    @Override
49
+    public void delete(List<Integer> ids) {
50
+        zoneInfoRepository.deleteAllById(ids);
51
+    }
52
+
53
+    @Override
54
+    public List<ZoneInfo> getList(Integer projectId) {
55
+        return zoneInfoRepository.findAll(Example.of(new ZoneInfo(projectId)));
56
+    }
57
+
58
+}

+ 85 - 0
src/main/java/com/lqkj/cmlcp/utils/AESUtils.java

@@ -0,0 +1,85 @@
1
+package com.lqkj.cmlcp.utils;
2
+
3
+import com.alibaba.fastjson2.JSON;
4
+import com.alibaba.fastjson2.JSONArray;
5
+import com.alibaba.fastjson2.JSONObject;
6
+import com.lqkj.cmlcp.module.authority.domain.UserInfo;
7
+
8
+import javax.crypto.Cipher;
9
+import javax.crypto.spec.SecretKeySpec;
10
+import java.nio.charset.StandardCharsets;
11
+import java.util.Base64;
12
+import java.util.Date;
13
+import java.util.Objects;
14
+import java.util.Random;
15
+
16
+
17
+public class AESUtils {
18
+    private static final String ALGORITHM = "AES";
19
+    private static final String TRANSFORMATION = "AES";
20
+
21
+    public static String encrypt(String plainText, String key) throws Exception {
22
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
23
+        StringBuilder keyBuilder = new StringBuilder(key);
24
+        while (keyBuilder.length() < 16) {
25
+            keyBuilder.append("\0");
26
+        }
27
+        byte[] keyBytes = keyBuilder.toString().getBytes(StandardCharsets.UTF_8);
28
+        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, ALGORITHM));
29
+        byte[] doFinal = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
30
+        return Base64.getEncoder().encodeToString(doFinal);
31
+    }
32
+
33
+    public static String decrypt(String cipherText, String key) throws Exception {
34
+        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
35
+        StringBuilder keyBuilder = new StringBuilder(key);
36
+        while (keyBuilder.length() < 16) {
37
+            keyBuilder.append("\0");
38
+        }
39
+        byte[] keyBytes = keyBuilder.toString().getBytes(StandardCharsets.UTF_8);
40
+        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, ALGORITHM));
41
+        byte[] doFinal = cipher.doFinal(Base64.getDecoder().decode(cipherText));
42
+        return new String(doFinal);
43
+    }
44
+
45
+    public static String generateRandomKey(int length) {
46
+        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
47
+        Random random = new Random();
48
+        StringBuilder sb = new StringBuilder(length);
49
+        for (int i = 0; i < length; i++) {
50
+            int index = random.nextInt(characters.length());
51
+            sb.append(characters.charAt(index));
52
+        }
53
+        return sb.toString();
54
+    }
55
+
56
+    public static UserInfo encryptUser(UserInfo userInfo, String key) throws Exception {
57
+        Date updateTime = userInfo.getUpdateTime();
58
+        Date lockTime = userInfo.getLockTime();
59
+        JSONObject object = JSON.parseObject(JSON.toJSONString(userInfo));
60
+        object.remove("updateTime");
61
+        object.remove("lockTime");
62
+        JSONArray jsonArray = object.getJSONArray("roleInfoList");
63
+        if (jsonArray != null && jsonArray.size() > 0) {
64
+            for (int i = 0; i < jsonArray.size(); i++) {
65
+                JSONObject object1 = jsonArray.getJSONObject(i);
66
+                object1.remove("updateTime");
67
+            }
68
+        }
69
+        UserInfo encryptUser = JSON.parseObject(JSON.toJSONString(object), UserInfo.class);
70
+        encryptUser.setUserCode(encrypt(encryptUser.getUserCode(), key));
71
+        if (Objects.nonNull(encryptUser.getAuthorizationCode())) encryptUser.setAuthorizationCode(encrypt(encryptUser.getAuthorizationCode(), key));
72
+        encryptUser.setUpdateTime(updateTime);
73
+        encryptUser.setLockTime(lockTime);
74
+        return encryptUser;
75
+    }
76
+    public static void main(String[] args) throws Exception {
77
+//        String plainText = "123456";
78
+        String key = "abc";
79
+//        String cipherText = AESUtils.encrypt(plainText, key);
80
+        String cipherText = "5GzvPLBVRxQC6k37cknLMg==";
81
+        System.out.println(cipherText);
82
+        String plainText = AESUtils.decrypt(cipherText, key);
83
+        System.out.println(plainText);
84
+    }
85
+}

+ 39 - 3
src/main/resources/application-install.yml

@@ -1,5 +1,5 @@
1 1
 server:
2
-  address: 192.168.4.219
2
+  address: 192.168.4.194
3 3
   servlet:
4 4
     context-path: /cmlcp-server
5 5
   port: 9999
@@ -38,6 +38,30 @@ spring:
38 38
   jdbc:
39 39
     template:
40 40
       query-timeout: 20s
41
+  jpa:
42
+    hibernate:
43
+      ddl-auto: none
44
+    generate-ddl: false
45
+    show-sql: false
46
+    open-in-view: true
47
+    properties:
48
+      hibernate:
49
+        event:
50
+          merge:
51
+            entity_copy_observer: allow
52
+        jdbc:
53
+          batch_size: 1000
54
+          fetch_size: 1000
55
+        temp:
56
+          use_jdbc_metadata_defaults: false
57
+        dialect: org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect
58
+        jpa:
59
+          properties:
60
+            hibernate:
61
+              jdbc:
62
+                batch_size: 1000
63
+              order_inserts: true
64
+    database-platform: org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect
41 65
   datasource:
42 66
     hikari:
43 67
       driver-class-name: org.postgresql.Driver
@@ -65,6 +89,11 @@ spring:
65 89
       chain:
66 90
         cache: true
67 91
         enabled: true
92
+  session:
93
+    jdbc:
94
+      initialize-schema: never
95
+  main:
96
+    allow-bean-definition-overriding: true
68 97
 logging:
69 98
   register-shutdown-hook: true
70 99
   level:
@@ -74,5 +103,12 @@ logging:
74 103
     org.hibernate.SQL: debug
75 104
     io.swagger.models.parameters.AbstractSerializableParameter: error
76 105
   file:
77
-    name: ./log/link.log
78
-    path: classpath:log4j2.xml
106
+    name: ./log/lcp.log
107
+    path: classpath:log4j2.xml
108
+springdoc:
109
+  api-docs:
110
+    enabled: false
111
+    path: /v3/api-docs
112
+  swagger-ui:
113
+    persist-authorization: true
114
+    path: /swagger-ui.html

+ 0 - 13
src/main/resources/com/lqkj/cmlcp/module/authority/mapper/UserInfoMapper.xml

@@ -1,13 +0,0 @@
1
-<?xml version="1.0" encoding="UTF-8" ?>
2
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3
-<mapper namespace="com.lqkj.cmlcp.module.authority.mapper.UserInfoMapper">
4
-
5
-    <insert id="initSuperAdminRole">
6
-        insert into user_role values (1, 1)
7
-    </insert>
8
-
9
-    <select id="initUserIdSeq">
10
-        ALTER SEQUENCE user_info_id_seq RESTART WITH 3
11
-    </select>
12
-
13
-</mapper>

+ 0 - 4
src/main/resources/com/lqkj/cmlcp/module/test/mapper/CaptchaMapper.xml

@@ -1,4 +0,0 @@
1
-<?xml version="1.0" encoding="UTF-8" ?>
2
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3
-<mapper namespace="com.lqkj.cmlcp.module.test.mapper.CaptchaMapper">
4
-</mapper>

+ 138 - 1
src/main/resources/db/migration/V1__INIT.sql

@@ -161,4 +161,141 @@ comment on column user_role.role_id is
161 161
 '角色ID:role_id';
162 162
 
163 163
 comment on column user_role.user_id is
164
-'用户ID:user_id';
164
+'用户ID:user_id';
165
+
166
+
167
+
168
+create table zone_info (
169
+                           id SERIAL NOT NULL,
170
+                           zone_name VARCHAR(255) NULL,
171
+                           thumbnail VARCHAR(255) NULL,
172
+                           data_slotters jsonb NULL,
173
+                           canvas_style jsonb NULL,
174
+                           canvas_data jsonb NULL,
175
+                           is_delete BOOL not null default false,
176
+                           update_time TIMESTAMP NULL,
177
+                           create_time TIMESTAMP NULL,
178
+                           constraint PK_ZONE_INFO primary key (id)
179
+);
180
+comment on table zone_info is
181
+'作品/模板:zone_info';
182
+
183
+comment on column zone_info.id is
184
+'作品ID:id';
185
+
186
+comment on column zone_info.zone_name is
187
+'作品名称:zone_name';
188
+
189
+comment on column zone_info.thumbnail is
190
+'缩略图:thumbnail';
191
+
192
+comment on column zone_info.data_slotters is
193
+'数据:data_slotters';
194
+
195
+comment on column zone_info.canvas_style is
196
+'画布样式:canvas_style';
197
+
198
+comment on column zone_info.canvas_data is
199
+'画布数据:canvas_data';
200
+
201
+comment on column zone_info.is_delete is
202
+'是否删除:is_delete 0:否 1:是' ;
203
+
204
+comment on column zone_info.update_time is
205
+'更新时间:update_time';
206
+
207
+comment on column zone_info.create_time is
208
+'创建时间:create_time';
209
+
210
+
211
+
212
+create table config_info (
213
+                             id SERIAL NOT NULL,
214
+                             server_address VARCHAR(255) NULL,
215
+                             map_token VARCHAR(1000) NULL,
216
+                             map_id VARCHAR(255) NULL,
217
+                             map_style_id VARCHAR(255) NULL,
218
+                             ue_stream_address VARCHAR(255) NULL,
219
+                             ue_h5_address VARCHAR(255) NULL,
220
+                             constraint PK_CONFIG_INFO primary key (id)
221
+);
222
+comment on table config_info is
223
+'系统配置:config_info';
224
+comment on column config_info.id is
225
+'主键:id';
226
+comment on column config_info.server_address is
227
+'服务地址:server_address';
228
+comment on column config_info.map_token is
229
+'地图token:map_token';
230
+comment on column config_info.map_id is
231
+'地图id:map_id';
232
+comment on column config_info.map_style_id is
233
+'地图样式id:map_style_id';
234
+comment on column config_info.ue_stream_address is
235
+'UE推流地址:ue_stream_address';
236
+comment on column config_info.ue_h5_address is
237
+'UE h5地址:ue_h5_address';
238
+
239
+
240
+
241
+create table api_info(
242
+                         id SERIAL NOT NULL,
243
+                         name VARCHAR(255) NULL,
244
+                         method VARCHAR(255) NULL,
245
+                         url VARCHAR(255) NULL,
246
+                         headers jsonb NULL,
247
+                         params jsonb NULL,
248
+                         data jsonb NULL,
249
+                         type int NULL,
250
+                         constraint PK_API_INFO primary key (id)
251
+);
252
+comment on table api_info is
253
+'接口信息:api_info';
254
+comment on column api_info.id is
255
+'主键:id';
256
+comment on column api_info.name is
257
+'接口名称:name';
258
+comment on column api_info.method is
259
+'请求方式:method';
260
+comment on column api_info.url is
261
+'请求地址:url';
262
+comment on column api_info.headers is
263
+'请求头:headers';
264
+comment on column api_info.params is
265
+'请求参数:params';
266
+comment on column api_info.data is
267
+'请求体:data';
268
+comment on column api_info.type is
269
+'api类型:type 1:接口 2:mock';
270
+
271
+
272
+
273
+create table project_info(
274
+                             id SERIAL NOT NULL,
275
+                             project_name VARCHAR(255) NULL,
276
+                             thumbnail VARCHAR(255) NULL,
277
+                             is_delete BOOL not null default false,
278
+                             update_time TIMESTAMP NULL,
279
+                             create_time TIMESTAMP NULL,
280
+                             constraint PK_PROJECT_INFO primary key (id)
281
+);
282
+comment on table project_info is
283
+'项目信息:project_info';
284
+comment on column project_info.id is
285
+'项目ID:id';
286
+comment on column project_info.project_name is
287
+'项目名称:project_name';
288
+comment on column project_info.thumbnail is
289
+'缩略图:thumbnail';
290
+comment on column project_info.is_delete is
291
+'是否删除:is_delete 0:否 1:是' ;
292
+comment on column project_info.update_time is
293
+'更新时间:update_time';
294
+comment on column project_info.create_time is
295
+'创建时间:create_time';
296
+alter table zone_info add column project_id int;
297
+comment on column zone_info.project_id is
298
+'项目ID:project_id';
299
+alter table zone_info add column posture_type int;
300
+comment on column zone_info.posture_type is
301
+'态势型:posture_type';

+ 8 - 12
src/main/resources/log4j2.xml

@@ -27,18 +27,14 @@
27 27
     </Appenders>
28 28
 
29 29
     <Loggers>
30
-        <Logger name="org.apache.catalina.startup.DigesterFactory" level="info" />
31
-        <Logger name="org.apache.catalina.util.LifecycleBase" level="info" />
32
-        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="info" />
33
-        <logger name="org.apache.sshd.common.util.SecurityUtils" level="info"/>
34
-        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="info" />
35
-        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="info" />
36
-        <Logger name="org.hibernate.validator.internal.util.Version" level="info" />
37
-        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="info"/>
38
-        <logger name="com.apache.ibatis" level="info"/>
39
-        <logger name="java.sql.Connection" level="info"/>
40
-        <logger name="java.sql.Statement" level="info"/>
41
-        <logger name="java.sql.PreparedStatement" level="info"/>
30
+        <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
31
+        <Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
32
+        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
33
+        <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
34
+        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
35
+        <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
36
+        <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
37
+        <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
42 38
         <AsyncRoot level="info" additivity="false">
43 39
             <AppenderRef ref="Console"/>
44 40
             <AppenderRef ref="File"/>