hongjli
2025-05-27 e7868348433a03f7aa61c84462697d93226b5df3
增加密钥接口
已添加7个文件
213 ■■■■■ 文件已修改
src/main/java/com/weiwojc/config/MybatisPlusMetaObjectHandler.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/weiwojc/controller/SecretKeyController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/weiwojc/mapper/SecretKeyMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/weiwojc/model/dto/SecretKeyUpdateDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/weiwojc/model/entity/SecretKey.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/weiwojc/service/SecretKeyService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/weiwojc/service/impl/SecretKeyServiceImpl.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());
    }
}
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());
        }
    }
}
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 æ“ä½œ
    // å¯¹äºŽå•条记录的场景,这些基础操作已经足够
}
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;
}
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;
}
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();
}
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;
    }
}