张涛 1 rok temu
commit
fd5fb3c540
100 zmienionych plików z 38182 dodań i 0 usunięć
  1. 38
    0
      .gitignore
  2. 140
    0
      admin/pom.xml
  3. 24
    0
      admin/src/main/java/com/njyunzhi/YZCrmAdminApplication.java
  4. 21
    0
      admin/src/main/java/com/njyunzhi/admin/common/Constants.java
  5. 41
    0
      admin/src/main/java/com/njyunzhi/admin/controller/CommController.java
  6. 135
    0
      admin/src/main/java/com/njyunzhi/admin/controller/FxTenantController.java
  7. 118
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysDeptController.java
  8. 71
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysLogController.java
  9. 102
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysLoginController.java
  10. 54
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysMenuController.java
  11. 122
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysRoleController.java
  12. 158
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysRoleResourceController.java
  13. 223
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysUserController.java
  14. 117
    0
      admin/src/main/java/com/njyunzhi/admin/controller/SysUserRoleController.java
  15. 99
    0
      admin/src/main/java/com/njyunzhi/admin/controller/TaPersonController.java
  16. 16
    0
      admin/src/main/java/com/njyunzhi/admin/dto/ChangePasswordDTO.java
  17. 22
    0
      admin/src/main/java/com/njyunzhi/admin/dto/LoginDTO.java
  18. 14
    0
      admin/src/main/java/com/njyunzhi/admin/dto/PersonDTO.java
  19. 19
    0
      admin/src/main/java/com/njyunzhi/admin/dto/ResetPasswordDTO.java
  20. 14
    0
      admin/src/main/java/com/njyunzhi/admin/service/FxTenantService.java
  21. 14
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysDeptService.java
  22. 13
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysLogService.java
  23. 22
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysLoginService.java
  24. 13
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysMenuService.java
  25. 22
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysRoleResourceService.java
  26. 20
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysRoleService.java
  27. 13
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysUserRoleService.java
  28. 31
    0
      admin/src/main/java/com/njyunzhi/admin/service/SysUserService.java
  29. 56
    0
      admin/src/main/java/com/njyunzhi/admin/service/TaPersonService.java
  30. 41
    0
      admin/src/main/java/com/njyunzhi/admin/service/framework/OpLogService.java
  31. 28
    0
      admin/src/main/java/com/njyunzhi/admin/service/framework/StpInterfaceImpl.java
  32. 88
    0
      admin/src/main/java/com/njyunzhi/admin/service/framework/UserService.java
  33. 18
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/FxTenantServiceImpl.java
  34. 18
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysDeptServiceImpl.java
  35. 17
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysLogServiceImpl.java
  36. 91
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysLoginServiceImpl.java
  37. 17
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysMenuServiceImpl.java
  38. 61
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysRoleResourceServiceImpl.java
  39. 38
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysRoleServiceImpl.java
  40. 17
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysUserRoleServiceImpl.java
  41. 124
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/SysUserServiceImpl.java
  42. 143
    0
      admin/src/main/java/com/njyunzhi/admin/service/impl/TaPersonServiceImpl.java
  43. 11
    0
      admin/src/main/java/com/njyunzhi/admin/util/CommonUtil.java
  44. 20
    0
      admin/src/main/resources/aliyun.yml
  45. 134
    0
      admin/src/main/resources/application.yml
  46. 62
    0
      admin/src/main/resources/logback-spring.xml
  47. 61
    0
      common/pom.xml
  48. 177
    0
      common/src/main/java/com/njyunzhi/common/util/DateUtil.java
  49. 23
    0
      common/src/main/java/com/njyunzhi/common/util/EncryptUtil.java
  50. 132
    0
      common/src/main/java/com/njyunzhi/common/util/FileUtil.java
  51. 63
    0
      common/src/main/java/com/njyunzhi/common/util/FileUtilCompression.java
  52. 117
    0
      common/src/main/java/com/njyunzhi/common/util/HttpUtil.java
  53. 72
    0
      common/src/main/java/com/njyunzhi/common/util/IpUtil.java
  54. 31
    0
      common/src/main/java/com/njyunzhi/common/util/MimeType.java
  55. 20
    0
      common/src/main/java/com/njyunzhi/common/util/MyPropertySourceFactory.java
  56. 54
    0
      common/src/main/java/com/njyunzhi/common/util/SSLSocketClient.java
  57. 226
    0
      common/src/main/java/com/njyunzhi/common/util/StringUtil.java
  58. 22
    0
      common/src/main/java/com/njyunzhi/common/util/aliyun/AliyunConfig.java
  59. 21
    0
      common/src/main/java/com/njyunzhi/common/util/aliyun/oss/OssConfig.java
  60. 93
    0
      common/src/main/java/com/njyunzhi/common/util/aliyun/oss/OssUtil.java
  61. 70
    0
      common/src/main/java/com/njyunzhi/common/util/excel/CellWidthWriteHandler.java
  62. 40
    0
      common/src/main/java/com/njyunzhi/common/util/excel/DateConverter.java
  63. 88
    0
      common/src/main/java/com/njyunzhi/common/util/excel/ExcelUtil.java
  64. 39
    0
      common/src/main/java/com/njyunzhi/common/util/excel/LocalDateTimeConverter.java
  65. 40
    0
      common/src/main/java/com/njyunzhi/common/util/excel/TimestampConverter.java
  66. 1103
    0
      db/.back_global_funding(支付)/T20240226202253.pdma.json
  67. 4180
    0
      db/.back_global_funding(支付)/T20240226202350.pdma.json
  68. 5504
    0
      db/.back_global_funding(支付)/T20240226204255.pdma.json
  69. 5504
    0
      db/.back_global_funding(支付)/T20240226210033.pdma.json
  70. 5504
    0
      db/.back_global_funding(支付)/T20240226210606.pdma.json
  71. 5504
    0
      db/.back_global_funding(支付)/T20240226210647.pdma.json
  72. 5504
    0
      db/global_funding(支付).pdma.json
  73. 66
    0
      framework/pom.xml
  74. 20
    0
      framework/src/main/java/com/njyunzhi/framework/accesslimit/AccessLimit.java
  75. 79
    0
      framework/src/main/java/com/njyunzhi/framework/accesslimit/AccessLimitInterceptor.java
  76. 25
    0
      framework/src/main/java/com/njyunzhi/framework/accesslimit/InterCepTerConfig.java
  77. 14
    0
      framework/src/main/java/com/njyunzhi/framework/config/FilterConfig.java
  78. 31
    0
      framework/src/main/java/com/njyunzhi/framework/config/LocalDateTimeSerializerConfig.java
  79. 25
    0
      framework/src/main/java/com/njyunzhi/framework/config/SwaggerConfig.java
  80. 16
    0
      framework/src/main/java/com/njyunzhi/framework/config/TenantConfig.java
  81. 19
    0
      framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeConfigure.java
  82. 20
    0
      framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeInterceptor.java
  83. 45
    0
      framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeType.java
  84. 26
    0
      framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeUtil.java
  85. 28
    0
      framework/src/main/java/com/njyunzhi/framework/datascope/ISQLHandler.java
  86. 59
    0
      framework/src/main/java/com/njyunzhi/framework/datascope/SqlHandlerImpl.java
  87. 42
    0
      framework/src/main/java/com/njyunzhi/framework/exception/GlobalExceptionHandler.java
  88. 27
    0
      framework/src/main/java/com/njyunzhi/framework/log/OpLog.java
  89. 108
    0
      framework/src/main/java/com/njyunzhi/framework/log/OpLogAspect.java
  90. 68
    0
      framework/src/main/java/com/njyunzhi/framework/mybatisplus/MyMetaObjectHandler.java
  91. 61
    0
      framework/src/main/java/com/njyunzhi/framework/mybatisplus/MybatisPlusConfig.java
  92. 44
    0
      framework/src/main/java/com/njyunzhi/framework/satoken/SaServletFilter2.java
  93. 55
    0
      framework/src/main/java/com/njyunzhi/framework/satoken/SaTokenConfigure.java
  94. 15
    0
      framework/src/main/java/com/njyunzhi/framework/satoken/SaTokenInterceptor.java
  95. 7
    0
      framework/src/main/java/com/njyunzhi/framework/service/IOpLogService.java
  96. 35
    0
      framework/src/main/java/com/njyunzhi/framework/service/IUserService.java
  97. 47
    0
      framework/src/main/java/com/njyunzhi/framework/util/RedisTool.java
  98. 20
    0
      framework/src/main/java/com/njyunzhi/framework/util/SpringContextUtil.java
  99. 308
    0
      mvnw
  100. 0
    0
      mvnw.cmd

+ 38
- 0
.gitignore Wyświetl plik

@@ -0,0 +1,38 @@
1
+HELP.md
2
+target/
3
+!.mvn/wrapper/maven-wrapper.jar
4
+!**/src/main/**/target/
5
+!**/src/test/**/target/
6
+
7
+### STS ###
8
+.apt_generated
9
+.classpath
10
+.factorypath
11
+.project
12
+.settings
13
+.springBeans
14
+.sts4-cache
15
+
16
+### IntelliJ IDEA ###
17
+.idea
18
+*.iws
19
+*.iml
20
+*.ipr
21
+
22
+### NetBeans ###
23
+/nbproject/private/
24
+/nbbuild/
25
+/dist/
26
+/nbdist/
27
+/.nb-gradle/
28
+build/
29
+!**/src/main/**/build/
30
+!**/src/test/**/build/
31
+
32
+### VS Code ###
33
+.vscode/
34
+
35
+
36
+logs
37
+*.log
38
+

+ 140
- 0
admin/pom.xml Wyświetl plik

@@ -0,0 +1,140 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+    <parent>
6
+        <artifactId>demo</artifactId>
7
+        <groupId>com.njyunzhi</groupId>
8
+        <version>0.0.1</version>
9
+    </parent>
10
+    <modelVersion>4.0.0</modelVersion>
11
+
12
+    <artifactId>yz_admin</artifactId>
13
+    <dependencies>
14
+        <dependency>
15
+            <groupId>com.njyunzhi</groupId>
16
+            <artifactId>yz_common</artifactId>
17
+            <version>0.0.1</version>
18
+            <scope>compile</scope>
19
+        </dependency>
20
+        <dependency>
21
+            <groupId>com.njyunzhi</groupId>
22
+            <artifactId>yz_repository</artifactId>
23
+            <version>0.0.1</version>
24
+            <scope>compile</scope>
25
+        </dependency>
26
+        <dependency>
27
+            <groupId>com.njyunzhi</groupId>
28
+            <artifactId>yz_framework</artifactId>
29
+            <version>0.0.1</version>
30
+            <scope>compile</scope>
31
+        </dependency>
32
+    </dependencies>
33
+
34
+    <properties>
35
+        <maven.compiler.source>8</maven.compiler.source>
36
+        <maven.compiler.target>8</maven.compiler.target>
37
+    </properties>
38
+
39
+    <build>
40
+        <plugins>
41
+
42
+            <plugin>
43
+                <groupId>org.springframework.boot</groupId>
44
+                <artifactId>spring-boot-maven-plugin</artifactId>
45
+                <configuration>
46
+                    <layout>ZIP</layout>
47
+                    <includeSystemScope>true</includeSystemScope>
48
+                    <mainClass>com.njyunzhi.YZCrmAdminApplication</mainClass>
49
+                    <includes>
50
+                        <include>
51
+                            <groupId>com.njyunzhi</groupId>
52
+                            <artifactId>yz_admin</artifactId>
53
+                        </include>
54
+                        <include>
55
+                            <groupId>com.njyunzhi</groupId>
56
+                            <artifactId>yz_common</artifactId>
57
+                        </include>
58
+                        <include>
59
+                            <groupId>com.njyunzhi</groupId>
60
+                            <artifactId>yz_framework</artifactId>
61
+                        </include>
62
+                        <include>
63
+                            <groupId>com.njyunzhi</groupId>
64
+                            <artifactId>yz_repository</artifactId>
65
+                        </include>
66
+                    </includes>
67
+                    <excludes>
68
+                        <exclude>
69
+                            <groupId>org.projectlombok</groupId>
70
+                            <artifactId>lombok</artifactId>
71
+                        </exclude>
72
+                    </excludes>
73
+                </configuration>
74
+                <executions>
75
+                    <execution>
76
+                        <goals>
77
+                            <goal>repackage</goal>
78
+                        </goals>
79
+                    </execution>
80
+                </executions>
81
+            </plugin>
82
+
83
+            <!-- 打包发布时,跳过单元测试 -->
84
+            <plugin>
85
+                <groupId>org.apache.maven.plugins</groupId>
86
+                <artifactId>maven-surefire-plugin</artifactId>
87
+                <configuration>
88
+                    <skipTests>true</skipTests>
89
+                </configuration>
90
+            </plugin>
91
+
92
+
93
+            <plugin>
94
+                <groupId>org.apache.maven.plugins</groupId>
95
+                <artifactId>maven-dependency-plugin</artifactId>
96
+                <executions>
97
+                    <execution>
98
+                        <id>copy-dependencies</id>
99
+                        <phase>package</phase>
100
+                        <goals>
101
+                            <goal>copy-dependencies</goal>
102
+                        </goals>
103
+                        <configuration>
104
+                            <outputDirectory>target/lib</outputDirectory>
105
+                            <stripVersion>false</stripVersion>
106
+                            <!-- 不包含哪些jar包 -->
107
+                            <excludeGroupIds>
108
+                                <!-- 只排除业务模块相关的jar包,多个用英文逗号分割-->
109
+                                com.njyunzhi
110
+                            </excludeGroupIds>
111
+                        </configuration>
112
+                    </execution>
113
+                </executions>
114
+            </plugin>
115
+
116
+            <plugin>
117
+                <groupId>org.apache.maven.plugins</groupId>
118
+                <artifactId>maven-resources-plugin</artifactId>
119
+                <executions>
120
+                    <execution>
121
+                        <id>copy-resources</id>
122
+                        <phase>package</phase>
123
+                        <goals>
124
+                            <goal>copy-resources</goal>
125
+                        </goals>
126
+                        <configuration>
127
+                            <outputDirectory>target/config</outputDirectory>
128
+                            <resources>
129
+                                <resource>
130
+                                    <directory>./src/main/resources</directory>
131
+                                </resource>
132
+                            </resources>
133
+                        </configuration>
134
+                    </execution>
135
+                </executions>
136
+            </plugin>
137
+
138
+        </plugins>
139
+    </build>
140
+</project>

+ 24
- 0
admin/src/main/java/com/njyunzhi/YZCrmAdminApplication.java Wyświetl plik

@@ -0,0 +1,24 @@
1
+package com.njyunzhi;
2
+
3
+import com.njyunzhi.framework.util.SpringContextUtil;
4
+import org.mybatis.spring.annotation.MapperScan;
5
+import org.springframework.boot.SpringApplication;
6
+import org.springframework.boot.autoconfigure.SpringBootApplication;
7
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
8
+import org.springframework.context.ConfigurableApplicationContext;
9
+import org.springframework.scheduling.annotation.EnableAsync;
10
+import org.springframework.scheduling.annotation.EnableScheduling;
11
+import org.springframework.transaction.annotation.EnableTransactionManagement;
12
+
13
+@EnableAsync
14
+@EnableScheduling
15
+@EnableTransactionManagement
16
+@EnableConfigurationProperties
17
+@MapperScan({"com.njyunzhi.**.mapper"})
18
+@SpringBootApplication(scanBasePackages = {"com.njyunzhi"})
19
+public class YZCrmAdminApplication {
20
+    public static void main(String[] args) {
21
+        ConfigurableApplicationContext ac = SpringApplication.run(YZCrmAdminApplication.class, args);
22
+        SpringContextUtil.setAc(ac);
23
+    }
24
+}

+ 21
- 0
admin/src/main/java/com/njyunzhi/admin/common/Constants.java Wyświetl plik

@@ -0,0 +1,21 @@
1
+package com.njyunzhi.admin.common;
2
+
3
+//import com.njyunzhi.repository.entity.TaOrder;
4
+
5
+public class Constants {
6
+    public final static String ROOT_ID = "1";    // 超级管理员ID
7
+    public final static String ROOT_TREE = "-1";  // 树根
8
+    public final static String ROOT_ORG = "1";   // 顶级机构
9
+
10
+    public final static int STATUS_READY = 0;
11
+    public final static int STATUS_NORMAL = 1;
12
+
13
+//    TaOrder 表中的  bill_type 字段值
14
+    public final static String TA_ORDER_CONSUME = "consume";    //消费
15
+    public final static String TA_ORDER_REFUND = "refund";      //退款
16
+    public final static String TA_ORDER_RECHARGE = "recharge";  //充值-开卡
17
+    public final static String TA_ORDER_WITHDRAW = "withdraw";  //提现
18
+
19
+    // 账户登录
20
+    public final static String LOGIN_TYPE_ACCOUNT = "account";
21
+}

+ 41
- 0
admin/src/main/java/com/njyunzhi/admin/controller/CommController.java Wyświetl plik

@@ -0,0 +1,41 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+
4
+import cn.dev33.satoken.util.SaResult;
5
+import com.njyunzhi.common.util.FileUtil;
6
+import com.njyunzhi.common.util.aliyun.oss.OssUtil;
7
+import com.njyunzhi.framework.accesslimit.AccessLimit;
8
+import com.njyunzhi.repository.BaseController;
9
+import io.swagger.annotations.Api;
10
+import io.swagger.annotations.ApiOperation;
11
+import org.springframework.beans.factory.annotation.Autowired;
12
+import org.springframework.web.bind.annotation.GetMapping;
13
+import org.springframework.web.bind.annotation.RequestMapping;
14
+import org.springframework.web.bind.annotation.RestController;
15
+
16
+import java.io.IOException;
17
+
18
+@Api(tags = "部分通用接口")
19
+@RestController
20
+@RequestMapping("/")
21
+public class CommController extends BaseController {
22
+
23
+    @Autowired
24
+    FileUtil fileUtil;
25
+
26
+    @Autowired
27
+    OssUtil ossUtil;
28
+
29
+
30
+    @AccessLimit()
31
+    @ApiOperation("上传文件")
32
+    @GetMapping("/{client}/upload/policy")
33
+    public SaResult getUploadPolicy() throws IOException {
34
+
35
+        OssUtil.PolicyResponse policy = ossUtil.getPolicy();
36
+
37
+        return SaResult.data(policy);
38
+    }
39
+
40
+
41
+}

+ 135
- 0
admin/src/main/java/com/njyunzhi/admin/controller/FxTenantController.java Wyświetl plik

@@ -0,0 +1,135 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
+import com.njyunzhi.admin.service.FxTenantService;
8
+import com.njyunzhi.common.util.StringUtil;
9
+import com.njyunzhi.framework.accesslimit.AccessLimit;
10
+import com.njyunzhi.framework.log.OpLog;
11
+import com.njyunzhi.repository.BaseController;
12
+import com.njyunzhi.repository.entity.FxTenant;
13
+import io.swagger.annotations.Api;
14
+import io.swagger.annotations.ApiOperation;
15
+import io.swagger.annotations.ApiParam;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.validation.annotation.Validated;
18
+import org.springframework.web.bind.annotation.*;
19
+
20
+/**
21
+ * 租户表;(fx_tenant)表控制层
22
+ *
23
+ * @author : http://njyunzhi.com
24
+ * @date : 2023-11-15
25
+ */
26
+@Api(tags = "租户表对象功能接口")
27
+@RestController
28
+@RequestMapping("/admin")
29
+public class FxTenantController extends BaseController {
30
+
31
+    @Autowired
32
+    private FxTenantService fxTenantService;
33
+
34
+    /**
35
+     * 通过ID查询单条数据
36
+     *
37
+     * @param id 主键
38
+     * @return 实例对象
39
+     */
40
+    @OpLog(module = "租户表", action = "查询单条数据", desc = "ID:{{#id}}")
41
+    @AccessLimit()
42
+    @ApiOperation("通过ID查询单条数据")
43
+    @GetMapping("/fxTenant/{id}")
44
+    public SaResult queryById(@ApiParam("对象ID") @PathVariable String id) throws Exception {
45
+        return SaResult.data(fxTenantService.getById(id));
46
+    }
47
+
48
+    /**
49
+     * 分页查询
50
+     *
51
+     * @param pageNum  当前页码
52
+     * @param pageSize 每页条数
53
+     * @return 查询结果
54
+     */
55
+    @OpLog(module = "租户表", action = "分页列表查询")
56
+    @AccessLimit()
57
+    @ApiOperation("分页查询")
58
+    @GetMapping("/fxTenant")
59
+    public SaResult list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
60
+                         @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
61
+                         @ApiParam("状态") @RequestParam(value = "status", required = false) String status,
62
+                         @ApiParam("手机号") @RequestParam(value = "phone", required = false) String phone,
63
+                         @ApiParam("租户名称") @RequestParam(value = "tenantName", required = false) String tenantName,
64
+                         @ApiParam("租户编号") @RequestParam(value = "tenantCode", required = false) String tenantCode,
65
+                         @ApiParam("开始时间") @RequestParam(value = "startTime", required = false) String startTime,
66
+                         @ApiParam("结束时间") @RequestParam(value = "endTime", required = false) String endTime,
67
+                         @ApiParam("正序排列") @RequestParam(value = "sortAsc", required = false) String sortAsc,
68
+                         @ApiParam("倒序排列") @RequestParam(value = "sortDesc", defaultValue = "created_at") String sortDesc) throws Exception {
69
+
70
+        IPage<FxTenant> pg = new Page<>(pageNum, pageSize);
71
+        QueryWrapper<FxTenant> queryWrapper = new QueryWrapper<>();
72
+        String tenantId = getTenantId();
73
+//        queryWrapper.ge(StringUtil.isNotEmpty(startTime),"start_time",startTime).
74
+        queryWrapper.eq("tenant_id",tenantId);
75
+        queryWrapper.ge(!StringUtil.isEmpty(startTime), "DATE_FORMAT(start_time,'%Y-%m-%d')", startTime)
76
+                .le(!StringUtil.isEmpty(endTime), "DATE_FORMAT(end_time,'%Y-%m-%d')", endTime);
77
+        queryWrapper.eq(StringUtil.isNotEmpty(status), "status", status);
78
+        queryWrapper.like(StringUtil.isNotEmpty(phone), "phone", phone);
79
+        queryWrapper.like(StringUtil.isNotEmpty(tenantName), "tenant_name", tenantName);
80
+        queryWrapper.like(StringUtil.isNotEmpty(tenantCode), "tenant_code", tenantCode);
81
+        queryWrapper.orderByAsc(StringUtil.isNotEmpty(sortAsc), StringUtil.humpToLine(sortAsc));
82
+        queryWrapper.orderByDesc(StringUtil.isNotEmpty(sortDesc), StringUtil.humpToLine(sortDesc));
83
+        IPage<FxTenant> result = fxTenantService.page(pg, queryWrapper);
84
+
85
+        return SaResult.data(result);
86
+    }
87
+
88
+    /**
89
+     * 新增数据
90
+     *
91
+     * @param fxTenant 实例对象
92
+     * @return 实例对象
93
+     */
94
+    @OpLog(module = "租户表", action = "新增数据")
95
+    @AccessLimit()
96
+    @ApiOperation("新增数据")
97
+    @PostMapping("/fxTenant")
98
+    public SaResult add(@ApiParam("对象实体") @Validated @RequestBody FxTenant fxTenant) throws Exception {
99
+        String tenantId = getTenantId();
100
+        fxTenant.setTenantId(tenantId);
101
+        fxTenantService.save(fxTenant);
102
+        return SaResult.data(fxTenant);
103
+    }
104
+
105
+    /**
106
+     * 更新数据
107
+     *
108
+     * @param fxTenant 实例对象
109
+     * @return 实例对象
110
+     */
111
+    @OpLog(module = "租户表", action = "更新数据")
112
+    @AccessLimit()
113
+    @ApiOperation("更新数据")
114
+    @PutMapping("/fxTenant/{id}")
115
+    public SaResult edit(@ApiParam("对象实体") @Validated @RequestBody FxTenant fxTenant,
116
+                         @ApiParam("对象ID") @PathVariable String id) throws Exception {
117
+        fxTenantService.updateById(fxTenant);
118
+        return SaResult.data(fxTenant);
119
+    }
120
+
121
+    /**
122
+     * 通过主键删除数据
123
+     *
124
+     * @param id 主键
125
+     * @return 是否成功
126
+     */
127
+    @OpLog(module = "租户表", action = "删除数据", desc = "ID:{{#id}}")
128
+    @AccessLimit()
129
+    @ApiOperation("通过主键删除数据")
130
+    @DeleteMapping("/fxTenant/{id}")
131
+    public SaResult deleteById(@ApiParam("对象ID") @PathVariable String id) {
132
+        fxTenantService.removeById(id);
133
+        return SaResult.data("success");
134
+    }
135
+}

+ 118
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysDeptController.java Wyświetl plik

@@ -0,0 +1,118 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
+import com.njyunzhi.admin.service.SysDeptService;
8
+import com.njyunzhi.common.util.StringUtil;
9
+import com.njyunzhi.framework.accesslimit.AccessLimit;
10
+import com.njyunzhi.framework.log.OpLog;
11
+import com.njyunzhi.repository.BaseController;
12
+import com.njyunzhi.repository.entity.SysDept;
13
+import io.swagger.annotations.Api;
14
+import io.swagger.annotations.ApiOperation;
15
+import io.swagger.annotations.ApiParam;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.validation.annotation.Validated;
18
+import org.springframework.web.bind.annotation.*;
19
+
20
+/**
21
+ * 部门表;(sys_dept)表控制层
22
+ *
23
+ * @author : http://njyunzhi.com
24
+ * @date : 2024-2-26
25
+ */
26
+@Api(tags = "部门表对象功能接口")
27
+@RestController
28
+@RequestMapping("/")
29
+public class SysDeptController extends BaseController {
30
+
31
+    @Autowired
32
+    private SysDeptService sysDeptService;
33
+
34
+    /**
35
+     * 通过ID查询单条数据
36
+     *
37
+     * @param id 主键
38
+     * @return 实例对象
39
+     */
40
+    @OpLog(module = "部门表", action = "查询单条数据", desc = "ID:{{#id}}")
41
+    @AccessLimit()
42
+    @ApiOperation("通过ID查询单条数据")
43
+    @GetMapping("/sysDept/{id}")
44
+    public SaResult queryById(@ApiParam("对象ID") @PathVariable String id) throws Exception {
45
+        return SaResult.data(sysDeptService.getById(id));
46
+    }
47
+
48
+    /**
49
+     * 分页查询
50
+     *
51
+     * @param pageNum  当前页码
52
+     * @param pageSize 每页条数
53
+     * @return 查询结果
54
+     */
55
+    @OpLog(module = "部门表", action = "分页列表查询")
56
+    @AccessLimit()
57
+    @ApiOperation("分页查询")
58
+    @GetMapping("/sysDept")
59
+    public SaResult list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
60
+                         @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
61
+                         @ApiParam("正序排列") @RequestParam(value = "sortAsc", required = false) String sortAsc,
62
+                         @ApiParam("倒序排列") @RequestParam(value = "sortDesc", defaultValue = "created_at") String sortDesc) throws Exception {
63
+
64
+        IPage<SysDept> pg = new Page<>(pageNum, pageSize);
65
+        QueryWrapper<SysDept> queryWrapper = new QueryWrapper<>();
66
+        queryWrapper.orderByAsc(StringUtil.isNotEmpty(sortAsc), StringUtil.humpToLine(sortAsc));
67
+        queryWrapper.orderByDesc(StringUtil.isNotEmpty(sortDesc), StringUtil.humpToLine(sortDesc));
68
+        IPage<SysDept> result = sysDeptService.page(pg, queryWrapper);
69
+
70
+        return SaResult.data(result);
71
+    }
72
+
73
+    /**
74
+     * 新增数据
75
+     *
76
+     * @param sysDept 实例对象
77
+     * @return 实例对象
78
+     */
79
+    @OpLog(module = "部门表", action = "新增数据")
80
+    @AccessLimit()
81
+    @ApiOperation("新增数据")
82
+    @PostMapping("/sysDept")
83
+    public SaResult add(@ApiParam("对象实体") @Validated @RequestBody SysDept sysDept) throws Exception {
84
+        sysDeptService.save(sysDept);
85
+        return SaResult.data(sysDept);
86
+    }
87
+
88
+    /**
89
+     * 更新数据
90
+     *
91
+     * @param sysDept 实例对象
92
+     * @return 实例对象
93
+     */
94
+    @OpLog(module = "部门表", action = "更新数据")
95
+    @AccessLimit()
96
+    @ApiOperation("更新数据")
97
+    @PutMapping("/sysDept/{id}")
98
+    public SaResult edit(@ApiParam("对象实体") @Validated @RequestBody SysDept sysDept,
99
+                         @ApiParam("对象ID") @PathVariable String id) throws Exception {
100
+        sysDeptService.updateById(sysDept);
101
+        return SaResult.data(sysDept);
102
+    }
103
+
104
+    /**
105
+     * 通过主键删除数据
106
+     *
107
+     * @param id 主键
108
+     * @return 是否成功
109
+     */
110
+    @OpLog(module = "部门表", action = "删除数据", desc = "ID:{{#id}}")
111
+    @AccessLimit()
112
+    @ApiOperation("通过主键删除数据")
113
+    @DeleteMapping("/sysDept/{id}")
114
+    public SaResult deleteById(@ApiParam("对象ID") @PathVariable String id) {
115
+        sysDeptService.removeById(id);
116
+        return SaResult.data("success");
117
+    }
118
+}

+ 71
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysLogController.java Wyświetl plik

@@ -0,0 +1,71 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
+import com.njyunzhi.admin.service.SysLogService;
8
+import com.njyunzhi.common.util.DateUtil;
9
+import com.njyunzhi.common.util.StringUtil;
10
+import com.njyunzhi.repository.BaseController;
11
+import com.njyunzhi.repository.entity.SysLog;
12
+import io.swagger.annotations.Api;
13
+import io.swagger.annotations.ApiOperation;
14
+import io.swagger.annotations.ApiParam;
15
+import org.springframework.beans.factory.annotation.Autowired;
16
+import org.springframework.web.bind.annotation.GetMapping;
17
+import org.springframework.web.bind.annotation.RequestMapping;
18
+import org.springframework.web.bind.annotation.RequestParam;
19
+import org.springframework.web.bind.annotation.RestController;
20
+
21
+import java.time.LocalDateTime;
22
+
23
+ /**
24
+ * 系统日志;(sys_log)表控制层
25
+ * @author : http://njyunzhi.com
26
+ * @date : 2023-10-25
27
+ */
28
+@Api(tags = "系统日志对象功能接口")
29
+@RestController
30
+@RequestMapping("/admin")
31
+public class SysLogController extends BaseController {
32
+
33
+     @Autowired
34
+     private SysLogService sysLogService;
35
+
36
+     /**
37
+      * 分页查询
38
+      *
39
+      * @param pageNum  当前页码
40
+      * @param pageSize 每页条数
41
+      * @return 查询结果
42
+      */
43
+     @ApiOperation("分页查询")
44
+     @GetMapping("/sysLog")
45
+     public SaResult list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
46
+                          @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
47
+                          @ApiParam("终端类型") @RequestParam(value = "clientType", required = false) String clientType,
48
+                          @ApiParam("开始日期") @RequestParam(value = "startDate", required = false) String startDate,
49
+                          @ApiParam("结束日期") @RequestParam(value = "endDate", required = false) String endDate,
50
+                          @ApiParam("模块") @RequestParam(value = "moduleName", required = false) String moduleName,
51
+                          @ApiParam("操作人") @RequestParam(value = "userName", required = false) String userName) throws Exception {
52
+
53
+         LocalDateTime start = null;
54
+         LocalDateTime end = null;
55
+         if (StringUtil.isNotEmpty(startDate)) {
56
+             start = DateUtil.day2LocalDateime(startDate);
57
+             end = DateUtil.day2LocalDateime(endDate).withHour(23).withMinute(59).withSecond(59);
58
+         }
59
+
60
+         IPage<SysLog> pg = new Page<>(pageNum, pageSize);
61
+         QueryWrapper<SysLog> queryWrapper = new QueryWrapper<>();
62
+         queryWrapper.eq(StringUtil.isNotEmpty(clientType), "client_type", clientType);
63
+         queryWrapper.like(StringUtil.isNotEmpty(moduleName), "module_name", moduleName);
64
+         queryWrapper.like(StringUtil.isNotEmpty(userName), "user_name", userName);
65
+         queryWrapper.between(null != start, "created_at", start, end);
66
+         queryWrapper.orderByDesc("created_at");
67
+         IPage<SysLog> result = sysLogService.page(pg, queryWrapper);
68
+
69
+         return SaResult.data(result);
70
+     }
71
+}

+ 102
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysLoginController.java Wyświetl plik

@@ -0,0 +1,102 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.stp.StpUtil;
4
+import cn.dev33.satoken.util.SaResult;
5
+import com.njyunzhi.admin.dto.ChangePasswordDTO;
6
+import com.njyunzhi.admin.dto.LoginDTO;
7
+import com.njyunzhi.admin.service.FxTenantService;
8
+import com.njyunzhi.admin.service.SysLoginService;
9
+import com.njyunzhi.common.util.StringUtil;
10
+import com.njyunzhi.repository.BaseController;
11
+import com.njyunzhi.repository.entity.FxTenant;
12
+import com.njyunzhi.repository.entity.SysUser;
13
+import io.swagger.annotations.Api;
14
+import io.swagger.annotations.ApiOperation;
15
+import io.swagger.annotations.ApiParam;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.web.bind.annotation.*;
18
+
19
+import java.util.HashMap;
20
+import java.util.Map;
21
+
22
+/**
23
+ * 登录信息表;(sys_login)表控制层
24
+ *
25
+ * @author : http://njyunzhi.com
26
+ * @date : 2023-10-25
27
+ */
28
+@Api(tags = "登录信息表对象功能接口")
29
+@RestController
30
+@RequestMapping("/admin")
31
+public class SysLoginController extends BaseController {
32
+
33
+    @Autowired
34
+    private SysLoginService sysLoginService;
35
+    @Autowired
36
+    private FxTenantService fxTenantService;
37
+
38
+    @PostMapping("/login")
39
+    @ApiOperation(value = "后台登录", notes = "后台登录", httpMethod = "POST", response = SaResult.class)
40
+    public SaResult login(@ApiParam("登录参数") @RequestBody LoginDTO loginParm) throws Exception {
41
+        FxTenant fxTenant = fxTenantService.getById(loginParm.getTenantId());
42
+        if (fxTenant == null) {
43
+            throw new Exception("沒有此租戶");
44
+        }
45
+        if (fxTenant.getStatus().equals(0)) {
46
+            throw new Exception("未激活");
47
+
48
+        }
49
+
50
+        if (fxTenant.getStatus().equals(2)) {
51
+            throw new Exception("停用");
52
+
53
+        }
54
+
55
+
56
+        if (StringUtil.isEmpty(loginParm.getTenantId())) {
57
+            throw new Exception("所属租户不能为空");
58
+        }
59
+
60
+        if (StringUtil.isEmpty(loginParm.getLoginName()) || StringUtil.isEmpty(loginParm.getPassword())) {
61
+            return SaResult.error("登录用户或者密码不能为空");
62
+        }
63
+
64
+        SysUser sysUser = sysLoginService.login(loginParm,fxTenant.getTenantId());
65
+
66
+        StpUtil.login(sysUser.getUserId());
67
+        String tokenValue = StpUtil.getTokenValue();
68
+
69
+        Map<String, Object> result = new HashMap<>();
70
+        result.put("user", sysUser);
71
+        result.put("token", tokenValue);
72
+
73
+        return SaResult.data(result);
74
+    }
75
+
76
+    @PostMapping("/logout")
77
+    @ApiOperation(value = "登出", notes = "登出", httpMethod = "POST", response = SaResult.class)
78
+    public SaResult logout() throws Exception {
79
+        SysUser sysUser = (SysUser) currentUser();
80
+        StpUtil.logout(sysUser.getUserId());
81
+        return SaResult.ok();
82
+    }
83
+
84
+
85
+    @PutMapping("/change-password")
86
+    @ApiOperation(value = "修改密码", notes = "修改密码", httpMethod = "PUT", response = SaResult.class)
87
+    public SaResult changePassword(@ApiParam("修改密码参数") @RequestBody ChangePasswordDTO param) throws Exception {
88
+        if (StringUtil.isEmpty(param.getOriginPassword()) || StringUtil.isEmpty(param.getNewPassword())) {
89
+            return SaResult.error("原始密码或新密码不能为空");
90
+        }
91
+
92
+        SysUser sysUser = (SysUser) currentUser();
93
+
94
+        boolean isOk = sysLoginService.changePassword(sysUser, param);
95
+        if (!isOk) {
96
+            SaResult.error("修改失败, 请重试");
97
+        }
98
+
99
+        return SaResult.ok("密码修改成功");
100
+    }
101
+
102
+}

+ 54
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysMenuController.java Wyświetl plik

@@ -0,0 +1,54 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
+import com.njyunzhi.admin.service.SysMenuService;
8
+import com.njyunzhi.framework.log.OpLog;
9
+import com.njyunzhi.repository.BaseController;
10
+import com.njyunzhi.repository.entity.SysMenu;
11
+import io.swagger.annotations.Api;
12
+import io.swagger.annotations.ApiOperation;
13
+import io.swagger.annotations.ApiParam;
14
+import org.springframework.beans.factory.annotation.Autowired;
15
+import org.springframework.web.bind.annotation.GetMapping;
16
+import org.springframework.web.bind.annotation.RequestMapping;
17
+import org.springframework.web.bind.annotation.RequestParam;
18
+import org.springframework.web.bind.annotation.RestController;
19
+
20
+ /**
21
+ * 菜单表;(sys_menu)表控制层
22
+ * @author : http://njyunzhi.com
23
+ * @date : 2023-10-25
24
+ */
25
+@Api(tags = "菜单表对象功能接口")
26
+@RestController
27
+@RequestMapping("/admin")
28
+public class SysMenuController extends BaseController {
29
+
30
+     @Autowired
31
+     private SysMenuService sysMenuService;
32
+
33
+     /**
34
+      * 分页查询
35
+      *
36
+      * @param pageNum  当前页码
37
+      * @param pageSize 每页条数
38
+      * @return 查询结果
39
+      */
40
+     @OpLog(module = "菜单管理", action = "查询列表")
41
+     @ApiOperation("分页查询")
42
+     @GetMapping("/sysMenu")
43
+     public SaResult list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
44
+                          @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) throws Exception {
45
+
46
+         IPage<SysMenu> pg = new Page<>(pageNum, pageSize);
47
+         QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
48
+         queryWrapper.orderByAsc("sort_no");
49
+
50
+         IPage<SysMenu> result = sysMenuService.page(pg, queryWrapper);
51
+
52
+         return SaResult.data(result);
53
+     }
54
+}

+ 122
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysRoleController.java Wyświetl plik

@@ -0,0 +1,122 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
+import com.njyunzhi.admin.service.SysRoleService;
8
+import com.njyunzhi.common.util.StringUtil;
9
+import com.njyunzhi.framework.accesslimit.AccessLimit;
10
+import com.njyunzhi.framework.log.OpLog;
11
+import com.njyunzhi.repository.BaseController;
12
+import com.njyunzhi.repository.entity.SysRole;
13
+import io.swagger.annotations.Api;
14
+import io.swagger.annotations.ApiOperation;
15
+import io.swagger.annotations.ApiParam;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.validation.annotation.Validated;
18
+import org.springframework.web.bind.annotation.*;
19
+
20
+/**
21
+ * 系统角色;(sys_role)表控制层
22
+ *
23
+ * @author : http://njyunzhi.com
24
+ * @date : 2023-10-25
25
+ */
26
+@Api(tags = "系统角色对象功能接口")
27
+@RestController
28
+@RequestMapping("/admin")
29
+public class SysRoleController extends BaseController {
30
+
31
+    @Autowired
32
+    private SysRoleService sysRoleService;
33
+
34
+    /**
35
+     * 通过ID查询单条数据
36
+     *
37
+     * @param id 主键
38
+     * @return 实例对象
39
+     */
40
+    @OpLog(module = "系统角色", action = "查询单条数据", desc = "ID:{{#id}}")
41
+    @AccessLimit()
42
+    @ApiOperation("通过ID查询单条数据")
43
+    @GetMapping("/sysRole/{id}")
44
+    public SaResult queryById(@ApiParam("对象ID") @PathVariable String id) throws Exception {
45
+        return SaResult.data(sysRoleService.getById(id));
46
+    }
47
+
48
+    /**
49
+     * 分页查询
50
+     *
51
+     * @param pageNum  当前页码
52
+     * @param pageSize 每页条数
53
+     * @return 查询结果
54
+     */
55
+    @OpLog(module = "系统角色", action = "分页列表查询")
56
+    @AccessLimit()
57
+    @ApiOperation("分页查询")
58
+    @GetMapping("/sysRole")
59
+    public SaResult list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
60
+                         @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
61
+                         @ApiParam("正序排列") @RequestParam(value = "sortAsc", required = false) String sortAsc,
62
+                         @ApiParam("倒序排列") @RequestParam(value = "sortDesc", defaultValue = "created_at") String sortDesc) throws Exception {
63
+        String tenantId = getTenantId();
64
+        IPage<SysRole> pg = new Page<>(pageNum, pageSize);
65
+        QueryWrapper<SysRole> queryWrapper = new QueryWrapper<>();
66
+        queryWrapper.eq("tenant_id", tenantId);
67
+        queryWrapper.orderByAsc(StringUtil.isNotEmpty(sortAsc), StringUtil.humpToLine(sortAsc));
68
+        queryWrapper.orderByDesc(StringUtil.isNotEmpty(sortDesc), StringUtil.humpToLine(sortDesc));
69
+        IPage<SysRole> result = sysRoleService.page(pg, queryWrapper);
70
+
71
+        return SaResult.data(result);
72
+    }
73
+
74
+    /**
75
+     * 新增数据
76
+     *
77
+     * @param sysRole 实例对象
78
+     * @return 实例对象
79
+     */
80
+    @OpLog(module = "系统角色", action = "新增数据")
81
+    @AccessLimit()
82
+    @ApiOperation("新增数据")
83
+    @PostMapping("/sysRole")
84
+    public SaResult add(@ApiParam("对象实体") @Validated @RequestBody SysRole sysRole) throws Exception {
85
+        String tenantId = getTenantId();
86
+        sysRole.setTenantId(tenantId);
87
+        sysRoleService.save(sysRole);
88
+        return SaResult.data(sysRole);
89
+    }
90
+
91
+    /**
92
+     * 更新数据
93
+     *
94
+     * @param sysRole 实例对象
95
+     * @return 实例对象
96
+     */
97
+    @OpLog(module = "系统角色", action = "更新数据")
98
+    @AccessLimit()
99
+    @ApiOperation("更新数据")
100
+    @PutMapping("/sysRole/{id}")
101
+    public SaResult edit(@ApiParam("对象实体") @Validated @RequestBody SysRole sysRole,
102
+                         @ApiParam("对象ID") @PathVariable String id) throws Exception {
103
+        sysRole.setRoleId(id);
104
+        sysRoleService.updateById(sysRole);
105
+        return SaResult.data(sysRole);
106
+    }
107
+
108
+    /**
109
+     * 通过主键删除数据
110
+     *
111
+     * @param id 主键
112
+     * @return 是否成功
113
+     */
114
+    @OpLog(module = "系统角色", action = "删除数据", desc = "ID:{{#id}}")
115
+    @AccessLimit()
116
+    @ApiOperation("通过主键删除数据")
117
+    @DeleteMapping("/sysRole/{id}")
118
+    public SaResult deleteById(@ApiParam("对象ID") @PathVariable String id) {
119
+        sysRoleService.removeById(id);
120
+        return SaResult.data("success");
121
+    }
122
+}

+ 158
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysRoleResourceController.java Wyświetl plik

@@ -0,0 +1,158 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
+import com.njyunzhi.admin.service.SysRoleResourceService;
8
+import com.njyunzhi.common.util.StringUtil;
9
+import com.njyunzhi.framework.accesslimit.AccessLimit;
10
+import com.njyunzhi.framework.log.OpLog;
11
+import com.njyunzhi.repository.BaseController;
12
+import com.njyunzhi.repository.entity.SysRoleResource;
13
+import io.swagger.annotations.Api;
14
+import io.swagger.annotations.ApiOperation;
15
+import io.swagger.annotations.ApiParam;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.validation.annotation.Validated;
18
+import org.springframework.web.bind.annotation.*;
19
+
20
+import java.util.List;
21
+
22
+ /**
23
+ * 角色资源;(sys_role_resource)表控制层
24
+ * @author : http://njyunzhi.com
25
+ * @date : 2023-10-25
26
+ */
27
+@Api(tags = "角色资源对象功能接口")
28
+@RestController
29
+@RequestMapping("/admin")
30
+public class SysRoleResourceController extends BaseController {
31
+    
32
+    @Autowired
33
+    private SysRoleResourceService sysRoleResourceService;
34
+    
35
+    /** 
36
+     * 通过ID查询单条数据 
37
+     *
38
+     * @param id 主键
39
+     * @return 实例对象
40
+     */
41
+    @OpLog(module = "角色资源", action = "查询单条数据", desc = "ID:{{#id}}")
42
+    @AccessLimit()
43
+    @ApiOperation("通过ID查询单条数据")
44
+    @GetMapping("/sysRoleResource/{id}")
45
+    public SaResult queryById(@ApiParam("对象ID") @PathVariable String id) throws Exception {
46
+        return SaResult.data(sysRoleResourceService.getById(id));
47
+    }
48
+    
49
+    /** 
50
+     * 分页查询
51
+     *
52
+     * @param pageNum 当前页码
53
+     * @param pageSize 每页条数
54
+     * @return 查询结果
55
+     */
56
+    @OpLog(module = "角色资源", action = "分页列表查询")
57
+    @AccessLimit()
58
+    @ApiOperation("分页查询")
59
+    @GetMapping("/sysRoleResource")
60
+    public SaResult list(@ApiParam("页码") @RequestParam(value ="pageNum",defaultValue = "1") Integer pageNum,
61
+                            @ApiParam("单页数据量") @RequestParam(value ="pageSize",defaultValue = "10") Integer pageSize,
62
+                            @ApiParam("正序排列") @RequestParam(value ="sortAsc", required = false) String sortAsc,
63
+                         @ApiParam("倒序排列") @RequestParam(value ="sortDesc", defaultValue = "created_at") String sortDesc) throws Exception {
64
+        
65
+        IPage<SysRoleResource> pg = new Page<>(pageNum, pageSize);
66
+        QueryWrapper<SysRoleResource> queryWrapper = new QueryWrapper<>();
67
+        queryWrapper.orderByAsc(StringUtil.isNotEmpty(sortAsc), StringUtil.humpToLine(sortAsc));
68
+        queryWrapper.orderByDesc(StringUtil.isNotEmpty(sortDesc), StringUtil.humpToLine(sortDesc));
69
+        IPage<SysRoleResource> result = sysRoleResourceService.page(pg, queryWrapper);
70
+        
71
+        return SaResult.data(result);
72
+    }
73
+    
74
+    /** 
75
+     * 新增数据
76
+     *
77
+     * @param sysRoleResource 实例对象
78
+     * @return 实例对象
79
+     */
80
+    @OpLog(module = "角色资源", action = "新增数据")
81
+    @AccessLimit()
82
+    @ApiOperation("新增数据")
83
+    @PostMapping("/sysRoleResource")
84
+    public SaResult add(@ApiParam("对象实体") @Validated @RequestBody SysRoleResource sysRoleResource) throws Exception {
85
+        sysRoleResourceService.save(sysRoleResource);
86
+        return SaResult.data(sysRoleResource);
87
+    }
88
+    
89
+    /** 
90
+     * 更新数据
91
+     *
92
+     * @param sysRoleResource 实例对象
93
+     * @return 实例对象
94
+     */
95
+    @OpLog(module = "角色资源", action = "更新数据")
96
+    @AccessLimit()
97
+    @ApiOperation("更新数据")
98
+    @PutMapping("/sysRoleResource/{id}")
99
+    public SaResult edit(@ApiParam("对象实体") @Validated @RequestBody SysRoleResource sysRoleResource,
100
+                            @ApiParam("对象ID") @PathVariable String id ) throws Exception {
101
+        sysRoleResourceService.updateById(sysRoleResource);
102
+        return SaResult.data(sysRoleResource);
103
+    }
104
+    
105
+    /** 
106
+     * 通过主键删除数据
107
+     *
108
+     * @param id 主键
109
+     * @return 是否成功
110
+     */
111
+    @OpLog(module = "角色资源", action = "删除数据", desc = "ID:{{#id}}")
112
+    @AccessLimit()
113
+    @ApiOperation("通过主键删除数据")
114
+    @DeleteMapping("/sysRoleResource/{id}")
115
+    public SaResult deleteById(@ApiParam("对象ID") @PathVariable String id){
116
+        sysRoleResourceService.removeById(id);
117
+        return SaResult.data("success");
118
+    }
119
+
120
+
121
+     /**
122
+      * 授权资源
123
+      *
124
+      * @param roleId            角色ID
125
+      * @param roleResourcesList 授权列表
126
+      * @return 实例对象
127
+      */
128
+     @OpLog(module = "角色管理", action = "授权资源")
129
+     @ApiOperation("授权资源, 包含编辑")
130
+     @PostMapping("/role/{roleId}/resources")
131
+     public SaResult authResource(@ApiParam("角色ID") @PathVariable String roleId,
132
+                                  @ApiParam("授权列表") @RequestBody List<SysRoleResource> roleResourcesList) throws Exception {
133
+         if (null == roleResourcesList) {
134
+             return SaResult.error("未找到授权对象");
135
+         }
136
+
137
+         sysRoleResourceService.mergeData(roleId, roleResourcesList);
138
+         return SaResult.data(roleResourcesList);
139
+     }
140
+
141
+     /**
142
+      * 获取授权资源
143
+      *
144
+      * @param roleId            角色ID
145
+      * @return 实例对象
146
+      */
147
+     @OpLog(module = "角色管理", action = "获取授权资源")
148
+     @ApiOperation("获取授权资源")
149
+     @GetMapping("/role/{roleId}/resources")
150
+     public SaResult getAuthResource(@ApiParam("角色ID") @PathVariable String roleId) throws Exception {
151
+         List<SysRoleResource> roleResourcesList = sysRoleResourceService.getListByRole(roleId);
152
+         return SaResult.data(roleResourcesList);
153
+     }
154
+
155
+
156
+
157
+
158
+}

+ 223
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysUserController.java Wyświetl plik

@@ -0,0 +1,223 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.stp.StpUtil;
4
+import cn.dev33.satoken.util.SaResult;
5
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6
+import com.baomidou.mybatisplus.core.metadata.IPage;
7
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
8
+import com.njyunzhi.admin.common.Constants;
9
+import com.njyunzhi.admin.dto.ResetPasswordDTO;
10
+import com.njyunzhi.admin.service.*;
11
+import com.njyunzhi.common.util.StringUtil;
12
+import com.njyunzhi.framework.accesslimit.AccessLimit;
13
+import com.njyunzhi.framework.log.OpLog;
14
+import com.njyunzhi.repository.BaseController;
15
+import com.njyunzhi.repository.entity.SysMenu;
16
+import com.njyunzhi.repository.entity.SysRole;
17
+import com.njyunzhi.repository.entity.SysUser;
18
+import io.swagger.annotations.Api;
19
+import io.swagger.annotations.ApiOperation;
20
+import io.swagger.annotations.ApiParam;
21
+import org.springframework.beans.factory.annotation.Autowired;
22
+import org.springframework.validation.annotation.Validated;
23
+import org.springframework.web.bind.annotation.*;
24
+
25
+import java.util.HashMap;
26
+import java.util.List;
27
+import java.util.Map;
28
+
29
+/**
30
+ * 用户管理;(sys_user)表控制层
31
+ *
32
+ * @author : http://njyunzhi.com
33
+ * @date : 2023-10-25
34
+ */
35
+@Api(tags = "用户管理对象功能接口")
36
+@RestController
37
+@RequestMapping("/admin")
38
+public class SysUserController extends BaseController {
39
+
40
+    @Autowired
41
+    SysUserService sysUserService;
42
+
43
+    @Autowired
44
+    SysRoleService sysRoleService;
45
+
46
+    @Autowired
47
+    SysUserRoleService sysUserRoleService;
48
+
49
+    @Autowired
50
+    SysMenuService sysMenuService;
51
+
52
+    @Autowired
53
+    SysLoginService sysLoginService;
54
+
55
+
56
+    /**
57
+     * 通过ID查询单条数据
58
+     *
59
+     * @param id 主键
60
+     * @return 实例对象
61
+     */
62
+    @OpLog(module = "人员管理", action = "查询详情")
63
+    @ApiOperation("通过ID查询单条数据")
64
+    @GetMapping("/sysUser/{id}")
65
+    public SaResult queryById(@ApiParam("对象ID") @PathVariable String id) throws Exception {
66
+        SysUser sysUser = sysUserService.getById(id);
67
+        if (null == sysUser) {
68
+            return SaResult.error("用户不存在");
69
+        }
70
+
71
+        List<SysRole> roleList = sysRoleService.getByUser(id);
72
+        sysUser.setRoleList(roleList);
73
+
74
+        return SaResult.data(sysUser);
75
+    }
76
+
77
+    @AccessLimit()
78
+    @ApiOperation("获取当前用户")
79
+    @GetMapping("/current")
80
+    public SaResult getCurrentUser() throws Exception {
81
+        boolean isLogin = StpUtil.isLogin();
82
+        if (!isLogin) {
83
+            return SaResult.error("请先登录系统");
84
+        }
85
+
86
+        Map<String, Object> result = new HashMap<>();
87
+        SysUser sysUser = (SysUser) currentUser();
88
+        List<SysMenu> menuList = sysUserService.getMneusByUser(sysUser);
89
+//         List<SysMenuButton> buttonList = sysUserService.getMenuButtonsByUser(sysUser);
90
+
91
+        result.put("user", sysUser);
92
+        result.put("menuList", menuList);
93
+//         result.put("buttonList", buttonList);
94
+        return SaResult.data(result);
95
+    }
96
+
97
+    /**
98
+     * 分页查询
99
+     *
100
+     * @param pageNum  当前页码
101
+     * @param pageSize 每页条数
102
+     * @return 查询结果
103
+     */
104
+    @OpLog(module = "人员管理", action = "查询列表")
105
+    @ApiOperation("分页查询")
106
+    @GetMapping("/sysUser")
107
+    public SaResult list(@ApiParam("页码") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
108
+                         @ApiParam("单页数据量") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
109
+                         @ApiParam("姓名") @RequestParam(value = "userName", required = false) String userName,
110
+                         @ApiParam("机构") @RequestParam(value = "deptId", required = false) String deptId,
111
+                         @ApiParam("展馆") @RequestParam(value = "hallUniqueId", required = false) String hallUniqueId,
112
+                         @ApiParam("岗位ID") @RequestParam(value = "positionId", required = false) String positionId,
113
+                         @ApiParam("手机号") @RequestParam(value = "phone", required = false) String phone,
114
+                         @ApiParam("身份") @RequestParam(value = "identityType", required = false) Integer identityType) throws Exception {
115
+        String tenantId = getTenantId();
116
+        IPage<SysUser> pg = new Page<>(pageNum, pageSize);
117
+        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
118
+        queryWrapper.eq("tenant_id", tenantId);
119
+        queryWrapper.like(!StringUtil.isEmpty(userName), "user_name", userName);
120
+        queryWrapper.eq(!StringUtil.isEmpty(deptId), "dept_id", deptId);
121
+        queryWrapper.eq(!StringUtil.isEmpty(hallUniqueId), "hall_unique_id", hallUniqueId);
122
+        queryWrapper.eq(!StringUtil.isEmpty(positionId), "position_id", positionId);
123
+        queryWrapper.like(!StringUtil.isEmpty(phone), "phone", phone);
124
+        queryWrapper.gt(null != identityType, " (identity_type & " + identityType + ") ", 0);
125
+        queryWrapper.ne("user_id", Constants.ROOT_ID);
126
+        queryWrapper.orderByDesc("created_at");
127
+        IPage<SysUser> result = sysUserService.page(pg, queryWrapper);
128
+
129
+        return SaResult.data(result);
130
+    }
131
+
132
+    /**
133
+     * 新增数据
134
+     *
135
+     * @param sysUser 实例对象
136
+     * @return 实例对象
137
+     */
138
+    @OpLog(module = "人员管理", action = "新增数据")
139
+    @ApiOperation("新增数据")
140
+    @PostMapping("/sysUser")
141
+    public SaResult add(@ApiParam("对象实体") @Validated @RequestBody SysUser sysUser) throws Exception {
142
+        String tenantId = getTenantId();
143
+
144
+        if (null == sysUser.getUserId()) {
145
+            long count = sysUserService.countBy("phone", sysUser.getPhone());
146
+            if (count > 0) {
147
+                return SaResult.error("手机号码已存在");
148
+            }
149
+        }
150
+        sysUser.setTenantId(tenantId);
151
+        sysUserService.mergeData(sysUser);
152
+
153
+        return SaResult.data(sysUserService.getById(sysUser.getUserId()));
154
+    }
155
+
156
+
157
+    /**
158
+     * 更新状态
159
+     *
160
+     * @param id 实例ID
161
+     * @return 实例对象
162
+     */
163
+    @OpLog(module = "人员管理", action = "更新状态")
164
+    @ApiOperation("更新状态")
165
+    @PutMapping("/sysUser/{id}/status")
166
+    public SaResult edit(@ApiParam("对象ID") @PathVariable String id,
167
+                         @ApiParam("页码") @RequestParam(value = "status") Integer status) throws Exception {
168
+
169
+        SysUser sysUser = sysUserService.getById(id);
170
+        sysUser.setStatus(status);
171
+
172
+        sysUserService.updateById(sysUser);
173
+
174
+        return SaResult.data(sysUser);
175
+    }
176
+
177
+
178
+    /**
179
+     * 重置密码
180
+     *
181
+     * @param id 实例ID
182
+     * @return 实例对象
183
+     */
184
+    @OpLog(module = "人员管理", action = "重置密码", desc = "人员ID: {{#id}}")
185
+    @ApiOperation("重置密码")
186
+    @PutMapping("/sysUser/{id}/password")
187
+    public SaResult resetPassword(@ApiParam("对象ID") @PathVariable String id,
188
+                                  @ApiParam("页码") @Validated @RequestBody ResetPasswordDTO newPassword) throws Exception {
189
+
190
+        SysUser sysUser = sysUserService.getById(id);
191
+        if (null == sysUser) {
192
+            return SaResult.error("人员不存在");
193
+        }
194
+
195
+        sysLoginService.resetPassword(sysUser, newPassword);
196
+        return SaResult.data(sysUser);
197
+    }
198
+
199
+    /**
200
+     * 通过主键删除数据
201
+     *
202
+     * @param id 主键
203
+     * @return 是否成功
204
+     */
205
+    @OpLog(module = "人员管理", action = "删除数据")
206
+    @ApiOperation("通过主键删除数据")
207
+    @DeleteMapping("/sysUser/{id}")
208
+    public SaResult deleteById(@ApiParam("对象ID") @PathVariable String id) {
209
+        SysUser sysUser = sysUserService.getById(id);
210
+        if (null != sysUser && sysUser.getIsAdmin() == 1) {
211
+            return SaResult.error("不能对管理员进行此操作");
212
+        }
213
+
214
+        sysUserService.removeById(id);
215
+
216
+        // 授权角色
217
+        sysUserRoleService.removeByMap(new HashMap<String, Object>() {{
218
+            put("user_id", id);
219
+        }});
220
+
221
+        return SaResult.ok("success");
222
+    }
223
+}

+ 117
- 0
admin/src/main/java/com/njyunzhi/admin/controller/SysUserRoleController.java Wyświetl plik

@@ -0,0 +1,117 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
7
+import com.njyunzhi.admin.service.SysUserRoleService;
8
+import com.njyunzhi.common.util.StringUtil;
9
+import com.njyunzhi.framework.accesslimit.AccessLimit;
10
+import com.njyunzhi.framework.log.OpLog;
11
+import com.njyunzhi.repository.BaseController;
12
+import com.njyunzhi.repository.entity.SysUserRole;
13
+import io.swagger.annotations.Api;
14
+import io.swagger.annotations.ApiOperation;
15
+import io.swagger.annotations.ApiParam;
16
+import org.springframework.beans.factory.annotation.Autowired;
17
+import org.springframework.validation.annotation.Validated;
18
+import org.springframework.web.bind.annotation.*;
19
+
20
+ /**
21
+ * 角色授权;(sys_user_role)表控制层
22
+ * @author : http://njyunzhi.com
23
+ * @date : 2023-10-26
24
+ */
25
+@Api(tags = "角色授权对象功能接口")
26
+@RestController
27
+@RequestMapping("/admin")
28
+public class SysUserRoleController extends BaseController {
29
+    
30
+    @Autowired
31
+    private SysUserRoleService sysUserRoleService;
32
+    
33
+    /** 
34
+     * 通过ID查询单条数据 
35
+     *
36
+     * @param id 主键
37
+     * @return 实例对象
38
+     */
39
+    @OpLog(module = "角色授权", action = "查询单条数据", desc = "ID:{{#id}}")
40
+    @AccessLimit()
41
+    @ApiOperation("通过ID查询单条数据")
42
+    @GetMapping("/sysUserRole/{id}")
43
+    public SaResult queryById(@ApiParam("对象ID") @PathVariable String id) throws Exception {
44
+        return SaResult.data(sysUserRoleService.getById(id));
45
+    }
46
+    
47
+    /** 
48
+     * 分页查询
49
+     *
50
+     * @param pageNum 当前页码
51
+     * @param pageSize 每页条数
52
+     * @return 查询结果
53
+     */
54
+    @OpLog(module = "角色授权", action = "分页列表查询")
55
+    @AccessLimit()
56
+    @ApiOperation("分页查询")
57
+    @GetMapping("/sysUserRole")
58
+    public SaResult list(@ApiParam("页码") @RequestParam(value ="pageNum",defaultValue = "1") Integer pageNum,
59
+                            @ApiParam("单页数据量") @RequestParam(value ="pageSize",defaultValue = "10") Integer pageSize,
60
+                            @ApiParam("正序排列") @RequestParam(value ="sortAsc", required = false) String sortAsc,
61
+                         @ApiParam("倒序排列") @RequestParam(value ="sortDesc", defaultValue = "created_at") String sortDesc) throws Exception {
62
+        
63
+        IPage<SysUserRole> pg = new Page<>(pageNum, pageSize);
64
+        QueryWrapper<SysUserRole> queryWrapper = new QueryWrapper<>();
65
+        queryWrapper.orderByAsc(StringUtil.isNotEmpty(sortAsc), StringUtil.humpToLine(sortAsc));
66
+        queryWrapper.orderByDesc(StringUtil.isNotEmpty(sortDesc), StringUtil.humpToLine(sortDesc));
67
+        IPage<SysUserRole> result = sysUserRoleService.page(pg, queryWrapper);
68
+        
69
+        return SaResult.data(result);
70
+    }
71
+    
72
+    /** 
73
+     * 新增数据
74
+     *
75
+     * @param sysUserRole 实例对象
76
+     * @return 实例对象
77
+     */
78
+    @OpLog(module = "角色授权", action = "新增数据")
79
+    @AccessLimit()
80
+    @ApiOperation("新增数据")
81
+    @PostMapping("/sysUserRole")
82
+    public SaResult add(@ApiParam("对象实体") @Validated @RequestBody SysUserRole sysUserRole) throws Exception {
83
+        sysUserRoleService.save(sysUserRole);
84
+        return SaResult.data(sysUserRole);
85
+    }
86
+    
87
+    /** 
88
+     * 更新数据
89
+     *
90
+     * @param sysUserRole 实例对象
91
+     * @return 实例对象
92
+     */
93
+    @OpLog(module = "角色授权", action = "更新数据")
94
+    @AccessLimit()
95
+    @ApiOperation("更新数据")
96
+    @PutMapping("/sysUserRole/{id}")
97
+    public SaResult edit(@ApiParam("对象实体") @Validated @RequestBody SysUserRole sysUserRole,
98
+                            @ApiParam("对象ID") @PathVariable String id ) throws Exception {
99
+        sysUserRoleService.updateById(sysUserRole);
100
+        return SaResult.data(sysUserRole);
101
+    }
102
+    
103
+    /** 
104
+     * 通过主键删除数据
105
+     *
106
+     * @param id 主键
107
+     * @return 是否成功
108
+     */
109
+    @OpLog(module = "角色授权", action = "删除数据", desc = "ID:{{#id}}")
110
+    @AccessLimit()
111
+    @ApiOperation("通过主键删除数据")
112
+    @DeleteMapping("/sysUserRole/{id}")
113
+    public SaResult deleteById(@ApiParam("对象ID") @PathVariable String id){
114
+        sysUserRoleService.removeById(id);
115
+        return SaResult.data("success");
116
+    }
117
+}

+ 99
- 0
admin/src/main/java/com/njyunzhi/admin/controller/TaPersonController.java Wyświetl plik

@@ -0,0 +1,99 @@
1
+package com.njyunzhi.admin.controller;
2
+
3
+import com.njyunzhi.admin.service.TaPersonService;
4
+import com.njyunzhi.repository.BaseController;
5
+import com.njyunzhi.repository.entity.TaPerson;
6
+import io.swagger.annotations.Api;
7
+import io.swagger.annotations.ApiOperation;
8
+import org.springframework.beans.factory.annotation.Autowired;
9
+import org.springframework.data.domain.PageImpl;
10
+import org.springframework.data.domain.PageRequest;
11
+import org.springframework.http.ResponseEntity;
12
+import org.springframework.web.bind.annotation.*;
13
+
14
+import java.util.List;
15
+
16
+/**
17
+ * 人员表;(ta_person)表控制层
18
+ *
19
+ * @author : http://www.chiner.pro
20
+ * @date : 2024-2-26
21
+ */
22
+@Api(tags = "人员表对象功能接口")
23
+@RestController
24
+@RequestMapping("/taPerson")
25
+public class TaPersonController extends BaseController {
26
+    @Autowired
27
+    private TaPersonService taPersonService;
28
+
29
+    /**
30
+     * 通过ID查询单条数据
31
+     *
32
+     * @param personId 主键
33
+     * @return 实例对象
34
+     */
35
+    @ApiOperation("通过ID查询单条数据")
36
+    @GetMapping("{personid}")
37
+    public ResponseEntity<TaPerson> queryById(String personId) {
38
+        return ResponseEntity.ok(taPersonService.queryById(personId));
39
+    }
40
+
41
+    /**
42
+     * 分页查询
43
+     *
44
+     * @param taPerson    筛选条件
45
+     * @param pageRequest 分页对象
46
+     * @return 查询结果
47
+     */
48
+    @ApiOperation("分页查询")
49
+    @GetMapping
50
+    public ResponseEntity<PageImpl<TaPerson>> paginQuery(TaPerson taPerson, PageRequest pageRequest) {
51
+        //1.分页参数
52
+        long current = pageRequest.getPageNumber();
53
+        long size = pageRequest.getPageSize();
54
+        //2.分页查询
55
+        /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/
56
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<TaPerson> pageResult = taPersonService.paginQuery(taPerson, current, size);
57
+        //3. 分页结果组装
58
+        List<TaPerson> dataList = pageResult.getRecords();
59
+        long total = pageResult.getTotal();
60
+        PageImpl<TaPerson> retPage = new PageImpl<TaPerson>(dataList, pageRequest, total);
61
+        return ResponseEntity.ok(retPage);
62
+    }
63
+
64
+    /**
65
+     * 新增数据
66
+     *
67
+     * @param taPerson 实例对象
68
+     * @return 实例对象
69
+     */
70
+    @ApiOperation("新增数据")
71
+    @PostMapping
72
+    public ResponseEntity<TaPerson> add(TaPerson taPerson) {
73
+        return ResponseEntity.ok(taPersonService.insert(taPerson));
74
+    }
75
+
76
+    /**
77
+     * 更新数据
78
+     *
79
+     * @param taPerson 实例对象
80
+     * @return 实例对象
81
+     */
82
+    @ApiOperation("更新数据")
83
+    @PutMapping
84
+    public ResponseEntity<TaPerson> edit(TaPerson taPerson) {
85
+        return ResponseEntity.ok(taPersonService.update(taPerson));
86
+    }
87
+
88
+    /**
89
+     * 通过主键删除数据
90
+     *
91
+     * @param personId 主键
92
+     * @return 是否成功
93
+     */
94
+    @ApiOperation("通过主键删除数据")
95
+    @DeleteMapping
96
+    public ResponseEntity<Boolean> deleteById(String personId) {
97
+        return ResponseEntity.ok(taPersonService.deleteById(personId));
98
+    }
99
+}

+ 16
- 0
admin/src/main/java/com/njyunzhi/admin/dto/ChangePasswordDTO.java Wyświetl plik

@@ -0,0 +1,16 @@
1
+package com.njyunzhi.admin.dto;
2
+
3
+import io.swagger.annotations.ApiModel;
4
+import io.swagger.annotations.ApiModelProperty;
5
+import lombok.Data;
6
+
7
+@Data
8
+@ApiModel(description = "修改密码参数")
9
+public class ChangePasswordDTO {
10
+
11
+    @ApiModelProperty("原始密码")
12
+    String originPassword;
13
+
14
+    @ApiModelProperty("新密码")
15
+    String newPassword;
16
+}

+ 22
- 0
admin/src/main/java/com/njyunzhi/admin/dto/LoginDTO.java Wyświetl plik

@@ -0,0 +1,22 @@
1
+package com.njyunzhi.admin.dto;
2
+
3
+import io.swagger.annotations.ApiModel;
4
+import io.swagger.annotations.ApiModelProperty;
5
+import lombok.Data;
6
+
7
+@Data
8
+@ApiModel("登录信息")
9
+public class LoginDTO {
10
+
11
+    @ApiModelProperty("登录类型")
12
+    String loginType;
13
+
14
+    @ApiModelProperty("登录名")
15
+    String loginName;
16
+
17
+    @ApiModelProperty("登录密码")
18
+    String password;
19
+
20
+    @ApiModelProperty("租户ID")
21
+    String tenantId;
22
+}

+ 14
- 0
admin/src/main/java/com/njyunzhi/admin/dto/PersonDTO.java Wyświetl plik

@@ -0,0 +1,14 @@
1
+package com.njyunzhi.admin.dto;
2
+
3
+
4
+import io.swagger.annotations.ApiModel;
5
+import io.swagger.annotations.ApiModelProperty;
6
+import lombok.Data;
7
+
8
+@Data
9
+@ApiModel("小程序人员表登录信息")
10
+public class PersonDTO {
11
+    @ApiModelProperty("登录openid")
12
+    String openid;
13
+
14
+}

+ 19
- 0
admin/src/main/java/com/njyunzhi/admin/dto/ResetPasswordDTO.java Wyświetl plik

@@ -0,0 +1,19 @@
1
+package com.njyunzhi.admin.dto;
2
+
3
+import io.swagger.annotations.ApiModel;
4
+import io.swagger.annotations.ApiModelProperty;
5
+import lombok.Data;
6
+
7
+import javax.validation.constraints.NotBlank;
8
+
9
+@Data
10
+@ApiModel("重置密码")
11
+public class ResetPasswordDTO {
12
+
13
+    @ApiModelProperty("用户ID")
14
+    String userId;
15
+
16
+    @NotBlank(message = "密码不能为空")
17
+    @ApiModelProperty("用户新密码, MD5加密数据")
18
+    String password;
19
+}

+ 14
- 0
admin/src/main/java/com/njyunzhi/admin/service/FxTenantService.java Wyświetl plik

@@ -0,0 +1,14 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.njyunzhi.repository.IBaseService;
4
+import com.njyunzhi.repository.entity.FxTenant;
5
+
6
+/**
7
+ * 租户表;(fx_tenant)表服务接口
8
+ *
9
+ * @author : http://njyunzhi.com
10
+ * @date : 2023-11-15
11
+ */
12
+public interface FxTenantService extends IBaseService<FxTenant> {
13
+
14
+}

+ 14
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysDeptService.java Wyświetl plik

@@ -0,0 +1,14 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.njyunzhi.repository.IBaseService;
4
+import com.njyunzhi.repository.entity.SysDept;
5
+
6
+/**
7
+ * 部门表;(sys_dept)表服务接口
8
+ *
9
+ * @author : http://njyunzhi.com
10
+ * @date : 2024-2-26
11
+ */
12
+public interface SysDeptService extends IBaseService<SysDept> {
13
+
14
+}

+ 13
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysLogService.java Wyświetl plik

@@ -0,0 +1,13 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.njyunzhi.repository.IBaseService;
4
+import com.njyunzhi.repository.entity.SysLog;
5
+
6
+ /**
7
+ * 系统日志;(sys_log)表服务接口
8
+ * @author : http://njyunzhi.com
9
+ * @date : 2023-10-25
10
+ */
11
+public interface SysLogService extends IBaseService<SysLog> {
12
+    
13
+}

+ 22
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysLoginService.java Wyświetl plik

@@ -0,0 +1,22 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.njyunzhi.admin.dto.ChangePasswordDTO;
4
+import com.njyunzhi.admin.dto.LoginDTO;
5
+import com.njyunzhi.admin.dto.ResetPasswordDTO;
6
+import com.njyunzhi.repository.IBaseService;
7
+import com.njyunzhi.repository.entity.SysLogin;
8
+import com.njyunzhi.repository.entity.SysUser;
9
+
10
+/**
11
+ * 登录信息表;(sys_login)表服务接口
12
+ * @author : http://njyunzhi.com
13
+ * @date : 2023-10-25
14
+ */
15
+public interface SysLoginService extends IBaseService<SysLogin> {
16
+
17
+     SysUser login(LoginDTO loginParm,String tenantId) throws Exception;
18
+
19
+    boolean changePassword(SysUser sysUser, ChangePasswordDTO param) throws Exception;
20
+
21
+    void resetPassword(SysUser sysUser, ResetPasswordDTO newPassword);
22
+}

+ 13
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysMenuService.java Wyświetl plik

@@ -0,0 +1,13 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.njyunzhi.repository.IBaseService;
4
+import com.njyunzhi.repository.entity.SysMenu;
5
+
6
+ /**
7
+ * 菜单表;(sys_menu)表服务接口
8
+ * @author : http://njyunzhi.com
9
+ * @date : 2023-10-25
10
+ */
11
+public interface SysMenuService extends IBaseService<SysMenu> {
12
+    
13
+}

+ 22
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysRoleResourceService.java Wyświetl plik

@@ -0,0 +1,22 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.njyunzhi.repository.IBaseService;
4
+import com.njyunzhi.repository.entity.SysRoleResource;
5
+
6
+import java.util.List;
7
+
8
+/**
9
+ * 角色资源;(sys_role_resource)表服务接口
10
+ *
11
+ * @author : http://njyunzhi.com
12
+ * @date : 2023-10-25
13
+ */
14
+public interface SysRoleResourceService extends IBaseService<SysRoleResource> {
15
+
16
+
17
+    void mergeData(String roleId, List<SysRoleResource> roleResourcesList);
18
+
19
+    SysRoleResource getByRoleAndResource(String roleId, String resourceId, String resourceType);
20
+
21
+    List<SysRoleResource> getListByRole(String roleId);
22
+}

+ 20
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysRoleService.java Wyświetl plik

@@ -0,0 +1,20 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.baomidou.mybatisplus.core.metadata.IPage;
4
+import com.njyunzhi.repository.IBaseService;
5
+import com.njyunzhi.repository.entity.SysRole;
6
+import com.njyunzhi.repository.entity.SysUser;
7
+
8
+import java.util.List;
9
+
10
+/**
11
+ * 系统角色;(sys_role)表服务接口
12
+ * @author : http://njyunzhi.com
13
+ * @date : 2023-10-25
14
+ */
15
+public interface SysRoleService extends IBaseService<SysRole> {
16
+
17
+    List<SysRole> getByUser(String userId);
18
+
19
+    IPage<SysRole> getPageBy(IPage<SysRole> pg, SysUser sysUser);
20
+ }

+ 13
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysUserRoleService.java Wyświetl plik

@@ -0,0 +1,13 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.njyunzhi.repository.IBaseService;
4
+import com.njyunzhi.repository.entity.SysUserRole;
5
+
6
+ /**
7
+ * 角色授权;(sys_user_role)表服务接口
8
+ * @author : http://njyunzhi.com
9
+ * @date : 2023-10-26
10
+ */
11
+public interface SysUserRoleService extends IBaseService<SysUserRole> {
12
+    
13
+}

+ 31
- 0
admin/src/main/java/com/njyunzhi/admin/service/SysUserService.java Wyświetl plik

@@ -0,0 +1,31 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
+import com.baomidou.mybatisplus.core.metadata.IPage;
5
+import com.njyunzhi.repository.IBaseService;
6
+import com.njyunzhi.repository.entity.FxTenant;
7
+import com.njyunzhi.repository.entity.SysMenu;
8
+import com.njyunzhi.repository.entity.SysUser;
9
+
10
+import java.util.List;
11
+
12
+/**
13
+ * 用户管理;(sys_user)表服务接口
14
+ * @author : http://njyunzhi.com
15
+ * @date : 2023-10-25
16
+ */
17
+public interface SysUserService extends IBaseService<SysUser> {
18
+
19
+    void mergeData(SysUser sysUser) throws Exception;
20
+
21
+    List<SysMenu> getMneusByUser(SysUser sysUser);
22
+
23
+    List<SysUser> getTaPerson(String phone);
24
+
25
+    SysUser getSysuser(String phone, String tenantId);
26
+
27
+    SysUser getSysuserTan(String tenantId);
28
+
29
+    IPage<FxTenant>  getTenantList(IPage<FxTenant> pg, String phone ,QueryWrapper<FxTenant> queryWrapper);
30
+
31
+}

+ 56
- 0
admin/src/main/java/com/njyunzhi/admin/service/TaPersonService.java Wyświetl plik

@@ -0,0 +1,56 @@
1
+package com.njyunzhi.admin.service;
2
+
3
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
4
+import com.njyunzhi.repository.IBaseService;
5
+import com.njyunzhi.repository.entity.TaPerson;
6
+
7
+/**
8
+ * 人员表;(ta_person)表服务接口
9
+ *
10
+ * @author : http://www.chiner.pro
11
+ * @date : 2024-2-26
12
+ */
13
+public interface TaPersonService extends IBaseService<TaPerson> {
14
+
15
+    /**
16
+     * 通过ID查询单条数据
17
+     *
18
+     * @param personId 主键
19
+     * @return 实例对象
20
+     */
21
+    TaPerson queryById(String personId);
22
+
23
+    /**
24
+     * 分页查询
25
+     *
26
+     * @param taPerson 筛选条件
27
+     * @param current  当前页码
28
+     * @param size     每页大小
29
+     * @return
30
+     */
31
+    Page<TaPerson> paginQuery(TaPerson taPerson, long current, long size);
32
+
33
+    /**
34
+     * 新增数据
35
+     *
36
+     * @param taPerson 实例对象
37
+     * @return 实例对象
38
+     */
39
+    TaPerson insert(TaPerson taPerson);
40
+
41
+    /**
42
+     * 更新数据
43
+     *
44
+     * @param taPerson 实例对象
45
+     * @return 实例对象
46
+     */
47
+    TaPerson update(TaPerson taPerson);
48
+
49
+    /**
50
+     * 通过主键删除数据
51
+     *
52
+     * @param personId 主键
53
+     * @return 是否成功
54
+     */
55
+    boolean deleteById(String personId);
56
+}

+ 41
- 0
admin/src/main/java/com/njyunzhi/admin/service/framework/OpLogService.java Wyświetl plik

@@ -0,0 +1,41 @@
1
+package com.njyunzhi.admin.service.framework;
2
+
3
+import com.njyunzhi.admin.service.SysLogService;
4
+import com.njyunzhi.framework.service.IOpLogService;
5
+import com.njyunzhi.repository.entity.SysLog;
6
+import com.njyunzhi.repository.entity.SysUser;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.context.annotation.Lazy;
9
+import org.springframework.stereotype.Component;
10
+
11
+import java.util.Map;
12
+
13
+@Component
14
+public class OpLogService implements IOpLogService {
15
+
16
+    @Autowired
17
+    @Lazy
18
+    SysLogService sysLogService;
19
+
20
+    @Override
21
+    public void save(Map data) {
22
+        if (null == data) return ;
23
+
24
+        SysUser sysUser = (SysUser) data.get("user");
25
+        SysLog sysLog = new SysLog();
26
+        sysLog.setClientType("pc.admin");
27
+        sysLog.setModuleName((String) data.get("moduleName"));
28
+        sysLog.setIp((String) data.get("ip"));
29
+        sysLog.setUa((String) data.get("ua"));
30
+        sysLog.setUri((String) data.get("uri"));
31
+        sysLog.setDesc((String) data.get("desc"));
32
+        sysLog.setAction((String) data.get("action"));
33
+
34
+        if (null != sysUser) {
35
+            sysLog.setLoginId(sysUser.getUserId());
36
+            sysLog.setUserName(sysUser.getUserName());
37
+        }
38
+
39
+        sysLogService.save(sysLog);
40
+    }
41
+}

+ 28
- 0
admin/src/main/java/com/njyunzhi/admin/service/framework/StpInterfaceImpl.java Wyświetl plik

@@ -0,0 +1,28 @@
1
+package com.njyunzhi.admin.service.framework;
2
+
3
+import cn.dev33.satoken.stp.StpInterface;
4
+import com.njyunzhi.admin.service.SysUserService;
5
+import org.springframework.context.annotation.Lazy;
6
+import org.springframework.stereotype.Component;
7
+
8
+import javax.servlet.http.HttpServletRequest;
9
+import java.util.List;
10
+
11
+@Component
12
+public class StpInterfaceImpl implements StpInterface {
13
+    @Lazy
14
+    HttpServletRequest request;
15
+
16
+    @Lazy
17
+    SysUserService sysUserService;
18
+
19
+    @Override
20
+    public List<String> getPermissionList(Object o, String s) {
21
+        return null;
22
+    }
23
+
24
+    @Override
25
+    public List<String> getRoleList(Object o, String s) {
26
+        return null;
27
+    }
28
+}

+ 88
- 0
admin/src/main/java/com/njyunzhi/admin/service/framework/UserService.java Wyświetl plik

@@ -0,0 +1,88 @@
1
+package com.njyunzhi.admin.service.framework;
2
+
3
+import com.njyunzhi.admin.service.SysUserService;
4
+import com.njyunzhi.admin.service.TaPersonService;
5
+import com.njyunzhi.framework.service.IUserService;
6
+import com.njyunzhi.repository.entity.SysUser;
7
+import com.njyunzhi.repository.entity.TaPerson;
8
+import org.springframework.beans.factory.annotation.Autowired;
9
+import org.springframework.context.annotation.Lazy;
10
+import org.springframework.stereotype.Component;
11
+
12
+import javax.servlet.http.HttpServletRequest;
13
+
14
+@Component
15
+public class UserService implements IUserService {
16
+    @Autowired
17
+    @Lazy
18
+    SysUserService sysUserService;
19
+
20
+    @Autowired
21
+    @Lazy
22
+    HttpServletRequest request;
23
+
24
+
25
+    @Autowired
26
+    @Lazy
27
+    TaPersonService taPersonService;
28
+
29
+    @Override
30
+    public Object getUserBy(Object loginId) throws Exception {
31
+        if (null == loginId) return null;
32
+        String clientType = request.getHeader("x-client-type");
33
+        String tenantId = request.getHeader("x-tenant-id");
34
+        System.out.println("---------head--------------");
35
+        System.out.println(clientType);
36
+
37
+        //h5租户端
38
+        if (clientType.equals("h5.admin")) {
39
+            TaPerson taPerson = taPersonService.getById((String) loginId);
40
+            if (taPerson != null && taPerson.getPhone() != null) {
41
+                return sysUserService.getSysuser(taPerson.getPhone(), tenantId);
42
+            } else {
43
+                return null;
44
+            }
45
+        }
46
+        //h5用户端
47
+        if (clientType.equals("h5.member")) {
48
+            return null;
49
+        }
50
+
51
+        //PC租户端
52
+//  if (clientType.equals("pc.admin")) {
53
+//            // loginId 就是 userId
54
+//            return sysUserService.getById((String) loginId);
55
+//        }
56
+        // loginId 就是 userId
57
+        return sysUserService.getById((String) loginId);
58
+    }
59
+
60
+    @Override
61
+    public String getTenantIdBy(Object user) {
62
+        if (null == user) {
63
+            return request.getHeader("x-tenant-id");
64
+        }
65
+
66
+        SysUser sysUser = (SysUser) user;
67
+
68
+        return sysUser.getTenantId();
69
+    }
70
+
71
+    @Override
72
+    public String getUserIdBy(Object user) {
73
+        if (null == user) return null;
74
+
75
+        SysUser sysUser = (SysUser) user;
76
+
77
+        return sysUser.getUserId();
78
+    }
79
+
80
+    @Override
81
+    public String getUserNameBy(Object user) {
82
+        if (null == user) return null;
83
+
84
+        SysUser sysUser = (SysUser) user;
85
+
86
+        return sysUser.getUserName();
87
+    }
88
+}

+ 18
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/FxTenantServiceImpl.java Wyświetl plik

@@ -0,0 +1,18 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.njyunzhi.admin.service.FxTenantService;
4
+import com.njyunzhi.repository.BaseServiceImpl;
5
+import com.njyunzhi.repository.entity.FxTenant;
6
+import com.njyunzhi.repository.mapper.FxTenantMapper;
7
+import org.springframework.stereotype.Service;
8
+
9
+/**
10
+ * 租户表;(fx_tenant)表服务实现类
11
+ *
12
+ * @author : http://www.chiner.pro
13
+ * @date : 2023-11-15
14
+ */
15
+@Service
16
+public class FxTenantServiceImpl extends BaseServiceImpl<FxTenantMapper, FxTenant> implements FxTenantService {
17
+
18
+}

+ 18
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysDeptServiceImpl.java Wyświetl plik

@@ -0,0 +1,18 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.njyunzhi.admin.service.SysDeptService;
4
+import com.njyunzhi.repository.BaseServiceImpl;
5
+import com.njyunzhi.repository.entity.SysDept;
6
+import com.njyunzhi.repository.mapper.SysDeptMapper;
7
+import org.springframework.stereotype.Service;
8
+
9
+/**
10
+ * 部门表;(sys_dept)表服务实现类
11
+ *
12
+ * @author : http://www.chiner.pro
13
+ * @date : 2024-2-26
14
+ */
15
+@Service
16
+public class SysDeptServiceImpl extends BaseServiceImpl<SysDeptMapper, SysDept> implements SysDeptService {
17
+
18
+}

+ 17
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysLogServiceImpl.java Wyświetl plik

@@ -0,0 +1,17 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.njyunzhi.admin.service.SysLogService;
4
+import com.njyunzhi.repository.BaseServiceImpl;
5
+import com.njyunzhi.repository.entity.SysLog;
6
+import com.njyunzhi.repository.mapper.SysLogMapper;
7
+import org.springframework.stereotype.Service;
8
+
9
+ /**
10
+ * 系统日志;(sys_log)表服务实现类
11
+ * @author : http://www.chiner.pro
12
+ * @date : 2023-10-25
13
+ */
14
+@Service
15
+public class SysLogServiceImpl extends BaseServiceImpl<SysLogMapper, SysLog> implements SysLogService {
16
+    
17
+}

+ 91
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysLoginServiceImpl.java Wyświetl plik

@@ -0,0 +1,91 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.njyunzhi.admin.common.Constants;
4
+import com.njyunzhi.admin.dto.ChangePasswordDTO;
5
+import com.njyunzhi.admin.dto.LoginDTO;
6
+import com.njyunzhi.admin.dto.ResetPasswordDTO;
7
+import com.njyunzhi.admin.service.SysLoginService;
8
+import com.njyunzhi.common.util.EncryptUtil;
9
+import com.njyunzhi.common.util.StringUtil;
10
+import com.njyunzhi.repository.BaseServiceImpl;
11
+import com.njyunzhi.repository.entity.SysLogin;
12
+import com.njyunzhi.repository.entity.SysUser;
13
+import com.njyunzhi.repository.mapper.SysLoginMapper;
14
+import com.njyunzhi.repository.mapper.SysUserMapper;
15
+import org.springframework.beans.factory.annotation.Autowired;
16
+import org.springframework.stereotype.Service;
17
+
18
+/**
19
+ * 登录信息表;(sys_login)表服务实现类
20
+ *
21
+ * @author : http://www.chiner.pro
22
+ * @date : 2023-10-25
23
+ */
24
+@Service
25
+public class SysLoginServiceImpl extends BaseServiceImpl<SysLoginMapper, SysLogin> implements SysLoginService {
26
+
27
+    @Autowired
28
+    SysUserMapper sysUserMapper;
29
+
30
+    private boolean checkPassword(String src, String targ, String salt) {
31
+        String newPass = EncryptUtil.md5(src, salt);
32
+        return targ.equals(newPass);
33
+    }
34
+
35
+    @Override
36
+    public SysUser login(LoginDTO loginParm, String tenantId) throws Exception {
37
+
38
+        SysLogin sysLogin = baseMapper.getInfoBy(loginParm.getLoginType(), loginParm.getLoginName());
39
+        if (null == sysLogin) {
40
+            throw new Exception("用户名或者密码不正确");
41
+        }
42
+
43
+        String userId = sysLogin.getUserId();
44
+        if (StringUtil.isEmpty(userId)) {
45
+            throw new Exception("用户名或者密码不正确");
46
+        }
47
+
48
+        boolean isRight = checkPassword(loginParm.getPassword(), sysLogin.getPassword(), userId);
49
+        if (!isRight) {
50
+            throw new Exception("用户名或者密码不正确");
51
+        }
52
+
53
+        SysUser user = sysUserMapper.selectById(userId);
54
+        if (null == user) {
55
+            throw new Exception("用户名或者密码不正确");
56
+        }
57
+
58
+        if (Constants.STATUS_NORMAL != user.getStatus()) {
59
+            throw new Exception("用户状态异常, 请联系管理员");
60
+        }
61
+
62
+        if (user.getTenantId() == null) {
63
+            throw new Exception("该账户的租户信息异常");
64
+        }
65
+        if (!user.getTenantId().equals(tenantId)) {
66
+            throw new Exception("该账户的租户信息错误");
67
+
68
+        }
69
+
70
+        return user;
71
+    }
72
+
73
+    @Override
74
+    public boolean changePassword(SysUser user, ChangePasswordDTO param) throws Exception {
75
+        String passwordEncrypted = EncryptUtil.md5(param.getOriginPassword(), user.getUserId());
76
+        Long cnt = baseMapper.countByUserAndPassword(user.getUserId(), passwordEncrypted);
77
+
78
+        if (null == cnt || cnt < 1) {
79
+            throw new Exception("原始密码不正确");
80
+        }
81
+
82
+        String newPassword = EncryptUtil.md5(param.getNewPassword(), user.getUserId());
83
+        return baseMapper.updateUserPassword(user.getUserId(), newPassword) > 0;
84
+    }
85
+
86
+    @Override
87
+    public void resetPassword(SysUser sysUser, ResetPasswordDTO newPassword) {
88
+        String newPasswordStr = EncryptUtil.md5(newPassword.getPassword(), sysUser.getUserId());
89
+        baseMapper.updateUserPassword(sysUser.getUserId(), newPasswordStr);
90
+    }
91
+}

+ 17
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysMenuServiceImpl.java Wyświetl plik

@@ -0,0 +1,17 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.njyunzhi.admin.service.SysMenuService;
4
+import com.njyunzhi.repository.BaseServiceImpl;
5
+import com.njyunzhi.repository.entity.SysMenu;
6
+import com.njyunzhi.repository.mapper.SysMenuMapper;
7
+import org.springframework.stereotype.Service;
8
+
9
+ /**
10
+ * 菜单表;(sys_menu)表服务实现类
11
+ * @author : http://www.chiner.pro
12
+ * @date : 2023-10-25
13
+ */
14
+@Service
15
+public class SysMenuServiceImpl extends BaseServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
16
+    
17
+}

+ 61
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysRoleResourceServiceImpl.java Wyświetl plik

@@ -0,0 +1,61 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.njyunzhi.admin.service.SysRoleResourceService;
4
+import com.njyunzhi.repository.BaseServiceImpl;
5
+import com.njyunzhi.repository.entity.SysRoleResource;
6
+import com.njyunzhi.repository.mapper.SysRoleResourceMapper;
7
+import org.springframework.stereotype.Service;
8
+
9
+import java.util.ArrayList;
10
+import java.util.HashMap;
11
+import java.util.List;
12
+
13
+/**
14
+ * 角色资源;(sys_role_resource)表服务实现类
15
+ *
16
+ * @author : http://www.chiner.pro
17
+ * @date : 2023-10-25
18
+ */
19
+@Service
20
+public class SysRoleResourceServiceImpl extends BaseServiceImpl<SysRoleResourceMapper, SysRoleResource> implements SysRoleResourceService {
21
+
22
+    @Override
23
+    public void mergeData(String roleId, List<SysRoleResource> roleResourcesList) {
24
+        // 如果是空 list, 代表取消授权
25
+        if (roleResourcesList.size() == 0) {
26
+            removeByMap(new HashMap<String, Object>() {{
27
+                put("role_id", roleId);
28
+            }});
29
+            return;
30
+        }
31
+
32
+        //
33
+        List<String> idList = new ArrayList<>();
34
+        for (SysRoleResource item : roleResourcesList) {
35
+            item.setRoleId(roleId);
36
+
37
+            SysRoleResource origin = baseMapper.getByRoleAndResource(roleId, item.getResourceId(), item.getResourceType());
38
+            if (null != origin) {
39
+                item.setId(origin.getId());
40
+            } else {
41
+                baseMapper.insert(item);
42
+            }
43
+
44
+            idList.add(item.getId());
45
+        }
46
+
47
+        // 删除多余的数据
48
+        baseMapper.deleteNotIn(roleId, idList);
49
+
50
+    }
51
+
52
+    @Override
53
+    public SysRoleResource getByRoleAndResource(String roleId, String resourceId, String resourceType) {
54
+        return baseMapper.getByRoleAndResource(roleId, resourceId, resourceType);
55
+    }
56
+
57
+    @Override
58
+    public List<SysRoleResource> getListByRole(String roleId) {
59
+        return baseMapper.getListByRole(roleId);
60
+    }
61
+}

+ 38
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysRoleServiceImpl.java Wyświetl plik

@@ -0,0 +1,38 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
+import com.baomidou.mybatisplus.core.metadata.IPage;
5
+import com.njyunzhi.admin.common.Constants;
6
+import com.njyunzhi.admin.service.SysRoleService;
7
+import com.njyunzhi.repository.BaseServiceImpl;
8
+import com.njyunzhi.repository.entity.SysRole;
9
+import com.njyunzhi.repository.entity.SysUser;
10
+import com.njyunzhi.repository.mapper.SysRoleMapper;
11
+import org.springframework.stereotype.Service;
12
+
13
+import java.util.List;
14
+
15
+/**
16
+ * 系统角色;(sys_role)表服务实现类
17
+ *
18
+ * @author : http://www.chiner.pro
19
+ * @date : 2023-10-25
20
+ */
21
+@Service
22
+public class SysRoleServiceImpl extends BaseServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
23
+
24
+    @Override
25
+    public List<SysRole> getByUser(String userId) {
26
+        if (Constants.ROOT_ID.equals(userId)) {
27
+            QueryWrapper<SysRole> queryWrapper = new QueryWrapper<>();
28
+            return list(queryWrapper);
29
+        }
30
+
31
+        return baseMapper.getByUser(userId);
32
+    }
33
+
34
+    @Override
35
+    public IPage<SysRole> getPageBy(IPage<SysRole> pg, SysUser sysUser) {
36
+        return baseMapper.getPageBy(pg, sysUser.getUserId());
37
+    }
38
+}

+ 17
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysUserRoleServiceImpl.java Wyświetl plik

@@ -0,0 +1,17 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.njyunzhi.admin.service.SysUserRoleService;
4
+import com.njyunzhi.repository.BaseServiceImpl;
5
+import com.njyunzhi.repository.entity.SysUserRole;
6
+import com.njyunzhi.repository.mapper.SysUserRoleMapper;
7
+import org.springframework.stereotype.Service;
8
+
9
+ /**
10
+ * 角色授权;(sys_user_role)表服务实现类
11
+ * @author : http://www.chiner.pro
12
+ * @date : 2023-10-26
13
+ */
14
+@Service
15
+public class SysUserRoleServiceImpl extends BaseServiceImpl<SysUserRoleMapper, SysUserRole> implements SysUserRoleService {
16
+    
17
+}

+ 124
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/SysUserServiceImpl.java Wyświetl plik

@@ -0,0 +1,124 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
+import com.baomidou.mybatisplus.core.metadata.IPage;
5
+import com.njyunzhi.admin.common.Constants;
6
+import com.njyunzhi.admin.service.SysUserService;
7
+import com.njyunzhi.common.util.EncryptUtil;
8
+import com.njyunzhi.repository.BaseServiceImpl;
9
+import com.njyunzhi.repository.entity.*;
10
+import com.njyunzhi.repository.mapper.SysLoginMapper;
11
+import com.njyunzhi.repository.mapper.SysUserMapper;
12
+import com.njyunzhi.repository.mapper.SysUserRoleMapper;
13
+import com.njyunzhi.repository.repo.SysMenuRepo;
14
+import org.springframework.beans.factory.annotation.Autowired;
15
+import org.springframework.stereotype.Service;
16
+
17
+import java.time.LocalDateTime;
18
+import java.util.ArrayList;
19
+import java.util.HashMap;
20
+import java.util.List;
21
+
22
+/**
23
+ * 用户管理;(sys_user)表服务实现类
24
+ *
25
+ * @author : http://www.chiner.pro
26
+ * @date : 2023-10-25
27
+ */
28
+@Service
29
+public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser> implements SysUserService {
30
+
31
+    @Autowired
32
+    SysUserRoleMapper sysUserRoleMapper;
33
+
34
+    @Autowired
35
+    SysLoginMapper sysLoginMapper;
36
+
37
+    @Autowired
38
+    SysMenuRepo sysMenuRepo;
39
+
40
+    @Override
41
+    public void mergeData(SysUser sysUser) throws Exception {
42
+        //
43
+        SysUser origin = getById(sysUser.getUserId());
44
+        LocalDateTime now = LocalDateTime.now();
45
+
46
+        // 用户表
47
+        if (null == origin) {
48
+            if (null == sysUser.getStatus()) {
49
+                sysUser.setStatus(Constants.STATUS_NORMAL);
50
+            }
51
+            save(sysUser);
52
+        } else {
53
+            sysUser.setStatus(Constants.STATUS_NORMAL);
54
+            updateById(sysUser);
55
+        }
56
+
57
+        // 登录账号
58
+        SysLogin sysLogin = sysLoginMapper.getInfoBy(Constants.LOGIN_TYPE_ACCOUNT, sysUser.getPhone());
59
+        if (null == sysLogin) {
60
+            sysLogin = new SysLogin();
61
+            sysLogin.setUserId(sysUser.getUserId());
62
+            sysLogin.setLoginType(Constants.LOGIN_TYPE_ACCOUNT);
63
+            sysLogin.setLoginName(sysUser.getPhone());
64
+            sysLogin.setPassword(EncryptUtil.md5(EncryptUtil.md5("123456"), sysUser.getUserId()));
65
+            sysLogin.setStatus(Constants.STATUS_NORMAL);
66
+            sysLoginMapper.insert(sysLogin);
67
+        }
68
+
69
+
70
+        // 授权角色
71
+        List<SysRole> rolesList = sysUser.getRoleList();
72
+        if (null == rolesList || rolesList.size() == 0) {
73
+            sysUserRoleMapper.deleteByMap(new HashMap<String, Object>() {{
74
+                put("user_id", sysUser.getUserId());
75
+            }});
76
+        } else {
77
+            List<String> idList = new ArrayList<>();
78
+            for (SysRole role : rolesList) {
79
+                SysUserRole item = new SysUserRole();
80
+                item.setUserId(sysUser.getUserId());
81
+                item.setRoleId(role.getRoleId());
82
+
83
+                SysUserRole exists = sysUserRoleMapper.getByUserAndRole(sysUser.getUserId(), role.getRoleId());
84
+                if (null != exists) {
85
+                    item.setId(exists.getId());
86
+                } else {
87
+                    sysUserRoleMapper.insert(item);
88
+                }
89
+
90
+                idList.add(item.getId());
91
+            }
92
+
93
+            // 去除垃圾数据
94
+            sysUserRoleMapper.deleteNotIn(sysUser.getUserId(), idList);
95
+        }
96
+    }
97
+
98
+    @Override
99
+    public List<SysMenu> getMneusByUser(SysUser sysUser) {
100
+        return sysMenuRepo.getMenusByUser(sysUser);
101
+    }
102
+
103
+    @Override
104
+    public List<SysUser> getTaPerson(String phone) {
105
+        return baseMapper.getTaPerson(phone);
106
+
107
+    }
108
+
109
+    @Override
110
+    public SysUser getSysuser(String phone, String tenantId) {
111
+        return baseMapper.getSysuser(phone, tenantId);
112
+    }
113
+
114
+    @Override
115
+    public SysUser getSysuserTan(String tenantId) {
116
+        return baseMapper.getSysuserTan(tenantId);
117
+    }
118
+
119
+    @Override
120
+    public IPage<FxTenant>  getTenantList(IPage<FxTenant> pg, String phone, QueryWrapper<FxTenant> queryWrapper) {
121
+        return baseMapper.getTenantList(pg, phone,queryWrapper);
122
+    }
123
+
124
+}

+ 143
- 0
admin/src/main/java/com/njyunzhi/admin/service/impl/TaPersonServiceImpl.java Wyświetl plik

@@ -0,0 +1,143 @@
1
+package com.njyunzhi.admin.service.impl;
2
+
3
+import cn.hutool.core.util.StrUtil;
4
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
5
+import com.baomidou.mybatisplus.core.metadata.IPage;
6
+import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
7
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
8
+import com.njyunzhi.admin.service.SysUserService;
9
+import com.njyunzhi.admin.service.TaPersonService;
10
+import com.njyunzhi.repository.BaseServiceImpl;
11
+import com.njyunzhi.repository.entity.SysUser;
12
+import com.njyunzhi.repository.entity.TaPerson;
13
+import com.njyunzhi.repository.mapper.SysUserMapper;
14
+import com.njyunzhi.repository.mapper.TaPersonMapper;
15
+import org.springframework.beans.factory.annotation.Autowired;
16
+import org.springframework.stereotype.Service;
17
+
18
+/**
19
+ * 人员表;(ta_person)表服务实现类
20
+ *
21
+ * @author : http://www.chiner.pro
22
+ * @date : 2024-2-26
23
+ */
24
+@Service
25
+public class TaPersonServiceImpl extends BaseServiceImpl<TaPersonMapper, TaPerson> implements TaPersonService {
26
+    @Autowired
27
+    private TaPersonMapper taPersonMapper;
28
+
29
+    /**
30
+     * 通过ID查询单条数据
31
+     *
32
+     * @param personId 主键
33
+     * @return 实例对象
34
+     */
35
+    public TaPerson queryById(String personId) {
36
+        return taPersonMapper.selectById(personId);
37
+    }
38
+
39
+    /**
40
+     * 分页查询
41
+     *
42
+     * @param taPerson 筛选条件
43
+     * @param current  当前页码
44
+     * @param size     每页大小
45
+     * @return
46
+     */
47
+    public Page<TaPerson> paginQuery(TaPerson taPerson, long current, long size) {
48
+        //1. 构建动态查询条件
49
+        LambdaQueryWrapper<TaPerson> queryWrapper = new LambdaQueryWrapper<>();
50
+        if (StrUtil.isNotBlank(taPerson.getPersonName())) {
51
+            queryWrapper.eq(TaPerson::getPersonName, taPerson.getPersonName());
52
+        }
53
+        if (StrUtil.isNotBlank(taPerson.getAvatar())) {
54
+            queryWrapper.eq(TaPerson::getAvatar, taPerson.getAvatar());
55
+        }
56
+        if (StrUtil.isNotBlank(taPerson.getPhone())) {
57
+            queryWrapper.eq(TaPerson::getPhone, taPerson.getPhone());
58
+        }
59
+        if (StrUtil.isNotBlank(taPerson.getEmail())) {
60
+            queryWrapper.eq(TaPerson::getEmail, taPerson.getEmail());
61
+        }
62
+        if (StrUtil.isNotBlank(taPerson.getOpenId())) {
63
+            queryWrapper.eq(TaPerson::getOpenId, taPerson.getOpenId());
64
+        }
65
+        if (StrUtil.isNotBlank(taPerson.getCreatedBy())) {
66
+            queryWrapper.eq(TaPerson::getCreatedBy, taPerson.getCreatedBy());
67
+        }
68
+        if (StrUtil.isNotBlank(taPerson.getUpdatedBy())) {
69
+            queryWrapper.eq(TaPerson::getUpdatedBy, taPerson.getUpdatedBy());
70
+        }
71
+        //2. 执行分页查询
72
+        Page<TaPerson> pagin = new Page<>(current, size, true);
73
+        IPage<TaPerson> selectResult = taPersonMapper.selectByPage(pagin, queryWrapper);
74
+        pagin.setPages(selectResult.getPages());
75
+        pagin.setTotal(selectResult.getTotal());
76
+        pagin.setRecords(selectResult.getRecords());
77
+        //3. 返回结果
78
+        return pagin;
79
+    }
80
+
81
+    /**
82
+     * 新增数据
83
+     *
84
+     * @param taPerson 实例对象
85
+     * @return 实例对象
86
+     */
87
+    public TaPerson insert(TaPerson taPerson) {
88
+        taPersonMapper.insert(taPerson);
89
+        return taPerson;
90
+    }
91
+
92
+    /**
93
+     * 更新数据
94
+     *
95
+     * @param taPerson 实例对象
96
+     * @return 实例对象
97
+     */
98
+    public TaPerson update(TaPerson taPerson) {
99
+        //1. 根据条件动态更新
100
+        LambdaUpdateChainWrapper<TaPerson> chainWrapper = new LambdaUpdateChainWrapper<TaPerson>(taPersonMapper);
101
+        if (StrUtil.isNotBlank(taPerson.getPersonName())) {
102
+            chainWrapper.eq(TaPerson::getPersonName, taPerson.getPersonName());
103
+        }
104
+        if (StrUtil.isNotBlank(taPerson.getAvatar())) {
105
+            chainWrapper.eq(TaPerson::getAvatar, taPerson.getAvatar());
106
+        }
107
+        if (StrUtil.isNotBlank(taPerson.getPhone())) {
108
+            chainWrapper.eq(TaPerson::getPhone, taPerson.getPhone());
109
+        }
110
+        if (StrUtil.isNotBlank(taPerson.getEmail())) {
111
+            chainWrapper.eq(TaPerson::getEmail, taPerson.getEmail());
112
+        }
113
+        if (StrUtil.isNotBlank(taPerson.getOpenId())) {
114
+            chainWrapper.eq(TaPerson::getOpenId, taPerson.getOpenId());
115
+        }
116
+        if (StrUtil.isNotBlank(taPerson.getCreatedBy())) {
117
+            chainWrapper.eq(TaPerson::getCreatedBy, taPerson.getCreatedBy());
118
+        }
119
+        if (StrUtil.isNotBlank(taPerson.getUpdatedBy())) {
120
+            chainWrapper.eq(TaPerson::getUpdatedBy, taPerson.getUpdatedBy());
121
+        }
122
+        //2. 设置主键,并更新
123
+        chainWrapper.set(TaPerson::getPersonId, taPerson.getPersonId());
124
+        boolean ret = chainWrapper.update();
125
+        //3. 更新成功了,查询最最对象返回
126
+        if (ret) {
127
+            return queryById(taPerson.getPersonId());
128
+        } else {
129
+            return taPerson;
130
+        }
131
+    }
132
+
133
+    /**
134
+     * 通过主键删除数据
135
+     *
136
+     * @param personId 主键
137
+     * @return 是否成功
138
+     */
139
+    public boolean deleteById(String personId) {
140
+        int total = taPersonMapper.deleteById(personId);
141
+        return total > 0;
142
+    }
143
+}

+ 11
- 0
admin/src/main/java/com/njyunzhi/admin/util/CommonUtil.java Wyświetl plik

@@ -0,0 +1,11 @@
1
+package com.njyunzhi.admin.util;
2
+
3
+import java.util.Map;
4
+
5
+public class CommonUtil {
6
+
7
+    public static void put(Map mp, String key, Object value) {
8
+        if (null == value) return;
9
+        mp.put(key, value);
10
+    }
11
+}

+ 20
- 0
admin/src/main/resources/aliyun.yml Wyświetl plik

@@ -0,0 +1,20 @@
1
+
2
+
3
+enable: true
4
+accessKeyId: LTAI5tGjnZY6k799BHxhmqcm
5
+accessKeySecret: eU1DmULbgHe2dnIg3P93634PO2vEh5
6
+
7
+oss:
8
+  enable: true
9
+  # Endpoint以华东1(杭州)为例,其他Region请按实际情况填写。
10
+  endpoint: oss-cn-nanjing.aliyuncs.com
11
+  # 填写Bucket名称,例如examplebucket。
12
+  bucket: yz-crm
13
+  # 填写Host地址,格式为https://bucketname.endpoint。
14
+  host: https://yz-crm.oss-cn-nanjing.aliyuncs.com
15
+  # 设置上传回调URL,即回调服务器地址,
16
+  callbackUrL:
17
+  # 自定义域名
18
+  customDomain: http://static.yz-crm.njyunzhi.com
19
+  # 过期时间 单位秒
20
+  expireTime: 300

+ 134
- 0
admin/src/main/resources/application.yml Wyświetl plik

@@ -0,0 +1,134 @@
1
+
2
+# 端口
3
+server:
4
+  port: 9111
5
+  servlet:
6
+    context-path: /api
7
+
8
+logging:
9
+  level:
10
+    org:
11
+      springframework:
12
+        web:
13
+          servlet:
14
+            # 每次请求的详情打印出来
15
+            DispatchServlet: trace
16
+
17
+spring:
18
+  mvc:
19
+    log-request-details: true
20
+    pathmatch:
21
+      matching-strategy: ANT_PATH_MATCHER
22
+  jackson:
23
+    date-format: yyyy-MM-dd HH:mm:ss
24
+    time-zone: GMT+8
25
+  servlet:
26
+    multipart:
27
+      max-file-size: 1024MB
28
+      max-request-size: 1024MB
29
+  datasource:
30
+    url: jdbc:mysql://192.168.89.10:3306/global_funding?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
31
+    username: global_funding
32
+    password: global_funding@ABCD1234
33
+    hikari:
34
+      maximum-pool-size: 3
35
+
36
+  # 配置 Redis 连接
37
+  redis:
38
+    # Redis数据库索引
39
+    database: 3
40
+    # Redis服务器地址
41
+    host: 192.168.89.147
42
+    # Redis服务器连接端口
43
+    port: 6379
44
+    # Redis服务器连接密码(默认为空)
45
+    password: yansen@123
46
+    # 连接超时时间
47
+    timeout: 10s
48
+    lettuce:
49
+      pool:
50
+        # 连接池最大连接数
51
+        max-active: 200
52
+        # 连接池最大阻塞等待时间(使用负值表示没有限制)
53
+        max-wait: -1ms
54
+        # 连接池中的最大空闲连接
55
+        max-idle: 10
56
+        # 连接池中的最小空闲连接
57
+        min-idle: 0
58
+
59
+sa-token:
60
+  # jwt秘钥
61
+  jwt-secret-key: d4d778d279cf11ed9b1d525400e8554f
62
+  # token名称 (同时也是cookie名称)
63
+  token-name: Authorization
64
+  # token有效期,单位s 默认30天, -1代表永不过期
65
+  timeout: 2592000
66
+  # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
67
+  activity-timeout: -1
68
+  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
69
+  is-concurrent: true
70
+  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
71
+  is-share: true
72
+  # token风格
73
+  token-style: uuid
74
+  # 是否输出操作日志
75
+  is-log: false
76
+  # 是否尝试从 cookie 里读取 Token
77
+  is-read-cookie: false
78
+
79
+
80
+forest:
81
+  # 关闭 forest 请求日志打印
82
+  log-enabled: false
83
+
84
+###
85
+mybatis-plus:
86
+  configuration:
87
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
88
+    call-setters-on-nulls: true
89
+  global-config:
90
+    db-config:
91
+      logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0)
92
+      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
93
+      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
94
+  mapper-locations: classpath*:mapper/**/*.xml
95
+  type-aliases-package: com.njyunzhi.*.entity
96
+
97
+### swagger
98
+springfox:
99
+  documentation:
100
+    auto-startup: true
101
+
102
+access-limit:
103
+  enabled: true
104
+
105
+###
106
+yz:
107
+  # 文件上传
108
+  upload:
109
+    # 上传目录
110
+    path: E:/work/public-upload
111
+    # 文件服务前缀
112
+#    server-prefix: http://192.168.89.25:7777
113
+    server-prefix: http://112.2.2.154:9081
114
+  filter:
115
+    # 接口列表, 可以不校验 token
116
+    annList:
117
+      - /swagger-ui/**
118
+      - /swagger-resources/**
119
+      - /v2/**
120
+      - /static/**
121
+      - /h5/**
122
+      - /admin/login
123
+  # 租户系统
124
+  tenant:
125
+    # 默认不启用
126
+    enabled: false
127
+    # no-tenantId
128
+    default-id: 7f16d7c4544041649fc20e39839582cc
129
+    # 不启用租户系统的表
130
+    white-list:
131
+      - sys_role_resource
132
+      - sys_user_role
133
+      - sys_role_auth
134
+      - sys_role_auth_custom

+ 62
- 0
admin/src/main/resources/logback-spring.xml Wyświetl plik

@@ -0,0 +1,62 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<configuration debug="true">
3
+
4
+    <!-- 日志文件的存储地址 -->
5
+    <property name="LOG_PATH" value="./logs" />
6
+
7
+    <!-- 控制台输出 -->
8
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
9
+        <encoder>
10
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n</pattern>
11
+            <charset>UTF-8</charset>
12
+        </encoder>
13
+    </appender>
14
+
15
+    <!-- 文件输出 INFO -->
16
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
17
+        <!-- 文件名称 -->
18
+        <file>${LOG_PATH}/admin-info.log</file>
19
+
20
+        <!-- 滚动规则 -->
21
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
22
+            <!-- 每天生成代码 -->
23
+            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}.%i.admin-info.log</fileNamePattern>
24
+            <!-- 日志文件保留天数, 0 不删除 -->
25
+            <maxHistory>0</maxHistory>
26
+            <maxFileSize>500MB</maxFileSize>
27
+        </rollingPolicy>
28
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
29
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:-} --- [%t] %logger{50} - %msg%n</pattern>
30
+            <charset>UTF-8</charset>
31
+        </encoder>
32
+    </appender>
33
+
34
+    <!-- 文件输出 ERROR -->
35
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
36
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
37
+            <level>ERROR</level>
38
+        </filter>
39
+
40
+        <!-- 文件名称 -->
41
+        <file>${LOG_PATH}/admin-error.log</file>
42
+
43
+        <!-- 滚动规则 -->s
44
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
45
+            <!-- 每天生成代码 -->
46
+            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}.%i.admin-error.log</fileNamePattern>
47
+            <!-- 日志文件保留天数, 0 不删除 -->
48
+            <maxHistory>0</maxHistory>
49
+            <maxFileSize>500MB</maxFileSize>
50
+        </rollingPolicy>
51
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
52
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:-} --- [%t] %logger{50} - %msg%n</pattern>
53
+            <charset>UTF-8</charset>
54
+        </encoder>
55
+    </appender>
56
+
57
+    <root level="INFO">
58
+        <appender-ref ref="STDOUT" />
59
+        <appender-ref ref="INFO_FILE" />
60
+        <appender-ref ref="ERROR_FILE" />
61
+    </root>
62
+</configuration>

+ 61
- 0
common/pom.xml Wyświetl plik

@@ -0,0 +1,61 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+    <parent>
6
+        <artifactId>demo</artifactId>
7
+        <groupId>com.njyunzhi</groupId>
8
+        <version>0.0.1</version>
9
+    </parent>
10
+    <modelVersion>4.0.0</modelVersion>
11
+
12
+    <artifactId>yz_common</artifactId>
13
+
14
+    <properties>
15
+        <maven.compiler.source>8</maven.compiler.source>
16
+        <maven.compiler.target>8</maven.compiler.target>
17
+    </properties>
18
+
19
+    <dependencies>
20
+        <!-- fastjson2 -->
21
+        <dependency>
22
+            <groupId>com.alibaba.fastjson2</groupId>
23
+            <artifactId>fastjson2</artifactId>
24
+            <version>${fastjson.version}</version>
25
+        </dependency>
26
+
27
+
28
+        <!-- Http请求工具 -->
29
+        <dependency>
30
+            <groupId>com.squareup.okhttp3</groupId>
31
+            <artifactId>okhttp</artifactId>
32
+            <version>${okhttp.version}</version>
33
+        </dependency>
34
+
35
+        <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/logging-interceptor -->
36
+        <dependency>
37
+            <groupId>com.squareup.okhttp3</groupId>
38
+            <artifactId>logging-interceptor</artifactId>
39
+            <version>${okhttp-log.version}</version>
40
+        </dependency>
41
+
42
+        <dependency>
43
+            <groupId>com.alibaba</groupId>
44
+            <artifactId>easyexcel</artifactId>
45
+            <version>${easyexcel.version}</version>
46
+        </dependency>
47
+
48
+        <!--        图片分辨率压缩-->
49
+        <dependency>
50
+            <groupId>net.coobird</groupId>
51
+            <artifactId>thumbnailator</artifactId>
52
+            <version>${thumbnailator.version}</version>
53
+        </dependency>
54
+
55
+        <dependency>
56
+            <groupId>com.aliyun.oss</groupId>
57
+            <artifactId>aliyun-sdk-oss</artifactId>
58
+            <version>${aliyun-oss.version}</version>
59
+        </dependency>
60
+    </dependencies>
61
+</project>

+ 177
- 0
common/src/main/java/com/njyunzhi/common/util/DateUtil.java Wyświetl plik

@@ -0,0 +1,177 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import java.text.ParseException;
4
+import java.text.SimpleDateFormat;
5
+import java.time.Duration;
6
+import java.time.Instant;
7
+import java.time.LocalDateTime;
8
+import java.time.ZoneId;
9
+import java.time.format.DateTimeFormatter;
10
+import java.time.temporal.ChronoUnit;
11
+import java.util.Date;
12
+import java.util.regex.Pattern;
13
+
14
+public class DateUtil {
15
+
16
+    public static String toString(LocalDateTime dt, String pattern) {
17
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
18
+        return dt.format(formatter);
19
+    }
20
+
21
+    public static LocalDateTime date2LocalDateTime(Date date) {
22
+        Instant instant = date.toInstant();
23
+        ZoneId zone = ZoneId.systemDefault();
24
+        return LocalDateTime.ofInstant(instant, zone);
25
+    }
26
+
27
+    public static boolean sameDay(LocalDateTime d1, LocalDateTime d2) {
28
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
29
+        return d1.format(formatter).equals(d2.format(formatter));
30
+    }
31
+
32
+    public static String cutSecond(LocalDateTime dt) {
33
+        if (null == dt) return null;
34
+
35
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
36
+        return dt.format(formatter);
37
+    }
38
+
39
+    public static String today() {
40
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
41
+        return LocalDateTime.now().format(formatter);
42
+    }
43
+
44
+    public static String todayCompact() {
45
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
46
+        return LocalDateTime.now().format(formatter);
47
+    }
48
+
49
+    public static String localDateTimeToString(LocalDateTime d) {
50
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
51
+        return d.format(formatter);
52
+    }
53
+
54
+    public static LocalDateTime fromString(String str, String formatter) {
55
+        DateTimeFormatter df = DateTimeFormatter.ofPattern(formatter);
56
+
57
+        return LocalDateTime.parse(str, df);
58
+    }
59
+
60
+
61
+    public static LocalDateTime from(int year, int month, int date, String hms) {
62
+        String m = (month > 9 ? "" : "0") + month;
63
+        String d = (date > 9 ? "" : "0") + date;
64
+        String str = String.format("%d-%s-%s %s", year, m, d, hms);
65
+
66
+        return dayToLocalDateime(str);
67
+    }
68
+
69
+    public static LocalDateTime day2LocalDateime(String day) {
70
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
71
+        return LocalDateTime.parse(day + " 00:00:00", df);
72
+    }
73
+
74
+    public static LocalDateTime dayToLocalDateime(String day) {
75
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
76
+        return LocalDateTime.parse(day, df);
77
+    }
78
+
79
+    public static boolean checkTimeRange(LocalDateTime start, LocalDateTime end, LocalDateTime dt) {
80
+        if (dt == null) {
81
+            dt = LocalDateTime.now();
82
+        }
83
+
84
+        if (dt.isAfter(start) && dt.isBefore(end)) {
85
+            return true;
86
+        }
87
+        return false;
88
+    }
89
+
90
+    /**
91
+     * 当前时间是否早于指定时间
92
+     *
93
+     * @param target
94
+     * @return
95
+     */
96
+    public static boolean isBefore(String target) {
97
+        LocalDateTime dt = LocalDateTime.now();
98
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
99
+        LocalDateTime targetTime = LocalDateTime.parse(target, df);
100
+        if (dt.isBefore(targetTime)) {
101
+            return true;
102
+        }
103
+        return false;
104
+    }
105
+
106
+    /**
107
+     * 当前时间是否晚于指定时间
108
+     *
109
+     * @param target
110
+     * @return
111
+     */
112
+    public static boolean isAfter(String target) {
113
+        LocalDateTime dt = LocalDateTime.now();
114
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
115
+        LocalDateTime targetTime = LocalDateTime.parse(target, df);
116
+        if (dt.isAfter(targetTime)) {
117
+            return true;
118
+        }
119
+        return false;
120
+    }
121
+
122
+    /**
123
+     * 获取时间差
124
+     *
125
+     * @param dt1
126
+     * @param dt2 目标时间
127
+     * @return
128
+     */
129
+    public static String diffTime(LocalDateTime dt1, LocalDateTime dt2) {
130
+        Duration duration = Duration.between(dt1, dt2);
131
+        long minutes = duration.toMinutes();
132
+        int hours = (int) Math.floor(minutes / 60);
133
+        int minute = (int) minutes % 60;
134
+        int day = (int) Math.floor(hours / 24);
135
+        int hour = hours % 24;
136
+
137
+        return day + "天" + hour + "小时" + minute + "分钟";
138
+    }
139
+
140
+    public static LocalDateTime timeToLocalDateTime(String target){
141
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
142
+        return LocalDateTime.parse(target, df);
143
+    }
144
+
145
+    public static LocalDateTime now() {
146
+        return LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
147
+    }
148
+
149
+    public static boolean isDayStr(String str) {
150
+        return Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", str);
151
+    }
152
+
153
+    public static Date day2Date(String str) throws ParseException {
154
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
155
+        return df.parse(str);
156
+    }
157
+
158
+    /**
159
+     * 获取两个日期之间差值
160
+     * @param date1
161
+     * @param date2
162
+     * @param type
163
+     * @return
164
+     */
165
+    public static int between(LocalDateTime date1, LocalDateTime date2, String type) {
166
+        if ("year".equals(type)) {
167
+            long num = Math.abs(ChronoUnit.YEARS.between(date1.toLocalDate(), date2.toLocalDate()));
168
+            return (int) num;
169
+        } else if ("month".equals(type)) {
170
+            long num = Math.abs(ChronoUnit.MONTHS.between(date1.toLocalDate(), date2.toLocalDate()));
171
+            return (int) num;
172
+        } else {
173
+            long num = Math.abs(ChronoUnit.DAYS.between(date1.toLocalDate(), date2.toLocalDate()));
174
+            return (int) num;
175
+        }
176
+    }
177
+}

+ 23
- 0
common/src/main/java/com/njyunzhi/common/util/EncryptUtil.java Wyświetl plik

@@ -0,0 +1,23 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import org.springframework.util.DigestUtils;
4
+
5
+import java.util.Base64;
6
+
7
+public class EncryptUtil {
8
+
9
+    public static String md5(String str, String ...slats) {
10
+        String slat = "";
11
+        if (null != slats && slats.length > 0) {
12
+            slat = slats[0];
13
+        }
14
+
15
+        String base = str + slat;
16
+        String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
17
+        return md5;
18
+    }
19
+
20
+    public static String base64(byte[] src) {
21
+        return Base64.getEncoder().encodeToString(src);
22
+    }
23
+}

+ 132
- 0
common/src/main/java/com/njyunzhi/common/util/FileUtil.java Wyświetl plik

@@ -0,0 +1,132 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import org.springframework.beans.factory.annotation.Value;
4
+import org.springframework.stereotype.Component;
5
+import org.springframework.web.multipart.MultipartFile;
6
+
7
+import java.io.File;
8
+import java.io.IOException;
9
+import java.nio.file.Files;
10
+import java.nio.file.Paths;
11
+import java.nio.file.StandardOpenOption;
12
+import java.time.LocalDateTime;
13
+import java.time.format.DateTimeFormatter;
14
+
15
+@Component
16
+public class FileUtil {
17
+
18
+    @Value("${yz.upload.path}")
19
+    String uploadPath;
20
+
21
+    @Value("${yz.upload.server-prefix}")
22
+    String serverPrefix;
23
+
24
+    public String getServerPrefix() {
25
+        return serverPrefix;
26
+    }
27
+
28
+    public String getUploadPath() {
29
+        File tmp = new File(uploadPath);
30
+        if (!tmp.exists()) {
31
+            tmp.mkdir();
32
+        }
33
+
34
+        return uploadPath;
35
+    }
36
+
37
+    public String getMonth() {
38
+        LocalDateTime now = LocalDateTime.now();
39
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
40
+        return now.format(formatter);
41
+    }
42
+
43
+    public String encodeFileName(String fname) {
44
+        return fname;
45
+//        if (null == fname) return null;
46
+//
47
+//        int pos = fname.lastIndexOf(".");
48
+//
49
+//        String name = pos > -1 ? fname.substring(0, pos) : fname;
50
+//        String ext = pos > -1 ? fname.substring(pos + 1) : "";
51
+//
52
+//        return StringUtil.encodeURIComponent(name) + "." + ext;
53
+    }
54
+
55
+    /**
56
+     * 上传图片
57
+     * @param multipartFile
58
+     * @param fileName
59
+     * @return
60
+     * @throws IOException
61
+     */
62
+    public String saveMultipartFile(MultipartFile multipartFile, String fileName) throws IOException {
63
+        String fName = null == fileName ? multipartFile.getOriginalFilename() : fileName;
64
+        fName = encodeFileName(fName);
65
+        String nfName = String.format("%s/%d-%s", getMonth(), System.currentTimeMillis(), fName);
66
+
67
+        // 上传目录以日期分类
68
+        File tmp = new File(String.format("%s/%s", getUploadPath(), getMonth()));
69
+        if (!tmp.exists()) {
70
+            tmp.mkdir();
71
+        }
72
+
73
+        File file = new File(String.format("%s/%s", getUploadPath(), nfName));
74
+        multipartFile.transferTo(file);
75
+        String url = String.format("%s/%s", serverPrefix, nfName);
76
+        return url;
77
+    }
78
+
79
+    // 保存文件
80
+    public String saveFile(File file, String fileName) throws Exception {
81
+        fileName = encodeFileName(fileName);
82
+        String uploadRootPath = getUploadPath();
83
+        String monthStr = getMonth();
84
+
85
+        // 上传目录
86
+        String upPath = String.format("%s/%s", uploadRootPath, monthStr);
87
+        File tmp = new File(upPath);
88
+        if (!tmp.exists()) {
89
+            tmp.mkdir();
90
+        }
91
+
92
+        String newFileName = String.format("%d-%s", System.currentTimeMillis(), fileName);
93
+        String newFilePath = String.format("%s/%s", upPath, newFileName);
94
+        if (!file.renameTo(new File(newFilePath))) {
95
+            throw new Exception("保存文件失败");
96
+        };
97
+
98
+        // 返回值 去掉根目录
99
+        return String.format("%s/%s", monthStr, newFileName);
100
+    }
101
+
102
+    // 保存文件
103
+    public String saveFile(byte[] bytes, String fileName) throws Exception {
104
+        fileName = encodeFileName(fileName);
105
+        String uploadRootPath = getUploadPath();
106
+        String monthStr = getMonth();
107
+
108
+        // 上传目录
109
+        String upPath = String.format("%s/%s", uploadRootPath, monthStr);
110
+        File tmp = new File(upPath);
111
+        if (!tmp.exists()) {
112
+            tmp.mkdir();
113
+        }
114
+
115
+        String newFileName = String.format("%d-%s", System.currentTimeMillis(), fileName);
116
+        String newFilePath = String.format("%s/%s", upPath, newFileName);
117
+
118
+        Files.write(Paths.get(newFilePath), bytes, StandardOpenOption.CREATE);
119
+
120
+        // 返回值 去掉根目录
121
+        return String.format("%s/%s", monthStr, newFileName);
122
+    }
123
+
124
+    public String transPath(String localPath) {
125
+        if (null == localPath) return null;
126
+
127
+        String uploadPath = getUploadPath().replaceAll("\\\\", "/");
128
+        String urlStr = localPath.replaceAll("\\\\", "/").replace(uploadPath, getServerPrefix());
129
+
130
+        return urlStr;
131
+    }
132
+}

+ 63
- 0
common/src/main/java/com/njyunzhi/common/util/FileUtilCompression.java Wyświetl plik

@@ -0,0 +1,63 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import lombok.extern.slf4j.Slf4j;
4
+import net.coobird.thumbnailator.Thumbnails;
5
+import org.springframework.stereotype.Component;
6
+
7
+import javax.imageio.ImageIO;
8
+import java.awt.image.BufferedImage;
9
+import java.io.ByteArrayInputStream;
10
+import java.io.ByteArrayOutputStream;
11
+import java.io.IOException;
12
+import java.io.InputStream;
13
+
14
+@Slf4j
15
+@Component
16
+public class FileUtilCompression {
17
+    public static InputStream compressMultipartFile(InputStream inputStream, int targetSize) throws IOException {
18
+        BufferedImage image = ImageIO.read(inputStream);
19
+        float quality = 0.6f;
20
+        int originalWidth = image.getWidth();
21
+        int originalHeight = image.getHeight();
22
+
23
+        int targetWidth = originalWidth;
24
+        int targetHeight = originalHeight;
25
+
26
+        if (originalWidth > targetSize || originalHeight > targetSize) {
27
+            double scaleFactor = Math.min((double) targetSize / originalWidth, (double) targetSize / originalHeight);
28
+            targetWidth = (int) (originalWidth * scaleFactor);
29
+            targetHeight = (int) (originalHeight * scaleFactor);
30
+        }
31
+
32
+        BufferedImage resizedImage = Thumbnails.of(image)
33
+                .size(targetWidth, targetHeight)
34
+                .outputQuality(quality)
35
+                .asBufferedImage();
36
+
37
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
38
+        ImageIO.write(resizedImage, "jpg", outputStream);
39
+
40
+        return new ByteArrayInputStream(outputStream.toByteArray());
41
+    }
42
+
43
+    public static byte[] compressSize(byte[] imageBytes, long targetSize, float quality) throws IOException {
44
+        if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < targetSize) {
45
+            return imageBytes;
46
+        }
47
+
48
+        long srcSize = imageBytes.length;
49
+        try {
50
+            ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
51
+            ByteArrayOutputStream outputStream= new ByteArrayOutputStream(imageBytes.length);
52
+            Thumbnails.of(inputStream).scale(1f).outputQuality(quality).toOutputStream(outputStream);
53
+            imageBytes = outputStream.toByteArray();
54
+            log.info(
55
+                    "【图片压缩】图片原大小={}kb | 压缩后大小={}kb",
56
+                    srcSize / 1024,
57
+                    imageBytes.length / 1024);
58
+        } catch (Exception e) {
59
+            log.error("【图片压缩】msg=图片压缩失败!", e);
60
+        }
61
+        return imageBytes;
62
+    }
63
+}

+ 117
- 0
common/src/main/java/com/njyunzhi/common/util/HttpUtil.java Wyświetl plik

@@ -0,0 +1,117 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import com.alibaba.fastjson2.JSON;
4
+import lombok.extern.slf4j.Slf4j;
5
+import okhttp3.*;
6
+import okhttp3.logging.HttpLoggingInterceptor;
7
+
8
+import javax.net.ssl.X509TrustManager;
9
+import java.io.IOException;
10
+import java.util.ArrayList;
11
+import java.util.List;
12
+import java.util.Map;
13
+
14
+@Slf4j
15
+public class HttpUtil {
16
+
17
+    private static OkHttpClient client = createClient();
18
+
19
+    public static OkHttpClient createClient() {
20
+        X509TrustManager manager = SSLSocketClient.getX509TrustManager();
21
+        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
22
+                .tlsVersions(TlsVersion.TLS_1_0, TlsVersion.TLS_1_1, TlsVersion.TLS_1_2)
23
+                .build();
24
+        List<ConnectionSpec> specList = new ArrayList<>();
25
+        specList.add(spec);
26
+        OkHttpClient.Builder builder = new OkHttpClient.Builder()
27
+                .connectionSpecs(specList)
28
+                .sslSocketFactory(SSLSocketClient.getSocketFactory(manager), manager)
29
+                .hostnameVerifier(SSLSocketClient.getHostnameVerifier())
30
+                ;
31
+
32
+        HttpLoggingInterceptor.Logger logInterceptor = log::info;
33
+        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(logInterceptor);
34
+        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
35
+        builder.addInterceptor(httpLoggingInterceptor);
36
+
37
+        return builder.build();
38
+    }
39
+
40
+    public static Request.Builder getRequestBuilder() {
41
+        return new Request.Builder();
42
+    }
43
+
44
+    public static HttpUrl buildURL(String url, Map<String, Object> params) {
45
+        HttpUrl.Builder queryUrlBuilder = HttpUrl.get(url).newBuilder();
46
+
47
+        if (null != params && !params.isEmpty()) {
48
+            params.forEach((key, value) -> {
49
+                if (null == value || StringUtil.isEmpty(value.toString())) {
50
+                    queryUrlBuilder.addQueryParameter(key, "");
51
+                } else {
52
+                    queryUrlBuilder.addQueryParameter(key, value.toString());
53
+                }
54
+            });
55
+        }
56
+
57
+        return queryUrlBuilder.build();
58
+    }
59
+
60
+    public static RequestBody buildJSONBody(Object data) {
61
+        if (null == data) {
62
+            return null;
63
+        }
64
+
65
+        String jsonString = JSON.toJSONString(data);
66
+
67
+        return RequestBody.create(
68
+                jsonString,
69
+                MediaType.parse("application/json") // application/json
70
+        );
71
+    }
72
+
73
+    public static Headers buildHeaders(Map<String, Object> headers) {
74
+        Headers.Builder headersBuilder = new Headers.Builder();
75
+
76
+        if (null != headers && !headers.isEmpty()) {
77
+            for (Map.Entry<String, Object> entry : headers.entrySet()) {
78
+                headersBuilder.add(entry.getKey(), entry.getValue().toString());
79
+            }
80
+        }
81
+
82
+        return headersBuilder.build();
83
+    }
84
+
85
+
86
+    public static Response request(String url, Map<String, Object> params, Object data, Map<String, Object> headers, String method) throws IOException {
87
+        if (null == method) method = "GET";
88
+
89
+        Request.Builder requestBuilder = HttpUtil.getRequestBuilder();
90
+        requestBuilder.url(HttpUtil.buildURL(url, params));
91
+        requestBuilder.headers(buildHeaders(headers));
92
+        requestBuilder.method(method, HttpUtil.buildJSONBody(data));
93
+
94
+        Request request = requestBuilder.build();
95
+        return client.newCall(request).execute();
96
+    }
97
+
98
+    public static Response get(String url, Map<String, Object> params) throws IOException {
99
+        return request(url, params, null, null, null);
100
+    }
101
+
102
+    public static Response post(String url, Object data, Map<String, Object> params) throws IOException {
103
+        return request(url, params, data, null, "POST");
104
+    }
105
+
106
+    public static String download(String url, String fileName, FileUtil fileUtil) throws Exception {
107
+        Request.Builder requestBuilder = getRequestBuilder();
108
+        requestBuilder.url(url);
109
+
110
+        Request request = requestBuilder.build();
111
+        Response response = client.newCall(request).execute();
112
+        ResponseBody responseBody = response.body();
113
+        byte[] bytes = responseBody.bytes();
114
+
115
+        return fileUtil.saveFile(bytes, fileName);
116
+    }
117
+}

+ 72
- 0
common/src/main/java/com/njyunzhi/common/util/IpUtil.java Wyświetl plik

@@ -0,0 +1,72 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import javax.servlet.http.HttpServletRequest;
4
+import java.net.InetAddress;
5
+import java.net.UnknownHostException;
6
+
7
+public class IpUtil {
8
+
9
+    private static final String IP_UTILS_FLAG = ",";
10
+    private static final String UNKNOWN = "unknown";
11
+    private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1";
12
+    private static final String LOCALHOST_IP1 = "127.0.0.1";
13
+
14
+    /**
15
+     * 获取IP公网地址
16
+     * <p>
17
+     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
18
+     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
19
+     */
20
+    public static String getIpAddr(HttpServletRequest request) {
21
+        String ip = null;
22
+        try {
23
+            //以下两个获取在k8s中,将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。
24
+            ip = request.getHeader("X-Original-Forwarded-For");
25
+            if (isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
26
+                ip = request.getHeader("X-Forwarded-For");
27
+            }
28
+            //获取nginx等代理的ip
29
+            if (isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
30
+                ip = request.getHeader("x-forwarded-for");
31
+            }
32
+            if (isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
33
+                ip = request.getHeader("Proxy-Client-IP");
34
+            }
35
+            if (isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
36
+                ip = request.getHeader("WL-Proxy-Client-IP");
37
+            }
38
+            if (isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
39
+                ip = request.getHeader("HTTP_CLIENT_IP");
40
+            }
41
+            if (isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
42
+                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
43
+            }
44
+            //兼容k8s集群获取ip
45
+            if (isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
46
+                ip = request.getRemoteAddr();
47
+                if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) {
48
+                    //根据网卡取本机配置的IP
49
+                    InetAddress iNet = null;
50
+                    try {
51
+                        iNet = InetAddress.getLocalHost();
52
+                    } catch (UnknownHostException e) {
53
+                        e.printStackTrace();
54
+                    }
55
+                    ip = iNet.getHostAddress();
56
+                }
57
+            }
58
+        } catch (Exception e) {
59
+            e.printStackTrace();
60
+        }
61
+        //使用代理,则获取第一个IP地址
62
+        if (!isEmpty(ip) && ip.indexOf(IP_UTILS_FLAG) > 0) {
63
+            ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG));
64
+        }
65
+
66
+        return ip;
67
+    }
68
+
69
+    public static boolean isEmpty(String s) {
70
+        return s == null || "".equals(s.trim());
71
+    }
72
+}

+ 31
- 0
common/src/main/java/com/njyunzhi/common/util/MimeType.java Wyświetl plik

@@ -0,0 +1,31 @@
1
+package com.njyunzhi.common.util;
2
+
3
+public enum MimeType {
4
+    JPG("image/jpg"),
5
+    JPEG("image/jpeg"),
6
+    GIF("image/gif"),
7
+    PNG("image/png"),
8
+    PDF("application/pdf"),
9
+    PPT("application/vnd.ms-powerpoint"),
10
+    PPTX("application/vnd.openxmlformats-officedocument.presentationml.presentation"),
11
+    ;
12
+
13
+    final String type;
14
+
15
+    private MimeType(String type) {
16
+        this.type = type;
17
+    }
18
+
19
+    public static boolean isPdf(String type) {
20
+        return MimeType.PDF.type.equals(type);
21
+    }
22
+    public static boolean isPpt(String type) {
23
+        return MimeType.PPT.type.equals(type) || MimeType.PPTX.type.equals(type);
24
+    }
25
+    public static boolean isImage(String type) {
26
+        return MimeType.JPG.type.equals(type)
27
+                || MimeType.JPEG.type.equals(type)
28
+                || MimeType.GIF.type.equals(type)
29
+                || MimeType.PNG.type.equals(type);
30
+    }
31
+}

+ 20
- 0
common/src/main/java/com/njyunzhi/common/util/MyPropertySourceFactory.java Wyświetl plik

@@ -0,0 +1,20 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import org.springframework.boot.env.YamlPropertySourceLoader;
4
+import org.springframework.core.env.PropertySource;
5
+import org.springframework.core.io.support.EncodedResource;
6
+import org.springframework.core.io.support.PropertySourceFactory;
7
+
8
+import java.io.IOException;
9
+
10
+/**
11
+ * 自定义读取 yml 配置文件
12
+ * 使用方式 @PropertySource
13
+ */
14
+public class MyPropertySourceFactory implements PropertySourceFactory {
15
+
16
+    @Override
17
+    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
18
+        return new YamlPropertySourceLoader().load(name, resource.getResource()).get(0);
19
+    }
20
+}

+ 54
- 0
common/src/main/java/com/njyunzhi/common/util/SSLSocketClient.java Wyświetl plik

@@ -0,0 +1,54 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import javax.net.ssl.*;
4
+import java.security.KeyManagementException;
5
+import java.security.NoSuchAlgorithmException;
6
+import java.security.SecureRandom;
7
+import java.security.cert.CertificateException;
8
+import java.security.cert.X509Certificate;
9
+
10
+public class SSLSocketClient {
11
+
12
+    public static SSLSocketFactory getSocketFactory(TrustManager manager) {
13
+        SSLSocketFactory socketFactory = null;
14
+        try {
15
+            SSLContext sslContext = SSLContext.getInstance("SSL");
16
+            sslContext.init(null, new TrustManager[]{manager}, new SecureRandom());
17
+            socketFactory = sslContext.getSocketFactory();
18
+        } catch (NoSuchAlgorithmException e) {
19
+            e.printStackTrace();
20
+        } catch (KeyManagementException e) {
21
+            e.printStackTrace();
22
+        }
23
+        return socketFactory;
24
+    }
25
+
26
+    public static X509TrustManager getX509TrustManager() {
27
+        return new X509TrustManager() {
28
+            @Override
29
+            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
30
+
31
+            }
32
+
33
+            @Override
34
+            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
35
+
36
+            }
37
+
38
+            @Override
39
+            public X509Certificate[] getAcceptedIssuers() {
40
+                return new X509Certificate[0];
41
+            }
42
+        };
43
+    }
44
+
45
+    public static HostnameVerifier getHostnameVerifier() {
46
+        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
47
+            @Override
48
+            public boolean verify(String s, SSLSession sslSession) {
49
+                return true;
50
+            }
51
+        };
52
+        return hostnameVerifier;
53
+    }
54
+}

+ 226
- 0
common/src/main/java/com/njyunzhi/common/util/StringUtil.java Wyświetl plik

@@ -0,0 +1,226 @@
1
+package com.njyunzhi.common.util;
2
+
3
+import java.io.UnsupportedEncodingException;
4
+import java.net.URLDecoder;
5
+import java.net.URLEncoder;
6
+import java.util.*;
7
+import java.util.regex.Matcher;
8
+import java.util.regex.Pattern;
9
+
10
+public class StringUtil {
11
+    private static Pattern humpPattern = Pattern.compile("[A-Z]");
12
+
13
+    public static boolean isEmpty(String str) {
14
+        return null == str || "".equals(str.trim()) || "null".equals(str) || "undefined".equals(str);
15
+    }
16
+
17
+    public static boolean isNotEmpty(String str) {
18
+        return !isEmpty(str);
19
+    }
20
+
21
+    public static String trim(String src, String...st) {
22
+        if (null == src) return src;
23
+        if (null == st || st.length == 0) return src.trim();
24
+
25
+        String start = st[0];
26
+        if (!src.startsWith(start)) {
27
+            return src;
28
+        }
29
+
30
+        return src.substring(start.length());
31
+    }
32
+
33
+
34
+
35
+
36
+    public static String UUID() {
37
+        return UUID.randomUUID().toString().replaceAll("-", "");
38
+    }
39
+
40
+    public static String trimEnd(String src, String str) {
41
+        if (null == src || null == str) {
42
+            return src;
43
+        }
44
+
45
+        if (src.endsWith(str)) {
46
+            return src.substring(0, src.length() - str.length());
47
+        }
48
+
49
+        return src;
50
+    }
51
+
52
+    public static String ifNull(String src, String defaultVal) {
53
+        return isEmpty(src) ? defaultVal : src;
54
+    }
55
+
56
+    public static String random(int length) {
57
+        String str="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
58
+        Random random = new Random();
59
+        StringBuffer sb = new StringBuffer();
60
+        for(int i=0;i<length;i++){
61
+            int number=random.nextInt(62);
62
+            sb.append(str.charAt(number));
63
+        }
64
+        return sb.toString();
65
+    }
66
+
67
+    public static String urlEncode(String str) {
68
+        if (isEmpty(str)) return str;
69
+
70
+        try {
71
+            return URLEncoder.encode(str, "UTF-8");
72
+        } catch (UnsupportedEncodingException e) {
73
+            e.printStackTrace();
74
+            return str;
75
+        }
76
+    }
77
+
78
+    public static String urlDecode(String str) {
79
+        if (isEmpty(str)) return str;
80
+
81
+        try {
82
+            return URLDecoder.decode(str, "UTF-8");
83
+        } catch (UnsupportedEncodingException e) {
84
+            e.printStackTrace();
85
+            return str;
86
+        }
87
+    }
88
+
89
+    public static String encodeURIComponent(String str) {
90
+        String result = urlEncode(str);
91
+
92
+        return result.replaceAll("\\+", "%20")
93
+                .replaceAll("\\%21", "!")
94
+                .replaceAll("\\%27", "'")
95
+                .replaceAll("\\%28", "(")
96
+                .replaceAll("\\%29", ")")
97
+                .replaceAll("\\%7E", "~");
98
+    }
99
+
100
+    public static String humpToLine(String str) {
101
+        if (null == str || "".equals(str)) return "";
102
+
103
+        Matcher matcher = humpPattern.matcher(str);
104
+        StringBuffer sb = new StringBuffer();
105
+        while (matcher.find()) {
106
+            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
107
+        }
108
+        matcher.appendTail(sb);
109
+        return sb.toString();
110
+    }
111
+
112
+    public static String strToUnicode(String str) {
113
+        char[] chars = str.toCharArray();
114
+        String returnStr = "";
115
+        for (int i = 0; i < chars.length; i++) {
116
+            returnStr += "\\u" + Integer.toString(chars[i], 16);
117
+        }
118
+        return returnStr;
119
+    }
120
+
121
+    public static String repeat(String src, int len) {
122
+        if (null == src) {
123
+            return null;
124
+        }
125
+
126
+        if (len <= 0) {
127
+            return src;
128
+        }
129
+
130
+        String res = "";
131
+        for (int i = 0; i < len; i ++) {
132
+            res += src;
133
+        }
134
+
135
+        return res;
136
+    }
137
+
138
+    public static String lpad(String src, String padStr, int len) {
139
+        if (null == src) {
140
+            return null;
141
+        }
142
+
143
+        if (len <= 0 || src.length() >= len) {
144
+            return src;
145
+        }
146
+
147
+        if (null == padStr) {
148
+            padStr = "";
149
+        }
150
+
151
+        int padLen = len - src.length();
152
+        String prefix = repeat(padStr, padLen);
153
+        prefix = prefix.substring(0, padLen);
154
+        return prefix + src;
155
+    }
156
+
157
+    /**
158
+     * 解析 QueryString
159
+     * @param queryStr
160
+     * @return
161
+     */
162
+    public static Map<String, String> parseQueryString(String queryStr) {
163
+        if (isEmpty(queryStr)) {
164
+            return null;
165
+        }
166
+        Map<String, String> result = new HashMap<String, String>();
167
+
168
+        String[] fields = queryStr.split("&");
169
+        for (String field : fields) {
170
+            String[] pairs = field.split("=");
171
+            if (2 != pairs.length) {
172
+                continue;
173
+            }
174
+
175
+            try {
176
+                String key = URLDecoder.decode(pairs[0].trim(), "UTF-8");
177
+                String val = URLDecoder.decode(pairs[1].trim(), "UTF-8");
178
+
179
+                result.put(key, val);
180
+            } catch (UnsupportedEncodingException e) {
181
+                e.printStackTrace();
182
+            }
183
+        }
184
+
185
+        return result;
186
+    }
187
+
188
+    /**
189
+     * Map 转 QueryString
190
+     * @param params
191
+     * @return
192
+     */
193
+    public static String buildQueryString(Map<String, Object> params) {
194
+        if (null == params) {
195
+            return null;
196
+        }
197
+
198
+        List<String> lst = new ArrayList<>();
199
+        for (Map.Entry<String, Object> entry : params.entrySet()) {
200
+            String key = urlEncode(entry.getKey());
201
+            Object o = entry.getValue();
202
+            if (null == o) {
203
+                continue;
204
+            }
205
+            String val = o.toString();
206
+            if (isEmpty(val)) {
207
+                continue;
208
+            }
209
+            String queryStr = key + "=" + urlEncode(val);
210
+            lst.add(queryStr);
211
+        }
212
+        return String.join("&", lst);
213
+    }
214
+
215
+    public static String random12(int NUM_LENGTH) {
216
+        final char[] NUM_CHARS = "0123456789".toCharArray();
217
+        Random random = new Random();
218
+        StringBuilder sb = new StringBuilder(NUM_LENGTH);
219
+        for (int i = 0; i < NUM_LENGTH; i++) {
220
+            sb.append(NUM_CHARS[random.nextInt(NUM_CHARS.length)]);
221
+        }
222
+        String randomNumber = sb.toString();
223
+        return randomNumber;
224
+    }
225
+
226
+}

+ 22
- 0
common/src/main/java/com/njyunzhi/common/util/aliyun/AliyunConfig.java Wyświetl plik

@@ -0,0 +1,22 @@
1
+package com.njyunzhi.common.util.aliyun;
2
+
3
+import com.njyunzhi.common.util.MyPropertySourceFactory;
4
+import lombok.Data;
5
+import org.springframework.beans.factory.annotation.Value;
6
+import org.springframework.context.annotation.Configuration;
7
+import org.springframework.context.annotation.PropertySource;
8
+
9
+@Data
10
+@PropertySource(value = {"aliyun.yml"}, factory = MyPropertySourceFactory.class)
11
+@Configuration
12
+public class AliyunConfig {
13
+
14
+    @Value("${enable}")
15
+    Boolean enable;
16
+
17
+    @Value("${accessKeyId}")
18
+    String accessKeyId;
19
+
20
+    @Value("${accessKeySecret}")
21
+    String accessKeySecret;
22
+}

+ 21
- 0
common/src/main/java/com/njyunzhi/common/util/aliyun/oss/OssConfig.java Wyświetl plik

@@ -0,0 +1,21 @@
1
+package com.njyunzhi.common.util.aliyun.oss;
2
+
3
+import com.njyunzhi.common.util.MyPropertySourceFactory;
4
+import lombok.Data;
5
+import org.springframework.boot.context.properties.ConfigurationProperties;
6
+import org.springframework.context.annotation.PropertySource;
7
+import org.springframework.stereotype.Component;
8
+
9
+@Data
10
+@Component
11
+@PropertySource(value = {"aliyun.yml"}, factory = MyPropertySourceFactory.class)
12
+@ConfigurationProperties(prefix = "oss")
13
+public class OssConfig {
14
+    Boolean enable;
15
+    String endpoint;
16
+    String bucket;
17
+    String host;
18
+    String callbackUrL;
19
+    String customDomain;
20
+    Integer expireTime;
21
+}

+ 93
- 0
common/src/main/java/com/njyunzhi/common/util/aliyun/oss/OssUtil.java Wyświetl plik

@@ -0,0 +1,93 @@
1
+package com.njyunzhi.common.util.aliyun.oss;
2
+
3
+
4
+import com.aliyun.oss.OSS;
5
+import com.aliyun.oss.OSSClientBuilder;
6
+import com.aliyun.oss.common.auth.CredentialsProvider;
7
+import com.aliyun.oss.common.auth.DefaultCredentialProvider;
8
+import com.aliyun.oss.common.utils.BinaryUtil;
9
+import com.aliyun.oss.model.MatchMode;
10
+import com.aliyun.oss.model.PolicyConditions;
11
+import com.njyunzhi.common.util.aliyun.AliyunConfig;
12
+import lombok.Data;
13
+import org.springframework.beans.factory.annotation.Autowired;
14
+import org.springframework.stereotype.Component;
15
+
16
+import java.io.IOException;
17
+import java.nio.charset.StandardCharsets;
18
+import java.time.LocalDateTime;
19
+import java.time.format.DateTimeFormatter;
20
+import java.util.Date;
21
+
22
+@Component
23
+public class OssUtil {
24
+
25
+    AliyunConfig aliyunConfig;
26
+    OssConfig ossConfig;
27
+    CredentialsProvider credentialsProvider;
28
+    Boolean enable;
29
+
30
+    @Autowired
31
+    public OssUtil(AliyunConfig aliyunConfig, OssConfig ossConfig) {
32
+        enable = !(null == aliyunConfig || !aliyunConfig.getEnable() || null == ossConfig || !ossConfig.getEnable());
33
+        if (!enable) {
34
+            return;
35
+        }
36
+
37
+        this.aliyunConfig = aliyunConfig;
38
+        this.ossConfig = ossConfig;
39
+
40
+        credentialsProvider = new DefaultCredentialProvider(aliyunConfig.getAccessKeyId(), aliyunConfig.getAccessKeySecret());
41
+    }
42
+
43
+    /**
44
+     * 获取 WEB 直传 用到的参数
45
+     * @return
46
+     * @throws IOException
47
+     */
48
+    public PolicyResponse getPolicy() throws IOException {
49
+        if (!enable) {
50
+            throw new IOException("请启用 OSS 设置");
51
+        }
52
+
53
+        LocalDateTime now = LocalDateTime.now();
54
+        // 上传目录按月份
55
+        String dir = now.format(DateTimeFormatter.ofPattern("yyyyMM")) + "/";
56
+        // 过期时间
57
+        long expireEndTime = System.currentTimeMillis() + ossConfig.getExpireTime() * 1000;
58
+        Date expireDate = new Date(expireEndTime);
59
+
60
+        // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
61
+        PolicyConditions policyConds = new PolicyConditions();
62
+        policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
63
+        policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
64
+
65
+        OSS ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), credentialsProvider);
66
+        String postPolicy = ossClient.generatePostPolicy(expireDate, policyConds);
67
+        byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
68
+        String policy = BinaryUtil.toBase64String(binaryData);
69
+        String signature = ossClient.calculatePostSignature(postPolicy);
70
+
71
+        PolicyResponse res = new PolicyResponse();
72
+        res.setAccessId(credentialsProvider.getCredentials().getAccessKeyId());
73
+        res.setPolicy(policy);
74
+        res.setSignature(signature);
75
+        res.setDir(dir);
76
+        res.setHost(ossConfig.getHost());
77
+        res.setExpire(expireEndTime);
78
+        res.setCustomDomain(ossConfig.getCustomDomain());
79
+
80
+        return res;
81
+    }
82
+
83
+    @Data
84
+    public static class PolicyResponse {
85
+        String accessId;
86
+        String policy;
87
+        String signature;
88
+        String dir;
89
+        String host;
90
+        Long expire;
91
+        String customDomain;
92
+    }
93
+}

+ 70
- 0
common/src/main/java/com/njyunzhi/common/util/excel/CellWidthWriteHandler.java Wyświetl plik

@@ -0,0 +1,70 @@
1
+package com.njyunzhi.common.util.excel;
2
+
3
+import com.alibaba.excel.enums.CellDataTypeEnum;
4
+import com.alibaba.excel.metadata.Head;
5
+import com.alibaba.excel.metadata.data.CellData;
6
+import com.alibaba.excel.metadata.data.WriteCellData;
7
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
8
+import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
9
+import org.apache.poi.ss.usermodel.Cell;
10
+import org.springframework.util.CollectionUtils;
11
+
12
+import java.util.HashMap;
13
+import java.util.List;
14
+import java.util.Map;
15
+
16
+public class CellWidthWriteHandler extends AbstractColumnWidthStyleStrategy {
17
+    private static final int MAX_COLUMN_WIDTH = 255;
18
+    private  Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);
19
+
20
+    public void CustomCellWriteHandler() {
21
+    }
22
+
23
+    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
24
+        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
25
+        if (needSetWidth) {
26
+            Map<Integer, Integer> maxColumnWidthMap = (Map)CACHE.get(writeSheetHolder.getSheetNo());
27
+            if (maxColumnWidthMap == null) {
28
+                maxColumnWidthMap = new HashMap(16);
29
+                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
30
+            }
31
+
32
+            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
33
+            if (columnWidth >= 0) {
34
+                if (columnWidth > MAX_COLUMN_WIDTH) {
35
+                    columnWidth = MAX_COLUMN_WIDTH;
36
+                }
37
+
38
+                Integer maxColumnWidth = (Integer)((Map)maxColumnWidthMap).get(cell.getColumnIndex());
39
+                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
40
+                    ((Map)maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
41
+                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 384); // 256 * 1.5
42
+                }
43
+
44
+            }
45
+        }
46
+    }
47
+
48
+    private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
49
+        if (isHead) {
50
+            return cell.getStringCellValue().getBytes().length;
51
+        } else {
52
+            CellData cellData = (CellData)cellDataList.get(0);
53
+            CellDataTypeEnum type = cellData.getType();
54
+            if (type == null) {
55
+                return -1;
56
+            } else {
57
+                switch(type) {
58
+                    case STRING:
59
+                        return cellData.getStringValue().getBytes().length;
60
+                    case BOOLEAN:
61
+                        return cellData.getBooleanValue().toString().getBytes().length;
62
+                    case NUMBER:
63
+                        return cellData.getNumberValue().toString().getBytes().length;
64
+                    default:
65
+                        return -1;
66
+                }
67
+            }
68
+        }
69
+    }
70
+}

+ 40
- 0
common/src/main/java/com/njyunzhi/common/util/excel/DateConverter.java Wyświetl plik

@@ -0,0 +1,40 @@
1
+package com.njyunzhi.common.util.excel;
2
+
3
+import com.alibaba.excel.converters.Converter;
4
+import com.alibaba.excel.enums.CellDataTypeEnum;
5
+import com.alibaba.excel.metadata.GlobalConfiguration;
6
+import com.alibaba.excel.metadata.data.WriteCellData;
7
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
8
+
9
+import java.text.SimpleDateFormat;
10
+import java.util.Date;
11
+
12
+public class DateConverter implements Converter<Date> {
13
+    @Override
14
+    public Class supportJavaTypeKey() {
15
+        return Date.class;
16
+    }
17
+
18
+    @Override
19
+    public CellDataTypeEnum supportExcelTypeKey() {
20
+        return CellDataTypeEnum.STRING;
21
+    }
22
+
23
+    /**
24
+     * 写 Excel
25
+     * @param value
26
+     * @param contentProperty
27
+     * @param globalConfiguration
28
+     * @return
29
+     * @throws Exception
30
+     */
31
+    @Override
32
+    public WriteCellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
33
+        if (null == value) return null;
34
+
35
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
36
+        String val = dateFormat.format(value);
37
+
38
+        return new WriteCellData(val);
39
+    }
40
+}

+ 88
- 0
common/src/main/java/com/njyunzhi/common/util/excel/ExcelUtil.java Wyświetl plik

@@ -0,0 +1,88 @@
1
+package com.njyunzhi.common.util.excel;
2
+
3
+import com.alibaba.excel.EasyExcel;
4
+import com.alibaba.excel.write.builder.ExcelWriterBuilder;
5
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
6
+import com.njyunzhi.common.util.StringUtil;
7
+
8
+import javax.servlet.http.HttpServletResponse;
9
+import java.io.IOException;
10
+import java.util.List;
11
+
12
+public class ExcelUtil {
13
+
14
+    /**
15
+     * 发送 excel 到客户端
16
+     * 暂时只支持单 sheet 页
17
+     * @param response
18
+     * @param data
19
+     * @param fileName
20
+     * @throws IOException
21
+     */
22
+    public static void flush(HttpServletResponse response, Class dataClass, List data, String fileName) throws IOException {
23
+        response.setContentType("application/vnd.ms-excel");
24
+        response.setCharacterEncoding("utf-8");
25
+        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
26
+        response.setHeader("Content-Disposition", "attachment;filename="+ StringUtil.urlEncode(fileName)+".xlsx");
27
+
28
+        EasyExcel.write(response.getOutputStream(), dataClass).sheet("sheet1").doWrite(data);
29
+    }
30
+
31
+    public static void flush(HttpServletResponse response, List<List<String>> head, List<List<Object>> data, String fileName) throws IOException {
32
+        response.setContentType("application/vnd.ms-excel");
33
+        response.setCharacterEncoding("utf-8");
34
+        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
35
+        response.setHeader("Content-Disposition", "attachment;filename="+ StringUtil.urlEncode(fileName)+".xlsx");
36
+
37
+        ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream());
38
+        writerBuilder.head(head);
39
+        writerBuilder.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
40
+                .sheet("sheet")
41
+                .doWrite(data);
42
+    }
43
+
44
+//    public static void flush(HttpServletResponse response, List<List<Map<String, Object>>> data, List<List<String>> customHead, String fileName) throws IOException {
45
+//        response.setContentType("application/vnd.ms-excel");
46
+//        response.setCharacterEncoding("utf-8");
47
+//        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
48
+//        response.setHeader("Content-Disposition", "attachment;filename="+ StringUtil.urlEncode(fileName)+".xlsx");
49
+//
50
+//        boolean noCustomHeads = null == customHead || customHead.size() == 0;
51
+//
52
+//        List<List<String>> head = new ArrayList<>();
53
+//        List<List<Object>> contents = new ArrayList<>();
54
+//        if (null != data && data.size() > 0) {
55
+//            int row = 0;
56
+//            for (List<Map<String, Object>> fields: data) {
57
+//
58
+//                List<Object> item = new ArrayList<>();
59
+//                for (Map<String, Object> field: fields) {
60
+//                    if (row == 0 && noCustomHeads) {
61
+//                        List<String> keys = new ArrayList<>();
62
+//                        keys.add(field.get("name").toString());
63
+//                        head.add(keys);
64
+//                    }
65
+//
66
+//                    item.add(field.get("value"));
67
+//                }
68
+//
69
+//                contents.add(item);
70
+//                row += 1;
71
+//            }
72
+//        }
73
+//
74
+//        ExcelWriterBuilder writerBuilder = EasyExcel.write(response.getOutputStream());
75
+//        if (noCustomHeads) {
76
+//            writerBuilder.head(head);
77
+//        } else {
78
+//            writerBuilder.head(customHead);
79
+//        }
80
+//
81
+//        writerBuilder.registerWriteHandler(new CellWidthWriteHandler())
82
+//                .sheet("sheet")
83
+//                .registerConverter(new TimestampConverter())
84
+//                .registerConverter(new DateConverter())
85
+//                .doWrite(contents);
86
+//    }
87
+
88
+}

+ 39
- 0
common/src/main/java/com/njyunzhi/common/util/excel/LocalDateTimeConverter.java Wyświetl plik

@@ -0,0 +1,39 @@
1
+package com.njyunzhi.common.util.excel;
2
+
3
+import com.alibaba.excel.converters.Converter;
4
+import com.alibaba.excel.enums.CellDataTypeEnum;
5
+import com.alibaba.excel.metadata.GlobalConfiguration;
6
+import com.alibaba.excel.metadata.data.WriteCellData;
7
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
8
+import com.njyunzhi.common.util.DateUtil;
9
+
10
+import java.time.LocalDateTime;
11
+
12
+public class LocalDateTimeConverter implements Converter<LocalDateTime> {
13
+    @Override
14
+    public Class supportJavaTypeKey() {
15
+        return LocalDateTime.class;
16
+    }
17
+
18
+    @Override
19
+    public CellDataTypeEnum supportExcelTypeKey() {
20
+        return CellDataTypeEnum.STRING;
21
+    }
22
+
23
+    /**
24
+     * 写 Excel
25
+     * @param value
26
+     * @param contentProperty
27
+     * @param globalConfiguration
28
+     * @return
29
+     * @throws Exception
30
+     */
31
+    @Override
32
+    public WriteCellData<?> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
33
+        if (null == value) return null;
34
+
35
+        String val = DateUtil.toString(value, "yyyy-MM-dd HH:mm:ss");
36
+
37
+        return new WriteCellData(val);
38
+    }
39
+}

+ 40
- 0
common/src/main/java/com/njyunzhi/common/util/excel/TimestampConverter.java Wyświetl plik

@@ -0,0 +1,40 @@
1
+package com.njyunzhi.common.util.excel;
2
+
3
+import com.alibaba.excel.converters.Converter;
4
+import com.alibaba.excel.enums.CellDataTypeEnum;
5
+import com.alibaba.excel.metadata.GlobalConfiguration;
6
+import com.alibaba.excel.metadata.data.WriteCellData;
7
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
8
+
9
+import java.sql.Timestamp;
10
+import java.text.SimpleDateFormat;
11
+
12
+public class TimestampConverter implements Converter<Timestamp> {
13
+    @Override
14
+    public Class supportJavaTypeKey() {
15
+        return Timestamp.class;
16
+    }
17
+
18
+    @Override
19
+    public CellDataTypeEnum supportExcelTypeKey() {
20
+        return CellDataTypeEnum.STRING;
21
+    }
22
+
23
+    /**
24
+     * 写 Excel
25
+     * @param value
26
+     * @param contentProperty
27
+     * @param globalConfiguration
28
+     * @return
29
+     * @throws Exception
30
+     */
31
+    @Override
32
+    public WriteCellData<?> convertToExcelData(Timestamp value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
33
+        if (null == value) return null;
34
+
35
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
36
+        String val = dateFormat.format(value);
37
+
38
+        return new WriteCellData(val);
39
+    }
40
+}

+ 1103
- 0
db/.back_global_funding(支付)/T20240226202253.pdma.json
Plik diff jest za duży
Wyświetl plik


+ 4180
- 0
db/.back_global_funding(支付)/T20240226202350.pdma.json
Plik diff jest za duży
Wyświetl plik


+ 5504
- 0
db/.back_global_funding(支付)/T20240226204255.pdma.json
Plik diff jest za duży
Wyświetl plik


+ 5504
- 0
db/.back_global_funding(支付)/T20240226210033.pdma.json
Plik diff jest za duży
Wyświetl plik


+ 5504
- 0
db/.back_global_funding(支付)/T20240226210606.pdma.json
Plik diff jest za duży
Wyświetl plik


+ 5504
- 0
db/.back_global_funding(支付)/T20240226210647.pdma.json
Plik diff jest za duży
Wyświetl plik


+ 5504
- 0
db/global_funding(支付).pdma.json
Plik diff jest za duży
Wyświetl plik


+ 66
- 0
framework/pom.xml Wyświetl plik

@@ -0,0 +1,66 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+    <parent>
6
+        <artifactId>demo</artifactId>
7
+        <groupId>com.njyunzhi</groupId>
8
+        <version>0.0.1</version>
9
+    </parent>
10
+    <modelVersion>4.0.0</modelVersion>
11
+
12
+    <artifactId>yz_framework</artifactId>
13
+
14
+    <properties>
15
+        <maven.compiler.source>8</maven.compiler.source>
16
+        <maven.compiler.target>8</maven.compiler.target>
17
+    </properties>
18
+
19
+    <dependencies>
20
+        <dependency>
21
+            <groupId>com.njyunzhi</groupId>
22
+            <artifactId>yz_common</artifactId>
23
+            <version>0.0.1</version>
24
+            <scope>compile</scope>
25
+        </dependency>
26
+
27
+        <dependency>
28
+            <groupId>org.springframework.boot</groupId>
29
+            <artifactId>spring-boot-starter-aop</artifactId>
30
+        </dependency>
31
+
32
+        <dependency>
33
+            <groupId>com.mysql</groupId>
34
+            <artifactId>mysql-connector-j</artifactId>
35
+            <scope>runtime</scope>
36
+        </dependency>
37
+
38
+        <!-- Sa-Token 权限认证, 在线文档:https://sa-token.cc/ -->
39
+        <dependency>
40
+            <groupId>cn.dev33</groupId>
41
+            <artifactId>sa-token-spring-boot-starter</artifactId>
42
+            <version>${sa-token.version}</version>
43
+        </dependency>
44
+
45
+        <!-- Sa-Token 整合redis (使用jackson序列化方式) -->
46
+        <dependency>
47
+            <groupId>cn.dev33</groupId>
48
+            <artifactId>sa-token-dao-redis-jackson</artifactId>
49
+            <version>${sa-token.version}</version>
50
+        </dependency>
51
+
52
+        <!-- 提供Redis连接池 -->
53
+        <dependency>
54
+            <groupId>org.apache.commons</groupId>
55
+            <artifactId>commons-pool2</artifactId>
56
+        </dependency>
57
+
58
+        <!--mybatis-plus start-->
59
+        <dependency>
60
+            <groupId>com.baomidou</groupId>
61
+            <artifactId>mybatis-plus-boot-starter</artifactId>
62
+            <version>${mybatis-plus.version}</version>
63
+        </dependency>
64
+        <!--mybatis-plus end-->
65
+    </dependencies>
66
+</project>

+ 20
- 0
framework/src/main/java/com/njyunzhi/framework/accesslimit/AccessLimit.java Wyświetl plik

@@ -0,0 +1,20 @@
1
+package com.njyunzhi.framework.accesslimit;
2
+
3
+import java.lang.annotation.*;
4
+
5
+@Inherited
6
+@Documented
7
+@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
8
+@Retention(RetentionPolicy.RUNTIME)
9
+public @interface AccessLimit {
10
+
11
+    /**
12
+     * 指定 second 时间内 API请求次数
13
+     */
14
+    int maxCount() default 999;
15
+
16
+    /**
17
+     * 请求次数的指定时间范围 秒数(redis数据过期时间)
18
+     */
19
+    int second() default 60;
20
+}

+ 79
- 0
framework/src/main/java/com/njyunzhi/framework/accesslimit/AccessLimitInterceptor.java Wyświetl plik

@@ -0,0 +1,79 @@
1
+package com.njyunzhi.framework.accesslimit;
2
+
3
+import cn.dev33.satoken.util.SaResult;
4
+import com.njyunzhi.common.util.IpUtil;
5
+import com.njyunzhi.framework.util.RedisTool;
6
+import lombok.extern.slf4j.Slf4j;
7
+import org.springframework.stereotype.Component;
8
+import org.springframework.web.method.HandlerMethod;
9
+import org.springframework.web.servlet.HandlerInterceptor;
10
+
11
+import javax.servlet.http.HttpServletRequest;
12
+import javax.servlet.http.HttpServletResponse;
13
+import java.io.IOException;
14
+import java.lang.reflect.Method;
15
+
16
+@Slf4j
17
+@Component
18
+public class AccessLimitInterceptor implements HandlerInterceptor {
19
+
20
+    @Override
21
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
22
+
23
+        try {// Handler 是否为 HandlerMethod 实例
24
+            if (handler instanceof HandlerMethod) {
25
+                // 强转
26
+                HandlerMethod handlerMethod = (HandlerMethod) handler;
27
+                // 获取方法
28
+                Method method = handlerMethod.getMethod();
29
+                // 是否有AccessLimit注解
30
+                if (!method.isAnnotationPresent(AccessLimit.class)) {
31
+                    return true;
32
+                }
33
+                // 获取注解内容信息
34
+                AccessLimit accessLimit = method.getAnnotation(AccessLimit.class);
35
+                if (accessLimit == null) {
36
+                    return true;
37
+                }
38
+                int seconds = accessLimit.second();
39
+                int maxCount = accessLimit.maxCount();
40
+
41
+                // 存储key
42
+                String ip = IpUtil.getIpAddr(request);
43
+                String key = ip + ":" + request.getRequestURI();
44
+
45
+                // 已经访问的次数
46
+                Integer count = (Integer) RedisTool.get(key);
47
+//                System.out.println("已经访问的次数:" + count);
48
+                if (null == count || -1 == count) {
49
+                    RedisTool.set(key, 1, seconds);
50
+                    return true;
51
+                }
52
+
53
+                if (count < maxCount) {
54
+                    count += 1;
55
+                    RedisTool.update(key, count);
56
+                    return true;
57
+                }
58
+                String tenantId = request.getHeader("x-tenant-id");
59
+
60
+
61
+
62
+                SaResult result = new SaResult().setCode(500).setMsg("请求过于频繁请稍后再试");
63
+                sendJSON(result, response);
64
+                return false;
65
+            }
66
+
67
+            return true;
68
+        } catch (Exception e) {
69
+            e.printStackTrace();
70
+            return false;
71
+        }
72
+    }
73
+
74
+    private void sendJSON(SaResult result, HttpServletResponse response) throws IOException {
75
+        response.setCharacterEncoding("UTF-8");
76
+        response.setContentType("application/json");
77
+        response.getWriter().append(result.toString());
78
+    }
79
+}

+ 25
- 0
framework/src/main/java/com/njyunzhi/framework/accesslimit/InterCepTerConfig.java Wyświetl plik

@@ -0,0 +1,25 @@
1
+package com.njyunzhi.framework.accesslimit;
2
+
3
+import org.springframework.beans.factory.annotation.Autowired;
4
+import org.springframework.beans.factory.annotation.Value;
5
+import org.springframework.context.annotation.Configuration;
6
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
7
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
8
+
9
+@Configuration
10
+public class InterCepTerConfig implements WebMvcConfigurer {
11
+
12
+    @Value("${access-limit.enabled}")
13
+    Boolean enabled;
14
+    @Autowired
15
+    private AccessLimitInterceptor accessLimitInterceptor;
16
+
17
+    @Override
18
+    public void addInterceptors(InterceptorRegistry registry) {
19
+        if (null != enabled && enabled) {
20
+            registry.addInterceptor(accessLimitInterceptor)
21
+                    .addPathPatterns("/**");
22
+        }
23
+
24
+    }
25
+}

+ 14
- 0
framework/src/main/java/com/njyunzhi/framework/config/FilterConfig.java Wyświetl plik

@@ -0,0 +1,14 @@
1
+package com.njyunzhi.framework.config;
2
+
3
+import lombok.Data;
4
+import org.springframework.boot.context.properties.ConfigurationProperties;
5
+import org.springframework.stereotype.Component;
6
+
7
+import java.util.List;
8
+
9
+@Data
10
+@Component
11
+@ConfigurationProperties(prefix = "yz.filter")
12
+public class FilterConfig {
13
+    List<String> annList;
14
+}

+ 31
- 0
framework/src/main/java/com/njyunzhi/framework/config/LocalDateTimeSerializerConfig.java Wyświetl plik

@@ -0,0 +1,31 @@
1
+package com.njyunzhi.framework.config;
2
+
3
+import com.fasterxml.jackson.databind.ObjectMapper;
4
+import com.fasterxml.jackson.databind.SerializationFeature;
5
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
6
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
7
+import org.springframework.beans.factory.annotation.Value;
8
+import org.springframework.context.annotation.Bean;
9
+import org.springframework.context.annotation.Configuration;
10
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
11
+
12
+import java.time.LocalDateTime;
13
+import java.time.format.DateTimeFormatter;
14
+
15
+// 解决 request body 不能接收 日期问题
16
+
17
+@Configuration
18
+public class LocalDateTimeSerializerConfig {
19
+
20
+    @Value("${spring.jackson.date-format}")
21
+    private String pattern;
22
+
23
+    @Bean
24
+    public ObjectMapper serializingObjectMapper() {
25
+        JavaTimeModule module = new JavaTimeModule();
26
+        LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
27
+        module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
28
+        return Jackson2ObjectMapperBuilder.json().modules(module)
29
+                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
30
+    }
31
+}

+ 25
- 0
framework/src/main/java/com/njyunzhi/framework/config/SwaggerConfig.java Wyświetl plik

@@ -0,0 +1,25 @@
1
+package com.njyunzhi.framework.config;
2
+
3
+
4
+import io.swagger.annotations.Api;
5
+import org.springframework.context.annotation.Bean;
6
+import org.springframework.context.annotation.Configuration;
7
+import springfox.documentation.builders.PathSelectors;
8
+import springfox.documentation.builders.RequestHandlerSelectors;
9
+import springfox.documentation.spi.DocumentationType;
10
+import springfox.documentation.spring.web.plugins.Docket;
11
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
12
+
13
+@Configuration
14
+@EnableSwagger2
15
+public class SwaggerConfig {
16
+    @Bean
17
+    public Docket docket() {
18
+        return new Docket(DocumentationType.SWAGGER_2)
19
+                .select()
20
+                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
21
+                .paths(PathSelectors.any())
22
+                .build();
23
+
24
+    }
25
+}

+ 16
- 0
framework/src/main/java/com/njyunzhi/framework/config/TenantConfig.java Wyświetl plik

@@ -0,0 +1,16 @@
1
+package com.njyunzhi.framework.config;
2
+
3
+import lombok.Data;
4
+import org.springframework.boot.context.properties.ConfigurationProperties;
5
+import org.springframework.stereotype.Component;
6
+
7
+import java.util.List;
8
+
9
+@Data
10
+@Component
11
+@ConfigurationProperties(prefix = "yz.tenant")
12
+public class TenantConfig {
13
+    Boolean enabled;
14
+    String defaultId;
15
+    List<String> whiteList;
16
+}

+ 19
- 0
framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeConfigure.java Wyświetl plik

@@ -0,0 +1,19 @@
1
+package com.njyunzhi.framework.datascope;
2
+
3
+import org.springframework.context.annotation.Configuration;
4
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
5
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
6
+
7
+/**
8
+ * 业务操作需要依赖 Sa-Token
9
+ * Sa-Token 通过 Filter 注入相关业务
10
+ * 当前数据权限的业务,必须在其之后, 因此使用了 拦截器
11
+ */
12
+@Configuration
13
+public class DataScopeConfigure implements WebMvcConfigurer {
14
+    @Override
15
+    public void addInterceptors(InterceptorRegistry registry) {
16
+        // 注册 Sa-Token 拦截器,打开注解式鉴权功能
17
+        registry.addInterceptor(new DataScopeInterceptor()).addPathPatterns("/**");
18
+    }
19
+}

+ 20
- 0
framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeInterceptor.java Wyświetl plik

@@ -0,0 +1,20 @@
1
+package com.njyunzhi.framework.datascope;
2
+
3
+import cn.dev33.satoken.stp.StpUtil;
4
+import org.springframework.web.servlet.HandlerInterceptor;
5
+
6
+import javax.servlet.http.HttpServletRequest;
7
+import javax.servlet.http.HttpServletResponse;
8
+
9
+public class DataScopeInterceptor implements HandlerInterceptor {
10
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
11
+
12
+        // 只有登录成功才可以
13
+        if (StpUtil.isLogin()) {
14
+            // TODO
15
+            request.setAttribute("dataScopeSqlHandler", new SqlHandlerImpl());
16
+        }
17
+
18
+        return true;
19
+    }
20
+}

+ 45
- 0
framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeType.java Wyświetl plik

@@ -0,0 +1,45 @@
1
+package com.njyunzhi.framework.datascope;
2
+
3
+import java.util.Objects;
4
+
5
+public enum DataScopeType {
6
+    ALL(1, "全部"),
7
+    SELF(2, "仅本人"),
8
+    DEPT(4, "仅当前部门"),
9
+    DEPT_AND_CHILDREN(8, "当前部门及以下"),
10
+    CUSTOM(16, "自定义"),
11
+    ;
12
+
13
+    private Integer code;
14
+    private String name;
15
+
16
+    DataScopeType(Integer code, String name) {
17
+        this.code = code;
18
+        this.name = name;
19
+    }
20
+
21
+    public static DataScopeType of(Integer code) {
22
+
23
+        Objects.requireNonNull(code, "数据范围权限类型不允许为空");
24
+
25
+        for (DataScopeType dataScopeType : DataScopeType.values()) {
26
+            if (dataScopeType.getCode().equals(code)) {
27
+                return dataScopeType;
28
+            }
29
+        }
30
+
31
+        throw new IllegalArgumentException(String.format("未识别的数据范围权限类型值[%s]", code));
32
+    }
33
+
34
+    public Integer getCode() {
35
+        return code;
36
+    }
37
+
38
+    public String getName() {
39
+        return name;
40
+    }
41
+
42
+    public boolean eq(DataScopeType target) {
43
+        return Objects.equals(code, target.getCode());
44
+    }
45
+}

+ 26
- 0
framework/src/main/java/com/njyunzhi/framework/datascope/DataScopeUtil.java Wyświetl plik

@@ -0,0 +1,26 @@
1
+package com.njyunzhi.framework.datascope;
2
+
3
+import org.springframework.web.context.request.RequestContextHolder;
4
+import org.springframework.web.context.request.ServletRequestAttributes;
5
+
6
+import javax.servlet.http.HttpServletRequest;
7
+import java.util.Objects;
8
+
9
+public class DataScopeUtil {
10
+    public static ISQLHandler getSQLHandler() {
11
+        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
12
+        return (ISQLHandler) request.getAttribute("dataScopeSqlHandler");
13
+    }
14
+
15
+    public static String getSQL1(String resourceCode, String tableAlias) {
16
+        return getSQLHandler().getSQL1(resourceCode, tableAlias);
17
+    }
18
+
19
+    public static String getSQL2(String resourceCode, String tableAlias) {
20
+        return getSQLHandler().getSQL2(resourceCode, tableAlias);
21
+    }
22
+
23
+    public static String getSQL3(String resourceCode, String tableAlias) {
24
+        return getSQLHandler().getSQL3(resourceCode, tableAlias);
25
+    }
26
+}

+ 28
- 0
framework/src/main/java/com/njyunzhi/framework/datascope/ISQLHandler.java Wyświetl plik

@@ -0,0 +1,28 @@
1
+package com.njyunzhi.framework.datascope;
2
+
3
+public interface ISQLHandler {
4
+
5
+    /**
6
+     * 获取 WHERE 权限拼接语句
7
+     * @param resourceCode
8
+     * @param tableAlias
9
+     * @return
10
+     */
11
+    String getSQL1(String resourceCode, String tableAlias);
12
+
13
+    /**
14
+     * 获取 WHERE 权限拼接语句 - 预留
15
+     * @param resourceCode
16
+     * @param tableAlias
17
+     * @return
18
+     */
19
+    String getSQL2(String resourceCode, String tableAlias);
20
+
21
+    /**
22
+     * 获取 WHERE 权限拼接语句 - 预留
23
+     * @param resourceCode
24
+     * @param tableAlias
25
+     * @return
26
+     */
27
+    String getSQL3(String resourceCode, String tableAlias);
28
+}

+ 59
- 0
framework/src/main/java/com/njyunzhi/framework/datascope/SqlHandlerImpl.java Wyświetl plik

@@ -0,0 +1,59 @@
1
+package com.njyunzhi.framework.datascope;
2
+
3
+import cn.dev33.satoken.stp.StpUtil;
4
+import com.njyunzhi.framework.util.SpringContextUtil;
5
+import org.springframework.web.context.request.RequestContextHolder;
6
+import org.springframework.web.context.request.ServletRequestAttributes;
7
+
8
+import javax.servlet.http.HttpServletRequest;
9
+import java.util.List;
10
+import java.util.Objects;
11
+
12
+public class SqlHandlerImpl implements ISQLHandler {
13
+
14
+//    private HttpServletRequest getRequest() {
15
+//        return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
16
+//    }
17
+//
18
+//    private SysUserMapper getUserMapper() {
19
+//        return SpringContextUtil.getBean("sysUserMapper", SysUserMapper.class);
20
+//    }
21
+//
22
+//    private SysModuleMapper getModuleMapper() {
23
+//        return SpringContextUtil.getBean("sysModuleMapper", SysModuleMapper.class);
24
+//    }
25
+
26
+    @Override
27
+    public String getSQL1(String resourceCode, String tableAlias) {
28
+//        HttpServletRequest request = getRequest();
29
+//        String loginType = (String) request.getAttribute("loginType");
30
+//
31
+//        if (Constants.TENANT_USER.equals(loginType)) {
32
+//            String userId = (String) StpUtil.getLoginId();
33
+//            SysModuleMapper sysModuleMapper = getModuleMapper();
34
+//
35
+//            SysModule sysModule = sysModuleMapper.getByCode(resourceCode);
36
+//            if (null == sysModule) return null;
37
+//
38
+//            String key = resourceCode + "-" + userId;
39
+//            List<String> authList = (List<String>) request.getAttribute(key);
40
+//            if (null == authList) return null;
41
+//
42
+//            // 最后组装方式 t.fieldId IN ( '1', '2', '3' )
43
+//            String inSql = String.format(" %s.%s IN ( %s ) ", tableAlias, sysModule.getPrimaryKey(), String.join("','", authList));
44
+//            return inSql;
45
+//        }
46
+//
47
+        return null;
48
+    }
49
+
50
+    @Override
51
+    public String getSQL2(String resourceCode, String tableAlias) {
52
+        return null;
53
+    }
54
+
55
+    @Override
56
+    public String getSQL3(String resourceCode, String tableAlias) {
57
+        return null;
58
+    }
59
+}

+ 42
- 0
framework/src/main/java/com/njyunzhi/framework/exception/GlobalExceptionHandler.java Wyświetl plik

@@ -0,0 +1,42 @@
1
+package com.njyunzhi.framework.exception;
2
+
3
+import cn.dev33.satoken.exception.SaTokenException;
4
+import cn.dev33.satoken.util.SaResult;
5
+import lombok.extern.slf4j.Slf4j;
6
+import org.springframework.validation.ObjectError;
7
+import org.springframework.web.bind.MethodArgumentNotValidException;
8
+import org.springframework.web.bind.annotation.ExceptionHandler;
9
+import org.springframework.web.bind.annotation.ResponseBody;
10
+import org.springframework.web.bind.annotation.RestControllerAdvice;
11
+
12
+import java.util.List;
13
+
14
+@Slf4j
15
+@RestControllerAdvice
16
+public class GlobalExceptionHandler {
17
+
18
+    @ResponseBody
19
+    @ExceptionHandler(SaTokenException.class)
20
+    public SaResult handleSaTokenException(Exception e){
21
+        e.printStackTrace();
22
+        return SaResult.error(e.getMessage());
23
+    }
24
+
25
+    @ResponseBody
26
+    @ExceptionHandler(Exception.class)
27
+    public SaResult handleException(Exception e){
28
+        e.printStackTrace();
29
+        return SaResult.error(e.getMessage());
30
+    }
31
+
32
+    @ResponseBody
33
+    @ExceptionHandler(MethodArgumentNotValidException.class)
34
+    public SaResult handleValidException(MethodArgumentNotValidException e) {
35
+        e.printStackTrace();
36
+
37
+        List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
38
+        ObjectError err = allErrors.get(0);
39
+
40
+        return SaResult.error(err.getDefaultMessage());
41
+    }
42
+}

+ 27
- 0
framework/src/main/java/com/njyunzhi/framework/log/OpLog.java Wyświetl plik

@@ -0,0 +1,27 @@
1
+package com.njyunzhi.framework.log;
2
+
3
+import java.lang.annotation.*;
4
+
5
+@Target({ ElementType.METHOD })
6
+@Retention(RetentionPolicy.RUNTIME)
7
+@Documented
8
+public @interface OpLog {
9
+
10
+    /**
11
+     * 模块
12
+     * @return
13
+     */
14
+    String module() default "";
15
+
16
+    /**
17
+     * 动作
18
+     * @return
19
+     */
20
+    String action() default "";
21
+
22
+    /**
23
+     * 详细描述
24
+     * @return
25
+     */
26
+    String desc() default "";
27
+}

+ 108
- 0
framework/src/main/java/com/njyunzhi/framework/log/OpLogAspect.java Wyświetl plik

@@ -0,0 +1,108 @@
1
+package com.njyunzhi.framework.log;
2
+
3
+import com.njyunzhi.common.util.IpUtil;
4
+import com.njyunzhi.framework.service.IOpLogService;
5
+import com.njyunzhi.framework.service.IUserService;
6
+import lombok.extern.slf4j.Slf4j;
7
+import org.aspectj.lang.JoinPoint;
8
+import org.aspectj.lang.annotation.AfterReturning;
9
+import org.aspectj.lang.annotation.Aspect;
10
+import org.aspectj.lang.annotation.Pointcut;
11
+import org.aspectj.lang.reflect.MethodSignature;
12
+import org.springframework.beans.factory.annotation.Autowired;
13
+import org.springframework.core.DefaultParameterNameDiscoverer;
14
+import org.springframework.expression.EvaluationContext;
15
+import org.springframework.expression.Expression;
16
+import org.springframework.expression.common.TemplateParserContext;
17
+import org.springframework.expression.spel.standard.SpelExpressionParser;
18
+import org.springframework.expression.spel.support.StandardEvaluationContext;
19
+import org.springframework.stereotype.Component;
20
+
21
+import javax.servlet.http.HttpServletRequest;
22
+import java.lang.reflect.Method;
23
+import java.util.HashMap;
24
+import java.util.Map;
25
+
26
+@Aspect
27
+@Component
28
+@Slf4j
29
+public class OpLogAspect {
30
+
31
+    @Autowired
32
+    IOpLogService opLogService;
33
+
34
+    @Autowired
35
+    IUserService userService;
36
+
37
+    @Autowired
38
+    HttpServletRequest request;
39
+
40
+    /**
41
+     * 用于SpEL表达式解析.
42
+     */
43
+    private static SpelExpressionParser parser = new SpelExpressionParser();
44
+    /**
45
+     * 用于获取方法参数定义名字.  能根据你传入的方法 获取该方法的参数名
46
+     */
47
+    private static DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
48
+    // 需要被SpEl解析的模板前缀和后缀 {{ expression  }}
49
+    private static final TemplateParserContext TEMPLATE_PARSER_CONTEXT = new TemplateParserContext("{{", "}}");
50
+
51
+    /**
52
+     * 切点
53
+     */
54
+    @Pointcut("@annotation(com.njyunzhi.framework.log.OpLog)")
55
+    public void opLogPointCut() {}
56
+
57
+    @AfterReturning(value = "opLogPointCut()", returning = "jsonResult")
58
+    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
59
+        try {
60
+            Object user = request.getAttribute("user");
61
+            String ip = IpUtil.getIpAddr(request);
62
+            String ua = request.getHeader("User-Agent");
63
+//            String tenantId = (String) request.getAttribute("tenantId");
64
+
65
+            Map<String, Object> data = new HashMap<>();
66
+            data.put("uri", request.getRequestURI());
67
+            data.put("ip", ip);
68
+            data.put("ua", ua);
69
+            data.put("user", user);
70
+            //
71
+            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
72
+            Method method = methodSignature.getMethod();
73
+            OpLog opLog = method.getAnnotation(OpLog.class);
74
+            if (opLog != null) {
75
+                data.put("module", opLog.module());
76
+                data.put("action", opLog.action());
77
+                if (null != opLog.desc() && !"".equals(opLog.desc())) {
78
+                    data.put("desc", generateKeyBySpEL(opLog.desc(), joinPoint));
79
+                }
80
+            }
81
+
82
+            opLogService.save(data);
83
+        } catch (Exception e) {
84
+            e.printStackTrace();
85
+        }
86
+    }
87
+
88
+    private String generateKeyBySpEL(String spELString, JoinPoint joinPoint) {
89
+        // 通过joinPoint获取被注解方法
90
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
91
+        Method method = methodSignature.getMethod();
92
+        // 使用spring的DefaultParameterNameDiscoverer获取方法形参名数组
93
+        String[] paramNames = nameDiscoverer.getParameterNames(method);
94
+        // 解析过后的Spring表达式对象
95
+        Expression expression = parser.parseExpression(spELString, TEMPLATE_PARSER_CONTEXT);
96
+        // spring的表达式上下文对象
97
+        EvaluationContext context = new StandardEvaluationContext();
98
+        // 通过joinPoint获取被注解方法的形参
99
+        Object[] args = joinPoint.getArgs();
100
+        // 给上下文赋值
101
+        for (int i = 0; i < args.length; i++) {
102
+            context.setVariable(paramNames[i], args[i]);
103
+        }
104
+        // 表达式从上下文中计算出实际参数值
105
+        return expression.getValue(context).toString();
106
+    }
107
+
108
+}

+ 68
- 0
framework/src/main/java/com/njyunzhi/framework/mybatisplus/MyMetaObjectHandler.java Wyświetl plik

@@ -0,0 +1,68 @@
1
+package com.njyunzhi.framework.mybatisplus;
2
+
3
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
4
+import com.njyunzhi.framework.service.IUserService;
5
+import lombok.extern.slf4j.Slf4j;
6
+import org.apache.ibatis.reflection.MetaObject;
7
+import org.springframework.stereotype.Component;
8
+
9
+import javax.annotation.Resource;
10
+import javax.servlet.http.HttpServletRequest;
11
+import java.time.LocalDateTime;
12
+
13
+@Slf4j
14
+@Component
15
+public class MyMetaObjectHandler implements MetaObjectHandler {
16
+
17
+    @Resource
18
+    HttpServletRequest request;
19
+
20
+    @Resource
21
+    IUserService userService;
22
+
23
+
24
+    @Override
25
+    public void insertFill(MetaObject metaObject) {
26
+//        String loginType = (String) request.getAttribute("loginType");
27
+
28
+        try {
29
+            Object user = request.getAttribute("user");
30
+            String tenantId = (String) request.getAttribute("tenantId");
31
+            String userId = userService.getUserIdBy(user);
32
+
33
+            if (user != null) {
34
+                this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);
35
+                this.strictInsertFill(metaObject, "createdBy", () -> userId, String.class);
36
+                this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
37
+                this.strictInsertFill(metaObject, "updatedBy", () -> userId, String.class);
38
+            }
39
+            if (null != tenantId) {
40
+                this.strictInsertFill(metaObject, "tenantId", () -> tenantId, String.class);
41
+            }
42
+
43
+            this.strictInsertFill(metaObject, "deleted", () -> 0, Integer.class);
44
+//            metaObject.setValue("deleted",0);
45
+        } catch (Exception e) {
46
+            e.printStackTrace();
47
+        }
48
+    }
49
+
50
+    @Override
51
+    public void updateFill(MetaObject metaObject) {
52
+//        String loginType = (String) request.getAttribute("loginType");
53
+
54
+        try {
55
+            Object user = request.getAttribute("user");
56
+//            String tenantId = (String) request.getAttribute("tenantId");
57
+            String userId = userService.getUserIdBy(user);
58
+            String userName = userService.getUserNameBy(user);
59
+
60
+//            if (user != null) {
61
+                this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
62
+                this.strictInsertFill(metaObject, "updatedBy", () -> userId, String.class);
63
+//            }
64
+        } catch (Exception e) {
65
+            e.printStackTrace();
66
+        }
67
+    }
68
+}

+ 61
- 0
framework/src/main/java/com/njyunzhi/framework/mybatisplus/MybatisPlusConfig.java Wyświetl plik

@@ -0,0 +1,61 @@
1
+package com.njyunzhi.framework.mybatisplus;
2
+
3
+import com.baomidou.mybatisplus.annotation.DbType;
4
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
5
+import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
6
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
7
+import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
8
+import com.njyunzhi.framework.config.TenantConfig;
9
+import net.sf.jsqlparser.expression.Expression;
10
+import net.sf.jsqlparser.expression.StringValue;
11
+import org.springframework.context.annotation.Bean;
12
+import org.springframework.context.annotation.Configuration;
13
+
14
+import javax.annotation.Resource;
15
+import javax.servlet.http.HttpServletRequest;
16
+
17
+@Configuration
18
+public class MybatisPlusConfig {
19
+    @Resource
20
+    HttpServletRequest request;
21
+
22
+    @Resource
23
+    TenantConfig tenantConfig;
24
+
25
+    @Bean
26
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
27
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
28
+
29
+        // 分页插件
30
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
31
+
32
+        if (tenantConfig.getEnabled()) {
33
+            // 多租户插件
34
+            interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
35
+                @Override
36
+                public Expression getTenantId() {
37
+                    // request 中的 tenantId 是在 sa-token 中设置的
38
+                    String tenantId = (String) request.getAttribute("tenantId");
39
+                    return new StringValue(tenantId == null ? tenantConfig.getDefaultId() : tenantId);
40
+                }
41
+
42
+                @Override
43
+                public String getTenantIdColumn() {
44
+                    return "tenant_id";
45
+                }
46
+
47
+                // 设置不用添加租户查询条件的表
48
+                @Override
49
+                public boolean ignoreTable(String tableName) {
50
+                    return tenantConfig.getWhiteList().contains(tableName);
51
+                }
52
+            }));
53
+        }
54
+
55
+        return interceptor;
56
+    }
57
+
58
+
59
+
60
+
61
+}

+ 44
- 0
framework/src/main/java/com/njyunzhi/framework/satoken/SaServletFilter2.java Wyświetl plik

@@ -0,0 +1,44 @@
1
+package com.njyunzhi.framework.satoken;
2
+
3
+import cn.dev33.satoken.stp.StpUtil;
4
+import com.njyunzhi.framework.service.IUserService;
5
+import lombok.SneakyThrows;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.core.annotation.Order;
8
+import org.springframework.stereotype.Component;
9
+
10
+import javax.servlet.*;
11
+import java.io.IOException;
12
+
13
+/**
14
+ * 比 SaServletFilter 的排序大即可
15
+     * SaServletFilter 的默认排序是负数
16
+ * 主要作用附加当前用户信息
17
+ */
18
+@Order(1)
19
+@Component
20
+public class SaServletFilter2 implements Filter {
21
+
22
+    @Autowired
23
+    IUserService userService;
24
+
25
+    @SneakyThrows
26
+    @Override
27
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
28
+        // 只有登录之后才行
29
+        if (StpUtil.isLogin()) {
30
+            appendUser(servletRequest);
31
+        }
32
+
33
+        //
34
+        filterChain.doFilter(servletRequest, servletResponse);
35
+    }
36
+
37
+    private void appendUser(ServletRequest request) throws Exception{
38
+        Object user = userService.getUserBy(StpUtil.getLoginId());
39
+        if (null != user) {
40
+            request.setAttribute("user", user);
41
+        }
42
+        request.setAttribute("tenantId", userService.getTenantIdBy(user));
43
+    }
44
+}

+ 55
- 0
framework/src/main/java/com/njyunzhi/framework/satoken/SaTokenConfigure.java Wyświetl plik

@@ -0,0 +1,55 @@
1
+package com.njyunzhi.framework.satoken;
2
+
3
+import cn.dev33.satoken.context.SaHolder;
4
+import cn.dev33.satoken.exception.SaTokenException;
5
+import cn.dev33.satoken.filter.SaServletFilter;
6
+import cn.dev33.satoken.router.SaHttpMethod;
7
+import cn.dev33.satoken.router.SaRouter;
8
+import cn.dev33.satoken.stp.StpUtil;
9
+import cn.dev33.satoken.util.SaResult;
10
+import com.njyunzhi.framework.config.FilterConfig;
11
+import org.springframework.context.annotation.Bean;
12
+import org.springframework.context.annotation.Configuration;
13
+
14
+import javax.annotation.Resource;
15
+
16
+@Configuration
17
+public class SaTokenConfigure {
18
+
19
+    @Resource
20
+    FilterConfig filterConfig;
21
+
22
+    @Bean
23
+    public SaServletFilter getSaServletFilter() {
24
+        SaServletFilter saServletFilter = new SaServletFilter();
25
+        saServletFilter.addInclude("/**");
26
+        saServletFilter.addExclude(filterConfig.getAnnList().toArray(new String[0]));
27
+        saServletFilter.setAuth(auth -> {
28
+            // OPTIONS 请求不校验, 主要是为了解决跨域问题
29
+            SaRouter.notMatch(SaHttpMethod.OPTIONS).check(r -> {
30
+//                SaHolder.getRequest()
31
+//
32
+//                System.out.println("----------------------TOKEN--------------");
33
+//                System.out.println(StpUtil.isLogin());
34
+//System.out.println(StpUtil.getTokenValue());
35
+                // 平台账户或者租户必须登录一个
36
+                if (!StpUtil.isLogin()) {
37
+                    throw new SaTokenException("请登录后再访问接口");
38
+                }
39
+            });
40
+        });
41
+
42
+        saServletFilter.setError(err -> {
43
+            SaHolder.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8");
44
+            SaHolder.getResponse().setStatus(200);
45
+            return SaResult.error(err.getMessage()).setCode(401);
46
+        });
47
+
48
+        return saServletFilter;
49
+    }
50
+
51
+    @Bean
52
+    public SaServletFilter2 getSaServletFilter2() {
53
+        return new SaServletFilter2();
54
+    }
55
+}

+ 15
- 0
framework/src/main/java/com/njyunzhi/framework/satoken/SaTokenInterceptor.java Wyświetl plik

@@ -0,0 +1,15 @@
1
+package com.njyunzhi.framework.satoken;
2
+
3
+        import cn.dev33.satoken.interceptor.SaInterceptor;
4
+        import org.springframework.context.annotation.Configuration;
5
+        import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
6
+        import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
7
+
8
+@Configuration
9
+public class SaTokenInterceptor implements WebMvcConfigurer {
10
+    @Override
11
+    public void addInterceptors(InterceptorRegistry registry) {
12
+        // 注册 Sa-Token 拦截器,打开注解式鉴权功能
13
+        registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
14
+    }
15
+}

+ 7
- 0
framework/src/main/java/com/njyunzhi/framework/service/IOpLogService.java Wyświetl plik

@@ -0,0 +1,7 @@
1
+package com.njyunzhi.framework.service;
2
+
3
+import java.util.Map;
4
+
5
+public interface IOpLogService {
6
+    void save(Map data);
7
+}

+ 35
- 0
framework/src/main/java/com/njyunzhi/framework/service/IUserService.java Wyświetl plik

@@ -0,0 +1,35 @@
1
+package com.njyunzhi.framework.service;
2
+
3
+/**
4
+ * 人员接口
5
+ */
6
+
7
+public interface IUserService {
8
+    /**
9
+     * 依据登录ID查询当前登录用户
10
+     * @param loginId
11
+     * @return
12
+     */
13
+    Object getUserBy(Object loginId)throws Exception;
14
+
15
+    /**
16
+     * 返回 user 所属租户
17
+     * @param user
18
+     * @return
19
+     */
20
+    String getTenantIdBy(Object user);
21
+
22
+    /**
23
+     * 返回 userId
24
+     * @param user
25
+     * @return
26
+     */
27
+    String getUserIdBy(Object user);
28
+
29
+    /**
30
+     * 返回 userName
31
+     * @param user
32
+     * @return
33
+     */
34
+    String getUserNameBy(Object user);
35
+}

+ 47
- 0
framework/src/main/java/com/njyunzhi/framework/util/RedisTool.java Wyświetl plik

@@ -0,0 +1,47 @@
1
+package com.njyunzhi.framework.util;
2
+
3
+import cn.dev33.satoken.SaManager;
4
+
5
+/**
6
+ * 简易版本的 Redis 客户端工具
7
+ * 借用了 Sa-token 工具
8
+ */
9
+public class RedisTool {
10
+
11
+    /**
12
+     * 获取 Value,如无返空
13
+     * @param key
14
+     * @return
15
+     */
16
+    public static Object get(String key) {
17
+        return SaManager.getSaTokenDao().getObject(key);
18
+    }
19
+
20
+    /**
21
+     * 写入 value .
22
+     * @param key
23
+     * @param value
24
+     * @param sec 存活时间 (单位: 秒)
25
+     */
26
+    public static void set(String key, Object value, long sec) {
27
+        SaManager.getSaTokenDao().setObject(key, value, sec);
28
+    }
29
+
30
+    /**
31
+     * 更新 value
32
+     * @param key
33
+     * @param value
34
+     */
35
+    public static void update(String key, Object value) {
36
+        SaManager.getSaTokenDao().updateObject(key, value);
37
+    }
38
+
39
+    /**
40
+     * 删除对象
41
+     * @param key
42
+     */
43
+    public static void remove(String key) {
44
+        SaManager.getSaTokenDao().deleteObject(key);
45
+    }
46
+
47
+}

+ 20
- 0
framework/src/main/java/com/njyunzhi/framework/util/SpringContextUtil.java Wyświetl plik

@@ -0,0 +1,20 @@
1
+package com.njyunzhi.framework.util;
2
+
3
+import org.springframework.context.ApplicationContext;
4
+
5
+public class SpringContextUtil {
6
+    private static ApplicationContext ac;
7
+
8
+    public static <T>  T getBean(String beanName, Class<T> clazz) {
9
+        T bean = ac.getBean(beanName, clazz);
10
+        return bean;
11
+    }
12
+
13
+    public static ApplicationContext getAc() {
14
+        return ac;
15
+    }
16
+
17
+    public static void setAc(ApplicationContext applicationContext){
18
+        ac = applicationContext;
19
+    }
20
+}

+ 308
- 0
mvnw Wyświetl plik

@@ -0,0 +1,308 @@
1
+#!/bin/sh
2
+# ----------------------------------------------------------------------------
3
+# Licensed to the Apache Software Foundation (ASF) under one
4
+# or more contributor license agreements.  See the NOTICE file
5
+# distributed with this work for additional information
6
+# regarding copyright ownership.  The ASF licenses this file
7
+# to you under the Apache License, Version 2.0 (the
8
+# "License"); you may not use this file except in compliance
9
+# with the License.  You may obtain a copy of the License at
10
+#
11
+#    https://www.apache.org/licenses/LICENSE-2.0
12
+#
13
+# Unless required by applicable law or agreed to in writing,
14
+# software distributed under the License is distributed on an
15
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
+# KIND, either express or implied.  See the License for the
17
+# specific language governing permissions and limitations
18
+# under the License.
19
+# ----------------------------------------------------------------------------
20
+
21
+# ----------------------------------------------------------------------------
22
+# Apache Maven Wrapper startup batch script, version 3.2.0
23
+#
24
+# Required ENV vars:
25
+# ------------------
26
+#   JAVA_HOME - location of a JDK home dir
27
+#
28
+# Optional ENV vars
29
+# -----------------
30
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
31
+#     e.g. to debug Maven itself, use
32
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
33
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
34
+# ----------------------------------------------------------------------------
35
+
36
+if [ -z "$MAVEN_SKIP_RC" ] ; then
37
+
38
+  if [ -f /usr/local/etc/mavenrc ] ; then
39
+    . /usr/local/etc/mavenrc
40
+  fi
41
+
42
+  if [ -f /etc/mavenrc ] ; then
43
+    . /etc/mavenrc
44
+  fi
45
+
46
+  if [ -f "$HOME/.mavenrc" ] ; then
47
+    . "$HOME/.mavenrc"
48
+  fi
49
+
50
+fi
51
+
52
+# OS specific support.  $var _must_ be set to either true or false.
53
+cygwin=false;
54
+darwin=false;
55
+mingw=false
56
+case "$(uname)" in
57
+  CYGWIN*) cygwin=true ;;
58
+  MINGW*) mingw=true;;
59
+  Darwin*) darwin=true
60
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
61
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
62
+    if [ -z "$JAVA_HOME" ]; then
63
+      if [ -x "/usr/libexec/java_home" ]; then
64
+        JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
65
+      else
66
+        JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
67
+      fi
68
+    fi
69
+    ;;
70
+esac
71
+
72
+if [ -z "$JAVA_HOME" ] ; then
73
+  if [ -r /etc/gentoo-release ] ; then
74
+    JAVA_HOME=$(java-config --jre-home)
75
+  fi
76
+fi
77
+
78
+# For Cygwin, ensure paths are in UNIX format before anything is touched
79
+if $cygwin ; then
80
+  [ -n "$JAVA_HOME" ] &&
81
+    JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
82
+  [ -n "$CLASSPATH" ] &&
83
+    CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
84
+fi
85
+
86
+# For Mingw, ensure paths are in UNIX format before anything is touched
87
+if $mingw ; then
88
+  [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
89
+    JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
90
+fi
91
+
92
+if [ -z "$JAVA_HOME" ]; then
93
+  javaExecutable="$(which javac)"
94
+  if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
95
+    # readlink(1) is not available as standard on Solaris 10.
96
+    readLink=$(which readlink)
97
+    if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
98
+      if $darwin ; then
99
+        javaHome="$(dirname "\"$javaExecutable\"")"
100
+        javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
101
+      else
102
+        javaExecutable="$(readlink -f "\"$javaExecutable\"")"
103
+      fi
104
+      javaHome="$(dirname "\"$javaExecutable\"")"
105
+      javaHome=$(expr "$javaHome" : '\(.*\)/bin')
106
+      JAVA_HOME="$javaHome"
107
+      export JAVA_HOME
108
+    fi
109
+  fi
110
+fi
111
+
112
+if [ -z "$JAVACMD" ] ; then
113
+  if [ -n "$JAVA_HOME"  ] ; then
114
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
115
+      # IBM's JDK on AIX uses strange locations for the executables
116
+      JAVACMD="$JAVA_HOME/jre/sh/java"
117
+    else
118
+      JAVACMD="$JAVA_HOME/bin/java"
119
+    fi
120
+  else
121
+    JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
122
+  fi
123
+fi
124
+
125
+if [ ! -x "$JAVACMD" ] ; then
126
+  echo "Error: JAVA_HOME is not defined correctly." >&2
127
+  echo "  We cannot execute $JAVACMD" >&2
128
+  exit 1
129
+fi
130
+
131
+if [ -z "$JAVA_HOME" ] ; then
132
+  echo "Warning: JAVA_HOME environment variable is not set."
133
+fi
134
+
135
+# traverses directory structure from process work directory to filesystem root
136
+# first directory with .mvn subdirectory is considered project base directory
137
+find_maven_basedir() {
138
+  if [ -z "$1" ]
139
+  then
140
+    echo "Path not specified to find_maven_basedir"
141
+    return 1
142
+  fi
143
+
144
+  basedir="$1"
145
+  wdir="$1"
146
+  while [ "$wdir" != '/' ] ; do
147
+    if [ -d "$wdir"/.mvn ] ; then
148
+      basedir=$wdir
149
+      break
150
+    fi
151
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
152
+    if [ -d "${wdir}" ]; then
153
+      wdir=$(cd "$wdir/.." || exit 1; pwd)
154
+    fi
155
+    # end of workaround
156
+  done
157
+  printf '%s' "$(cd "$basedir" || exit 1; pwd)"
158
+}
159
+
160
+# concatenates all lines of a file
161
+concat_lines() {
162
+  if [ -f "$1" ]; then
163
+    # Remove \r in case we run on Windows within Git Bash
164
+    # and check out the repository with auto CRLF management
165
+    # enabled. Otherwise, we may read lines that are delimited with
166
+    # \r\n and produce $'-Xarg\r' rather than -Xarg due to word
167
+    # splitting rules.
168
+    tr -s '\r\n' ' ' < "$1"
169
+  fi
170
+}
171
+
172
+log() {
173
+  if [ "$MVNW_VERBOSE" = true ]; then
174
+    printf '%s\n' "$1"
175
+  fi
176
+}
177
+
178
+BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
179
+if [ -z "$BASE_DIR" ]; then
180
+  exit 1;
181
+fi
182
+
183
+MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
184
+log "$MAVEN_PROJECTBASEDIR"
185
+
186
+##########################################################################################
187
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
188
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
189
+##########################################################################################
190
+wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
191
+if [ -r "$wrapperJarPath" ]; then
192
+    log "Found $wrapperJarPath"
193
+else
194
+    log "Couldn't find $wrapperJarPath, downloading it ..."
195
+
196
+    if [ -n "$MVNW_REPOURL" ]; then
197
+      wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
198
+    else
199
+      wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
200
+    fi
201
+    while IFS="=" read -r key value; do
202
+      # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
203
+      safeValue=$(echo "$value" | tr -d '\r')
204
+      case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
205
+      esac
206
+    done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
207
+    log "Downloading from: $wrapperUrl"
208
+
209
+    if $cygwin; then
210
+      wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
211
+    fi
212
+
213
+    if command -v wget > /dev/null; then
214
+        log "Found wget ... using wget"
215
+        [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
216
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
217
+            wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
218
+        else
219
+            wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
220
+        fi
221
+    elif command -v curl > /dev/null; then
222
+        log "Found curl ... using curl"
223
+        [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
224
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
225
+            curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
226
+        else
227
+            curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
228
+        fi
229
+    else
230
+        log "Falling back to using Java to download"
231
+        javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
232
+        javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
233
+        # For Cygwin, switch paths to Windows format before running javac
234
+        if $cygwin; then
235
+          javaSource=$(cygpath --path --windows "$javaSource")
236
+          javaClass=$(cygpath --path --windows "$javaClass")
237
+        fi
238
+        if [ -e "$javaSource" ]; then
239
+            if [ ! -e "$javaClass" ]; then
240
+                log " - Compiling MavenWrapperDownloader.java ..."
241
+                ("$JAVA_HOME/bin/javac" "$javaSource")
242
+            fi
243
+            if [ -e "$javaClass" ]; then
244
+                log " - Running MavenWrapperDownloader.java ..."
245
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
246
+            fi
247
+        fi
248
+    fi
249
+fi
250
+##########################################################################################
251
+# End of extension
252
+##########################################################################################
253
+
254
+# If specified, validate the SHA-256 sum of the Maven wrapper jar file
255
+wrapperSha256Sum=""
256
+while IFS="=" read -r key value; do
257
+  case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
258
+  esac
259
+done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
260
+if [ -n "$wrapperSha256Sum" ]; then
261
+  wrapperSha256Result=false
262
+  if command -v sha256sum > /dev/null; then
263
+    if echo "$wrapperSha256Sum  $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
264
+      wrapperSha256Result=true
265
+    fi
266
+  elif command -v shasum > /dev/null; then
267
+    if echo "$wrapperSha256Sum  $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
268
+      wrapperSha256Result=true
269
+    fi
270
+  else
271
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
272
+    echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
273
+    exit 1
274
+  fi
275
+  if [ $wrapperSha256Result = false ]; then
276
+    echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
277
+    echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
278
+    echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
279
+    exit 1
280
+  fi
281
+fi
282
+
283
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
284
+
285
+# For Cygwin, switch paths to Windows format before running java
286
+if $cygwin; then
287
+  [ -n "$JAVA_HOME" ] &&
288
+    JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
289
+  [ -n "$CLASSPATH" ] &&
290
+    CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
291
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
292
+    MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
293
+fi
294
+
295
+# Provide a "standardized" way to retrieve the CLI args that will
296
+# work with both Windows and non-Windows executions.
297
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
298
+export MAVEN_CMD_LINE_ARGS
299
+
300
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
301
+
302
+# shellcheck disable=SC2086 # safe args
303
+exec "$JAVACMD" \
304
+  $MAVEN_OPTS \
305
+  $MAVEN_DEBUG_OPTS \
306
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
307
+  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
308
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 0
- 0
mvnw.cmd Wyświetl plik


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików