ChenGanBin 2 жил өмнө
parent
commit
0212f9db75
31 өөрчлөгдсөн 400 нэмэгдсэн , 74 устгасан
  1. 6 0
      README.md
  2. 17 0
      pom.xml
  3. 2 0
      src/main/java/com/zhixinghe1/ots/OnlineToolServiceApplication.java
  4. 6 1
      src/main/java/com/zhixinghe1/ots/atomic/entity/Attachment.java
  5. 26 0
      src/main/java/com/zhixinghe1/ots/atomic/entity/WechatUser.java
  6. 3 0
      src/main/java/com/zhixinghe1/ots/atomic/mapper/AttachmentMapper.java
  7. 14 0
      src/main/java/com/zhixinghe1/ots/atomic/mapper/WeChatUserMapper.java
  8. 24 0
      src/main/java/com/zhixinghe1/ots/atomic/service/IWechatUserService.java
  9. 35 0
      src/main/java/com/zhixinghe1/ots/atomic/service/impl/WechatUserServiceImpl.java
  10. 3 1
      src/main/java/com/zhixinghe1/ots/common/aop/ResponseControllerAdvice.java
  11. 17 0
      src/main/java/com/zhixinghe1/ots/constant/CacheConstant.java
  12. 1 1
      src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkFormat.java
  13. 1 1
      src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkLayout.java
  14. 1 1
      src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkRequest.java
  15. 1 1
      src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkStyle.java
  16. 2 13
      src/main/java/com/zhixinghe1/ots/domain/dto/wechat/Code2SessionRequest.java
  17. 3 3
      src/main/java/com/zhixinghe1/ots/domain/dto/wechat/Code2SessionResponse.java
  18. 5 2
      src/main/java/com/zhixinghe1/ots/domain/dto/wechat/LoginRequest.java
  19. 5 5
      src/main/java/com/zhixinghe1/ots/feign/WechatMiniProgramFeign.java
  20. 1 1
      src/main/java/com/zhixinghe1/ots/service/controller/WaterMarkController.java
  21. 0 38
      src/main/java/com/zhixinghe1/ots/service/controller/WeChatMiniProgramController.java
  22. 36 0
      src/main/java/com/zhixinghe1/ots/service/controller/WechatMiniProgramController.java
  23. 1 1
      src/main/java/com/zhixinghe1/ots/service/manager/IWaterMarkManager.java
  24. 17 0
      src/main/java/com/zhixinghe1/ots/service/manager/IWechatMiniProgramManager.java
  25. 5 4
      src/main/java/com/zhixinghe1/ots/service/manager/impl/WaterMarkManagerImpl.java
  26. 61 0
      src/main/java/com/zhixinghe1/ots/service/manager/impl/WechatMiniProgramManagerImpl.java
  27. 63 0
      src/main/java/com/zhixinghe1/ots/utiis/CacheUtils.java
  28. 31 0
      src/main/java/com/zhixinghe1/ots/utiis/SpringUtils.java
  29. 1 1
      src/main/resources/application-dev.yml
  30. 3 0
      src/main/resources/application.yml
  31. 9 0
      src/main/resources/db/schema-h2.sql

+ 6 - 0
README.md

@@ -6,6 +6,9 @@ java -jar xx.jar -Dspring.profiles.active=环境 -Djasypt.encryptor.password=密
 
 待办列表
 
+* TOKEN登录拦截
+* 登录
+* 调用添加水印
 * 日志脱敏
 * 操作日志没有输出list中元素
 * AOP拦截时包定位方式优化
@@ -13,6 +16,9 @@ java -jar xx.jar -Dspring.profiles.active=环境 -Djasypt.encryptor.password=密
 
 开发进度
 
+* 2023-07-28
+    - 修复AOP统一返回处理在返回类型为String且具体返回值为null时报类型转换异常
+    - 增加缓存caffeine的使用
 * 2023-07-25
     - 生产和开发环境配置分离
     - 配置文件中敏感数据加密

+ 17 - 0
pom.xml

@@ -22,6 +22,7 @@
     <lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
     <spring-cloud.version>2022.0.3</spring-cloud.version>
     <jasypt.version>3.0.5</jasypt.version>
+    <jwt.version>4.4.0</jwt.version>
   </properties>
 
   <dependencyManagement>
@@ -110,6 +111,22 @@
       <artifactId>jasypt-spring-boot-starter</artifactId>
       <version>${jasypt.version}</version>
     </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-cache</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.github.ben-manes.caffeine</groupId>
+      <artifactId>caffeine</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.auth0</groupId>
+      <artifactId>java-jwt</artifactId>
+      <version>${jwt.version}</version>
+    </dependency>
   </dependencies>
 
   <!-- 配置阿里云仓库 -->

+ 2 - 0
src/main/java/com/zhixinghe1/ots/OnlineToolServiceApplication.java

@@ -2,8 +2,10 @@ package com.zhixinghe1.ots;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.cloud.openfeign.EnableFeignClients;
 
+@EnableCaching
 @EnableFeignClients
 @SpringBootApplication
 public class OnlineToolServiceApplication {

+ 6 - 1
src/main/java/com/zhixinghe1/ots/atomic/entity/Attachment.java

@@ -1,13 +1,18 @@
 package com.zhixinghe1.ots.atomic.entity;
 
+import java.io.Serial;
+import java.io.Serializable;
+
 import lombok.Data;
 
 /**
  * 上传附件
  */
 @Data
-public class Attachment {
+public class Attachment implements Serializable {
 
+    @Serial
+    private static final long serialVersionUID = 4041962380906355389L;
     /**
      * 主键
      */

+ 26 - 0
src/main/java/com/zhixinghe1/ots/atomic/entity/WechatUser.java

@@ -0,0 +1,26 @@
+package com.zhixinghe1.ots.atomic.entity;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+import lombok.Data;
+
+/**
+ * 微信用户
+ */
+@Data
+public class WechatUser implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3311113022199168676L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 微信用户的唯一标识
+     */
+    private String openId;
+}

+ 3 - 0
src/main/java/com/zhixinghe1/ots/atomic/mapper/AttachmentMapper.java

@@ -5,6 +5,9 @@ import org.apache.ibatis.annotations.Mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zhixinghe1.ots.atomic.entity.Attachment;
 
+/**
+ * 附件 Mapper
+ */
 @Mapper
 public interface AttachmentMapper extends BaseMapper<Attachment> {
 

+ 14 - 0
src/main/java/com/zhixinghe1/ots/atomic/mapper/WeChatUserMapper.java

@@ -0,0 +1,14 @@
+package com.zhixinghe1.ots.atomic.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhixinghe1.ots.atomic.entity.WechatUser;
+
+/**
+ * 微信用户 Mapper
+ */
+@Mapper
+public interface WeChatUserMapper extends BaseMapper<WechatUser> {
+
+}

+ 24 - 0
src/main/java/com/zhixinghe1/ots/atomic/service/IWechatUserService.java

@@ -0,0 +1,24 @@
+package com.zhixinghe1.ots.atomic.service;
+
+import com.zhixinghe1.ots.atomic.entity.WechatUser;
+
+/**
+ * 微信用户 服务
+ */
+public interface IWechatUserService {
+
+    /**
+     * 增加用户
+     * 
+     * @param openId
+     */
+    void add(String openId);
+
+    /**
+     * 根据openId获取用户信息
+     * 
+     * @param openId
+     * @return
+     */
+    WechatUser getByOpenId(String openId);
+}

+ 35 - 0
src/main/java/com/zhixinghe1/ots/atomic/service/impl/WechatUserServiceImpl.java

@@ -0,0 +1,35 @@
+package com.zhixinghe1.ots.atomic.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhixinghe1.ots.atomic.entity.WechatUser;
+import com.zhixinghe1.ots.atomic.mapper.WeChatUserMapper;
+import com.zhixinghe1.ots.atomic.service.IWechatUserService;
+
+@Service
+public class WechatUserServiceImpl extends ServiceImpl<WeChatUserMapper, WechatUser> implements IWechatUserService {
+
+    @Override
+    public void add(String openId) {
+        if (openId == null) {
+            return;
+        }
+
+        WechatUser weChatUser = new WechatUser();
+        weChatUser.setOpenId(openId);
+        save(weChatUser);
+    }
+
+    @Override
+    public WechatUser getByOpenId(String openId) {
+        if (openId == null) {
+            return null;
+        }
+
+        LambdaQueryWrapper<WechatUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WechatUser::getOpenId, openId);
+        return getOne(queryWrapper);
+    }
+}

+ 3 - 1
src/main/java/com/zhixinghe1/ots/common/aop/ResponseControllerAdvice.java

@@ -30,7 +30,9 @@ public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> {
         if (body instanceof JsonResponse) {
             return body;
         }
-        if (body instanceof String) {
+
+        Class<?> returnClass = returnType.getParameterType();
+        if (String.class.equals(returnClass)) {
             ObjectMapper objectMapper = new ObjectMapper();
             try {
                 return objectMapper.writeValueAsString(JsonResponse.success(body));

+ 17 - 0
src/main/java/com/zhixinghe1/ots/constant/CacheConstant.java

@@ -0,0 +1,17 @@
+package com.zhixinghe1.ots.constant;
+
+/**
+ * 缓存常量
+ */
+public class CacheConstant {
+
+    /**
+     * 微信小程序用户 session_key
+     */
+    public static final String WECHAT_MINI_PROGRAM_SESSION_KEY = "WECHAT:MINI-PROGRAM:SESSION-KEY";
+
+    /**
+     * 系统用户访问凭据(token)
+     */
+    public static final String SYSTEM_USER_TOKEN = "SYSTEM:USER:TOKEN";
+}

+ 1 - 1
src/main/java/com/zhixinghe1/ots/domain/dto/WaterMarkFormat.java → src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkFormat.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.domain.dto;
+package com.zhixinghe1.ots.domain.dto.watermark;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/com/zhixinghe1/ots/domain/dto/WaterMarkLayout.java → src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkLayout.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.domain.dto;
+package com.zhixinghe1.ots.domain.dto.watermark;
 
 import com.zhixinghe1.ots.service.constant.PositionEnum;
 

+ 1 - 1
src/main/java/com/zhixinghe1/ots/domain/dto/WaterMarkRequest.java → src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkRequest.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.domain.dto;
+package com.zhixinghe1.ots.domain.dto.watermark;
 
 import lombok.Data;
 

+ 1 - 1
src/main/java/com/zhixinghe1/ots/domain/dto/WaterMarkStyle.java → src/main/java/com/zhixinghe1/ots/domain/dto/watermark/WaterMarkStyle.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.domain.dto;
+package com.zhixinghe1.ots.domain.dto.watermark;
 
 import com.zhixinghe1.ots.service.constant.FontEnum;
 import com.zhixinghe1.ots.service.constant.FontStyleEnum;

+ 2 - 13
src/main/java/com/zhixinghe1/ots/domain/dto/WetChatMiniProgramLoginRequest.java → src/main/java/com/zhixinghe1/ots/domain/dto/wechat/Code2SessionRequest.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.domain.dto;
+package com.zhixinghe1.ots.domain.dto.wechat;
 
 import feign.Param;
 import lombok.Data;
@@ -11,18 +11,7 @@ import lombok.Data;
  * @version V1.0
  **/
 @Data
-public class WetChatMiniProgramLoginRequest {
-
-    /**
-     * 小程序 appId
-     */
-    // @Param("appid")
-    // private String appId;
-
-    /**
-     * 小程序 appSecret
-     */
-    // private String secret;
+public class Code2SessionRequest {
 
     /**
      * 登录时获取的 code

+ 3 - 3
src/main/java/com/zhixinghe1/ots/domain/dto/WetChatMiniProgramLoginResponse.java → src/main/java/com/zhixinghe1/ots/domain/dto/wechat/Code2SessionResponse.java

@@ -1,4 +1,4 @@
-package com.zhixinghe1.ots.domain.dto;
+package com.zhixinghe1.ots.domain.dto.wechat;
 
 import com.fasterxml.jackson.annotation.JsonAlias;
 
@@ -12,13 +12,13 @@ import lombok.Data;
  * @version V1.0
  **/
 @Data
-public class WetChatMiniProgramLoginResponse {
+public class Code2SessionResponse {
 
     /**
      * 错误码
      */
     @JsonAlias("errcode")
-    private String errCode;
+    private Integer errCode;
 
     /**
      * 错误信息

+ 5 - 2
src/main/java/com/zhixinghe1/ots/domain/dto/LoginRequest.java → src/main/java/com/zhixinghe1/ots/domain/dto/wechat/LoginRequest.java

@@ -1,10 +1,10 @@
-package com.zhixinghe1.ots.domain.dto;
+package com.zhixinghe1.ots.domain.dto.wechat;
 
 import lombok.Data;
 
 /**
  * @className LoginRequest
- * @description 登录DTO
+ * @description 微信小程序登录DTO
  * @author ChenYL
  * @date 2023/07/23 16:09
  * @version V1.0
@@ -12,5 +12,8 @@ import lombok.Data;
 @Data
 public class LoginRequest {
 
+    /**
+     * 微信小程序登录时获取的 code
+     */
     private String code;
 }

+ 5 - 5
src/main/java/com/zhixinghe1/ots/feign/WeChatMiniProgramFeign.java → src/main/java/com/zhixinghe1/ots/feign/WechatMiniProgramFeign.java

@@ -4,8 +4,8 @@ import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.SpringQueryMap;
 import org.springframework.web.bind.annotation.GetMapping;
 
-import com.zhixinghe1.ots.domain.dto.WetChatMiniProgramLoginRequest;
-import com.zhixinghe1.ots.domain.dto.WetChatMiniProgramLoginResponse;
+import com.zhixinghe1.ots.domain.dto.wechat.Code2SessionRequest;
+import com.zhixinghe1.ots.domain.dto.wechat.Code2SessionResponse;
 
 /**
  * @interfaceNName WeChatMiniProgramFeign
@@ -15,12 +15,12 @@ import com.zhixinghe1.ots.domain.dto.WetChatMiniProgramLoginResponse;
  * @version V1.0
  **/
 
-@FeignClient(name = "wechatMiniProgram", url = "https://api.weixin.qq.com")
-public interface WeChatMiniProgramFeign {
+@FeignClient(name = "wechat-mini-program-service", url = "${biz.wechat.mini-program.url}")
+public interface WechatMiniProgramFeign {
 
     /**
      * 微信小程序登录
      */
     @GetMapping("/sns/jscode2session")
-    WetChatMiniProgramLoginResponse login(@SpringQueryMap WetChatMiniProgramLoginRequest loginRequest);
+    Code2SessionResponse code2Session(@SpringQueryMap Code2SessionRequest loginRequest);
 }

+ 1 - 1
src/main/java/com/zhixinghe1/ots/service/controller/WaterMarkController.java

@@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.zhixinghe1.ots.domain.dto.WaterMarkRequest;
+import com.zhixinghe1.ots.domain.dto.watermark.WaterMarkRequest;
 import com.zhixinghe1.ots.service.manager.IWaterMarkManager;
 
 import io.swagger.v3.oas.annotations.tags.Tag;

+ 0 - 38
src/main/java/com/zhixinghe1/ots/service/controller/WeChatMiniProgramController.java

@@ -1,38 +0,0 @@
-package com.zhixinghe1.ots.service.controller;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.zhixinghe1.ots.domain.dto.LoginRequest;
-import com.zhixinghe1.ots.domain.dto.WetChatMiniProgramLoginRequest;
-import com.zhixinghe1.ots.domain.dto.WetChatMiniProgramLoginResponse;
-import com.zhixinghe1.ots.feign.WeChatMiniProgramFeign;
-
-/**
- * @className WeChatMiniProgramController
- * @description 微信小程序
- * @author ChenYL
- * @date 2023/07/23 16:08
- * @version V1.0
- **/
-@RestController
-@RequestMapping("/wechat/miniprogram")
-public class WeChatMiniProgramController {
-
-    @Autowired
-    private WeChatMiniProgramFeign weChatMiniProgramFeign;
-
-    @PostMapping("/login")
-    public WetChatMiniProgramLoginResponse login(@RequestBody LoginRequest request) {
-        WetChatMiniProgramLoginRequest wetChatMiniProgramLoginRequest = new WetChatMiniProgramLoginRequest();
-        wetChatMiniProgramLoginRequest.setGrantType("authorization_code");
-        // wetChatMiniProgramLoginRequest.setSecret("fd44ec6a6fdc0937ca600fc89c3ebbe8");
-        // wetChatMiniProgramLoginRequest.setAppId("wx6468ace33a6de441");
-        wetChatMiniProgramLoginRequest.setJsCode(request.getCode());
-        WetChatMiniProgramLoginResponse login = weChatMiniProgramFeign.login(wetChatMiniProgramLoginRequest);
-        return login;
-    }
-}

+ 36 - 0
src/main/java/com/zhixinghe1/ots/service/controller/WechatMiniProgramController.java

@@ -0,0 +1,36 @@
+package com.zhixinghe1.ots.service.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.zhixinghe1.ots.domain.dto.wechat.LoginRequest;
+import com.zhixinghe1.ots.service.manager.IWechatMiniProgramManager;
+
+/**
+ * @className WeChatMiniProgramController
+ * @description 微信小程序
+ * @author ChenYL
+ * @date 2023/07/23 16:08
+ * @version V1.0
+ **/
+@RestController
+@RequestMapping("/wechat/miniprogram")
+public class WechatMiniProgramController {
+
+    @Autowired
+    private IWechatMiniProgramManager weChatMiniProgramManager;
+
+    /**
+     * 微信小程序登录
+     * 
+     * @param request
+     * @return 微信登陆后获得的session_key
+     */
+    @PostMapping("/login")
+    public String login(@RequestBody LoginRequest request) {
+        return weChatMiniProgramManager.login(request);
+    }
+}

+ 1 - 1
src/main/java/com/zhixinghe1/ots/service/manager/IWaterMarkManager.java

@@ -2,7 +2,7 @@ package com.zhixinghe1.ots.service.manager;
 
 import java.io.UnsupportedEncodingException;
 
-import com.zhixinghe1.ots.domain.dto.WaterMarkRequest;
+import com.zhixinghe1.ots.domain.dto.watermark.WaterMarkRequest;
 
 /**
  * 水印服务类

+ 17 - 0
src/main/java/com/zhixinghe1/ots/service/manager/IWechatMiniProgramManager.java

@@ -0,0 +1,17 @@
+package com.zhixinghe1.ots.service.manager;
+
+import com.zhixinghe1.ots.domain.dto.wechat.LoginRequest;
+
+/**
+ * 微信小程序 服务类
+ */
+public interface IWechatMiniProgramManager {
+
+    /**
+     * 微信小程序登录
+     * 
+     * @param request
+     * @return 微信登陆后获得的session_key
+     */
+    String login(LoginRequest request);
+}

+ 5 - 4
src/main/java/com/zhixinghe1/ots/service/manager/impl/WaterMarkManagerImpl.java

@@ -1,6 +1,7 @@
 package com.zhixinghe1.ots.service.manager.impl;
 
-import java.awt.*;
+import java.awt.Color;
+import java.awt.Font;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
@@ -15,9 +16,9 @@ import org.springframework.web.context.request.ServletRequestAttributes;
 import com.zhixinghe1.ots.atomic.service.IAttachmentService;
 import com.zhixinghe1.ots.common.exception.BusinessException;
 import com.zhixinghe1.ots.domain.dto.AttachmentDto;
-import com.zhixinghe1.ots.domain.dto.WaterMarkLayout;
-import com.zhixinghe1.ots.domain.dto.WaterMarkRequest;
-import com.zhixinghe1.ots.domain.dto.WaterMarkStyle;
+import com.zhixinghe1.ots.domain.dto.watermark.WaterMarkLayout;
+import com.zhixinghe1.ots.domain.dto.watermark.WaterMarkRequest;
+import com.zhixinghe1.ots.domain.dto.watermark.WaterMarkStyle;
 import com.zhixinghe1.ots.service.constant.PositionEnum;
 import com.zhixinghe1.ots.service.core.TileImageFilter;
 import com.zhixinghe1.ots.service.manager.IWaterMarkManager;

+ 61 - 0
src/main/java/com/zhixinghe1/ots/service/manager/impl/WechatMiniProgramManagerImpl.java

@@ -0,0 +1,61 @@
+package com.zhixinghe1.ots.service.manager.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.CacheManager;
+import org.springframework.stereotype.Service;
+
+import com.zhixinghe1.ots.atomic.entity.WechatUser;
+import com.zhixinghe1.ots.atomic.service.IWechatUserService;
+import com.zhixinghe1.ots.common.exception.BusinessException;
+import com.zhixinghe1.ots.constant.CacheConstant;
+import com.zhixinghe1.ots.domain.dto.wechat.Code2SessionRequest;
+import com.zhixinghe1.ots.domain.dto.wechat.Code2SessionResponse;
+import com.zhixinghe1.ots.domain.dto.wechat.LoginRequest;
+import com.zhixinghe1.ots.feign.WechatMiniProgramFeign;
+import com.zhixinghe1.ots.service.manager.IWechatMiniProgramManager;
+import com.zhixinghe1.ots.utiis.CacheUtils;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 微信小程序服务类
+ */
+@Slf4j
+@Service
+public class WechatMiniProgramManagerImpl implements IWechatMiniProgramManager {
+
+    @Autowired
+    private WechatMiniProgramFeign wechatMiniProgramFeign;
+
+    @Autowired
+    private IWechatUserService wechatUserService;
+
+    @Autowired
+    private CacheManager cacheManager;
+
+    @Override
+    public String login(LoginRequest request) {
+        Code2SessionRequest code2SessionRequest = new Code2SessionRequest();
+        code2SessionRequest.setGrantType("authorization_code");
+        code2SessionRequest.setJsCode(request.getCode());
+        Code2SessionResponse loginResponse = wechatMiniProgramFeign.code2Session(code2SessionRequest);
+        if (loginResponse.getErrCode() != 0) {
+            throw BusinessException.fail(loginResponse.getErrMsg());
+        }
+
+        // 新增加用户记录
+        WechatUser wechatUser = wechatUserService.getByOpenId(loginResponse.getOpenId());
+        if (wechatUser == null) {
+            wechatUserService.add(loginResponse.getOpenId());
+        }
+
+        // 缓存微信用户对应的session_key
+        CacheUtils.put(CacheConstant.WECHAT_MINI_PROGRAM_SESSION_KEY, loginResponse.getOpenId(),
+            loginResponse.getSessionKey());
+
+        // TODO 颁发token
+        CacheUtils.put(CacheConstant.SYSTEM_USER_TOKEN, loginResponse.getOpenId(), loginResponse.getSessionKey());
+
+        return null;
+    }
+}

+ 63 - 0
src/main/java/com/zhixinghe1/ots/utiis/CacheUtils.java

@@ -0,0 +1,63 @@
+package com.zhixinghe1.ots.utiis;
+
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+
+/**
+ * 缓存工具类
+ */
+public class CacheUtils {
+
+    private static CacheManager cacheManager;
+
+    static {
+        cacheManager = SpringUtils.getBean(CacheManager.class);
+    }
+
+    /**
+     * 添加缓存
+     *
+     * @param cacheName 缓存名称
+     * @param key 缓存key
+     * @param value 缓存值
+     */
+    public static void put(String cacheName, String key, Object value) {
+        Cache cache = cacheManager.getCache(cacheName);
+        cache.put(key, value);
+    }
+
+    /**
+     * 获取缓存(泛型)
+     *
+     * @param cacheName 缓存名称
+     * @param key 缓存key
+     * @param clazz 缓存类
+     * @param <T> 返回值泛型
+     * @return
+     */
+    public static <T> T get(String cacheName, String key, Class<T> clazz) {
+        Cache cache = cacheManager.getCache(cacheName);
+        if (cache == null) {
+            return null;
+        }
+        Cache.ValueWrapper wrapper = cache.get(key);
+        if (wrapper == null) {
+            return null;
+        }
+        return (T)wrapper.get();
+    }
+
+    /**
+     * 失效缓存
+     *
+     * @param cacheName 缓存名称
+     * @param key 缓存key
+     */
+    public static void evict(String cacheName, String key) {
+        Cache cache = cacheManager.getCache(cacheName);
+        if (cache != null) {
+            cache.evict(key);
+        }
+    }
+
+}

+ 31 - 0
src/main/java/com/zhixinghe1/ots/utiis/SpringUtils.java

@@ -0,0 +1,31 @@
+package com.zhixinghe1.ots.utiis;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * Spring上下文 工具类
+ */
+@Component
+public class SpringUtils implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    /**
+     * 通过class获取Bean.
+     *
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(Class<T> clazz) {
+        return applicationContext.getBean(clazz);
+    }
+}

+ 1 - 1
src/main/resources/application-dev.yml

@@ -1,6 +1,6 @@
 spring:
   datasource:
-    url: jdbc:h2:mem:online_tool_service
+    url: jdbc:h2:mem:online_tool_service;mode=MySQL
     username: root
     password: test
   sql:

+ 3 - 0
src/main/resources/application.yml

@@ -3,6 +3,8 @@ spring:
     active: dev
   datasource:
     driver-class-name: org.h2.Driver
+  cache:
+    type: caffeine
   h2:
     console:
       enabled: true
@@ -21,5 +23,6 @@ jasypt:
 biz:
   wechat:
     mini-program:
+      url: https://api.weixin.qq.com
       app-id: ENC(qw0NNe6VoMWvpoGKZLitIJ8HWMHBF+5FbCAVQyJGdxREenOAaEB1oQ==)
       secret: ENC(i2ZFfTtFRvAUqpXSW4CQd6HEAMTc0Ltc1dVbhDiIxe4a5H7BbTV3bfiGhFvtRszOMIgyQDoxeZI=)

+ 9 - 0
src/main/resources/db/schema-h2.sql

@@ -1,4 +1,5 @@
 DROP TABLE IF EXISTS attachment;
+DROP TABLE IF EXISTS wechat_user;
 
 CREATE TABLE attachment
 (
@@ -7,4 +8,12 @@ CREATE TABLE attachment
 	path VARCHAR(256) NOT NULL COMMENT '文件路径',
 	status tinyint DEFAULT 0 COMMENT '使用状态',
 	PRIMARY KEY (id)
+);
+
+CREATE TABLE wechat_user
+(
+	id BIGINT NOT NULL COMMENT '主键ID',
+	open_id VARCHAR(28) NOT NULL COMMENT '微信用户的唯一标识',
+	PRIMARY KEY (id),
+	UNIQUE INDEX wechat_user_idx_open_id (`open_id`)
 );