From 16dccb1f00d100003f84a56d1d7437fef70b1f3b Mon Sep 17 00:00:00 2001 From: heiferleaf <2044384845@qq.com> Date: Tue, 3 Jun 2025 00:29:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=80=E6=9C=89=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=90=8E=E7=AB=AF=E5=AE=9E=E7=8E=B0=5Fyhf6/3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debate_backend/README.md | 531 ++++++++++++++---- .../newdemo/Dto/ArgumentDetailDTO.java | 23 + .../learning/newdemo/Dto/ConversationDTO.java | 23 + .../learning/newdemo/Dto/DebateDetailDTO.java | 23 + .../learning/newdemo/Dto/ReviewDetailDTO.java | 23 + .../newdemo/controller/WxAIController.java | 29 +- .../controller/WxConversationController.java | 103 ++++ .../learning/newdemo/entity/WxArgument.java | 25 + .../newdemo/entity/WxConversation.java | 16 + .../com/learning/newdemo/entity/WxDebate.java | 15 + .../com/learning/newdemo/entity/WxReview.java | 15 + .../newdemo/mapper/WxArgumentMapper.java | 12 + .../newdemo/mapper/WxConversationMapper.java | 13 + .../newdemo/mapper/WxDebateMapper.java | 12 + .../newdemo/mapper/WxReviewMapper.java | 12 + .../newdemo/service/WxArgumentService.java | 1 + .../newdemo/service/WxDebateService.java | 1 + .../newdemo/service/WxReviewService.java | 1 + .../newdemo/service/WxUserService.java | 64 +-- .../service/impl/WxArgumentServiceImpl.java | 55 +- .../service/impl/WxDebateServiceImpl.java | 42 +- .../service/impl/WxReviewServiceImpl.java | 42 +- .../service/impl/WxUserServiceImpl.java | 8 +- .../com/learning/newdemo/util/JwtUtil.java | 232 ++++---- .../src/main/resources/application.yml | 2 +- .../src/main/resources/db/wx_miniapp.sql | 22 - .../resources/mapper/WxArgumentMapper.xml | 45 ++ .../resources/mapper/WxConversationMapper.xml | 49 ++ .../main/resources/mapper/WxDebateMapper.xml | 38 ++ .../main/resources/mapper/WxReviewMapper.xml | 38 ++ Debate_backend/target/classes/application.yml | 2 +- .../newdemo/Dto/ArgumentDetailDTO.class | Bin 0 -> 4058 bytes .../newdemo/Dto/ConversationDTO.class | Bin 0 -> 3983 bytes .../newdemo/Dto/DebateDetailDTO.class | Bin 0 -> 4101 bytes .../newdemo/Dto/ReviewDetailDTO.class | Bin 0 -> 4101 bytes .../newdemo/controller/WxAIController.class | Bin 4839 -> 5712 bytes .../controller/WxConversationController.class | Bin 0 -> 7792 bytes .../learning/newdemo/entity/WxArgument.class | Bin 0 -> 5014 bytes .../newdemo/entity/WxConversation.class | Bin 0 -> 4439 bytes .../learning/newdemo/entity/WxDebate.class | Bin 0 -> 4329 bytes .../learning/newdemo/entity/WxReview.class | Bin 0 -> 4329 bytes .../newdemo/mapper/WxArgumentMapper.class | Bin 0 -> 495 bytes .../newdemo/mapper/WxConversationMapper.class | Bin 0 -> 641 bytes .../newdemo/mapper/WxDebateMapper.class | Bin 0 -> 515 bytes .../newdemo/mapper/WxReviewMapper.class | Bin 0 -> 515 bytes .../newdemo/service/WxArgumentService.class | Bin 276 -> 493 bytes .../newdemo/service/WxDebateService.class | Bin 277 -> 434 bytes .../newdemo/service/WxReviewService.class | Bin 241 -> 402 bytes .../newdemo/service/WxUserService.class | Bin 418 -> 383 bytes .../service/impl/WxArgumentServiceImpl.class | Bin 5599 -> 8161 bytes .../service/impl/WxDebateServiceImpl.class | Bin 6142 -> 8456 bytes .../service/impl/WxReviewServiceImpl.class | Bin 5452 -> 7727 bytes .../service/impl/WxUserServiceImpl.class | Bin 4659 -> 4783 bytes .../com/learning/newdemo/util/JwtUtil.class | Bin 4084 -> 5046 bytes .../target/classes/db/wx_miniapp.sql | 22 - .../classes/mapper/WxArgumentMapper.xml | 45 ++ .../classes/mapper/WxConversationMapper.xml | 49 ++ .../target/classes/mapper/WxDebateMapper.xml | 38 ++ .../target/classes/mapper/WxReviewMapper.xml | 38 ++ database/database.sql | 19 - 60 files changed, 1395 insertions(+), 333 deletions(-) create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/Dto/ArgumentDetailDTO.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/Dto/ConversationDTO.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/Dto/DebateDetailDTO.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/Dto/ReviewDetailDTO.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/controller/WxConversationController.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/entity/WxArgument.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/entity/WxConversation.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/entity/WxDebate.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/entity/WxReview.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/mapper/WxArgumentMapper.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/mapper/WxConversationMapper.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/mapper/WxDebateMapper.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/mapper/WxReviewMapper.java delete mode 100644 Debate_backend/src/main/resources/db/wx_miniapp.sql create mode 100644 Debate_backend/src/main/resources/mapper/WxArgumentMapper.xml create mode 100644 Debate_backend/src/main/resources/mapper/WxConversationMapper.xml create mode 100644 Debate_backend/src/main/resources/mapper/WxDebateMapper.xml create mode 100644 Debate_backend/src/main/resources/mapper/WxReviewMapper.xml create mode 100644 Debate_backend/target/classes/com/learning/newdemo/Dto/ArgumentDetailDTO.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/Dto/ConversationDTO.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/Dto/DebateDetailDTO.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/Dto/ReviewDetailDTO.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/controller/WxConversationController.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/entity/WxArgument.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/entity/WxConversation.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/entity/WxDebate.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/entity/WxReview.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/mapper/WxArgumentMapper.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/mapper/WxConversationMapper.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/mapper/WxDebateMapper.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/mapper/WxReviewMapper.class delete mode 100644 Debate_backend/target/classes/db/wx_miniapp.sql create mode 100644 Debate_backend/target/classes/mapper/WxArgumentMapper.xml create mode 100644 Debate_backend/target/classes/mapper/WxConversationMapper.xml create mode 100644 Debate_backend/target/classes/mapper/WxDebateMapper.xml create mode 100644 Debate_backend/target/classes/mapper/WxReviewMapper.xml delete mode 100644 database/database.sql diff --git a/Debate_backend/README.md b/Debate_backend/README.md index ad86e2f..855f768 100644 --- a/Debate_backend/README.md +++ b/Debate_backend/README.md @@ -1,106 +1,425 @@ -# 微信小程序登录Demo后端 - -## 项目介绍 -本项目是一个微信小程序登录的后端Demo,实现了微信小程序登录、获取用户信息等功能。 - -## 技术栈 -- Spring Boot 3.0.12 -- MyBatis 3.0.1 -- MySQL 8.0 -- JWT - -## 项目结构 -``` -src/main/java/com/learning/newdemo -├── config // 配置类 -├── controller // 控制器 -├── entity // 实体类 -├── mapper // 数据访问层 -├── service // 服务层 -│ └── impl // 服务实现 -├── util // 工具类 -└── common // 通用类 -``` - -## 运行环境 -- JDK 17+ -- MySQL 8.0+ -- Maven 3.6+ - -## 数据库配置 -1. 创建数据库和表 -```sql -# 执行src/main/resources/db/wx_miniapp.sql脚本 -``` - -2. 修改数据库连接信息(`application.yml`) -```yaml -spring: - datasource: - url: jdbc:mysql://localhost:3306/wx_miniapp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai - username: root - password: 1234 -``` - -## 微信小程序配置 -修改`application.yml`中的微信小程序配置: -```yaml -wechat: - miniapp: - appid: 你的小程序APPID - secret: 你的小程序SECRET -``` - -## 启动项目 -```bash -mvn spring-boot:run -``` - -## 接口说明 -### 1. 登录接口 -- URL: `/api/wx/login` -- Method: POST -- Body: -```json -{ - "code": "微信临时登录凭证" -} -``` -- Response: -```json -{ - "success": true, - "code": 200, - "message": "操作成功", - "data": { - "token": "JWT令牌" - } -} -``` - -### 2. 获取用户信息接口 -- URL: `/api/wx/user` -- Method: GET -- Headers: -``` -Authorization: 登录接口返回的token -``` -- Response: -```json -{ - "success": true, - "code": 200, - "message": "操作成功", - "data": { - "id": 1, - "openid": "用户openid", - "nickname": "用户昵称", - "avatarUrl": "头像URL", - "gender": 1, - "country": "国家", - "province": "省份", - "city": "城市", - "language": "语言" - } -} -``` \ No newline at end of file + + + + +# 微信小程序辩论助手后端 + +## 项目介绍 +本项目是一个微信小程序辩论助手的后端服务,实现了微信小程序登录、获取用户信息、AI辅助立论、复盘分析、模拟辩论等功能,并支持历史记录的保存与查询。 + +## 技术栈 +- Spring Boot 3.0.12 +- MyBatis 3.0.1 +- MySQL 8.0 +- JWT +- RestTemplate (AI接口调用) + +## 项目结构 +``` +src/main/java/com/learning/newdemo +├── config // 配置类 +├── controller // 控制器 +├── entity // 实体类 +├── mapper // 数据访问层 +├── service // 服务层 +│ └── impl // 服务实现 +├── util // 工具类 +└── common // 通用类 +``` + +## 运行环境 +- JDK 17+ +- MySQL 8.0+ +- Maven 3.6+ + +## 数据库配置 +1. 创建数据库和表 +```sql +# 执行src/main/resources/db/wx_miniapp.sql脚本 + +# 用户表 +CREATE TABLE `wx_user` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `openid` varchar(100) NOT NULL COMMENT '微信openid', + `nickname` varchar(50) DEFAULT NULL COMMENT '昵称', + `avatar_url` varchar(255) DEFAULT NULL COMMENT '头像', + `gender` tinyint DEFAULT NULL COMMENT '性别 0-未知 1-男 2-女', + `country` varchar(50) DEFAULT NULL COMMENT '国家', + `province` varchar(50) DEFAULT NULL COMMENT '省份', + `city` varchar(50) DEFAULT NULL COMMENT '城市', + `language` varchar(50) DEFAULT NULL COMMENT '语言', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_openid` (`openid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信用户表'; + +# 对话活动表 +CREATE TABLE `wx_conversation` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `user_id` bigint NOT NULL COMMENT '用户ID', + `type` varchar(20) NOT NULL COMMENT '对话类型(debate/argument/review)', + `title` varchar(255) DEFAULT NULL COMMENT '对话标题', + `preview` varchar(255) DEFAULT NULL COMMENT '预览内容(最后一次AI回复的前10个字符)', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对话活动表'; + +# 辩论历史记录表 +CREATE TABLE `wx_debate_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `conversation_id` bigint NOT NULL COMMENT '对话活动ID', + `content` text COMMENT 'AI回复内容', + `user_message` text COMMENT '用户消息', + `sequence` int NOT NULL COMMENT '消息序号', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_conversation_id` (`conversation_id`), + KEY `idx_sequence` (`sequence`), + CONSTRAINT `fk_debate_conversation` FOREIGN KEY (`conversation_id`) REFERENCES `wx_conversation` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='辩论历史记录表'; + +# 立论历史记录表 +CREATE TABLE `wx_argument_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `conversation_id` bigint NOT NULL COMMENT '对话活动ID', + `topic` varchar(255) DEFAULT NULL COMMENT '辩题', + `stance` varchar(50) DEFAULT NULL COMMENT '立场', + `content` text COMMENT 'AI回复内容', + `user_message` text COMMENT '用户消息', + `sequence` int NOT NULL COMMENT '消息序号', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_conversation_id` (`conversation_id`), + KEY `idx_sequence` (`sequence`), + CONSTRAINT `fk_argument_conversation` FOREIGN KEY (`conversation_id`) REFERENCES `wx_conversation` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='立论历史记录表'; + +# 复盘历史记录表 +CREATE TABLE `wx_review_record` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键', + `conversation_id` bigint NOT NULL COMMENT '对话活动ID', + `content` text COMMENT 'AI回复内容', + `user_message` text COMMENT '用户消息', + `sequence` int NOT NULL COMMENT '消息序号', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_conversation_id` (`conversation_id`), + KEY `idx_sequence` (`sequence`), + CONSTRAINT `fk_review_conversation` FOREIGN KEY (`conversation_id`) REFERENCES `wx_conversation` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='复盘历史记录表'; +``` + +2. 修改数据库连接信息(`application.yml`) +```yaml +spring: + datasource: + url: jdbc:mysql://localhost:3306/wx_miniapp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + username: root + password: 1234 +``` + +## 微信小程序配置 +修改`application.yml`中的微信小程序配置: +```yaml +wechat: + miniapp: + appid: 你的小程序APPID + secret: 你的小程序SECRET +``` + +## AI接口配置 +修改`application.yml`中的AI接口配置: +```yaml +ai: + api: + url: AI接口地址 + key: API密钥(如果需要) +``` + +## 启动项目 +```bash +mvn spring-boot:run +``` + +## 接口说明 + +### 1. 登录接口 +- URL: `/api/wx/login` +- Method: POST +- Body: +```json +{ + "code": "微信临时登录凭证" +} +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + "token": "JWT令牌" + } +} +``` + +### 2. 获取用户信息接口 +- URL: `/api/wx/user` +- Method: GET +- Headers: +``` +Authorization: 登录接口返回的token +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + "id": 1, + "openid": "用户openid", + "nickname": "用户昵称", + "avatarUrl": "头像URL", + "gender": 1, + "country": "国家", + "province": "省份", + "city": "城市", + "language": "语言" + } +} +``` + +### 3. AI接口 + +#### 3.1 立论接口 +- URL: `/api/ai/argument` +- Method: POST +- Headers: +``` +Authorization: 登录接口返回的token +``` +- Body: +```json +{ + "conversationId": "对话活动ID(可选,有则更新,无则新建)", + "topic": "辩题", + "stance": "立场(正方/反方)" +} +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + "content": "AI生成的立论内容", + "conversationId": "对话活动ID" + } +} +``` +- 调用时机:用户在立论助手页面输入辩题和选择立场后,点击发送按钮时调用 +- 数据库操作: + - 如果没有conversationId,则在wx_conversation表中新建一条记录,type为"argument",并返回新建的conversationId + - 在wx_argument_record表中插入一条记录,包含用户消息和AI回复内容 + - 更新wx_conversation表中对应记录的preview字段(取AI回复内容前10个字符) + +#### 3.2 复盘接口 +- URL: `/api/ai/review` +- Method: POST +- Headers: +``` +Authorization: 登录接口返回的token +``` +- Body: +```json +{ + "conversationId": "对话活动ID(可选,有则更新,无则新建)", + "content": "用户输入的辩论内容或复盘需求" +} +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + "content": "AI生成的复盘分析内容", + "conversationId": "对话活动ID" + } +} +``` +- 调用时机:用户在复盘分析页面输入辩论内容或复盘需求后,点击发送按钮时调用 +- 数据库操作: + - 如果没有conversationId,则在wx_conversation表中新建一条记录,type为"review",并返回新建的conversationId + - 在wx_review_record表中插入一条记录,包含用户消息和AI回复内容 + - 更新wx_conversation表中对应记录的preview字段(取AI回复内容前10个字符) + +#### 3.3 辩论接口 +- URL: `/api/ai/debate` +- Method: POST +- Headers: +``` +Authorization: 登录接口返回的token +``` +- Body: +```json +{ + "conversationId": "对话活动ID(可选,有则更新,无则新建)", + "userMessage": "用户当前输入的消息" +} +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + "content": "AI生成的辩论回复内容", + "conversationId": "对话活动ID" + } +} +``` +- 调用时机:用户在模拟辩论页面输入消息后,点击发送按钮时调用 +- 数据库操作: + - 如果没有conversationId,则在wx_conversation表中新建一条记录,type为"debate",并返回新建的conversationId + - 在wx_debate_record表中插入一条记录,包含用户消息和AI回复内容 + - 更新wx_conversation表中对应记录的preview字段(取AI回复内容前10个字符) + +### 4. 历史记录接口 + +#### 4.1 获取对话活动列表 +- URL: `/api/conversation/list` +- Method: GET +- Headers: +``` +Authorization: 登录接口返回的token +``` + +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": [ + { + "id": 1, + "type": "debate", + "title": "对话标题", + "preview": "AI回复的前10个字符", + "createTime": "2023-01-01 12:00:00" + } + ] +} +``` +- 调用时机:用户进入历史记录列表页面时调用,根据当前所在模块传入不同的type参数 +- 数据库操作:查询当前用户在wx_conversation表中指定type的所有记录,按创建时间倒序排列 + +#### 4.2 获取辩论历史记录详情 +- URL: `/api/conversation/debate/{conversationId}` +- Method: GET +- Headers: +``` +Authorization: 登录接口返回的token +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + "conversation": { + "id": 1, + "type": "debate", + "title": "对话标题", + "createTime": "2023-01-01 12:00:00" + }, + "records": [ + { + "id": 1, + "userMessage": "用户消息", + "content": "AI回复内容", + "sequence": 1, + "createTime": "2023-01-01 12:00:00" + } + ] + } +} +``` +- 调用时机:用户点击辩论历史记录列表中的某一项时调用 +- 数据库操作: + - 查询wx_conversation表中指定id的记录 + - 查询wx_debate_record表中conversation_id等于指定id的所有记录,按sequence排序 + +#### 4.3 获取立论历史记录详情 +- URL: `/api/conversation/argument/{conversationId}` +- Method: GET +- Headers: +``` +Authorization: 登录接口返回的token +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + [ + { + "id": 1, + "userMessage": "用户消息", + "content": "AI回复内容", + "sequence": 1, + "createTime": "2023-01-01 12:00:00" + } + ] + } +} +``` +- 调用时机:用户点击立论历史记录列表中的某一项时调用 +- 数据库操作: + - 查询wx_conversation表中指定id的记录 + - 查询wx_argument_record表中conversation_id等于指定id的所有记录,按sequence排序 + +#### 4.4 获取复盘历史记录详情 +- URL: `/api/conversation/review/{conversationId}` +- Method: GET +- Headers: +``` +Authorization: 登录接口返回的token +``` +- Response: +```json +{ + "success": true, + "code": 200, + "message": "操作成功", + "data": { + [ + { + "id": 1, + "userMessage": "用户消息", + "content": "AI回复内容", + "sequence": 1, + "createTime": "2023-01-01 12:00:00" + } + ] + } +} +``` +- 调用时机:用户点击复盘历史记录列表中的某一项时调用 +- 数据库操作: + - 查询wx_conversation表中指定id的记录 + - 查询wx_review_record表中conversation_id等于指定id的所有记录,按sequence排序 + \ No newline at end of file diff --git a/Debate_backend/src/main/java/com/learning/newdemo/Dto/ArgumentDetailDTO.java b/Debate_backend/src/main/java/com/learning/newdemo/Dto/ArgumentDetailDTO.java new file mode 100644 index 0000000..789df1b --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/Dto/ArgumentDetailDTO.java @@ -0,0 +1,23 @@ +package com.learning.newdemo.Dto; + +import com.learning.newdemo.entity.WxArgument; +import lombok.Data; + +import java.util.Date; + +@Data +public class ArgumentDetailDTO { + private Integer id; + private String userMessage; + private String content; + private Integer sequence; + private Date createTime; + + public ArgumentDetailDTO(WxArgument wxArgument) { + this.id = wxArgument.getId(); + this.userMessage = wxArgument.getUserMessage(); + this.content = wxArgument.getContent(); + this.sequence = wxArgument.getSequence(); + this.createTime = wxArgument.getCreateTime(); + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/Dto/ConversationDTO.java b/Debate_backend/src/main/java/com/learning/newdemo/Dto/ConversationDTO.java new file mode 100644 index 0000000..b81573a --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/Dto/ConversationDTO.java @@ -0,0 +1,23 @@ +package com.learning.newdemo.Dto; + +import com.learning.newdemo.entity.WxConversation; +import lombok.Data; + +import java.util.Date; + +@Data +public class ConversationDTO { + private Long id; + private String type; // "debate"/"argument"/"review" + private String title; + private String preview; // AI回复的前10个字符 + private Date updateTime; + + public ConversationDTO(WxConversation wxConversation) { + this.id = wxConversation.getId(); + this.type = wxConversation.getType(); + this.title = wxConversation.getTitle(); + this.preview = wxConversation.getPreview(); + this.updateTime = wxConversation.getUpdateTime(); + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/Dto/DebateDetailDTO.java b/Debate_backend/src/main/java/com/learning/newdemo/Dto/DebateDetailDTO.java new file mode 100644 index 0000000..1773eeb --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/Dto/DebateDetailDTO.java @@ -0,0 +1,23 @@ +package com.learning.newdemo.Dto; + +import com.learning.newdemo.entity.WxDebate; +import lombok.Data; + +import java.util.Date; + +@Data +public class DebateDetailDTO { + private Long id; + private String userMessage; + private String content; + private Integer sequence; + private Date createTime; + + public DebateDetailDTO(WxDebate wxDebate) { + this.id = wxDebate.getId(); + this.userMessage = wxDebate.getUserMessage(); + this.content = wxDebate.getContent(); + this.sequence = wxDebate.getSequence(); + this.createTime = wxDebate.getCreateTime(); + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/Dto/ReviewDetailDTO.java b/Debate_backend/src/main/java/com/learning/newdemo/Dto/ReviewDetailDTO.java new file mode 100644 index 0000000..6e841a6 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/Dto/ReviewDetailDTO.java @@ -0,0 +1,23 @@ +package com.learning.newdemo.Dto; + +import com.learning.newdemo.entity.WxReview; +import lombok.Data; + +import java.util.Date; + +@Data +public class ReviewDetailDTO { + private Long id; + private String userMessage; // 用户消息 + private String content; // AI回复内容 + private Integer sequence; // 消息序号 + private Date createTime; + + public ReviewDetailDTO(WxReview wxReview) { + this.id = wxReview.getId(); + this.userMessage = wxReview.getUserMessage(); + this.content = wxReview.getContent(); + this.sequence = wxReview.getSequence(); + this.createTime = wxReview.getCreateTime(); + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java index 0727827..5966719 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java @@ -7,10 +7,7 @@ import com.learning.newdemo.service.WxDebateService; import com.learning.newdemo.service.WxReviewService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @@ -34,11 +31,13 @@ public class WxAIController { private String content; + private Long conversationId; + @PostMapping("/argument") - public Result> getArgument(@RequestBody Map params){ + public Result> getArgument(@RequestHeader ("Authorization") String token, @RequestBody Map params){ topic = params.get("topic"); stance = params.get("stance"); - + conversationId = Long.parseLong(params.get("conversationId")); if(topic == null || stance == null){ return Result.error("立论主题或者内容为空"); @@ -52,8 +51,11 @@ public class WxAIController { return Result.error("立论获取失败"); } + long relatedConversationId = wxArgumentService.UpdateArgument(conversationId, topic, stance, argument, topic + stance, token); + Map data = new HashMap<>(); - data.put("argument", argument); + data.put("content", argument); + data.put("conversationId", relatedConversationId); // 查看data log.info("立论获取成功:{}", argument); @@ -65,10 +67,11 @@ public class WxAIController { } @PostMapping("/review") - public Result> review(@RequestBody Map params){ + public Result> review(@RequestHeader ("Authorization") String token,@RequestBody Map params){ log.info("请求内容: {}", params); content = params.get("content"); + conversationId = Long.parseLong(params.get("conversationId")); try { String review = wxReviewService.GetReview(content); @@ -76,8 +79,11 @@ public class WxAIController { return Result.error("复盘获取失败"); } + long relatedConversationId = wxReviewService.UpdateReview(conversationId, review, content, token); + Map data = new HashMap<>(); data.put("review", review); + data.put("conversationId", relatedConversationId); // 查看data log.info("复盘获取成功:{}", review); @@ -88,18 +94,23 @@ public class WxAIController { } } @PostMapping("/debate") - public Result> debate(@RequestBody Map params){ + public Result> debate(@RequestHeader ("Authorization") String token, @RequestBody Map params){ log.info("请求内容: {}", params); String history = params.get("history"); String userMessage = params.get("userMessage"); + conversationId = Long.parseLong(params.get("conversationId")); + try { String debate = wxDebateService.GetDebate(history, userMessage); if (debate == null) { return Result.error("辩论获取失败"); } + long relatedConversationId = wxDebateService.UpdateDebate(conversationId, debate, userMessage, token); + Map data = new HashMap<>(); data.put("debate", debate); + data.put("conversationId", relatedConversationId); // 查看data log.info("辩论获取成功:{}", debate); diff --git a/Debate_backend/src/main/java/com/learning/newdemo/controller/WxConversationController.java b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxConversationController.java new file mode 100644 index 0000000..aedd1dc --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxConversationController.java @@ -0,0 +1,103 @@ +package com.learning.newdemo.controller; + + +import com.learning.newdemo.Dto.ArgumentDetailDTO; +import com.learning.newdemo.Dto.ConversationDTO; +import com.learning.newdemo.Dto.DebateDetailDTO; +import com.learning.newdemo.Dto.ReviewDetailDTO; +import com.learning.newdemo.common.Result; +import com.learning.newdemo.entity.WxArgument; +import com.learning.newdemo.entity.WxConversation; +import com.learning.newdemo.entity.WxDebate; +import com.learning.newdemo.entity.WxReview; +import com.learning.newdemo.mapper.WxArgumentMapper; +import com.learning.newdemo.mapper.WxConversationMapper; +import com.learning.newdemo.mapper.WxDebateMapper; +import com.learning.newdemo.mapper.WxReviewMapper; +import com.learning.newdemo.util.JwtUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@RestController +@RequestMapping("api/conversation") +public class WxConversationController { + private final WxConversationMapper wxConversationMapper; + private final WxDebateMapper wxDebateMapper; + private final WxArgumentMapper wxArgumentMapper; + private final WxReviewMapper wxReviewMapper; + private final JwtUtil jwtUtil; + + public WxConversationController(WxConversationMapper wxConversationMapper, WxDebateMapper wxDebateMapper, WxArgumentMapper wxArgumentMapper, WxReviewMapper wxReviewMapper, JwtUtil jwtUtil) { + this.wxConversationMapper = wxConversationMapper; + this.wxDebateMapper = wxDebateMapper; + this.wxArgumentMapper = wxArgumentMapper; + this.wxReviewMapper = wxReviewMapper; + this.jwtUtil = jwtUtil; + } + + @GetMapping("/list") + public Result> getConversationList(@RequestHeader("Authorization") String token){ + try{ + int userId = jwtUtil.getUserIdFromToken(token); + + List conversations = wxConversationMapper.selectByUserId(userId); + + List result = conversations.stream() + .map(conv -> new ConversationDTO( + conv)) + .collect(Collectors.toList()); + + return Result.success(result); + } catch (Exception e){ + log.error("获取对话失败"); + return Result.error("获取对话失败:" + e.getMessage()); + } + } + + @GetMapping( "/debate/{conversation}") + public Result> getDebate(@PathVariable("conversation") Long conversationId) { + try{ + + List wxDebates = wxDebateMapper.selectByConversationId(conversationId); + + List debateDetailDTOS = wxDebates.stream().map(DebateDetailDTO::new).collect(Collectors.toList()); + + return Result.success(debateDetailDTOS); + } catch (Exception e) { + log.error("获取辩论失败", e); + return Result.error("获取辩论失败:" + e.getMessage()); + } + } + + @GetMapping("/argument/{conversationId}") + public Result> getArgument(@PathVariable Long conversationId) { + try { + List wxArguments = wxArgumentMapper.selectByConversationId(conversationId); + + List argumentDetailDTOS = wxArguments.stream().map(ArgumentDetailDTO::new).collect(Collectors.toList()); + + return Result.success(argumentDetailDTOS); + } catch ( Exception e) { + log.error("获取立论失败", e); + return Result.error("获取立论失败:" + e.getMessage()); + } + } + + @GetMapping("/review/{conversationId}") + public Result> getReview(@PathVariable Long conversationId) { + try { + List wxReviews = wxReviewMapper.selectByConversationId(conversationId); + + List reviewDetailDTOS = wxReviews.stream().map(ReviewDetailDTO::new).collect(Collectors.toList()); + + return Result.success(reviewDetailDTOS); + } catch ( Exception e){ + log.error("获取评论失败", e); + return Result.error("获取评论失败:" + e.getMessage()); + } + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/entity/WxArgument.java b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxArgument.java new file mode 100644 index 0000000..4df1de1 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxArgument.java @@ -0,0 +1,25 @@ +package com.learning.newdemo.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class WxArgument { + // 主键 + private Integer id; + // 对话活动Id,外键 + private long conversationId; + // 辩题 + private String topic; + // 立场 + private String stance; + // AI回复内容 + private String content; + // 用户信息 + private String userMessage; + // 消息序号 + private Integer sequence; + // 创建时间 + private Date createTime; +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/entity/WxConversation.java b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxConversation.java new file mode 100644 index 0000000..fbe6bb4 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxConversation.java @@ -0,0 +1,16 @@ +package com.learning.newdemo.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class WxConversation { + private Long id; + private int userId; + private String type; + private String title; + private String preview; + private Date createTime; + private Date updateTime; +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/entity/WxDebate.java b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxDebate.java new file mode 100644 index 0000000..73685bb --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxDebate.java @@ -0,0 +1,15 @@ +package com.learning.newdemo.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class WxDebate { + private Long id; + private Long conversationId; + private String content; + private String userMessage; + private Integer sequence; + private Date createTime; +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/entity/WxReview.java b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxReview.java new file mode 100644 index 0000000..baea771 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/entity/WxReview.java @@ -0,0 +1,15 @@ +package com.learning.newdemo.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class WxReview { + private Long id; + private Long conversationId; // 关联的对话活动ID + private String content; // AI回复内容 + private String userMessage; // 用户消息 + private Integer sequence; // 消息序号 + private Date createTime; +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxArgumentMapper.java b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxArgumentMapper.java new file mode 100644 index 0000000..8454cff --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxArgumentMapper.java @@ -0,0 +1,12 @@ +package com.learning.newdemo.mapper; + +import com.learning.newdemo.entity.WxArgument; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface WxArgumentMapper { + List selectByConversationId(long conversationId); + int insert(WxArgument wxArgument); +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxConversationMapper.java b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxConversationMapper.java new file mode 100644 index 0000000..fbf1fa2 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxConversationMapper.java @@ -0,0 +1,13 @@ +package com.learning.newdemo.mapper; + +import com.learning.newdemo.entity.WxConversation; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface WxConversationMapper { + List selectByUserId(Integer userId); + int insert(WxConversation wxConversation); + int updatePreview(Long conversationId, String preview); +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxDebateMapper.java b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxDebateMapper.java new file mode 100644 index 0000000..632945f --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxDebateMapper.java @@ -0,0 +1,12 @@ +package com.learning.newdemo.mapper; + +import com.learning.newdemo.entity.WxDebate; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface WxDebateMapper { + List selectByConversationId(Long conversationId); + int insert(WxDebate wxDebate); +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxReviewMapper.java b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxReviewMapper.java new file mode 100644 index 0000000..bef9934 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/mapper/WxReviewMapper.java @@ -0,0 +1,12 @@ +package com.learning.newdemo.mapper; + +import com.learning.newdemo.entity.WxReview; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface WxReviewMapper { + List selectByConversationId(Long conversationId); + int insert(WxReview wxReview); +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java b/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java index 3b30f6b..ac0ddf8 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java @@ -6,4 +6,5 @@ package com.learning.newdemo.service; public interface WxArgumentService { String GetArgument(String topic, String stance); + long UpdateArgument(Long conversationId, String topic, String stance, String content, String userMessage, String token); } diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/WxDebateService.java b/Debate_backend/src/main/java/com/learning/newdemo/service/WxDebateService.java index 93bafa4..43362d1 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/WxDebateService.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/WxDebateService.java @@ -2,4 +2,5 @@ package com.learning.newdemo.service; public interface WxDebateService { String GetDebate(String history, String userMessage); + long UpdateDebate(Long conversationId, String content, String userMessage, String token); } diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/WxReviewService.java b/Debate_backend/src/main/java/com/learning/newdemo/service/WxReviewService.java index 38ab33a..c9f47f4 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/WxReviewService.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/WxReviewService.java @@ -2,4 +2,5 @@ package com.learning.newdemo.service; public interface WxReviewService { String GetReview(String content); + long UpdateReview(Long conversationId, String content, String userMessage, String token); } diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/WxUserService.java b/Debate_backend/src/main/java/com/learning/newdemo/service/WxUserService.java index 0ba0f7e..78afce3 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/WxUserService.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/WxUserService.java @@ -1,33 +1,33 @@ -package com.learning.newdemo.service; - -import com.learning.newdemo.entity.WxUser; - -/** - * 微信用户服务接口 - */ -public interface WxUserService { - - /** - * 微信登录 - * - * @param code 微信临时登录凭证 - * @return 成功返回token,失败返回null - */ - String login(String code); - - /** - * 根据openid获取或创建用户 - * - * @param openid 微信用户唯一标识 - * @return 用户信息 - */ - WxUser getUserByOpenid(String openid); - - /** - * 更新用户信息 - * - * @param wxUser 用户信息 - * @return 是否成功 - */ - boolean updateUser(WxUser wxUser); +package com.learning.newdemo.service; + +import com.learning.newdemo.entity.WxUser; + +/** + * 微信用户服务接口 + */ +public interface WxUserService { + + /** + * 微信登录 + * + * @param code 微信临时登录凭证 + * @return 成功返回token,失败返回null + */ + String login(String code); + + /** + * 根据openid获取或创建用户 + * + * @param openid 微信用户唯一标识 + * @return 用户主键Id + */ + int getUserByOpenid(String openid); + + /** + * 更新用户信息 + * + * @param wxUser 用户信息 + * @return 是否成功 + */ + boolean updateUser(WxUser wxUser); } \ No newline at end of file diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java index fb02d54..a5a8e7b 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java @@ -1,6 +1,12 @@ package com.learning.newdemo.service.impl; +import com.learning.newdemo.entity.WxArgument; +import com.learning.newdemo.entity.WxConversation; +import com.learning.newdemo.mapper.WxArgumentMapper; +import com.learning.newdemo.mapper.WxConversationMapper; import com.learning.newdemo.service.WxArgumentService; +import com.learning.newdemo.util.JwtUtil; +import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -11,11 +17,16 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import java.util.Date; + @Service @Slf4j public class WxArgumentServiceImpl implements WxArgumentService { - private final RestTemplate restTemplate; + private final RestTemplate _restTemplate; + private final WxArgumentMapper _wxArgumentMapper; + private final WxConversationMapper _wxConversationMapper; + private final JwtUtil jwtUtil; @Value("${ai.argument.header.Authorization}") private String authorizationHeader; @Value("${ai.argument.body.message.role-sys}") private String roleSys; @@ -33,8 +44,11 @@ public class WxArgumentServiceImpl implements WxArgumentService { @Value("${ai.argument.body.logprobs}") private boolean logprobs; @Value("${ai.argument.url}") private String url; - public WxArgumentServiceImpl(RestTemplate restTemplate) { - this.restTemplate = restTemplate; + public WxArgumentServiceImpl(RestTemplate restTemplate, WxArgumentMapper wxArgumentMapper, WxConversationMapper wxConversationMapper, JwtUtil jwtUtil) { + this._restTemplate = restTemplate; + this._wxArgumentMapper = wxArgumentMapper; + this._wxConversationMapper = wxConversationMapper; + this.jwtUtil = jwtUtil; } @Override @@ -75,7 +89,7 @@ public class WxArgumentServiceImpl implements WxArgumentService { log.info("请求体:{}", requestBody); HttpEntity requestEntity = new HttpEntity<>(requestBody, headers); - ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); + ResponseEntity response = _restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); return response.getBody(); } catch (Exception e) { log.error("向AI获取立论失败", e); @@ -92,4 +106,37 @@ public class WxArgumentServiceImpl implements WxArgumentService { .replace("\r", "\\r") .replace("\t", "\\t"); } + + @Override + public long UpdateArgument(Long conversationId, String topic, String stance, String content, String userMessage, String token) { + long relatedConversationId = conversationId; + if(conversationId == -1){ + int userId = jwtUtil.getUserIdFromToken(token); + WxConversation wxConversation = new WxConversation(); + wxConversation.setUserId(userId); + wxConversation.setType("argument"); + wxConversation.setTitle(topic); + // 渲染preview的前10个字符 + wxConversation.setPreview(content.substring(0, Math.min(content.length(), 10))); + wxConversation.setCreateTime(new Date()); + wxConversation.setUpdateTime(new Date()); + _wxConversationMapper.insert(wxConversation); + relatedConversationId = wxConversation.getId(); + } + else{ + _wxConversationMapper.updatePreview(conversationId, content.substring(0, Math.min(content.length(), 10))); + } + + WxArgument wxArgument = new WxArgument(); + wxArgument.setConversationId(relatedConversationId); + wxArgument.setTopic(topic); + wxArgument.setStance(stance); + wxArgument.setContent(content); + wxArgument.setUserMessage(userMessage); + wxArgument.setSequence(_wxArgumentMapper.selectByConversationId(relatedConversationId).size() + 1); + wxArgument.setCreateTime(new Date()); + _wxArgumentMapper.insert(wxArgument); + + return relatedConversationId; + } } \ No newline at end of file diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxDebateServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxDebateServiceImpl.java index 7d46c79..6c119b9 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxDebateServiceImpl.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxDebateServiceImpl.java @@ -1,12 +1,18 @@ package com.learning.newdemo.service.impl; +import com.learning.newdemo.entity.WxDebate; +import com.learning.newdemo.entity.WxConversation; +import com.learning.newdemo.mapper.WxConversationMapper; +import com.learning.newdemo.mapper.WxDebateMapper; import com.learning.newdemo.service.WxDebateService; +import com.learning.newdemo.util.JwtUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import java.util.Date; @Service @@ -14,6 +20,9 @@ import org.springframework.web.client.RestTemplate; public class WxDebateServiceImpl implements WxDebateService { // 通过构造函数从IOC容器中注入RestTemplate private final RestTemplate restTemplate; + private final WxDebateMapper wxDebateMapper; + private final WxConversationMapper wxConversationMapper; + private final JwtUtil jwtUtil; @Value("${ai.debate.body.message.content-sys}") private String contentSys; @Value("${ai.debate.header.Authorization}") private String authorizationHeader; @@ -31,8 +40,11 @@ public class WxDebateServiceImpl implements WxDebateService { @Value("${ai.debate.body.logprobs}") private boolean logprobs; @Value("${ai.debate.url}") private String url; - public WxDebateServiceImpl(RestTemplate restTemplate) { + public WxDebateServiceImpl(RestTemplate restTemplate, WxDebateMapper wxDebateMapper, WxConversationMapper wxConversationMapper, JwtUtil jwtUtil) { this.restTemplate = restTemplate; + this.wxDebateMapper = wxDebateMapper; + this.wxConversationMapper = wxConversationMapper; + this.jwtUtil = jwtUtil; } @Override @@ -90,4 +102,32 @@ public class WxDebateServiceImpl implements WxDebateService { .replace("\r", "\\r") .replace("\t", "\\t"); } + + @Override + public long UpdateDebate(Long conversationId, String content, String userMessage, String token) { + long relatedConversationId = conversationId; + if(conversationId == -1){ + int userId = jwtUtil.getUserIdFromToken(token); + WxConversation wxConversation = new WxConversation(); + wxConversation.setUserId(userId); + wxConversation.setType("debate"); + wxConversation.setTitle(""); + wxConversation.setPreview(content.substring(0, Math.min(content.length(), 10))); + wxConversation.setCreateTime(new Date()); + wxConversation.setUpdateTime(new Date()); + } + else{ + wxConversationMapper.updatePreview(conversationId, content.substring(0, Math.min(content.length(), 10))); + } + + WxDebate wxDebate = new WxDebate(); + wxDebate.setConversationId(relatedConversationId); + wxDebate.setContent(content); + wxDebate.setUserMessage(userMessage); + wxDebate.setSequence(wxDebateMapper.selectByConversationId(relatedConversationId).size() + 1); + wxDebate.setCreateTime(new Date()); + wxDebateMapper.insert(wxDebate); + + return relatedConversationId; + } } diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxReviewServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxReviewServiceImpl.java index 0944e02..49cf49d 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxReviewServiceImpl.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxReviewServiceImpl.java @@ -1,17 +1,27 @@ package com.learning.newdemo.service.impl; +import com.learning.newdemo.entity.WxReview; +import com.learning.newdemo.entity.WxConversation; +import com.learning.newdemo.mapper.WxConversationMapper; +import com.learning.newdemo.mapper.WxReviewMapper; import com.learning.newdemo.service.WxReviewService; +import com.learning.newdemo.util.JwtUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import java.util.Date; + @Service @Slf4j public class WxReviewServiceImpl implements WxReviewService { private final RestTemplate restTemplate; + private final WxReviewMapper wxReviewMapper; + private final WxConversationMapper wxConversationMapper; + private final JwtUtil jwtUtil; @Value("${ai.argument.header.Authorization}") private String authorizationHeader; @Value("${ai.argument.body.message.role-sys}") private String roleSys; @@ -29,8 +39,11 @@ public class WxReviewServiceImpl implements WxReviewService { @Value("${ai.argument.body.logprobs}") private boolean logprobs; @Value("${ai.argument.url}") private String url; - public WxReviewServiceImpl(RestTemplate restTemplate) { + public WxReviewServiceImpl(RestTemplate restTemplate, WxReviewMapper wxReviewMapper, WxConversationMapper wxConversationMapper, JwtUtil jwtUtil) { this.restTemplate = restTemplate; + this.wxReviewMapper = wxReviewMapper; + this.wxConversationMapper = wxConversationMapper; + this.jwtUtil = jwtUtil; } @Override @@ -88,4 +101,31 @@ public class WxReviewServiceImpl implements WxReviewService { .replace("\r", "\\r") .replace("\t", "\\t"); } + + @Override + public long UpdateReview(Long conversationId, String content, String userMessage, String token) { + long relatedConversationId = conversationId; + if(conversationId == -1){ + int userId = jwtUtil.getUserIdFromToken(token); + WxConversation wxConversation = new WxConversation(); + wxConversation.setUserId(userId); + wxConversation.setType("review"); + wxConversation.setTitle(""); + wxConversation.setPreview(content.substring(0, Math.min(content.length(), 10))); + wxConversation.setCreateTime(new Date()); + wxConversation.setUpdateTime(new Date()); + } + else{ + wxConversationMapper.updatePreview(conversationId, content.substring(0, Math.min(content.length(), 10))); + } + WxReview wxReview = new WxReview(); + wxReview.setConversationId(relatedConversationId); + wxReview.setContent(content); + wxReview.setUserMessage(userMessage); + wxReview.setSequence(wxReviewMapper.selectByConversationId(relatedConversationId).size() + 1); + wxReview.setCreateTime(new Date()); + wxReviewMapper.insert(wxReview); + + return relatedConversationId; + } } diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java index b218493..053d398 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java @@ -62,10 +62,10 @@ public class WxUserServiceImpl implements WxUserService { } // 根据openid获取或创建用户 - getUserByOpenid(openid); + int userId = getUserByOpenid(openid); // 生成jwt token - return jwtUtil.generateToken(openid); + return jwtUtil.generateToken(userId); } catch (Exception e) { log.error("微信登录异常", e); return null; @@ -73,7 +73,7 @@ public class WxUserServiceImpl implements WxUserService { } @Override - public WxUser getUserByOpenid(String openid) { + public int getUserByOpenid(String openid) { WxUser wxUser = wxUserMapper.selectByOpenid(openid); if (wxUser == null) { // 如果用户不存在,创建新用户 @@ -82,7 +82,7 @@ public class WxUserServiceImpl implements WxUserService { wxUserMapper.insert(wxUser); wxUser = wxUserMapper.selectByOpenid(openid); } - return wxUser; + return wxUser.getId().intValue(); } @Override diff --git a/Debate_backend/src/main/java/com/learning/newdemo/util/JwtUtil.java b/Debate_backend/src/main/java/com/learning/newdemo/util/JwtUtil.java index a745f68..5819b68 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/util/JwtUtil.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/util/JwtUtil.java @@ -1,112 +1,122 @@ -package com.learning.newdemo.util; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.JwtBuilder; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.io.Decoders; -import io.jsonwebtoken.security.Keys; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.crypto.SecretKey; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * JWT工具类 - */ -@Component -public class JwtUtil { - - /** - * 秘钥 - */ - @Value("${jwt.secret}") - private String secret; - - /** - * 过期时间(毫秒) - */ - @Value("${jwt.expiration}") - private Long expiration; - - /** - * 生成token - */ - public String generateToken(String openid) { - Map claims = new HashMap<>(); - claims.put("openid", openid); - return generateToken(claims); - } - - /** - * 从token中获取openid - */ - public String getOpenidFromToken(String token) { - String openid; - try { - Claims claims = getClaimsFromToken(token); - openid = (String) claims.get("openid"); - } catch (Exception e) { - openid = null; - } - return openid; - } - - /** - * 验证token是否过期 - */ - public Boolean isTokenExpired(String token) { - try { - Claims claims = getClaimsFromToken(token); - Date expiration = claims.getExpiration(); - return expiration.before(new Date()); - } catch (Exception e) { - return true; - } - } - - /** - * 从token中获取JWT中的负载 - */ - private Claims getClaimsFromToken(String token) { - Claims claims = null; - try { - // 使用正确的方法: parseClaimsJws而不是parseClaimsJwt - claims = Jwts.parserBuilder() - .setSigningKey(getSignKey()) - .build() - .parseClaimsJws(token) - .getBody(); - } catch (Exception e) { - e.printStackTrace(); - } - return claims; - } - - /** - * 生成token - */ - private String generateToken(Map claims) { - Date createdDate = new Date(); - Date expirationDate = new Date(createdDate.getTime() + expiration); - - JwtBuilder builder = Jwts.builder() - .setClaims(claims) - .setIssuedAt(createdDate) - .setExpiration(expirationDate) - .signWith(getSignKey(), SignatureAlgorithm.HS256); - - return builder.compact(); - } - - /** - * 获取签名密钥 - */ - private SecretKey getSignKey() { - byte[] keyBytes = Decoders.BASE64.decode(secret); - return Keys.hmacShaKeyFor(keyBytes); - } +package com.learning.newdemo.util; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtBuilder; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * JWT工具类 + */ +@Component +public class JwtUtil { + + /** + * 秘钥 + */ + @Value("${jwt.secret}") + private String secret; + + /** + * 过期时间(毫秒) + */ + @Value("${jwt.expiration}") + private Long expiration; + + /** + * 生成token + */ + public String generateToken(int userId) { + Map claims = new HashMap<>(); + claims.put("userId", userId); + return generateToken(claims); + } + + /** + * 从token中获取openid + */ + public int getUserIdFromToken(String bearerToken) { + int userId; + try { + String token = extractToken(bearerToken); + Claims claims = getClaimsFromToken(token); + userId = (int) claims.get("userId"); + } catch (Exception e) { + userId = -1; + } + return userId; + } + + /** + * 验证token是否过期 + */ + public Boolean isTokenExpired(String token) { + try { + Claims claims = getClaimsFromToken(token); + Date expiration = claims.getExpiration(); + return expiration.before(new Date()); + } catch (Exception e) { + return true; + } + } + + /** + * 从token中获取JWT中的负载 + */ + private Claims getClaimsFromToken(String token) { + Claims claims = null; + try { + // 使用正确的方法: parseClaimsJws而不是parseClaimsJwt + claims = Jwts.parserBuilder() + .setSigningKey(getSignKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } catch (Exception e) { + System.out.println("Token解析失败: " + e.getMessage()); + } + return claims; + } + + /** + * 生成token + */ + private String generateToken(Map claims) { + Date createdDate = new Date(); + Date expirationDate = new Date(createdDate.getTime() + expiration); + + JwtBuilder builder = Jwts.builder() + .setClaims(claims) + .setIssuedAt(createdDate) + .setExpiration(expirationDate) + .signWith(getSignKey(), SignatureAlgorithm.HS256); + + return builder.compact(); + } + + /** + * 获取签名密钥 + */ + private SecretKey getSignKey() { + byte[] keyBytes = Decoders.BASE64.decode(secret); + return Keys.hmacShaKeyFor(keyBytes); + } + + /** + * 从请求头中提取token + */ + public String extractToken(String bearerToken){ + if(bearerToken != null && bearerToken.startsWith("Bearer ")) + return bearerToken.substring(7); + return bearerToken; + } } \ No newline at end of file diff --git a/Debate_backend/src/main/resources/application.yml b/Debate_backend/src/main/resources/application.yml index 35acca6..d727bc1 100644 --- a/Debate_backend/src/main/resources/application.yml +++ b/Debate_backend/src/main/resources/application.yml @@ -5,7 +5,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/wx_miniapp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root - password: 123456 + password: 1234 mybatis: mapper-locations: classpath:mapper/*.xml diff --git a/Debate_backend/src/main/resources/db/wx_miniapp.sql b/Debate_backend/src/main/resources/db/wx_miniapp.sql deleted file mode 100644 index f93ea96..0000000 --- a/Debate_backend/src/main/resources/db/wx_miniapp.sql +++ /dev/null @@ -1,22 +0,0 @@ --- 创建数据库 -CREATE DATABASE IF NOT EXISTS wx_miniapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - --- 使用数据库 -USE wx_miniapp; - --- 创建微信用户表 -CREATE TABLE IF NOT EXISTS `wx_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `openid` varchar(100) NOT NULL COMMENT '微信openid', - `nickname` varchar(50) DEFAULT NULL COMMENT '昵称', - `avatar_url` varchar(500) DEFAULT NULL COMMENT '头像URL', - `gender` tinyint(4) DEFAULT NULL COMMENT '性别 0-未知 1-男 2-女', - `country` varchar(50) DEFAULT NULL COMMENT '国家', - `province` varchar(50) DEFAULT NULL COMMENT '省份', - `city` varchar(50) DEFAULT NULL COMMENT '城市', - `language` varchar(50) DEFAULT NULL COMMENT '语言', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_openid` (`openid`) COMMENT 'openid唯一索引' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信用户表'; \ No newline at end of file diff --git a/Debate_backend/src/main/resources/mapper/WxArgumentMapper.xml b/Debate_backend/src/main/resources/mapper/WxArgumentMapper.xml new file mode 100644 index 0000000..bbfd472 --- /dev/null +++ b/Debate_backend/src/main/resources/mapper/WxArgumentMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + id, conversation_id, topic, stance, content, user_message, sequence, create_time + + + + + + + + INSERT INTO wx_argument_record ( + conversation_id, topic, stance, content, user_message, sequence, create_time + ) + VALUES ( + #{conversationId,jdbcType=BIGINT}, + #{topic,jdbcType=VARCHAR}, + #{stance,jdbcType=VARCHAR}, + #{content,jdbcType=LONGVARCHAR}, + #{userMessage,jdbcType=LONGVARCHAR}, + #{sequence,jdbcType=INTEGER}, + #{createTime,jdbcType=TIMESTAMP} + ) + + diff --git a/Debate_backend/src/main/resources/mapper/WxConversationMapper.xml b/Debate_backend/src/main/resources/mapper/WxConversationMapper.xml new file mode 100644 index 0000000..ebc18ea --- /dev/null +++ b/Debate_backend/src/main/resources/mapper/WxConversationMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + id, user_id, type, title, preview, create_time, update_time + + + + + + + + INSERT INTO wx_conversation ( + user_id, type, title, preview, create_time, update_time + ) + VALUES ( + #{userId}, #{type}, #{title}, #{preview}, #{createTime}, #{updateTime} + ) + + + + + UPDATE wx_conversation + SET + preview = #{preview}, + update_time = NOW() + WHERE id = #{conversationId} + + + diff --git a/Debate_backend/src/main/resources/mapper/WxDebateMapper.xml b/Debate_backend/src/main/resources/mapper/WxDebateMapper.xml new file mode 100644 index 0000000..d5746d9 --- /dev/null +++ b/Debate_backend/src/main/resources/mapper/WxDebateMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + id, conversation_id, content, user_message, sequence, create_time + + + + + + INSERT INTO wx_debate_record ( + conversation_id, content, user_message, sequence, create_time + ) + VALUES ( + #{conversationId,jdbcType=BIGINT}, + #{content,jdbcType=LONGNVARCHAR}, + #{userMessage,jdbcType=LONGNVARCHAR}, + #{sequence,jdbcType=INTEGER}, + #{createTime, jdbcType=TIMESTAMP} + ) + + diff --git a/Debate_backend/src/main/resources/mapper/WxReviewMapper.xml b/Debate_backend/src/main/resources/mapper/WxReviewMapper.xml new file mode 100644 index 0000000..a3ea922 --- /dev/null +++ b/Debate_backend/src/main/resources/mapper/WxReviewMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + id, conversation_id, content, user_message, sequence, create_time + + + + + + INSERT INTO wx_review_record ( + conversation_id, content, user_message, sequence, create_time + ) + VALUES ( + #{conversationId,jdbcType=BIGINT}, + #{content,jdbcType=LONGNVARCHAR}, + #{userMessage,jdbcType=LONGNVARCHAR}, + #{sequence,jdbcType=INTEGER}, + #{createTime, jdbcType=TIMESTAMP} + ) + + diff --git a/Debate_backend/target/classes/application.yml b/Debate_backend/target/classes/application.yml index 35acca6..d727bc1 100644 --- a/Debate_backend/target/classes/application.yml +++ b/Debate_backend/target/classes/application.yml @@ -5,7 +5,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/wx_miniapp?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root - password: 123456 + password: 1234 mybatis: mapper-locations: classpath:mapper/*.xml diff --git a/Debate_backend/target/classes/com/learning/newdemo/Dto/ArgumentDetailDTO.class b/Debate_backend/target/classes/com/learning/newdemo/Dto/ArgumentDetailDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..cc984ff2f8568a841f43c3ce110e3148774f786a GIT binary patch literal 4058 zcma)8ZF3t}6@IR~(yrvStvHEYQOBgM8f?q1pu8krCqQZ^t*M=)v759>fNtciy|Juy zc2`NmTY+I12EM>27=8fx5@ujp2d2X?r61ZE{y={K{EU|JoZXeQvX_tzm_`$dn3X@zo> z&zm?dKJ-Sc6X??>o{@|V61wKxZab}pBiLt6oRBjcL827!l!|krr+hDMy%W?_d#919Lm{`P8 zAG_i#GDmmpX4|>=Cb^UqNGi4@@1x}Hc@r<%e3l*Ti(Vc+qZX|(DAu*K8X8wEGw^ao?!y| zI;@XZNs8eL6FOC5_FHV@P*C5-+C?QBDvk)zDgKH?~*p-K4tt zOP7~d&+%l->@(j9+D+b=15wz;YA-^w+82pY?e02QO?SQ#dY$ent$A&~;hcAcSz`xo z&*vnItoI9^7Y3nk@5Y4>Mha+`a0hpFyd|x6PodgNxZAqpZ9DaN50;YMciwJt(vD26A)<)9_swj=$KngTM)N{7B*114+s{yN(|# zOg@^z$?lNTx)`N~8iUyx|zE5LCC>;)_n_btxuaTNQxnZH2I z)E+|L!;p-J_b@KwlY5wy@u@vjW&FY(YJZO0z0B_$Y#+R|i%t*p4j#9$H zOpUec)h5oE5n0DID0FL3h{)2d!6BAVVI8k#xg397m%_WQ%Sz<(O18_%$8{+b?z%i4 zxxAWv@ap5bly2y{JQ2Bk4XvAq~$zMgWOZ7g-A(rRk+RPu2*B;dV zf#KgHKk%UTK89CkXC9&+O(}f&!Yn_QHun(*E82%RbRXtiMSF;^bPy-4JRv8oLM1Pl z!iN~WkD*GwQb>VLSvoZwE2R|3vIYsVEVD8w zATt3`>VUKdJla62Lu0=EEIx9VZy)0tt}{nR@d0k|9?0>Acn9C6Zh%ejM|_8p#;4@h z_%0>s>|f#yN(D5r4V#h<9}aF(GVmLmM}txkzvVB;4N4{OhT{5lUL=3RlX#PoiA~0K z7NffH35InHe~K|3IsO^yQ#=ui#s4pME~;xRtR_E@6RynjJkixF6_qrkFRFCgbuKEo zvTiW2E>&(sRN*gUs@Tcu-*jQn(XYx2r?oQ?AtuTTTcm?guHA<|_Yezji2kId$wEa- zRtzCYymZRSM@!^KWMowGouzrJ5G@tDOJq%KWm$T(M8YIidbBi=UEa%am`QmD@C$6g zNT;iSCJaIHy6<1tsULn+U8dmb%H1%w!fM@f&0^)Hk@qe5e`lwyIP z)Ms?jo99Gv6!{LIgVFj`39OKU^^p6u30Ut3_wX4DiHUK*q-T}AMnk4)xBKM0$YjV{ zc1()R|5N;*mjd(O`YXQi9?k*#AB31&@gsPwTZ7vX1APP>4LS|^|2_PGvl68r;%!!> F@?V*|CQSeU literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/Dto/ConversationDTO.class b/Debate_backend/target/classes/com/learning/newdemo/Dto/ConversationDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..e9ee66f5c99bc1f5d66a3141ad17c087af32d19f GIT binary patch literal 3983 zcmbVOZF3t}6@IQP?XKkYOB^SzsAJMrO>Nn(pu8krCzRGnT7#X0*iG6bKsWL>-gvEb zrIpk0R$!P;2fn~37=8fx5@uk)f$14$cvf1p30{TY<zD^%;@b}jJSX2YjO!@INLZHG0l5&6;G+SNCf!p5%GY`KviHWUiCyl8nt zVQhM4rMJyW*toS=#4tuojM_MaF@@<&vuC5QmbQ3y{h~t7r^V5Jd*bG}jUza!U~=2_ zyE~r3_`Z$Tq9&czTR&o>j4vqUBaItNnM+V&aMH#xF=&ZFKMFkY`inM>i)w*K4m^Q9 zZsQ4ol?c1k^mcvkjsTyuaYBIRPRtYNw2c{56^00XX=lTYymfz@j&>u|j{Kl@mVE8z zoQ-)rP0Q^RHaU9_S>k42vhig+Ls#o=x*8&)awbFDguIyIUSpUw5Oce#Ctnt;lUeErlR$OqbF@OaC7yU89Lh z3bpB#%+k!P_{EtkEU7q1BP)KxyU^ag={48gn}OtbC9J!_6}RcjI$`FcO`oT#X77^G z0E-I4cl!ElE?Ya>M<#34i#EfJOK#KM_9C_`i@6nd>fr;?l_Qyy#tpTvrjj5D!V-k^ z18bFJ(gmz@F4A@0vEM6R(N>{Er*}gn#Y(rrXwz%b0f|yY8sE|!O%^pXZs1bPP8P8s zc4sh=#4B5il7^&vv9P-y(c*p079-NEp|!}ZZ>_pJNeT;>E-$a1<0+QeOii!V4tR$S zXcr5W*dwE&FAKU~>FzaHNgK7Iu+uoDwXof+d*^+L=6K)z_q0TbDSSQ*qgK>(cj8>O zMhvt|*u@Nj@7Ew2{u5VzHNw;qK}!hV-dc>;`$zUVeK00)aOH)@HjYljQ3@Z7g&KKUo=uV zd13U-=R(hX4fM<_o%0A--&iK@TU_1cEc)}+zd==JAHdwhkj#hoFd_4!dzg~>u{~5| zergZ1f7a%{&2b7Q$5G_Dxy|jzaTt>vD|`{>a1<+)9*sA^DlTxvt#A>S=)`wO7ZexZ zf{#2$@u2j4ziP>nI&yepmOBcB3~TtaZq`pUwJT7nJ;aI@>IXFovFY*M|;d5G!xXtw$X6!Q0H|Apb-qcCuP_FW9G&Q%|vrk5nXa$$~x zlb`SCN1yo8v#d0YHa-2be9LFvX3dl}Cq&lGdeI9Kf)uC~{{USbcx86R& zHC$(mj^I7q;60Gz4e=Lzm%ITs!5{HGQh7cfzsC1TNoW5OuaYtlU<)oO6HR!yNy@@+ za2|D1Mf{eZgBzqu;0;CjbzUU@z@vDLl#N^T?KzB@*1s`qV)#=WHId`bQlH|Hm@NKp zvU5>gV`B62wVTw+0?(tbUdgD0A$?J$+pcp_$(413j&)1rhAtI;=90xuR-e#>MMJ+D zT|AvXqYGkkba9jAV2#e+gE{{Ii?0g*q>~pxIiE-@DUw)p$|-0O>q9G9kWTBa6FW~cXZ>}HbQ0lbY(_&h`bZ{aqn924?0CQj1(1Z4rKJde4G zZBhlc+cRj8G7w<`At_TQ>tmEYBO}jbDa8aqsn2Mlx6TRU2nroQ2b15=N?=9`)3|WMn#5cr~7KWz+lK*c1)5jiRJ$k{|o#(f5)@$;2hBZAjGv5 hKZ3`)Ie1-HU=uCQ7L7*y{{TPYszmC?c#|0^{}(?B3LpRg literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/Dto/DebateDetailDTO.class b/Debate_backend/target/classes/com/learning/newdemo/Dto/DebateDetailDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..07833f4330451e1fe375e71c351ce75d3d55371a GIT binary patch literal 4101 zcma)9ZF3t}6@IR~t6j+}S#cb@qK-+6liIRfL3z!}4sGqEHP}gr-GsKZ=~~{}8_TYZDCN0#SJFz}37JHD&z}37=bn3B z?p^=$zwiGQz!H9vM+QR%Gz&Vi0;OBd9jDrG{GIBRty^wA6v!@mz878)7@C>Ao`;E? zfxLxbSOU}aV87aMou=>6!gud(yZb@a^+PW_tloHQ#ocm3S3uu!!_{qp(V5w`-U4fZ zzf;Shh!F!N3nwrtFq2BS5(d?XYsC#6ud%XuMIhsmu{6jh9UQZ83gZGrF8fl;ZLYhm zma{`Y#`@OZ2%Gd;dGMHpGCn0R+)lzr6XY>i(ob4AE$Q>5Uk?0`+m*Zcw1qR0!>C6( z34PMSXE04(LO0yoZP%~UjZ=MYtde2JZ7M&`S$GOF0%ofVKACW$1C`Vj3v-wkC`d1w zF5|rE?UTG4<96sZsw>nh=BF)G@mV@uPhjKd^^ke);~5K|#~0{B-SIEpZaWR>aKeeG zE^4!{NN`Tp&zCKHMOtL(w9{xw{gd)BCLfdXQIW6<7QTvSNxbW{c9(-~I?Iw;&Et72 z8(6V$5tsTZFp4=NddF$B-79YjoJ(^g;ai-gQP%d07FO{!fr))*&t;nGPI$u$xvt*| z9Y1Ud>?g@oF&<}nsHT&STgH>josdhLg0x9gbH{~VIZKoXWYBu2 zPF%k9JP3E)CaX&ZZ(1HErqU>}pp?BXEJjm3MM(krj*Al!rcY-nSbQSTS5446!=v#voSCtebMo^8*XcQEeQ772em}{;+jcl`V2P@ z58M>^s|kGP{7R@|ie;zK*zkB@n)trJ>cIYIyzM11eus3T*&{6cUeT@d zIR%5y5;QJuarrTv#3Y~7yp88Ej?0`Kj~2icT;&^=!Z&b@PHa%t1z*4yep>J;J*sjP za;ox26n;k`1G!RGDf5a^LgkhtM&4Ci)uLbC6ZV(#^pMrcmHIZlqC8 zJSwHEyDnu}QGPR>a_UhjWeImF&nU{5@k*MPXCIYPc0-r)DMk4zzLiFqsPl)%QZ`nX zvZ^TgaTHOC4>%T>o{#1#zk#mZpZgn%zlJ_^f9?Ym*XJt_@HzEL;ft5&`LMNxe_*(* zeTWnHU@erj2l!G4ao*MmId5mny2NBZ#OOT~%6d7Q0NJ)dkZqe~LxRj0WR%SWsAlH~ zs@eH+PJ;3=C|AxWK#TS;L5sFk9+n_022tvOwENuJP@+SldV43@a<|?-!fSY)F*=36 z<0j964EyE}c!RnjRPb9klr+46pJR)XPQLe0r<6qld)TIApb3}%Ugvl4FK`KOQp(|% zcosX9^56-DT}s3F3m%6@$-*uA_8dkH^FJsWD1MA_0~!7|#m9Io5_A7w>>O0DF|nHb zPL6BkJolrHUYSuDhU7t&Y`e}uC6BC|bgWw{H&vz%2ZomErW?i8ygvRbqa zHN}F7tqe6anV#Njk(+UPhwv_w)Ziv`{1p3?GEB(Z@VVC^{xP(RfRcs_OzQz99WUb< z+@_R8hzTZErdKBGU&wz#g~ntF!305wPe{>w&q&27=p8@@qxGv|ST+IcAqTZF*ysoM z@F^3qiFwSVXO%ujLx!oeb)Fyvi!S|*!6o4=Y&Fn^1G#&hqpCop&+M70%Nf~UJV d2vr5PafhQx(!2b94?o~rp3)ETBfNw1{{TSFG5i1k literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/Dto/ReviewDetailDTO.class b/Debate_backend/target/classes/com/learning/newdemo/Dto/ReviewDetailDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..13407e51fffb600c01b4e12e0f3b8afc738e9158 GIT binary patch literal 4101 zcma)9ZF3t}6@IR~t6j+}S#cb@qK-+6liIRfL3z!}4sGqEHP}gr-GsKZ=|YZDCN0#SJFz}37JHD&z}37=bn3B z?p^=$zwiGQz!H9vM+QR%Gz&Vi0;Su|fm3Zb&F$)yTesbMD3D$BnqGK8U}$FcdLAZn z2J#k$VF^sv{k>|#by`i27ESl=mb>Ry-Dc>8ht(TzU2_jS_pX4x?S`vc0;4mtYrO^5 z{N{EohayG{lq{UUsK87r;Y#RNBd!%UbiBsO<`sdAN5;}1pLB4{!YPak6uIn6f!kVl zgTUE#1;+Z;-w0duT6yr8g)%-RFx*bUM-${RSkg~gI4$Y(q+j-%A-5}c@o5WZB!^Lt zbQ1cch0kD`yo7GJciL{VPB%{Vxv@%yZMUWTIA`H0%m|o47ko0|LiLpq#r zBC3np>?;zSllAju3ty2ISvu`B0;zveKE~u@Qa&mYcEQ3|@hpjVoM30!-=ecDsntB5 z$FhMH3m0*zuL7f(GolAhqwQXKQ{Y^hBMIN)ERC|ZU$n4_uL(@-IlC^?RCmG~UdVNu zLFhEYKwvLPri$@6(?d0#bQ}jI%RKf;V0LCLwYmq|r8awAK#SrtvgS42%k8~eZfn!I z)sX33^XpFIy3_LHd#u#L9giETr1PhAPmNi)+ilNt>2`yDF*oaOxZ`hKbz07z8@es7 zsRvPOpF9>!xs4)c`#P|%lH$lnV4lFZm)I?Q>2=F^lDQLdX;Y9kiE8e+&?{$&621&t z@6?IQm!A9Kj@x2&$>2@P!^Bh?B^H#j*M-Gss;4L^K;Ln3BEt0PECq{C1iBnSy6+>= zbYc^w7?DsFHbSSqyYB4A+19UKTV21%ovpIvT5iy8@RS}>Zs(?Z9$M3Vo|rtV)mg>( zPA3lmGxR%+mf!H(t-5>3la)3$aN<5KW5^nK-uJ^GY&rW;F$5!7yp_ixzHQ(;vgf|b zYoQlzuX*6_y47d}W|(bw$*G5a>rmiV$;`&Ui1bCLxz%uk={4WqZSU6->5FS7q3JW+ zJluCv;IAg|o%1W9iYbc2pYgVq#Qd2=P~~eJR4H~suhiZAEs0qH zYqi;QTgwe62;9KH+X82gg(z+327W9s^>8SQAPN(n;7Oa|(Wmpt+mup9UTbRP)ucvV zFKXmvz;OiZ1ALvhHNG8kl=cgiKS5OH9>6$4L5?SnFd@gsk1!?2CysDdjG_QO}xa&$bi`#WeT&EIp(gHnilv)_6HKANb=*j! zoOo19S$AE^vZDNEI_1=(QpytUQl3$iFXNRoFV8+IrR;_-FUXD6Y>}9^iB8mBJS<&+}nx3;)1y zS^E$t?!j6pYY*_H4&uD66LQ|pmUW5Aeu&X~D3tYbHUYA2gCN^B%Z3D*F~}&J2~f?> z5mdAD<(vfNV^FS~PkHSeT3KWI%9MS zf5%Op0~z+sAMgfsL#W`la42bb0YAqrN;>)8L!D9<4eVlzl7SXn{(GI@!N0&Iyh$mC zU*cJ8Q_6!U6m}>L<1cs|9wiI6>DzM{HO&8@XrTBp#tmfn-xMF?u}IAQf3b5=y~f09 z@;f=MmGj(>I(lVBWf+nNRkH0m2bDasZql)CsoYeh!VhGs*vaDGq%cYJvr=tQTT%rv zS*q=@9L&<(Js1lQu=Ix1pSLwRQP$!aQx-`yW!t)%Vtpthv#fWfYIaslWxG?Xn#gL= zHq;agCblxv)MR>kuSIUg=^etmOj3iJ(D763QOYnOZ==b*4)Kqn9r%*=d<<{%rngGQs>U{u$4`&z`{Gg%H(NbP1mB e<{(rR*v0`zlcaa~`yPJ4w>+gE;zxJ~<^KVCax-KA literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class b/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class index f2d6c406965ef734b1f64a34c16e2f23e32a0154..d53562c7ac921ee42863b3d8cd2d1b9760e8b802 100644 GIT binary patch literal 5712 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 S@9_t=Gk4*S_%r^B^8Wz8-ehS2 literal 4839 zcmb7G`+F4S6@F*4o7p5of#n)(sY;~e0)r6*vmrLz(FAA`gA}z+b|;%jc4wB^*#rdQ zr9~-LrCuo2T3d^4sV#z{xzNX_Kef-(zr#TKQ~v=U?fcD4c4x_kq%4{5cFy;mbKdiw z@B8;RlV1YZftxZy5;i5QjGERp+ceCSYU(3NJ!7c}%XDljoz`vj$cgp?y9z@YVF^nH zwP8(7Yg9PYH>f8Z2^DE8B_Y;f*(o)b?%y(~c37#DZpS6u)0H%u)?* zQ|q7HTjt#Do~c=zZui?-Mjx^4A+=A}%$(YscHp7)%Lt&jTp9T-QtlGUHY)0 zj}&a%G@orH^0bUw?AH6}?ZUSxk>?f>$I2QB5x^oE-HvdFiZp35v&dMy%NH^tfXFzTHGUJjf7QqLbun8f`aejdlITry5m7A;eic-Gk2x6TrOTe z8~G|o_`ZS&D(P>BVd@9-nLgd_(U<~mswA{@uVx!!>`zvZw4 zInbXoPZ@(6T0D~z61Ms_=N%)hc4}E#TsEILnXyc@OV8!g4tJ^QHd3bMjpuqKG%=ynNX7k*%uemt+|oSjzkWIT$cHE6~b84pQV zi|J3sZe4%LGp6OH{?vdvTuOGmBCy}D}=?wVba`P&rb)Tx2W6E5<}GRFQFx!x-(!U3&oEPR@&};&lFI-UKGm( zsa{gB95K=RnSw?5P7PkhIT^1=XewJoiu5XZ5GeS$fTW7#^5&y>mHe2x{MzmJE(Q4! z#b^|-6TIM3AX{U!V&I7Gp^bevS8J zygR@BC9e?$zY)bj*ze6p@mtzI{pA%F+*125MDcstA6zQ2KP2q0?zZxFLf>nMhr+Vb z2k0gNG8wqwTaP!n!|e8-v&8%VQFZUH;+8h8b9@h$wDjR>3a4A>$$oP%NojO;{gu&86TJ_QS2d+ z%7`Be$d@UF{uaBmbh_Jc^!VaRT#4cuSsJX1UXf;9l%n{QYr!lGuHE2T5aHsQ1m%Fq zcfR{*)N?Y%_?ny*uyP@gF~K|h?xM_mFJ8EhDP6&8$Cs^mfN~^rB-$w3khlujukq&; zcaHp>HAha&n&a!jmFL64ZCL@>M!53|tfcfRj_TQpe^oJQ9IHRW+Up#Ia4)~Y2vFrd zcLp5so$ITqY{hD%VGQf;R9WGwD4qZwz6*7l*A4H}J?mQO&0HUv#8x96!AFDb~jJ zHcnuF1vr0Dh=}zG9IilTlMw3_VmI;R(J}n^;KtaorU^VPQD#ujR9 zgNE(YZNV^Fsl5ZI(S}#>s2jX33>E$MgC}|p@{G(O?)4Ng2~m3uHS>(nX{^QwPH^rd zbyl+V1mS!Tgf|KxtigkP@(t0CZnyP7Xold* z9_HCTy8Rgad7Po^a3N^HVLoiS7|b5=Smdu4&*DfR@R>s3Gk)MVP4ZCFcuzCKebN|`uctGm%pGzKU!=xQaACc!c;7W>^=I9kAB)W>2K zQh3Y7VjYg*9rh}?XEQFa7v_#@U1CI#BvOJH;Q%qj9s(av>J({qn)cNp^bO*~$NT>+ zOIFw;hc_{cB4PZ2Y9U;93z^{KM;!l=8+*mRi0|CcFc>n+a diff --git a/Debate_backend/target/classes/com/learning/newdemo/controller/WxConversationController.class b/Debate_backend/target/classes/com/learning/newdemo/controller/WxConversationController.class new file mode 100644 index 0000000000000000000000000000000000000000..5b40b4592678689868b237c62b857be740455cf8 GIT binary patch literal 7792 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 C6{f`i literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/entity/WxConversation.class b/Debate_backend/target/classes/com/learning/newdemo/entity/WxConversation.class new file mode 100644 index 0000000000000000000000000000000000000000..9514dd38c035ec944d67bcdec8345badfd7c5548 GIT binary patch literal 4439 zcmb_g-*X#R75-M<)vlzK?bvk^HR*4)_-BO+fpisr49OquqvPyG{k;)zE}`Oe*yw6b?PW`-H>-gD3S z&bjxV``vR_{_sEV{TaX?!< z7@xS5gN2-lyo~~E4U@HCvr_lmX2YjP!@IubZ3Y#u5&GdyvGuSh|2k(jYEPm zIB4Ayzmko+MPqI?y=~vSF1n*O?!mnp^0lVthTe+5$%ye}+M!>sJVmXFcfXAX6tcaw z79;Zv@Q{r%9@b#h+{UTr+iqRM*mz<_QM#%VPYd{SHpVfbA$QdaFUD(P`WD1CWn&sM zoG)#%){*gvL>QG5*_4Wn&&zmOPX=p==VLa$fG=`g^juLXxvS4NPKrRkWaG;MwFD}8 z5#{4H98u<}JRhY-)F*5bf%{vedOnez?!288|we1Np4>}OLA7$uVHA>Z+K_ho2y=P#a*paGqM=e-1;TA z=}SLW>fyT2X-_Zi|2$R6pjO17(LJl3xWsHPdEt7ncHV8en_kFcNIKG?Lq~mlK~N@D z5tsVd9IrzVmLP;eBo4)xIHU_ZNxF1q(PN8v3#!Kwp6sCiAjijsiwVMYugM8XD#}tS zETvImPAQ`@kdM@HCo)9SE5w$lXDd@&0yvS#*zFG~b6+)x5J^=8>Jm4#t#&rJ#LOB`U3WLsR$u9@( zX3ab8%Vv!B*Vjj-u5x})20_>go9pm zqN8-$t%X5zN5kt$TE)O9=oz=MR`*)v#UR*dZ&g3@AoV#4(^BBiBqDU`XhIc-n0M>- zWuH~r!b=)1^)G+iUz^jW?~g7JktErw6*hC7N>W5Q;}v7E$O9(dyh{ZxmY>ml3Li@dfo#$K3GRQaiwj%&8V3|Eu8_e+C@B9at@6wn-&pDUs z%@${aMoaKT2h7{g+LyoHW&!mSO+iyrYLfw#uRLE!3Lmu95NI8w& zkaw$)-@$j&7Jg*EA?09qL*Ao8elI=befte5HKH5x0Tq&;lhG_QBW#CQ0&-K6Z^6)S zP5l+tuVD<_n)(Z@rRm8#cu;jIJTlGa4Y9E^d6vCNN1ypS3MKu09JmR4rljA&qaFCH zV-PayWJ`u%vhQQ$CWe!`%fb1AVDFHg^6bU-%43>%l8jL~3(qIRqOW7Jo)V!!*z8)p1bB?qeuE1qh z$M7$#vWR9di;q#GZh&9gA7PD>juqU7N68@1-obN}ve>~dag~yZ8+Z-tlq~!f8}KRR z@FwxsDCO}telTxPD&PY=fjT7{|KMG*NvVi`;s_d)1`%++OE_p+|HhyR%l?EiGW@f& zPjEOAbN`drDGpai6y>(A2uF5T_b5$KxiLCv;=)%s$u9X;75VtXfGSq7 z%mv2FG2*+!)f4*M(c$X4(Co^b;+J&EE^Bz|Cd`>Tcv9(S9bF71J+@fFxyW?PF_ejP zQ%+XN=$MW>S!K$0O(bFDRdq~dBL8A9vtv5xSjuE|O=Km#j;3?u*=Q~C;s@|Hw$yqJ z{0`4k%CK7e22CbpfY+9gN1MiA#1@Gll>F literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/entity/WxDebate.class b/Debate_backend/target/classes/com/learning/newdemo/entity/WxDebate.class new file mode 100644 index 0000000000000000000000000000000000000000..6d756cb5d78e8d59177b702dcb49ec21205c85bd GIT binary patch literal 4329 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 literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/mapper/WxConversationMapper.class b/Debate_backend/target/classes/com/learning/newdemo/mapper/WxConversationMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..4b2d1477de0e98cf62f231b8c0c3dccb1537cb8a GIT binary patch literal 641 zcmb7?&rZTX5XNVV6hT4!oA>}4xVYY{CTe0rQX-M4=cS#LCGBpr-GaQD2Oq$PG7bd; z5)OK3cRTa#H=W4n>-U^YvHALJijDi))Gjx^o$D-EPxe4$=#zf$B(>yL_ zkSX_+Q;!M0$V?7myj4ouVrqo*+}9@JA{D_9xg1b9<62aV&sU6rQ=^|B!*^Owx-Xc_Wph?R8LVZxY58;SbmjuTE-{T6ozyJUM literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/mapper/WxDebateMapper.class b/Debate_backend/target/classes/com/learning/newdemo/mapper/WxDebateMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..b38eb0fc2d89358e37a092ac6304767a4b9dc331 GIT binary patch literal 515 zcma)3T}uK%6g^|9X=PRr^x8vc56utQ3i=>0R*Hmr9@on{vO6QQvzmXchkigmD!Q(c z6hXbroqNyyI_JKByuJZA$6ggBfs@FlG9l%RHnB7`9Z+gzs>Wk-^7-Y4`pQ$caI07s zXpYoG$wYDTeSbue7dXf$;m_6V+L{TuOnGfhXCQFY3Rl^oHF3~h1ahwv8S2aj+^|c2 zXa^6Zs6!^fNlr}U&V-B0M!80!m#nCNk6T`bjDMMILBmDZV5 zs|2~wJ*Wr>tntx+5}%-q3QDN5SLS8d)aC%{3~geIQFs>y_$e17TCRMV_mxK(Tl zG{6DN>I&K|!j0nHLz8WV!F}KpnI_zGxFd diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxDebateService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxDebateService.class index 72c183344c62aa0318382ce0525c5a7b6b4f3868..5dcd396754b71b0678e6671302edf94da8eb02ae 100644 GIT binary patch delta 191 zcmXYqyAA*!gYZF{bb$bPAQqLy2E#&X@C@ z;#|CI!GFE)4*(-{obTK%99A}|C6k>6>L;tRg|b#AN+4JsVo7SER-6LU!F(%o8SSM` zqPcO$o};d#us;)Mu8q!BW+kOYPh)`!3sRZ{N@R9QyJs}^iri2Jul!&0Q2hd6?W6wJ SogxC(jo*YOQ=rA^q5T2>4k}Op delta 78 zcmdnQJe7&-)W2Q(7#J9A8F(ggO`Nz+LQudrwIm}yB_OdVF*mg&wWxTq6QjNoBMTz~ dD+3z?BLgQ;H764TJCNc4VnzloAj!nQ4FF^d4{ZPd diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxReviewService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxReviewService.class index cee83936da73dfe085332747b6d24343669c7879..b6be337f4824f95e33a29c14d9d65589cfdc654a 100644 GIT binary patch delta 226 zcmey!IEk6-)W2Q(7#J9A83ZPB)lZx(T+g1IpI4HaSHj4^6IzgxSdto)T9%nw&dA`Y z;ggkEmZ+bTn3t~alb@Gvjl>TwDas^LMAM6rfe&a&S!z*nVo7Fxo@WXp19xe0YLRbh zaWQvddMYCWYe{}~YTm>p`nF6gKpq1d10w@F(3z}^3>*v$Kp{>BE~t7O!WaOs=Bo-y+rk11@6;D=U h)R$vqVPs%sU}Iop-~ei3Wn^FnQj83oK$3}p3jo0D5gPyi diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class index 76766647eeb6f7bbd497f55a2798f28ce523ace3..a872f632079274b53675eb60d176fbd87335b1c8 100644 GIT binary patch delta 119 zcmZ3){GVw;v#x+|YDq?ZNA}FYF=gv zBZKI~4I+%56JIn~u`@6*ure}mFfgz%GH^0*F)%Vfg}A{&JPf=DAwHmDpm9Kwi9rAW DWxN%i delta 103 zcmey*w1{~^Gb>ASeoE@ZMp0q@^wg5j;?yFiO8nRv9pii3fH oft8Vgoq>Uck%5zei-C~=D#Q&I;$h%L2=M_GGcxc4NhSsX09C#bb^rhX diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxArgumentServiceImpl.class b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxArgumentServiceImpl.class index 784723a42bdc36638da5e3409cabd9353a247110..c4f12e3394fb34f0bf59166ff90cbbad1dc84fa0 100644 GIT binary patch literal 8161 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 delta 2515 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 bY>|XGzMjwX#Etw4b7Y95FcJMPx^9u2 delta 2437 zcmZuyd303O9scf2X5O30%gp43kOmQwK!lkLi3?OA0ZKvBr<+}^$HO_E_P_R=p7!*+Gt(S3ojJezyZ3&- zyM4d!-glzwwM6XI|D1gez+$|u!6&dlzF1u^M{Ap=Yp4>4?M&@Xb!1caP{(xxJFT>* zAt;cn1nF{lq_)qWb%q4YKF1yEC}aoc@9gMvhK4M+Q{a;IMcd2dtX1~zOd&InwU*ho z!tj&ofv{~etftM;s1UY(%mTI^gdr^RLmsyrvZPIkp+M8clqWP5fvnKaRva%rqy z=3_=kCvSPz87Rm-vF3h%(an;Q*?Uu&_LMtR%<-V@?BjX#u5>nIXS^i>{<-nZ0#!Xc zU>G09H5#rKX!s!WD^h9Cafb~o#3K1_&HQi(0$m0)=rU6q4+py{(_Jo4#@eUGH;3Uz zw}GX&N<}U=Pz^&Kt{o7U$wxv{?w&rt#-YE8bs7g+YEdH zH^^6fSB?mL%0L|=Dqz4sy$TT6ZotASfv{Cbr}9>B!Le1qkb#DBXvRQexwgx|C77vSshQqi6cd1m|EiVST>jdsGaJkyTVI0+PWFk09k|pkyx!@Jz3-Y00eeg@T zPs5kx^TBpP_u~QiZtz^_K|HMCA%Qt+iM!1@LXY54`KH$F*YOoOO`onGz}F0X9p8{k z^aXwm-;zR~8Wzwhw@v=N_I3HP`PfVyX9b|+SxS7Hj^_k?+qQ*q3@;dX5#NzV^$p$M zBi5qh2MVKqna!|{S5?#2@fw>oI$l>zSI3Xp4C(l(YI?l389QI}?=wP+B(((#AW@6>M*KKxlOYl!>smdrNHqhS2ZTmZG0rew}~h^Y$F zhv`ivXnLQL8vCNGSJTI6wFSaHCAP`H6av)VWMC=*YHkAH`jxppM1&fgKqi1`1SrYL zz@-GJ(8<6|0!{x9XeL1YzGuWpW%XG^sOR?}72q-gl=oyHPJm*c473rT_9p}L2=FSr z58(O9V+Rpx^?gVQxB^wo$(6W@(0p`V4mXvzHz@_*I zF*R%jy^lVe7{{_i+tcXz-?$NQSwEpBuGGxjx0EJOX<|4&%Ax8PF6ltvTGj)C4K@Et ztSZkhjxmWr_8mWm-mT;4Ta!G6HDlP2G`A$4!qzc-obHne7O63$=?2?a?4XV8WRa!W zv^>qFd9>ZMn`wK_;?uy|Q|L5rnRf=a`Ed?+Y@L@J$DNC+i1*Mwe+q{htIT8m^YD-1 zi;Dt{fiWC^0mnwysBw=a&)}<6`Dlr}dvFNfUPgI&Q}k_%^xh=W%hH)+4eAK6kLvp?Z4_$wO! E3sgGO@&Et; diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxUserServiceImpl.class b/Debate_backend/target/classes/com/learning/newdemo/service/impl/WxUserServiceImpl.class index 426cea44064a5c3bb61be8efd5dfeabbbe1927c1..2e9449ab5b1e658528115a800214b200d0bc26c3 100644 GIT binary patch delta 1013 zcmY+C>u*$L5XOJ+-p<)`&bGUSCP->UWb1afv5JX_Ynm8EO_hQHV`KEo#ywdV>(cB+ ztP-23sNfY}!KKs!wRmHNLUHMh;vGc=@0u7tnArGF7%`| ztuuelE&x6JbkwREs#V8AOI5G_*+{Q@ToK8+1-FJ9YzGrUn{s5b4ahTuJ#K_|7u-+rNvRE42~&c z{|?hzD7!hg=y05O6=uFrzB4mWaTWfAu2}h%p4ObhJcnf1%3xNua>LN=#ry-A;?QmG zkja8h+N<;iI~)3#(*~dDc{>&QR8dW=)mKE~y2U96J~H`S?{GG?eW?gmiUVn7a!z3t z-O}LZLdo^cU+ZXOx%y70BFVrHigqb(pV}g!@Gk@~<+bMZNYi-NHAeC{TU(7fk52X- z1_&0Hco0;VnI)rr(VNZ}GDY2gS3=WEB z_VKKEK04XPb3Biq)okSji3PZoEHAQ?ARD=xeu;&cz~Ut|hUiClnO#!5TNFLDhDL~2 zM5L;(ipGay_zaZ6^&V_zkMM#@S|j9#c|=Ov#2*vu7n_zrM^ZD4`snLAO~)MLcb#CO zuPasOpqG=u-}KS{Us|17oynS1`-uy-%f+A%n{_nnbJ2^_=?g=r8zU&mbyMerbgc^4 zME${PLw>A(uGcR?#WXXzBeo*pU1-)vPum#5K+RukJi*EHPvEZ!F~TLRkkuDrJ;R== zVwq^3k`?*5^umg~PRj_`(krU|64Lp_jQ?*jbs+_KPteEvQi|+b@qyS6jrWfg#3c)mT;j)rTwUEbrc3 zD!Lgm2$GSdBY->+dQ9|U4}-&J`J*VocGtu`+~+6sBJMJ(Wdib1Jx3R%0TY9wWF)d- z-eF`)Y$FdFyY0^~sp2`$F+H{y4DGq3Hi?IvG5nb6SHc=z@t@|t)He*agY`8fOv5yT zUT^v8YP~*7+~4sAXNvNHA&a+~iPY+1pN6KKE1BaP6sTlknA>7|JeB#wIGSu9!SPV} zAQmq;Sul=MGFS)_VLI^$&FDfxZJ&%RyShiG`3Ck>@|$rHx`DLlVtnt zpLa>9NP=RJ4j21Npr|o{|BUG)kb+T)62_<%WHh6n2TahHLbaE4pNhoSk@z+eXYiit NIvfnM_=wL){s)Z*#>xNy diff --git a/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class b/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class index b6c742c240f38986a721c496c5bc55824db1b8c0..02c4c6e881518a794da5b981197765f79e7d6b4c 100644 GIT binary patch literal 5046 zcma)A33LYeJi@v}v2R>E5Jt-?wvm+TQJ$TrRI0B^`qlu`qS)iz~X+T4n zz*R~p?L=dtorXQqYb1lvP*jErN~diz)jbqMC1z=ut)mK8&FoNWyAzH%Y^DUXBStK3 z?mi??+t}UIlQrx~v{zsb=4zZ% zJy9!k*tQa5=Aa|J4Y}JG)a7W@(4?aoEew5OF-Dh`1ae&T0_S%z6U$1h(6JIBfwE}A z8IYM(gz47sY=Jr1-Rc5Ed12F*iOik9d2Go$u59SCAGwrIFsQnDk5lAV^t%+qdd;{iW9 zZ=E^p!d4C2bZo~Cfw`B)j0CX>B59<^{myhWHYEAIlpqR7?(s`0dUWg9g&PEd40$*@ zoVdZ95V*z*!FVW=nn*fUC~QVjro(4UVK4eL?AEadHwr9zCL?ssb~TfbN_m?X9@~th zQ&DFkB-LJlx6*Q0M?dxnlnhFs0t=rGCVkzH=W4h~#{nD^sJpDMOs_xa!!;5viM5=LXP(@BY7ATMLqAFfmdzm~)UM^7F zxT}fgyYNaKci~kuulOPhb2|GJn~HDODhcT(Qz-{%eHG%n{74&aiiarBXJ`V9x>P>w_Bv|g2scL?kQ2AH<#fo!_&z*!b~j+ z;v62*@EIMS#piNciW&}Bd93x6W4n1PSi(HE&fyC>zKDleYIb_i_O{mK4ozNI*kbpl z6AsIKAZkYkV`fJpVL9qpC6qNiR%$q8%ce1WC}qUWF)KA18syn$hYm5HR%#+-WHy9U zQMZ$nYEok)mfn7N%vtGXG+_T>Nn_y%%K%AVgp7h zD(}6;VrL{uzn1honMC+I5OX(WbXroFVsvPRQM|NDrC&6k&)js0}DfcQb5e1R$4Q_*F_ zV&N!f3K zazDK&%hN@S#q8n%4mkn-v6VyM5#CksdY+#z+4wRaaQ4W5@F>c-$ahhGe}#KOyb4}R znomQVP%6L5Z}}Lg!Poe$y8`$+zQH>-Xgo~qa?QrflpCOAKbB!16SZF>W20Q2?609H)n zEdj__oW$Fw@$Mo>T2AAA0@>oIC&7VR_qQTB@H0*(HXp8%fZhi}PzByslgPLiPJ zB<>@$4^QLcvV>0dv`pcY^g5tQTK>2N_Vg-P$~#6=Zt}dVVyK?NgH$PqN0x?EeUMiv zRon6i=Co9wnZ&2>L9nGto5bgjw`3#Ywu>WV=NL0S?$ckJL0{_?mMo_th`BScWE~ab mSNsm(qH2w@pZ%Kmzu`wVz~A!oXZ)3SLH_qQ`~&|&-Twh2+*61E literal 4084 zcma)9`Fj)B6+Lgfj4cls#8MWMfHfo3oAtDglV8F3#f{bY(Nf}FHdu(Y&9gQ$< znxsfq>k5(r$zDGYPfxVZ?j&B#NNxNiE<*fn7aedRbU8f|_Kk9lj$x>08PJ3p- zT5!GjqRWOG@7G&IvRE zX4F+swg>iAE3RogX*;%mN}#T*ds3i&$jwoqyP{a7<-A#% zO`F9S_9EVd1B}HjT8^D-!AEgO$3bpXHKw6~cHGZEi)H5Ok?5X5CR33u!;vV8a3}_W z2Ml}!9Sk>gqTq0cRMftrfW~azvk zZE4G&b#oU@sV3j@xNCgI^2Zf1!=77El*<^77)at{!Ss*i-NfpYV>#}<|ij5%y zXK+>t-B%96nv8da0#On;!wN|0I47{Rs#7@_!!Y9VW5mD{7^SeMtZCOH`W;chsrB7g zV;I9l9ph`Yp?Xt@#=w)fB%rH?F+R-;$SVGVQYv1*l)^1Ei>X*|Q8MNwqz8RrRWQD9%l&&_1kTP*r+ zGNU>x=Sb@(VCuLoaPY(Y8<;|t&`N=4_EzQmc*q^wW!ba+#iVq54`}7imVs%^P-Igw zP=N#gFHB;!F|T8e&Hn?j8pxx-%q#waLK<0MwRYE(*=9E-?&9K;I*L?9jcEfO=uRiS zgKm!8?p)JeEoJ;wfgc+-}fmnf!wV&F~uRG_IueO#d@fy-e4>x%1M z{M9VLXq-Pc@C*Esx#Z2F$UD(SC5Ngaqr8N%dFCX2)J^r46AZL%Lc=z;wox;Fi{I<` zoxuK$wDJ2HE6ZDv$Da2G{E^*wa3FK`;eLV5E~~~VDdt-S8qnB++jvLEpKFM#YH#2# z@{DZEsl9Y83uxB{V_3x<9q+Q^Y{V61n#kV6U#W%Jf|+*wb!{-Hz#1Ku z`J1;E2N!*deIk}|%U;$Rw&e}a2rs-xsCi2*@pfUkKCdjvA!f#PEXPmb5TmZ+ zty<$BL+3Z0-&*)=;(v1qF;1|+H&1M#CDVphes1HMB%gxMhQuQrqcX2%Z78=Jyy7!g}BF@cDgphVKB=Anvh=&NNpTQlYzvBwpDUQ-x1=>EO6tpZnyU?Hmvx-@H#D7IL*OY+2t1Afno0)Wps@tru7Ia| zS1~9s)^`WPSErM`5Xi?>!nfNcatE1LQzRoQ3d7^%OQ2cGd=obh?!%dZqf00WmigO|V zY5Am(7ZdN``6awyF5`=1EBF!v{i+5g>vau%tN1oykciuOV--KH!=v?k>sRqJ_9eOs z-=PxId@TQ0-iwBV-^6MmjI+D6`l~~U)!Y(Gii59;iFB(1c;4PK9 z(;R&nzh>-fr9$wuPtZP8T&IeUmp~3l#ii*$<8#+-{DxuuX%%nFLRlK^S;2}#tf_*P m4Fo7~iK9?SZOeubG=XiT>3uBIrG~$$HFs49l5OMf!2bXfxB7Je diff --git a/Debate_backend/target/classes/db/wx_miniapp.sql b/Debate_backend/target/classes/db/wx_miniapp.sql deleted file mode 100644 index bb65f98..0000000 --- a/Debate_backend/target/classes/db/wx_miniapp.sql +++ /dev/null @@ -1,22 +0,0 @@ --- 创建数据库 -CREATE DATABASE IF NOT EXISTS wx_miniapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - --- 使用数据库 -USE wx_miniapp; - --- 创建微信用户表 -CREATE TABLE IF NOT EXISTS `wx_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `openid` varchar(100) NOT NULL COMMENT '微信openid', - `nickname` varchar(50) DEFAULT NULL COMMENT '昵称', - `avatar_url` varchar(500) DEFAULT NULL COMMENT '头像URL', - `gender` tinyint(4) DEFAULT NULL COMMENT '性别 0-未知 1-男 2-女', - `country` varchar(50) DEFAULT NULL COMMENT '国家', - `province` varchar(50) DEFAULT NULL COMMENT '省份', - `city` varchar(50) DEFAULT NULL COMMENT '城市', - `language` varchar(50) DEFAULT NULL COMMENT '语言', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_openid` (`openid`) COMMENT 'openid唯一索引' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信用户表'; \ No newline at end of file diff --git a/Debate_backend/target/classes/mapper/WxArgumentMapper.xml b/Debate_backend/target/classes/mapper/WxArgumentMapper.xml new file mode 100644 index 0000000..bbfd472 --- /dev/null +++ b/Debate_backend/target/classes/mapper/WxArgumentMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + id, conversation_id, topic, stance, content, user_message, sequence, create_time + + + + + + + + INSERT INTO wx_argument_record ( + conversation_id, topic, stance, content, user_message, sequence, create_time + ) + VALUES ( + #{conversationId,jdbcType=BIGINT}, + #{topic,jdbcType=VARCHAR}, + #{stance,jdbcType=VARCHAR}, + #{content,jdbcType=LONGVARCHAR}, + #{userMessage,jdbcType=LONGVARCHAR}, + #{sequence,jdbcType=INTEGER}, + #{createTime,jdbcType=TIMESTAMP} + ) + + diff --git a/Debate_backend/target/classes/mapper/WxConversationMapper.xml b/Debate_backend/target/classes/mapper/WxConversationMapper.xml new file mode 100644 index 0000000..ebc18ea --- /dev/null +++ b/Debate_backend/target/classes/mapper/WxConversationMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + id, user_id, type, title, preview, create_time, update_time + + + + + + + + INSERT INTO wx_conversation ( + user_id, type, title, preview, create_time, update_time + ) + VALUES ( + #{userId}, #{type}, #{title}, #{preview}, #{createTime}, #{updateTime} + ) + + + + + UPDATE wx_conversation + SET + preview = #{preview}, + update_time = NOW() + WHERE id = #{conversationId} + + + diff --git a/Debate_backend/target/classes/mapper/WxDebateMapper.xml b/Debate_backend/target/classes/mapper/WxDebateMapper.xml new file mode 100644 index 0000000..d5746d9 --- /dev/null +++ b/Debate_backend/target/classes/mapper/WxDebateMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + id, conversation_id, content, user_message, sequence, create_time + + + + + + INSERT INTO wx_debate_record ( + conversation_id, content, user_message, sequence, create_time + ) + VALUES ( + #{conversationId,jdbcType=BIGINT}, + #{content,jdbcType=LONGNVARCHAR}, + #{userMessage,jdbcType=LONGNVARCHAR}, + #{sequence,jdbcType=INTEGER}, + #{createTime, jdbcType=TIMESTAMP} + ) + + diff --git a/Debate_backend/target/classes/mapper/WxReviewMapper.xml b/Debate_backend/target/classes/mapper/WxReviewMapper.xml new file mode 100644 index 0000000..a3ea922 --- /dev/null +++ b/Debate_backend/target/classes/mapper/WxReviewMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + id, conversation_id, content, user_message, sequence, create_time + + + + + + INSERT INTO wx_review_record ( + conversation_id, content, user_message, sequence, create_time + ) + VALUES ( + #{conversationId,jdbcType=BIGINT}, + #{content,jdbcType=LONGNVARCHAR}, + #{userMessage,jdbcType=LONGNVARCHAR}, + #{sequence,jdbcType=INTEGER}, + #{createTime, jdbcType=TIMESTAMP} + ) + + diff --git a/database/database.sql b/database/database.sql deleted file mode 100644 index 350ac16..0000000 --- a/database/database.sql +++ /dev/null @@ -1,19 +0,0 @@ -create database if not exists wx_miniapp default charset utf8mb4; - -use wx_miniapp; - -CREATE TABLE IF NOT EXISTS `wx_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `openid` varchar(100) NOT NULL COMMENT '微信openid', - `nickname` varchar(50) DEFAULT NULL COMMENT '昵称', - `avatar_url` varchar(500) DEFAULT NULL COMMENT '头像URL', - `gender` tinyint(4) DEFAULT NULL COMMENT '性别 0-未知 1-男 2-女', - `country` varchar(50) DEFAULT NULL COMMENT '国家', - `province` varchar(50) DEFAULT NULL COMMENT '省份', - `city` varchar(50) DEFAULT NULL COMMENT '城市', - `language` varchar(50) DEFAULT NULL COMMENT '语言', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_openid` (`openid`) COMMENT 'openid唯一索引' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信用户表'; \ No newline at end of file