瀏覽代碼

background: 拉取代码并修改配置

wangPH 2 年之前
父節點
當前提交
14a20ec1a7
共有 62 個文件被更改,包括 1451 次插入286 次删除
  1. 49 0
      backgroud-gateway/pom.xml
  2. 22 0
      backgroud-gateway/src/main/java/cn/kdan/compdf/GatewayApplication.java
  3. 33 0
      backgroud-gateway/src/main/java/cn/kdan/compdf/config/GateWayConfig.java
  4. 99 0
      backgroud-gateway/src/main/java/cn/kdan/compdf/filter/AuthGlobalFilter.java
  5. 55 0
      backgroud-gateway/src/main/resources/application.yml
  6. 6 0
      backgroud-gateway/src/main/resources/banner.txt
  7. 120 5
      background-common/pom.xml
  8. 79 0
      background-common/src/main/java/cn/kdan/compdf/config/JwtConfig.java
  9. 32 0
      background-common/src/main/java/cn/kdan/compdf/dto/LoginUserDTO.java
  10. 43 0
      background-common/src/main/java/cn/kdan/compdf/enums/AuthEnum.java
  11. 18 0
      background-common/src/main/java/cn/kdan/compdf/enums/DateTImeFormatEnum.java
  12. 43 0
      background-common/src/main/java/cn/kdan/compdf/enums/ResponseEnum.java
  13. 57 0
      background-common/src/main/java/cn/kdan/compdf/exception/BusinessException.java
  14. 53 0
      background-common/src/main/java/cn/kdan/compdf/utils/MD5Util.java
  15. 41 0
      background-common/src/main/java/cn/kdan/compdf/utils/TokenUtil.java
  16. 7 12
      background-common/background-common-mybatis/pom.xml
  17. 0 0
      background-mybatis/src/main/java/cn/kdan/compdf/base/BaseEntity.java
  18. 0 0
      background-mybatis/src/main/java/cn/kdan/compdf/base/R.java
  19. 0 0
      background-mybatis/src/main/java/cn/kdan/compdf/config/CustomLocalDateTimeTypeHandler.java
  20. 0 0
      background-mybatis/src/main/java/cn/kdan/compdf/config/MybatisPlusConfig.java
  21. 0 12
      background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/config/MybatisPlusMetaObjectHandler.java
  22. 0 0
      background-mybatis/src/main/java/cn/kdan/compdf/enums/BackgroundErrorEnum.java
  23. 0 0
      background-mybatis/src/main/java/cn/kdan/compdf/exception/CommonException.java
  24. 0 0
      background-mybatis/src/main/java/cn/kdan/compdf/exception/GlobalExceptionHandler.java
  25. 8 6
      background-common/background-common-redis/pom.xml
  26. 0 0
      background-redis/src/main/java/cn/kdan/compdf/config/RedisConfig.java
  27. 0 0
      background-redis/src/main/java/cn/kdan/compdf/config/RedissonConfig.java
  28. 7 2
      background-user/pom.xml
  29. 0 1
      background-user/src/main/java/cn/kdan/compdf/BackgroundUserApplication.java
  30. 14 36
      background-user/src/main/java/cn/kdan/compdf/controller/v1/BackgroundUserController.java
  31. 40 22
      background-user/src/main/java/cn/kdan/compdf/controller/v1/BackgroundUserProjectController.java
  32. 23 0
      background-user/src/main/java/cn/kdan/compdf/dto/AddNewProjectDTO.java
  33. 24 0
      background-user/src/main/java/cn/kdan/compdf/dto/ChangePasswordDTO.java
  34. 25 0
      background-user/src/main/java/cn/kdan/compdf/dto/EditProjectDTO.java
  35. 24 0
      background-user/src/main/java/cn/kdan/compdf/dto/LoginDTO.java
  36. 21 20
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundConvertData.java
  37. 9 9
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundEvent.java
  38. 1 2
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundTools.java
  39. 17 9
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUser.java
  40. 57 0
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUserBalance.java
  41. 13 13
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUserProject.java
  42. 13 9
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUserWebhook.java
  43. 9 9
      background-user/src/main/java/cn/kdan/compdf/entity/BackgroundWebhookEvent.java
  44. 3 2
      background-user/src/main/java/cn/kdan/compdf/entity/dto/AnalysisDataDTO.java
  45. 11 0
      background-user/src/main/java/cn/kdan/compdf/mapper/BackgroundUserBalanceMapper.java
  46. 38 0
      background-user/src/main/java/cn/kdan/compdf/service/BackgroundUserProjectService.java
  47. 10 0
      background-user/src/main/java/cn/kdan/compdf/service/BackgroundUserService.java
  48. 5 5
      background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundConvertDataServiceImpl.java
  49. 97 0
      background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserProjectServiceImpl.java
  50. 76 0
      background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserServiceImpl.java
  51. 45 0
      background-user/src/main/java/cn/kdan/compdf/vo/BackgroundUserProjectDTO.java
  52. 27 0
      background-user/src/main/java/cn/kdan/compdf/vo/LoginVO.java
  53. 2 2
      background-user/src/main/resources/application.yml
  54. 9 10
      background-user/src/main/resources/mapper/BackgroundConvertDataMapper.xml
  55. 5 5
      background-user/src/main/resources/mapper/BackgroundEventMapper.xml
  56. 3 3
      background-user/src/main/resources/mapper/BackgroundToolsMapper.xml
  57. 23 0
      background-user/src/main/resources/mapper/BackgroundUserBalanceMapper.xml
  58. 8 6
      background-user/src/main/resources/mapper/BackgroundUserMapper.xml
  59. 7 7
      background-user/src/main/resources/mapper/BackgroundUserProjectMapper.xml
  60. 7 6
      background-user/src/main/resources/mapper/BackgroundUserWebhookMapper.xml
  61. 5 5
      background-user/src/main/resources/mapper/BackgroundWebhookEventMapper.xml
  62. 8 68
      pom.xml

+ 49 - 0
backgroud-gateway/pom.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>background</artifactId>
+        <groupId>cn.kdan.compdf</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>backgroud-gateway</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.kdan.compdf</groupId>
+            <artifactId>background-redis</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.kdan.compdf</groupId>
+            <artifactId>background-common</artifactId>
+            <version>0.0.1</version>
+            <!--gateway 使用的是响应式的web编程模式  把传统的web编程模型刨除-->
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-web</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--网关-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-gateway</artifactId>
+            <version>${gateway.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 22 - 0
backgroud-gateway/src/main/java/cn/kdan/compdf/GatewayApplication.java

@@ -0,0 +1,22 @@
+package cn.kdan.compdf;
+
+import cn.kdan.compdf.config.JwtConfig;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Import;
+
+/**
+ * @author Bob 2022/10/10
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+// 引入commom JWT配置全局过滤器
+@Import({
+        JwtConfig.class
+})
+public class GatewayApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(GatewayApplication.class, args);
+    }
+}

+ 33 - 0
backgroud-gateway/src/main/java/cn/kdan/compdf/config/GateWayConfig.java

@@ -0,0 +1,33 @@
+package cn.kdan.compdf.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.util.pattern.PathPatternParser;
+
+
+/**
+ * @author Bob 2022-10-11
+ **/
+@Configuration
+public class GateWayConfig {
+
+    /**
+     * 配置网关跨域
+     */
+    @Bean
+    public CorsWebFilter corsFilter() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.addAllowedMethod("*");
+        config.addAllowedOrigin("*");
+        config.addAllowedHeader("*");
+
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
+        source.registerCorsConfiguration("/**", config);
+
+        return new CorsWebFilter(source);
+    }
+
+}

+ 99 - 0
backgroud-gateway/src/main/java/cn/kdan/compdf/filter/AuthGlobalFilter.java

@@ -0,0 +1,99 @@
+package cn.kdan.compdf.filter;
+
+import cn.kdan.compdf.config.JwtConfig;
+import cn.kdan.compdf.dto.LoginUserDTO;
+import cn.kdan.compdf.enums.AuthEnum;
+import cn.kdan.compdf.enums.ResponseEnum;
+import cn.kdan.compdf.exception.BusinessException;
+import com.alibaba.fastjson.JSON;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+/**
+ * 全局登录鉴权过滤器
+ * @author Bob 2022-10-12
+ **/
+@Component
+public class AuthGlobalFilter implements GlobalFilter, Ordered {
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        // 1、todo 判断放行请求地址(登录接口)
+        String requestPath = exchange.getRequest().getPath().toString();
+        if (requestPath.equals("/user-api/v1/user/login")) {
+            return chain.filter(exchange);
+        }
+
+        // 2、获取请求头jwt
+        String authorization = exchange.getRequest().getHeaders().getFirst(AuthEnum.AUTHORIZATION);
+        // 没有jwt
+        if (StringUtils.isEmpty(authorization)) {
+            ServerHttpResponse response = exchange.getResponse();
+            response.setStatusCode(HttpStatus.OK);
+            // 改变响应的类型
+            response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
+            String fastResult = JSON.toJSONString(new BusinessException(ResponseEnum.NO_LOGIN));
+            DataBuffer dataBuffer = response.bufferFactory().allocateBuffer().write(fastResult.getBytes(StandardCharsets.UTF_8));
+            return response.writeWith(Mono.just(dataBuffer));
+        }
+
+        // 3、解析
+        try {
+            LoginUserDTO loginUserDTO = JwtConfig.checkJwt(authorization);
+            // redie验证token是否过期
+            Boolean flag = redisTemplate.hasKey(AuthEnum.USER_TOKEN_REDIS + loginUserDTO.getUsername());
+            if (null == flag || !flag) {
+                ServerHttpResponse response = exchange.getResponse();
+                response.setStatusCode(HttpStatus.OK);
+                // 改变响应的类型
+                response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
+                String fastResult = JSON.toJSONString(new BusinessException(ResponseEnum.TOKEN_TIMEOUT));
+                DataBuffer dataBuffer = response.bufferFactory().allocateBuffer().write(fastResult.getBytes(StandardCharsets.UTF_8));
+                return response.writeWith(Mono.just(dataBuffer));
+            }
+
+            Consumer<HttpHeaders> httpHeaders = httpHeader -> {
+                httpHeader.set(AuthEnum.USER_ID_HEADER, loginUserDTO.getId().toString());
+                httpHeader.set(AuthEnum.USER_TEANATID, loginUserDTO.getTeanatId().toString());
+                httpHeader.set(AuthEnum.USER_NAME_HEADER, loginUserDTO.getUsername());
+//                httpHeader.set(AuthEnum.AUTHORIZATION, authorization);
+            };
+            ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().headers(httpHeaders).build();
+            exchange.mutate().request(serverHttpRequest).build();
+            return chain.filter(exchange);
+        } catch (Exception e) {
+            ServerHttpResponse response = exchange.getResponse();
+            response.setStatusCode(HttpStatus.OK);
+            // 改变响应的类型
+            response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
+            String fastResult = JSON.toJSONString(new BusinessException(ResponseEnum.TOKEN_ERROR));
+            DataBuffer dataBuffer = response.bufferFactory().allocateBuffer().write(fastResult.getBytes(StandardCharsets.UTF_8));
+            return response.writeWith(Mono.just(dataBuffer));
+        }
+    }
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+}

+ 55 - 0
backgroud-gateway/src/main/resources/application.yml

@@ -0,0 +1,55 @@
+server:
+  port: ${SERVER_PORT:8088}
+spring:
+  application:
+    name: backgroud-gateway
+  cloud:
+    nacos:
+      discovery:
+        server-addr: ${NACOS_ADDR:localhost:8848}
+        ip: ${NACOS_IP:127.0.0.1}
+        username: ${NACOS_USERNAME:nacos}
+        password: ${NACOS_PASSWORD:Nacos@123!}
+      config:
+        server-addr: ${spring.cloud.nacos.discovery.server-addr}
+        username: ${spring.cloud.nacos.discovery.username}
+        password: ${spring.cloud.nacos.discovery.password}
+        file-extension: yml
+        refresh-enabled: true
+        shared-configs:
+          - data-id: compdf.yml
+            refresh: true
+          - data-id: compdf-gateway.yml
+            refresh: true
+    gateway:
+      discovery:
+        locator:
+          enabled: true
+      routes:
+        - id: gateway
+          uri: lb://background-user
+          order: 1
+          predicates:
+            - Path=/user-api/**
+        - id: test
+          uri: https://www.baidu.com/
+          order: 1
+          predicates:
+            - Path=/test-api/**
+  redis:
+    host: ${REDIS_HOST:47.93.102.223}
+    port: ${REDIS_PORT:16379}
+    password: ${REDIS_PASSWORD:1qazZAQ!2}
+    database: ${REDIS_DATABASE:1}
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 1
+        # 连接池中的最大空闲连接
+        max-idle: 6
+        # 连接池最大连接数(使用负值表示没有限制,不要配置过大,否则可能会影响redis的性能)
+        max-active: 10
+        # 连接池最大阻塞等待时间(使用负值表示没有限制);单位毫秒
+        max-wait: 1000
+      # 关闭超时时间;单位毫秒
+      shutdown-timeout: 200

+ 6 - 0
backgroud-gateway/src/main/resources/banner.txt

@@ -0,0 +1,6 @@
+    ____             __                                    __                  __
+   / __ )____ ______/ /______ __________  __  ______  ____/ /     ____ _____ _/ /____ _      ______ ___  __
+  / __  / __ `/ ___/ //_/ __ `/ ___/ __ \/ / / / __ \/ __  /_____/ __ `/ __ `/ __/ _ \ | /| / / __ `/ / / /
+ / /_/ / /_/ / /__/ ,< / /_/ / /  / /_/ / /_/ / / / / /_/ /_____/ /_/ / /_/ / /_/  __/ |/ |/ / /_/ / /_/ /
+/_____/\__,_/\___/_/|_|\__, /_/   \____/\__,_/_/ /_/\__,_/______\__, /\__,_/\__/\___/|__/|__/\__,_/\__, /
+                      /____/                   /_/             /____/

+ 120 - 5
background-common/pom.xml

@@ -13,11 +13,126 @@
     <artifactId>background-common</artifactId>
     <name>background-common</name>
     <packaging>pom</packaging>
-    <description>公共模块</description>
+    <description>公共模块和通用依赖</description>
 
-    <modules>
-        <module>background-common-mybatis</module>
-        <module>background-common-redis</module>
-    </modules>
+    <dependencies>
+        <!--springboot web-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <!--nacos注册中心-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+        <!--nacos配置中心-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+        <!--openfeign-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <!--commons-io-->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${io.version}</version>
+        </dependency>
+        <!--fastjson-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${fastjson.version}</version>
+        </dependency>
+        <!--jsr303校验-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <!-- JWT -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+            <version>${jjwt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <version>${jjwt.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <version>${jjwt.version}</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <!--hutool工具包-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>${hutool.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+<!--            <optional>true</optional>-->
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+<!--            <scope>test</scope>-->
+        </dependency>
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <!--SpringCloud-->
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!--Cloud Alibaba-->
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>${alibaba.cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

+ 79 - 0
background-common/src/main/java/cn/kdan/compdf/config/JwtConfig.java

@@ -0,0 +1,79 @@
+package cn.kdan.compdf.config;
+
+import cn.kdan.compdf.dto.LoginUserDTO;
+import cn.kdan.compdf.enums.AuthEnum;
+import org.springframework.stereotype.Component;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jws;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.security.Keys;
+
+import javax.crypto.SecretKey;
+import java.util.Date;
+
+/**
+ * @author Bob 2022-10-11
+ **/
+@Component
+public class JwtConfig {
+
+    /**
+     * 加密
+     */
+    public static String generateJwt(LoginUserDTO user) {
+
+        // 加密
+        byte[] keyBytes = AuthEnum.secret.getBytes();
+        // 获得密钥对象
+        SecretKey key = Keys.hmacShaKeyFor(keyBytes);
+
+        String token = Jwts.builder()
+                .setHeaderParam("typ", "JWT") //令牌类型
+                .setIssuedAt(new Date()) //签发时间
+                .setExpiration(new Date(System.currentTimeMillis() + AuthEnum.expire * 1000 * 60)) //过期时间
+                .claim("id",user.getId())
+                .claim("username", user.getUsername())
+                .claim("fullName", user.getFullName())
+                .claim("teanatId", user.getTeanatId())
+                .signWith(key, SignatureAlgorithm.HS256)
+                .compact();
+        return token;
+    }
+
+    /**
+     * 解析jwt,一定要捕获异常
+     * @param jwtToken
+     * @return
+     */
+    public static LoginUserDTO checkJwt(String jwtToken) {
+
+        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(AuthEnum.secret.getBytes()).parseClaimsJws(jwtToken);
+        // map
+        Claims claims = claimsJws.getBody();
+        Long id = claims.get("id",Long.class);
+        String username = claims.get("username",String.class);
+        String fullName = claims.get("fullName",String.class);
+        Long teanatId = claims.get("teanatId",Long.class);
+
+        return LoginUserDTO.builder()
+                .id(id)
+                .username(username)
+                .teanatId(teanatId)
+                .fullName(fullName)
+                .build();
+    }
+
+/*    public static void main(String[] args) {
+//        String s = generateJwt(LoginUserDTO.builder().id(123L).username("kdan").teanatId("1").fullName("kk").build());
+//        System.out.println(s);
+        try {
+            String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NjU5NzExMjYsImV4cCI6MTY2NTk3NDcyNiwiaWQiOjEyMywidXNlcm5hbWUiOiJrZGFuIiwidGVhbmF0SWQiOiIxIn0.LzPDSixl0RBqYCD60K3FXa8RBEFm9gbYboB6RqINGvM";
+            LoginUserDTO loginUserDTO = checkJwt(token);
+            System.out.println(loginUserDTO);
+        } catch (Exception e) {
+            throw new BusinessException("登录过期");
+        }
+    }*/
+
+}

+ 32 - 0
background-common/src/main/java/cn/kdan/compdf/dto/LoginUserDTO.java

@@ -0,0 +1,32 @@
+package cn.kdan.compdf.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author Bob 2022-10-11
+ **/
+@Data
+@Builder
+public class LoginUserDTO {
+
+    /**
+     * 用户主键id
+     */
+    private Long id;
+
+    /**
+     * 用户名(公司名称)
+     */
+    private String fullName;
+
+    /**
+     * 用户名(登录名:邮箱)
+     */
+    private String username;
+
+    /**
+     * 企业id
+     */
+    private Long teanatId;
+}

+ 43 - 0
background-common/src/main/java/cn/kdan/compdf/enums/AuthEnum.java

@@ -0,0 +1,43 @@
+package cn.kdan.compdf.enums;
+
+/**
+ * @author Bob 2022-10-17
+ **/
+public interface AuthEnum {
+
+    /**
+     * 秘钥
+     */
+    String secret = "wwwcompdfkitsaascom-wwwcompdfkitsaascom";
+
+    /**
+     * 令牌生存时间(分钟)
+     */
+    long expire = 60;
+
+    /**
+     * Authorization
+     */
+    String AUTHORIZATION = "Authorization";
+
+    /**
+     * 用户id
+     */
+    String USER_ID_HEADER = "x-user-id-header";
+
+    /**
+     * 用户名
+     */
+    String USER_NAME_HEADER = "x-user-name-header";
+
+    /**
+     * 租户id
+     */
+    String USER_TEANATID = "x-user-teanatId";
+
+    /**
+     * token redis存放标识
+     */
+    String USER_TOKEN_REDIS = "user-token-redis:";
+
+}

+ 18 - 0
background-common/src/main/java/cn/kdan/compdf/enums/DateTImeFormatEnum.java

@@ -0,0 +1,18 @@
+package cn.kdan.compdf.enums;
+
+/**
+ * @author Bob 2022-10-18
+ **/
+public interface DateTImeFormatEnum {
+
+    /**
+     * 日期
+     */
+    String DATE = "yyyy-MM-dd";
+
+    /**
+     * 日期 时间
+     */
+    String DATE_TIME = "yyyy-MM-dd HH:mm";
+
+}

+ 43 - 0
background-common/src/main/java/cn/kdan/compdf/enums/ResponseEnum.java

@@ -0,0 +1,43 @@
+package cn.kdan.compdf.enums;
+
+/**
+ * @author Bob
+ * @date 2022/10/12
+ * 返回常量code-msg
+ */
+public enum ResponseEnum {
+
+    SUCCESS("200","成功"),
+    LOGIN_USER_NO_EXISTS("700","用户名不存在"),
+    ACCOUNT_PASSWORD_WRONG("701","账号或者密码错误"),
+    NO_LOGIN("702","请先登录"),
+    TOKEN_ERROR("703","无效身份,请重新登录"),
+    TOKEN_TIMEOUT("704","登录超时,请重新登录"),
+    ROLE_NO_RIGHT("705","权限不足"),
+    ;
+
+
+    private String code;
+    private String msg;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    ResponseEnum(String code, String msg){
+        this.code = code;
+        this.msg = msg;
+    }
+}

+ 57 - 0
background-common/src/main/java/cn/kdan/compdf/exception/BusinessException.java

@@ -0,0 +1,57 @@
+package cn.kdan.compdf.exception;
+
+import cn.kdan.compdf.enums.ResponseEnum;
+import lombok.Getter;
+
+import java.text.MessageFormat;
+
+/**
+ * @author Bob
+ * @date 2022/10/12
+ * 业务异常类
+ */
+@Getter
+public class BusinessException extends RuntimeException {
+
+    private String code;
+    private String msg;
+
+    public BusinessException(String msg) {
+        super(msg);
+        this.code="-1";
+        this.msg = msg;
+    }
+
+    public BusinessException(Integer code, String msg) {
+        super(msg);
+        this.msg = msg;
+        this.code = code.toString();
+    }
+
+    public BusinessException(ResponseEnum responseEnum) {
+        super(responseEnum.getMsg());
+        this.msg = responseEnum.getMsg();
+        this.code = responseEnum.getCode();
+    }
+
+    public BusinessException(String msg, Throwable e) {
+        super(msg, e);
+        this.msg = msg;
+    }
+
+    public BusinessException(Integer code, String msg, Throwable e) {
+        super(msg, e);
+        this.msg = msg;
+        this.code = code.toString();
+    }
+
+    @Override
+    public Throwable fillInStackTrace() {
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return MessageFormat.format("code:[{0}],msg:[{1}]", this.getCode(), this.getMsg());
+    }
+}

+ 53 - 0
background-common/src/main/java/cn/kdan/compdf/utils/MD5Util.java

@@ -0,0 +1,53 @@
+package cn.kdan.compdf.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Md5工具类
+ * @author Bob 2022-10-13
+ */
+@Slf4j
+public class MD5Util {
+
+	/**
+	 * Md5加密
+	 * @author Bob 2022-10-13
+	 */
+	public static String MD5Encode(String origin) {
+		MessageDigest messageDigest;
+		String resultString = null;
+		try {
+			messageDigest = MessageDigest.getInstance("MD5");
+			// 拼接compdf前缀防止碰撞破解
+			resultString = byteArrayToHexString(messageDigest.digest(("compdf" + origin).getBytes()));
+		} catch (NoSuchAlgorithmException e) {
+			log.error("MD5 messageDigest 初始化失败");
+			e.printStackTrace();
+		}
+		return resultString;
+	}
+
+	/**
+	 * 转换字符串
+	 * @author Bob 2022-10-13
+	 */
+	private static String byteArrayToHexString(byte[] bytes) {
+		StringBuilder resultSb = new StringBuilder();
+		for (int i = 0; i < bytes.length; i++) {
+			int n = bytes[i];
+			if (n < 0) {
+				n += 256;
+			}
+			int d1 = n / 16;
+			int d2 = n % 16;
+			resultSb.append(hexDigits[d1]).append(hexDigits[d2]);
+		}
+		return resultSb.toString();
+	}
+
+	private static final String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+
+}

+ 41 - 0
background-common/src/main/java/cn/kdan/compdf/utils/TokenUtil.java

@@ -0,0 +1,41 @@
+package cn.kdan.compdf.utils;
+
+import cn.kdan.compdf.dto.LoginUserDTO;
+import cn.kdan.compdf.enums.AuthEnum;
+import cn.kdan.compdf.exception.BusinessException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author Bob 2022-10-17
+ **/
+public class TokenUtil {
+
+    public static LoginUserDTO getRequestHeader() {
+        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
+        HttpServletRequest request = attr.getRequest();
+
+        String userId = request.getHeader(AuthEnum.USER_ID_HEADER);
+        if (StringUtils.isEmpty(userId)) {
+            throw new BusinessException("非法操作");
+        }
+        String userName = request.getHeader(AuthEnum.USER_NAME_HEADER);
+        if (StringUtils.isEmpty(userName)) {
+            throw new BusinessException("非法操作");
+        }
+        Long teanatId = Long.valueOf(request.getHeader(AuthEnum.USER_TEANATID));
+//        if (null == teanatId) {
+//            throw new BusinessException("非法操作");
+//        }
+
+        return LoginUserDTO.builder()
+                .id(Long.valueOf(userId))
+                .username(userName)
+                .teanatId(teanatId)
+                .build();
+    }
+
+}

+ 7 - 12
background-common/background-common-mybatis/pom.xml

@@ -6,21 +6,24 @@
 
     <parent>
         <groupId>cn.kdan.compdf</groupId>
-        <artifactId>background-common</artifactId>
+        <artifactId>background</artifactId>
         <version>0.0.1</version>
     </parent>
 
-    <artifactId>background-common-mybatis</artifactId>
+    <artifactId>background-mybatis</artifactId>
     <description>公共Mybatis模块</description>
 
     <dependencies>
-
+        <dependency>
+            <groupId>cn.kdan.compdf</groupId>
+            <artifactId>background-common</artifactId>
+            <version>0.0.1</version>
+        </dependency>
         <!--mysql-->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-
         <!--mybatis plus-->
         <dependency>
             <groupId>com.baomidou</groupId>
@@ -28,14 +31,6 @@
             <version>${mybatis.plus.version}</version>
         </dependency>
 
-        <!--security-->
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-core</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-
     </dependencies>
 
 </project>

background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/base/BaseEntity.java → background-mybatis/src/main/java/cn/kdan/compdf/base/BaseEntity.java


background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/base/R.java → background-mybatis/src/main/java/cn/kdan/compdf/base/R.java


background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/config/CustomLocalDateTimeTypeHandler.java → background-mybatis/src/main/java/cn/kdan/compdf/config/CustomLocalDateTimeTypeHandler.java


background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/config/MybatisPlusConfig.java → background-mybatis/src/main/java/cn/kdan/compdf/config/MybatisPlusConfig.java


+ 0 - 12
background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/config/MybatisPlusMetaObjectHandler.java

@@ -2,12 +2,9 @@ package cn.kdan.compdf.config;
 
 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import org.apache.ibatis.reflection.MetaObject;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
-import java.util.Optional;
 
 /**
  * MybatisPlus自动填充设置
@@ -33,13 +30,4 @@ public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {
         metaObject.setValue("updateTime", LocalDateTime.now());
     }
 
-    /**
-     * 获取登录人用户名
-     *
-     * @return 用户名
-     */
-    private String getUsername() {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        return Optional.ofNullable(authentication).map(Authentication::getName).orElse(null);
-    }
 }

background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/enums/BackgroundErrorEnum.java → background-mybatis/src/main/java/cn/kdan/compdf/enums/BackgroundErrorEnum.java


background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/exception/CommonException.java → background-mybatis/src/main/java/cn/kdan/compdf/exception/CommonException.java


background-common/background-common-mybatis/src/main/java/cn/kdan/compdf/exception/GlobalExceptionHandler.java → background-mybatis/src/main/java/cn/kdan/compdf/exception/GlobalExceptionHandler.java


+ 8 - 6
background-common/background-common-redis/pom.xml

@@ -3,19 +3,21 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>background-common</artifactId>
+        <artifactId>background</artifactId>
         <groupId>cn.kdan.compdf</groupId>
         <version>0.0.1</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>background-common-redis</artifactId>
+    <artifactId>background-redis</artifactId>
 
-    <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
-    </properties>
     <dependencies>
+
+        <dependency>
+            <groupId>cn.kdan.compdf</groupId>
+            <artifactId>background-common</artifactId>
+            <version>0.0.1</version>
+        </dependency>
         <!--redis-->
         <dependency>
             <groupId>org.springframework.boot</groupId>

background-common/background-common-redis/src/main/java/cn/kdan/compdf/config/RedisConfig.java → background-redis/src/main/java/cn/kdan/compdf/config/RedisConfig.java


background-common/background-common-redis/src/main/java/cn/kdan/compdf/config/RedissonConfig.java → background-redis/src/main/java/cn/kdan/compdf/config/RedissonConfig.java


+ 7 - 2
background-user/pom.xml

@@ -18,12 +18,17 @@
     <dependencies>
         <dependency>
             <groupId>cn.kdan.compdf</groupId>
-            <artifactId>background-common-mybatis</artifactId>
+            <artifactId>background-common</artifactId>
             <version>0.0.1</version>
         </dependency>
         <dependency>
             <groupId>cn.kdan.compdf</groupId>
-            <artifactId>background-common-redis</artifactId>
+            <artifactId>background-mybatis</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.kdan.compdf</groupId>
+            <artifactId>background-redis</artifactId>
             <version>0.0.1</version>
         </dependency>
     </dependencies>

+ 0 - 1
background-user/src/main/java/cn/kdan/compdf/BackgroundUserApplication.java

@@ -3,7 +3,6 @@ package cn.kdan.compdf;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 

+ 14 - 36
background-user/src/main/java/cn/kdan/compdf/controller/v1/BackgroundUserController.java

@@ -1,16 +1,17 @@
 package cn.kdan.compdf.controller.v1;
 
 import cn.kdan.compdf.base.R;
-import cn.kdan.compdf.entity.BackgroundUser;
+import cn.kdan.compdf.dto.ChangePasswordDTO;
+import cn.kdan.compdf.dto.LoginDTO;
 import cn.kdan.compdf.service.BackgroundUserService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.kdan.compdf.vo.LoginVO;
 import org.springframework.web.bind.annotation.*;
 
 /**
  * @author comPDF-Kit WPH 2022-10-09
  */
 @RestController
-@RequestMapping("/v1/background-user")
+@RequestMapping("/v1/user")
 public class BackgroundUserController {
 
     private final BackgroundUserService backgroundUserService;
@@ -20,46 +21,23 @@ public class BackgroundUserController {
     }
 
     /**
-     * 获取列表
+     * 用户登录
      */
-    @GetMapping("/list")
-    public R<IPage<BackgroundUser>> list(BackgroundUser query) {
-        IPage<BackgroundUser> page = backgroundUserService.page(query);
-        return R.ok(page);
+    @PostMapping("/login")
+    public R<LoginVO> login(@RequestBody LoginDTO loginDTO) {
+        return backgroundUserService.login(loginDTO);
     }
 
-    /**
-     * 根据id获取
-     */
-    @GetMapping("/{id}")
-    public R<BackgroundUser> info(@PathVariable("id") Long id) {
-        return R.ok(backgroundUserService.getById(id));
-    }
-
-    /**
-     * 保存
-     */
-    @PostMapping
-    public R<Void> save(@RequestBody BackgroundUser backgroundUser) {
-        backgroundUserService.save(backgroundUser);
+    @PostMapping("/logout")
+    public R<Void> logout() {
+        backgroundUserService.logout();
         return R.ok();
     }
 
-    /**
-     * 修改
-     */
-    @PutMapping
-    public R<Void> update(@RequestBody BackgroundUser backgroundUser) {
-        backgroundUserService.updateById(backgroundUser);
+    @PostMapping("/changePassword")
+    public R<Void> changePassword(@RequestBody ChangePasswordDTO changePasswordDTO) {
+        backgroundUserService.changePassword(changePasswordDTO);
         return R.ok();
     }
 
-    /**
-     * 删除
-     */
-    @DeleteMapping("/{id}")
-    public R<Void> remove(@PathVariable("id") Long id) {
-        backgroundUserService.removeById(id);
-        return R.ok();
-    }
 }

+ 40 - 22
background-user/src/main/java/cn/kdan/compdf/controller/v1/BackgroundUserProjectController.java

@@ -1,16 +1,31 @@
 package cn.kdan.compdf.controller.v1;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import cn.kdan.compdf.base.R;
+import cn.kdan.compdf.dto.AddNewProjectDTO;
+import cn.kdan.compdf.dto.EditProjectDTO;
+import cn.kdan.compdf.entity.BackgroundUser;
 import cn.kdan.compdf.entity.BackgroundUserProject;
 import cn.kdan.compdf.service.BackgroundUserProjectService;
+import cn.kdan.compdf.utils.TokenUtil;
+import cn.kdan.compdf.vo.BackgroundUserProjectDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
+ * API keys接口
  * @author comPDF-Kit WPH 2022-10-09
  */
 @RestController
-@RequestMapping("/v1/background-user-project")
+@RequestMapping("/v1/project")
 public class BackgroundUserProjectController {
 
     private final BackgroundUserProjectService backgroundUserProjectService;
@@ -20,46 +35,49 @@ public class BackgroundUserProjectController {
     }
 
     /**
-     * 获取列表
+     * 获取API Keys列表
      */
-    @GetMapping("/list")
-    public R<IPage<BackgroundUserProject>> list(BackgroundUserProject query) {
-        IPage<BackgroundUserProject> page = backgroundUserProjectService.page(query);
-        return R.ok(page);
+    @GetMapping("/getProjectList")
+    public R<List<BackgroundUserProjectDTO>> getProjectList() {
+        return R.ok(backgroundUserProjectService.getProjectList());
     }
 
     /**
-     * 根据id获取
+     * 添加新项目
      */
-    @GetMapping("/{id}")
-    public R<BackgroundUserProject> info(@PathVariable("id") Long id) {
-        return R.ok(backgroundUserProjectService.getById(id));
+    @PostMapping("/addNewProject")
+    public R<Void> addNewProject(@RequestBody AddNewProjectDTO addNewProjectDTO) {
+        if (StringUtils.isEmpty(addNewProjectDTO.getUserId())) {
+            addNewProjectDTO.setUserId(TokenUtil.getRequestHeader().getId());
+        }
+        backgroundUserProjectService.addNewProject(addNewProjectDTO);
+        return R.ok();
     }
 
     /**
-     * 保存
+     * 添加新用户默认项目接口
      */
-    @PostMapping
-    public R<Void> save(@RequestBody BackgroundUserProject backgroundUserProject) {
-        backgroundUserProjectService.save(backgroundUserProject);
+    @PostMapping("/defaultProject/{userId}")
+    public R<Void> defaultProject(@PathVariable("userId") Long userId) {
+        backgroundUserProjectService.defaultProject(userId);
         return R.ok();
     }
 
     /**
-     * 修改
+     * 编辑项目
      */
-    @PutMapping
-    public R<Void> update(@RequestBody BackgroundUserProject backgroundUserProject) {
-        backgroundUserProjectService.updateById(backgroundUserProject);
+    @PutMapping("editProject")
+    public R<Void> editProject(@RequestBody EditProjectDTO editProjectDTO) {
+        backgroundUserProjectService.editProject(editProjectDTO);
         return R.ok();
     }
 
     /**
-     * 删除
+     * 删除项目
      */
-    @DeleteMapping("/{id}")
-    public R<Void> remove(@PathVariable("id") Long id) {
-        backgroundUserProjectService.removeById(id);
+    @DeleteMapping("/deleteById/{id}")
+    public R<Void> deleteById(@PathVariable("id") Long id) {
+        backgroundUserProjectService.deleteById(id);
         return R.ok();
     }
 }

+ 23 - 0
background-user/src/main/java/cn/kdan/compdf/dto/AddNewProjectDTO.java

@@ -0,0 +1,23 @@
+package cn.kdan.compdf.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author Bob 2022-10-18
+ */
+@Data
+public class AddNewProjectDTO {
+
+    /**
+     * 用户主键id
+     */
+    private Long userId;
+    /**
+     * 项目名称
+     */
+    @NotBlank(message = "项目名称不能为空")
+    private String projectName;
+
+}

+ 24 - 0
background-user/src/main/java/cn/kdan/compdf/dto/ChangePasswordDTO.java

@@ -0,0 +1,24 @@
+package cn.kdan.compdf.dto;
+
+import lombok.Data;
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author Bob 2022-10-17
+ */
+@Data
+public class ChangePasswordDTO {
+
+    /**
+     * 原密码
+     */
+    @NotBlank(message = "原密码不能为空")
+    private String oldPassword;
+
+    /**
+     * 新密码
+     */
+    @NotBlank(message = "新密码不能为空")
+    private String newPassword;
+
+}

+ 25 - 0
background-user/src/main/java/cn/kdan/compdf/dto/EditProjectDTO.java

@@ -0,0 +1,25 @@
+package cn.kdan.compdf.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author Bob 2022-10-18
+ */
+@Data
+public class EditProjectDTO {
+
+    /**
+     * project主键id
+     */
+    @NotNull(message = "id不能为空")
+    private Long id;;
+    /**
+     * 项目名称
+     */
+    @NotBlank(message = "项目名称不能为空")
+    private String projectName;
+
+}

+ 24 - 0
background-user/src/main/java/cn/kdan/compdf/dto/LoginDTO.java

@@ -0,0 +1,24 @@
+package cn.kdan.compdf.dto;
+
+import lombok.Data;
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author Bob 2022-10-17
+ */
+@Data
+public class LoginDTO {
+
+    /**
+     * 用户名(登录名:邮箱)
+     */
+    @NotBlank(message = "用户名不能为空")
+    private String username;
+
+    /**
+     * 密码
+     */
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+}

+ 21 - 20
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundConvertData.java

@@ -7,9 +7,10 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import java.util.Date;
+import java.math.BigDecimal;
 
 /**
- * @author comPDF-Kit WPH 2022-10-09
+ * @author ComPDFKit-WPH 2022-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -17,40 +18,40 @@ import java.util.Date;
 public class BackgroundConvertData extends BaseEntity{
 
     /**
-     * 文件转换平均时间
+     * 主键id
      */
-    private Double fileConvertTime;
+    @TableId(type = IdType.AUTO)
+    private Long id;
     /**
-     * 文件转换失败总数
+     * 关联用户主键id
      */
-    private Long fileFailedTotal;
+    private Long userId;
     /**
-     * 文件转换成功总数
+     * 关联用户项目主键id
      */
-    private Long fileSuccessTotal;
+    private Long projectId;
     /**
-     * 文件总数
+     * 工具id
      */
-    private Long fileTotal;
+    private Long toolId;
     /**
-     * 主键id
+     * 文件总数
      */
-    @TableId(type = IdType.AUTO)
-    private Long id;
+    private Long fileTotal;
     /**
-     * 关联用户项目主键id
+     * 文件转换成功总数
      */
-    private Long projectId;
+    private Long fileSuccessTotal;
     /**
-     * 同步时间段
+     * 文件转换失败总数
      */
-    private Date syncTime;
+    private Long fileFailedTotal;
     /**
-     * 关联用户主键id
+     * 文件转换平均时间
      */
-    private Long userId;
+    private BigDecimal fileConvertTime;
     /**
-     * 工具id
+     * 同步时间段
      */
-    private Long toolId;
+    private Date syncTime;
 }

+ 9 - 9
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundEvent.java

@@ -9,29 +9,29 @@ import lombok.EqualsAndHashCode;
 import java.util.Date;
 
 /**
- * @author comPDF-Kit WPH 2022-10-09
+ * @author ComPDFKit-WPH 2022-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("background_event")
 public class BackgroundEvent extends BaseEntity{
 
-    /**
-     * 事件名
-     */
-    private Integer eventName;
     /**
      * 主键id
      */
     @TableId(type = IdType.AUTO)
     private Long id;
     /**
-     * 状态0已删除1正常
+     * 事件类型:1task.start、2task.finish、3task.overdue、4file.start、5file.success、6file.failed
      */
-    private Integer status;
+    private Integer triggerEvent;
     /**
-     * 事件类型:1TaskStart、2TaskWaitin、3TaskProcessing、4TaskFinish、5TaskOverdue
+     * 事件
      */
-    private Integer triggerEvent;
+    private Integer eventName;
+    /**
+     * 状态0已删除1正常
+     */
+    private Integer status;
 
 }

+ 1 - 2
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundTools.java

@@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
 import java.util.Date;
 
 /**
- * @author ComPDF-Kit WPH 2022-10-09
+ * @author ComPDFKit-WPH 2022-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -26,5 +26,4 @@ public class BackgroundTools extends BaseEntity{
      */
     private String toolName;
 
-
 }

+ 17 - 9
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUser.java

@@ -9,26 +9,30 @@ import lombok.EqualsAndHashCode;
 import java.util.Date;
 
 /**
- * @author comPDF-Kit WPH 2022-10-09
+ * @author ComPDFKit-WPH 2022-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("background_user")
 public class BackgroundUser extends BaseEntity{
 
-    /**
-     * 首次登录时间
-     */
-    private Date firstLoginTime;
     /**
      * 主键id
      */
     @TableId(type = IdType.AUTO)
     private Long id;
     /**
-     * 最后一次登录时间
+     * 租户id
      */
-    private Date lastLoginTime;
+    private Long tenantId;
+    /**
+     * 用户名(公司名称)
+     */
+    private String fullName;
+    /**
+     * 用户名(登录名:邮箱)
+     */
+    private String username;
     /**
      * 密码
      */
@@ -38,8 +42,12 @@ public class BackgroundUser extends BaseEntity{
      */
     private Integer status;
     /**
-     * 用户名(登录名:邮箱)
+     * 首次登录时间
      */
-    private String username;
+    private Date firstLoginTime;
+    /**
+     * 最后一次登录时间
+     */
+    private Date lastLoginTime;
 
 }

+ 57 - 0
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUserBalance.java

@@ -0,0 +1,57 @@
+package cn.kdan.compdf.entity;
+
+import cn.kdan.compdf.base.BaseEntity;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+
+/**
+ * @author ComPDFKit-WPH 2022-10-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("background_user_balance")
+public class BackgroundUserBalance extends BaseEntity{
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 关联用户主键id
+     */
+    private Long userId;
+    /**
+     * 日期
+     */
+    private Date date;
+    /**
+     * 充值/消费具体类型1、Package,2、Subscription,3、Free,9、Files consumed
+     */
+    private Integer descriptionType;
+    /**
+     * 充值/消费具体类型描述
+     */
+    private String description;
+    /**
+     * 充值/消费类型1充值2消费
+     */
+    private Integer changeType;
+    /**
+     * 文件数量变动额度
+     */
+    private Integer balanceChange;
+    /**
+     * 文件数量余额
+     */
+    private Integer remainingFiles;
+    /**
+     * 过期时间
+     */
+    private Date expiredDate;
+
+}

+ 13 - 13
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUserProject.java

@@ -9,34 +9,30 @@ import lombok.EqualsAndHashCode;
 import java.util.Date;
 
 /**
- * @author comPDF-Kit WPH 2022-10-09
+ * @author ComPDFKit-WPH 2022-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("background_user_project")
 public class BackgroundUserProject extends BaseEntity{
 
-    /**
-     * 首次登录时间
-     */
-    private Date firstLoginTime;
     /**
      * 主键id
      */
     @TableId(type = IdType.AUTO)
     private Long id;
     /**
-     * 最后一次登录时间
-     */
-    private Date lastLoginTime;
-    /**
-     * 公钥
+     * 关联用户主键id
      */
-    private String projectKey;
+    private Long userId;
     /**
      * 项目名称
      */
     private String projectName;
+    /**
+     * 公钥
+     */
+    private String projectKey;
     /**
      * 私钥
      */
@@ -46,8 +42,12 @@ public class BackgroundUserProject extends BaseEntity{
      */
     private Integer status;
     /**
-     * 关联用户主键id
+     * 首次登录时间
      */
-    private Long userId;
+    private Date firstLoginTime;
+    /**
+     * 最后一次登录时间
+     */
+    private Date lastLoginTime;
 
 }

+ 13 - 9
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundUserWebhook.java

@@ -9,7 +9,7 @@ import lombok.EqualsAndHashCode;
 import java.util.Date;
 
 /**
- * @author comPDF-Kit WPH 2022-10-09
+ * @author ComPDFKit-WPH 2022-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -21,25 +21,29 @@ public class BackgroundUserWebhook extends BaseEntity{
      */
     @TableId(type = IdType.AUTO)
     private Long id;
+    /**
+     * 关联用户主键id
+     */
+    private Long userId;
     /**
      * 关联用户项目主键id
      */
     private Long projectId;
     /**
-     * 上一次发送请求的时间
+     * 接收服务端请求的回调地址
      */
-    private Date responseTime;
+    private String url;
     /**
-     * 状态0已删除1正常
+     * 回调token
      */
-    private Integer status;
+    private String secretToken;
     /**
-     * 接收服务端请求的回调地址
+     * 状态0已删除1正常
      */
-    private String url;
+    private Integer status;
     /**
-     * 关联用户主键id
+     * 上一次发送请求的时间
      */
-    private Long userId;
+    private Date responseTime;
 
 }

+ 9 - 9
background-user/src/main/java/cn/kdan/compdf/entity/BackgroundWebhookEvent.java

@@ -9,29 +9,29 @@ import lombok.EqualsAndHashCode;
 import java.util.Date;
 
 /**
- * @author comPDF-Kit WPH 2022-10-09
+ * @author ComPDFKit-WPH 2022-10-14
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("background_webhook_event")
 public class BackgroundWebhookEvent extends BaseEntity{
 
-    /**
-     * 事件id
-     */
-    private Long eventId;
     /**
      * 主键id
      */
     @TableId(type = IdType.AUTO)
     private Long id;
-    /**
-     * 状态0已删除1正常
-     */
-    private Integer status;
     /**
      * webhook_id
      */
     private Long webhookId;
+    /**
+     * 事件id
+     */
+    private Long eventId;
+    /**
+     * 状态0已删除1正常
+     */
+    private Integer status;
 
 }

+ 3 - 2
background-user/src/main/java/cn/kdan/compdf/entity/dto/AnalysisDataDTO.java

@@ -3,6 +3,7 @@ package cn.kdan.compdf.entity.dto;
 import lombok.*;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * @author ComPDFKit-WPH 2022/10/9
@@ -32,10 +33,10 @@ public class AnalysisDataDTO implements Serializable {
     /**
      * 失败率
      */
-    private Double errorRatio;
+    private BigDecimal errorRatio;
     /**
      * 平均处理时长
      */
-    private Double averageProcessTime;
+    private BigDecimal averageProcessTime;
 
 }

+ 11 - 0
background-user/src/main/java/cn/kdan/compdf/mapper/BackgroundUserBalanceMapper.java

@@ -0,0 +1,11 @@
+package cn.kdan.compdf.mapper;
+
+import cn.kdan.compdf.entity.BackgroundUserBalance;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @author ComPDFKit-WPH 2022-10-14
+ */
+public interface BackgroundUserBalanceMapper extends BaseMapper<BackgroundUserBalance> {
+
+}

+ 38 - 0
background-user/src/main/java/cn/kdan/compdf/service/BackgroundUserProjectService.java

@@ -1,8 +1,16 @@
 package cn.kdan.compdf.service;
 
+import cn.kdan.compdf.base.R;
+import cn.kdan.compdf.dto.AddNewProjectDTO;
+import cn.kdan.compdf.dto.EditProjectDTO;
 import cn.kdan.compdf.entity.BackgroundUserProject;
+import cn.kdan.compdf.vo.BackgroundUserProjectDTO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
 
 /**
  * @author comPDF-Kit WPH 2022-10-09
@@ -16,4 +24,34 @@ public interface BackgroundUserProjectService extends IService<BackgroundUserPro
      */
     IPage<BackgroundUserProject> page(BackgroundUserProject query);
 
+    /**
+     * 获取API Keys列表
+     * @return project列表
+     */
+    List<BackgroundUserProjectDTO> getProjectList();
+
+    /**
+     * 添加新项目
+     * @param addNewProjectDTO 新项目参数
+     */
+    void addNewProject(AddNewProjectDTO addNewProjectDTO);
+
+    /**
+     * 添加新用户默认项目
+     * @param userId 用户id
+     */
+    void defaultProject(Long userId);
+
+    /**
+     * 编辑项目
+     * @param editProjectDTO 编辑参数
+     */
+    void editProject(EditProjectDTO editProjectDTO);
+
+    /**
+     * 删除项目
+     * @param id 项目表主键
+     */
+    void deleteById(Long id);
+
 }

+ 10 - 0
background-user/src/main/java/cn/kdan/compdf/service/BackgroundUserService.java

@@ -1,6 +1,10 @@
 package cn.kdan.compdf.service;
 
+import cn.kdan.compdf.base.R;
+import cn.kdan.compdf.dto.ChangePasswordDTO;
+import cn.kdan.compdf.dto.LoginDTO;
 import cn.kdan.compdf.entity.BackgroundUser;
+import cn.kdan.compdf.vo.LoginVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
@@ -16,4 +20,10 @@ public interface BackgroundUserService extends IService<BackgroundUser> {
      */
     IPage<BackgroundUser> page(BackgroundUser query);
 
+    R<LoginVO> login(LoginDTO loginDTO);
+
+    void logout();
+
+    void changePassword(ChangePasswordDTO changePasswordDTO);
+
 }

+ 5 - 5
background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundConvertDataServiceImpl.java

@@ -18,6 +18,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
@@ -47,19 +48,19 @@ public class BackgroundConvertDataServiceImpl extends ServiceImpl<BackgroundConv
         long errorRequest = 0;  // 失败数
         double errorRatio = 0;  // 失败率
         double averageProcessTime = 0;  // 平均处理时长
-        double averageProcessTimeTotal = 0; // 总处理时长
+        BigDecimal averageProcessTimeTotal = BigDecimal.ZERO; // 总处理时长
         for (BackgroundConvertData backgroundConvertDatum : backgroundConvertData) {
             fileTotal += backgroundConvertDatum.getFileTotal();
             successfulRequest += backgroundConvertDatum.getFileSuccessTotal();
             errorRequest += backgroundConvertDatum.getFileFailedTotal();
-            averageProcessTimeTotal += backgroundConvertDatum.getFileConvertTime();
+            averageProcessTimeTotal = backgroundConvertDatum.getFileConvertTime().add(averageProcessTimeTotal);
         }
         return AnalysisDataDTO.builder()
                 .fileTotal(fileTotal)
                 .successfulRequest(successfulRequest)
                 .errorRequest(errorRequest)
-                .errorRatio(Double.parseDouble(String.format("%.2f", errorRequest * 100.00 / fileTotal)))
-                .averageProcessTime(Double.parseDouble(String.format("%.1f", averageProcessTimeTotal / backgroundConvertData.size())))
+                .errorRatio(new BigDecimal(String.format("%.2f", errorRequest * 100.00 / fileTotal)))
+                .averageProcessTime(averageProcessTimeTotal.divide(new BigDecimal(backgroundConvertData.size()), 2, BigDecimal.ROUND_HALF_UP))
                 .build();
     }
 
@@ -135,7 +136,6 @@ public class BackgroundConvertDataServiceImpl extends ServiceImpl<BackgroundConv
             queryWrapper.eq(BackgroundConvertData::getToolId, queryDTO.getToolId());
         }
         queryWrapper.eq(BackgroundConvertData::getUserId, queryDTO.getUserId());
-
         return queryWrapper;
     }
 

+ 97 - 0
background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserProjectServiceImpl.java

@@ -1,14 +1,32 @@
 package cn.kdan.compdf.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.UUID;
+import cn.kdan.compdf.base.R;
+import cn.kdan.compdf.dto.AddNewProjectDTO;
+import cn.kdan.compdf.dto.EditProjectDTO;
 import cn.kdan.compdf.entity.BackgroundUserProject;
+import cn.kdan.compdf.enums.DateTImeFormatEnum;
 import cn.kdan.compdf.mapper.BackgroundUserProjectMapper;
 import cn.kdan.compdf.service.BackgroundUserProjectService;
+import cn.kdan.compdf.utils.MD5Util;
+import cn.kdan.compdf.utils.TokenUtil;
+import cn.kdan.compdf.vo.BackgroundUserProjectDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * @author comPDF-Kit WPH 2022-10-09
  */
@@ -20,4 +38,83 @@ public class BackgroundUserProjectServiceImpl extends ServiceImpl<BackgroundUser
         return this.page(new Page<>(query.getPage(), query.getSize()), Wrappers.query(query));
     }
 
+    /**
+     * 获取API Keys列表
+     * @return project列表
+     */
+    @Override
+    public List<BackgroundUserProjectDTO> getProjectList() {
+        // 查找用户下面状态正常的project记录
+        LambdaQueryWrapper<BackgroundUserProject> eq = new LambdaQueryWrapper<BackgroundUserProject>()
+                .eq(BackgroundUserProject::getStatus, 1)
+                .eq(BackgroundUserProject::getUserId, TokenUtil.getRequestHeader().getId());
+        List<BackgroundUserProject> list = this.baseMapper.selectList(eq);
+        // 处理返回
+        if (CollectionUtil.isNotEmpty(list)) {
+            List<BackgroundUserProjectDTO> backgroundUserProjectDTOList = Lists.newArrayList();
+            list.forEach(c -> {
+                BackgroundUserProjectDTO backgroundUserProjectDTO = new BackgroundUserProjectDTO();
+                BeanUtil.copyProperties(c, backgroundUserProjectDTO);
+                backgroundUserProjectDTO.setCreateDate(DateUtil.format(c.getCreateDate(), DateTImeFormatEnum.DATE_TIME));
+                backgroundUserProjectDTOList.add(backgroundUserProjectDTO);
+            });
+            return backgroundUserProjectDTOList;
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * 添加新项目
+     * @param addNewProjectDTO 新项目参数
+     */
+    @Override
+    public void addNewProject(AddNewProjectDTO addNewProjectDTO) {
+        BackgroundUserProject backgroundUserProject = new BackgroundUserProject();
+        BeanUtil.copyProperties(addNewProjectDTO, backgroundUserProject);
+        backgroundUserProject.setProjectKey(MD5Util.MD5Encode(UUID.randomUUID().toString()));
+        backgroundUserProject.setSecretKey(MD5Util.MD5Encode(UUID.randomUUID().toString()));
+        backgroundUserProject.setStatus(1);
+        this.baseMapper.insert(backgroundUserProject);
+    }
+
+    /**
+     * 添加新用户默认项目
+     * @param userId 用户id
+     */
+    @Override
+    public void defaultProject(Long userId) {
+        BackgroundUserProject backgroundUserProject = new BackgroundUserProject();
+        backgroundUserProject.setUserId(userId);
+        backgroundUserProject.setProjectName("Default Project");
+        backgroundUserProject.setProjectKey(MD5Util.MD5Encode(UUID.randomUUID().toString()));
+        backgroundUserProject.setSecretKey(MD5Util.MD5Encode(UUID.randomUUID().toString()));
+        backgroundUserProject.setStatus(1);
+        this.baseMapper.insert(backgroundUserProject);
+    }
+
+    /**
+     * 编辑项目
+     * @param editProjectDTO 编辑参数
+     */
+    @Override
+    public void editProject(EditProjectDTO editProjectDTO) {
+        BackgroundUserProject backgroundUserProject = new BackgroundUserProject();
+        BeanUtil.copyProperties(editProjectDTO, backgroundUserProject);
+        this.baseMapper.updateById(backgroundUserProject);
+    }
+
+    /**
+     * 删除项目
+     * @param id 项目表主键
+     */
+    @Override
+    public void deleteById(Long id) {
+        // 通过id逻辑删除
+        BackgroundUserProject backgroundUserProject = new BackgroundUserProject();
+        backgroundUserProject.setId(id);
+        backgroundUserProject.setStatus(0);
+        this.baseMapper.updateById(backgroundUserProject);
+    }
+
 }

+ 76 - 0
background-user/src/main/java/cn/kdan/compdf/service/impl/BackgroundUserServiceImpl.java

@@ -1,23 +1,99 @@
 package cn.kdan.compdf.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.kdan.compdf.base.R;
+import cn.kdan.compdf.config.JwtConfig;
+import cn.kdan.compdf.dto.ChangePasswordDTO;
+import cn.kdan.compdf.dto.LoginDTO;
+import cn.kdan.compdf.dto.LoginUserDTO;
 import cn.kdan.compdf.entity.BackgroundUser;
+import cn.kdan.compdf.enums.AuthEnum;
+import cn.kdan.compdf.exception.BusinessException;
 import cn.kdan.compdf.mapper.BackgroundUserMapper;
 import cn.kdan.compdf.service.BackgroundUserService;
+import cn.kdan.compdf.utils.MD5Util;
+import cn.kdan.compdf.utils.TokenUtil;
+import cn.kdan.compdf.vo.LoginVO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
+
 /**
  * @author comPDF-Kit WPH 2022-10-09
  */
 @Service
 public class BackgroundUserServiceImpl extends ServiceImpl<BackgroundUserMapper, BackgroundUser> implements BackgroundUserService {
 
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
     @Override
     public IPage<BackgroundUser> page(BackgroundUser query) {
         return this.page(new Page<>(query.getPage(), query.getSize()), Wrappers.query(query));
     }
 
+    @Override
+    public R<LoginVO> login(LoginDTO loginDTO) {
+        BackgroundUser backgroundUser = this.baseMapper.selectOne(new LambdaQueryWrapper<BackgroundUser>().eq(BackgroundUser::getUsername, loginDTO.getUsername()));
+        if (null == backgroundUser) {
+            throw new BusinessException("账号不存在");
+        }
+        //转换成MD5密码
+        String md5Password = MD5Util.MD5Encode(loginDTO.getPassword());
+        if (!md5Password.equals(backgroundUser.getPassword())) {
+            throw new BusinessException("密码错误");
+        }
+        String token = JwtConfig.generateJwt(LoginUserDTO
+                .builder()
+                .id(backgroundUser.getId())
+                .username(backgroundUser.getUsername())
+                .fullName(backgroundUser.getFullName())
+                .teanatId(backgroundUser.getTenantId())
+                .build());
+
+        redisTemplate.opsForValue().set(AuthEnum.USER_TOKEN_REDIS + backgroundUser.getUsername(), token,2, TimeUnit.HOURS);
+
+        //更新登录用户的登陆时间
+        if (backgroundUser.getFirstLoginTime() == null) {
+            backgroundUser.setFirstLoginTime(new Date());
+        }
+        backgroundUser.setLastLoginTime(new Date());
+        baseMapper.updateById(backgroundUser);
+
+        LoginVO loginVO = new LoginVO();
+        loginVO.setId(backgroundUser.getId());
+        loginVO.setUsername(backgroundUser.getUsername());
+        loginVO.setToken(token);
+        return R.ok(loginVO);
+    }
+
+    @Override
+    public void logout() {
+        redisTemplate.delete(AuthEnum.USER_TOKEN_REDIS + TokenUtil.getRequestHeader().getUsername());
+    }
+
+    @Override
+    public void changePassword(ChangePasswordDTO changePasswordDTO) {
+        //
+        LoginUserDTO requestHeader = TokenUtil.getRequestHeader();
+        BackgroundUser backgroundUser = this.baseMapper.selectOne(new LambdaQueryWrapper<BackgroundUser>().eq(BackgroundUser::getId, requestHeader.getId()));
+        //转换成MD5密码
+        String oldPassword = MD5Util.MD5Encode(changePasswordDTO.getOldPassword());
+        if (!oldPassword.equals(backgroundUser.getPassword())) {
+            throw new BusinessException("原密码错误");
+        }
+        //转换成MD5密码
+        String newPassword = MD5Util.MD5Encode(changePasswordDTO.getNewPassword());
+        backgroundUser.setPassword(newPassword);
+        baseMapper.updateById(backgroundUser);
+        redisTemplate.delete(AuthEnum.USER_TOKEN_REDIS + backgroundUser.getUsername());
+    }
 }

+ 45 - 0
background-user/src/main/java/cn/kdan/compdf/vo/BackgroundUserProjectDTO.java

@@ -0,0 +1,45 @@
+package cn.kdan.compdf.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author Bob 2022-10-18
+ */
+@Data
+public class BackgroundUserProjectDTO {
+
+    /**
+     * 主键id
+     */
+    private Long id;
+    /**
+     * 关联用户主键id
+     */
+    private Long userId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 公钥
+     */
+    private String projectKey;
+    /**
+     * 私钥
+     */
+    private String secretKey;
+    /**
+     * 状态0已删除1正常
+     */
+    private Integer status;
+    /**
+     * 创建时间
+     */
+    private String createDate;
+
+}

+ 27 - 0
background-user/src/main/java/cn/kdan/compdf/vo/LoginVO.java

@@ -0,0 +1,27 @@
+package cn.kdan.compdf.vo;
+
+import lombok.Data;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Bob 2022-10-17
+ */
+@Data
+public class LoginVO {
+
+    /**
+     * 用户id
+     */
+    private Long id;
+
+    /**
+     * 用户名(登录名:邮箱)
+     */
+    private String username;
+
+    /**
+     * token
+     */
+    private String token;
+
+}

+ 2 - 2
background-user/src/main/resources/application.yml

@@ -3,7 +3,7 @@ server:
 
 spring:
   application:
-    name: compdf-background
+    name: background-user
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss
     time-zone: GMT+8
@@ -50,4 +50,4 @@ mybatis-plus:
   mapper-locations: classpath:/mapper/*.xml
   type-aliases-package: cn.kdan.compdf
   configuration:
-    map-underscore-to-camel-case: true
+    map-underscore-to-camel-case: true

+ 9 - 10
background-user/src/main/resources/mapper/BackgroundConvertDataMapper.xml

@@ -5,20 +5,19 @@
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="BackgroundConvertDataResultMap" type="cn.kdan.compdf.entity.BackgroundConvertData">
-        <result property="createBy" column="create_by" />
-        <result property="createDate" column="create_date" />
-        <result property="fileConvertTime" column="file_convert_time" />
-        <result property="fileFailedTotal" column="file_failed_total" />
-        <result property="fileSuccessTotal" column="file_success_total" />
-        <result property="fileTotal" column="file_total" />
         <result property="id" column="id" />
+        <result property="userId" column="user_id" />
         <result property="projectId" column="project_id" />
+        <result property="toolId" column="tool_id" />
+        <result property="fileTotal" column="file_total" />
+        <result property="fileSuccessTotal" column="file_success_total" />
+        <result property="fileFailedTotal" column="file_failed_total" />
+        <result property="fileConvertTime" column="file_convert_time" />
         <result property="syncTime" column="sync_time" />
-        <result property="updateBy" column="update_by" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
         <result property="updateDate" column="update_date" />
-        <result property="userId" column="user_id" />
+        <result property="updateBy" column="update_by" />
     </resultMap>
 
-
-
 </mapper>

+ 5 - 5
background-user/src/main/resources/mapper/BackgroundEventMapper.xml

@@ -5,14 +5,14 @@
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="BackgroundEventResultMap" type="cn.kdan.compdf.entity.BackgroundEvent">
-        <result property="createBy" column="create_by" />
-        <result property="createDate" column="create_date" />
-        <result property="eventName" column="event_name" />
         <result property="id" column="id" />
-        <result property="status" column="status" />
         <result property="triggerEvent" column="trigger_event" />
-        <result property="updateBy" column="update_by" />
+        <result property="eventName" column="event_name" />
+        <result property="status" column="status" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
         <result property="updateDate" column="update_date" />
+        <result property="updateBy" column="update_by" />
     </resultMap>
 
 </mapper>

+ 3 - 3
background-user/src/main/resources/mapper/BackgroundToolsMapper.xml

@@ -5,12 +5,12 @@
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="BackgroundToolsResultMap" type="cn.kdan.compdf.entity.BackgroundTools">
-        <result property="createBy" column="create_by" />
-        <result property="createDate" column="create_date" />
         <result property="id" column="id" />
         <result property="toolName" column="tool_name" />
-        <result property="updateBy" column="update_by" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
         <result property="updateDate" column="update_date" />
+        <result property="updateBy" column="update_by" />
     </resultMap>
 
 </mapper>

+ 23 - 0
background-user/src/main/resources/mapper/BackgroundUserBalanceMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.kdan.compdf.mapper.BackgroundUserBalanceMapper">
+
+    <!-- 可根据自己的需求,是否要使用 -->
+    <resultMap id="BackgroundUserBalanceResultMap" type="cn.kdan.compdf.entity.BackgroundUserBalance">
+        <result property="id" column="id" />
+        <result property="userId" column="user_id" />
+        <result property="date" column="date" />
+        <result property="descriptionType" column="description_type" />
+        <result property="description" column="description" />
+        <result property="changeType" column="change_type" />
+        <result property="balanceChange" column="balance_change" />
+        <result property="remainingFiles" column="remaining_files" />
+        <result property="expiredDate" column="expired_date" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
+        <result property="updateDate" column="update_date" />
+        <result property="updateBy" column="update_by" />
+    </resultMap>
+
+</mapper>

+ 8 - 6
background-user/src/main/resources/mapper/BackgroundUserMapper.xml

@@ -5,16 +5,18 @@
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="BackgroundUserResultMap" type="cn.kdan.compdf.entity.BackgroundUser">
-        <result property="createBy" column="create_by" />
-        <result property="createDate" column="create_date" />
-        <result property="firstLoginTime" column="first_login_time" />
         <result property="id" column="id" />
-        <result property="lastLoginTime" column="last_login_time" />
+        <result property="tenantId" column="tenant_id" />
+        <result property="fullName" column="full_name" />
+        <result property="username" column="username" />
         <result property="password" column="password" />
         <result property="status" column="status" />
-        <result property="updateBy" column="update_by" />
+        <result property="firstLoginTime" column="first_login_time" />
+        <result property="lastLoginTime" column="last_login_time" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
         <result property="updateDate" column="update_date" />
-        <result property="username" column="username" />
+        <result property="updateBy" column="update_by" />
     </resultMap>
 
 </mapper>

+ 7 - 7
background-user/src/main/resources/mapper/BackgroundUserProjectMapper.xml

@@ -5,18 +5,18 @@
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="BackgroundUserProjectResultMap" type="cn.kdan.compdf.entity.BackgroundUserProject">
-        <result property="createBy" column="create_by" />
-        <result property="createDate" column="create_date" />
-        <result property="firstLoginTime" column="first_login_time" />
         <result property="id" column="id" />
-        <result property="lastLoginTime" column="last_login_time" />
-        <result property="projectKey" column="project_key" />
+        <result property="userId" column="user_id" />
         <result property="projectName" column="project_name" />
+        <result property="projectKey" column="project_key" />
         <result property="secretKey" column="secret_key" />
         <result property="status" column="status" />
-        <result property="updateBy" column="update_by" />
+        <result property="firstLoginTime" column="first_login_time" />
+        <result property="lastLoginTime" column="last_login_time" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
         <result property="updateDate" column="update_date" />
-        <result property="userId" column="user_id" />
+        <result property="updateBy" column="update_by" />
     </resultMap>
 
 </mapper>

+ 7 - 6
background-user/src/main/resources/mapper/BackgroundUserWebhookMapper.xml

@@ -5,16 +5,17 @@
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="BackgroundUserWebhookResultMap" type="cn.kdan.compdf.entity.BackgroundUserWebhook">
-        <result property="createBy" column="create_by" />
-        <result property="createDate" column="create_date" />
         <result property="id" column="id" />
+        <result property="userId" column="user_id" />
         <result property="projectId" column="project_id" />
-        <result property="responseTime" column="response_time" />
+        <result property="url" column="url" />
+        <result property="secretToken" column="secret_token" />
         <result property="status" column="status" />
-        <result property="updateBy" column="update_by" />
+        <result property="responseTime" column="response_time" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
         <result property="updateDate" column="update_date" />
-        <result property="url" column="url" />
-        <result property="userId" column="user_id" />
+        <result property="updateBy" column="update_by" />
     </resultMap>
 
 </mapper>

+ 5 - 5
background-user/src/main/resources/mapper/BackgroundWebhookEventMapper.xml

@@ -5,14 +5,14 @@
 
     <!-- 可根据自己的需求,是否要使用 -->
     <resultMap id="BackgroundWebhookEventResultMap" type="cn.kdan.compdf.entity.BackgroundWebhookEvent">
-        <result property="createBy" column="create_by" />
-        <result property="createDate" column="create_date" />
-        <result property="eventId" column="event_id" />
         <result property="id" column="id" />
+        <result property="webhookId" column="webhook_id" />
+        <result property="eventId" column="event_id" />
         <result property="status" column="status" />
-        <result property="updateBy" column="update_by" />
+        <result property="createDate" column="create_date" />
+        <result property="createBy" column="create_by" />
         <result property="updateDate" column="update_date" />
-        <result property="webhookId" column="webhook_id" />
+        <result property="updateBy" column="update_by" />
     </resultMap>
 
 </mapper>

+ 8 - 68
pom.xml

@@ -20,6 +20,9 @@
 	<modules>
 		<module>background-common</module>
 		<module>background-user</module>
+		<module>backgroud-gateway</module>
+		<module>background-redis</module>
+		<module>background-mybatis</module>
 	</modules>
 
 	<properties>
@@ -28,74 +31,11 @@
 		<cloud.version>Hoxton.SR9</cloud.version>
 		<alibaba.cloud.version>2.2.6.RELEASE</alibaba.cloud.version>
 		<mybatis.plus.version>3.5.2</mybatis.plus.version>
-		<cn.hutool>5.8.4</cn.hutool>
+		<hutool.version>5.8.2</hutool.version>
+		<io.version>2.11.0</io.version>
+		<fastjson.version>1.2.60</fastjson.version>
+		<jjwt.version>0.10.7</jjwt.version>
+		<gateway.version>2.2.6.RELEASE</gateway.version>
 	</properties>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-web</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-			<optional>true</optional>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework.cloud</groupId>
-			<artifactId>spring-cloud-commons</artifactId>
-			<version>${alibaba.cloud.version}</version>
-		</dependency>
-
-		<dependency>
-			<groupId>cn.hutool</groupId>
-			<artifactId>hutool-all</artifactId>
-			<version>${cn.hutool}</version>
-		</dependency>
-	</dependencies>
-
-	<dependencyManagement>
-		<dependencies>
-			<!--SpringCloud-->
-			<dependency>
-				<groupId>org.springframework.cloud</groupId>
-				<artifactId>spring-cloud-dependencies</artifactId>
-				<version>${cloud.version}</version>
-				<type>pom</type>
-				<scope>import</scope>
-			</dependency>
-
-			<!--Cloud Alibaba-->
-			<dependency>
-				<groupId>com.alibaba.cloud</groupId>
-				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
-				<version>${alibaba.cloud.version}</version>
-				<type>pom</type>
-				<scope>import</scope>
-			</dependency>
-		</dependencies>
-	</dependencyManagement>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.springframework.boot</groupId>
-				<artifactId>spring-boot-maven-plugin</artifactId>
-				<configuration>
-					<excludes>
-						<exclude>
-							<groupId>org.projectlombok</groupId>
-							<artifactId>lombok</artifactId>
-						</exclude>
-					</excludes>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-
 </project>