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:
2025-07-17 18:10:45 +08:00
parent 9a3a8267b5
commit c77352877d
391 changed files with 46585 additions and 4294 deletions
@@ -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,3 @@
artifactId=emotion-auth
groupId=com.emotionmuseum
version=1.0.0
@@ -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
@@ -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