From 8632dcd28226d578525b2325e585c14c8c528e34 Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 7 Jan 2026 16:17:57 +0800 Subject: [PATCH] =?UTF-8?q?docs(readme):=20=E9=87=8D=E5=86=99=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=96=87=E6=A1=A3=EF=BC=8C=E6=9B=B4=E6=96=B0=E6=8A=80?= =?UTF-8?q?=E6=9C=AF=E6=A0=88=E4=B8=8E=E5=8A=9F=E8=83=BD=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat(character): 新增人设详情接口并优化获取逻辑 --- README.md | 141 +++++++++++++++--- .../keyborad/config/SaTokenConfigure.java | 1 + .../controller/CharacterController.java | 3 +- .../service/KeyboardCharacterService.java | 2 + .../impl/KeyboardCharacterServiceImpl.java | 18 +++ 5 files changed, 141 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 81893ce..8396729 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,123 @@ -# SpringBoot 项目初始模板 +# Keyborad Backend -> Java SpringBoot 项目初始模板,整合了常用框架和示例代码,大家可以在此基础上快速开发自己的项目。 +基于 Spring Boot 3.5.5 的后端服务,集成了 AI 能力、向量搜索、Apple 登录等功能。 -## 模板功能 +## 技术栈 -- Spring Boot 2.7.0(贼新) -- Spring MVC -- MySQL 驱动 -- MyBatis -- MyBatis Plus -- Spring Session Redis 分布式登录 -- Spring AOP -- Apache Commons Lang3 工具类 -- Lombok 注解 -- Swagger + Knife4j 接口文档 -- Spring Boot 调试工具和项目处理器 -- 全局请求响应拦截器(记录日志) -- 全局异常处理器 -- 自定义错误码 -- 封装通用响应类 -- 示例用户注册、登录、搜索功能 -- 示例单元测试类 -- 示例 SQL(用户表) +- **Java 17** + **Spring Boot 3.5.5** +- **Spring AI** - LLM 对话和文本嵌入(OpenAI 兼容 API) +- **Qdrant** - 向量数据库,支持语义搜索 +- **PostgreSQL** - 关系型数据库 +- **MyBatis Plus** - ORM 框架 +- **Redis** - 会话存储和缓存 +- **Sa-Token** - 认证授权框架 +- **Knife4j** - API 文档 +- **X-File-Storage** - 文件上传(Cloudflare R2) +- **MailerSend** - 邮件服务 -访问 localhost:7529/api/doc.html 就能在线调试接口了,不需要前端配合啦~ \ No newline at end of file +## 核心功能 + +### 认证系统 +- Apple Sign-In JWT 验证 +- Sa-Token 会话管理 +- 请求签名校验(防篡改/防重放) + +### AI 能力 +- LLM 对话(支持流式响应) +- 文本嵌入(1536 维向量) +- 语义搜索(Qdrant 向量检索) + +### 通用功能 +- 统一响应格式 +- 全局异常处理 +- 国际化支持(i18n) +- 请求日志记录 + +## 快速开始 + +### 环境要求 + +- JDK 17+ +- Maven 3.8+ +- PostgreSQL 14+ +- Redis 6+ + +### 本地运行 + +1. 克隆项目 +```bash +git clone +cd keyborad-backend +``` + +2. 配置数据库和 Redis +```yaml +# 修改 src/main/resources/application-dev.yml +spring: + datasource: + url: jdbc:postgresql://localhost:5432/keyborad_db + username: your_username + password: your_password + redis: + host: localhost + port: 6379 +``` + +3. 启动应用 +```bash +mvn spring-boot:run +``` + +4. 访问 API 文档 +``` +http://localhost:7529/api/doc.html +``` + +## 项目结构 + +``` +src/main/java/com/yolo/keyborad/ +├── controller/ # REST API 端点 +├── service/ # 业务逻辑层 +│ └── impl/ # 服务实现 +├── mapper/ # MyBatis 数据库映射 +├── model/ +│ ├── entity/ # 数据库实体 +│ ├── dto/ # 请求数据传输对象 +│ └── vo/ # 响应视图对象 +├── config/ # Spring 配置类 +├── aop/ # AOP 拦截器 +├── Interceptor/ # 请求拦截器 +├── filter/ # Servlet 过滤器 +├── exception/ # 异常处理 +├── common/ # 通用工具类 +└── utils/ # 工具类 +``` + +## 配置说明 + +| 配置项 | 说明 | 默认值 | +|-------|------|-------| +| `server.port` | 服务端口 | 7529 | +| `server.servlet.context-path` | 上下文路径 | /api | +| `spring.profiles.active` | 激活配置文件 | dev | + +## API 认证 + +### Sa-Token 认证 +需要在请求头中携带 `satoken` 字段。 + +### 请求签名 +部分接口需要签名校验,请求头需包含: +- `X-App-Id` - 应用 ID +- `X-Timestamp` - 时间戳 +- `X-Nonce` - 随机数 +- `X-Sign` - 签名 + +## 开发指南 + +详细的开发指南请参考 [CLAUDE.md](./CLAUDE.md)。 + +## License + +MIT License diff --git a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java index 6eae121..5aad99c 100644 --- a/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java +++ b/src/main/java/com/yolo/keyborad/config/SaTokenConfigure.java @@ -73,6 +73,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { "/character/listByUser", "/user/detail", "/user/register", + "/user/updateInfo", "/character/updateUserCharacterSort", "/character/delUserCharacter", "/user/sendVerifyMail", diff --git a/src/main/java/com/yolo/keyborad/controller/CharacterController.java b/src/main/java/com/yolo/keyborad/controller/CharacterController.java index 6066016..483b918 100644 --- a/src/main/java/com/yolo/keyborad/controller/CharacterController.java +++ b/src/main/java/com/yolo/keyborad/controller/CharacterController.java @@ -49,8 +49,7 @@ public class CharacterController { @GetMapping("/detail") @Operation(summary = "人设详情", description = "人设详情接口") public BaseResponse detail(@RequestParam("id") Long id) { - KeyboardCharacter character = characterService.getById(id); - return ResultUtils.success(BeanUtil.copyProperties(character, KeyboardCharacterRespVO.class)); + return ResultUtils.success(characterService.getDetailById(id)); } @GetMapping("/listByTag") diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java b/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java index 9e8f93e..489f5c2 100644 --- a/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java +++ b/src/main/java/com/yolo/keyborad/service/KeyboardCharacterService.java @@ -35,4 +35,6 @@ public interface KeyboardCharacterService extends IService{ List selectListByTagWithNotLogin(Long tagId); void addDefaultUserCharacter(Long userId); + + KeyboardCharacterRespVO getDetailById(Long id); } diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java index 2bbd166..cad3a18 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java @@ -288,4 +288,22 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl() + .eq(KeyboardUserCharacter::getCharacterId, id) + .eq(KeyboardUserCharacter::getUserId, userId)); + // 设置是否已添加的标记 + respVO.setAdded(userCharacter != null); + return respVO; + } }