From e7868348433a03f7aa61c84462697d93226b5df3 Mon Sep 17 00:00:00 2001 From: hongjli <3117313295@qq.com> Date: 星期二, 27 五月 2025 09:40:22 +0800 Subject: [PATCH] 增加密钥接口 --- src/main/java/com/weiwojc/service/SecretKeyService.java | 21 +++++ src/main/java/com/weiwojc/controller/SecretKeyController.java | 37 +++++++++ src/main/java/com/weiwojc/model/dto/SecretKeyUpdateDTO.java | 16 ++++ src/main/java/com/weiwojc/model/entity/SecretKey.java | 21 +++++ src/main/java/com/weiwojc/service/impl/SecretKeyServiceImpl.java | 85 +++++++++++++++++++++ src/main/java/com/weiwojc/mapper/SecretKeyMapper.java | 11 ++ src/main/java/com/weiwojc/config/MybatisPlusMetaObjectHandler.java | 22 +++++ 7 files changed, 213 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/weiwojc/config/MybatisPlusMetaObjectHandler.java b/src/main/java/com/weiwojc/config/MybatisPlusMetaObjectHandler.java new file mode 100644 index 0000000..d6e3e11 --- /dev/null +++ b/src/main/java/com/weiwojc/config/MybatisPlusMetaObjectHandler.java @@ -0,0 +1,22 @@ +package com.weiwojc.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +public class MybatisPlusMetaObjectHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + this.strictInsertFill(metaObject, "createdAt", LocalDateTime.class, LocalDateTime.now()); + this.strictInsertFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now()); + } + + @Override + public void updateFill(MetaObject metaObject) { + this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now()); + } +} \ No newline at end of file diff --git a/src/main/java/com/weiwojc/controller/SecretKeyController.java b/src/main/java/com/weiwojc/controller/SecretKeyController.java new file mode 100644 index 0000000..97320bc --- /dev/null +++ b/src/main/java/com/weiwojc/controller/SecretKeyController.java @@ -0,0 +1,37 @@ +package com.weiwojc.controller; + +import com.weiwojc.model.common.Result; +import com.weiwojc.model.entity.SecretKey; +import com.weiwojc.service.SecretKeyService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/secret-key") +@RequiredArgsConstructor +public class SecretKeyController { + + private final SecretKeyService secretKeyService; + + /** + * 鑾峰彇褰撳墠瀵嗛挜 + */ + @GetMapping + public Result<SecretKey> getCurrentSecretKey() { + SecretKey secretKey = secretKeyService.getCurrentSecretKey(); + return Result.success(secretKey); + } + + /** + * 鏇存柊瀵嗛挜 + */ + @GetMapping("/update/{key}") + public Result<SecretKey> updateSecretKey(@PathVariable String key) { + try { + SecretKey secretKey = secretKeyService.updateSecretKey(key); + return Result.success("瀵嗛挜鏇存柊鎴愬姛", secretKey); + } catch (RuntimeException e) { + return Result.badRequest(e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/weiwojc/mapper/SecretKeyMapper.java b/src/main/java/com/weiwojc/mapper/SecretKeyMapper.java new file mode 100644 index 0000000..89d50e2 --- /dev/null +++ b/src/main/java/com/weiwojc/mapper/SecretKeyMapper.java @@ -0,0 +1,11 @@ +package com.weiwojc.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.weiwojc.model.entity.SecretKey; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SecretKeyMapper extends BaseMapper<SecretKey> { + // 缁ф壙 BaseMapper 宸茬粡鎻愪緵浜嗗熀纭�鐨� CRUD 鎿嶄綔 + // 瀵逛簬鍗曟潯璁板綍鐨勫満鏅紝杩欎簺鍩虹鎿嶄綔宸茬粡瓒冲 +} \ No newline at end of file diff --git a/src/main/java/com/weiwojc/model/dto/SecretKeyUpdateDTO.java b/src/main/java/com/weiwojc/model/dto/SecretKeyUpdateDTO.java new file mode 100644 index 0000000..e37009f --- /dev/null +++ b/src/main/java/com/weiwojc/model/dto/SecretKeyUpdateDTO.java @@ -0,0 +1,16 @@ +package com.weiwojc.model.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; + +@Data +public class SecretKeyUpdateDTO { + @NotBlank(message = "鍘熷瘑閽ヤ笉鑳戒负绌�") + @Size(max = 255, message = "鍘熷瘑閽ラ暱搴︿笉鑳借秴杩�255涓瓧绗�") + private String oldKey; + + @NotBlank(message = "鏂板瘑閽ヤ笉鑳戒负绌�") + @Size(max = 255, message = "鏂板瘑閽ラ暱搴︿笉鑳借秴杩�255涓瓧绗�") + private String newKey; +} \ No newline at end of file diff --git a/src/main/java/com/weiwojc/model/entity/SecretKey.java b/src/main/java/com/weiwojc/model/entity/SecretKey.java new file mode 100644 index 0000000..6c93e3e --- /dev/null +++ b/src/main/java/com/weiwojc/model/entity/SecretKey.java @@ -0,0 +1,21 @@ +package com.weiwojc.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import java.time.LocalDateTime; + +@Data +@TableName("secret_key") +public class SecretKey { + @TableId(value = "`key`", type = IdType.INPUT) + private String key; + + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createdAt; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updatedAt; + + @TableLogic + private Boolean isDeleted; +} \ No newline at end of file diff --git a/src/main/java/com/weiwojc/service/SecretKeyService.java b/src/main/java/com/weiwojc/service/SecretKeyService.java new file mode 100644 index 0000000..a94344a --- /dev/null +++ b/src/main/java/com/weiwojc/service/SecretKeyService.java @@ -0,0 +1,21 @@ +package com.weiwojc.service; + +import com.weiwojc.model.entity.SecretKey; + +public interface SecretKeyService { + + /** + * 鑾峰彇褰撳墠瀵嗛挜锛堣〃涓敮涓�鐨勪竴鏉¤褰曪級 + */ + SecretKey getCurrentSecretKey(); + + /** + * 鏇存柊瀵嗛挜 + */ + SecretKey updateSecretKey(String newKey); + + /** + * 鍒濆鍖栧瘑閽ワ紙濡傛灉涓嶅瓨鍦ㄥ垯鍒涘缓榛樿瀵嗛挜锛� + */ + SecretKey initializeSecretKey(); +} \ No newline at end of file diff --git a/src/main/java/com/weiwojc/service/impl/SecretKeyServiceImpl.java b/src/main/java/com/weiwojc/service/impl/SecretKeyServiceImpl.java new file mode 100644 index 0000000..ca3a492 --- /dev/null +++ b/src/main/java/com/weiwojc/service/impl/SecretKeyServiceImpl.java @@ -0,0 +1,85 @@ +package com.weiwojc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.weiwojc.mapper.SecretKeyMapper; +import com.weiwojc.model.entity.SecretKey; +import com.weiwojc.service.SecretKeyService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class SecretKeyServiceImpl implements SecretKeyService { + + private final SecretKeyMapper secretKeyMapper; + + @Override + public SecretKey getCurrentSecretKey() { + LambdaQueryWrapper<SecretKey> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SecretKey::getIsDeleted, false) + .last("LIMIT 1"); + + SecretKey secretKey = secretKeyMapper.selectOne(queryWrapper); + + // 濡傛灉娌℃湁鎵惧埌瀵嗛挜锛岃嚜鍔ㄥ垵濮嬪寲涓�涓� + if (secretKey == null) { + return initializeSecretKey(); + } + + return secretKey; + } + + @Override + @Transactional + public SecretKey updateSecretKey(String newKey) { + if (newKey == null || newKey.trim().isEmpty()) { + throw new RuntimeException("鏂板瘑閽ヤ笉鑳戒负绌�"); + } + + SecretKey currentKey = getCurrentSecretKey(); + + // 濡傛灉鏂板瘑閽ヤ笌褰撳墠瀵嗛挜鐩稿悓锛岀洿鎺ヨ繑鍥� + if (currentKey.getKey().equals(newKey.trim())) { + return currentKey; + } + + // 鍏堝垹闄ゅ綋鍓嶅瘑閽ワ紙閫昏緫鍒犻櫎锛� + currentKey.setIsDeleted(true); + secretKeyMapper.updateById(currentKey); + + // 鍒涘缓鏂板瘑閽� + SecretKey newSecretKey = new SecretKey(); + newSecretKey.setKey(newKey.trim()); + newSecretKey.setIsDeleted(false); + + secretKeyMapper.insert(newSecretKey); + return newSecretKey; + } + + @Override + @Transactional + public SecretKey initializeSecretKey() { + // 妫�鏌ユ槸鍚﹀凡瀛樺湪瀵嗛挜 + LambdaQueryWrapper<SecretKey> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SecretKey::getIsDeleted, false); + + List<SecretKey> existingKeys = secretKeyMapper.selectList(queryWrapper); + if (!existingKeys.isEmpty()) { + return existingKeys.get(0); + } + + // 鐢熸垚榛樿瀵嗛挜 + String defaultKey = "default-secret-key-" + UUID.randomUUID().toString().substring(0, 8); + + SecretKey secretKey = new SecretKey(); + secretKey.setKey(defaultKey); + secretKey.setIsDeleted(false); + + secretKeyMapper.insert(secretKey); + return secretKey; + } +} \ No newline at end of file -- Gitblit v1.9.3