后台管理功能实现

This commit is contained in:
2025-10-28 17:30:47 +08:00
parent 3f651d8072
commit f7a3868f34
10 changed files with 4562 additions and 24 deletions
+74 -7
View File
@@ -1,10 +1,77 @@
---
inclusion: always
---
1.所有问答使用中文;
2.所有Controller层接口定义要完整,入参使用request封装,出参使用response封装;
3.除了特殊情况,不允许使用try-catch,交由全局异常处理机制处理异常;
4.未经允许不允许删除任何文件;
6.所有的新增代码要遵循当前的项目规范;
7.禁止使用批量脚本创建代码文件;
8.需要修改明显有问题的代码时直接自动操作修改代码,不要询问;
## 基础设置
1. 保持对话语言为中文/英文
2. 根据当前的操作系统环境确定要使用的是什么类型的操作命令,Mac或者Windows系统的操作命令是不一样的
3. 执行终端命令时要关注执行情况,避免无效等待
## 代码规范
4. 生成代码时必须添加类级和函数级注释
5. 使用import导包,禁止使用全限定名称引用类
6. 禁止使用枚举类型作为entity、request、response、dto对象的字段类型
7. 新增数据的id使用已存在的雪花算法生成器生成
## 架构规范
8. 所有开发必须遵循当前项目规范
9. Controller层禁止添加业务逻辑
10. 使用全局异常处理,禁止使用try-catch
11. 前端接口访问尽可能走网关调用
## 接口设计规范
12. Controller层接口定义要完整:
- 入参使用request封装传递到service层
- service层的方法命名与controller层定义的接口的方法名称保持一致
- 出参使用response封装由service层传递到controller层
- 禁止在controller层做entity/domain对象与request/response的转换
- 使用项目已有的Result做接口返回
13. 接口和方法参数不允许超过两个,超过时使用request或DTO对象封装
14. Controller层路由禁止添加/api前缀
15. Controller层接口的Mapping注解value属性值不允许重复且不允许为空
16. 用户相关接口禁止直接传递用户id,需要后端根据token获取当前登录用户信息
17. Controller层接口的Mapping注解(PostMapping、GetMapping、PutMapping、DeleteMapping等)的value属性值要简洁明了,与接口作用相关,名称不宜过长,使用驼峰结构命名
18. 禁止使用/{param}格式的路径参数,避免网关路由冲突和分发错误
19. 所有接口注解必须明确指定value属性,不允许使用空注解
20. 路径参数统一使用@RequestParam而非@PathVariable,确保网关分发准确性
21. 接口路径命名应具有明确的语义,避免使用通用词汇如/get、/list等
22. 批量操作接口应使用专门的Request对象封装参数,而非直接传递List
23. 接口路径应避免层级过深,建议不超过3级路径结构
24. 更新操作应直接使用封装了ID和其他数据的Request对象,而不是单独传递ID参数。Service层方法应保持参数简洁,业务逻辑所需数据应全部包含在Request对象中
## 环境配置
25. 为不同环境(local、dev、prod)创建单独配置文件,部署时通过参数选择
26. 启动服务时禁止擅自修改端口号,使用配置文件中的端口设置
## 数据库规范
27. 所有数据表必须包含创建时间(create_time)和更新时间(update_time)字段
28. 删除操作优先使用逻辑删除,添加deleted字段标识
29. 数据库字段命名使用下划线分隔,Java实体类使用驼峰命名
30. 优先使用LambdaQueryWrapper构造条件查询,避免硬编码字段名
31. 使用Lambda表达式引用实体类属性,提高代码可维护性和类型安全
32. 复杂查询条件应使用LambdaQueryWrapper的链式调用,保持代码清晰
33. 避免在查询条件中使用字符串字段名,防止字段名变更导致的运行时错误
## 安全规范
34. 所有外部输入必须进行参数校验
35. 敏感信息不得在日志中输出
36. 数据库操作必须使用参数化查询,防止SQL注入
## 性能规范
37. 避免N+1查询问题,合理使用批量查询
38. 大数据量查询必须分页处理
39. 缓存策略要考虑数据一致性问题
## 日志规范
40. 关键业务操作必须记录操作日志
41. 异常信息要包含足够的上下文信息
42. 生产环境禁止输出debug级别日志
## 修改规范
43. 代码修改时,只修改用户指定的业务逻辑和代码,解决用户指定的问题,不得随意修改其他无关代码
@@ -1,6 +1,7 @@
package com.emotion.config;
import com.emotion.interceptor.AuthInterceptor;
import com.emotion.interceptor.AdminAuthInterceptor;
import com.emotion.interceptor.UserContextInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
@@ -21,6 +22,9 @@ public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Autowired
private AdminAuthInterceptor adminAuthInterceptor;
@Autowired
private UserContextInterceptor userContextInterceptor;
@@ -29,11 +33,17 @@ public class WebConfig implements WebMvcConfigurer {
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 认证拦截器
// 管理员认证拦截器 - 优先级最高
registry.addInterceptor(adminAuthInterceptor)
.addPathPatterns("/admin/**")
.order(1);
// 用户认证拦截器
registry.addInterceptor(authInterceptor)
.addPathPatterns("/**")
.excludePathPatterns(
"/auth/**",
"/admin/**", // 排除管理员接口,由AdminAuthInterceptor处理
"/error",
"/favicon.ico",
"/actuator/**",
@@ -45,7 +55,8 @@ public class WebConfig implements WebMvcConfigurer {
"/doc.html",
"/static/**",
"/public/**"
);
)
.order(2);
// 用户上下文拦截器
registry.addInterceptor(userContextInterceptor)
@@ -62,7 +73,8 @@ public class WebConfig implements WebMvcConfigurer {
"/doc.html",
"/static/**",
"/public/**"
);
)
.order(3);
}
/**
@@ -98,11 +98,13 @@ public class AdminAuthInterceptor implements HandlerInterceptor {
private boolean isPublicAdminEndpoint(String requestURI) {
String[] publicEndpoints = {
"/admin/auth/login",
"/admin/auth/refreshToken"
"/admin/auth/refreshToken",
"/api/admin/auth/login", // 包含context-path的路径
"/api/admin/auth/refreshToken" // 包含context-path的路径
};
for (String endpoint : publicEndpoints) {
if (requestURI.equals(endpoint)) {
if (requestURI.equals(endpoint) || requestURI.endsWith(endpoint)) {
return true;
}
}
@@ -40,7 +40,8 @@ public class AdminAuthServiceImpl implements AdminAuthService {
@Autowired
private JwtUtil jwtUtil;
private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
@Autowired
private org.springframework.security.crypto.password.PasswordEncoder passwordEncoder;
private static final String ADMIN_TOKEN_PREFIX = "admin_token:";
private static final String ADMIN_REFRESH_TOKEN_PREFIX = "admin_refresh_token:";
@@ -92,13 +92,13 @@ public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements
.map(this::convertToResponse)
.collect(Collectors.toList());
return PageResult.<AdminResponse>builder()
.records(responseList)
.total(adminPage.getTotal())
.current(adminPage.getCurrent())
.size(adminPage.getSize())
.pages(adminPage.getPages())
.build();
PageResult<AdminResponse> result = new PageResult<>();
result.setRecords(responseList);
result.setTotal(adminPage.getTotal());
result.setCurrent(adminPage.getCurrent());
result.setSize(adminPage.getSize());
result.setPages(adminPage.getPages());
return result;
}
@Override
+260
View File
@@ -936,5 +936,265 @@ WHERE
ORDER BY
TABLE_NAME;
-- ============================================================================
-- 19. AI接口配置表 (t_ai_config)
-- 用于存储各种AI接口的调用配置,支持从配置文件迁移到数据库管理
-- ============================================================================
CREATE TABLE t_ai_config (
id VARCHAR(64) PRIMARY KEY COMMENT 'UUID主键',
config_name VARCHAR(100) NOT NULL COMMENT '配置名称',
config_key VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键值 (唯一标识)',
config_type VARCHAR(50) NOT NULL DEFAULT 'coze' COMMENT '配置类型: coze-扣子, openai-OpenAI, claude-Claude, gemini-Gemini等',
provider VARCHAR(50) NOT NULL COMMENT '服务提供商: coze, openai, anthropic, google等',
-- API基础配置
api_base_url VARCHAR(500) NOT NULL COMMENT 'API基础URL',
api_token VARCHAR(1000) NOT NULL COMMENT 'API访问令牌 (加密存储)',
api_version VARCHAR(20) COMMENT 'API版本',
-- 模型配置
model_name VARCHAR(100) COMMENT '模型名称',
bot_id VARCHAR(100) COMMENT 'Bot ID (Coze专用)',
workflow_id VARCHAR(100) COMMENT 'Workflow ID (Coze专用)',
-- 请求配置
timeout_ms INT DEFAULT 30000 COMMENT '超时时间(毫秒)',
retry_count INT DEFAULT 3 COMMENT '重试次数',
retry_delay_ms INT DEFAULT 1000 COMMENT '重试延迟(毫秒)',
max_tokens INT DEFAULT 4000 COMMENT '最大Token数',
temperature DECIMAL(3,2) DEFAULT 0.7 COMMENT '温度参数 (0.0-2.0)',
top_p DECIMAL(3,2) DEFAULT 1.0 COMMENT 'Top-p参数 (0.0-1.0)',
-- 功能配置
support_stream TINYINT DEFAULT 1 COMMENT '是否支持流式输出: 0-不支持, 1-支持',
support_function_call TINYINT DEFAULT 0 COMMENT '是否支持函数调用: 0-不支持, 1-支持',
support_vision TINYINT DEFAULT 0 COMMENT '是否支持视觉理解: 0-不支持, 1-支持',
support_file_upload TINYINT DEFAULT 0 COMMENT '是否支持文件上传: 0-不支持, 1-支持',
-- 使用场景配置
usage_scenario VARCHAR(100) NOT NULL COMMENT '使用场景: chat-聊天, summary-总结, emotion_analysis-情绪分析, content_generation-内容生成等',
priority INT DEFAULT 0 COMMENT '优先级 (数值越大优先级越高)',
-- 费用配置
input_price_per_1k DECIMAL(10,6) DEFAULT 0.000000 COMMENT '输入Token价格(每1K)',
output_price_per_1k DECIMAL(10,6) DEFAULT 0.000000 COMMENT '输出Token价格(每1K)',
currency VARCHAR(10) DEFAULT 'USD' COMMENT '货币单位',
-- 限制配置
rate_limit_per_minute INT DEFAULT 60 COMMENT '每分钟请求限制',
rate_limit_per_hour INT DEFAULT 3600 COMMENT '每小时请求限制',
rate_limit_per_day INT DEFAULT 86400 COMMENT '每日请求限制',
-- 状态配置
is_enabled TINYINT DEFAULT 1 COMMENT '是否启用: 0-禁用, 1-启用',
is_default TINYINT DEFAULT 0 COMMENT '是否为默认配置: 0-否, 1-是',
environment VARCHAR(20) DEFAULT 'production' COMMENT '环境: development-开发, testing-测试, production-生产',
-- 扩展配置
custom_headers JSON COMMENT '自定义请求头',
custom_params JSON COMMENT '自定义参数',
webhook_url VARCHAR(500) COMMENT 'Webhook回调地址',
-- 监控配置
health_check_url VARCHAR(500) COMMENT '健康检查URL',
health_check_interval_minutes INT DEFAULT 5 COMMENT '健康检查间隔(分钟)',
-- 描述信息
description TEXT COMMENT '配置描述',
usage_notes TEXT COMMENT '使用说明',
-- 公共字段
create_by VARCHAR(64) COMMENT '创建人ID',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '更新人ID',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
is_deleted TINYINT DEFAULT 0 COMMENT '是否删除: 0-未删除, 1-已删除',
remarks VARCHAR(500) COMMENT '备注'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'AI接口配置表 (t_ai_config)';
-- AI配置表索引
CREATE INDEX idx_ai_config_config_key ON t_ai_config (config_key);
CREATE INDEX idx_ai_config_config_type ON t_ai_config (config_type);
CREATE INDEX idx_ai_config_provider ON t_ai_config (provider);
CREATE INDEX idx_ai_config_usage_scenario ON t_ai_config (usage_scenario);
CREATE INDEX idx_ai_config_is_enabled ON t_ai_config (is_enabled);
CREATE INDEX idx_ai_config_is_default ON t_ai_config (is_default);
CREATE INDEX idx_ai_config_environment ON t_ai_config (environment);
CREATE INDEX idx_ai_config_priority ON t_ai_config (priority);
CREATE INDEX idx_ai_config_create_time ON t_ai_config (create_time);
CREATE INDEX idx_ai_config_update_time ON t_ai_config (update_time);
CREATE INDEX idx_ai_config_is_deleted ON t_ai_config (is_deleted);
CREATE INDEX idx_ai_config_scenario_enabled ON t_ai_config (usage_scenario, is_enabled);
CREATE INDEX idx_ai_config_type_enabled ON t_ai_config (config_type, is_enabled);
-- ============================================================================
-- AI配置初始化数据
-- 基于AiChatServiceImpl.java中的配置参数创建默认配置
-- ============================================================================
-- 1. Coze聊天配置 (默认聊天场景)
INSERT INTO t_ai_config (
id, config_name, config_key, config_type, provider,
api_base_url, api_token, api_version,
bot_id, workflow_id,
timeout_ms, retry_count, retry_delay_ms, max_tokens, temperature,
support_stream, support_function_call, support_vision, support_file_upload,
usage_scenario, priority, is_enabled, is_default, environment,
input_price_per_1k, output_price_per_1k, currency,
rate_limit_per_minute, rate_limit_per_hour, rate_limit_per_day,
description, usage_notes,
create_time, update_time, is_deleted
) VALUES (
REPLACE(UUID(), '-', ''),
'Coze聊天机器人配置',
'coze.chat.default',
'coze',
'coze',
'https://api.coze.cn',
'sat_WgqusMh5gTfgRhsEFycGA5n9NailrJYV1rHeruJCHNB1gAvJz4laprLsvK8i2jEL',
'v3',
'7523042446285439016',
'7523047462895796287',
30000, 3, 1000, 4000, 0.7,
1, 1, 0, 0,
'chat', 100, 1, 1, 'production',
0.001000, 0.002000, 'USD',
60, 3600, 86400,
'Coze平台的默认聊天机器人配置,用于日常情绪对话',
'1. 需要配置有效的API Token\n2. 需要配置Bot ID和Workflow ID\n3. 支持流式输出和函数调用',
NOW(), NOW(), 0
);
-- 2. Coze总结配置 (专用于对话总结)
INSERT INTO t_ai_config (
id, config_name, config_key, config_type, provider,
api_base_url, api_token, api_version,
bot_id, workflow_id,
timeout_ms, retry_count, retry_delay_ms, max_tokens, temperature,
support_stream, support_function_call, support_vision, support_file_upload,
usage_scenario, priority, is_enabled, is_default, environment,
input_price_per_1k, output_price_per_1k, currency,
rate_limit_per_minute, rate_limit_per_hour, rate_limit_per_day,
description, usage_notes,
create_time, update_time, is_deleted
) VALUES (
REPLACE(UUID(), '-', ''),
'Coze对话总结配置',
'coze.summary.default',
'coze',
'coze',
'https://api.coze.cn',
'sat_WgqusMh5gTfgRhsEFycGA5n9NailrJYV1rHeruJCHNB1gAvJz4laprLsvK8i2jEL',
'v3',
'7529062814150295595',
'7523047462895796287',
30000, 3, 1000, 8000, 0.3,
0, 0, 0, 0,
'summary', 90, 1, 1, 'production',
0.001000, 0.002000, 'USD',
30, 1800, 43200,
'Coze平台的对话总结配置,专门用于生成对话摘要和情绪分析',
'1. 使用较低的temperature以获得更稳定的总结结果\n2. 增加max_tokens以支持长文本总结\n3. 不支持流式输出',
NOW(), NOW(), 0
);
-- 3. Coze情绪分析配置 (专用于情绪分析)
INSERT INTO t_ai_config (
id, config_name, config_key, config_type, provider,
api_base_url, api_token, api_version,
bot_id, workflow_id,
timeout_ms, retry_count, retry_delay_ms, max_tokens, temperature,
support_stream, support_function_call, support_vision, support_file_upload,
usage_scenario, priority, is_enabled, is_default, environment,
input_price_per_1k, output_price_per_1k, currency,
rate_limit_per_minute, rate_limit_per_hour, rate_limit_per_day,
description, usage_notes,
create_time, update_time, is_deleted
) VALUES (
REPLACE(UUID(), '-', ''),
'Coze情绪分析配置',
'coze.emotion_analysis.default',
'coze',
'coze',
'https://api.coze.cn',
'sat_WgqusMh5gTfgRhsEFycGA5n9NailrJYV1rHeruJCHNB1gAvJz4laprLsvK8i2jEL',
'v3',
'7529062814150295595', -- 复用总结bot,或配置专门的情绪分析bot
'7523047462895796287', -- 复用总结workflow,或配置专门的情绪分析workflow
45000, 3, 1500, 6000, 0.2,
0, 1, 0, 0,
'emotion_analysis', 95, 1, 1, 'production',
0.001000, 0.002000, 'USD',
20, 1200, 28800,
'Coze平台的情绪分析配置,用于分析用户聊天记录的情绪状态',
'1. 使用最低的temperature以获得准确的情绪分析\n2. 支持函数调用以获取结构化的分析结果\n3. 增加超时时间以处理复杂的情绪分析',
NOW(), NOW(), 0
);
-- 4. 备用OpenAI配置 (作为备选方案)
INSERT INTO t_ai_config (
id, config_name, config_key, config_type, provider,
api_base_url, api_token, api_version,
model_name,
timeout_ms, retry_count, retry_delay_ms, max_tokens, temperature, top_p,
support_stream, support_function_call, support_vision, support_file_upload,
usage_scenario, priority, is_enabled, is_default, environment,
input_price_per_1k, output_price_per_1k, currency,
rate_limit_per_minute, rate_limit_per_hour, rate_limit_per_day,
description, usage_notes,
create_time, update_time, is_deleted
) VALUES (
REPLACE(UUID(), '-', ''),
'OpenAI GPT-4备用配置',
'openai.gpt4.backup',
'openai',
'openai',
'https://api.openai.com/v1',
'sk-placeholder-openai-api-key-here', -- 需要配置实际的OpenAI API Key
'v1',
'gpt-4-turbo-preview',
30000, 3, 2000, 4000, 0.7, 1.0,
1, 1, 1, 1,
'chat', 50, 0, 0, 'production', -- 默认禁用,作为备用
0.010000, 0.030000, 'USD',
60, 3600, 86400,
'OpenAI GPT-4备用配置,当Coze服务不可用时的备选方案',
'1. 需要配置有效的OpenAI API Key\n2. 支持视觉理解和文件上传\n3. 成本较高,建议作为备用方案',
NOW(), NOW(), 0
);
-- 5. 开发环境测试配置
INSERT INTO t_ai_config (
id, config_name, config_key, config_type, provider,
api_base_url, api_token, api_version,
bot_id, workflow_id,
timeout_ms, retry_count, retry_delay_ms, max_tokens, temperature,
support_stream, support_function_call, support_vision, support_file_upload,
usage_scenario, priority, is_enabled, is_default, environment,
input_price_per_1k, output_price_per_1k, currency,
rate_limit_per_minute, rate_limit_per_hour, rate_limit_per_day,
description, usage_notes,
create_time, update_time, is_deleted
) VALUES (
REPLACE(UUID(), '-', ''),
'Coze开发环境测试配置',
'coze.chat.development',
'coze',
'coze',
'https://api.coze.cn',
'sat_WgqusMh5gTfgRhsEFycGA5n9NailrJYV1rHeruJCHNB1gAvJz4laprLsvK8i2jEL', -- 开发环境可使用相同token或配置专门的开发token
'v3',
'7523042446285439016', -- 开发环境可使用相同bot-id或配置专门的开发bot-id
'7523047462895796287', -- 开发环境可使用相同workflow-id或配置专门的开发workflow-id
10000, 2, 500, 2000, 0.8,
1, 1, 0, 0,
'chat', 80, 1, 0, 'development',
0.000500, 0.001000, 'USD',
120, 7200, 172800,
'Coze平台开发环境测试配置,用于开发和调试',
'1. 开发环境专用配置\n2. 较短的超时时间和更高的请求限制\n3. 用于功能测试和调试',
NOW(), NOW(), 0
);
-- 提交事务
COMMIT;
+1 -1
View File
@@ -1,4 +1,4 @@
# 开发环境配置
VITE_APP_TITLE=情绪博物馆管理后台
VITE_APP_BASE_API=/api
VITE_APP_BASE_API=http://localhost:19089/api
VITE_APP_PORT=5174
+2 -1
View File
@@ -1,3 +1,4 @@
# 生产环境配置
VITE_APP_TITLE=情绪博物馆管理后台
VITE_APP_BASE_API=/api
# 生产环境需要配置实际的后端服务器地址
VITE_APP_BASE_API=http://localhost:19089/api
+4194
View File
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -13,8 +13,9 @@ export default defineConfig({
port: 5174,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
target: 'http://localhost:19089',
changeOrigin: true,
rewrite: (path) => path
}
}
},