From a10df5928e798d3377269c3a617378ce9ea084e0 Mon Sep 17 00:00:00 2001 From: mapleaf Date: Thu, 11 Sep 2025 17:05:14 +0800 Subject: [PATCH] =?UTF-8?q?"refactor(backend):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84redis=E3=80=81socket.io?= =?UTF-8?q?=E5=92=8Csqlite3=E4=BE=9D=E8=B5=96"=E5=8C=85=E6=8B=AC=EF=BC=9A?= =?UTF-8?q?=20-=20`backend/.env.production`=EF=BC=9A=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E9=85=8D=E7=BD=AE=20-=20`b?= =?UTF-8?q?ackend/ecosystem.config.js`=EF=BC=9APM2=E7=94=9F=E6=80=81?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=20-=20`s?= =?UTF-8?q?cripts/nginx-aijianhua.conf`=EF=BC=9ANginx=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20-=20`scripts/server-deploy.sh`=EF=BC=9A?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E9=83=A8=E7=BD=B2=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=20-=20`scripts/sync-to-server.sh`=EF=BC=9A=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=84=9A=E6=9C=AC=20-=20`docs/=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E7=8E=AF=E5=A2=83=E9=83=A8=E7=BD=B2=E6=8C=87=E5=8D=97?= =?UTF-8?q?.md`=EF=BC=9A=E7=94=9F=E4=BA=A7=E7=8E=AF=E5=A2=83=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E6=8C=87=E5=8D=97=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同时移除了`package.json`中不再使用的依赖项:- `redis`- `socket.io` - `sqlite3`这些更改将有助于简化生产环境的部署流程,并确保服务能够稳定运行。``` --- .vscode/settings.json | 3 + backend/.env.production | 36 ++++ backend/ecosystem.config.js | 35 ++++ backend/package.json | 3 - docs/生产环境部署指南.md | 180 ++++++++++++++++++ .../com/aijianhua/backend/Application.class | Bin 731 -> 731 bytes .../backend/config/SecurityConfig.class | Bin 4283 -> 4283 bytes .../config/SwaggerResourceConfig.class | Bin 1343 -> 1343 bytes .../backend/config/WebMvcConfig.class | Bin 1502 -> 1502 bytes .../backend/controller/AuthController.class | Bin 4009 -> 4009 bytes .../backend/controller/HealthController.class | Bin 1423 -> 1423 bytes .../backend/controller/UploadController.class | Bin 4861 -> 4861 bytes .../aijianhua/backend/dto/ApiResponse.class | Bin 2246 -> 4698 bytes .../aijianhua/backend/dto/LoginRequest.class | Bin 791 -> 2276 bytes .../backend/dto/PageResponse$PageData.class | Bin 1214 -> 3028 bytes .../backend/dto/PageResponse$Pagination.class | Bin 830 -> 3445 bytes .../aijianhua/backend/dto/PageResponse.class | Bin 2370 -> 5003 bytes .../backend/dto/RegisterRequest.class | Bin 1295 -> 3819 bytes .../backend/dto/UploadResponse.class | Bin 1689 -> 1689 bytes .../aijianhua/backend/dto/UserResponse.class | Bin 2164 -> 4919 bytes .../com/aijianhua/backend/entity/Upload.class | Bin 4008 -> 7913 bytes .../com/aijianhua/backend/entity/User.class | Bin 3836 -> 7403 bytes .../backend/exception/BusinessException.class | Bin 707 -> 707 bytes .../exception/GlobalExceptionHandler.class | Bin 6441 -> 6413 bytes .../exception/UnauthorizedException.class | Bin 456 -> 456 bytes .../backend/interceptor/JwtInterceptor.class | Bin 2241 -> 2241 bytes .../backend/repository/UploadRepository.class | Bin 1123 -> 1123 bytes .../backend/repository/UserRepository.class | Bin 1204 -> 1204 bytes .../JwtAuthenticationEntryPoint.class | Bin 1431 -> 1431 bytes .../security/JwtAuthenticationFilter.class | Bin 3459 -> 3463 bytes .../backend/service/AuthService.class | Bin 4561 -> 4561 bytes .../backend/service/UploadService.class | Bin 6151 -> 6197 bytes .../com/aijianhua/backend/util/JwtUtil.class | Bin 3742 -> 3742 bytes scripts/nginx-aijianhua.conf | 119 ++++++++++++ scripts/server-deploy.sh | 85 +++++++++ scripts/sync-to-server.sh | 62 ++++++ 36 files changed, 520 insertions(+), 3 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 backend/.env.production create mode 100644 backend/ecosystem.config.js create mode 100644 docs/生产环境部署指南.md create mode 100644 scripts/nginx-aijianhua.conf create mode 100644 scripts/server-deploy.sh create mode 100644 scripts/sync-to-server.sh diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7b016a8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.compile.nullAnalysis.mode": "automatic" +} \ No newline at end of file diff --git a/backend/.env.production b/backend/.env.production new file mode 100644 index 0000000..cab2f7b --- /dev/null +++ b/backend/.env.production @@ -0,0 +1,36 @@ +# 爱鉴花生产环境配置 +# 部署到CentOS服务器时使用 + +NODE_ENV=production +PORT=3330 + +# 数据库配置 - 生产环境MySQL +DB_HOST=129.211.213.226 +DB_PORT=9527 +DB_USER=root +DB_PASSWORD=aiotAiot123! +DB_NAME=xlxumudata + +# JWT配置 +JWT_SECRET=your-production-jwt-secret-key-change-this-in-production +JWT_EXPIRE=7d + +# 文件上传配置 +UPLOAD_MAX_SIZE=50MB +UPLOAD_PATH=./uploads + +# CORS配置 - 生产环境域名 +CORS_ORIGIN=https://your-domain.com,https://wapi.aijianhua.com + +# 日志配置 +LOG_LEVEL=info +LOG_FILE=/data/nodejs/aijianhua/logs/app.log + +# 性能配置 +NODE_OPTIONS=--max-old-space-size=4096 + +# Swagger配置(生产环境启用) +SWAGGER_ENABLED=true +SWAGGER_TITLE=爱鉴花API文档 +SWAGGER_DESCRIPTION=爱鉴花小程序后端API接口文档 +SWAGGER_VERSION=1.0.0 \ No newline at end of file diff --git a/backend/ecosystem.config.js b/backend/ecosystem.config.js new file mode 100644 index 0000000..e4244e9 --- /dev/null +++ b/backend/ecosystem.config.js @@ -0,0 +1,35 @@ +// PM2生态系统配置文件 +// 用于生产环境部署 + +module.exports = { + apps: [{ + name: 'aijianhua-backend', + script: './app.js', + instances: 'max', + exec_mode: 'cluster', + env: { + NODE_ENV: 'production', + PORT: 3330, + NODE_OPTIONS: '--max-old-space-size=4096' + }, + env_production: { + NODE_ENV: 'production', + PORT: 3330 + }, + // 日志配置 + log_file: '/data/nodejs/aijianhua/logs/combined.log', + out_file: '/data/nodejs/aijianhua/logs/out.log', + error_file: '/data/nodejs/aijianhua/logs/error.log', + // 进程管理 + max_memory_restart: '1G', + watch: false, + ignore_watch: ['node_modules', 'logs', 'uploads'], + // 重启策略 + autorestart: true, + restart_delay: 3000, + // 高级配置 + node_args: '--harmony', + merge_logs: true, + time: true + }] +}; \ No newline at end of file diff --git a/backend/package.json b/backend/package.json index 0ceff12..91d2b22 100644 --- a/backend/package.json +++ b/backend/package.json @@ -22,9 +22,6 @@ "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", "mysql2": "^3.6.0", - "redis": "^4.6.8", - "socket.io": "^4.7.2", - "sqlite3": "^5.1.7", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^4.6.3", "validator": "^13.11.0", diff --git a/docs/生产环境部署指南.md b/docs/生产环境部署指南.md new file mode 100644 index 0000000..32c478f --- /dev/null +++ b/docs/生产环境部署指南.md @@ -0,0 +1,180 @@ +# 爱鉴花小程序 - 生产环境部署指南 + +## 服务器信息 +- **服务器地址**: www.jiebanke.com +- **服务器用户**: root +- **部署目录**: /data/nodejs/aijianhua/ +- **后端域名**: wapi.aijianhua.com +- **数据库**: 生产环境MySQL (129.211.213.226:9527) + +## 部署前准备 + +### 1. 服务器环境准备 +```bash +# 登录服务器 +ssh root@www.jiebanke.com + +# 安装Node.js (如果未安装) +curl -fsSL https://rpm.nodesource.com/setup_18.x | bash - +yum install -y nodejs + +# 安装PM2 +npm install -g pm2 + +# 创建项目目录 +mkdir -p /data/nodejs/aijianhua +mkdir -p /data/nodejs/aijianhua/logs +mkdir -p /data/nodejs/aijianhua/uploads + +# 设置目录权限 +chmod 755 /data/nodejs/aijianhua +``` + +### 2. SSL证书准备 +将SSL证书文件上传到服务器: +- 证书文件: `/etc/nginx/ssl/wapi.aijianhua.com.crt` +- 私钥文件: `/etc/nginx/ssl/wapi.aijianhua.com.key` + +## 部署步骤 + +### 步骤1: 同步代码到服务器 +在本地开发机器上执行: +```bash +# 进入项目目录 +cd e:/vue/aijianhua/ + +# 运行同步脚本 +bash scripts/sync-to-server.sh +``` + +### 步骤2: 在服务器上部署 +登录服务器后执行: +```bash +# 进入项目目录 +cd /data/nodejs/aijianhua + +# 运行部署脚本 +bash ../scripts/server-deploy.sh +``` + +### 步骤3: 配置Nginx +将Nginx配置文件复制到正确位置: +```bash +# 备份原有配置(如果有) +cp /etc/nginx/conf.d/aijianhua.conf /etc/nginx/conf.d/aijianhua.conf.bak + +# 使用新的配置文件 +cp /data/nodejs/aijianhua/scripts/nginx-aijianhua.conf /etc/nginx/conf.d/aijianhua.conf + +# 测试Nginx配置 +nginx -t + +# 重启Nginx +systemctl restart nginx +``` + +### 步骤4: 验证部署 +```bash +# 检查服务状态 +pm2 status + +# 检查服务日志 +tail -f /data/nodejs/aijianhua/logs/out.log + +# 测试健康检查接口 +curl https://wapi.aijianhua.com/health + +# 测试API接口 +curl https://wapi.aijianhua.com/api/v1/products +``` + +## 环境配置 + +### 生产环境变量 (.env.production) +```bash +NODE_ENV=production +PORT=3330 +DB_HOST=129.211.213.226 +DB_PORT=9527 +DB_USER=root +DB_PASSWORD=aiotAiot123! +DB_NAME=xlxumudata +JWT_SECRET=your-production-jwt-secret-key +JWT_EXPIRE=7d +UPLOAD_MAX_SIZE=50MB +UPLOAD_PATH=./uploads +CORS_ORIGIN=https://wapi.aijianhua.com +LOG_LEVEL=info +LOG_FILE=/data/nodejs/aijianhua/logs/app.log +SWAGGER_ENABLED=true +``` + +## 日常维护 + +### 服务管理 +```bash +# 查看服务状态 +pm2 status + +# 查看服务日志 +pm2 logs aijianhua-backend + +# 重启服务 +pm2 restart aijianhua-backend + +# 停止服务 +pm2 stop aijianhua-backend + +# 删除服务 +pm2 delete aijianhua-backend +``` + +### 日志管理 +```bash +# 查看实时日志 +tail -f /data/nodejs/aijianhua/logs/out.log + +# 查看错误日志 +tail -f /data/nodejs/aijianhua/logs/error.log + +# 日志轮转(建议配置logrotate) +``` + +### 备份策略 +```bash +# 数据库备份 +mysqldump -h 129.211.213.226 -P 9527 -u root -p xlxumudata > backup_$(date +%Y%m%d).sql + +# 上传文件备份 +tar -czf uploads_backup_$(date +%Y%m%d).tar.gz /data/nodejs/aijianhua/uploads/ +``` + +## 故障排除 + +### 常见问题 +1. **端口占用**: 检查3330端口是否被占用 `netstat -tlnp | grep 3330` +2. **数据库连接失败**: 检查MySQL服务状态和网络连接 +3. **文件权限问题**: 检查上传目录权限 `chmod 755 /data/nodejs/aijianhua/uploads` +4. **SSL证书问题**: 检查证书路径和权限 + +### 监控建议 +- 使用PM2监控应用状态 +- 配置日志监控 +- 设置健康检查告警 +- 监控服务器资源使用情况 + +## 安全建议 + +1. **定期更新依赖**: `npm audit fix` +2. **修改默认JWT密钥**: 修改.env.production中的JWT_SECRET +3. **配置防火墙**: 只开放必要的端口 +4. **定期备份**: 数据库和上传文件 +5. **监控日志**: 关注错误日志和安全日志 + +## 更新流程 + +1. 本地开发测试完成 +2. 运行同步脚本上传代码 +3. 在服务器上运行部署脚本 +4. 验证服务正常运行 +5. 更新文档记录变更 \ No newline at end of file diff --git a/java-backend/target/classes/com/aijianhua/backend/Application.class b/java-backend/target/classes/com/aijianhua/backend/Application.class index ae14b73378cd24e84c38a2c0209de4a1d11611bf..c3503f0d389e668ddeb5af80bb1ad73806573d7f 100644 GIT binary patch delta 207 zcmcc3dYhH^)W2Q(7#J8#7-ZQQm?qk&FtanTOcYlVWMp7*&QD3@Vqj+AuD19|#Dnh{8|YHerW z*a(*90+JwU2A~3NAjtz!0Hk?=JWd8a27aI+AkAiA!x$Jigc!AUFbISr^m74aKx)|; MxS(cCUeBZh0IU!e0{{R3 delta 210 zcmcc3dYe`J)W2Q(7#J8#7-YE^m>8JZ8CZB2SQ*$RnkWI;920p}1h^Qu7`WLPcz76i z8Tc3(v?hOGl$`iqaIz?49*c8+O6tV)lF1E>8|vAC`ayt+fe~Z^kmLvQ^no-ZkY?4| z&cL`4EG+;eLDCEi>-HjIIRLx^2#2Lop~LO;l{ QAhqm3$3e`Pyq-x10IeVx82|tP diff --git a/java-backend/target/classes/com/aijianhua/backend/config/SecurityConfig.class b/java-backend/target/classes/com/aijianhua/backend/config/SecurityConfig.class index 745770554be4e0e9bf24a663f561d18e2cf42286..130687dba5533af2827e1ed2ae5de5c9cc314d14 100644 GIT binary patch delta 1056 zcmZ8gOHUI~6#i~I?M#Qk@)8iW7I_FQG892A$Xf&v1w_Dtpd$=)u$EE>Fvf^sY24Ji z)Wo=Tg^vtDf?@5-#DzN(;+~&iJTnq8W|DK}eD^!wdF0-$(yh{*FTXy02GD?~B3uk% zK9?2tiVzqkxt86LnF#PT&jkN2$AqH!6_ZEg0>18R4l;Nz7)iryWpGzjk1_~d3p2V5 zH~b2+pzy}5pQKaF(4N^1WZss$i{R(Q%2bWq{cu`OnZ`o$frtP@{=BxVsR=DPr~W;W z5yVLmrI{aBJPOKC&a2s^w-Qw%PVo#IB(NGGzRO}#5H$);qn3BNUN_V+Qk{MS+A(*uaX&Td-sn6K7 zUImvCqP1yBii5bKpdVNHS79ZeVL*WgUKv9e7IB?n+-al6dz8Anff3&0-BgA!W=q^; z=&a&zyb<0a=Fu9)6-?k39}`!6Q@A7IHbZM>xBP`vLb)35@)BvtH-lLb`XAkK!sig@ z-=wW9hIs`($RZMa&u4EnsbB#qJ|I8y331a*G4%Ckc6(X#hdpJJ^wo*NTHc{F_QEUT8*6H7c1F^tAV$!~tfD#;~{*Mt? zpzPz0(ibY`B4jpf;e>^X9Rw|eg>9%YcV1-J!kHaJEi?<;s}9t909j~v&MsQ$ankxi zA92mXpoLKc>hgg%5Z zh#Cyj8yJtG4mwfnH5LBpd4DqM9*aoROb_VHL-(7U8zxy7mLT%yIYECEkMV>k4dhpm F`x|J!zhD3W delta 1021 zcmZ9L-)~c87{@h6|ea*66<=Y7W6g*&PWc@<(`MV&a{b8lTfaM!Y!BulISs&+~oW=WGmY4D>ws z_orWggM8r-!Lo^JI*7HV7I(&u_!Yk~rLcxa&e_Bj)2(9G{1(ZjY%GTa+NMjBq}w#D zljfndklaDqW~b&Uo>rV{6(>zCnl?A0^YH{dnrGN${)m2ixL1){^VU7L>{V9W*+$*3 zti*Xv(d~LQ-(4Sby{nB?H=lRtqu*vg^E`VLUv42r&Ar&5>5FB}(bz>-M$81d}#LG_Nq#>e}D>W+CM;P0{A4<`}Oj&OdJIq1|gP z#_z_bc|C-iG5wu0GLI9QH#uplo!645c-!V3&AXgd0$0qL(Zp^u?wn4}a>nMY<{WcR zApYv~nm?TlJ;A)@JRc}}*32!HF=aI=Z@6G?C&Gze)O>_z()z2`KXVNWGQ73ad?V6+UZH zExbK0I!ugjV9(#7^Ew$C?GPzU;Z~{`BBmy$g zpV>WcrJtP*$Zpci1q?k3jckR&NI+o|G2DRh_O%!DKXN$W)qvw||Bdf?E8xAkg2dlX ze;9CKZky{Nx}@wL9CBnBlrjOc?wxODAPuD8``7CmfIM;nI48{Q#61j?b?r`58(Oobo|fx+ z#TMXWIB;(GO{dE#NngQe8ulIozqWqP;5js_x&$5p83IJ-k^9&Z5cxN!WVeiFO~e#K z$m(ddn%>H`jog)e-H+oD%S9Eo1P%jTT|OZgYDBw&%@gwV&knr)a(8Oum8 zM73)5Ot;K-tD+apifdUSRu}?mM=#g4mZfGgBGL?LXP+g-pQfYnpAWP-7`${iM@l5@&Et; delta 401 zcmYjN%TB^j6r9@!#nM8lQUzaC)CdM@j7As47n@354uG9+4Uw^H$%g&V(k6dvvC?@%qn4_VlyZWXy%dkry z*1C_TEbTQez3#^scg63ADVm&NhSms~rYE$ia)=qRoPPm(>f3XKp$$YaPpAzZAd3a6 z7#6WaO>EM4)JP!SSdreKoQvkj$unX@og_VaHgxvQiGNn6Z~diN)F;fbpd&*ES%pE@ PPWIESK|+|$O}X$3S$se8 diff --git a/java-backend/target/classes/com/aijianhua/backend/config/WebMvcConfig.class b/java-backend/target/classes/com/aijianhua/backend/config/WebMvcConfig.class index 5cfb83252d3580179e2435c81fceb689d2f83134..28464c18884478d1a3e8ac640438d81b8fdd08f5 100644 GIT binary patch delta 466 zcmY+A%SyvQ6o&tqBu!0Ht*LEoy|!LzVr(o7V2?d6Pd$o6TvF~m>L7i6Mp84mZB){L%_%x(Ki-&U( zd*~}7M2*Oa^cadU%4{MdD%KNvo9*j3#ZU~A_frg|B!GzokzoKyG6{=objpeOS?d9* zM-0lZ7_BZ#=6K~1`F0|iGqksM|Ex{ORAQo+?6PE*BfGFo>eni4BbrKH@6J3A`~YQf BN!$Pc delta 453 zcmY*VO-lk{5Psg>)zx)PTR-~JO8e4PShOxd1Qke!puk8vuDbYvY+E(4!RpLyYdSA-1Z7M^u@l^(ZF2ow_#au( zYB$W92T=w|(=QuZH>atpgjvjqn3u7Dn4RN~>^uH?dyye9>Crn@{kL&hMglR0ka1IK zb*jdRZq>;wqitS^SYg<=ANYLlUg>?7T*ARc)v!<5i=7qTZ#^WEAxXwLcN4CXdN<)3 zp;IIAv1N0?Mb#%rQKRL&ZE;7a-?H|K$GNb^W$ diff --git a/java-backend/target/classes/com/aijianhua/backend/controller/AuthController.class b/java-backend/target/classes/com/aijianhua/backend/controller/AuthController.class index da5ddf08f5ba1f11e7b4a7f42836485ee4225792..7cab3052a616b4682d06eb977bffc5e66a38e255 100644 GIT binary patch literal 4009 zcmcImTXz#x6#hWeQv_~c*EwOoL*^auDq(Es3r%kNC4)5$Vn1%#EAIcM)VXJ5X3nf=E>YSHq>6NYR40BlBj-m5#tn zca8fw*Vdb!5}{PfXh)%KBW2_kUH&aI?cA@G8RX0#-*6J0Uv66mQruQepG zTVV1@1Vyqu+!g&I%O|C5*{fk6_6uytOG`S2D`#w0t-wGnWl;e=k%$E`jGOTn%V2lJ-g398l5zIh7PCcJp3*RkO6URfkqJib(Nmn8pkvlXWB$fB>he09Ah@*|=71 zK?T(A;nf-zyQ}h5U{8(C70C{Xgge~aIM=Ouk*_>F^ zmF+|YqN0;@j7xXk&V_A;-M_hD=S^1Fg<2J+P)VyZkKV&?KWUkd-?UqF-%r(Jq=svl z6Bz&B)t`YyuMTZ5nNX}p1-+%DicYogg_QBUb zr~~@>7`=&JOAu-Cy@N`mBt6q8oM9H;3xJ9H2Ska$?AMu9{m~RJ$1C_hcvD z*YE*8T<^+b)|^f0j|4!4XDU%XR*Ay)*b&JNKLkuFrFsnpfrmx7LM-!k+V-5RJY%X^ zadYKdd_-kot#P&5)I$s0^|6|eRG)OKU-iet^_fZ2jiRY9_33H|M;GUoMvnLb4QhDd z8Y89FIM*hw9Dn(2Bc*c{T$_9ELi>rE2DJ034g;I8kx#9B03D>2&?GkV{TA*U@Qg3I zo!qVbKYInDgl*{LyEdi$Ic~Nqg8#p1Q!`hm_h&qR@D6s2tIeT1*fVh-2QJ@5&rnlm zQ?i$wL%-mqMqDB_NNOmgPLMhoQlq3!htxSzuZPt5;kE5Ood1zp8-2HW>9?||6+7rg z7k9hSgFP6)UYzDgHI4l+IP?_ARj&7!Ee>3#?YM|pI@$^om+&S%OtMK%;4B7)m5YMpD*w%bvJ{-xsBsO>Ocgk@RpAuv0i3G=oVlk7XP)4i zYltS-z)co9o9@9{hxdpd=svpIPhbWJz#xG<#@!I%O%dK`fnHO;y5*VwPx~O4&&USQS!x zfbo0dhwkAcWeQv_~c*EwOoL*^auDq(Es3r%kNAk>4YX-fwg$ZoH={W-e>Rce0!grzyACEPXGh> zCW#hAVu&heMVmn9ytb&RMa?Xz7qjzv&J}1IHcZ1kDG=%Dok<{$L<~sLIEptosFfw-*~49C@Nfr*|5TjpI$oeY*u>Nh>zanrpG*6OBfxXbEgy6L;M zMZt5}DzKrTo4T#J`m{wH1O^*z7B1-r0YV0V2?Lc0mH7Ib$kFOcd9Z=A8XZ9Dd2Ukv*dyo3Xc zX4L_1&hsyMq{FeEkiTV)q}NKqwu41+^ztO6&Y0ffz&3*;1NX_Sc72vSy@YOzKX_G97v!%h@^!K!DSAfNDgj$ISSo zI;-Fu&eNTuRWL}V@kV5l${D%lNoX6#n*vEDyQ|sPJ=;euqhMSjq7c;)|I1~Y$X%r5 zpC2DS`s0Vc?|%R2+n*#dmlRB5is3q5E~h(=@7@|7*W*P~IQjrwRxpDrtMnK%XDxxD zFswdp*8^43s&Y6qdJ0#i<2=ud& zmn{2+n$c#(Ng#EeHgz?F@e1eA_`R^ z#*hl}Bgk`F$di&1!J6vB)mv*3WVQw<9<5zEyw+++5)`A8G}t+=yK`24LX$_#%Yi46 zm@*2c=6W_y?7L@xaNwI?)LB!TbX7Wgv@R!?^sJgSc;klXIAJ+1ZI|Rl!s@Z86+K3i zP%9@Zu%njyvhdaLf4h&@EtRSUPlHLJ&d67q+f%Dr#jZxbd0zvTowoAJG=6D4#G9&c zYYDCR)w9axrgspy+w|J?3Q*{Bc>2R{Q-eF8gOz#Ivu);)tZV|upQsv!oFUw8GFN3Q z&>6}PzoN3>%Wsv!DX<Zz~l_o%CxuBckc zP#61E*KxzUtc~L}j!};6_xXI6GnJ#@*xGj=;upTO;5|O&XRz6R zpHFFk3veADaAb1|jo+p6zlcx{*nPhucJLlHjLVlp_ptfGLu|WxA6-Myu4w9cN?!O4 zdm^~PSr2D@)!7lwUarnwg>ef%IgEX{xf%t_@4G5$@gv~uoEeU-i>tm|{b#;Q)%1%4i149tY9TcVv-cR0$Z!LudRc#(5I6wBL;@C}56|8Pt?G zlqK_&+@PdYP#H8WVO#J~?%*PmKkFKVgA#7?TLNM$2b({Kzjk>pa^mtQ*ywp>I7LSQ z=Sl$QnP&;-7{Pt3f@rD&Zt6l;^Z_PT;XOhI0sV|&fWQnAfMW#mINyc{Z<_E96W$ZB z2-$7+SgR1PR3To$B9<6w0?Sp1OI3&qYao`A5X6ggpbYV?IuI{60r72o$Wxb$ognlP zjvWES)8mI8;B6UhnfLN9F>s!)j`^YNDzC1F(t$hp$Pc9zALA3Q4tQ{fYGo%stvdNx jl?N;S!SheEz~@rv&`b-y@VEWaU!UUqE6%^J>fHSwt3qV6 diff --git a/java-backend/target/classes/com/aijianhua/backend/controller/HealthController.class b/java-backend/target/classes/com/aijianhua/backend/controller/HealthController.class index c8148da9c749a8e06dc215d4566dfe9b7bdda695..43e2c25057f6d192dab49ce3e4b550ed6553e3e5 100644 GIT binary patch delta 500 zcmYLGOD_Xq6g~GF?M&N2J7`glDlJ-!dOugS=z_2yB36@{M5Rr|Of77z*hH3rB7{zib3?D#g`%D_tm7@?)Q?X16m%23mTlM-OF=I|?Ck{5 zhXEP=gx3EeE>JOuSoJzP7bp1aLdoQ^61N#aQbvLhX=J;CzFE#2#SOzYciB@him~c< zvMoiBE%WTWkT(@fI2j82rZ6o-CnWfqghxdNGtLF&oI7#md`b_O#Mih_fZUVV%IxWk z#OO&qLwRb*ezvX*gb-k>HWL_I*(0=}om&N&3(n9O-RurVx8W6Qf>D1(=fN|=n`teg z_0*A!O4v_pLp2Q7(d6S=`j6Hy`N%aA{7%Rd-FByjn_d2 delta 497 zcmYLGOD_Xa7(Mr1+-YZ8I@M{_qaJ;rsQ257g$0R?h*%9KQPF5jv5|CTEzMop_zAVD zMuUdCzywcki8kr^i3OU)})BVl4;`A<<%>6>YVR!EFhRA#!S8*@eqW z@vN|EyC>UrIS2`%L1$=lD|Y45)evIfyE{7C(IF8rU?R#8`bQEN zT4+`>w5*>WJGJWvbtuXz&fe9Rs8_SJkaswkw-VW5$_nHe`PR_}*rVSbA?vk)2u8^o z%?rq5j53CCOhEYHTk_t}!Ykx{1A(o)88nS&ga!8UX6F;EzqrS&_Wj0B=&ut-z~iw< z3J`-vQIuXFg#>XXeO{|M`Jw9{}drSP0h+QMKe_4^l5YCJ>~O$zTn$MziJ}F Pu|$PsYOfrCxmf)HK!8N3 diff --git a/java-backend/target/classes/com/aijianhua/backend/controller/UploadController.class b/java-backend/target/classes/com/aijianhua/backend/controller/UploadController.class index 8d5577bbeed22cef7d3afb57ec4be3618ad4ad82..80d2b9bff0525574fe3d0ba925d17c9dc5e94f18 100644 GIT binary patch delta 1857 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 diff --git a/java-backend/target/classes/com/aijianhua/backend/dto/LoginRequest.class b/java-backend/target/classes/com/aijianhua/backend/dto/LoginRequest.class index 39acbab3138da014ce2d14adfccb48bba8c53fc1..89dec945a9e3b497f6289d16687c1833e850441a 100644 GIT binary patch literal 2276 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 diff --git a/java-backend/target/classes/com/aijianhua/backend/dto/PageResponse$Pagination.class b/java-backend/target/classes/com/aijianhua/backend/dto/PageResponse$Pagination.class index 67bf05da04d6cf70c0d7c228431ceb3089af451b..796ff1680f7378f0f78dda2314f47c4350a5c475 100644 GIT binary patch literal 3445 zcmb7G-A`Oq5dWRs`?bq$3$#F&wzgHQut3*-QkJ5&wIArxVyS5BS1)i2mo9hd?xjyY z_+)%C@yW!*SDTnVXk%%jiP4vu_&2HbH|O4Emx6!^?3pt&=XYl2H)nSL{O9Li0h~nD zMoQt>Ol7g)1q*=}&M$j~X>aDPAI=tLqe@}IoAa;xwWUf}^Lw}nLN5v`p$$W!b-}yu z70O;XSGYF4;Lk(~#uEJ%c9$Bau`u%I{OX8;Sq>HhI+;-=^2$8lX1wy0R}EyJD2-@7 zAlix2|4xvxlzN-ut7oyfN@uZwOW#xm3Y{)YSR(CpVaHOp3kMm|?RSxd#j1?^(R^ig z!mE0Ve&kmfzdh$iLWDv`Z{G&+3j3}vhf%QTkA?SxTEGIF3quxJsN(tdQn|7?UAbGh z?1z5Ui~L!p=Mc0M6C&b`n3MK37bL8RUGA4qYV}Y$H!6>i<%IxH z<=&{C5h22Zs4Xo%3IG7m*DqJiN}X7KElV0+*?}WWKkI0h~p+w)`T(Q;5IWEIHa@G zS56Dy%yT&PD>uPmWr?GUH0ppw;ZBpmUBK%0NwjxeT*oBIpR6obXZ%Zn%$K$`Wsrg? zxMLyT(}l8EtNAq>OA1G}H)x36C?pQEJJTG;22wI0D5YdP=#|4kuN)0rchZydkDoiZ zD{xg@&HNMW{878L^3&4FQ)r_su5>^(lfyd~|4?adN zpEDj~UjwmQUp~YD&oG=}hEXKm2y!^9Z#l^uh?LwSlB6Lwck4t_T9Q;G&2E`<#5zE^ z&Co|}iVpv?{8#dv8QdYt0&{1L6eQ z0%+g%fR5l57W4TU6$viIwltv)0%J1bB6Y?dt7KUTSwe@&nZl|n^llB`wOx2=WsZ>; z-q!Ga$Zr*WZoBZ(R;%!ihVS1x`ljyQyg1UUtMFM3&o7zv(W_5c*A^!Es6YQ5Oygny z?@-^sOh4@Z4QhNKzk;KBOX1kn0e%#X!9UQFGoGUD0o=iyv4RtIk5fgHE~koC&J-W( zDcT=kN6ySyO-@5an@&STCufV3lQ`Kqr^#u!n4!~fF`LVXQ#NtRi7vcD$m8%fnF@@x=n-gAiRY1cRNiv9d5)X}!t@m+&yKu`-cg*zA`WvoW#2 z-oK%+HQqbW+;d;&+%xlQPtB{Jzpp8P7OGh!kW4`;7%&B_uKVIPdhVdpxOwP$kAZ-B z?hpLnLLhl~beBOInG~`LOHcyMaMld(%O!5FD6DeN==ps=;7(3q4f*i3Sm0_yVN=ha z-HtaFke9=@7k+=_>FTu?JPq5o?#S(Xfj1gQRpV6d3)I3{Et(kCTbgVFk|N!uEWx)l z(glsAt&t4CguoV64MIU^IG+&jdb~}M$G{m16xDnIHi}d+xkTbjo)8*@Hj&H1IgXKX z>M@p`lNgp$kTKR5l2P5PbXlx5CoIH>s@?K2Tl?iV*!(9*>Wn>0lqt_iS_LhE#-NYl TC+_H2!7gEzyrr>+17!XIvV}Eq diff --git a/java-backend/target/classes/com/aijianhua/backend/dto/PageResponse.class b/java-backend/target/classes/com/aijianhua/backend/dto/PageResponse.class index ee33cb3a4012c25ee320055c61bb6f0e8a2a4738..6963dca3c682ad72e0af465c75e0b9d3707763b0 100644 GIT binary patch literal 5003 zcmcIn`*Ryt75=WJ)ym2`wN=}RQnw`31Y5Ez+=kLxj!BvqPUXbJj=`mrtmTcoiL`R1 zmD7gzI~3BESAp^<&xRlJ1I!Q`$P5EBOkwyx%J4@3`-Xq~faYZa$v>4+-y zUNYCsY{_(r*|W=+tb(f$EmT%4g?sa@tr^F)idHqJpqH&$jY<@fq5XNcYCA=4M^{YO zRG7$j=EAV}bDT$bw0qtzI;LB%Qum`fJwLUukejBG*p%(q?zBQ=WOR}49AhX6M9^oT z2fG#S$=i-~re0pQste|F$qS=WFiVSO)s}U@jJm6KO<|-%H)wb;-=^mIwT7zk4s|pl zSQ-iCwUPG_D@b*RT3ZR0bUgF_(e1lFy4Vec`wVD^33a~#9dV)FWuO}gVr|xPS1T)X zX4NcPu2p4*^;*49AfgoJM)H+vFf`JUi6cRYLJ0D6ql-EoX6ttDzRh;ED~|Yn z$iVyYD4Uob`R(Pk;7kIKVN%EA3VmCqiGduZ2!VC8RJYDvWDkwZ1R;3yr~!V_KW*TH zqF<-}dHbp*yrTx5z%jy#yoHKumQIwcGE>0_+5M*zIDu0-PAcqfna)?7qS*Zq=iA8X zur=AqiQ3Z!o)l9(4Ye|(Y6(nWR))wKg?wB7g3%ZPTEp=W%hMiOH$+AkrABiGK8$lT z$r{mGkXMeuP6v>*d2ot#jAKE;_}7b@Z@%=(Kd-&~<_oVS*oBMY{a((*HE(<$?5y1g z9Fdn9t&r*HOkh5Qf>?F0jU1ft;a9Ult@9?!!JdKI*ayJ}TAL*(N-T=0;S@OZ(( z@HUzkkRE@px%SV=2ZKrW_xwesLkvu%8e__dWjQQ3;c`^H+|BEeHY?x#jmc87de1i1Igz;QMXGgRyB^7nH%bjdY@RF_;ryf?2P+}-8Tl1o+^ zyZO9_oTGdzzP0owdVfnIf+U|Yk7?ju(uOa9ehhFm*v8qzm8jdxbH0I;r}i4nN4eK8 zYSWop*q0u=g`xELEj-Y&GDufJSE4-Ajb2iHw3zg)rv3AQRci9W5?A}Zz`8t2LW_7l z4br0Q^+S9Ts+*oiu%C2K#51Im?DqZ+;N4A!AM_mlE0v0Zh1(cj+Qh+pCjAGzS78I= zncJ9H;_4B8K`#6rA0T;H!6%Lgahx1>138<>Z{X~0sHHyqo$KU$W)tUsL%n`l4|?_o zSeHSDxraY{=}C%rntl8q<~|%D=NRty65t24fREs#JRe6MOI{tN0Ij{JntM{F{ak5^ zN2Ds8NDS%Yq@|kA@ZDbU-(g?NGr!=m4hzn~_BN`A-l=L%%4TT_+j{@NJ2kNaize<& zOr8-50%9IqTObW*#?O0<;F4C5#7eL6{zlqw6WJ30?&lvXp%K*z7g2mWgF~Gfl&0Rs zpzax5h0XTy8}ibYNEgGAhT3uaNc}0&LSG|N$%3?66MfRjO1^?yV^#|^EiHIGlYSjq z^k(KSP_IIZ+|2wLYIZEWfwH$Gv36#RkICrx->@qceFJ?rV2r1t8>luU+)0fh?qn>b ziA?MbByXT6rKMsaq4i0fLhF<9lrBQ?KuAx;8$!{WbSN4cdwv%@?K|46^>sXl=NZ@l z->U;`Pwmtwa3>gE}Jojg#E#ligvm0k-Fu_^8}YwkDnzdqvH}q-0zI4$pZ% zU?1FCGhmHjO292}%U%fFSG_{>RzS^nbdx$lo_vMQ_vWUehrMzR_2yPt%y@6+2K4a_ zeCdMl-N~qIq@ux2TuSV3txsy+7OU$Wil;PhYv}F;oAwO`{zq^QU%^-DzlJ$nBh|(6 z`6Rx^m?C%(590+=QA{(UuanY3ah?z2ltNrV>@A8!SqP<=e7@e|v$gIL#sIX2Ktm?l z&I-h0A+eU^om>jjab6|1W)@}ffsRew#`UG-OPlznWOoDKPJV9#Kah;_mHd%UuM7Vt uq&M)>?Z)LqkhNB=g(J0&;OBgH;TOR;`6YhEb&{N6y74-jWP8vumMy#h delta 1052 zcmY*YOHUI~6#j0fW!hmtC@rsoNGYWcYC%C%DuReoC@-mKeE@?@Y6-MjswQsO5=~Tc z6J5IT2j~KdHgRFp82^UBxNz;t7|)$n(M)pBx##hn^PO|&VaGdr^z*MbZvpf`Q(%H5 z!>q!BGKQ)Z?XDJH)zZoE)Y6K6Bgaq{Nu^V{0S3wEpR>UVn+!!oIaCHOZ?$>1V$F)M zSE@LGs;yLuakHzafn#g4zf49gLs&%eh}Gs);Dl6;1~kfWsc1qogNJuX9{xk}Se z`(&c&oSxLPykKr`YCu>;m&lhXe>Qbr7nny>97PZRX?D#WL!XS}0^|fkp#A`sd}bqSsq%3T`*I8cl%0aK3AxhUo^dKY{g;*C*LqHL|f&_VH{Y|$t9Tp+zd zqGV7SC;=t1v#=qKixeWLzK3i8#0zk4B=V?>1p}{9&#;4o!2;X~x_KDPi@WfVdYGZ8 zbPJ`IEGG?19;bFNSb#NAjZYL|KO4;B+)FA@9G#bng8l$2^=n5R>gj8v*VBnc^umQf zvJKxuvoYHur8wqriIS`|`^!X^{Xegp+G|eLw=0YGQ#HHl z>rfT+U$QP+xsv6s{c7%<=bz?V>(ru`?P}Fp<0At%fAji{ zm#*);a%KD7EB}1qz3q3mZoaXl;As0h7oOc{f6Lggs@12xN`ZFny!GPEKR(|sfBgU3 zvgABx(~fxAapR0%Lcw6DiMiM0ySYqtMTBboU#LK8do&pWPtu2x>LD;F$A zSn}YlTBT*H;>bB-s(#U7$j9dQoN>A<7M+jcCU4$m!jv}+;fsI595RuqGiSvqVcucl zpfKw`iHE`;H8BwItF68c40pRavaI0ND5-PqmLv)^_cR<=X|C+`nM^ zMXzw)s<0+mzVtcGx9VQdb~%N)5i+ni#7OMJOe9$IR*9l*hJ__RIr3-Eq zur{JXGm2KVC`HO{86KIFU@V(h!Ug(resOMLmd?&8NL1`CTQZNbw&!Dq^nRNwU-(CH&y{eZQYp6E^_21ZC z{qeo3m%?kP&jjl4+FkwadsQ#B+E9NmQ2)){)sO5|y|h3>{Xn3e-<0muD(^FGeN54( zW23J@Q?HGE0Oj}4;@8IBhq5p}x`}&&BZ+&@jdRJX6CWd;RX@TlS7A3Rc|x5E3T3c=vdA(q`p2$9pV-7h7ll8SSLGtB zMmL5OPk41IuLW1En?T6OYW1t>d?L6?G_F`pq0~%X53X29k(3@>4fam^VrXXMV;nEx zVf=tTYIqTkkcu%;&*M@09mjDL@fax;Cz;mANomB~g(pZQ;B&_Qkdz)I@iU}8Cqrct z6@`i8_Bq$)IVOw&XmvmxqqegmSfT~iM0Ro`u-*=C;(J^~B1V@;Q>ynJ1sNv(pyo)NmrWfQf|4^{Yi2|vzr xQSKD^HPgeGDe}aa^yqawGn#qs9kfi$eY6xznaWh8xHrG~>4w^$5D~*qzW^!(s}leK literal 1295 zcma)5TTc@~6h5=P(?zfpr3#7y(pF`?#l&Dt)M!FNkbv?&ZO3*>ced_M@$zO&jK<(4 z(KjD_GWsMY8b}lL-QUrI{t4rm-D+*w7$0^n-=6O~XU})`+t2zJ05}7udq9Ig1cEw* zAWWdYOjoE;p`vJ9%avJP5(uB?g3Aj80_n_B6rzaSq_)ZI81z6q0=f>pu!}$@Z#$p? zx{-pKOo0PBBwesd9p|=X7ZkWhhrJ36RZEs|!%{lza}j1zULlZLs0qnUw!|HttFVhg zSdvO^35UR>oBocmLMy!Bf<_)+NSksY9b?Xtm#`bl(*zpl=Ni8Ylsk1z_ke va_A5FxGy=;O&<0oPx+DuyUC-zWW$#{)J-1uC7MA^ybr0#KTF{W*xePV?gJ3FZ>#m?`?SIQg8R?da&bY|g za%BW~P-d0{EjlzoX(+n`1Z37WY%U^_fPw1(^?<}*zR?kTt+7Bi7AVHzD%b)tF$!3x;JL5@cB1-|iroM2o0u+MF=oR}HRbG_F_B5^^U59A+LqE#$E{#S=gj$wL+H9`CT0QN@bc>n+a literal 1689 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 TUhTZD!B!IfPXC^2IN$#d0Uayr literal 2164 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 literal 4008 zcma);TT>iW5XXDC?QIBzaFLM21SH`SSwqMLi6{XQH!hdJf`UdIc28i)?hKg=390fy zt9;NZAGFE`{S;ayrR9Skzz=2lKbL`J_H4?BotZw}r_b;7>F%@t{QKA6L^MH%X={wrn{&*`@70RtyYkxo10eFl|ud(C~Vak{GdyfqlSIl%`CAOp{va zj6nlMx01E&J==12Lo2&&6`wJulx0p}2Z!0U{jzJ7FxL;PAoLCD$e%2=8hEy|GnJ-x zI-8&llg?46K|R7Cuq!N^cZ*he&I(uo5=b2Pg+YBo!_r5s$rNYnHmQf+Fep{@7^aqH zu$kW1&Ny#UpO_Kum*foY=b}lM=uLwfZ1A^NVdq^ybBik`^>d4s&}Uw*#E0H8X^=<7 zbUk~=cC7NERS^-pX3`K>r2WA4SScDFF=>v~aU2&XV!IB`q+4w6 zWpFhDY9&?G-Xh~M)8n2%;Qm7x5^=dQPK~%ymR*@Quh}GN?6*@s_mA$j~Y&#Ur}4kB}l2#J7(~ z;+w~BD-c1E z-STWMtHGvV*G9Al^Z%n_c${2kR%Eb2mo#x&_SmvKFKN3ba@U}XdRwW6Y4Z*Xa)@R} zR7RreMNUKMOXayC;YD@?p&MRD5iGD^*DWnu9!@5};s_1At%>Z%Hzr5lZ5UswDglE! zPpzj)AF;!v(}rEuYb!gxdMjM69v2T}%&e9(&_7UBWKag$DoN>hF`ej?1l@wFDXFWH z)I3>3kxwac9@*ZM%(q`vaXd7us_XI4MBgUH<-v;9WI|OXUQoN&G&dduK3N{+@#HEo zz3PTuk@0UO-RG4j4oAJEJu-N!c?WUY2K(xOY&YUd&?nq{qaKGLFV)@mO_ zTC~qv?ZZfmKB}}Cyr=O4^M}AiFRh)Hi>BcYj7?L!#2us*U3gDZBlq`6PWwm(0+&u~ zE==;ci%^Kvg69GPI|&2>@65;_WQ=qqjwtmT#0FZ#Q=Ukgn&=uWK{ll+Ez@I2O|$|x z4Z_Wga?>{QC$$|>mwfe}xHAkR%3Ygs$B&y+tqRwLW7oHp>tu~jiFX%1 zC#(D=WB%6Q&!Bbs7*D?AEZ%&_%_G0lg1K*g;=}o>cIxb!YeX3=;9A}!>GJU3Jx*TW9f$32lCRs>| zsb4TXq0d1UkJCV$X+g`hMPKORG!SQc45pPjOtO3x)1Y9ov`kmyOlw-EZ9UV~IMW80 zHtR6SrlFXI1XEGVG#qDoqGc-SnTF#`7MQl{Fv(V>m_`K?)8^ClI1|${J=N#a^*ECa zroB2$vOy}QF~PK>jZ-$xRM9f+>f@A+Gd%~BSBFWqWyN$uFxgtB@iX_W tv`oI9sp{&KcgxRU`lSw&yy+EFAD9{_5YJHjiE4v<0Qm(Xhra+X{{sg)i|+sc diff --git a/java-backend/target/classes/com/aijianhua/backend/entity/User.class b/java-backend/target/classes/com/aijianhua/backend/entity/User.class index 9e5553bea333db4d506204d9e833a5536b8b7020..38132d25a15d4c797e65d1baba3782cf30cba291 100644 GIT binary patch literal 7403 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 XNVQe?1S7=!?fjAyQkx6ylUjTMP{ti5 delta 242 zcmYL>y$-=(7=_Q<`qWQ55I+f%#PlH@^bW+()of{Kgir>=WoRU>!37YB!P3o@xC(Ka zNDS}!$@}CaDpB6+^LPUA&?vxwX(3}nAuDJsf_>mFgJ|ZCcF}ge3WtYDxY^FvQM_z9 zdE}6{P_R*i9XnoGkeRHfp+J1b0b_i5_j4Qtgi4IbWad1(!{*b|zoR>Mh%U+T2J4i_ upsi5-F=M((rmVYvMmJMX8=lG8Q(#nD#T4NQYN%7wd6zD9rLUyVM(+!CcqSGA diff --git a/java-backend/target/classes/com/aijianhua/backend/exception/GlobalExceptionHandler.class b/java-backend/target/classes/com/aijianhua/backend/exception/GlobalExceptionHandler.class index c3f08398d4453884cd3195ca3171a72f3997c73a..d367600ab80e64074d91bad55096a84fc46116a7 100644 GIT binary patch delta 2290 zcmaJ?S#%Ud6us3m(>2r6NoFP_AuP!N30Vk92q6$awh$l^5=oF|H(-5ht&6#9`7fmthHN?ZEp$B?#^kf(*{7N^m#qFXq$qpU8k<`3r zlFN_29DNwF#Bbi@=4(;3(+?@4A4^yJ>qtYon94@>%0w2&0EXy}D5W*wh>n5C7Kd1l zD;IejgBa2%N*ehXjC>KLl-LUxQpF%|Y99^5Fr1_C9@1K)t~#frE@D=jAsr(K-fkt; zKZ?P3ee2pAFC4!0)~1{9uerYO$j#&XH4MQRNq(%ju8dZTP|Pu2*B(pHHx$DwZap1R_xVtof<0fFvm2}YRe_l>6jsI*>Zc%!W@p-3{f3qDox@t7mtX1 zdw>6Y7#xohl8*h7h#4{>K|;C!Rbso{Z#NmKbjFsVxe-9Mjzy>uH|)9U5-jDY6@47t zDPkRhqR^3&7r-(dAp{w;YBMs$42O+s(~St0b2M}TLV45i7*>d_jZZ11lvX|6Fp+qE4$Lg?wFzCZBK^C@s1I@Vum?g zco{o5UJ+~5{zU9m>=XypLU%4+m&bQ8%oWXAyeL;4;x$zh9$u*K!7`4$qMQ#CD?RhX zAD$)_C;s%r&DQWH-r_jK5Nj!Hl|u1~DziRP6RgwmHdKa~`cO?>q%vYuEtwWFs!R#s zT^;XXCqrCG*|g${vazM}D~l_p7gx+LuBa%laN@A|oyWNtoVCW%1pz}edy7<#;|v+H zxJ6H=o^%W+bexo#aFP-eYRuYzhE|;BIK_}jW|=8E&d7Z)?TT$656u;_@X;7etFiQSn*&ybIO(_%o5_icIOH_qXPrd%DFaR*u@%WA&ncvW zRLxM(f}GPBGRw=hwP2|4fvl4l-HLGv4%0!Kg(TW?(j87Dq8E}ZME*9%cM(wtOrofi zGrDg|@F3xu+(-^2@V2E=TAD&D4n~%eLmA53IXrY94pSuu<|PVJq(CPM6|I=bFx-9+ z*@^a6%wxEKK-s`nEM!D!F>N{Mqn`91u4W}V64h3OZI~f#S2FClbLIai+bzmTR?z;0 zJ&p2~j%;M00GSv|-;#)9E$EQ2%*m$=X zHdtJyQ9y;9`l$wL;!nh-()l0^8e>ya1of zf7h~n(Lz#j7fI4lywrl%+KR84ijQ#Y{!bhuJK;!b$B{%hUi>$XH?U9Qknt7l?<~n( zMGjavW_D8K;8DEOj^(y&g!k`*M6*;VCg&46q3Np1fp#>Fvd}%6ygz777O_EzwbPg| z-~x`Fzz4D)Tgo!Cs9I%#cJ#i_GV4K=(UUs97ZpKoD_~pKCEzU1kxM7Zd!8yuAsZL< zK$GSELyPuD@a5A)ULqgU_z69-7cY^?WqgBg@g1%B=;-(O5kFI77txRAn(F!o!#=Xh delta 2327 zcmaJ@X>b%p6#ja5v$L7)?B*Z|0Sq}vvN>P_333x45EDrV0&+%S$PP(hNn&<`;m{Qj zytqPxg36^Jm&z$*376uDC*Xlr`NJxa!Bs;sg~@%3yjs-jypGu=I3zxTbb-+Qy` z2OS&~fBBy?=K$CHbU8+-7>*GNMske8Xfe~4E7sd`dym0b1>-mh zF`gl!GnlEmUtG7P4==()3W_;O@G$Y|d|%?%8#I4i1A|hn`6lU2eg?BEbG98tDCH=_ zB#{`N#3qY^@Jw4drf^KfG*KU(n>rmc6wKt9h1m?T(qfZ)iRP{GX#SeITK8nlUo9?$ z_Zw7>3XaDlNUhTSWxCI&Rq1xj#XJQX$9z=YN0<&)B&cH}Rp?ltpo*g!H4FnqE+5#7 zSdxvxI*)F!EK!k+MI2r%7Uy_TjE;(M)Z+;S4IDmDD5)f6f?DkN*H86p{zjkJ<`~A4 zu|)29lA*#S=0)@pe>w`SOHrXK5MM*voa7(*@NTqiVD>h&@_24{Uk zO|74-RxX;>pjGP9@k)+W@QcHdz4|;$D&IWOdb4%cjkRlTuRd^l%l2DGjwo2mkV!e( zSCmHa)HQgX;{_>=jlwFb(Y+oOFJYa6^&A`IdX|B`6Jw93{36VFeSy~KZC6pjrsjxY z3T26uqY!LIzTK@2a6&c6u;ZYh-J=-*x1r;lo8jQ zt5Z_F+T!^htzWfP>+$N-JF=ofKcDzDvQPx0u9ze7vDgvQGtOznrz$q$GmciAjl|~+ zZkG(CuecNAh@#hDs`v_DEBJ=v3a*OH(P`pr^v|gbyri~PZz%L?KA-Mmu#cmX8P{0j z_2>->zL(Xi#l(w@9+8&o42g0QC^m=@*jidwx2Un6@@ONq9r;thWaFWGGtJ!eWb_Qn zIt_M=1}1E#yL=5qLC~Ft0N8@9G-G%fufSq#UQakPtqpF4GV3(L%d$^F4I+{SkaGrc zKoGr5XhBjd(q~1nO)YRm56C%<+#vEyI7&OshBt>{r6+7iKp*N?(rZ%4a+_E3fo<4M z-fifQSMeJ0e4S8|TWDnmt?Z^R`>-KL1p=K4#gPi34R6y18!AXWsnt7%E~dZbCuFXIqQ5Y-Q@?ik z-t9&{>Ej3;UMK~o5g(aXNp$p{7A%w}oqZ}G$1Yl`WnE9ZYi{KmAxd_%xg&@q3gQ?! z=s3xCCda#BB7rAxvW>}cE{#SH*A9RY00G)LwH%> zi>QudqQqxk#F|rhPS)s)ld^Isr)9RbmAq)~8DA%JE-M5!N{pt6$2puQQ#LqpfwIqp z2&hyF`wg@26T*ZK3>LCwT%!4hbjh;(f)F3!6I{kMT8SoHK6RmQt>O3%Kj23s{0sV! B@dN+> diff --git a/java-backend/target/classes/com/aijianhua/backend/exception/UnauthorizedException.class b/java-backend/target/classes/com/aijianhua/backend/exception/UnauthorizedException.class index 1bff234b5892331dd4175286b1e0947324b6e0eb..33e72fb67c391aa4691c90a89e1da88e3d328a0a 100644 GIT binary patch delta 90 zcmX@Xe1e(x)W2Q(7#J8#7=+mwm?lP8FtanTOcb{hWMp7*&QD3@Vqj+A};-p;@=xrxyY02Q7M>;M1& delta 90 zcmX@Xe1cj0)W2Q(7#J8#7=*bPm>8JZ8CZB2SQ*$Rde{Nk920ph*clmEobyvsCr&@E h!VXjd0*pWiR0QO40(o{o8YIr9rM;bjadH!*8vyVu4bcDq diff --git a/java-backend/target/classes/com/aijianhua/backend/interceptor/JwtInterceptor.class b/java-backend/target/classes/com/aijianhua/backend/interceptor/JwtInterceptor.class index 40b219256e1717476fe611db26e4f165b6d3f0d5..5739711029815e991086b43c0b251535d76f8a4a 100644 GIT binary patch delta 880 zcmY*XO-~b16g_WdI%wA%5<&TYuT35#~`qHr4%A|*#dN!-gmvFCZ)r;i;QerQV%)g6~HS@utHEMqTH$xrvqt&AIMlg8|- zDc-9K8>AUDL!aatM_59SMJ4nRN`&;YDf%gk5i&wgcNd7PD_X@LFFrwK}A1bK*JUWf=UH1ARPBZcF-2| z6c8(*YYX9{w1?6+s5wge;%ZbM45~%kkfCh1>LW$mlF%Apn?>BAMG=z>`hx;y8d?_FT0)l`bh$I6HW%!tB+NlyY`~#Bu zHsZ!VfD02-Qx_&|T)2{*3%C9YW4r@F;$rT(_uV)5o^#(l3LXU)zy10A1wboIFIprIy^%%v5q>c|%{Z8Qk55Y1q9CQY=2}frr80m$TQcjIpcPhGqKTg--?N z@S~I=B92*&NV^oV>*`1Z7}S1U%jlUJFG46&QOWqr?2NUkn}a)PBcrc6sb-GbXn8I7mbcLaa#=kyvg!!! z;JAakVoL5}U1DFZEA2tAihCUQ(Z`6=F^h^{aw5`$0geY4WGKn%_Oz|pxh#Vm8;Q^Q z(1Rh4VT_12CB{a@k}}jdj>jq{I3}GkWhW90D>+GXvF9>|t!EgNSB|4%DnH+mKblkI z0c%wk?d(T5Fm|qa%raA5blG+UiEVd<_^!Nb^%H}Y&2cR~qb+aI1iXVgD|*^_y{ro3 ztmDbE|I3K??zO#YS`UUN^tqg8Ae^SXaTCrEIyqV!vQH^W5;8)i;S<=0lk_ZECk^;8 zN0y&nz%$HK#IS(pker`ckWi(wTq2|vQQ|_U9G1WCVKgjXNP=n!Uto!}6JbY;81vLuEkVW_op`{0 XV@{v?AOM!;Wd=(NLX7({`5HU>rpF$M+z-!mPW delta 149 zcmaFN@t9)+2cw{XZ)!@t| diff --git a/java-backend/target/classes/com/aijianhua/backend/repository/UserRepository.class b/java-backend/target/classes/com/aijianhua/backend/repository/UserRepository.class index dfccde3767d62980a361a21d3c2ef69c4ce2b331..4f36b53071f854079c714be304e543648fa7c205 100644 GIT binary patch delta 246 zcmdnOxrK9s4CCZr#>tcQ8C3)Yd{av@@>2p5ixP8FOHzx9H$P!yXPlhFtUUQOQ{&`* z=Hz-N1}+AE1_lN}76xu0#RJ5=K+MO$z{1ENz#z!L#J~yUGcgE(m9a8{lmVrLu}J}S z1EoZ;NdXN7N{KRvF)$(<}F_2)2w@2jPS6RZPzXu|Ik*szNGJ5bg(mnDkmAFamuJ5&cJWb* zzNFN%I)%#@iiIpZ)7f&~h8k#i>f*$*v=N{iC>fL0bI j>44VQK#VY41Y5hKiSo*>lEMESJM1|*98j~4=sE&l^Oq1j diff --git a/java-backend/target/classes/com/aijianhua/backend/security/JwtAuthenticationEntryPoint.class b/java-backend/target/classes/com/aijianhua/backend/security/JwtAuthenticationEntryPoint.class index 54679e90ae9de2a3b777dafb431b6383609a9638..b5f9f68fc5dd42f9e3316a0905a09bcf426664fc 100644 GIT binary patch delta 480 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 Zxwt{bu2O1ZWajdoV#j&BN%Iz2{{@fBb^!nY literal 6151 zcmb_g2Y4Ih8Ge6B_Q~>PSXmYcgiO5RBOw852aN56U}DE1j-6GYXX|WTBHfA8$%*Nr zla>~`DWT9sTj+oWN)?Bc**3JarIRkY3v@5KTSEK(cam(y3U!{Rj~`3l{rbQ0f8YC! z{~mk(z6SuT73W0|Ku|$QMFlDaX7ANUbuFn|BU{QCO6hs6TOfdAhj%kf_WX)vUa3ZLZa%TuMa<`_NdrjR+WOZ#&AKGVFaV=vwqvnvI z^{11z9`Ey?!k8rx&U#B3P0FZI5yc$p)YECQ39PE?K2c?B{gkD=6|GXlJQee?fO1{i zH&I}2-BgxV1+fwb_?shGh(!ucS8)aw3(WD9Tc)iIn@L04s=J8{T{B|PQ>|r8+cU+q zg0&?wsCTMxSfOGi&YEJx#k7P*R2m1&j7wro-i}fYc}t3m z6VhAjcPpqDSW&88cNx&ZtZQgeL3`mz+R~_^39AHZh8#n8jSZ$lsMwAv&Db_A?I#gl z-Z|CKaJGWgD%QwAYPK_?WzrID!;YRZ_S?=rZND+7rLsxaOzV!T^%N*+IvvLN^g8B< zY3WJ1Vv#FM_yb{_Dp-eG}xlev5pwbpmZ{THcdM~6UFCOeq%(nap>Dg(waHqfpsBe)ow z6kMXB3zwFnb1dT;DH(#S;~18^-AoxhW-@8gY-Z}E68YUSd3ppE)m=JO#YBqqVylA7 zRBS_^z)TMWS=UTz{rz1uBI4*)+)nuq(L&-BH!#I|F;5Cu|5vbVjm@d_BDi7X{6O(5`N_oU8Fa?&CuY3%a>5k^i^zh47yg~v{p@;j-tBnY*!K)O!TE%Pd+5%|2 zwjs^rzEM4yHDof(DaD?53aRP!Dz261EohQbrKUHkxK1YdOls<6B1&kFrKvE1H>B$W&h%yfMw{?w0kzGRTvmJN2-vQaFdDsmb`#J^A?mjg}9{UT- ze!rnIk`X+HFDdx4im%{tf#uVYCJ-28l=s!0s_wE=%5*dm!C%AI6?{X*H}NeFd;g1R zD?_lSJI17U%bsL_*xZ)osE{%S%#29{ zwOf|$>he0k)1O}!O@oGRWwc>k4&!5*US!bPv#!0LQ+m9Wy8E|w_qK1iazocPMrbOe zIU}&~vcg*Kfb8NdX`ObQU$b~+Ft%hri{<|9G_Z(~8%H^nmIY6W_tScD#@gej>2A1WZ<*NS~c`h73RF zqP~FqtC(gP6FQ=-<9PLS3|l&0%Ws!vbXk_+bn+^kkvFia;!K1koJs?H-xS~6cGl$u+5I=I58@wO2<2bFQB3422 z%yBHe88bY(ZX69e8jqk^prtZ;PKy$&Jcfm_%ILZr&O3;jSfx+5=FrxnVZx_=q! zu^j8L0&S!=p#huGh~0cglt43X#cIZU4b`v1!#Ed@;ygT#^YH{*!Qc*DnLAKU5F_&v0zROxF=22z^ zHi?i}z_m(jCX8xHDYWM<5hE3*Rkw-LxUY(KT_+ZbMSP=qI?ohCDBP}~_Bht^Q^Bs| zsPl+gaRz@55o3$R5>hjQViql^;eV8m0eKH4KqYQ(@X!u4H$IBW=qC>~M(@tyQwK>O zCVeDNA0>T%o__EUw~^EL?n+t(Tta1Cw0SdTqZ@Ou1&jE)Wic*89beZpV!P+1`O*(W zsGk6mTFUbY?=19(Qe9o`nOh;mQf?GtnON>;2(MELoddL;9*WNk-Ghfi%!FOR=%an( z_~JOe+ET&Pscp*PiJMU)kLnoQz0v4Ymh6SRqy;w(l|Qgx(4l(JIPiw0D9X9+_*hc$|5^iER~l1?XVAXf6f zj{mF38W7Dqp(f7GpYTZvtl;`i&)y^WX#gUJrwQdPtBzqN)9Tke-tU?3NAc{g=wA-w zZx3?uA0Z}mp)7=Ap?q05h;S@4j(_Kc{U-ofll+h^C8Pk8@7(sX1VUVTpo7mG`yl1UOa& i#A-Vls1f%21*7vE)-fyC=@6oX#%tfq0lMYFNuO9xsptvdoQ~8 z-h0xX9*Em>dirz!sGi;@$+D7|!11xh)Azpb-fzBt|NHZA09$ZQLqecEXHRAfbHX&N z@sg3r8o86w%4bTRS;+KHc}IEIP$#f>!Z>AQ3Whb7Ih>u4IZt4LD|3$ILu#P`d6H{JKVEz$-CV9GOI=*rOje!}keJD!;`KlE6EZAXM zrngfd+1WKBP`B64%O)g|(yg+ftE38NdlF_HoYuxuyZ!p*n8;7xhq|Bmo%&pSmH;)kK94S9UnA`O=v}`0jo*3 z~wE_*wlEs)dphKWh zz1`=XDbl%J*r1_XV3}!WCS2Q^l37prLFJjNV+Bk+A-E^_-rI}} zHfgv{V8z9ybZo};1mQ|=Z^1Ap8L4zg&UX`;_g>PK>+UXMfj-a>uPY_F=z3GlBNGZb{~MGnzed!piFWj2pqU)X@yR3H=z*a9ahoU;C<} zbPOtNjRijYrKyY`)^S7`Z=vyhQ8_l^4h(A;VxO5Er6F_7GQ5%_cNfNN$MnX@`6yV5 z^#_NxZrZGB>e5?!72G>@)MJ4HaYDykxSKiXQu#6J6d3Nj95u1@zMNnxTlea?5BD=; zS@}iwEao*cwniiL3u2fRz$(mzS-2<=jFM1b`ONM@@vy^eohiCwu8G)6Scp5>YZebm zZ`{rwF;su`q{GZJ88{1WlV=1nHBntui*L%)QNk%^s*f(H_5LYR?z&86 zE=iuogBl1R=%aqRhaS-J5FTcz{rPivl+o%u5s!7nQ5qfV4UEdOfOVxmi zIdum5ilvz1a7oerRL5rueG@fB3bGm>G&GoFxK2&?UOuR zRGNq16Z}4{ntV!KzSr>seq`-s<*4m2ftH4jsmgYph)zD$MS>i%OHNMiH`M_~56^Qw zDp>@&YaYTld>m=3ft}gQ#%5cbKE1exZ8phMV}d{STE1y~Yv#Ry|3(*0{J@zp_d^RM zS(jME>tgQ7@Gf|-@4kQ~zxgVc@~Ttc!8oTJqw6w=Ma2cD}Mv4Ut<@<6o;-B^t@+IXnG8r!i3 zeRSCUJW>^~mOXB@&uUA6JY+=>@|V52zDDD^Mln&I*;QCT6>cF7`{6->Qdn91w|C7r|@(L$__!L=YlHZ8G(Or zc5q{ART(cQa2~Hu!0{12=8{Uj zJnzam?epO%2-xHlG<1b!x#1b*>*iE0490{;WQ>Z!H> literal 3742 zcma)8`B&6d6#m}KU|GzV52@FLKhe>kZd-s0#yW9Kc-#`8WuoY*rNFl8uqoW4P1XfO% zr%a=0+GEDy+=R^g0?W2rw&nK;q&qrCG}H>L3O1E|t7sfBz41YFDhmziTGVrQ$&>EE zLOmL=T*C?-E3rzTp>l$|scNc3&DVDfEHu|!E$OTl)nc_kt+HgBld=|T1nSh+J^sv; z%;F+ktf5)QC0HlWWI4u!=h)LS=Q}5*ZS+t3o`9AsS;c~M1zI{f2Nv10D_rlb$9lAA zxJ<|8xI*BP|KCawp7eJYO>2?{x+CWTn&@=zd97TjqYYOHWT|DS6tRDGlA|Htwd}E_ zHEC!USYF|KkLi<=PIPJ5sAChl=LLCa#`EPQLz*wSuC)DOYf=tc#iB(I81McpHo#E1 zakW6EqrY=R(XmCxHP|XpPoM`quOtgQ8O@%g!^-N?IO}jNuG4V6jvH{JKx^KaG)!y4 zGVSq_Y2?g2V^uH$_876FOg1tjPfuB{>06FXFA{k%;E}crx!wQrDPpC5o|vcu2=#9ATz=w0exj1co~<#7MQe z^CsVII)*UJx?mipOjY+ytcyx{MzBld$}Bf&BY=mhT2aHo#D zaJNA7LP{CkaAz0`#Tk?Q7C9qeTxjwqOx>%)M2_JP(1q35Kh1RRyg+3h6R7~HVN}N$ z$a&cAf<)ToI7MkP`Lt6ij}DIttnE0F6nABkFaKKKu zx|$BvoyMfU%PEk8`B4aaGL@6{wF^&%zSiSD_&Q2B#R{exfelH=BMnK&kw{H~(>i8U z7S#Gq7;sfn59oLh53zm%M#EZKlhirame?(};}ON$qjZejB9T8qg(_^1>v%$$$P!!B z<&^j-9Z%yKrU1p2a%5@DWns_>g0`Z1Qd<2yuj2*0$VAM^QOA|aW@xdpxAO!u?zWQc zv#*U%*EcJ!6z*;J7n}86Pl$?$OJV z55iBhZ4XRL`#oVDlcH7Occo2Hmf7tTh;7AyWy?dQ$((eDO~O!B@8r$mi0NADI}&F6 zan*a<2F~9PiGys}k_}M~tI;NKAQ_f`@FwSnYJQ9uNrAg z!udXMd*sKq`CGSFTTMu!4D6%Am4nhBcM2?M2E&&wxo9BSR-xi#d(z3d+)HSiD?tH4 z@M{t)aS^Hz2DbrfAM!bC=*?VIn1DxvJIp@UnT&XCJCDhLYJrQZnsZo_G}jcVRTq|o z;(4{Xh%a$C=FY2#B+f6lyZ~ZQGO`d)#YzRR(uSOpo0t16m2`SEOnX#o66jhq|9K~H zrK2uW#%_)S$L7tT7gum}rFd&h@sINh0x$8ap3j&0|B8oKxxiswz3>{Zhh!Yf`1?A~ z7<>voYr4)s{2HiygTHDSyg0teUp?G_x9~Q<1m3~B)Xu{qMP)UVxqm`CehzgvW|}jN z*^OoBX&mEgnx>MML5fpQ{H-PNGVI4STq?i<|H zm@UIg;VhiJym=`EWjrZxs9V*^IXrt7&jsl+7mDQpe}{4tj}d0KWkL0cj(>!2kdN diff --git a/scripts/nginx-aijianhua.conf b/scripts/nginx-aijianhua.conf new file mode 100644 index 0000000..7e6a87d --- /dev/null +++ b/scripts/nginx-aijianhua.conf @@ -0,0 +1,119 @@ +# 爱鉴花小程序后端API服务Nginx配置 +# 域名: wapi.aijianhua.com +# SSL证书配置 + +upstream aijianhua_backend { + server 127.0.0.1:3330; + keepalive 64; +} + +server { + listen 80; + server_name wapi.aijianhua.com; + + # HTTP重定向到HTTPS + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name wapi.aijianhua.com; + + # SSL证书配置 - 需要替换为实际证书路径 + ssl_certificate /etc/nginx/ssl/wapi.aijianhua.com.crt; + ssl_certificate_key /etc/nginx/ssl/wapi.aijianhua.com.key; + + # SSL优化配置 + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; + ssl_prefer_server_ciphers off; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + ssl_session_tickets off; + + # 安全头 + add_header X-Frame-Options DENY; + add_header X-Content-Type-Options nosniff; + add_header X-XSS-Protection "1; mode=block"; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; + + # 静态文件服务配置 + location /uploads/ { + alias /data/nodejs/aijianhua/uploads/; + expires 30d; + add_header Cache-Control "public, immutable"; + + # 安全限制 + client_max_body_size 50M; + + # 防盗链 + valid_referers none blocked server_names ~(\.aijianhua\.com$); + if ($invalid_referer) { + return 403; + } + } + + # API代理配置 + location /api/ { + proxy_pass http://aijianhua_backend; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 超时配置 + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + + # 缓冲区配置 + proxy_buffering on; + proxy_buffer_size 16k; + proxy_buffers 4 32k; + + # 禁用缓存 + proxy_cache off; + } + + # Swagger文档 + location /api-docs/ { + proxy_pass http://aijianhua_backend/api-docs/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 健康检查 + location /health { + proxy_pass http://aijianhua_backend/health; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + access_log off; + } + + # 根路径重定向到API文档 + location = / { + return 302 /api-docs; + } + + # 日志配置 + access_log /var/log/nginx/aijianhua_access.log main; + error_log /var/log/nginx/aijianhua_error.log warn; +} + +# 安全配置 +# 禁止访问隐藏文件 +location ~ /\.(?!well-known) { + deny all; +} + +# 禁止访问敏感文件 +location ~* \.(env|git|sql|bak|old|orig|save|swp)$ { + deny all; +} \ No newline at end of file diff --git a/scripts/server-deploy.sh b/scripts/server-deploy.sh new file mode 100644 index 0000000..9109fcf --- /dev/null +++ b/scripts/server-deploy.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +# 爱鉴花后端服务器部署脚本 +# 在CentOS服务器上执行 + +SERVER_DIR="/data/nodejs/aijianhua" +LOG_DIR="$SERVER_DIR/logs" +UPLOAD_DIR="$SERVER_DIR/uploads" + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo -e "${GREEN}🚀 开始部署爱鉴花后端服务...${NC}" + +# 检查Node.js是否安装 +if ! command -v node &> /dev/null; then + echo -e "${RED}❌ Node.js 未安装,请先安装 Node.js${NC}" + echo "安装命令: curl -fsSL https://rpm.nodesource.com/setup_18.x | bash - && yum install -y nodejs" + exit 1 +fi + +# 检查PM2是否安装 +if ! command -v pm2 &> /dev/null; then + echo -e "${YELLOW}⚠️ PM2 未安装,正在安装...${NC}" + npm install -g pm2 + if [ $? -ne 0 ]; then + echo -e "${RED}❌ PM2 安装失败${NC}" + exit 1 + fi + echo -e "${GREEN}✅ PM2 安装成功${NC}" +fi + +# 创建必要的目录 +mkdir -p "$LOG_DIR" "$UPLOAD_DIR" +echo -e "${GREEN}✅ 创建日志和上传目录${NC}" + +# 进入项目目录 +cd "$SERVER_DIR" + +# 安装生产依赖 +echo -e "${YELLOW}📦 安装生产依赖...${NC}" +npm install --production + +if [ $? -ne 0 ]; then + echo -e "${RED}❌ 依赖安装失败${NC}" + exit 1 +fi + +echo -e "${GREEN}✅ 依赖安装完成${NC}" + +# 停止现有服务(如果存在) +echo -e "${YELLOW}🛑 停止现有服务...${NC}" +pm2 delete aijianhua-backend 2>/dev/null || true + +# 启动服务 +echo -e "${YELLOW}🚀 启动服务...${NC}" +pm2 start ecosystem.config.js + +if [ $? -eq 0 ]; then + echo -e "${GREEN}✅ 服务启动成功${NC}" + + # 设置开机自启 + pm2 startup + pm2 save + + echo -e "${GREEN}📊 服务状态:${NC}" + pm2 status + + echo -e "${GREEN}🌐 服务信息:${NC}" + echo " 服务名称: aijianhua-backend" + echo " 运行端口: 3330" + echo " 环境: production" + echo " API文档: https://wapi.aijianhua.com/api-docs" + echo " 健康检查: https://wapi.aijianhua.com/health" + +else + echo -e "${RED}❌ 服务启动失败${NC}" + echo "查看日志: tail -f $LOG_DIR/error.log" + exit 1 +fi + +echo -e "${GREEN}🎉 部署完成!${NC}" \ No newline at end of file diff --git a/scripts/sync-to-server.sh b/scripts/sync-to-server.sh new file mode 100644 index 0000000..7d4e5e9 --- /dev/null +++ b/scripts/sync-to-server.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +# 爱鉴花后端服务同步脚本 +# 将本地代码同步到CentOS服务器 + +SERVER="www.jiebanke.com" +SERVER_USER="root" +SERVER_DIR="/data/nodejs/aijianhua" +LOCAL_DIR="e:/vue/aijianhua/backend" + +# 需要排除的文件和目录 +exclude_list=( + "--exclude=.env" + "--exclude=.env.development" + "--exclude=.env.example" + "--exclude=node_modules/" + "--exclude=uploads/" + "--exclude=database.sqlite" + "--exclude=*.log" + "--exclude=.git/" + "--exclude=.idea/" + "--exclude=*.bat" + "--exclude=*.sh" +) + +echo "🚀 开始同步爱鉴花后端代码到服务器..." +echo "📁 服务器: $SERVER" +echo "📂 目标目录: $SERVER_DIR" +echo "📦 本地目录: $LOCAL_DIR" +echo "" + +# 检查rsync是否安装 +if ! command -v rsync &> /dev/null; then + echo "❌ rsync 未安装,请先安装 rsync" + echo "Ubuntu/Debian: sudo apt-get install rsync" + echo "CentOS/RHEL: sudo yum install rsync" + echo "macOS: brew install rsync" + exit 1 +fi + +# 执行同步 +rsync -avz --delete \ + "${exclude_list[@]}" \ + -e "ssh -p 22" \ + "$LOCAL_DIR/" \ + "$SERVER_USER@$SERVER:$SERVER_DIR/" + +# 检查同步结果 +if [ $? -eq 0 ]; then + echo "" + echo "✅ 同步完成!" + echo "📋 下一步操作:" + echo " 1. 登录服务器: ssh $SERVER_USER@$SERVER" + echo " 2. 进入目录: cd $SERVER_DIR" + echo " 3. 安装依赖: npm install --production" + echo " 4. 启动服务: pm2 start ecosystem.config.js" + echo " 5. 保存配置: pm2 save" +else + echo "" + echo "❌ 同步失败,请检查网络连接和服务器配置" + exit 1 +fi \ No newline at end of file