更新API响应结构,添加用户登出和会话删除功能
- 在ApiResponse类中添加conflict方法以处理冲突响应 - 在UserController中实现用户登出功能,返回标准化的API响应 - 在ChatController中实现会话删除功能,返回相应的成功或错误信息 - 更新ErrorCode类,添加CONFLICT错误码以支持新的响应类型 - 修改OpenApiConfig中的API文档标题和描述 此提交增强了用户体验,提供了更清晰的错误处理和API文档。
This commit is contained in:
@@ -1,113 +1,131 @@
|
||||
-- Create database
|
||||
CREATE DATABASE IF NOT EXISTS chat CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
/*
|
||||
Navicat Premium Data Transfer
|
||||
|
||||
USE chat;
|
||||
Source Server : 云大
|
||||
Source Server Type : MySQL
|
||||
Source Server Version : 80405 (8.4.5)
|
||||
Source Host : 101.200.154.78:3306
|
||||
Source Schema : yunda_qa
|
||||
|
||||
-- 1. 用户主表
|
||||
CREATE TABLE users (
|
||||
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||
username VARCHAR(50) DEFAULT NULL COMMENT '昵称/展示名',
|
||||
password_hash VARCHAR(255) DEFAULT NULL COMMENT '哈希密码(可为空)',
|
||||
phone VARCHAR(20) UNIQUE DEFAULT NULL COMMENT '手机号',
|
||||
email VARCHAR(100)UNIQUE DEFAULT NULL COMMENT '邮箱',
|
||||
avatar_url VARCHAR(255) DEFAULT NULL,
|
||||
user_type ENUM('personal','enterprise','admin')
|
||||
NOT NULL DEFAULT 'personal' COMMENT '用户类型',
|
||||
membership_level_id SMALLINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '付费等级',
|
||||
status TINYINT NOT NULL DEFAULT 1 COMMENT '1=正常, 0=封禁',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
last_login_at DATETIME NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户主表';
|
||||
Target Server Type : MySQL
|
||||
Target Server Version : 80405 (8.4.5)
|
||||
File Encoding : 65001
|
||||
|
||||
-- 2. 第三方账号绑定表
|
||||
CREATE TABLE user_auth_accounts (
|
||||
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
provider ENUM('wechat_mini','wechat_open','google','github','apple','custom')
|
||||
NOT NULL COMMENT '登录方式',
|
||||
provider_user_id VARCHAR(100) NOT NULL COMMENT '第三方平台唯一ID',
|
||||
access_token VARCHAR(255) DEFAULT NULL,
|
||||
refresh_token VARCHAR(255) DEFAULT NULL,
|
||||
expires_at DATETIME DEFAULT NULL,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE KEY uq_provider_user (provider, provider_user_id),
|
||||
CONSTRAINT fk_auth_user FOREIGN KEY (user_id) REFERENCES users(id)
|
||||
ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='第三方登录账号绑定表';
|
||||
Date: 21/07/2025 09:29:04
|
||||
*/
|
||||
|
||||
-- 3. 会员等级表
|
||||
CREATE TABLE membership_levels (
|
||||
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||
name VARCHAR(50) NOT NULL,
|
||||
price_month DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '月费',
|
||||
daily_msg_limit INT UNSIGNED NOT NULL DEFAULT 20,
|
||||
features JSON DEFAULT NULL COMMENT '权限 JSON',
|
||||
sort_order TINYINT NOT NULL DEFAULT 0,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员等级定义';
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- 4. 会话表(支持普通与研究模式)
|
||||
CREATE TABLE conversations (
|
||||
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
title VARCHAR(100) DEFAULT NULL,
|
||||
model_version VARCHAR(50) DEFAULT NULL COMMENT '使用模型版本',
|
||||
chat_mode ENUM('chat','research')
|
||||
NOT NULL DEFAULT 'chat' COMMENT 'chat=普通,research=深度研究',
|
||||
is_active TINYINT NOT NULL DEFAULT 1,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
CONSTRAINT fk_conv_user FOREIGN KEY (user_id) REFERENCES users(id)
|
||||
ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会话表';
|
||||
-- ----------------------------
|
||||
-- Table structure for conversation_research_meta
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `conversation_research_meta`;
|
||||
CREATE TABLE `conversation_research_meta` (
|
||||
`conversation_id` bigint UNSIGNED NOT NULL,
|
||||
`topic` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '研究主题',
|
||||
`goal` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '研究目标描述',
|
||||
`progress_json` json NULL COMMENT '阶段进度',
|
||||
`draft_report_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '草稿报告 ID(预留)',
|
||||
`cite_style` enum('APA','IEEE','GB/T-7714') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'APA',
|
||||
`tokens_consumed` int UNSIGNED NOT NULL DEFAULT 0,
|
||||
`last_summary_at` datetime NULL DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`conversation_id`) USING BTREE,
|
||||
CONSTRAINT `fk_research_conv` FOREIGN KEY (`conversation_id`) REFERENCES `conversations` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '深度研究元数据' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- 5. 深度研究扩展表
|
||||
CREATE TABLE conversation_research_meta (
|
||||
conversation_id BIGINT UNSIGNED PRIMARY KEY,
|
||||
topic VARCHAR(200) NOT NULL COMMENT '研究主题',
|
||||
goal TEXT DEFAULT NULL COMMENT '研究目标描述',
|
||||
progress_json JSON DEFAULT NULL COMMENT '阶段进度',
|
||||
draft_report_id BIGINT UNSIGNED DEFAULT NULL COMMENT '草稿报告 ID(预留)',
|
||||
cite_style ENUM('APA','IEEE','GB/T-7714') DEFAULT 'APA',
|
||||
tokens_consumed INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
last_summary_at DATETIME DEFAULT NULL,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
CONSTRAINT fk_research_conv FOREIGN KEY (conversation_id)
|
||||
REFERENCES conversations(id) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='深度研究元数据';
|
||||
-- ----------------------------
|
||||
-- Table structure for conversations
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `conversations`;
|
||||
CREATE TABLE `conversations` (
|
||||
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` bigint UNSIGNED NOT NULL,
|
||||
`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
|
||||
`model_version` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '使用模型版本',
|
||||
`chat_mode` enum('chat','research') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'chat' COMMENT 'chat=普通,research=深度研究',
|
||||
`is_active` tinyint NOT NULL DEFAULT 1,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
INDEX `fk_conv_user`(`user_id` ASC) USING BTREE,
|
||||
CONSTRAINT `fk_conv_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 89 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '会话表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- 6. 消息表
|
||||
CREATE TABLE messages (
|
||||
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||
conversation_id BIGINT UNSIGNED NOT NULL,
|
||||
sequence_no INT UNSIGNED NOT NULL COMMENT '会话内顺序编号',
|
||||
role ENUM('user','assistant','system','tool')
|
||||
NOT NULL,
|
||||
content LONGTEXT NOT NULL,
|
||||
tokens INT UNSIGNED DEFAULT NULL,
|
||||
latency_ms INT UNSIGNED DEFAULT NULL COMMENT '响应耗时',
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT fk_msg_conv FOREIGN KEY (conversation_id) REFERENCES conversations(id)
|
||||
ON DELETE CASCADE,
|
||||
UNIQUE KEY uq_conv_seq (conversation_id, sequence_no)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息表';
|
||||
-- ----------------------------
|
||||
-- Table structure for membership_levels
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `membership_levels`;
|
||||
CREATE TABLE `membership_levels` (
|
||||
`id` smallint UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
|
||||
`price_month` decimal(10, 2) NOT NULL DEFAULT 0.00 COMMENT '月费',
|
||||
`daily_msg_limit` int UNSIGNED NOT NULL DEFAULT 20,
|
||||
`features` json NULL COMMENT '权限 JSON',
|
||||
`sort_order` tinyint NOT NULL DEFAULT 0,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '会员等级定义' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- 7. 密码重置令牌表(用于密码重置功能)
|
||||
CREATE TABLE password_reset_tokens (
|
||||
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
token VARCHAR(255) NOT NULL UNIQUE,
|
||||
expires_at DATETIME NOT NULL,
|
||||
used TINYINT NOT NULL DEFAULT 0,
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
CONSTRAINT fk_reset_user FOREIGN KEY (user_id) REFERENCES users(id)
|
||||
ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='密码重置令牌表';
|
||||
-- ----------------------------
|
||||
-- Table structure for messages
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `messages`;
|
||||
CREATE TABLE `messages` (
|
||||
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`conversation_id` bigint UNSIGNED NOT NULL,
|
||||
`sequence_no` int UNSIGNED NOT NULL COMMENT '会话内顺序编号',
|
||||
`role` enum('user','assistant','system','tool') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
|
||||
`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
|
||||
`tokens` int UNSIGNED NULL DEFAULT NULL,
|
||||
`latency_ms` int UNSIGNED NULL DEFAULT NULL COMMENT '响应耗时',
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `uq_conv_seq`(`conversation_id` ASC, `sequence_no` ASC) USING BTREE,
|
||||
CONSTRAINT `fk_msg_conv` FOREIGN KEY (`conversation_id`) REFERENCES `conversations` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 241 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '消息表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- 插入默认会员等级数据
|
||||
INSERT INTO membership_levels (id, name, price_month, daily_msg_limit, features, sort_order) VALUES
|
||||
(1, '免费版', 0.00, 20, '{"models": ["gpt-3.5"], "features": ["basic_chat"]}', 1),
|
||||
(2, '专业版', 29.99, 100, '{"models": ["gpt-3.5", "gpt-4"], "features": ["basic_chat", "research_mode"]}', 2),
|
||||
(3, '企业版', 99.99, 1000, '{"models": ["gpt-3.5", "gpt-4", "gpt-4-turbo"], "features": ["basic_chat", "research_mode", "priority_support"]}', 3);
|
||||
-- ----------------------------
|
||||
-- Table structure for user_auth_accounts
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `user_auth_accounts`;
|
||||
CREATE TABLE `user_auth_accounts` (
|
||||
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` bigint UNSIGNED NOT NULL,
|
||||
`provider` enum('wechat_mini','wechat_open','google','github','apple','custom') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '登录方式',
|
||||
`provider_user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '第三方平台唯一ID',
|
||||
`access_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
|
||||
`refresh_token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
|
||||
`expires_at` datetime NULL DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `uq_provider_user`(`provider` ASC, `provider_user_id` ASC) USING BTREE,
|
||||
INDEX `fk_auth_user`(`user_id` ASC) USING BTREE,
|
||||
CONSTRAINT `fk_auth_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '第三方登录账号绑定表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for users
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `users`;
|
||||
CREATE TABLE `users` (
|
||||
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '昵称/展示名',
|
||||
`password_hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '哈希密码(可为空)',
|
||||
`phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手机号',
|
||||
`email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮箱',
|
||||
`avatar_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
|
||||
`user_type` enum('personal','enterprise','admin') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'personal' COMMENT '用户类型',
|
||||
`membership_level_id` smallint UNSIGNED NOT NULL DEFAULT 1 COMMENT '付费等级',
|
||||
`status` tinyint NOT NULL DEFAULT 1 COMMENT '1=正常, 0=封禁',
|
||||
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`last_login_at` datetime NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `phone`(`phone` ASC) USING BTREE,
|
||||
UNIQUE INDEX `email`(`email` ASC) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户主表' ROW_FORMAT = Dynamic;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
Reference in New Issue
Block a user