Jelajahi Sumber

临时提交

ChenGanBin 2 tahun lalu
induk
melakukan
cc20b8cea8
28 mengubah file dengan 199 tambahan dan 159 penghapusan
  1. 2 0
      README.md
  2. 22 23
      pom.xml
  3. 3 0
      src/main/java/com/zhixinghe1/ots/atomic/entity/Attachment.java
  4. 2 0
      src/main/java/com/zhixinghe1/ots/atomic/entity/WechatUser.java
  5. 3 5
      src/main/java/com/zhixinghe1/ots/atomic/mapper/AttachmentMapper.java
  6. 0 14
      src/main/java/com/zhixinghe1/ots/atomic/mapper/WeChatUserMapper.java
  7. 12 0
      src/main/java/com/zhixinghe1/ots/atomic/mapper/WechatUserMapper.java
  8. 1 1
      src/main/java/com/zhixinghe1/ots/atomic/service/IAttachmentService.java
  9. 4 11
      src/main/java/com/zhixinghe1/ots/atomic/service/IWechatUserService.java
  10. 14 8
      src/main/java/com/zhixinghe1/ots/atomic/service/impl/AttachmentServiceImpl.java
  11. 35 27
      src/main/java/com/zhixinghe1/ots/atomic/service/impl/WechatUserServiceImpl.java
  12. 2 10
      src/main/java/com/zhixinghe1/ots/config/MyBatisConfig.java
  13. 0 23
      src/main/java/com/zhixinghe1/ots/config/SpringDocConfig.java
  14. 5 1
      src/main/java/com/zhixinghe1/ots/config/WebMvcConfig.java
  15. 14 0
      src/main/java/com/zhixinghe1/ots/domain/converter/WechatUserConverter.java
  16. 15 0
      src/main/java/com/zhixinghe1/ots/domain/dto/WechatUserDto.java
  17. 3 3
      src/main/java/com/zhixinghe1/ots/interceptor/AuthInterceptor.java
  18. 9 1
      src/main/java/com/zhixinghe1/ots/service/controller/OssController.java
  19. 0 3
      src/main/java/com/zhixinghe1/ots/service/controller/WaterMarkController.java
  20. 9 1
      src/main/java/com/zhixinghe1/ots/service/manager/IOssManager.java
  21. 37 2
      src/main/java/com/zhixinghe1/ots/service/manager/impl/OssManagerImpl.java
  22. 1 1
      src/main/java/com/zhixinghe1/ots/service/manager/impl/WechatMiniProgramManagerImpl.java
  23. 1 7
      src/main/resources/application-dev.yml
  24. 0 4
      src/main/resources/application-prod.yml
  25. 1 0
      src/main/resources/application.yml
  26. 0 8
      src/main/resources/db/data-h2.sql
  27. 3 5
      src/main/resources/db/schema-h2.sql
  28. 1 1
      src/test/java/com/zhixinghe1/ots/JasyptTest.java

+ 2 - 0
README.md

@@ -6,6 +6,8 @@ java -jar xx.jar -Dspring.profiles.active=环境 -Djasypt.encryptor.password=密
 
 待办列表
 
+* 主键不是自增
+* 批量保存时没有回填主键
 * 登录
 * 调用添加水印
 * 日志脱敏

+ 22 - 23
pom.xml

@@ -17,12 +17,13 @@
   <properties>
     <java.version>17</java.version>
     <mapstruct.version>1.5.5.Final</mapstruct.version>
-    <mybatis.plus.version>3.5.3.1</mybatis.plus.version>
     <thumbnailator.version>0.4.20</thumbnailator.version>
     <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>
+    <mybatis.mapper.version>2.0.0</mybatis.mapper.version>
+    <mybatis.springboot.starter.version>3.0.2</mybatis.springboot.starter.version>
   </properties>
 
   <dependencyManagement>
@@ -38,6 +39,14 @@
   </dependencyManagement>
 
   <dependencies>
+    <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>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-validation</artifactId>
@@ -54,7 +63,10 @@
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-tx</artifactId>
+    </dependency>
     <dependency>
       <groupId>com.h2database</groupId>
       <artifactId>h2</artifactId>
@@ -76,21 +88,20 @@
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
     </dependency>
-
-    <dependency>
-      <groupId>org.springdoc</groupId>
-      <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
-      <version>2.1.0</version>
-    </dependency>
     <dependency>
       <groupId>net.coobird</groupId>
       <artifactId>thumbnailator</artifactId>
       <version>${thumbnailator.version}</version>
     </dependency>
     <dependency>
-      <groupId>com.baomidou</groupId>
-      <artifactId>mybatis-plus-boot-starter</artifactId>
-      <version>${mybatis.plus.version}</version>
+      <groupId>org.mybatis.spring.boot</groupId>
+      <artifactId>mybatis-spring-boot-starter</artifactId>
+      <version>${mybatis.springboot.starter.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>io.mybatis</groupId>
+      <artifactId>mybatis-mapper</artifactId>
+      <version>${mybatis.mapper.version}</version>
     </dependency>
     <dependency>
       <groupId>org.mapstruct</groupId>
@@ -104,24 +115,12 @@
       <version>${mapstruct.version}</version>
       <scope>compile</scope>
     </dependency>
-
     <!--  加解密  -->
     <dependency>
       <groupId>com.github.ulisesbocchio</groupId>
       <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>

+ 3 - 0
src/main/java/com/zhixinghe1/ots/atomic/entity/Attachment.java

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

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

@@ -3,12 +3,14 @@ package com.zhixinghe1.ots.atomic.entity;
 import java.io.Serial;
 import java.io.Serializable;
 
+import io.mybatis.provider.Entity.Table;
 import lombok.Data;
 
 /**
  * 微信用户
  */
 @Data
+@Table
 public class WechatUser implements Serializable {
 
     @Serial

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

@@ -1,14 +1,12 @@
 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.Attachment;
 
+import io.mybatis.mapper.Mapper;
+
 /**
  * 附件 Mapper
  */
-@Mapper
-public interface AttachmentMapper extends BaseMapper<Attachment> {
+public interface AttachmentMapper extends Mapper<Attachment, Long> {
 
 }

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

@@ -1,14 +0,0 @@
-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> {
-
-}

+ 12 - 0
src/main/java/com/zhixinghe1/ots/atomic/mapper/WechatUserMapper.java

@@ -0,0 +1,12 @@
+package com.zhixinghe1.ots.atomic.mapper;
+
+import com.zhixinghe1.ots.atomic.entity.WechatUser;
+
+import io.mybatis.mapper.Mapper;
+
+/**
+ * 微信用户 Mapper
+ */
+public interface WechatUserMapper extends Mapper<WechatUser, Long> {
+
+}

+ 1 - 1
src/main/java/com/zhixinghe1/ots/atomic/service/IAttachmentService.java

@@ -23,5 +23,5 @@ public interface IAttachmentService {
      * @param attachmentDtoList
      * @return
      */
-    boolean batchAddAttachment(List<AttachmentDto> attachmentDtoList);
+    void batchAddAttachment(List<AttachmentDto> attachmentDtoList);
 }

+ 4 - 11
src/main/java/com/zhixinghe1/ots/atomic/service/IWechatUserService.java

@@ -1,26 +1,19 @@
 package com.zhixinghe1.ots.atomic.service;
 
-import com.zhixinghe1.ots.atomic.entity.WechatUser;
+import com.zhixinghe1.ots.domain.dto.WechatUserDto;
 
 /**
  * 微信用户 服务
  */
 public interface IWechatUserService {
 
-    /**
-     * 增加用户
-     * 
-     * @param openId
-     */
-    WechatUser add(String openId);
-
     /**
      * 根据openId获取用户信息
      * 
      * @param openId
      * @return
      */
-    WechatUser getByOpenId(String openId);
+    WechatUserDto getByOpenId(String openId);
 
     /**
      * 获取用户信息,如果不存在则新增
@@ -28,7 +21,7 @@ public interface IWechatUserService {
      * @param openId
      * @return
      */
-    WechatUser getAndAdd(String openId);
+    WechatUserDto getAndAdd(String openId);
 
     /**
      * 根据ID获取用户信息
@@ -36,5 +29,5 @@ public interface IWechatUserService {
      * @param id
      * @return
      */
-    WechatUser getById(Long id);
+    WechatUserDto getById(Long id);
 }

+ 14 - 8
src/main/java/com/zhixinghe1/ots/atomic/service/impl/AttachmentServiceImpl.java

@@ -1,13 +1,13 @@
 package com.zhixinghe1.ots.atomic.service.impl;
 
 import java.util.List;
+import java.util.Optional;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zhixinghe1.ots.atomic.entity.Attachment;
 import com.zhixinghe1.ots.atomic.mapper.AttachmentMapper;
 import com.zhixinghe1.ots.atomic.service.IAttachmentService;
@@ -15,7 +15,10 @@ import com.zhixinghe1.ots.domain.converter.AttachmentConverter;
 import com.zhixinghe1.ots.domain.dto.AttachmentDto;
 
 @Service
-public class AttachmentServiceImpl extends ServiceImpl<AttachmentMapper, Attachment> implements IAttachmentService {
+public class AttachmentServiceImpl implements IAttachmentService {
+
+    @Autowired
+    private AttachmentMapper attachmentMapper;
 
     @Autowired
     private AttachmentConverter attachmentConverter;
@@ -26,18 +29,21 @@ public class AttachmentServiceImpl extends ServiceImpl<AttachmentMapper, Attachm
             return null;
         }
 
-        Attachment attachment = baseMapper.selectById(id);
-        return attachmentConverter.convert2Dto(attachment);
+        Optional<Attachment> optional = attachmentMapper.selectByPrimaryKey(id);
+        return attachmentConverter.convert2Dto(optional.get());
     }
 
     @Override
     @Transactional
-    public boolean batchAddAttachment(List<AttachmentDto> attachmentDtoList) {
+    public void batchAddAttachment(List<AttachmentDto> attachmentDtoList) {
         if (CollectionUtils.isEmpty(attachmentDtoList)) {
-            return true;
+            return;
         }
 
-        List<Attachment> attachments = attachmentConverter.convert2EntityList(attachmentDtoList);
-        return saveBatch(attachments);
+        attachmentDtoList.forEach(attachmentDto -> {
+            Attachment attachment = attachmentConverter.convert2Entity(attachmentDto);
+            attachmentMapper.insertSelective(attachment);
+            attachmentDto.setId(attachment.getId());
+        });
     }
 }

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

@@ -1,56 +1,64 @@
 package com.zhixinghe1.ots.atomic.service.impl;
 
+import java.util.Optional;
+
+import org.springframework.beans.factory.annotation.Autowired;
 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.mapper.WechatUserMapper;
 import com.zhixinghe1.ots.atomic.service.IWechatUserService;
+import com.zhixinghe1.ots.domain.converter.WechatUserConverter;
+import com.zhixinghe1.ots.domain.dto.WechatUserDto;
+
+import io.mybatis.mapper.example.Example;
+import io.mybatis.mapper.example.Example.Criteria;
 
 @Service
-public class WechatUserServiceImpl extends ServiceImpl<WeChatUserMapper, WechatUser> implements IWechatUserService {
+public class WechatUserServiceImpl implements IWechatUserService {
 
-    @Override
-    public WechatUser add(String openId) {
-        if (openId == null) {
-            return null;
-        }
+    @Autowired
+    private WechatUserMapper wechatUserMapper;
 
-        WechatUser wechatUser = new WechatUser();
-        wechatUser.setOpenId(openId);
-        save(wechatUser);
-        return wechatUser;
-    }
+    @Autowired
+    private WechatUserConverter wechatUserConverter;
 
     @Override
-    public WechatUser getByOpenId(String openId) {
+    public WechatUserDto getByOpenId(String openId) {
         if (openId == null) {
             return null;
         }
 
-        LambdaQueryWrapper<WechatUser> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(WechatUser::getOpenId, openId);
-        return getOne(queryWrapper);
+        Example<WechatUser> example = new Example<>();
+        Criteria<WechatUser> criteria = example.createCriteria();
+        criteria.andEqualTo(WechatUser::getOpenId, openId);
+        Optional<WechatUser> optional = wechatUserMapper.selectOneByExample(example);
+        return wechatUserConverter.convert2Dto(optional.get());
     }
 
     @Override
-    public WechatUser getAndAdd(String openId) {
-        WechatUser wechatUser = getByOpenId(openId);
-        if (wechatUser == null) {
-            wechatUser = add(openId);
+    public WechatUserDto getAndAdd(String openId) {
+        WechatUserDto wechatUserDto = getByOpenId(openId);
+        if (wechatUserDto != null) {
+            return wechatUserDto;
         }
-        return wechatUser;
+
+        WechatUser wechatUser = new WechatUser();
+        wechatUser.setOpenId(openId);
+        wechatUserMapper.insertSelective(wechatUser);
+        return wechatUserConverter.convert2Dto(wechatUser);
     }
 
     @Override
-    public WechatUser getById(Long id) {
+    public WechatUserDto getById(Long id) {
         if (id == null) {
             return null;
         }
 
-        LambdaQueryWrapper<WechatUser> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(WechatUser::getId, id);
-        return getOne(queryWrapper);
+        Example<WechatUser> example = new Example<>();
+        Criteria<WechatUser> criteria = example.createCriteria();
+        criteria.andEqualTo(WechatUser::getId, id);
+        Optional<WechatUser> optional = wechatUserMapper.selectOneByExample(example);
+        return wechatUserConverter.convert2Dto(optional.get());
     }
 }

+ 2 - 10
src/main/java/com/zhixinghe1/ots/config/MyBatisConfig.java

@@ -1,16 +1,8 @@
 package com.zhixinghe1.ots.config;
 
-import static com.zhixinghe1.ots.config.MyBatisConfig.MAPPER_SCAN_PATH;
-
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
-@MapperScan(basePackages = MAPPER_SCAN_PATH)
-public class MyBatisConfig {
-
-    /**
-     * MyBatis扫描路径
-     */
-    public static final String MAPPER_SCAN_PATH = "com.zhixinghe1.ots.atomic.mapper";
-}
+@MapperScan(basePackages = "com.zhixinghe1.ots.atomic.mapper")
+public class MyBatisConfig {}

+ 0 - 23
src/main/java/com/zhixinghe1/ots/config/SpringDocConfig.java

@@ -1,23 +0,0 @@
-package com.zhixinghe1.ots.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import io.swagger.v3.oas.models.OpenAPI;
-import io.swagger.v3.oas.models.info.Info;
-
-/**
- * SpringDoc配置类
- */
-@Configuration
-public class SpringDocConfig {
-
-    @Bean
-    public OpenAPI openAPI() {
-        return new OpenAPI().info(info());
-    }
-
-    private Info info() {
-        return new Info().title("在线工具服务接口");
-    }
-}

+ 5 - 1
src/main/java/com/zhixinghe1/ots/config/WebMvcConfig.java

@@ -1,5 +1,6 @@
 package com.zhixinghe1.ots.config;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.format.FormatterRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@@ -11,6 +12,9 @@ import com.zhixinghe1.ots.interceptor.AuthInterceptor;
 @Configuration
 public class WebMvcConfig implements WebMvcConfigurer {
 
+    @Autowired
+    private AuthInterceptor authInterceptor;
+
     @Override
     public void addFormatters(FormatterRegistry registry) {
         registry.addConverterFactory(new IntegerToEnumConverterFactory());
@@ -18,6 +22,6 @@ public class WebMvcConfig implements WebMvcConfigurer {
 
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/watermark/**", "/oss/**");
+        registry.addInterceptor(authInterceptor).addPathPatterns("/watermark/**", "/oss/**");
     }
 }

+ 14 - 0
src/main/java/com/zhixinghe1/ots/domain/converter/WechatUserConverter.java

@@ -0,0 +1,14 @@
+package com.zhixinghe1.ots.domain.converter;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+
+import com.zhixinghe1.ots.atomic.entity.WechatUser;
+import com.zhixinghe1.ots.common.converter.mapstruct.BaseEntityConverter;
+import com.zhixinghe1.ots.domain.dto.WechatUserDto;
+
+/**
+ * 微信用户对象转换工具
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
+public interface WechatUserConverter extends BaseEntityConverter<WechatUser, WechatUserDto> {}

+ 15 - 0
src/main/java/com/zhixinghe1/ots/domain/dto/WechatUserDto.java

@@ -0,0 +1,15 @@
+package com.zhixinghe1.ots.domain.dto;
+
+import com.zhixinghe1.ots.atomic.entity.WechatUser;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 微信用户DTO
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WechatUserDto extends WechatUser {
+
+}

+ 3 - 3
src/main/java/com/zhixinghe1/ots/interceptor/AuthInterceptor.java

@@ -8,10 +8,10 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.HandlerInterceptor;
 
 import com.auth0.jwt.interfaces.Claim;
-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.common.exception.LoginException;
+import com.zhixinghe1.ots.domain.dto.WechatUserDto;
 import com.zhixinghe1.ots.utiis.TokenUtils;
 
 import jakarta.servlet.http.HttpServletRequest;
@@ -50,8 +50,8 @@ public class AuthInterceptor implements HandlerInterceptor {
             throw LoginException.fail("登录校验异常");
         }
 
-        WechatUser wechatUser = wechatUserService.getById(userId);
-        if (wechatUser == null) {
+        WechatUserDto wechatUserDto = wechatUserService.getById(userId);
+        if (wechatUserDto == null) {
             throw BusinessException.fail("不存在的用户");
         }
 

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

@@ -1,11 +1,14 @@
 package com.zhixinghe1.ots.service.controller;
 
+import java.io.UnsupportedEncodingException;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
@@ -24,7 +27,12 @@ public class OssController {
     private IOssManager ossManager;
 
     @PostMapping("/upload")
-    public List<String> upload(@RequestPart("files") List<MultipartFile> multipartFiles) {
+    public List<Long> upload(@RequestPart("files") List<MultipartFile> multipartFiles) {
         return ossManager.upload(multipartFiles);
     }
+
+    @GetMapping("/download")
+    public void download(@RequestParam Long attachmentId) throws UnsupportedEncodingException {
+        ossManager.download(attachmentId);
+    }
 }

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

@@ -11,9 +11,6 @@ import org.springframework.web.bind.annotation.RestController;
 import com.zhixinghe1.ots.domain.dto.watermark.WaterMarkRequest;
 import com.zhixinghe1.ots.service.manager.IWaterMarkManager;
 
-import io.swagger.v3.oas.annotations.tags.Tag;
-
-@Tag(name = "水印")
 @RestController
 @RequestMapping("/watermark")
 public class WaterMarkController {

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

@@ -1,5 +1,6 @@
 package com.zhixinghe1.ots.service.manager;
 
+import java.io.UnsupportedEncodingException;
 import java.util.List;
 
 import org.springframework.web.multipart.MultipartFile;
@@ -15,5 +16,12 @@ public interface IOssManager {
      * @param multipartFiles
      * @return
      */
-    List<String> upload(List<MultipartFile> multipartFiles);
+    List<Long> upload(List<MultipartFile> multipartFiles);
+
+    /**
+     * 附件ID
+     * 
+     * @param attachmentId
+     */
+    void download(Long attachmentId) throws UnsupportedEncodingException;
 }

+ 37 - 2
src/main/java/com/zhixinghe1/ots/service/manager/impl/OssManagerImpl.java

@@ -1,21 +1,31 @@
 package com.zhixinghe1.ots.service.manager.impl;
 
+import java.io.BufferedInputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 import org.springframework.web.multipart.MultipartFile;
 
 import com.zhixinghe1.ots.atomic.service.IAttachmentService;
+import com.zhixinghe1.ots.common.exception.BusinessException;
 import com.zhixinghe1.ots.config.BizConfig;
 import com.zhixinghe1.ots.domain.dto.AttachmentDto;
 import com.zhixinghe1.ots.service.manager.IOssManager;
 
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -32,13 +42,13 @@ public class OssManagerImpl implements IOssManager {
     private IAttachmentService attachmentService;
 
     @Override
-    public List<String> upload(List<MultipartFile> multipartFiles) {
+    public List<Long> upload(List<MultipartFile> multipartFiles) {
         if (CollectionUtils.isEmpty(multipartFiles)) {
             return new ArrayList<>(0);
         }
         List<AttachmentDto> attachmentDtoList = transfer(multipartFiles);
         attachmentService.batchAddAttachment(attachmentDtoList);
-        return attachmentDtoList.stream().map(attachmentDto -> attachmentDto.getPath()).collect(Collectors.toList());
+        return attachmentDtoList.stream().map(attachmentDto -> attachmentDto.getId()).collect(Collectors.toList());
     }
 
     /**
@@ -68,4 +78,29 @@ public class OssManagerImpl implements IOssManager {
             return null;
         }).filter(dto -> dto != null).collect(Collectors.toList());
     }
+
+    @Override
+    public void download(Long attachmentId) throws UnsupportedEncodingException {
+        AttachmentDto attachmentDto = attachmentService.getById(attachmentId);
+
+        HttpServletResponse response =
+            Optional.ofNullable(((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse())
+                .orElseThrow();
+        response.setContentType("application/octet-stream");
+        response.setCharacterEncoding("UTF-8");
+        response.setHeader("Content-Disposition",
+            "attachment;fileName=" + URLEncoder.encode(attachmentDto.getName(), "UTF-8"));
+
+        File file = new File(attachmentDto.getPath());
+        if (file.exists()) {
+            throw BusinessException.fail("资源文件不存在");
+        }
+
+        try (OutputStream outputStream = response.getOutputStream();
+            BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) {
+            bufferedInputStream.transferTo(outputStream);
+        } catch (IOException e) {
+            log.error("下载资源文件时发生异常", e);
+        }
+    }
 }

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

@@ -46,7 +46,7 @@ public class WechatMiniProgramManagerImpl implements IWechatMiniProgramManager {
         code2SessionRequest.setGrantType("authorization_code");
         code2SessionRequest.setJsCode(request.getCode());
         Code2SessionResponse loginResponse = wechatMiniProgramFeign.code2Session(code2SessionRequest);
-        if (loginResponse.getErrCode() != 0) {
+        if (loginResponse.getErrCode() != null && loginResponse.getErrCode() != 0) {
             throw BusinessException.fail(loginResponse.getErrMsg());
         }
 

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

@@ -1,15 +1,9 @@
 spring:
   datasource:
-    url: jdbc:h2:mem:online_tool_service;mode=MySQL
     username: root
     password: test
-  sql:
-    init:
-      schema-locations: classpath:db/schema-h2.sql
-      data-locations: classpath:db/data-h2.sql
-      mode: always
 
 biz:
   file:
     tmp:
-      dir: E:\Documents\Code\OnlineToolService\tmp\
+      dir: E:\Documents\Code\online-tool-service\tmp\

+ 0 - 4
src/main/resources/application-prod.yml

@@ -1,11 +1,7 @@
 spring:
   datasource:
-    url: ENC(huBguLs+o7r/he0769XI3AJ1u40QKiZa/VPA7ot3cCcZgnbmIDp6haE3lVmmzf1ut5L7WbIm+1A=)
     username: ENC(fgSVI73C7ZtE1pUKfNdaOPBBWSF1MQRj)
     password: ENC(cfGCqQPxy2bICMy0seNdxM8YuN0f3Mt0/mml5LrCTzbdjyo25QL3Wg==)
-  sql:
-    init:
-      schema-locations: classpath:db/schema-h2.sql
 
 biz:
   file:

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

@@ -3,6 +3,7 @@ spring:
     active: dev
   datasource:
     driver-class-name: org.h2.Driver
+    url: ENC(YSlhmFY8Ty5gIOg8OTv16AZP51FQCPy3XwZB+b3tKpcUpnOTxpY7/Qr+QEAWIkm7OSeb6mj+6DOfBkNDLa8FyGTniNuJ6g41)
   cache:
     type: caffeine
   h2:

+ 0 - 8
src/main/resources/db/data-h2.sql

@@ -1,8 +0,0 @@
-insert into attachment(id, name, path, status) values
-(1681684721460625409,'捕获_1689779856331.PNG','E:\Documents\Code\OnlineToolService\tmp\捕获_1689779856331.PNG',0),
-(1681686345885249537,'捕获_1689780243510.PNG','E:\Documents\Code\OnlineToolService\tmp\捕获_1689780243510.PNG',0),
-(1681686583211552770,'捕获_1689780276699.PNG','E:\Documents\Code\OnlineToolService\tmp\捕获_1689780276699.PNG',0),
-(1681687296054489090,'捕获_1689780309708.PNG','E:\Documents\Code\OnlineToolService\tmp\捕获_1689780309708.PNG',0),
-(1681797247410229250,'捕获_1689806679933.PNG','E:\Documents\Code\OnlineToolService\tmp\捕获_1689806679933.PNG',0),
-(1681801846351253505,'捕获_1689807752331.PNG','E:\Documents\Code\OnlineToolService\tmp\捕获_1689807752331.PNG',0),
-(1681801945399742466,'捕获_1689807791897.PNG','E:\Documents\Code\OnlineToolService\tmp\捕获_1689807791897.PNG',0);

+ 3 - 5
src/main/resources/db/schema-h2.sql

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

+ 1 - 1
src/test/java/com/zhixinghe1/ots/JasyptTest.java

@@ -10,7 +10,7 @@ public class JasyptTest {
     @Test
     public void encode() {
         StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
-        standardPBEStringEncryptor.setPassword("");
+        standardPBEStringEncryptor.setPassword("9sVPl8ZLyOGR88bgyUxA");
         standardPBEStringEncryptor.setAlgorithm("PBEWithMD5AndDES");
         standardPBEStringEncryptor.setSaltGenerator(new RandomSaltGenerator());
         standardPBEStringEncryptor.setIvGenerator(new RandomIvGenerator());