feat: 完成Nacos配置优化和WebSocket集成
主要更新: 1. 统一所有微服务端口配置(19000-19008) 2. 为所有服务创建本地/测试/生产三套环境配置 3. 配置Nacos认证密码(本地:Peanut2817*#, 测试/生产:EmotionMuseum2025) 4. 优化网关路由配置,支持负载均衡和WebSocket 5. 新增emotion-websocket模块,支持实时聊天 6. 前端集成WebSocket,替代HTTP轮询 7. 添加配置验证和管理工具脚本 技术特性: - 完整的环境隔离和服务发现 - WebSocket实时通信支持 - 负载均衡路由配置 - 跨域和安全配置 - 自动重连和心跳检测
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# 数据库配置
|
||||
MYSQL_ROOT_PASSWORD=123456
|
||||
MYSQL_DATABASE=emotion_museum
|
||||
MYSQL_USER=emotion
|
||||
MYSQL_PASSWORD=emotion123
|
||||
MYSQL_USER=emotion-museum
|
||||
MYSQL_PASSWORD=EmotionMuseum2025#
|
||||
|
||||
# Redis配置
|
||||
REDIS_PASSWORD=
|
||||
|
||||
Generated
+25
-2
@@ -16,17 +16,40 @@
|
||||
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.5.3.Final/mapstruct-processor-1.5.3.Final.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.5.3.Final/mapstruct-1.5.3.Final.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.5.3.Final/mapstruct-processor-1.5.3.Final.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.5.3.Final/mapstruct-1.5.3.Final.jar" />
|
||||
</processorPath>
|
||||
<module name="emotion-stats" />
|
||||
<module name="emotion-ai" />
|
||||
<module name="emotion-reward" />
|
||||
<module name="emotion-gateway" />
|
||||
<module name="emotion-user" />
|
||||
<module name="emotion-explore" />
|
||||
<module name="emotion-common" />
|
||||
<module name="emotion-growth" />
|
||||
<module name="emotion-record" />
|
||||
</profile>
|
||||
<profile name="Annotation profile for emotion-ai" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<processorPath useClasspath="false">
|
||||
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.5.3.Final/mapstruct-processor-1.5.3.Final.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.5.3.Final/mapstruct-1.5.3.Final.jar" />
|
||||
</processorPath>
|
||||
<module name="emotion-ai" />
|
||||
</profile>
|
||||
<profile name="Annotation profile for emotion-gateway" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<processorPath useClasspath="false">
|
||||
<entry name="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct-processor/1.5.3.Final/mapstruct-processor-1.5.3.Final.jar" />
|
||||
<entry name="$MAVEN_REPOSITORY$/org/mapstruct/mapstruct/1.5.3.Final/mapstruct-1.5.3.Final.jar" />
|
||||
</processorPath>
|
||||
<module name="emotion-gateway" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
<bytecodeTargetLevel>
|
||||
<module name="common" target="17" />
|
||||
|
||||
@@ -0,0 +1,269 @@
|
||||
# Nacos配置优化总结
|
||||
|
||||
## 概述
|
||||
|
||||
根据当前更新后的模块端口号和Nacos配置要求,已完成所有后台模块的Nacos配置优化,确保所有服务可以正确注册到Nacos上,并为每个模块创建了本地、测试、生产三套环境配置文件。
|
||||
|
||||
## 完成的工作
|
||||
|
||||
### 1. 端口配置统一
|
||||
|
||||
| 服务名称 | 端口 | 状态 | 描述 |
|
||||
|---------|------|------|------|
|
||||
| emotion-gateway | 19000 | ✅ 已配置 | 网关服务 |
|
||||
| emotion-user | 19001 | ✅ 已配置 | 用户服务(包含认证) |
|
||||
| emotion-ai | 19002 | ✅ 已配置 | AI对话服务 |
|
||||
| emotion-record | 19003 | ✅ 已修正 | 情绪记录服务 |
|
||||
| emotion-growth | 19004 | ✅ 已配置 | 成长课题服务 |
|
||||
| emotion-explore | 19005 | ✅ 已配置 | 地图探索服务 |
|
||||
| emotion-reward | 19006 | ✅ 已配置 | 成就奖励服务 |
|
||||
| emotion-websocket | 19007 | ✅ 已配置 | WebSocket聊天服务 |
|
||||
| emotion-stats | 19008 | ✅ 已配置 | 统计分析服务 |
|
||||
|
||||
### 2. Nacos配置优化
|
||||
|
||||
#### 主配置文件更新 (`application.yml`)
|
||||
- ✅ 启用Nacos服务发现 (`enabled: true`)
|
||||
- ✅ 添加认证配置 (`username/password`)
|
||||
- ✅ 配置服务元数据 (`metadata`)
|
||||
- ✅ 设置心跳和超时参数
|
||||
- ✅ 配置集群和权重信息
|
||||
|
||||
#### 环境配置文件创建
|
||||
为每个服务创建了三套环境配置:
|
||||
|
||||
**本地环境** (`application-local.yml`)
|
||||
```yaml
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: nacos
|
||||
```
|
||||
|
||||
**测试环境** (`application-test.yml`)
|
||||
```yaml
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: nacos
|
||||
```
|
||||
|
||||
**生产环境** (`application-prod.yml`)
|
||||
```yaml
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: nacos
|
||||
```
|
||||
|
||||
### 3. 网关配置优化
|
||||
|
||||
#### 路由配置更新
|
||||
- ✅ 使用负载均衡 (`lb://service-name`)
|
||||
- ✅ 启用服务发现 (`locator.enabled: true`)
|
||||
- ✅ 配置跨域支持 (`globalcors`)
|
||||
- ✅ 支持WebSocket路由
|
||||
|
||||
#### 完整路由列表
|
||||
```yaml
|
||||
routes:
|
||||
# 用户相关服务
|
||||
- /user/** → lb://emotion-user
|
||||
- /captcha/** → lb://emotion-user
|
||||
- /oauth/** → lb://emotion-user
|
||||
|
||||
# AI相关服务
|
||||
- /ai/** → lb://emotion-ai
|
||||
- /websocket/** → lb://emotion-websocket
|
||||
- /ws/** → lb://emotion-websocket
|
||||
|
||||
# 业务功能服务
|
||||
- /record/** → lb://emotion-record
|
||||
- /growth/** → lb://emotion-growth
|
||||
- /explore/** → lb://emotion-explore
|
||||
- /reward/** → lb://emotion-reward
|
||||
- /stats/** → lb://emotion-stats
|
||||
```
|
||||
|
||||
### 4. 特殊服务配置
|
||||
|
||||
#### emotion-ai服务
|
||||
- ✅ 添加Coze平台配置
|
||||
- ✅ 配置功能开关
|
||||
- ✅ AI模型参数配置
|
||||
|
||||
#### emotion-websocket服务
|
||||
- ✅ 添加WebSocket配置
|
||||
- ✅ 配置STOMP和SockJS
|
||||
- ✅ 设置消息代理
|
||||
|
||||
### 5. 数据库和Redis配置
|
||||
|
||||
#### 环境差异化配置
|
||||
**本地环境**
|
||||
```yaml
|
||||
datasource:
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
```
|
||||
|
||||
**测试/生产环境**
|
||||
```yaml
|
||||
datasource:
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
redis:
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
```
|
||||
|
||||
## 工具脚本
|
||||
|
||||
### 1. 批量配置生成脚本
|
||||
- **文件**: `backend/update-nacos-config.sh`
|
||||
- **功能**: 批量为所有服务生成Nacos配置文件
|
||||
- **使用**: `./backend/update-nacos-config.sh`
|
||||
|
||||
### 2. 配置验证脚本
|
||||
- **文件**: `backend/verify-nacos-config.sh`
|
||||
- **功能**: 验证所有服务的配置文件完整性
|
||||
- **使用**: `./backend/verify-nacos-config.sh`
|
||||
|
||||
## Nacos服务器配置
|
||||
|
||||
### 认证配置
|
||||
根据提供的Nacos配置,已配置:
|
||||
```properties
|
||||
nacos.core.auth.enabled=false
|
||||
nacos.core.auth.admin.enabled=true
|
||||
nacos.core.auth.console.enabled=true
|
||||
nacos.core.auth.server.identity.key=nacosServerIdentity
|
||||
nacos.core.auth.server.identity.value=Peanut2817*#
|
||||
```
|
||||
|
||||
### 客户端认证
|
||||
所有服务配置了统一的认证信息:
|
||||
- **用户名**: nacos
|
||||
- **密码**: nacos
|
||||
|
||||
## 启动方式
|
||||
|
||||
### 1. 指定环境启动
|
||||
```bash
|
||||
# 本地环境
|
||||
mvn spring-boot:run -Dspring-boot.run.profiles=local
|
||||
|
||||
# 测试环境
|
||||
mvn spring-boot:run -Dspring-boot.run.profiles=test
|
||||
|
||||
# 生产环境
|
||||
mvn spring-boot:run -Dspring-boot.run.profiles=prod
|
||||
```
|
||||
|
||||
### 2. JAR包启动
|
||||
```bash
|
||||
# 本地环境
|
||||
java -jar app.jar --spring.profiles.active=local
|
||||
|
||||
# 测试环境
|
||||
java -jar app.jar --spring.profiles.active=test
|
||||
|
||||
# 生产环境
|
||||
java -jar app.jar --spring.profiles.active=prod
|
||||
```
|
||||
|
||||
## 验证结果
|
||||
|
||||
### 配置验证通过
|
||||
```
|
||||
===========================================
|
||||
验证结果统计
|
||||
===========================================
|
||||
总服务数: 9
|
||||
验证成功: 9
|
||||
验证失败: 0
|
||||
🎉 所有服务配置验证通过!
|
||||
```
|
||||
|
||||
### 服务注册验证
|
||||
启动服务后,可通过以下方式验证:
|
||||
|
||||
1. **Nacos控制台**: http://47.111.10.27:8848/nacos
|
||||
2. **服务列表**: 查看所有服务是否正确注册
|
||||
3. **健康检查**: 确认服务状态为UP
|
||||
|
||||
## 环境隔离
|
||||
|
||||
### 命名空间配置
|
||||
- **本地环境**: 默认命名空间 (空)
|
||||
- **测试环境**: test命名空间
|
||||
- **生产环境**: prod命名空间
|
||||
|
||||
### 配置隔离
|
||||
- 不同环境使用不同的数据库和Redis实例
|
||||
- 日志级别按环境调整
|
||||
- 服务发现配置环境隔离
|
||||
|
||||
## 监控和日志
|
||||
|
||||
### 日志配置
|
||||
- **本地环境**: DEBUG级别,详细日志
|
||||
- **测试环境**: INFO级别,适中日志
|
||||
- **生产环境**: WARN级别,精简日志
|
||||
|
||||
### 日志文件
|
||||
- 格式: `logs/{service-name}-{env}.log`
|
||||
- 示例: `logs/emotion-user-local.log`
|
||||
|
||||
## 后续优化建议
|
||||
|
||||
1. **配置中心**: 启用Nacos配置中心功能
|
||||
2. **服务监控**: 集成Prometheus和Grafana
|
||||
3. **链路追踪**: 添加Sleuth和Zipkin
|
||||
4. **熔断降级**: 集成Sentinel
|
||||
5. **安全加固**: 配置服务间认证
|
||||
|
||||
## 总结
|
||||
|
||||
✅ **完成项目**:
|
||||
- 所有9个微服务的Nacos配置已完成
|
||||
- 端口配置已统一和修正
|
||||
- 三套环境配置文件已创建
|
||||
- 网关路由配置已优化
|
||||
- 配置验证100%通过
|
||||
|
||||
✅ **关键特性**:
|
||||
- 支持环境隔离
|
||||
- 自动服务发现
|
||||
- 负载均衡路由
|
||||
- 跨域支持
|
||||
- WebSocket支持
|
||||
|
||||
现在所有服务都可以正确注册到Nacos,通过网关进行统一访问,支持多环境部署!🚀
|
||||
@@ -0,0 +1,270 @@
|
||||
# Nacos配置最终总结
|
||||
|
||||
## 概述
|
||||
|
||||
已完成所有后台模块的Nacos配置优化,包括端口统一、环境配置文件创建和密码配置更新。所有服务现在可以正确注册到Nacos并通过网关进行统一访问。
|
||||
|
||||
## 最终配置状态
|
||||
|
||||
### 1. 服务端口配置 ✅
|
||||
|
||||
| 服务名称 | 端口 | 状态 | 描述 |
|
||||
|---------|------|------|------|
|
||||
| emotion-gateway | 19000 | ✅ 已配置 | 网关服务 |
|
||||
| emotion-user | 19001 | ✅ 已配置 | 用户服务(包含认证) |
|
||||
| emotion-ai | 19002 | ✅ 已配置 | AI对话服务 |
|
||||
| emotion-record | 19003 | ✅ 已修正 | 情绪记录服务 |
|
||||
| emotion-growth | 19004 | ✅ 已配置 | 成长课题服务 |
|
||||
| emotion-explore | 19005 | ✅ 已配置 | 地图探索服务 |
|
||||
| emotion-reward | 19006 | ✅ 已配置 | 成就奖励服务 |
|
||||
| emotion-websocket | 19007 | ✅ 已配置 | WebSocket聊天服务 |
|
||||
| emotion-stats | 19008 | ✅ 已配置 | 统计分析服务 |
|
||||
|
||||
### 2. Nacos密码配置 ✅
|
||||
|
||||
#### 环境密码配置
|
||||
- **本地环境** (`application-local.yml`): `Peanut2817*#`
|
||||
- **测试环境** (`application-test.yml`): `EmotionMuseum2025`
|
||||
- **生产环境** (`application-prod.yml`): `EmotionMuseum2025`
|
||||
|
||||
#### 验证结果
|
||||
```bash
|
||||
# 本地环境密码验证
|
||||
grep "password: Peanut2817*#" backend/emotion-*/src/main/resources/application-local.yml
|
||||
# 结果: 18个匹配项 (9个服务 × 2个配置项)
|
||||
|
||||
# 测试环境密码验证
|
||||
grep "password: EmotionMuseum2025" backend/emotion-*/src/main/resources/application-test.yml
|
||||
# 结果: 18个匹配项
|
||||
|
||||
# 生产环境密码验证
|
||||
grep "password: EmotionMuseum2025" backend/emotion-*/src/main/resources/application-prod.yml
|
||||
# 结果: 18个匹配项
|
||||
```
|
||||
|
||||
### 3. 环境配置文件 ✅
|
||||
|
||||
每个服务都包含完整的三套环境配置:
|
||||
|
||||
#### 本地环境配置示例
|
||||
```yaml
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
```
|
||||
|
||||
#### 测试环境配置示例
|
||||
```yaml
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: test
|
||||
```
|
||||
|
||||
#### 生产环境配置示例
|
||||
```yaml
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: prod
|
||||
```
|
||||
|
||||
### 4. 网关路由配置 ✅
|
||||
|
||||
#### 完整路由映射
|
||||
```yaml
|
||||
routes:
|
||||
# 用户相关服务
|
||||
- /user/** → lb://emotion-user:19001
|
||||
- /captcha/** → lb://emotion-user:19001
|
||||
- /oauth/** → lb://emotion-user:19001
|
||||
|
||||
# AI相关服务
|
||||
- /ai/** → lb://emotion-ai:19002
|
||||
- /websocket/** → lb://emotion-websocket:19007
|
||||
- /ws/** → lb://emotion-websocket:19007 (WebSocket)
|
||||
|
||||
# 业务功能服务
|
||||
- /record/** → lb://emotion-record:19003
|
||||
- /growth/** → lb://emotion-growth:19004
|
||||
- /explore/** → lb://emotion-explore:19005
|
||||
- /reward/** → lb://emotion-reward:19006
|
||||
- /stats/** → lb://emotion-stats:19008
|
||||
```
|
||||
|
||||
#### 特殊配置
|
||||
- ✅ 跨域支持 (`globalcors`)
|
||||
- ✅ WebSocket协议升级支持
|
||||
- ✅ 负载均衡 (`lb://`)
|
||||
- ✅ 服务发现集成
|
||||
|
||||
### 5. 特殊服务配置 ✅
|
||||
|
||||
#### emotion-ai服务
|
||||
```yaml
|
||||
# Coze平台配置
|
||||
coze:
|
||||
base-url: https://api.coze.cn
|
||||
bot-id: 7523042446285439016
|
||||
workflow-id: 7523047462895796287
|
||||
token: pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
||||
|
||||
# 功能开关
|
||||
features:
|
||||
emotion-analysis:
|
||||
enabled: false
|
||||
chat:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
#### emotion-websocket服务
|
||||
```yaml
|
||||
# WebSocket配置
|
||||
websocket:
|
||||
allowed-origins: "*"
|
||||
sockjs:
|
||||
enabled: true
|
||||
heartbeat-time: 25000
|
||||
stomp:
|
||||
broker:
|
||||
enabled: true
|
||||
destinations: ["/topic", "/queue"]
|
||||
application-destination-prefixes: ["/app"]
|
||||
```
|
||||
|
||||
## 启动方式
|
||||
|
||||
### 1. 环境指定启动
|
||||
```bash
|
||||
# 本地环境
|
||||
mvn spring-boot:run -Dspring-boot.run.profiles=local
|
||||
|
||||
# 测试环境
|
||||
mvn spring-boot:run -Dspring-boot.run.profiles=test
|
||||
|
||||
# 生产环境
|
||||
mvn spring-boot:run -Dspring-boot.run.profiles=prod
|
||||
```
|
||||
|
||||
### 2. JAR包启动
|
||||
```bash
|
||||
# 本地环境
|
||||
java -jar app.jar --spring.profiles.active=local
|
||||
|
||||
# 测试环境
|
||||
java -jar app.jar --spring.profiles.active=test
|
||||
|
||||
# 生产环境
|
||||
java -jar app.jar --spring.profiles.active=prod
|
||||
```
|
||||
|
||||
## 验证工具
|
||||
|
||||
### 1. 配置验证脚本
|
||||
```bash
|
||||
./backend/verify-nacos-config.sh
|
||||
```
|
||||
|
||||
### 2. 密码更新脚本
|
||||
```bash
|
||||
./backend/update-nacos-passwords.sh
|
||||
```
|
||||
|
||||
### 3. 网关路由测试
|
||||
```bash
|
||||
./backend/emotion-gateway/test-gateway-routes.sh
|
||||
```
|
||||
|
||||
## 环境隔离
|
||||
|
||||
### 命名空间配置
|
||||
- **本地环境**: 默认命名空间 (空字符串)
|
||||
- **测试环境**: `test` 命名空间
|
||||
- **生产环境**: `prod` 命名空间
|
||||
|
||||
### 数据库配置
|
||||
- **本地环境**: `localhost:3306`, 密码: `123456`
|
||||
- **测试环境**: `47.111.10.27:3306`, 密码: `EmotionMuseum2025*#`
|
||||
- **生产环境**: `47.111.10.27:3306`, 密码: `EmotionMuseum2025*#`
|
||||
|
||||
### Redis配置
|
||||
- **本地环境**: `localhost:6379`, 无密码
|
||||
- **测试环境**: `47.111.10.27:6379`, 密码: `EmotionMuseum2025*#`
|
||||
- **生产环境**: `47.111.10.27:6379`, 密码: `EmotionMuseum2025*#`
|
||||
|
||||
## 配置文件清单
|
||||
|
||||
### 每个服务包含的配置文件
|
||||
```
|
||||
backend/{service-name}/src/main/resources/
|
||||
├── application.yml # 主配置文件
|
||||
├── application-local.yml # 本地环境配置
|
||||
├── application-test.yml # 测试环境配置
|
||||
└── application-prod.yml # 生产环境配置
|
||||
```
|
||||
|
||||
### 总计配置文件数量
|
||||
- **9个服务** × **4个配置文件** = **36个配置文件**
|
||||
- 所有配置文件都已创建并验证通过 ✅
|
||||
|
||||
## 最终验证结果
|
||||
|
||||
```
|
||||
===========================================
|
||||
验证结果统计
|
||||
===========================================
|
||||
总服务数: 9
|
||||
验证成功: 9
|
||||
验证失败: 0
|
||||
🎉 所有服务配置验证通过!
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
✅ **已完成的工作**:
|
||||
1. 统一了所有9个微服务的端口配置
|
||||
2. 为每个服务创建了完整的三套环境配置文件
|
||||
3. 配置了正确的Nacos认证密码
|
||||
4. 优化了网关路由配置,支持负载均衡和WebSocket
|
||||
5. 添加了特殊服务的专用配置
|
||||
6. 创建了验证和管理工具脚本
|
||||
|
||||
✅ **关键特性**:
|
||||
- 完整的环境隔离 (local/test/prod)
|
||||
- 统一的服务发现和注册
|
||||
- 负载均衡路由
|
||||
- WebSocket支持
|
||||
- 跨域配置
|
||||
- 安全认证
|
||||
|
||||
现在所有服务都可以正确注册到Nacos,通过网关进行统一访问,支持多环境部署!🚀
|
||||
|
||||
**下一步**: 提交代码到远程仓库
|
||||
@@ -0,0 +1,156 @@
|
||||
# 情感博物馆项目优化总结
|
||||
|
||||
## 已完成的工作
|
||||
|
||||
### 1. 创建了emotion-auth统一认证模块
|
||||
- ✅ 创建了emotion-auth模块的基础结构
|
||||
- ✅ 移动了认证相关的代码到auth模块
|
||||
- ✅ 配置了auth模块的pom.xml和Dockerfile
|
||||
- ✅ 更新了父pom.xml包含auth模块
|
||||
|
||||
### 2. 优化了配置文件管理
|
||||
- ✅ 统一了所有服务的application.yml配置
|
||||
- ✅ 添加了环境变量支持:`spring.profiles.active: ${SPRING_PROFILES_ACTIVE:local}`
|
||||
- ✅ 创建了application-local.yml本地环境配置文件
|
||||
- ✅ 配置了Bean覆盖和循环引用支持
|
||||
|
||||
### 3. 优化了启动脚本
|
||||
- ✅ 创建了支持环境参数的启动脚本:`./start-services.sh [env]`
|
||||
- ✅ 默认使用local环境,支持dev、prod等环境切换
|
||||
- ✅ 添加了基础服务检查(MySQL、Redis)
|
||||
- ✅ 添加了服务状态检查和日志输出
|
||||
|
||||
### 4. 统一了Coze API配置
|
||||
- ✅ 在AI服务中配置了统一的Coze API参数
|
||||
- ✅ 所有环境使用相同的Coze配置
|
||||
|
||||
### 5. 清理了无用文件
|
||||
- ✅ 删除了测试文件和重复的配置文件
|
||||
- ✅ 删除了不再使用的启动脚本
|
||||
|
||||
### 6. 前端网关配置
|
||||
- ✅ 更新了前端vite.config.js,统一通过网关访问后端
|
||||
- ✅ 更新了网关路由配置,支持所有服务的路由转发
|
||||
- ✅ 创建了.env.local环境配置文件
|
||||
|
||||
## 已解决的问题
|
||||
|
||||
### 1. 循环依赖问题 ✅
|
||||
**问题描述:** 用户服务存在Bean循环依赖问题
|
||||
```
|
||||
jwtAuthenticationFilter -> userDetailsServiceImpl -> userServiceImpl -> securityConfig -> jwtAuthenticationFilter
|
||||
```
|
||||
|
||||
**解决方案:**
|
||||
1. ✅ 创建独立的AuthenticationConfig类,分离认证相关Bean配置
|
||||
2. ✅ 使用@Lazy注解延迟加载关键依赖
|
||||
3. ✅ 通过ApplicationContext获取Bean,避免直接依赖
|
||||
4. ✅ 修复验证码配置中的初始化问题
|
||||
|
||||
### 2. 服务启动成功 ✅
|
||||
所有核心服务现在都能正常启动:
|
||||
- ✅ 用户服务 (19001) - 运行正常
|
||||
- ✅ AI服务 (19002) - 运行正常
|
||||
- ✅ 网关服务 (19000) - 运行正常
|
||||
|
||||
### 3. 配置文件问题 ✅
|
||||
- ✅ 修复了重复的profiles配置
|
||||
- ✅ 统一了环境变量配置格式
|
||||
- ✅ 修复了pom.xml中缺失的主类配置
|
||||
|
||||
## 下一步工作计划
|
||||
|
||||
### 优先级1:完善网关路由和安全配置 🔄
|
||||
1. **修复网关路由问题**
|
||||
- 配置用户服务的安全白名单,允许actuator端点访问
|
||||
- 为AI服务添加actuator端点配置
|
||||
- 测试网关路由功能
|
||||
|
||||
2. **完善前端集成**
|
||||
- 测试前端通过网关访问后端API
|
||||
- 验证用户注册登录功能
|
||||
- 测试AI对话功能
|
||||
|
||||
### 优先级2:完善emotion-auth模块
|
||||
1. **实现认证服务接口**
|
||||
- 完成AuthService实现类
|
||||
- 实现JWT Token管理
|
||||
- 实现用户认证逻辑
|
||||
|
||||
2. **配置服务间调用**
|
||||
- 配置Feign客户端
|
||||
- 实现服务间认证传递
|
||||
- 配置统一的异常处理
|
||||
|
||||
### 优先级3:扩展其他微服务
|
||||
1. **启动其他微服务**
|
||||
- emotion-record (记录服务)
|
||||
- emotion-growth (成长服务)
|
||||
- emotion-explore (探索服务)
|
||||
- emotion-reward (奖励服务)
|
||||
- emotion-stats (统计服务)
|
||||
|
||||
2. **完整功能测试**
|
||||
- 测试所有微服务的启动和通信
|
||||
- 验证完整的业务流程
|
||||
- 性能测试和优化
|
||||
|
||||
## 使用说明
|
||||
|
||||
### 启动服务
|
||||
```bash
|
||||
# 使用默认local环境启动
|
||||
./start-services.sh
|
||||
|
||||
# 使用指定环境启动
|
||||
./start-services.sh dev
|
||||
./start-services.sh prod
|
||||
```
|
||||
|
||||
### 停止服务
|
||||
```bash
|
||||
./stop-services.sh
|
||||
```
|
||||
|
||||
### 查看日志
|
||||
```bash
|
||||
# 查看用户服务日志
|
||||
tail -f logs/emotion-user-local.log
|
||||
|
||||
# 查看AI服务日志
|
||||
tail -f logs/emotion-ai-local.log
|
||||
|
||||
# 查看网关服务日志
|
||||
tail -f logs/emotion-gateway-local.log
|
||||
```
|
||||
|
||||
### 环境变量配置
|
||||
可以通过环境变量覆盖默认配置:
|
||||
- `SPRING_PROFILES_ACTIVE`: 指定激活的配置文件
|
||||
- `MYSQL_HOST`, `MYSQL_PORT`, `MYSQL_USERNAME`, `MYSQL_PASSWORD`: 数据库配置
|
||||
- `REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD`: Redis配置
|
||||
- `COZE_API_TOKEN`: Coze API令牌
|
||||
|
||||
## 项目结构
|
||||
```
|
||||
backend/
|
||||
├── emotion-common/ # 公共模块
|
||||
├── emotion-auth/ # 认证授权服务 (新增)
|
||||
├── emotion-user/ # 用户服务
|
||||
├── emotion-ai/ # AI服务
|
||||
├── emotion-gateway/ # 网关服务
|
||||
├── emotion-record/ # 记录服务
|
||||
├── emotion-growth/ # 成长服务
|
||||
├── emotion-explore/ # 探索服务
|
||||
├── emotion-reward/ # 奖励服务
|
||||
├── emotion-stats/ # 统计服务
|
||||
├── start-services.sh # 启动脚本
|
||||
├── stop-services.sh # 停止脚本
|
||||
└── logs/ # 日志目录
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
1. 确保MySQL和Redis服务已启动
|
||||
2. 首次启动可能需要较长时间进行编译
|
||||
3. 如遇到端口占用,脚本会自动跳过该服务
|
||||
4. 建议在解决循环依赖问题后再进行完整的功能测试
|
||||
@@ -1,259 +0,0 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# MySQL数据库
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
container_name: emotion-mysql
|
||||
restart: always
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: 123456
|
||||
MYSQL_DATABASE: emotion_museum
|
||||
MYSQL_CHARACTER_SET_SERVER: utf8mb4
|
||||
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
- ./mysql_emotion_museum_final.sql:/docker-entrypoint-initdb.d/init.sql
|
||||
command: --default-authentication-plugin=mysql_native_password
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# Redis缓存
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
container_name: emotion-redis
|
||||
restart: always
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# Nacos注册中心
|
||||
nacos:
|
||||
image: nacos/nacos-server:v2.2.3
|
||||
container_name: emotion-nacos
|
||||
restart: always
|
||||
environment:
|
||||
MODE: standalone
|
||||
SPRING_DATASOURCE_PLATFORM: mysql
|
||||
MYSQL_SERVICE_HOST: mysql
|
||||
MYSQL_SERVICE_PORT: 3306
|
||||
MYSQL_SERVICE_DB_NAME: nacos
|
||||
MYSQL_SERVICE_USER: root
|
||||
MYSQL_SERVICE_PASSWORD: 123456
|
||||
MYSQL_SERVICE_DB_PARAM: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
|
||||
ports:
|
||||
- "8848:8848"
|
||||
- "9848:9848"
|
||||
depends_on:
|
||||
- mysql
|
||||
volumes:
|
||||
- nacos_logs:/home/nacos/logs
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# 用户服务
|
||||
emotion-user:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-user/Dockerfile
|
||||
container_name: emotion-user
|
||||
restart: always
|
||||
ports:
|
||||
- "19001:19001"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 123456
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
- nacos
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# AI服务
|
||||
emotion-ai:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-ai/Dockerfile
|
||||
container_name: emotion-ai
|
||||
restart: always
|
||||
ports:
|
||||
- "19002:19002"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 123456
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
- nacos
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# 记录服务
|
||||
emotion-record:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-record/Dockerfile
|
||||
container_name: emotion-record
|
||||
restart: always
|
||||
ports:
|
||||
- "19003:19003"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 123456
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
- nacos
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# 成长服务
|
||||
emotion-growth:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-growth/Dockerfile
|
||||
container_name: emotion-growth
|
||||
restart: always
|
||||
ports:
|
||||
- "19004:19004"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 123456
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
- nacos
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# 探索服务
|
||||
emotion-explore:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-explore/Dockerfile
|
||||
container_name: emotion-explore
|
||||
restart: always
|
||||
ports:
|
||||
- "19005:19005"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 123456
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
- nacos
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# 奖励服务
|
||||
emotion-reward:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-reward/Dockerfile
|
||||
container_name: emotion-reward
|
||||
restart: always
|
||||
ports:
|
||||
- "19006:19006"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 123456
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
- nacos
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# 统计服务
|
||||
emotion-stats:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-stats/Dockerfile
|
||||
container_name: emotion-stats
|
||||
restart: always
|
||||
ports:
|
||||
- "19007:19007"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 123456
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
- nacos
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
# 网关服务
|
||||
emotion-gateway:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: emotion-gateway/Dockerfile
|
||||
container_name: emotion-gateway
|
||||
restart: always
|
||||
ports:
|
||||
- "19000:19000"
|
||||
environment:
|
||||
SPRING_PROFILES_ACTIVE: local
|
||||
SPRING_DATA_REDIS_HOST: redis
|
||||
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
|
||||
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
|
||||
depends_on:
|
||||
- emotion-user
|
||||
- emotion-ai
|
||||
- emotion-record
|
||||
- emotion-growth
|
||||
- emotion-explore
|
||||
- emotion-reward
|
||||
- emotion-stats
|
||||
networks:
|
||||
- emotion-network
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
redis_data:
|
||||
nacos_logs:
|
||||
|
||||
networks:
|
||||
emotion-network:
|
||||
driver: bridge
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -95,6 +95,17 @@
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
<configuration>
|
||||
<mainClass>com.emotionmuseum.ai.AiApplication</mainClass>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
@@ -1,89 +1,82 @@
|
||||
server:
|
||||
port: 19002
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-ai
|
||||
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 1
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-wait: -1ms
|
||||
max-idle: 8
|
||||
min-idle: 0
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
logic-delete-field: isDeleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
|
||||
# Nacos配置
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
register-enabled: true
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
|
||||
# Coze API配置
|
||||
# Coze平台配置
|
||||
coze:
|
||||
api:
|
||||
base-url: https://api.coze.cn
|
||||
token: ${COZE_API_TOKEN:your_coze_api_token}
|
||||
bot-id: 7523042446285439016
|
||||
workflow-id: 7523047462895796287
|
||||
timeout: 30000
|
||||
base-url: https://api.coze.cn
|
||||
api-key: your-coze-api-key
|
||||
bot-id: 7523042446285439016
|
||||
workflow-id: 7523047462895796287
|
||||
user-id: emotion-museum-user
|
||||
token: pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
||||
timeout: 60
|
||||
max-retries: 3
|
||||
stream: false
|
||||
model:
|
||||
temperature: 0.7
|
||||
max-tokens: 1000
|
||||
top-p: 0.9
|
||||
frequency-penalty: 0.0
|
||||
presence-penalty: 0.0
|
||||
|
||||
# 功能开关配置
|
||||
features:
|
||||
emotion-analysis:
|
||||
enabled: false
|
||||
auto-analyze: false
|
||||
chat:
|
||||
enabled: true
|
||||
stream: false
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
org.springframework.web: debug
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-ai-local.log
|
||||
|
||||
# 管理端点配置
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: nacos
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: nacos
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# Coze平台配置
|
||||
coze:
|
||||
base-url: https://api.coze.cn
|
||||
api-key: your-coze-api-key
|
||||
bot-id: 7523042446285439016
|
||||
workflow-id: 7523047462895796287
|
||||
user-id: emotion-museum-user
|
||||
token: pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
||||
timeout: 60
|
||||
max-retries: 3
|
||||
stream: false
|
||||
model:
|
||||
temperature: 0.7
|
||||
max-tokens: 1000
|
||||
top-p: 0.9
|
||||
frequency-penalty: 0.0
|
||||
presence-penalty: 0.0
|
||||
|
||||
# 功能开关配置
|
||||
features:
|
||||
emotion-analysis:
|
||||
enabled: false
|
||||
auto-analyze: false
|
||||
chat:
|
||||
enabled: true
|
||||
stream: false
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-ai-local.log
|
||||
@@ -1,95 +1,55 @@
|
||||
server:
|
||||
port: 9002
|
||||
# 生产环境配置
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-ai
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: ${NACOS_SERVER_ADDR:localhost:8848}
|
||||
namespace: public
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
ip: ${SERVER_IP:localhost}
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
environment: prod
|
||||
zone: prod
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:emotion_museum}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: ${MYSQL_USERNAME:root}
|
||||
password: ${MYSQL_PASSWORD:123456}
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
hikari:
|
||||
pool-name: EmotionAiHikariCP
|
||||
minimum-idle: 5
|
||||
maximum-pool-size: 20
|
||||
auto-commit: true
|
||||
idle-timeout: 30000
|
||||
max-lifetime: 1800000
|
||||
connection-timeout: 30000
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: ${REDIS_HOST:localhost}
|
||||
port: ${REDIS_PORT:6379}
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
timeout: 3000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 20
|
||||
max-idle: 10
|
||||
min-idle: 5
|
||||
max-wait: 3000ms
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
id-type: input
|
||||
logic-delete-field: is_deleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
mapper-locations: classpath*:mapper/*.xml
|
||||
|
||||
# Coze平台配置
|
||||
coze:
|
||||
base-url: ${COZE_BASE_URL:https://api.coze.cn}
|
||||
api-key: ${COZE_API_KEY:your-coze-api-key}
|
||||
bot-id: ${COZE_BOT_ID:7523042446285439016}
|
||||
workflow-id: ${COZE_WORKFLOW_ID:7523047462895796287}
|
||||
user-id: ${COZE_USER_ID:emotion-museum-user}
|
||||
token: pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
||||
timeout: 60
|
||||
max-retries: 3
|
||||
stream: false
|
||||
model:
|
||||
temperature: 0.7
|
||||
max-tokens: 1000
|
||||
top-p: 0.9
|
||||
frequency-penalty: 0.0
|
||||
presence-penalty: 0.0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: INFO
|
||||
com.baomidou.mybatisplus: DEBUG
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
|
||||
|
||||
# 管理端点
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
com.emotionmuseum: warn
|
||||
com.baomidou.mybatisplus: warn
|
||||
com.alibaba.nacos: error
|
||||
file:
|
||||
name: logs/emotion-ai-prod.log
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# 测试环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: test
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: info
|
||||
com.baomidou.mybatisplus: info
|
||||
com.alibaba.nacos: warn
|
||||
file:
|
||||
name: logs/emotion-ai-test.log
|
||||
@@ -4,44 +4,58 @@ server:
|
||||
spring:
|
||||
application:
|
||||
name: emotion-ai
|
||||
|
||||
# 配置文件激活
|
||||
profiles:
|
||||
active: dev
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
database: 0
|
||||
timeout: 3000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 20
|
||||
max-idle: 10
|
||||
min-idle: 5
|
||||
max-wait: 3000ms
|
||||
# 本地数据库配置(备用)
|
||||
active: ${SPRING_PROFILES_ACTIVE:local}
|
||||
|
||||
# 允许Bean覆盖和循环引用
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
||||
allow-circular-references: true
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
username: ${DB_USERNAME:root}
|
||||
password: ${DB_PASSWORD:123456}
|
||||
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:emotion_museum}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: ${MYSQL_USERNAME:root}
|
||||
password: ${MYSQL_PASSWORD:123456}
|
||||
hikari:
|
||||
minimum-idle: 5
|
||||
maximum-pool-size: 20
|
||||
auto-commit: true
|
||||
idle-timeout: 30000
|
||||
pool-name: EmotionAiHikariCP
|
||||
max-lifetime: 1800000
|
||||
connection-timeout: 30000
|
||||
connection-test-query: SELECT 1
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: ${REDIS_HOST:localhost}
|
||||
port: ${REDIS_PORT:6379}
|
||||
password: ${REDIS_PASSWORD:}
|
||||
database: 1
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-wait: -1ms
|
||||
max-idle: 8
|
||||
min-idle: 0
|
||||
# Nacos配置
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace: emotion-dev
|
||||
group: DEFAULT_GROUP
|
||||
enabled: false
|
||||
server-addr: ${NACOS_HOST:localhost}:${NACOS_PORT:8848}
|
||||
namespace: ${NACOS_NAMESPACE:}
|
||||
group: ${NACOS_GROUP:DEFAULT_GROUP}
|
||||
enabled: ${NACOS_DISCOVERY_ENABLED:false}
|
||||
config:
|
||||
enabled: false
|
||||
server-addr: ${NACOS_HOST:localhost}:${NACOS_PORT:8848}
|
||||
namespace: ${NACOS_NAMESPACE:}
|
||||
group: ${NACOS_GROUP:DEFAULT_GROUP}
|
||||
file-extension: yml
|
||||
enabled: ${NACOS_CONFIG_ENABLED:false}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,89 +1,82 @@
|
||||
server:
|
||||
port: 19002
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-ai
|
||||
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 1
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-wait: -1ms
|
||||
max-idle: 8
|
||||
min-idle: 0
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
logic-delete-field: isDeleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
|
||||
# Nacos配置
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
register-enabled: true
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
|
||||
# Coze API配置
|
||||
# Coze平台配置
|
||||
coze:
|
||||
api:
|
||||
base-url: https://api.coze.cn
|
||||
token: ${COZE_API_TOKEN:your_coze_api_token}
|
||||
bot-id: 7523042446285439016
|
||||
workflow-id: 7523047462895796287
|
||||
timeout: 30000
|
||||
base-url: https://api.coze.cn
|
||||
api-key: your-coze-api-key
|
||||
bot-id: 7523042446285439016
|
||||
workflow-id: 7523047462895796287
|
||||
user-id: emotion-museum-user
|
||||
token: pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
||||
timeout: 60
|
||||
max-retries: 3
|
||||
stream: false
|
||||
model:
|
||||
temperature: 0.7
|
||||
max-tokens: 1000
|
||||
top-p: 0.9
|
||||
frequency-penalty: 0.0
|
||||
presence-penalty: 0.0
|
||||
|
||||
# 功能开关配置
|
||||
features:
|
||||
emotion-analysis:
|
||||
enabled: false
|
||||
auto-analyze: false
|
||||
chat:
|
||||
enabled: true
|
||||
stream: false
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
org.springframework.web: debug
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-ai-local.log
|
||||
|
||||
# 管理端点配置
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: nacos
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: nacos
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# Coze平台配置
|
||||
coze:
|
||||
base-url: https://api.coze.cn
|
||||
api-key: your-coze-api-key
|
||||
bot-id: 7523042446285439016
|
||||
workflow-id: 7523047462895796287
|
||||
user-id: emotion-museum-user
|
||||
token: pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
||||
timeout: 60
|
||||
max-retries: 3
|
||||
stream: false
|
||||
model:
|
||||
temperature: 0.7
|
||||
max-tokens: 1000
|
||||
top-p: 0.9
|
||||
frequency-penalty: 0.0
|
||||
presence-penalty: 0.0
|
||||
|
||||
# 功能开关配置
|
||||
features:
|
||||
emotion-analysis:
|
||||
enabled: false
|
||||
auto-analyze: false
|
||||
chat:
|
||||
enabled: true
|
||||
stream: false
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-ai-local.log
|
||||
@@ -1,95 +1,55 @@
|
||||
server:
|
||||
port: 9002
|
||||
# 生产环境配置
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-ai
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: ${NACOS_SERVER_ADDR:localhost:8848}
|
||||
namespace: public
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
ip: ${SERVER_IP:localhost}
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
environment: prod
|
||||
zone: prod
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:emotion_museum}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: ${MYSQL_USERNAME:root}
|
||||
password: ${MYSQL_PASSWORD:123456}
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
hikari:
|
||||
pool-name: EmotionAiHikariCP
|
||||
minimum-idle: 5
|
||||
maximum-pool-size: 20
|
||||
auto-commit: true
|
||||
idle-timeout: 30000
|
||||
max-lifetime: 1800000
|
||||
connection-timeout: 30000
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: ${REDIS_HOST:localhost}
|
||||
port: ${REDIS_PORT:6379}
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
timeout: 3000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 20
|
||||
max-idle: 10
|
||||
min-idle: 5
|
||||
max-wait: 3000ms
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
id-type: input
|
||||
logic-delete-field: is_deleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
mapper-locations: classpath*:mapper/*.xml
|
||||
|
||||
# Coze平台配置
|
||||
coze:
|
||||
base-url: ${COZE_BASE_URL:https://api.coze.cn}
|
||||
api-key: ${COZE_API_KEY:your-coze-api-key}
|
||||
bot-id: ${COZE_BOT_ID:7523042446285439016}
|
||||
workflow-id: ${COZE_WORKFLOW_ID:7523047462895796287}
|
||||
user-id: ${COZE_USER_ID:emotion-museum-user}
|
||||
token: pat_GCR4qKzqpf90wMCvKsldMrB18KG3QsLDci65bZthssKsbLxu8X70BKYumleDcabO
|
||||
timeout: 60
|
||||
max-retries: 3
|
||||
stream: false
|
||||
model:
|
||||
temperature: 0.7
|
||||
max-tokens: 1000
|
||||
top-p: 0.9
|
||||
frequency-penalty: 0.0
|
||||
presence-penalty: 0.0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: INFO
|
||||
com.baomidou.mybatisplus: DEBUG
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
|
||||
|
||||
# 管理端点
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
com.emotionmuseum: warn
|
||||
com.baomidou.mybatisplus: warn
|
||||
com.alibaba.nacos: error
|
||||
file:
|
||||
name: logs/emotion-ai-prod.log
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# 测试环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: test
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: info
|
||||
com.baomidou.mybatisplus: info
|
||||
com.alibaba.nacos: warn
|
||||
file:
|
||||
name: logs/emotion-ai-test.log
|
||||
@@ -4,44 +4,58 @@ server:
|
||||
spring:
|
||||
application:
|
||||
name: emotion-ai
|
||||
|
||||
# 配置文件激活
|
||||
profiles:
|
||||
active: dev
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
database: 0
|
||||
timeout: 3000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 20
|
||||
max-idle: 10
|
||||
min-idle: 5
|
||||
max-wait: 3000ms
|
||||
# 本地数据库配置(备用)
|
||||
active: ${SPRING_PROFILES_ACTIVE:local}
|
||||
|
||||
# 允许Bean覆盖和循环引用
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
||||
allow-circular-references: true
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||
username: ${DB_USERNAME:root}
|
||||
password: ${DB_PASSWORD:123456}
|
||||
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:emotion_museum}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: ${MYSQL_USERNAME:root}
|
||||
password: ${MYSQL_PASSWORD:123456}
|
||||
hikari:
|
||||
minimum-idle: 5
|
||||
maximum-pool-size: 20
|
||||
auto-commit: true
|
||||
idle-timeout: 30000
|
||||
pool-name: EmotionAiHikariCP
|
||||
max-lifetime: 1800000
|
||||
connection-timeout: 30000
|
||||
connection-test-query: SELECT 1
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: ${REDIS_HOST:localhost}
|
||||
port: ${REDIS_PORT:6379}
|
||||
password: ${REDIS_PASSWORD:}
|
||||
database: 1
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-wait: -1ms
|
||||
max-idle: 8
|
||||
min-idle: 0
|
||||
# Nacos配置
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace: emotion-dev
|
||||
group: DEFAULT_GROUP
|
||||
enabled: false
|
||||
server-addr: ${NACOS_HOST:localhost}:${NACOS_PORT:8848}
|
||||
namespace: ${NACOS_NAMESPACE:}
|
||||
group: ${NACOS_GROUP:DEFAULT_GROUP}
|
||||
enabled: ${NACOS_DISCOVERY_ENABLED:false}
|
||||
config:
|
||||
enabled: false
|
||||
server-addr: ${NACOS_HOST:localhost}:${NACOS_PORT:8848}
|
||||
namespace: ${NACOS_NAMESPACE:}
|
||||
group: ${NACOS_GROUP:DEFAULT_GROUP}
|
||||
file-extension: yml
|
||||
enabled: ${NACOS_CONFIG_ENABLED:false}
|
||||
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,48 @@
|
||||
# 认证服务Dockerfile
|
||||
FROM openjdk:17-jdk-alpine
|
||||
|
||||
# 设置工作目录
|
||||
WORKDIR /app
|
||||
|
||||
# 安装必要的工具
|
||||
RUN apk add --no-cache curl tzdata && \
|
||||
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
|
||||
echo "Asia/Shanghai" > /etc/timezone
|
||||
|
||||
# 复制Maven构建文件
|
||||
COPY pom.xml ./
|
||||
COPY emotion-common ./emotion-common
|
||||
COPY emotion-auth ./emotion-auth
|
||||
|
||||
# 安装Maven
|
||||
RUN apk add --no-cache maven
|
||||
|
||||
# 构建应用
|
||||
RUN mvn clean package -DskipTests -pl emotion-auth -am
|
||||
|
||||
# 创建运行用户
|
||||
RUN addgroup -g 1000 emotion && \
|
||||
adduser -D -s /bin/sh -u 1000 -G emotion emotion
|
||||
|
||||
# 复制jar文件
|
||||
RUN cp emotion-auth/target/emotion-auth-*.jar app.jar
|
||||
|
||||
# 设置文件权限
|
||||
RUN chown -R emotion:emotion /app
|
||||
|
||||
# 切换到非root用户
|
||||
USER emotion
|
||||
|
||||
# 健康检查
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||
CMD curl -f http://localhost:19008/actuator/health || exit 1
|
||||
|
||||
# 暴露端口
|
||||
EXPOSE 19008
|
||||
|
||||
# 启动命令
|
||||
ENTRYPOINT ["java", "-jar", \
|
||||
"-Xms512m", "-Xmx1024m", \
|
||||
"-Djava.security.egd=file:/dev/./urandom", \
|
||||
"-Dspring.profiles.active=local", \
|
||||
"app.jar"]
|
||||
@@ -0,0 +1,144 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>com.emotionmuseum</groupId>
|
||||
<artifactId>backend</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>emotion-auth</artifactId>
|
||||
<name>emotion-auth</name>
|
||||
<description>情感博物馆认证授权服务</description>
|
||||
|
||||
<dependencies>
|
||||
<!-- 公共模块 -->
|
||||
<dependency>
|
||||
<groupId>com.emotionmuseum</groupId>
|
||||
<artifactId>emotion-common</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Boot Web -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Security -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Data JPA -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Data Redis -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- MySQL驱动 -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- MyBatis Plus -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- JWT -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 第三方登录 -->
|
||||
<dependency>
|
||||
<groupId>me.zhyd.oauth</groupId>
|
||||
<artifactId>JustAuth</artifactId>
|
||||
<version>1.16.5</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 验证码 -->
|
||||
<dependency>
|
||||
<groupId>com.github.whvcse</groupId>
|
||||
<artifactId>easy-captcha</artifactId>
|
||||
<version>1.6.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Nacos服务发现 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Nacos配置中心 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 监控 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 测试 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
<configuration>
|
||||
<mainClass>com.emotionmuseum.auth.AuthApplication</mainClass>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.emotionmuseum.auth;
|
||||
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
|
||||
/**
|
||||
* 认证服务启动类
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-16
|
||||
*/
|
||||
@SpringBootApplication(scanBasePackages = {"com.emotionmuseum"})
|
||||
@EnableDiscoveryClient
|
||||
@MapperScan("com.emotionmuseum.auth.mapper")
|
||||
public class AuthApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(AuthApplication.class, args);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.emotionmuseum.auth.config;
|
||||
|
||||
import com.wf.captcha.ArithmeticCaptcha;
|
||||
import com.wf.captcha.ChineseCaptcha;
|
||||
import com.wf.captcha.GifCaptcha;
|
||||
import com.wf.captcha.SpecCaptcha;
|
||||
import com.wf.captcha.base.Captcha;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* 验证码配置
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-15
|
||||
*/
|
||||
@Configuration
|
||||
public class CaptchaConfig {
|
||||
|
||||
/**
|
||||
* 算术验证码
|
||||
*/
|
||||
@Bean("arithmeticCaptcha")
|
||||
public Captcha arithmeticCaptcha() {
|
||||
ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
|
||||
captcha.setLen(2); // 几位数运算,默认是两位
|
||||
captcha.getArithmeticString(); // 获取运算的公式:3+2=?
|
||||
return captcha;
|
||||
}
|
||||
|
||||
/**
|
||||
* 中文验证码
|
||||
*/
|
||||
@Bean("chineseCaptcha")
|
||||
public Captcha chineseCaptcha() {
|
||||
ChineseCaptcha captcha = new ChineseCaptcha(130, 48);
|
||||
captcha.setLen(4); // 几个汉字,默认5个
|
||||
return captcha;
|
||||
}
|
||||
|
||||
/**
|
||||
* GIF验证码
|
||||
*/
|
||||
@Bean("gifCaptcha")
|
||||
public Captcha gifCaptcha() {
|
||||
GifCaptcha captcha = new GifCaptcha(130, 48);
|
||||
captcha.setLen(4); // 几位数字,默认5位
|
||||
return captcha;
|
||||
}
|
||||
|
||||
/**
|
||||
* PNG验证码
|
||||
*/
|
||||
@Bean("specCaptcha")
|
||||
public Captcha specCaptcha() {
|
||||
SpecCaptcha captcha = new SpecCaptcha(130, 48, 4);
|
||||
captcha.setCharType(Captcha.TYPE_DEFAULT); // 设置类型,纯数字、纯字母、字母数字混合
|
||||
return captcha;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package com.emotionmuseum.auth.config;
|
||||
|
||||
import me.zhyd.oauth.config.AuthConfig;
|
||||
import me.zhyd.oauth.request.*;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* 第三方登录配置
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-15
|
||||
*/
|
||||
@Configuration
|
||||
public class OAuthConfig {
|
||||
|
||||
@Value("${oauth.wechat.client-id:}")
|
||||
private String wechatClientId;
|
||||
|
||||
@Value("${oauth.wechat.client-secret:}")
|
||||
private String wechatClientSecret;
|
||||
|
||||
@Value("${oauth.wechat.redirect-uri:}")
|
||||
private String wechatRedirectUri;
|
||||
|
||||
@Value("${oauth.qq.client-id:}")
|
||||
private String qqClientId;
|
||||
|
||||
@Value("${oauth.qq.client-secret:}")
|
||||
private String qqClientSecret;
|
||||
|
||||
@Value("${oauth.qq.redirect-uri:}")
|
||||
private String qqRedirectUri;
|
||||
|
||||
@Value("${oauth.wechat-mp.client-id:}")
|
||||
private String wechatMpClientId;
|
||||
|
||||
@Value("${oauth.wechat-mp.client-secret:}")
|
||||
private String wechatMpClientSecret;
|
||||
|
||||
@Value("${oauth.wechat-mp.redirect-uri:}")
|
||||
private String wechatMpRedirectUri;
|
||||
|
||||
/**
|
||||
* 微信开放平台登录
|
||||
*/
|
||||
@Bean
|
||||
public AuthWeChatOpenRequest weChatOpenRequest() {
|
||||
return new AuthWeChatOpenRequest(AuthConfig.builder()
|
||||
.clientId(wechatClientId)
|
||||
.clientSecret(wechatClientSecret)
|
||||
.redirectUri(wechatRedirectUri)
|
||||
.build());
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信公众平台登录
|
||||
*/
|
||||
@Bean
|
||||
public AuthWeChatMpRequest weChatMpRequest() {
|
||||
return new AuthWeChatMpRequest(AuthConfig.builder()
|
||||
.clientId(wechatMpClientId)
|
||||
.clientSecret(wechatMpClientSecret)
|
||||
.redirectUri(wechatMpRedirectUri)
|
||||
.build());
|
||||
}
|
||||
|
||||
/**
|
||||
* QQ登录
|
||||
*/
|
||||
@Bean
|
||||
public AuthQqRequest qqRequest() {
|
||||
return new AuthQqRequest(AuthConfig.builder()
|
||||
.clientId(qqClientId)
|
||||
.clientSecret(qqClientSecret)
|
||||
.redirectUri(qqRedirectUri)
|
||||
.build());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.emotionmuseum.auth.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
|
||||
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||
|
||||
/**
|
||||
* Redis配置类
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-15
|
||||
*/
|
||||
@Configuration
|
||||
public class RedisConfig {
|
||||
|
||||
/**
|
||||
* 配置RedisTemplate
|
||||
*/
|
||||
@Bean
|
||||
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
|
||||
RedisTemplate<String, Object> template = new RedisTemplate<>();
|
||||
template.setConnectionFactory(connectionFactory);
|
||||
|
||||
// 使用String序列化器作为key的序列化器
|
||||
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
|
||||
template.setKeySerializer(stringRedisSerializer);
|
||||
template.setHashKeySerializer(stringRedisSerializer);
|
||||
|
||||
// 使用JSON序列化器作为value的序列化器
|
||||
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
|
||||
template.setValueSerializer(jsonRedisSerializer);
|
||||
template.setHashValueSerializer(jsonRedisSerializer);
|
||||
|
||||
template.afterPropertiesSet();
|
||||
return template;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
package com.emotionmuseum.auth.config;
|
||||
|
||||
import com.emotionmuseum.auth.security.JwtAuthenticationFilter;
|
||||
import com.emotionmuseum.auth.security.UserDetailsServiceImpl;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.authentication.AuthenticationManager;
|
||||
import org.springframework.security.authentication.AuthenticationProvider;
|
||||
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
|
||||
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
|
||||
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
|
||||
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.cors.CorsConfigurationSource;
|
||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* Spring Security配置类
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-15
|
||||
*/
|
||||
@Configuration
|
||||
@EnableWebSecurity
|
||||
@EnableMethodSecurity
|
||||
@RequiredArgsConstructor
|
||||
public class SecurityConfig {
|
||||
|
||||
private final UserDetailsServiceImpl userDetailsService;
|
||||
private final JwtAuthenticationFilter jwtAuthenticationFilter;
|
||||
|
||||
/**
|
||||
* 密码编码器
|
||||
*/
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
return new BCryptPasswordEncoder();
|
||||
}
|
||||
|
||||
/**
|
||||
* 认证提供者
|
||||
*/
|
||||
@Bean
|
||||
public AuthenticationProvider authenticationProvider() {
|
||||
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
|
||||
authProvider.setUserDetailsService(userDetailsService);
|
||||
authProvider.setPasswordEncoder(passwordEncoder());
|
||||
return authProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* 认证管理器
|
||||
*/
|
||||
@Bean
|
||||
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
|
||||
return config.getAuthenticationManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* CORS配置
|
||||
*/
|
||||
@Bean
|
||||
public CorsConfigurationSource corsConfigurationSource() {
|
||||
CorsConfiguration configuration = new CorsConfiguration();
|
||||
configuration.setAllowedOriginPatterns(Collections.singletonList("*"));
|
||||
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
|
||||
configuration.setAllowedHeaders(Collections.singletonList("*"));
|
||||
configuration.setAllowCredentials(true);
|
||||
configuration.setMaxAge(3600L);
|
||||
|
||||
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||
source.registerCorsConfiguration("/**", configuration);
|
||||
return source;
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全过滤器链
|
||||
*/
|
||||
@Bean
|
||||
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||
http
|
||||
// 禁用CSRF
|
||||
.csrf(AbstractHttpConfigurer::disable)
|
||||
|
||||
// 配置CORS
|
||||
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
|
||||
|
||||
// 配置会话管理
|
||||
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
||||
|
||||
// 配置授权规则
|
||||
.authorizeHttpRequests(authz -> authz
|
||||
// 公开接口
|
||||
.requestMatchers(
|
||||
"/auth/register",
|
||||
"/auth/login",
|
||||
"/auth/refresh",
|
||||
"/auth/check-account",
|
||||
"/auth/check-email",
|
||||
"/auth/check-phone",
|
||||
"/captcha/**",
|
||||
"/oauth/**")
|
||||
.permitAll()
|
||||
|
||||
// 监控和文档接口
|
||||
.requestMatchers(
|
||||
"/actuator/**",
|
||||
"/swagger-ui/**",
|
||||
"/v3/api-docs/**",
|
||||
"/doc.html",
|
||||
"/swagger-resources/**",
|
||||
"/webjars/**",
|
||||
"/error")
|
||||
.permitAll()
|
||||
|
||||
// 其他接口需要认证
|
||||
.anyRequest().authenticated())
|
||||
|
||||
// 配置认证提供者
|
||||
.authenticationProvider(authenticationProvider())
|
||||
|
||||
// 添加JWT过滤器
|
||||
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
|
||||
|
||||
return http.build();
|
||||
}
|
||||
}
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
package com.emotionmuseum.auth.controller;
|
||||
|
||||
import com.emotionmuseum.common.result.Result;
|
||||
import com.emotionmuseum.auth.dto.LoginRequest;
|
||||
import com.emotionmuseum.auth.dto.RegisterRequest;
|
||||
import com.emotionmuseum.auth.service.AuthService;
|
||||
import com.emotionmuseum.auth.vo.LoginResponse;
|
||||
import com.emotionmuseum.auth.vo.UserInfoResponse;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import jakarta.validation.Valid;
|
||||
|
||||
/**
|
||||
* 认证控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-16
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/auth")
|
||||
@RequiredArgsConstructor
|
||||
@Validated
|
||||
@Tag(name = "用户认证", description = "用户注册、登录、认证管理")
|
||||
public class AuthController {
|
||||
|
||||
private final AuthService authService;
|
||||
|
||||
@Operation(summary = "用户注册")
|
||||
@PostMapping("/register")
|
||||
public Result<UserInfoResponse> register(@Valid @RequestBody RegisterRequest request) {
|
||||
log.info("用户注册请求: {}", request.getAccount());
|
||||
UserInfoResponse response = authService.register(request);
|
||||
return Result.success("注册成功", response);
|
||||
}
|
||||
|
||||
@Operation(summary = "用户登录")
|
||||
@PostMapping("/login")
|
||||
public Result<LoginResponse> login(@Valid @RequestBody LoginRequest request) {
|
||||
log.info("用户登录请求: {}", request.getAccount());
|
||||
LoginResponse response = authService.login(request);
|
||||
return Result.success("登录成功", response);
|
||||
}
|
||||
|
||||
@Operation(summary = "刷新Token")
|
||||
@PostMapping("/refresh")
|
||||
public Result<LoginResponse> refreshToken(
|
||||
@Parameter(description = "刷新Token") @RequestParam String refreshToken) {
|
||||
log.info("刷新Token请求");
|
||||
LoginResponse response = authService.refreshToken(refreshToken);
|
||||
return Result.success("Token刷新成功", response);
|
||||
}
|
||||
|
||||
@Operation(summary = "用户登出")
|
||||
@PostMapping("/logout")
|
||||
public Result<Void> logout(
|
||||
@Parameter(description = "用户ID") @RequestParam String userId) {
|
||||
log.info("用户登出请求: {}", userId);
|
||||
authService.logout(userId);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@Operation(summary = "验证Token")
|
||||
@GetMapping("/validate-token")
|
||||
public Result<Boolean> validateToken() {
|
||||
log.info("验证Token请求");
|
||||
// 如果能到达这里,说明token有效(通过了JWT过滤器)
|
||||
return Result.success("Token有效", true);
|
||||
}
|
||||
|
||||
@Operation(summary = "获取当前用户信息")
|
||||
@GetMapping("/user-info")
|
||||
public Result<UserInfoResponse> getCurrentUserInfo() {
|
||||
log.info("获取当前用户信息请求");
|
||||
UserInfoResponse response = authService.getCurrentUserInfo();
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
@Operation(summary = "检查账号是否存在")
|
||||
@GetMapping("/check-account")
|
||||
public Result<Boolean> checkAccount(
|
||||
@Parameter(description = "账号") @RequestParam String account) {
|
||||
log.info("检查账号是否存在: {}", account);
|
||||
boolean exists = authService.existsByAccount(account);
|
||||
return Result.success(exists);
|
||||
}
|
||||
|
||||
@Operation(summary = "检查邮箱是否存在")
|
||||
@GetMapping("/check-email")
|
||||
public Result<Boolean> checkEmail(
|
||||
@Parameter(description = "邮箱") @RequestParam String email) {
|
||||
log.info("检查邮箱是否存在: {}", email);
|
||||
boolean exists = authService.existsByEmail(email);
|
||||
return Result.success(exists);
|
||||
}
|
||||
|
||||
@Operation(summary = "检查手机号是否存在")
|
||||
@GetMapping("/check-phone")
|
||||
public Result<Boolean> checkPhone(
|
||||
@Parameter(description = "手机号") @RequestParam String phone) {
|
||||
log.info("检查手机号是否存在: {}", phone);
|
||||
boolean exists = authService.existsByPhone(phone);
|
||||
return Result.success(exists);
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -1,11 +1,11 @@
|
||||
package com.emotionmuseum.user.controller;
|
||||
package com.emotionmuseum.auth.controller;
|
||||
|
||||
import com.emotionmuseum.common.result.Result;
|
||||
import com.emotionmuseum.user.dto.CaptchaResponse;
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaVerifyRequest;
|
||||
import com.emotionmuseum.user.service.CaptchaService;
|
||||
import com.emotionmuseum.user.service.SliderCaptchaService;
|
||||
import com.emotionmuseum.auth.dto.CaptchaResponse;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaVerifyRequest;
|
||||
import com.emotionmuseum.auth.service.CaptchaService;
|
||||
import com.emotionmuseum.auth.service.SliderCaptchaService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
+4
-4
@@ -1,9 +1,9 @@
|
||||
package com.emotionmuseum.user.controller;
|
||||
package com.emotionmuseum.auth.controller;
|
||||
|
||||
import com.emotionmuseum.common.result.Result;
|
||||
import com.emotionmuseum.user.dto.OAuthLoginRequest;
|
||||
import com.emotionmuseum.user.service.OAuthService;
|
||||
import com.emotionmuseum.user.vo.LoginResponse;
|
||||
import com.emotionmuseum.auth.dto.OAuthLoginRequest;
|
||||
import com.emotionmuseum.auth.service.OAuthService;
|
||||
import com.emotionmuseum.auth.vo.LoginResponse;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.emotionmuseum.user.dto;
|
||||
package com.emotionmuseum.auth.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.emotionmuseum.user.dto;
|
||||
package com.emotionmuseum.auth.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.emotionmuseum.user.dto;
|
||||
package com.emotionmuseum.auth.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.emotionmuseum.user.dto;
|
||||
package com.emotionmuseum.auth.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.emotionmuseum.user.dto;
|
||||
package com.emotionmuseum.auth.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.emotionmuseum.user.dto;
|
||||
package com.emotionmuseum.auth.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
@@ -0,0 +1,160 @@
|
||||
package com.emotionmuseum.auth.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.emotionmuseum.common.entity.BaseEntity;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 用户实体
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-16
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("user")
|
||||
public class User extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 账号
|
||||
*/
|
||||
@TableField("account")
|
||||
private String account;
|
||||
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
@TableField("password")
|
||||
@JsonIgnore
|
||||
private String password;
|
||||
|
||||
/**
|
||||
* 用户名
|
||||
*/
|
||||
@TableField("username")
|
||||
private String username;
|
||||
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
@TableField("email")
|
||||
private String email;
|
||||
|
||||
/**
|
||||
* 手机号
|
||||
*/
|
||||
@TableField("phone")
|
||||
private String phone;
|
||||
|
||||
/**
|
||||
* 头像URL
|
||||
*/
|
||||
@TableField("avatar")
|
||||
private String avatar;
|
||||
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
@TableField("nickname")
|
||||
private String nickname;
|
||||
|
||||
/**
|
||||
* 生日
|
||||
*/
|
||||
@TableField("birth_date")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private LocalDate birthDate;
|
||||
|
||||
/**
|
||||
* 所在地
|
||||
*/
|
||||
@TableField("location")
|
||||
private String location;
|
||||
|
||||
/**
|
||||
* 个人简介
|
||||
*/
|
||||
@TableField("bio")
|
||||
private String bio;
|
||||
|
||||
/**
|
||||
* 会员等级
|
||||
*/
|
||||
@TableField("member_level")
|
||||
private String memberLevel;
|
||||
|
||||
/**
|
||||
* 使用天数
|
||||
*/
|
||||
@TableField("total_days")
|
||||
private Integer totalDays;
|
||||
|
||||
/**
|
||||
* 自我感知
|
||||
*/
|
||||
@TableField("self_awareness")
|
||||
private BigDecimal selfAwareness;
|
||||
|
||||
/**
|
||||
* 情绪韧性
|
||||
*/
|
||||
@TableField("emotional_resilience")
|
||||
private BigDecimal emotionalResilience;
|
||||
|
||||
/**
|
||||
* 行动力
|
||||
*/
|
||||
@TableField("action_power")
|
||||
private BigDecimal actionPower;
|
||||
|
||||
/**
|
||||
* 共情力
|
||||
*/
|
||||
@TableField("empathy")
|
||||
private BigDecimal empathy;
|
||||
|
||||
/**
|
||||
* 生活热度
|
||||
*/
|
||||
@TableField("life_enthusiasm")
|
||||
private BigDecimal lifeEnthusiasm;
|
||||
|
||||
/**
|
||||
* 状态:0-禁用,1-正常
|
||||
*/
|
||||
@TableField("status")
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 是否已验证:0-未验证,1-已验证
|
||||
*/
|
||||
@TableField("is_verified")
|
||||
private Integer isVerified;
|
||||
|
||||
/**
|
||||
* 最后活跃时间
|
||||
*/
|
||||
@TableField("last_active_time")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime lastActiveTime;
|
||||
|
||||
/**
|
||||
* 第三方登录平台
|
||||
*/
|
||||
@TableField("oauth_platform")
|
||||
private String oauthPlatform;
|
||||
|
||||
/**
|
||||
* 第三方登录ID
|
||||
*/
|
||||
@TableField("oauth_id")
|
||||
private String oauthId;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.emotionmuseum.auth.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.emotionmuseum.auth.entity.User;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
* 用户Mapper接口
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-16
|
||||
*/
|
||||
@Mapper
|
||||
public interface UserMapper extends BaseMapper<User> {
|
||||
|
||||
/**
|
||||
* 根据账号查询用户
|
||||
*
|
||||
* @param account 账号
|
||||
* @return 用户信息
|
||||
*/
|
||||
User selectByAccount(@Param("account") String account);
|
||||
|
||||
/**
|
||||
* 根据邮箱查询用户
|
||||
*
|
||||
* @param email 邮箱
|
||||
* @return 用户信息
|
||||
*/
|
||||
User selectByEmail(@Param("email") String email);
|
||||
|
||||
/**
|
||||
* 根据手机号查询用户
|
||||
*
|
||||
* @param phone 手机号
|
||||
* @return 用户信息
|
||||
*/
|
||||
User selectByPhone(@Param("phone") String phone);
|
||||
|
||||
/**
|
||||
* 根据第三方登录信息查询用户
|
||||
*
|
||||
* @param platform 平台
|
||||
* @param oauthId 第三方ID
|
||||
* @return 用户信息
|
||||
*/
|
||||
User selectByOAuth(@Param("platform") String platform, @Param("oauthId") String oauthId);
|
||||
|
||||
/**
|
||||
* 更新最后活跃时间
|
||||
*
|
||||
* @param userId 用户ID
|
||||
*/
|
||||
void updateLastActiveTime(@Param("userId") String userId);
|
||||
}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
package com.emotionmuseum.auth.security;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.emotionmuseum.common.util.JwtUtil;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* JWT认证过滤器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-15
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class JwtAuthenticationFilter extends OncePerRequestFilter {
|
||||
|
||||
private final JwtUtil jwtUtil;
|
||||
private final UserDetailsService userDetailsService;
|
||||
private final RedisTemplate<String, Object> redisTemplate;
|
||||
|
||||
private static final String TOKEN_PREFIX = "Bearer ";
|
||||
private static final String HEADER_NAME = "Authorization";
|
||||
private static final String REDIS_TOKEN_KEY_PREFIX = "auth:token:";
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
FilterChain filterChain) throws ServletException, IOException {
|
||||
|
||||
try {
|
||||
String token = extractTokenFromRequest(request);
|
||||
|
||||
if (StrUtil.isNotBlank(token) && SecurityContextHolder.getContext().getAuthentication() == null) {
|
||||
// 验证token有效性
|
||||
if (jwtUtil.validateToken(token)) {
|
||||
String userId = jwtUtil.getUserIdFromToken(token);
|
||||
|
||||
// 检查Redis中是否存在该token(用于登出功能)
|
||||
String redisKey = REDIS_TOKEN_KEY_PREFIX + userId;
|
||||
String redisToken = (String) redisTemplate.opsForValue().get(redisKey);
|
||||
|
||||
if (StrUtil.isNotBlank(redisToken) && redisToken.equals(token)) {
|
||||
// 加载用户详情
|
||||
UserDetails userDetails = userDetailsService.loadUserByUsername(userId);
|
||||
|
||||
// 创建认证对象
|
||||
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
|
||||
userDetails, null, userDetails.getAuthorities());
|
||||
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
|
||||
|
||||
// 设置到安全上下文
|
||||
SecurityContextHolder.getContext().setAuthentication(authentication);
|
||||
|
||||
// 更新token在Redis中的过期时间
|
||||
redisTemplate.expire(redisKey, 24, TimeUnit.HOURS);
|
||||
|
||||
log.debug("JWT认证成功,用户ID: {}", userId);
|
||||
} else {
|
||||
log.debug("Redis中未找到有效token,用户ID: {}", userId);
|
||||
}
|
||||
} else {
|
||||
log.debug("JWT token无效");
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("JWT认证过程中发生错误: {}", e.getMessage());
|
||||
}
|
||||
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 从请求中提取token
|
||||
*/
|
||||
private String extractTokenFromRequest(HttpServletRequest request) {
|
||||
String bearerToken = request.getHeader(HEADER_NAME);
|
||||
if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith(TOKEN_PREFIX)) {
|
||||
return bearerToken.substring(TOKEN_PREFIX.length());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否跳过JWT认证
|
||||
*/
|
||||
@Override
|
||||
protected boolean shouldNotFilter(HttpServletRequest request) {
|
||||
String path = request.getRequestURI();
|
||||
|
||||
// 跳过认证的路径
|
||||
return path.startsWith("/user/register") ||
|
||||
path.startsWith("/user/login") ||
|
||||
path.startsWith("/user/refresh") ||
|
||||
path.startsWith("/user/check/") ||
|
||||
path.startsWith("/captcha/") ||
|
||||
path.startsWith("/oauth/") ||
|
||||
path.startsWith("/actuator/") ||
|
||||
path.startsWith("/swagger-ui/") ||
|
||||
path.startsWith("/v3/api-docs") ||
|
||||
path.startsWith("/doc.html") ||
|
||||
path.equals("/error");
|
||||
}
|
||||
}
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
package com.emotionmuseum.auth.security;
|
||||
|
||||
import com.emotionmuseum.auth.entity.User;
|
||||
import com.emotionmuseum.auth.mapper.UserMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* Spring Security用户详情服务实现
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-15
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class UserDetailsServiceImpl implements UserDetailsService {
|
||||
|
||||
private final UserMapper userMapper;
|
||||
|
||||
@Override
|
||||
public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
|
||||
log.debug("加载用户详情,用户ID: {}", userId);
|
||||
|
||||
User user = userMapper.selectById(userId);
|
||||
if (user == null) {
|
||||
log.warn("用户不存在,用户ID: {}", userId);
|
||||
throw new UsernameNotFoundException("用户不存在: " + userId);
|
||||
}
|
||||
|
||||
if (user.getStatus() == 0) {
|
||||
log.warn("用户已被禁用,用户ID: {}", userId);
|
||||
throw new UsernameNotFoundException("用户已被禁用: " + userId);
|
||||
}
|
||||
|
||||
return new SecurityUser(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Spring Security用户详情实现类
|
||||
*/
|
||||
public static class SecurityUser implements UserDetails {
|
||||
|
||||
private final User user;
|
||||
|
||||
public SecurityUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||
// 这里可以根据用户角色返回权限
|
||||
// 目前简单返回一个默认角色
|
||||
return Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPassword() {
|
||||
return user.getPassword();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUsername() {
|
||||
return user.getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户账号
|
||||
*/
|
||||
public String getAccount() {
|
||||
return user.getAccount();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户昵称
|
||||
*/
|
||||
public String getNickname() {
|
||||
return user.getNickname();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户实体
|
||||
*/
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAccountNonExpired() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAccountNonLocked() {
|
||||
return user.getStatus() == 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCredentialsNonExpired() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return user.getStatus() == 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
package com.emotionmuseum.auth.service;
|
||||
|
||||
import com.emotionmuseum.auth.dto.LoginRequest;
|
||||
import com.emotionmuseum.auth.dto.RegisterRequest;
|
||||
import com.emotionmuseum.auth.vo.LoginResponse;
|
||||
import com.emotionmuseum.auth.vo.UserInfoResponse;
|
||||
|
||||
/**
|
||||
* 认证服务接口
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-16
|
||||
*/
|
||||
public interface AuthService {
|
||||
|
||||
/**
|
||||
* 用户注册
|
||||
*
|
||||
* @param request 注册请求
|
||||
* @return 用户信息响应
|
||||
*/
|
||||
UserInfoResponse register(RegisterRequest request);
|
||||
|
||||
/**
|
||||
* 用户登录
|
||||
*
|
||||
* @param request 登录请求
|
||||
* @return 登录响应
|
||||
*/
|
||||
LoginResponse login(LoginRequest request);
|
||||
|
||||
/**
|
||||
* 刷新Token
|
||||
*
|
||||
* @param refreshToken 刷新Token
|
||||
* @return 登录响应
|
||||
*/
|
||||
LoginResponse refreshToken(String refreshToken);
|
||||
|
||||
/**
|
||||
* 用户登出
|
||||
*
|
||||
* @param userId 用户ID
|
||||
*/
|
||||
void logout(String userId);
|
||||
|
||||
/**
|
||||
* 获取当前用户信息
|
||||
*
|
||||
* @return 用户信息响应
|
||||
*/
|
||||
UserInfoResponse getCurrentUserInfo();
|
||||
|
||||
/**
|
||||
* 检查账号是否存在
|
||||
*
|
||||
* @param account 账号
|
||||
* @return 是否存在
|
||||
*/
|
||||
boolean existsByAccount(String account);
|
||||
|
||||
/**
|
||||
* 检查邮箱是否存在
|
||||
*
|
||||
* @param email 邮箱
|
||||
* @return 是否存在
|
||||
*/
|
||||
boolean existsByEmail(String email);
|
||||
|
||||
/**
|
||||
* 检查手机号是否存在
|
||||
*
|
||||
* @param phone 手机号
|
||||
* @return 是否存在
|
||||
*/
|
||||
boolean existsByPhone(String phone);
|
||||
|
||||
/**
|
||||
* 根据用户ID获取用户信息
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return 用户信息响应
|
||||
*/
|
||||
UserInfoResponse getUserInfo(String userId);
|
||||
|
||||
/**
|
||||
* 更新最后活跃时间
|
||||
*
|
||||
* @param userId 用户ID
|
||||
*/
|
||||
void updateLastActiveTime(String userId);
|
||||
}
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package com.emotionmuseum.user.service;
|
||||
package com.emotionmuseum.auth.service;
|
||||
|
||||
import com.emotionmuseum.user.dto.CaptchaResponse;
|
||||
import com.emotionmuseum.auth.dto.CaptchaResponse;
|
||||
|
||||
/**
|
||||
* 验证码服务接口
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
package com.emotionmuseum.user.service;
|
||||
package com.emotionmuseum.auth.service;
|
||||
|
||||
import com.emotionmuseum.user.dto.OAuthLoginRequest;
|
||||
import com.emotionmuseum.user.vo.LoginResponse;
|
||||
import com.emotionmuseum.auth.dto.OAuthLoginRequest;
|
||||
import com.emotionmuseum.auth.vo.LoginResponse;
|
||||
|
||||
/**
|
||||
* 第三方登录服务接口
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
package com.emotionmuseum.user.service;
|
||||
package com.emotionmuseum.auth.service;
|
||||
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaVerifyRequest;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaVerifyRequest;
|
||||
|
||||
/**
|
||||
* 滑块验证码服务接口
|
||||
+305
@@ -0,0 +1,305 @@
|
||||
package com.emotionmuseum.auth.service.impl;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotionmuseum.common.result.ResultCode;
|
||||
import com.emotionmuseum.common.util.JwtUtil;
|
||||
import com.emotionmuseum.auth.dto.LoginRequest;
|
||||
import com.emotionmuseum.auth.dto.RegisterRequest;
|
||||
import com.emotionmuseum.auth.entity.User;
|
||||
import com.emotionmuseum.auth.mapper.UserMapper;
|
||||
import com.emotionmuseum.auth.service.AuthService;
|
||||
import com.emotionmuseum.auth.service.CaptchaService;
|
||||
import com.emotionmuseum.auth.vo.LoginResponse;
|
||||
import com.emotionmuseum.auth.vo.UserInfoResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 认证服务实现
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-16
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class AuthServiceImpl extends ServiceImpl<UserMapper, User> implements AuthService {
|
||||
|
||||
private final ApplicationContext applicationContext;
|
||||
private final CaptchaService captchaService;
|
||||
private final JwtUtil jwtUtil;
|
||||
private final RedisTemplate<String, Object> redisTemplate;
|
||||
|
||||
private static final String REDIS_TOKEN_KEY_PREFIX = "auth:token:";
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public UserInfoResponse register(RegisterRequest request) {
|
||||
// 验证验证码
|
||||
if (!captchaService.verifyCaptcha(request.getCaptchaId(), request.getCaptcha())) {
|
||||
throw new RuntimeException(ResultCode.CAPTCHA_ERROR.getMessage());
|
||||
}
|
||||
|
||||
// 验证密码一致性
|
||||
if (!request.isPasswordMatch()) {
|
||||
throw new RuntimeException(ResultCode.PARAM_VALIDATION_ERROR.getMessage() + ": 两次密码不一致");
|
||||
}
|
||||
|
||||
// 检查账号是否存在
|
||||
if (existsByAccount(request.getAccount())) {
|
||||
throw new RuntimeException(ResultCode.ACCOUNT_ALREADY_EXISTS.getMessage());
|
||||
}
|
||||
|
||||
// 检查邮箱是否存在
|
||||
if (StrUtil.isNotBlank(request.getEmail()) && existsByEmail(request.getEmail())) {
|
||||
throw new RuntimeException(ResultCode.EMAIL_ALREADY_EXISTS.getMessage());
|
||||
}
|
||||
|
||||
// 检查手机号是否存在
|
||||
if (StrUtil.isNotBlank(request.getPhone()) && existsByPhone(request.getPhone())) {
|
||||
throw new RuntimeException("手机号已存在");
|
||||
}
|
||||
|
||||
// 创建用户
|
||||
User user = new User();
|
||||
BeanUtils.copyProperties(request, user);
|
||||
|
||||
// 加密密码
|
||||
PasswordEncoder passwordEncoder = applicationContext.getBean(PasswordEncoder.class);
|
||||
user.setPassword(passwordEncoder.encode(request.getPassword()));
|
||||
|
||||
// 设置默认值
|
||||
user.setMemberLevel("free");
|
||||
user.setTotalDays(0);
|
||||
user.setSelfAwareness(new BigDecimal("50.00"));
|
||||
user.setEmotionalResilience(new BigDecimal("50.00"));
|
||||
user.setActionPower(new BigDecimal("50.00"));
|
||||
user.setEmpathy(new BigDecimal("50.00"));
|
||||
user.setLifeEnthusiasm(new BigDecimal("50.00"));
|
||||
user.setStatus(1);
|
||||
user.setIsVerified(0);
|
||||
user.setLastActiveTime(LocalDateTime.now());
|
||||
|
||||
// 保存用户
|
||||
save(user);
|
||||
|
||||
log.info("用户注册成功: {}", user.getAccount());
|
||||
return convertToUserInfoResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoginResponse login(LoginRequest request) {
|
||||
// 验证验证码
|
||||
if (!captchaService.verifyCaptcha(request.getCaptchaId(), request.getCaptcha())) {
|
||||
throw new RuntimeException(ResultCode.CAPTCHA_ERROR.getMessage());
|
||||
}
|
||||
|
||||
// 查找用户(支持账号/邮箱/手机号登录)
|
||||
User user = findUserByAccount(request.getAccount());
|
||||
if (user == null) {
|
||||
throw new RuntimeException(ResultCode.USER_NOT_FOUND.getMessage());
|
||||
}
|
||||
|
||||
// 验证密码
|
||||
PasswordEncoder passwordEncoder = applicationContext.getBean(PasswordEncoder.class);
|
||||
if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
|
||||
throw new RuntimeException(ResultCode.INVALID_CREDENTIALS.getMessage());
|
||||
}
|
||||
|
||||
// 检查用户状态
|
||||
if (user.getStatus() == 0) {
|
||||
throw new RuntimeException(ResultCode.USER_DISABLED.getMessage());
|
||||
}
|
||||
|
||||
// 生成Token
|
||||
String accessToken = jwtUtil.generateToken(user.getId(), user.getUsername());
|
||||
String refreshToken = jwtUtil.generateRefreshToken(user.getId(), user.getUsername());
|
||||
|
||||
// 将token存储到Redis中(用于登出和token管理)
|
||||
String redisKey = REDIS_TOKEN_KEY_PREFIX + user.getId();
|
||||
redisTemplate.opsForValue().set(redisKey, accessToken, 24, TimeUnit.HOURS);
|
||||
|
||||
// 更新最后活跃时间
|
||||
updateLastActiveTime(user.getId());
|
||||
|
||||
// 构建响应
|
||||
LoginResponse response = new LoginResponse();
|
||||
response.setAccessToken(accessToken);
|
||||
response.setRefreshToken(refreshToken);
|
||||
response.setExpiresIn(86400L); // 24小时
|
||||
response.setUserInfo(convertToUserInfoResponse(user));
|
||||
response.setLoginTime(LocalDateTime.now());
|
||||
|
||||
log.info("用户登录成功: {}", user.getAccount());
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LoginResponse refreshToken(String refreshToken) {
|
||||
try {
|
||||
// 验证刷新Token
|
||||
if (!jwtUtil.validateToken(refreshToken)) {
|
||||
throw new RuntimeException("刷新Token无效");
|
||||
}
|
||||
|
||||
// 从刷新Token中获取用户信息
|
||||
String userId = jwtUtil.getUserIdFromToken(refreshToken);
|
||||
User user = getById(userId);
|
||||
if (user == null) {
|
||||
throw new RuntimeException("用户不存在");
|
||||
}
|
||||
|
||||
// 生成新的Token
|
||||
String newAccessToken = jwtUtil.generateToken(user.getId(), user.getUsername());
|
||||
String newRefreshToken = jwtUtil.generateRefreshToken(user.getId(), user.getUsername());
|
||||
|
||||
// 更新Redis中的token
|
||||
String redisKey = REDIS_TOKEN_KEY_PREFIX + user.getId();
|
||||
redisTemplate.opsForValue().set(redisKey, newAccessToken, 24, TimeUnit.HOURS);
|
||||
|
||||
// 构建响应
|
||||
LoginResponse response = new LoginResponse();
|
||||
response.setAccessToken(newAccessToken);
|
||||
response.setRefreshToken(newRefreshToken);
|
||||
response.setExpiresIn(86400L);
|
||||
response.setUserInfo(convertToUserInfoResponse(user));
|
||||
response.setLoginTime(LocalDateTime.now());
|
||||
|
||||
log.info("Token刷新成功: {}", user.getAccount());
|
||||
return response;
|
||||
} catch (Exception e) {
|
||||
log.error("Token刷新失败: {}", e.getMessage());
|
||||
throw new RuntimeException("Token刷新失败");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void logout(String userId) {
|
||||
try {
|
||||
// 从Redis中删除token
|
||||
String redisKey = REDIS_TOKEN_KEY_PREFIX + userId;
|
||||
redisTemplate.delete(redisKey);
|
||||
|
||||
log.info("用户登出成功: {}", userId);
|
||||
} catch (Exception e) {
|
||||
log.error("用户登出失败: {}", e.getMessage());
|
||||
throw new RuntimeException("登出失败");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserInfoResponse getCurrentUserInfo() {
|
||||
// 从安全上下文获取当前用户ID
|
||||
String userId = getCurrentUserId();
|
||||
if (StrUtil.isBlank(userId)) {
|
||||
throw new RuntimeException("未登录");
|
||||
}
|
||||
|
||||
User user = getById(userId);
|
||||
if (user == null) {
|
||||
throw new RuntimeException("用户不存在");
|
||||
}
|
||||
|
||||
return convertToUserInfoResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean existsByAccount(String account) {
|
||||
return baseMapper.selectByAccount(account) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean existsByEmail(String email) {
|
||||
return baseMapper.selectByEmail(email) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean existsByPhone(String phone) {
|
||||
return baseMapper.selectByPhone(phone) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserInfoResponse getUserInfo(String userId) {
|
||||
User user = getById(userId);
|
||||
if (user == null) {
|
||||
throw new RuntimeException("用户不存在");
|
||||
}
|
||||
return convertToUserInfoResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLastActiveTime(String userId) {
|
||||
baseMapper.updateLastActiveTime(userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据账号查找用户(支持账号/邮箱/手机号)
|
||||
*/
|
||||
private User findUserByAccount(String account) {
|
||||
// 先按账号查找
|
||||
User user = baseMapper.selectByAccount(account);
|
||||
if (user != null) {
|
||||
return user;
|
||||
}
|
||||
|
||||
// 按邮箱查找
|
||||
if (account.contains("@")) {
|
||||
user = baseMapper.selectByEmail(account);
|
||||
if (user != null) {
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
||||
// 按手机号查找
|
||||
if (account.matches("^1[3-9]\\d{9}$")) {
|
||||
user = baseMapper.selectByPhone(account);
|
||||
if (user != null) {
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为用户信息响应
|
||||
*/
|
||||
private UserInfoResponse convertToUserInfoResponse(User user) {
|
||||
UserInfoResponse response = new UserInfoResponse();
|
||||
BeanUtils.copyProperties(user, response);
|
||||
|
||||
// 设置成长数据
|
||||
UserInfoResponse.GrowthStatsVO growthStats = new UserInfoResponse.GrowthStatsVO();
|
||||
growthStats.setSelfAwareness(user.getSelfAwareness());
|
||||
growthStats.setEmotionalResilience(user.getEmotionalResilience());
|
||||
growthStats.setActionPower(user.getActionPower());
|
||||
growthStats.setEmpathy(user.getEmpathy());
|
||||
growthStats.setLifeEnthusiasm(user.getLifeEnthusiasm());
|
||||
response.setGrowthStats(growthStats);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前用户ID
|
||||
*/
|
||||
private String getCurrentUserId() {
|
||||
try {
|
||||
return SecurityContextHolder.getContext().getAuthentication().getName();
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -1,12 +1,12 @@
|
||||
package com.emotionmuseum.user.service.impl;
|
||||
package com.emotionmuseum.auth.service.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.emotionmuseum.user.dto.CaptchaResponse;
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaVerifyRequest;
|
||||
import com.emotionmuseum.user.service.CaptchaService;
|
||||
import com.emotionmuseum.user.service.SliderCaptchaService;
|
||||
import com.emotionmuseum.auth.dto.CaptchaResponse;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaVerifyRequest;
|
||||
import com.emotionmuseum.auth.service.CaptchaService;
|
||||
import com.emotionmuseum.auth.service.SliderCaptchaService;
|
||||
import com.wf.captcha.base.Captcha;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
+4
-4
@@ -1,10 +1,10 @@
|
||||
package com.emotionmuseum.user.service.impl;
|
||||
package com.emotionmuseum.auth.service.impl;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.user.dto.SliderCaptchaVerifyRequest;
|
||||
import com.emotionmuseum.user.service.SliderCaptchaService;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaResponse;
|
||||
import com.emotionmuseum.auth.dto.SliderCaptchaVerifyRequest;
|
||||
import com.emotionmuseum.auth.service.SliderCaptchaService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.emotionmuseum.user.vo;
|
||||
package com.emotionmuseum.auth.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.emotionmuseum.auth.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 用户信息响应
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @since 2025-07-16
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "用户信息响应")
|
||||
public class UserInfoResponse {
|
||||
|
||||
@Schema(description = "用户ID")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "账号")
|
||||
private String account;
|
||||
|
||||
@Schema(description = "用户名")
|
||||
private String username;
|
||||
|
||||
@Schema(description = "邮箱")
|
||||
private String email;
|
||||
|
||||
@Schema(description = "手机号")
|
||||
private String phone;
|
||||
|
||||
@Schema(description = "头像URL")
|
||||
private String avatar;
|
||||
|
||||
@Schema(description = "昵称")
|
||||
private String nickname;
|
||||
|
||||
@Schema(description = "生日")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private LocalDate birthDate;
|
||||
|
||||
@Schema(description = "所在地")
|
||||
private String location;
|
||||
|
||||
@Schema(description = "个人简介")
|
||||
private String bio;
|
||||
|
||||
@Schema(description = "会员等级")
|
||||
private String memberLevel;
|
||||
|
||||
@Schema(description = "使用天数")
|
||||
private Integer totalDays;
|
||||
|
||||
@Schema(description = "成长数据")
|
||||
private GrowthStatsVO growthStats;
|
||||
|
||||
@Schema(description = "状态")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "是否已验证")
|
||||
private Integer isVerified;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "最后活跃时间")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime lastActiveTime;
|
||||
|
||||
/**
|
||||
* 成长数据VO
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "成长数据")
|
||||
public static class GrowthStatsVO {
|
||||
|
||||
@Schema(description = "自我感知")
|
||||
private BigDecimal selfAwareness;
|
||||
|
||||
@Schema(description = "情绪韧性")
|
||||
private BigDecimal emotionalResilience;
|
||||
|
||||
@Schema(description = "行动力")
|
||||
private BigDecimal actionPower;
|
||||
|
||||
@Schema(description = "共情力")
|
||||
private BigDecimal empathy;
|
||||
|
||||
@Schema(description = "生活热度")
|
||||
private BigDecimal lifeEnthusiasm;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
server:
|
||||
port: 19001
|
||||
servlet:
|
||||
context-path: /
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-auth
|
||||
profiles:
|
||||
active: ${SPRING_PROFILES_ACTIVE:local}
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:emotion_museum}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
username: ${MYSQL_USERNAME:root}
|
||||
password: ${MYSQL_PASSWORD:EmotionMuseum2025*#}
|
||||
|
||||
# 连接池配置
|
||||
hikari:
|
||||
minimum-idle: 5
|
||||
maximum-pool-size: 20
|
||||
idle-timeout: 300000
|
||||
connection-timeout: 20000
|
||||
max-lifetime: 1200000
|
||||
pool-name: EmotionAuthHikariCP
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: ${REDIS_HOST:localhost}
|
||||
port: ${REDIS_PORT:6379}
|
||||
password: ${REDIS_PASSWORD:}
|
||||
database: ${REDIS_DATABASE:0}
|
||||
timeout: 5000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 20
|
||||
max-idle: 10
|
||||
min-idle: 5
|
||||
max-wait: 2000ms
|
||||
|
||||
# 云服务配置
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
enabled: false
|
||||
config:
|
||||
enabled: false
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
id-type: assign_uuid
|
||||
logic-delete-field: deleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
|
||||
# 监控配置
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics,prometheus
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
metrics:
|
||||
export:
|
||||
prometheus:
|
||||
enabled: true
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
com.baomidou.mybatisplus: debug
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level [%logger{50}] - %msg%n"
|
||||
|
||||
# JWT配置
|
||||
jwt:
|
||||
secret: emotion-museum-secret-key-2025
|
||||
expiration: 86400
|
||||
refresh-expiration: 604800
|
||||
|
||||
# 验证码配置
|
||||
captcha:
|
||||
type: arithmetic
|
||||
length: 4
|
||||
expire-time: 300
|
||||
|
||||
# OAuth配置
|
||||
oauth:
|
||||
wechat:
|
||||
client-id: ${WECHAT_CLIENT_ID:}
|
||||
client-secret: ${WECHAT_CLIENT_SECRET:}
|
||||
redirect-uri: ${WECHAT_REDIRECT_URI:}
|
||||
qq:
|
||||
client-id: ${QQ_CLIENT_ID:}
|
||||
client-secret: ${QQ_CLIENT_SECRET:}
|
||||
redirect-uri: ${QQ_REDIRECT_URI:}
|
||||
|
||||
---
|
||||
# 本地开发环境配置
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: local
|
||||
datasource:
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
|
||||
---
|
||||
# 测试环境配置
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: test
|
||||
datasource:
|
||||
url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
|
||||
---
|
||||
# 生产环境配置
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: prod
|
||||
datasource:
|
||||
url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.emotionmuseum.auth.mapper.UserMapper">
|
||||
|
||||
<!-- 根据账号查询用户 -->
|
||||
<select id="selectByAccount" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE account = #{account} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 根据邮箱查询用户 -->
|
||||
<select id="selectByEmail" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE email = #{email} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 根据手机号查询用户 -->
|
||||
<select id="selectByPhone" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE phone = #{phone} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 根据第三方登录信息查询用户 -->
|
||||
<select id="selectByOAuth" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE oauth_platform = #{platform} AND oauth_id = #{oauthId} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 更新最后活跃时间 -->
|
||||
<update id="updateLastActiveTime">
|
||||
UPDATE user
|
||||
SET last_active_time = NOW(), update_time = NOW()
|
||||
WHERE id = #{userId} AND is_deleted = 0
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,143 @@
|
||||
server:
|
||||
port: 19001
|
||||
servlet:
|
||||
context-path: /
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-auth
|
||||
profiles:
|
||||
active: ${SPRING_PROFILES_ACTIVE:local}
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:emotion_museum}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
username: ${MYSQL_USERNAME:root}
|
||||
password: ${MYSQL_PASSWORD:EmotionMuseum2025*#}
|
||||
|
||||
# 连接池配置
|
||||
hikari:
|
||||
minimum-idle: 5
|
||||
maximum-pool-size: 20
|
||||
idle-timeout: 300000
|
||||
connection-timeout: 20000
|
||||
max-lifetime: 1200000
|
||||
pool-name: EmotionAuthHikariCP
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: ${REDIS_HOST:localhost}
|
||||
port: ${REDIS_PORT:6379}
|
||||
password: ${REDIS_PASSWORD:}
|
||||
database: ${REDIS_DATABASE:0}
|
||||
timeout: 5000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 20
|
||||
max-idle: 10
|
||||
min-idle: 5
|
||||
max-wait: 2000ms
|
||||
|
||||
# 云服务配置
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
enabled: false
|
||||
config:
|
||||
enabled: false
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
id-type: assign_uuid
|
||||
logic-delete-field: deleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
|
||||
# 监控配置
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics,prometheus
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
metrics:
|
||||
export:
|
||||
prometheus:
|
||||
enabled: true
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
com.baomidou.mybatisplus: debug
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level [%logger{50}] - %msg%n"
|
||||
|
||||
# JWT配置
|
||||
jwt:
|
||||
secret: emotion-museum-secret-key-2025
|
||||
expiration: 86400
|
||||
refresh-expiration: 604800
|
||||
|
||||
# 验证码配置
|
||||
captcha:
|
||||
type: arithmetic
|
||||
length: 4
|
||||
expire-time: 300
|
||||
|
||||
# OAuth配置
|
||||
oauth:
|
||||
wechat:
|
||||
client-id: ${WECHAT_CLIENT_ID:}
|
||||
client-secret: ${WECHAT_CLIENT_SECRET:}
|
||||
redirect-uri: ${WECHAT_REDIRECT_URI:}
|
||||
qq:
|
||||
client-id: ${QQ_CLIENT_ID:}
|
||||
client-secret: ${QQ_CLIENT_SECRET:}
|
||||
redirect-uri: ${QQ_REDIRECT_URI:}
|
||||
|
||||
---
|
||||
# 本地开发环境配置
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: local
|
||||
datasource:
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
|
||||
---
|
||||
# 测试环境配置
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: test
|
||||
datasource:
|
||||
url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
|
||||
---
|
||||
# 生产环境配置
|
||||
spring:
|
||||
config:
|
||||
activate:
|
||||
on-profile: prod
|
||||
datasource:
|
||||
url: jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.emotionmuseum.auth.mapper.UserMapper">
|
||||
|
||||
<!-- 根据账号查询用户 -->
|
||||
<select id="selectByAccount" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE account = #{account} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 根据邮箱查询用户 -->
|
||||
<select id="selectByEmail" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE email = #{email} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 根据手机号查询用户 -->
|
||||
<select id="selectByPhone" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE phone = #{phone} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 根据第三方登录信息查询用户 -->
|
||||
<select id="selectByOAuth" resultType="com.emotionmuseum.auth.entity.User">
|
||||
SELECT * FROM user
|
||||
WHERE oauth_platform = #{platform} AND oauth_id = #{oauthId} AND is_deleted = 0
|
||||
</select>
|
||||
|
||||
<!-- 更新最后活跃时间 -->
|
||||
<update id="updateLastActiveTime">
|
||||
UPDATE user
|
||||
SET last_active_time = NOW(), update_time = NOW()
|
||||
WHERE id = #{userId} AND is_deleted = 0
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
artifactId=emotion-auth
|
||||
groupId=com.emotionmuseum
|
||||
version=1.0.0
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
com/emotionmuseum/auth/dto/RegisterRequest.class
|
||||
com/emotionmuseum/auth/entity/User.class
|
||||
com/emotionmuseum/auth/controller/OAuthController.class
|
||||
com/emotionmuseum/auth/config/CaptchaConfig.class
|
||||
com/emotionmuseum/auth/service/impl/AuthServiceImpl.class
|
||||
com/emotionmuseum/auth/service/CaptchaService.class
|
||||
com/emotionmuseum/auth/AuthApplication.class
|
||||
com/emotionmuseum/auth/service/SliderCaptchaService.class
|
||||
com/emotionmuseum/auth/dto/CaptchaResponse.class
|
||||
com/emotionmuseum/auth/security/UserDetailsServiceImpl.class
|
||||
com/emotionmuseum/auth/service/impl/CaptchaServiceImpl.class
|
||||
com/emotionmuseum/auth/service/impl/SliderCaptchaServiceImpl$SliderCaptchaData.class
|
||||
com/emotionmuseum/auth/vo/UserInfoResponse$GrowthStatsVO.class
|
||||
com/emotionmuseum/auth/vo/UserInfoResponse.class
|
||||
com/emotionmuseum/auth/dto/LoginRequest.class
|
||||
com/emotionmuseum/auth/dto/SliderCaptchaResponse.class
|
||||
com/emotionmuseum/auth/vo/LoginResponse.class
|
||||
com/emotionmuseum/auth/dto/SliderCaptchaVerifyRequest.class
|
||||
com/emotionmuseum/auth/controller/CaptchaController.class
|
||||
com/emotionmuseum/auth/controller/AuthController.class
|
||||
com/emotionmuseum/auth/config/OAuthConfig.class
|
||||
com/emotionmuseum/auth/security/JwtAuthenticationFilter.class
|
||||
com/emotionmuseum/auth/config/SecurityConfig.class
|
||||
com/emotionmuseum/auth/service/OAuthService.class
|
||||
com/emotionmuseum/auth/mapper/UserMapper.class
|
||||
com/emotionmuseum/auth/dto/OAuthLoginRequest.class
|
||||
com/emotionmuseum/auth/config/RedisConfig.class
|
||||
com/emotionmuseum/auth/security/UserDetailsServiceImpl$SecurityUser.class
|
||||
com/emotionmuseum/auth/service/impl/SliderCaptchaServiceImpl.class
|
||||
com/emotionmuseum/auth/service/AuthService.class
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/dto/SliderCaptchaResponse.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/dto/SliderCaptchaVerifyRequest.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/service/impl/CaptchaServiceImpl.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/config/SecurityConfig.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/service/CaptchaService.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/config/CaptchaConfig.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/config/RedisConfig.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/dto/OAuthLoginRequest.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/dto/LoginRequest.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/service/SliderCaptchaService.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/security/JwtAuthenticationFilter.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/entity/User.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/service/OAuthService.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/security/UserDetailsServiceImpl.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/dto/CaptchaResponse.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/controller/OAuthController.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/vo/UserInfoResponse.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/service/AuthService.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/controller/AuthController.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/AuthApplication.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/service/impl/AuthServiceImpl.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/vo/LoginResponse.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/controller/CaptchaController.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/service/impl/SliderCaptchaServiceImpl.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/dto/RegisterRequest.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/mapper/UserMapper.java
|
||||
/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-auth/src/main/java/com/emotionmuseum/auth/config/OAuthConfig.java
|
||||
Binary file not shown.
@@ -1,80 +1,55 @@
|
||||
server:
|
||||
port: 19005
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-explore
|
||||
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 4
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-wait: -1ms
|
||||
max-idle: 8
|
||||
min-idle: 0
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
logic-delete-field: isDeleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
|
||||
# Nacos配置
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
register-enabled: true
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
org.springframework.web: debug
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-explore-local.log
|
||||
|
||||
# 管理端点配置
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: nacos
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: nacos
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-explore-local.log
|
||||
@@ -0,0 +1,55 @@
|
||||
# 生产环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: prod
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: warn
|
||||
com.baomidou.mybatisplus: warn
|
||||
com.alibaba.nacos: error
|
||||
file:
|
||||
name: logs/emotion-explore-prod.log
|
||||
@@ -0,0 +1,55 @@
|
||||
# 测试环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: test
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: info
|
||||
com.baomidou.mybatisplus: info
|
||||
com.alibaba.nacos: warn
|
||||
file:
|
||||
name: logs/emotion-explore-test.log
|
||||
@@ -1,80 +1,55 @@
|
||||
server:
|
||||
port: 19005
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: emotion-explore
|
||||
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: Peanut2817*#
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 4
|
||||
timeout: 10000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-wait: -1ms
|
||||
max-idle: 8
|
||||
min-idle: 0
|
||||
|
||||
# MyBatis Plus配置
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true
|
||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||
global-config:
|
||||
db-config:
|
||||
logic-delete-field: isDeleted
|
||||
logic-delete-value: 1
|
||||
logic-not-delete-value: 0
|
||||
|
||||
# Nacos配置
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
register-enabled: true
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
org.springframework.web: debug
|
||||
pattern:
|
||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-explore-local.log
|
||||
|
||||
# 管理端点配置
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
# 本地开发环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: nacos
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: local
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: localhost:8848
|
||||
namespace:
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: nacos
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: 123456
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: debug
|
||||
com.baomidou.mybatisplus: debug
|
||||
com.alibaba.nacos: info
|
||||
file:
|
||||
name: logs/emotion-explore-local.log
|
||||
@@ -0,0 +1,55 @@
|
||||
# 生产环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: prod
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: prod
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: warn
|
||||
com.baomidou.mybatisplus: warn
|
||||
com.alibaba.nacos: error
|
||||
file:
|
||||
name: logs/emotion-explore-prod.log
|
||||
@@ -0,0 +1,55 @@
|
||||
# 测试环境配置
|
||||
|
||||
spring:
|
||||
cloud:
|
||||
nacos:
|
||||
discovery:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
enabled: true
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
metadata:
|
||||
version: 1.0.0
|
||||
zone: test
|
||||
register-enabled: true
|
||||
ephemeral: true
|
||||
cluster-name: DEFAULT
|
||||
service: ${spring.application.name}
|
||||
weight: 1
|
||||
heart-beat-interval: 5000
|
||||
heart-beat-timeout: 15000
|
||||
ip-delete-timeout: 30000
|
||||
config:
|
||||
server-addr: 47.111.10.27:8848
|
||||
namespace: test
|
||||
group: DEFAULT_GROUP
|
||||
file-extension: yml
|
||||
enabled: false
|
||||
username: nacos
|
||||
password: EmotionMuseum2025
|
||||
|
||||
# 数据源配置
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://47.111.10.27:3306/emotion_museum?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
|
||||
username: root
|
||||
password: EmotionMuseum2025*#
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: 47.111.10.27
|
||||
port: 6379
|
||||
password: EmotionMuseum2025*#
|
||||
database: 0
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
com.emotionmuseum: info
|
||||
com.baomidou.mybatisplus: info
|
||||
com.alibaba.nacos: warn
|
||||
file:
|
||||
name: logs/emotion-explore-test.log
|
||||
Binary file not shown.
@@ -0,0 +1,52 @@
|
||||
2025-07-17T09:52:07.419+08:00 WARN 90872 --- [restartedMain] c.a.nacos.client.logging.NacosLogging : Load Logback Configuration of Nacos fail, message: Could not initialize Logback Nacos logging from classpath:nacos-logback.xml
|
||||
2025-07-17T09:52:07.481+08:00 WARN 90872 --- [restartedMain] c.a.nacos.client.logging.NacosLogging : Load Logback Configuration of Nacos fail, message: Could not initialize Logback Nacos logging from classpath:nacos-logback.xml
|
||||
2025-07-17T09:52:07.487+08:00 INFO 90872 --- [restartedMain] c.e.gateway.GatewayApplication : Starting GatewayApplication using Java 23.0.2 with PID 90872 (/Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-gateway/target/classes started by huazhongmin in /Users/huazhongmin/peanut/AppleDevelop/EmotionMuseum/backend/emotion-gateway)
|
||||
2025-07-17T09:52:07.488+08:00 DEBUG 90872 --- [restartedMain] c.e.gateway.GatewayApplication : Running with Spring Boot v3.0.2, Spring v6.0.4
|
||||
2025-07-17T09:52:07.488+08:00 INFO 90872 --- [restartedMain] c.e.gateway.GatewayApplication : The following 1 profile is active: "local"
|
||||
2025-07-17T09:52:07.549+08:00 INFO 90872 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
|
||||
2025-07-17T09:52:07.550+08:00 INFO 90872 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
|
||||
2025-07-17T09:52:08.606+08:00 INFO 90872 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
|
||||
2025-07-17T09:52:08.608+08:00 INFO 90872 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
|
||||
2025-07-17T09:52:08.627+08:00 INFO 90872 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8 ms. Found 0 Redis repository interfaces.
|
||||
2025-07-17T09:52:08.798+08:00 INFO 90872 --- [restartedMain] o.s.cloud.context.scope.GenericScope : BeanFactory id=5a741552-34ee-38c0-936b-699d9d791837
|
||||
2025-07-17T09:52:09.026+08:00 INFO 90872 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2025-07-17T09:52:09.027+08:00 INFO 90872 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactorDeferringLoadBalancerFilterConfig' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactorDeferringLoadBalancerFilterConfig] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2025-07-17T09:52:09.028+08:00 INFO 90872 --- [restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'reactorDeferringLoadBalancerExchangeFilterFunction' of type [org.springframework.cloud.client.loadbalancer.reactive.DeferringLoadBalancerExchangeFilterFunction] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
|
||||
2025-07-17T09:52:10.147+08:00 DEBUG 90872 --- [restartedMain] o.s.c.gateway.config.GatewayProperties : Routes supplied from Gateway Properties: [RouteDefinition{id='emotion-user-route', predicates=[PredicateDefinition{name='Path', args={_genkey_0=/user/**}}], filters=[FilterDefinition{name='StripPrefix', args={_genkey_0=0}}], uri=http://localhost:19001, order=0, metadata={}}, RouteDefinition{id='emotion-captcha-route', predicates=[PredicateDefinition{name='Path', args={_genkey_0=/captcha/**}}], filters=[FilterDefinition{name='StripPrefix', args={_genkey_0=0}}], uri=http://localhost:19001, order=0, metadata={}}, RouteDefinition{id='emotion-oauth-route', predicates=[PredicateDefinition{name='Path', args={_genkey_0=/oauth/**}}], filters=[FilterDefinition{name='StripPrefix', args={_genkey_0=0}}], uri=http://localhost:19001, order=0, metadata={}}, RouteDefinition{id='emotion-ai-route', predicates=[PredicateDefinition{name='Path', args={_genkey_0=/ai/**}}], filters=[FilterDefinition{name='StripPrefix', args={_genkey_0=0}}], uri=http://localhost:19002, order=0, metadata={}}]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [After]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Before]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Between]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Cookie]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Header]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Host]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Method]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Path]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Query]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [ReadBody]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [RemoteAddr]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [XForwardedRemoteAddr]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [Weight]
|
||||
2025-07-17T09:52:10.329+08:00 INFO 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : Loaded RoutePredicateFactory [CloudFoundryRouteService]
|
||||
2025-07-17T09:52:10.352+08:00 INFO 90872 --- [restartedMain] c.a.c.s.g.s.SentinelSCGAutoConfiguration : [Sentinel SpringCloudGateway] register SentinelGatewayFilter with order: -2147483648
|
||||
2025-07-17T09:52:10.417+08:00 DEBUG 90872 --- [restartedMain] o.s.w.r.handler.SimpleUrlHandlerMapping : Patterns [/webjars/**, /**] in 'resourceHandlerMapping'
|
||||
2025-07-17T09:52:10.524+08:00 INFO 90872 --- [restartedMain] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
|
||||
2025-07-17T09:52:10.558+08:00 DEBUG 90872 --- [restartedMain] o.s.w.r.r.m.a.ControllerMethodResolver : ControllerAdvice beans: none
|
||||
2025-07-17T09:52:10.591+08:00 INFO 90872 --- [restartedMain] c.a.c.s.g.s.SentinelSCGAutoConfiguration : [Sentinel SpringCloudGateway] register SentinelGatewayBlockExceptionHandler
|
||||
2025-07-17T09:52:10.595+08:00 DEBUG 90872 --- [restartedMain] o.s.w.s.adapter.HttpWebHandlerAdapter : enableLoggingRequestDetails='false': form data and headers will be masked to prevent unsafe logging of potentially sensitive data
|
||||
2025-07-17T09:52:10.746+08:00 INFO 90872 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
|
||||
2025-07-17T09:52:10.770+08:00 WARN 90872 --- [restartedMain] iguration$LoadBalancerCaffeineWarnLogger : Spring Cloud LoadBalancer is currently working with the default cache. While this cache implementation is useful for development and tests, it's recommended to use Caffeine cache in production.You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath.
|
||||
2025-07-17T09:52:10.851+08:00 INFO 90872 --- [restartedMain] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port 19000
|
||||
2025-07-17T09:52:10.881+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-user-route applying {_genkey_0=/user/**} to Path
|
||||
2025-07-17T09:52:10.894+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-user-route applying filter {_genkey_0=0} to StripPrefix
|
||||
2025-07-17T09:52:10.898+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition matched: emotion-user-route
|
||||
2025-07-17T09:52:10.898+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-captcha-route applying {_genkey_0=/captcha/**} to Path
|
||||
2025-07-17T09:52:10.899+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-captcha-route applying filter {_genkey_0=0} to StripPrefix
|
||||
2025-07-17T09:52:10.900+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition matched: emotion-captcha-route
|
||||
2025-07-17T09:52:10.900+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-oauth-route applying {_genkey_0=/oauth/**} to Path
|
||||
2025-07-17T09:52:10.900+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-oauth-route applying filter {_genkey_0=0} to StripPrefix
|
||||
2025-07-17T09:52:10.901+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition matched: emotion-oauth-route
|
||||
2025-07-17T09:52:10.901+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-ai-route applying {_genkey_0=/ai/**} to Path
|
||||
2025-07-17T09:52:10.902+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition emotion-ai-route applying filter {_genkey_0=0} to StripPrefix
|
||||
2025-07-17T09:52:10.902+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator : RouteDefinition matched: emotion-ai-route
|
||||
2025-07-17T09:52:10.906+08:00 DEBUG 90872 --- [restartedMain] o.s.c.g.filter.GatewayMetricsFilter : New routes count: 4
|
||||
2025-07-17T09:52:10.909+08:00 INFO 90872 --- [restartedMain] c.e.gateway.GatewayApplication : Started GatewayApplication in 3.87 seconds (process running for 4.294)
|
||||
Binary file not shown.
@@ -94,6 +94,17 @@
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
<configuration>
|
||||
<mainClass>com.emotionmuseum.gateway.GatewayApplication</mainClass>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user