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