From 3434d8c72af1c946dcf8b3d0aa8ef0fd41896c37 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期日, 13 九月 2026 15:04:35 +0800
Subject: [PATCH] feat: 打包部署支持(一键打包脚本 + jar 内嵌前端 + jwt.secret 部署陷阱修复)
---
.gitignore | 6
docs/工作日结/工作日结_2026-09-13.md | 10
docs/功能测试报告/功能测试报告_部署包打包与独立启动_2026-09-13.md | 91 ++++++++
docs/打包部署说明.md | 237 +++++++++++----------
package-deploy.py | 283 +++++++++++++++++++++++++
traffic-audit-server/src/main/java/com/trafficaudit/security/utils/JwtUtils.java | 26 ++
6 files changed, 534 insertions(+), 119 deletions(-)
diff --git a/.gitignore b/.gitignore
index cbbfa1e..4f1d7a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -67,3 +67,9 @@
# ==== packaged static dir (copied from dist, not committed) ====
web/
traffic-audit-server/web/
+
+# ==== 閮ㄧ讲浜х墿锛堜笉鍏ュ簱锛�====
+deploy/
+traffic-audit-deploy-*.zip
+_t_wyc_aug.docx
+_deploytest/
diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\351\203\250\347\275\262\345\214\205\346\211\223\345\214\205\344\270\216\347\213\254\347\253\213\345\220\257\345\212\250_2026-09-13.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\351\203\250\347\275\262\345\214\205\346\211\223\345\214\205\344\270\216\347\213\254\347\253\213\345\220\257\345\212\250_2026-09-13.md"
new file mode 100644
index 0000000..392db91
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\351\203\250\347\275\262\345\214\205\346\211\223\345\214\205\344\270\216\347\213\254\347\253\213\345\220\257\345\212\250_2026-09-13.md"
@@ -0,0 +1,91 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_閮ㄧ讲鍖呮墦鍖呬笌鐙珛鍚姩_2026-09-13
+
+## 涓�銆佸姛鑳借鏄�
+
+鐢ㄦ埛闇�瑕佹妸绯荤粺鎵撳寘閮ㄧ讲鍒板彟涓�鍙版満鍣ㄣ�傛湰杞氦浠樹笁浠朵簨锛�
+
+### 1. 涓�閿墦鍖呰剼鏈� `package-deploy.py`锛堟柊澧烇級
+
+涓�鏉″懡浠ゅ畬鎴愶細鍓嶇鏋勫缓 鈫� 鎶� `dist` 鍐呭祵杩涘悗绔� jar锛堟嫹杩� `src/main/resources/static`锛夆啋 `mvn clean package` 鈫� 娓呯┖ static锛堜繚鎸佷粨搴撳共鍑�锛夆啋 缁勮閮ㄧ讲鐩綍 鈫� 鍘嬬缉 zip銆�
+
+浜х墿锛�
+- 鐩綍 `deploy/traffic-audit-deploy-YYYYMMDD/`
+- 鍘嬬缉鍖� `traffic-audit-deploy-YYYYMMDD.zip`锛堟湰娆� 69.9 MB / 246 涓枃浠讹級
+
+閮ㄧ讲鐩綍缁撴瀯锛堟部鐢� 8 鏈堢増鍖呬範鎯級锛�
+
+```
+backend/ jar锛堝惈鍐呭祵鍓嶇锛�+ docs/ + application.yml + start-backend.cmd/.sh
+frontend/ dist/ + nginx.conf.example 锛堜粎 nginx 鏂规闇�瑕侊級
+db/ init.sql + sql_city_bus.sql + sql_city_taxi.sql + sql_wyc.sql
+README-閮ㄧ讲璇存槑.txt
+```
+
+### 2. 淇 `JwtUtils`锛歚jwt.secret` 闈炴硶 Base64 瀵艰嚧鐧诲綍 500锛堟牴鍥犱慨澶嶏級
+
+- 鐜拌薄锛堟湰娆$儫娴嬪疄娴嬶級锛氭妸澶栫疆 `application.yml` 鐨� `jwt.secret` 濉垚涓枃涓插悗锛岀櫥褰曟帴鍙h繑鍥� `500 {"code":500,"message":"20018"}`銆�
+- 鏍瑰洜锛歫jwt 0.9.1 榛樿鎶� secret 褰� **Base64** 瑙g爜锛岄潪娉曞瓧绗︿細鍦� `DatatypeConverter.guessLength` 鎶�
+ `ArrayIndexOutOfBoundsException`锛岃 `GlobalExceptionHandler` 鍏滄垚 500銆傞儴缃插悓浜嬬涓�娆℃敼閰嶇疆寰堝鏄撹俯銆�
+- 澶勭疆锛歚JwtUtils` 鏂板 `secretKeyBytes()`鈥斺�旇兘鎸� Base64 瑙g爜灏辩敤瑙g爜缁撴灉锛堜笌鍘嗗彶 token 鍏煎锛夛紝鍚﹀垯鎸� UTF-8 瀛楄妭澶勭悊骞舵墦 WARN銆�
+
+### 3. 鏇存銆婃墦鍖呴儴缃茶鏄庛�嬶紙`docs/鎵撳寘閮ㄧ讲璇存槑.md`锛�
+
+鏃х増锛�2026-08-27锛夋湁涓夊涓庣幇鐘朵笉绗︼紝鏈涓�骞舵敼姝o細
+
+| 鏃ц鏄� | 瀹為檯鎯呭喌 | 澶勭悊 |
+|--------|----------|------|
+| 銆孯edis 鍚庣鍚姩蹇呴渶銆� | pom 鏃� redis 渚濊禆锛屼唬鐮佷篃鏈娇鐢� | 鏀逛负銆屼笉闇�瑕� Redis銆嶏紝骞跺幓鎺夊缃厤缃噷鐨� redis 娈� |
+| 銆宩ar 宸插唴缃墠绔潤鎬佹墭绠★紙file:./web/锛夈�� | jar 鍐呮棤浠讳綍闈欐�佹枃浠讹紝涔熸病鏈� `static-locations` 閰嶇疆锛涙棫鍖呭疄闄呴潬 nginx | 鏀逛负銆屾墦鍖呮椂鎶� dist 鍐呭祵杩� jar銆嶏紝璁块棶 8090 鍗冲彲锛屾棤闇� nginx |
+| 鏁版嵁搴撳彧鎻� 3 涓剼鏈� | 鐜扮綉杩樻湁 `wyc_total_monthly` / `wyc_order_monthly` 涓ゅ紶琛� | 琛� `db/sql_wyc.sql`锛屽苟琛ュ厖 `summary.template-dir` 绛夐厤缃笌鏃跺簭 |
+
+## 浜屻�佹祴璇曠幆澧�
+
+- 寮�鍙戞満锛氬悗绔� 8090锛坄start-dev.ps1`锛岄噸鍚悗 PID 鍙樺寲锛夈�佸墠绔� 8080銆丮ySQL 127.0.0.1:3308銆�
+- 閮ㄧ讲鍖呴獙璇侊細鎶� `deploy/traffic-audit-deploy-20260913/backend` 鎷峰埌 `_deploytest/`锛岀敤 **8091** 绔彛鐙珛鍚姩
+ 锛堟暟鎹簱鐢ㄥ懡浠よ鍙傛暟瑕嗙洊涓� 3308锛屾ā鎷熴�屽缃� yml + 鍛戒护琛岃鐩栥�嶄袱绉嶆敼閰嶇疆鏂瑰紡锛夈��
+- 娴嬭瘯鏃堕棿锛�2026-09-13锛涜剼鏈細`package-deploy.py`銆乣_deploy_smoke.py`锛堢粨鏋� `_deploytest_result.txt`銆乣_deploytest_backend.log`锛夈��
+
+## 涓夈�佺敤渚嬭〃
+
+### 3.1 姝e悜鐢ㄤ緥
+
+| 缂栧彿 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+| --- | --- | --- | --- | --- |
+| TC-1 | `python package-deploy.py --no-build` | 浜у嚭 zip锛屼笖鏃犳姤閿� | `traffic-audit-deploy-20260913.zip` 69.9 MB / 246 鏂囦欢 | 閫氳繃 |
+| TC-2 | 妫�鏌� jar 鍐呭 | 鍚唴宓屽墠绔� | jar 55.5 MB锛宍BOOT-INF/classes/static/` 涓� 42 涓枃浠讹紝`static/index.html` 瀛樺湪 | 閫氳繃 |
+| TC-3 | 妫�鏌ラ儴缃茬洰褰曠粨鏋� | backend/frontend/db/README 榻愬叏 | backend锛坖ar + docs + application.yml + 2 涓惎鍔ㄨ剼鏈級銆乫rontend/dist銆乨b 4 涓� sql銆丷EADME | 閫氳繃 |
+| TC-4 | 鎵撳寘鍚庢簮鐮佺洰褰� | `src/main/resources/static` 搴旇娓呯┖ | 鎵撳寘缁撴潫鑷姩娓呯┖锛堜粨搴撴棤姹℃煋锛� | 閫氳繃 |
+| TC-5 | 浠庨儴缃插寘鐙珛鍚姩锛�8091锛� | 鍚姩鎴愬姛 | 鏃ュ織鍑虹幇 `Started TrafficAuditApplication`銆乣Tomcat started on port(s): 8091` | 閫氳繃 |
+| TC-6 | `GET /` | 200 涓旇繑鍥為〉闈� | 200锛�1828 瀛楄妭锛屽惈 `<div id="app">` | 閫氳繃 |
+| TC-7 | `GET /js/app.*.js` | 200锛堥潤鎬佽祫婧愬彲璁块棶锛� | 200锛�6253 瀛楄妭 | 閫氳繃 |
+| TC-8 | `POST /api/auth/login`锛坅dmin/123456锛� | 200 涓旇繑鍥� token | 200锛宍{"code":200,"message":"success","data":{...,"token":"eyJ..."}}` | 閫氳繃 |
+| TC-9 | 甯� token 瀵煎嚭銆婇亾璺繍杈撻噺姹囨�昏〃銆�2026-08 | 200 涓旀槸鍚堟硶 xlsx | 200锛�950,783 瀛楄妭锛屽ご閮� `PK`锛堜笌寮�鍙戞満瀵煎嚭浠跺悓灏哄锛� | 閫氳繃 |
+
+### 3.2 璐熷悜鐢ㄤ緥
+
+| 缂栧彿 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+| --- | --- | --- | --- | --- |
+| TC-N1 | 淇鍓嶏細`--jwt.secret=杩欐槸涓�涓腑鏂囧瘑閽 | 鏆撮湶闂 | 鐧诲綍 500锛屾棩蹇� `ArrayIndexOutOfBoundsException: 20018 at JwtUtils.generateToken` | 宸插鐜帮紙闂鎴愮珛锛� |
+| TC-N2 | 淇鍚庯細鍚屾牱浼犱腑鏂� secret | 涓嶅洜瀵嗛挜鏍煎紡宕╋紝鐧诲綍浠嶅彲鐢� | 鐧诲綍 200 鎷垮埌 token锛涘鍑哄悓鏍� 200 / 950,783 瀛楄妭锛涙棩蹇楀嚭鐜般�宩wt.secret 涓嶆槸鍚堟硶鐨� Base64 瀛楃涓测�︺�峎ARN | 閫氳繃 |
+| TC-N3 | 澶栫疆 application.yml 淇濈暀鍗犱綅瀵嗙爜锛岀敤鍛戒护琛� `--spring.datasource.password` 瑕嗙洊 | 鍛戒护琛岃鐩栫敓鏁� | 鍚姩鎴愬姛骞舵甯告煡搴擄紙鐧诲綍 200锛� | 閫氳繃 |
+| TC-N4 | 鎵撳寘鑴氭湰閲嶅鎵ц锛堟棫 staging 鐩綍鍚彧璇绘枃浠讹級 | 鑳芥竻鐞嗗苟閲嶅缓 | 棣栬疆鎶� `PermissionError WinError 5`锛屽姞 `rmtree_force`锛堝厛娓呭彧璇诲睘鎬э級鍚庢甯� | 宸蹭慨澶� |
+
+### 3.3 鍥炲綊鐢ㄤ緥
+
+| 缂栧彿 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+| --- | --- | --- | --- | --- |
+| TC-R1 | 寮�鍙戞満閲嶅惎鍚庣锛堣浇鍏� JwtUtils 鏀瑰姩锛� | 鍔熻兘涓嶅洖褰� | 鐧诲綍 200锛涘鍑� 2026-08 鈫� HTTP 200 / 950,783 瀛楄妭锛堜笌閮ㄧ讲鍖呬骇鐗┿��9-13 褰掓。浠跺悓灏哄锛� | 閫氳繃 |
+| TC-R2 | 鍓嶇鐢熶骇鏋勫缓 | 鏋勫缓鎴愬姛 | `npm run build` 鎴愬姛锛宍dist/index.html` + css/js/fonts 榻愬叏 | 閫氳繃 |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+1. **`jwt.secret` 闈炴硶 Base64 鈫� 鐧诲綍 500**锛堢儫娴嬫姄鍒帮級锛氬凡鎸夋牴鍥犱慨澶嶏紙Base64 浼樺厛銆佸惁鍒� UTF-8 鍏滃簳 + WARN锛夛紝骞跺湪鎵撳寘閰嶇疆閲岀粰鍑哄彲鐩存帴浣跨敤鐨� 32 浣嶅崄鍏繘鍒剁ず渚嬪�笺�佸湪璇存槑鏂囨。閲屽啓鏄庡彇鍊艰鍒欍��
+2. **鎵撳寘鑴氭湰娓呯悊鏃х洰褰曡鍙鏂囦欢鎸′綇**锛氭簮 `docs` 閲屾湁鍙 xlsx锛宍copy2` 浼氭妸鍙灞炴�у甫杩囧幓锛屽鑷� Windows 涓� `rmtree` 鎶ャ�屾嫆缁濊闂�嶁啋 鏂板 `rmtree_force()` 鍏� `chmod` 鍐嶅垹銆�
+3. **鏃с�婃墦鍖呴儴缃茶鏄庛�嬩笁澶勪笉瀹�**锛圧edis 蹇呴渶 / jar 宸插唴缃墠绔� / 缂� sql_wyc.sql锛夛細宸插叏閮ㄦ洿姝o紝骞惰ˉ涓婇儴缃插悗楠岃瘉娓呭崟涓庡父瑙侀棶棰樸��
+4. 璇存槑锛氱儫娴嬭剼鏈噷銆屾嬁鍒� token銆嶉偅涓�椤规墦鍗颁负 False锛屾槸鑴氭湰鎶婂搷搴斾綋鎴柇鍒� 120 瀛楃鍚庡啀鍒ゆ柇瀛楃涓插鑷达紙鎴柇鍚庣湅涓嶅埌 `"token"`锛夛紝鍘熷鍝嶅簲涓庡悗缁甫 token 鐨勫鍑鸿姹傚潎鎴愬姛锛圚TTP 200锛夛紝绋嬪簭鏈韩鏃犻棶棰樸��
+
+## 浜斻�佺粨璁�
+
+- 鎵撳寘鑴氭湰涓�閿彲浜у嚭鍙洿鎺ラ儴缃茬殑 zip锛涢儴缃插寘鍦�**鑴辩婧愮爜鐩綍**銆佷粎闈� jar + docs + 澶栫疆閰嶇疆鐨勫墠鎻愪笅锛岀嫭绔嬪惎鍔ㄣ�侀〉闈�/闈欐�佽祫婧�/鐧诲綍/瀵煎嚭鍏ㄩ儴閫氳繃锛屽鍑轰骇鐗╀笌寮�鍙戞満涓�鑷达紙950,783 瀛楄妭锛夈��
+- `jwt.secret` 鐨勯儴缃查櫡闃卞凡鏍瑰洜淇锛岄儴缃插悓浜嬪嵆浣垮~浜嗕笉瑙勮寖鐨勫�间篃涓嶄細鍐嶅嚭鐜般�岀櫥褰� 500銆嶈�屾棤浠庝笅鎵嬨��
+- 閮ㄧ讲璇存槑宸蹭笌褰撳墠浠g爜瀵归綈锛堜笉闇�瑕� Redis銆佷笉闇�瑕� nginx銆�4 涓缓琛ㄨ剼鏈�佸缃厤缃」榻愬叏锛夈��
diff --git "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-13.md" "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-13.md"
index 7cef2cb..c84b5e9 100644
--- "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-13.md"
+++ "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-13.md"
@@ -39,6 +39,16 @@
- 鎺ㄩ�佸墠 `git fetch gitea` / `git fetch origin` 鍧囨棤鏂版彁浜わ紙`rev-list --left-right --count` = `0 0`锛夛紝鏈鐩栧悓浜嬩唬鐮併��
- 鍙戝竷鍚庡璺� 2026-08 瀵煎嚭锛圚TTP 200 / 950,783 瀛楄妭 / 29.2 绉掞級锛屽鍙戝竷鍚庝骇鐗� `_t4_2026-08.xlsx` 鍐嶅仛 586 鏍肩嫭绔嬪鏍� = 宸紓 0 鏍硷紱涓庡彂甯冨墠浜х墿閫� zip 鏉$洰姣斿锛屽唴閮ㄦ潯鐩瓧鑺傚畬鍏ㄤ竴鑷达紙MD5 宸紓浠呮潵鑷� zip 澶存椂闂存埑锛夈��
+
+### 8. 鎵撳寘閮ㄧ讲鏀寔锛堢敤鎴锋柊闇�姹傦細閮ㄧ讲鍒板彟涓�鍙版満鍣級
+- 鏂板涓�閿墦鍖呰剼鏈� `package-deploy.py`锛氬墠绔� `npm run build` 鈫� `dist` 鍐呭祵杩涘悗绔� jar锛堟嫹鍏� `resources/static`锛夆啋 `mvn clean package` 鈫� 娓呯┖ static 鈫� 缁勮 `deploy/traffic-audit-deploy-YYYYMMDD/` 鈫� 鍘嬬缉 `traffic-audit-deploy-YYYYMMDD.zip`锛堟湰娆� 69.9 MB / 246 鏂囦欢锛宩ar 55.5 MB锛夈��
+- 閮ㄧ讲鍖呯粨鏋勶細`backend/`锛坖ar + docs + application.yml + start-backend.cmd/.sh锛夈�乣frontend/`锛坉ist + nginx 绀轰緥锛夈�乣db/`锛坕nit.sql + sql_city_bus/taxi/wyc.sql锛夈�丷EADME銆�
+- **淇閮ㄧ讲闄烽槺**锛歚jwt.secret` 濉垚闈炴硶 Base64锛堝涓枃锛変細璁╃櫥褰曟帴鍙� 500锛坖jwt 0.9.1 鎸� Base64 瑙g爜 secret锛夆啋 `JwtUtils` 鏂板 `secretKeyBytes()` 鍏滃簳锛圔ase64 浼樺厛銆佸惁鍒� UTF-8 瀛楄妭 + WARN锛夈��
+- 鏇存 `docs/鎵撳寘閮ㄧ讲璇存槑.md` 涓夊涓嶅疄锛氣憼 涓嶉渶瑕� Redis锛坧om 鏃犱緷璧栥�佷唬鐮佹湭鐢級锛涒憽 鍓嶇鏀逛负鍐呭祵杩� jar锛堟棫璇存槑绉般�屽凡鍐呯疆 file:./web/銆嶏紝瀹為檯 jar 鍐呮棤闈欐�佹枃浠讹級锛涒憿 琛� `sql_wyc.sql` 涓� `summary.template-dir`銆�
+- 鐙珛楠岃瘉锛氭妸閮ㄧ讲鍖� backend 鎷峰埌 `_deploytest/` 鐢� 8091 绔彛鐙珛鍚姩 鈫� 鍚姩鎴愬姛銆乣GET /` 200 鏈� `#app`銆侀潤鎬� js 200銆佺櫥褰� 200 鎷垮埌 token銆佸鍑烘眹鎬诲ぇ琛� 200 / 950,783 瀛楄妭锛堜笌寮�鍙戞満浜х墿鍚屽昂瀵革級锛涘彟娴嬩腑鏂� secret 鍏滃簳璺緞鍚屾牱 200銆�
+- 寮�鍙戞満鍚庣宸叉寜鏂颁唬鐮侀噸鍚紙鏃� PID 27840 宸插仠锛夛紝閲嶅惎鍚庣櫥褰� 200銆佸鍑� 950,783 瀛楄妭锛屾棤鍥炲綊銆�
+- 鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_閮ㄧ讲鍖呮墦鍖呬笌鐙珛鍚姩_2026-09-13.md`銆�
+
## 浜屻�佹祴璇曠粨鏋滄憳瑕侊紙璇﹁銆婂姛鑳芥祴璇曟姤鍛娿�嬶級
| 椤� | 缁撴灉 |
diff --git "a/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md" "b/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md"
index 5ec47bb..656d801 100644
--- "a/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md"
+++ "b/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md"
@@ -1,6 +1,6 @@
# 浜ら�氱粺璁℃姤琛ㄥ鏍哥郴缁� 鈥� 鎵撳寘涓庨儴缃茶鏄�
-> 閫傜敤锛氬悎骞跺悗 main 鍒嗘敮锛�2026-08-27 璧凤級銆傚悗绔� Spring Boot 2.7锛圝ava 8锛夛紝鍓嶇 Vue 2 + Element UI銆�
+> 閫傜敤锛歮ain 鍒嗘敮锛堟渶鏂版洿鏂� 2026-09-13锛夈�傚悗绔� Spring Boot 2.7锛圝ava 8锛夛紝鍓嶇 Vue 2 + Element UI銆�
> 鏈枃妗i潰鍚戝紑鍙戜笌閮ㄧ讲鍚屼簨锛屽懡浠ゅ潎鍦� Windows 涓嬮獙璇併��
## 涓�銆侀」鐩粨鏋�
@@ -9,156 +9,161 @@
|------|------|
| `traffic-audit-server` | 鍚庣锛圫pring Boot锛孞ava 8锛岀鍙� 8090锛屾帴鍙e叏閮ㄥ湪 `/api/**`锛� |
| `traffic-audit-web` | 鍓嶇锛圴ue 2 + Element UI锛屽紑鍙戠鍙� 8080锛宍/api` 浠g悊鍒� 8090锛� |
-| `docs` | 杩愯鏁版嵁鐩綍锛堟姤琛� Word/Excel 妯℃澘 + 鐩綍瀵煎叆鏁版嵁锛夛紝**鍙戝竷蹇呴』甯︿笂** |
-| `docs/init.sql` | 鏁版嵁搴撳垵濮嬪寲鑴氭湰锛堝缓搴撳缓琛� + 鍒濆璐﹀彿锛� |
+| `docs` | 杩愯鏁版嵁鐩綍锛堟姤琛ㄦā鏉裤�佹眹鎬诲ぇ琛ㄦ瘝鐗堢瓑锛夛紝**鍙戝竷蹇呴』甯︿笂** |
+| `package-deploy.py` | 涓�閿墦鍖呰剼鏈紙鍓嶇鏋勫缓 鈫� 鍐呭祵杩� jar 鈫� 缁勮閮ㄧ讲鍖� 鈫� 鎵� zip锛� |
## 浜屻�佺幆澧冭姹�
-| 缁勪欢 | 鐗堟湰 | 鐢ㄩ�� |
+| 缁勪欢 | 鐗堟湰 | 璇存槑 |
|------|------|------|
-| JDK | 1.8 | 鍚庣缂栬瘧涓庤繍琛� |
-| Maven | 3.x | 鍚庣鎵撳寘 |
-| Node.js | 14+ | 鍓嶇鎵撳寘锛坴ue-cli 4.5锛� |
-| MySQL | 8.0 | 鏁版嵁搴擄紙搴撳悕 `traffic_audit`锛� |
+| JDK | 1.8 | 閮ㄧ讲鏈哄繀椤伙紱鍚庣缂栬瘧/杩愯 |
+| MySQL | 5.7 / 8.0 | 閮ㄧ讲鏈哄繀椤伙紝搴撳悕 `traffic_audit` |
+| Maven 3.x / Node.js 14+ | 鈥� | **鍙湁銆屽湪閮ㄧ讲鏈轰笂鎵撳寘銆嶆墠闇�瑕�**锛涚敤涓�閿剼鏈骇鍑虹殑鍖呴儴缃插垯涓嶉渶瑕� |
+| Redis | **涓嶉渶瑕�** | 浠g爜鏈娇鐢� Redis锛堟棫璇存槑涓殑 Redis 閰嶇疆鏄仐鐣欓」锛屽彲蹇界暐锛� |
+| nginx / IIS | **涓嶉渶瑕�** | 鍓嶇宸插唴宓岃繘 jar锛岃闂� 8090 鍗冲彲锛涜鍓嶅悗绔垎绂绘椂鎵嶆槸澶囬�� |
-## 涓夈�佹暟鎹簱鍒濆鍖�
-
-鍏堟墽琛屽缓搴撳缓琛ㄨ剼鏈紝鍐嶆寜闇�瀵煎叆鍩庡競瀹㈣繍鏁版嵁锛�
-
-```bash
-mysql --default-character-set=utf8mb4 -h <涓绘満> -P 3306 -u root -p < docs/init.sql
-mysql --default-character-set=utf8mb4 -h <涓绘満> -P 3306 -u root -p traffic_audit < docs/sql_city_bus.sql
-mysql --default-character-set=utf8mb4 -h <涓绘満> -P 3306 -u root -p traffic_audit < docs/sql_city_taxi.sql
-```
-
-- `init.sql` 浼氶噸寤� `traffic_audit` 搴撳苟棰勭疆鍒濆璐﹀彿锛歚admin / admin123`锛堢敓浜х幆澧冭鐧诲綍鍚庢敼瀵嗙爜锛�
-- `sql_city_bus.sql`銆乣sql_city_taxi.sql` 涓哄煄甯傚杩愶紙鍏氦/鍑虹锛夌ず渚嬫暟鎹紝鎸夐渶瀵煎叆
-
-## 鍥涖�佹墦鍖�
-
-### 4.1 鍚庣锛堥」鐩牴鐩綍鎵ц锛�
+## 涓夈�佹墦鍖咃紙鍦ㄥ紑鍙戞満涓婃墽琛岋紝鎺ㄨ崘涓�閿剼鏈級
```powershell
+cd D:\鏂囨。\ChatGPT\traffic-audit
+python package-deploy.py # 鍏ㄦ祦绋嬶細鍓嶇鏋勫缓 + 鍚庣鎵撳寘 + 缁勮 + 鍘嬬缉
+python package-deploy.py --no-build # 璺宠繃鍓嶇鏋勫缓锛坉ist 宸叉槸鏈�鏂版椂鏇村揩锛�
+```
+
+鑴氭湰鍋氫簡浠�涔堬細
+
+1. `traffic-audit-web` 涓� `npm run build` 鈫� `dist`锛�
+2. 鎶� `dist` 澶嶅埗杩� `traffic-audit-server/src/main/resources/static`锛屼娇 **jar 鑷甫鍓嶇**锛屽啀 `mvn clean package -DskipTests`锛堣窇瀹岃嚜鍔ㄦ竻绌� static锛屼繚鎸佷粨搴撳共鍑�锛夛紱
+3. 缁勮 `deploy/traffic-audit-deploy-YYYYMMDD/`锛�
+4. 鍘嬬缉涓� `traffic-audit-deploy-YYYYMMDD.zip`锛堢害 70 MB锛夈��
+
+鎵嬪伐绛変环鍛戒护锛堜笉鎯崇敤鑴氭湰鏃讹級锛�
+
+```powershell
+cd traffic-audit-web ; npm run build ; cd ..
+robocopy traffic-audit-web\dist traffic-audit-server\src\main\resources\static /E
cmd /c "mvn -q clean package -DskipTests -f traffic-audit-server\pom.xml"
```
-浜х墿锛歚traffic-audit-server\target\traffic-audit-server-1.0.0-SNAPSHOT.jar`锛堝彲鎵ц fat jar锛岀害 57MB锛夈��
+> 娉ㄦ剰锛氭墜宸ユ柟寮忚窇瀹岃寰楀垹鎺� `traffic-audit-server/src/main/resources/static` 涓嬬殑鍐呭锛屽惁鍒欎細姹℃煋婧愮爜鐩綍銆�
-### 4.2 鍓嶇锛坄traffic-audit-web` 鐩綍鎵ц锛�
-
-```powershell
-cd traffic-audit-web
-npm run build
-```
-
-浜х墿锛歚traffic-audit-web\dist\`锛坄index.html` + `css/js/fonts`锛岀函闈欐�佹枃浠讹級銆�
-
-## 浜斻�侀儴缃茬洰褰曠粨鏋勶紙鎺ㄨ崘锛�
+## 鍥涖�侀儴缃插寘鍐呭
```
-deploy\
-鈹溾攢 app.jar # 鍚庣 jar锛堝彲鏀瑰悕锛�
-鈹溾攢 docs\ # 蹇呴』锛氭ā鏉夸笌鐩綍瀵煎叆鏁版嵁鐩綍
-鈹� 鈹溾攢 鍩庡競瀹㈣繍\
-鈹� 鈹溾攢 鍏矾鏃呭\
-鈹� 鈹溾攢 璐ц繍\
-鈹� 鈹溾攢 鑳借�梊
-鈹� 鈹溾攢 鎶曡祫\
-鈹� 鈹� 鈹斺攢 妯℃澘\
-鈹� 鈹斺攢 (6鏈圽 7鏈圽 绛夊鍏ユ暟鎹洰褰曪紝鎸夐渶)
-鈹斺攢 web\ # 鍓嶇 dist 鐨勫唴瀹癸紙鐢卞悗绔� 8090 鎵樼锛�
- 鈹溾攢 index.html
- 鈹溾攢 css\ js\ fonts\
+traffic-audit-deploy-YYYYMMDD/
+鈹溾攢 backend/
+鈹� 鈹溾攢 traffic-audit-server-1.0.0-SNAPSHOT.jar 鍚庣 + 鍐呭祵鍓嶇锛堢害 55 MB锛�
+鈹� 鈹溾攢 docs/ 妯℃澘涓庤繍琛屾暟鎹紙蹇呴渶锛屽嬁鍒狅級
+鈹� 鈹溾攢 application.yml 澶栭儴閰嶇疆锛堟敼杩欓噷鍗冲彲锛屾棤闇�閲嶆墦鍖咃級
+鈹� 鈹斺攢 start-backend.cmd / start-backend.sh 鍚姩鑴氭湰
+鈹溾攢 frontend/
+鈹� 鈹溾攢 dist/ 鍓嶇浜х墿锛堜粎 nginx 鏂规闇�瑕侊級
+鈹� 鈹斺攢 nginx.conf.example nginx 閰嶇疆绀轰緥
+鈹溾攢 db/
+鈹� 鈹溾攢 init.sql 寤哄簱寤鸿〃 + 棰勭疆璐﹀彿锛堝繀椤绘墽琛岋級
+鈹� 鈹溾攢 sql_city_bus.sql 鍩庡競瀹㈣繍-鍏氦鏈堝害琛紙蹇呴』鎵ц锛�
+鈹� 鈹溾攢 sql_city_taxi.sql 鍩庡競瀹㈣繍-鍑虹鏈堝害琛�/鎺堟潈琛紙蹇呴』鎵ц锛�
+鈹� 鈹斺攢 sql_wyc.sql 缃戠害杞﹀叏鐪佹�婚噺/璁㈠崟鍒嗗競宸炶〃锛堝繀椤绘墽琛岋級
+鈹斺攢 README-閮ㄧ讲璇存槑.txt
```
-鍏抽敭鐐癸細
+## 浜斻�佺洰鏍囨満鍣ㄩ儴缃叉楠�
-- **`docs` 蹇呴』鏀惧湪 jar 鍚岀骇**銆傚悗绔繍琛屾椂鎸夊惎鍔ㄧ洰褰曞悜涓婃煡鎵� `docs`锛堟姤琛ㄥ鍑虹殑 Word 妯℃澘銆佸鍏ラ〉銆屼笅杞芥ā鏉裤�嶃�佺洰褰曞鍏ユ暟鎹兘浠庤繖閲岃锛夛紝鎵句笉鍒颁細鎶ャ�屾湭鎵惧埌鏁版嵁鐩綍 docs銆嶆垨銆屾湭鎵惧埌妯℃澘鏂囦欢 xxx銆嶃��
-- 棣栨閮ㄧ讲鐩存帴鎶婇」鐩噷鐨勬暣涓� `docs` 鎷疯繃鍘绘渶绋冲Ε锛涘悗缁彲绮剧畝锛堝彧鐣欐ā鏉垮瓙鐩綍锛夛紝璇﹁銆屽父瑙侀棶棰樸�嶃��
-- `application.yml` 鎵撳寘鍦� jar 鍐咃紝宸插唴缃墠绔潤鎬佹墭绠★紙`file:./web/`锛夛紱閮ㄧ讲鏈洪渶瑕佹敼閰嶇疆鏃讹紝鍙湪 jar 鍚岀骇鏀句竴涓缃� `application.yml`锛堝缃紭鍏堢骇楂樹簬鍐呯疆锛屾敞鎰忛渶鍖呭惈瀹屾暣閰嶇疆锛夛紝鎴栨敼瀹屽啀鎵撳寘銆�
-- 鍚姩鍚庢祻瑙堝櫒鐩存帴璁块棶 `http://<鏈嶅姟鍣�>:8090`锛屾棤闇�棰濆 Web 鏈嶅姟鍣ㄣ��
+### 5.1 鍒濆鍖栨暟鎹簱锛�4 涓剼鏈兘瑕佹墽琛岋級
-## 鍏�佸叧閿厤缃紙application.yml锛�
+```bash
+mysql --default-character-set=utf8mb4 -u root -p < db/init.sql
+mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_city_bus.sql
+mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_city_taxi.sql
+mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_wyc.sql
+```
+
+- 棰勭疆璐﹀彿锛歚admin / admin123`锛堢櫥褰曞悗璇风珛鍗虫敼瀵嗙爜锛夈��
+- 鎯宠繛鏁版嵁涓�璧锋惉锛氬湪婧愭満鍣� `mysqldump -u root -p --databases traffic_audit > traffic_audit_full.sql`锛屽湪鐩爣鏈哄櫒 `mysql -u root -p < traffic_audit_full.sql`锛堜細瑕嗙洊棰勭疆璐﹀彿锛夈��
+
+### 5.2 鏀归厤缃� `backend/application.yml`
| 閰嶇疆椤� | 璇存槑 |
|--------|------|
-| `spring.datasource.url/username/password` | 鏁版嵁搴撹繛鎺ワ紙妯℃澘榛樿 `localhost:3305/root/root`锛岄儴缃叉満**蹇呴』鏀�**锛涚敓浜у缓璁敤鐜鍙橀噺 `MYSQL_PASSWORD` 娉ㄥ叆锛� |
-| `deepseek.api-key` | AI 鍒嗘瀽鎺ュ彛瀵嗛挜锛堢幆澧冨彉閲� `DEEPSEEK_API_KEY`锛屼笉浣跨敤 AI 鍒嗘瀽鍙暀绌猴級 |
-| `jwt.secret` | 鐧诲綍浠ょ墝瀵嗛挜锛堢敓浜у繀椤绘敼锛岀幆澧冨彉閲� `JWT_SECRET`锛� |
-| `docs.template-root` | 瀵煎叆妯℃澘涓嬭浇鏍圭洰褰曪紙榛樿 `docs`锛� |
-| `city-passenger.template-dir` | 鍩庡競瀹㈣繍鎶ヨ〃妯℃澘鐩綍锛堥粯璁� `docs/鍩庡競瀹㈣繍`锛� |
-| `passenger.template-dir` | 鍏矾鏃呭鎶ヨ〃妯℃澘鐩綍锛堥粯璁� `docs/鍏矾鏃呭`锛� |
-| `freight.template-dir` | 璐ц繍鎶ヨ〃妯℃澘鐩綍锛堥粯璁� `docs/璐ц繍`锛� |
-| `energy.template-dir` | 鑳借�楁姤琛ㄦā鏉跨洰褰曪紙榛樿 `docs/鑳借�梎锛� |
-| `investment.template-dir` | 鎶曡祫鎶ヨ〃妯℃澘鐩綍锛堥粯璁� `docs/鎶曡祫/妯℃澘`锛� |
+| `spring.datasource.url` | 鏁版嵁搴撳湴鍧�锛堝嚭鍘傚�� `127.0.0.1:3306/traffic_audit`锛屾寜瀹為檯鏀癸級 |
+| `spring.datasource.username/password` | 鏁版嵁搴撹处鍙峰瘑鐮侊紙**蹇呮敼**锛� |
+| `jwt.secret` | 鐧诲綍浠ょ墝瀵嗛挜锛�**蹇呴』鏄� Base64 鍚堟硶瀛楃涓旈暱搴︽槸 4 鐨勫�嶆暟**锛堝嚭鍘傚�兼槸涓�涓� 32 浣嶅崄鍏繘鍒讹級锛涘~涓枃鎴栭潪娉曞瓧绗︿細瀵艰嚧鐧诲綍 500锛堢▼搴忓凡鍋氬厹搴曞苟鎵� WARN锛屼絾浠嶅缓璁~瑙勮寖鍊硷級 |
+| `deepseek.api-key` | AI 鍒嗘瀽鐢紝涓嶇敤鍙暀绌� |
+| `server.port` | 榛樿 8090 |
-> 娉ㄦ剰锛氫粨搴撳彧鎻愪氦鍗犱綅妯℃澘 `application.yml.example`锛岀湡瀹� `application.yml` 涓嶅叆搴撱��
+> 澶栫疆 `application.yml` 涓� jar 鍚岀骇鍗崇敓鏁堬紙浼樺厛绾ч珮浜� jar 鍐呯疆閰嶇疆锛夛紝鏀瑰畬涓嶇敤閲嶆柊鎵撳寘銆�
-## 涓冦�佸惎鍔ㄥ悗绔�
+### 5.3 鍚姩锛堝繀椤诲湪 `backend` 鐩綍涓嬶級
```powershell
-cd deploy
-java -jar app.jar
+# Windows锛氬弻鍑� start-backend.cmd锛涙垨
+cd backend ; java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar
```
-- 鎴愬姛鏍囧織锛氭棩蹇楀嚭鐜� `Started TrafficAuditApplication` 鍜� `Tomcat started on port(s): 8090`銆�
-- 鍦� `deploy` 鐩綍涓嬪惎鍔ㄥ嵆鍙懡涓悓绾х殑 `docs`銆�
-
-## 鍏�佸墠绔儴缃诧紙鎺ㄨ崘锛歋pring Boot 鐩存帴鎵樼锛屾棤闇� IIS/nginx锛�
-
-- 鎶婂墠绔瀯寤轰骇鐗� `dist` 鐨勫唴瀹规斁鍒� jar 鍚岀骇鐩綍 `web\`锛堝嵆 `web\index.html`銆乣web\js\`銆乣web\css\`銆乣web\fonts\`锛夈��
-- 鍚庣宸插唴缃細`spring.web.resources.static-locations: file:./web/`锛堥潤鎬佹墭绠★級+ 瀹夊叏閰嶇疆鏀捐闈欐�佽祫婧愶紝鍚姩鍚庣洿鎺ヨ闂� `http://<鏈嶅姟鍣�>:8090` 鍗冲彲锛岄〉闈笌 `/api` 鍚屾簮锛�**涓嶉渶瑕� IIS/nginx 鍙嶄唬**銆�
-- 鍓嶇璺敱涓� hash 妯″紡锛屽埛鏂�/鐩磋揪鏃� 404 闂銆�
-
-### 澶囬�夛細nginx 鎵樼 + /api 鍙嶄唬锛堝闇�鍓嶅悗绔垎绂伙級
-
-```nginx
-server {
- listen 80;
- server_name _;
- root D:/deploy/web; # 鍓嶇 dist 鐩綍
- index index.html;
-
- location / {
- try_files $uri $uri/ /index.html;
- }
-
- location /api {
- proxy_pass http://127.0.0.1:8090;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
-
- client_max_body_size 100m; # 涓婁紶 Excel 闇�瑕侊紝涓庡悗绔� multipart 100MB 瀵归綈
-}
+```bash
+# Linux
+cd backend && sh start-backend.sh
```
-> 鑻ュ墠绔敱 IIS 鎵樼锛岄渶瀹夎 URL Rewrite 2.0 + ARR 3.0 骞跺惎鐢� proxy锛岀珯鐐规牴鐩綍鏀� `docs/iis-web.config.example`锛堥噸鍛藉悕 web.config锛夛紝瑙勫垯绀轰緥瑙佽鏂囦欢銆�
+鎴愬姛鏍囧織锛氭棩蹇楀嚭鐜� `Started TrafficAuditApplication` 涓� `Tomcat started on port(s): 8090`銆�
-## 涔濄�侀儴缃插悗楠岃瘉
+### 5.4 璁块棶
-1. 娴忚鍣ㄦ墦寮� `http://<鏈嶅姟鍣�>:8090`锛�
-2. 鐢� `admin / admin123` 鐧诲綍锛堢敓浜ф敼瀵嗗悗浣跨敤鏂板瘑鐮侊級锛�
-3. 鏁版嵁瀵煎叆锛氫笅杞芥ā鏉� 鈫� 涓婁紶 Excel锛堟垨鐩綍瀵煎叆锛夛紱
-4. 鎶ヨ〃锛氭煡璇� 鈫� 棰勮/瀵煎嚭锛堜緷璧� `docs` 妯℃澘鏂囦欢锛夛紱
-5. AI 鍒嗘瀽锛氶渶閰嶇疆 `deepseek.api-key` 鍚庡彲鐢ㄣ��
+娴忚鍣ㄦ墦寮� `http://<閮ㄧ讲鏈篒P>:8090`锛堝墠绔凡鍐呭祵锛岄〉闈笌鎺ュ彛鍚屾簮锛屾棤闇� nginx锛夛紝璐﹀彿 `admin / admin123`銆�
-## 鍗併�佸父瑙侀棶棰�
+## 鍏�佸叧閿厤缃紙application.yml锛変笌杩愯鏁版嵁
+
+| 閰嶇疆椤� | 榛樿鍊� | 璇存槑 |
+|--------|--------|------|
+| `docs.template-root` | `docs` | 瀵煎叆妯℃澘涓嬭浇鏍圭洰褰� |
+| `city-passenger.template-dir` | `docs/鍩庡競瀹㈣繍` | 鍩庡競瀹㈣繍锛堝惈銆婃ā鏉縚缃戠害杞﹁鍗�.docx銆嬶級 |
+| `passenger.template-dir` | `docs/鍏矾鏃呭` | 鍏矾鏃呭 |
+| `freight.template-dir` | `docs/璐ц繍` | 璐ц繍 |
+| `energy.template-dir` | `docs/鑳借�梎 | 鑳借�� |
+| `investment.template-dir` | `docs/鎶曡祫/妯℃澘` | 鎶曡祫 |
+| `summary.template-dir` | `docs/鐢熸垚姹囨�诲ぇ琛╜ | **姹囨�诲ぇ琛ㄦ瘝鐗堜笌鐗堝紡鍙傜収浠�**锛堝鍑烘姤琛ㄤ緷璧栵級 |
+
+`docs/鐢熸垚姹囨�诲ぇ琛╜ 鑷冲皯瑕佹湁锛�
+
+- `鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx`锛堢増寮忓弬鐓т欢锛岀己澶变細閫�鍥為粯璁ゅ垪瀹斤級锛�
+- 闇�瑕佸鍑虹殑鍚勬湀浠芥瘝鐗� `YYYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx`锛堢己鍝釜鏈堬紝瀵奸偅涓湀灏变細鏄庣‘鎶ラ敊锛夈��
+
+## 涓冦�佸墠绔儴缃诧紙涓ょ鏂瑰紡锛�
+
+1. **鎺ㄨ崘锛歫ar 鍐呭祵**鈥斺�斾竴閿剼鏈凡鎶� `dist` 鎵撹繘 jar锛岀洿鎺ヨ闂� `http://<IP>:8090` 鍗冲彲锛屾棤闇�棰濆 Web 鏈嶅姟鍣ㄣ��
+2. 澶囬�夛細nginx 鎵樼 `frontend/dist` 骞舵妸 `/api` 鍙嶄唬鍒� 8090锛堥厤缃 `frontend/nginx.conf.example`锛夛紱涓婁紶 100MB 澶ф枃浠舵椂璁板緱璁� `client_max_body_size 100m`銆�
+
+鍓嶇璺敱涓� hash 妯″紡锛屽埛鏂�/鐩磋揪涓嶄細 404銆�
+
+## 鍏�侀儴缃插悗楠岃瘉娓呭崟
+
+1. `http://<IP>:8090` 鎵撳紑鐧诲綍椤碉紙椤甸潰涓嶆槸绌虹櫧锛夛紱
+2. `admin / admin123` 鑳界櫥褰曪紝宸︿笂瑙掓樉绀恒�岀鐞嗗憳銆嶏紱
+3. 銆屾暟鎹鍏ャ�嶉〉鑳戒笅杞芥ā鏉裤�佽兘涓婁紶 Excel锛�
+4. 銆屾姤琛ㄣ�嶉〉鏌ヨ + 瀵煎嚭銆婇亾璺繍杈撻噺姹囨�昏〃銆嬶紝鑳戒笅杞藉埌 xlsx锛�
+5. 鎵撳紑瀵煎嚭鐨� xlsx锛屾牳瀵瑰綋鏈堟暟鍊兼槸鍚︿负鏈�鏂版姤琛ㄦ湡銆�
+
+## 涔濄�佸父瑙侀棶棰�
| 鐜拌薄 | 鍘熷洜 / 澶勭悊 |
|------|------------|
-| 鍚姩鎶ャ�屾湭鎵惧埌鏁版嵁鐩綍 docs銆� | 褰撳墠杩愯鐩綍涓嶅锛涙妸 `docs` 鏀惧埌 jar 鍚岀骇鍐嶅惎鍔� |
-| 瀵煎嚭鎶ャ�屾湭鎵惧埌妯℃澘鏂囦欢 xxx銆� | `docs` 瀵瑰簲瀛愮洰褰曠己妯℃澘鏂囦欢锛涢娆¢儴缃叉嫹鏁翠釜 `docs` |
-| 椤甸潰鑳藉紑浣嗘帴鍙� 404锛堥獙璇佺爜鍔犺浇澶辫触锛� | 鍓嶇鐢� IIS/nginx 鎵樼鏃舵病閰� `/api` 鍙嶄唬锛涙敼鐢� Spring Boot 鎵樼锛坵eb\ 鐩綍锛夊垯鏃犳闂 |
-| 鏁版嵁搴撹繛鎺ュけ璐� | 妫�鏌� `application.yml` 鍦板潃/璐﹀彿/瀵嗙爜锛涘厛鎵ц `init.sql` |
-| 涓婁紶澶ф枃浠跺け璐� | 妫�鏌� nginx `client_max_body_size` 涓庡悗绔� multipart 闄愬埗 |
-| 绔彛鍗犵敤 | 鍚庣 8090銆佸墠绔� 80/8080 |
+| 鍚姩鎶ャ�屾湭鎵惧埌鏁版嵁鐩綍 docs銆� | 蹇呴』鍦� `backend` 鐩綍涓嬪惎鍔紙jar 涓� docs 鍚岀骇锛� |
+| 瀵煎嚭鎶ャ�屾湭鎵惧埌妯℃澘鏂囦欢 xxx銆� | `docs` 瀵瑰簲瀛愮洰褰曠己妯℃澘锛涗粠婧愭満鍣ㄦ嫹璐� |
+| 瀵煎嚭鎶ャ�屾湭鎵惧埌姹囨�昏〃姣嶇増銆奩YYY骞碝鏈堚�︺�嬨�� | `docs/鐢熸垚姹囨�诲ぇ琛╜ 缂鸿鏈堟瘝鐗� |
+| 鐧诲綍鎺ュ彛 500 | `jwt.secret` 濉簡闈炴硶瀛楃锛堝涓枃锛夛紱鏀规垚 32 浣嶅崄鍏繘鍒朵覆 |
+| 椤甸潰鑳藉紑浣嗘帴鍙� 404 | 璧� nginx 鏂规鏃舵病閰� `/api` 鍙嶄唬锛涙敼鐢� jar 鍐呭祵璁块棶 8090 |
+| 鏁版嵁搴撹繛鎺ュけ璐� | 妫�鏌� `application.yml`锛涚‘璁� 4 涓� SQL 鑴氭湰宸叉墽琛� |
+| 绔彛鍗犵敤 | 鏀� `server.port`锛涘墠绔紑鍙戠鍙� 8080 |
-## 鍗佷竴銆佸紑鍙戠幆澧冩棩甯稿惎鍔�
-
-椤圭洰鏍圭洰褰曡繍琛屼竴閿剼鏈紙鑷姩鎷夎捣鍚庣 8090 + 鍓嶇 8080锛夛細
+## 鍗併�佸紑鍙戠幆澧冩棩甯稿惎鍔�
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1
-```
\ No newline at end of file
+```
+
+鍚庣 8090锛坄mvn spring-boot:run`锛�+ 鍓嶇 8080锛坄npm run serve`锛夛紝璁块棶 `http://localhost:8080`銆�
+
+## 鍗佷竴銆佸彉鏇磋褰�
+
+- **2026-09-13**锛氭柊澧炰竴閿墦鍖呰剼鏈� `package-deploy.py`锛沯ar 鏀逛负鍐呭祵鍓嶇锛堥儴缃叉満涓嶅啀闇�瑕� nginx锛夛紱鍒犻櫎 Redis 鐩稿叧璇存槑锛堜唬鐮佹湭浣跨敤锛夛紱琛� `sql_wyc.sql` 涓� `summary.template-dir`锛涜ˉ `jwt.secret` 鍙栧�艰鍒欙紱琛ラ儴缃插悗楠岃瘉娓呭崟銆�
+- 2026-08-27锛氶鐗堬紙zip 閮ㄧ讲鍖� + nginx 鏂规锛夈��
diff --git a/package-deploy.py b/package-deploy.py
new file mode 100644
index 0000000..41d0c19
--- /dev/null
+++ b/package-deploy.py
@@ -0,0 +1,283 @@
+# -*- coding: utf-8 -*-
+"""TrafficAudit 涓�閿墦鍖呰剼鏈細鍓嶇鏋勫缓 -> 鍐呭祵杩涘悗绔� jar -> 缁勮閮ㄧ讲鍖� -> 鎵� zip
+鐢ㄦ硶锛歱ython package-deploy.py [--no-build]
+"""
+import io, os, sys, shutil, zipfile, subprocess, datetime
+
+ROOT = os.path.dirname(os.path.abspath(__file__))
+WEB = os.path.join(ROOT, "traffic-audit-web")
+SERVER = os.path.join(ROOT, "traffic-audit-server")
+STATIC = os.path.join(SERVER, "src", "main", "resources", "static")
+STAMP = datetime.datetime.now().strftime("%Y%m%d")
+STAGE = os.path.join(ROOT, "deploy", "traffic-audit-deploy-" + STAMP)
+ZIP = os.path.join(ROOT, "traffic-audit-deploy-" + STAMP + ".zip")
+JAR_NAME = "traffic-audit-server-1.0.0-SNAPSHOT.jar"
+SKIP_DOC_DIRS = {"ai_demo", "usage_screenshots", "鍔熻兘娴嬭瘯鎶ュ憡", "宸ヤ綔鏃ョ粨"}
+
+def rmtree_force(path):
+ """鍒犻櫎鐩綍锛氬厛娓呮帀鍙灞炴�э紙婧愮洰褰曢噷瀛樺湪鍙鏂囦欢锛宑opy2 浼氬甫杩囨潵锛屽鑷� Windows 涓� rmtree 鎶ユ嫆缁濊闂級"""
+ if not os.path.isdir(path):
+ return
+ for r, d, fs in os.walk(path):
+ for f in fs:
+ try:
+ os.chmod(os.path.join(r, f), 0o666)
+ except OSError:
+ pass
+ shutil.rmtree(path, ignore_errors=True)
+
+
+def run(cmd, cwd, log):
+ with io.open(log, "w", encoding="utf-8", newline="") as f:
+ p = subprocess.run(cmd, cwd=cwd, stdout=f, stderr=subprocess.STDOUT, shell=True)
+ return p.returncode
+
+def main():
+ do_build = "--no-build" not in sys.argv
+ print("[1/6] 鍓嶇鏋勫缓 ...")
+ if do_build:
+ rc = run('cmd /c "npm.cmd run build 1>build_prod.log 2>&1"', WEB, os.path.join(WEB, "build_prod.log"))
+ print(" npm run build rc=%d" % rc)
+ if rc != 0:
+ raise SystemExit("鍓嶇鏋勫缓澶辫触锛岃 traffic-audit-web/build_prod.log")
+ dist = os.path.join(WEB, "dist")
+ if not os.path.isfile(os.path.join(dist, "index.html")):
+ raise SystemExit("鏈壘鍒� dist/index.html锛岃鍏堟瀯寤哄墠绔�")
+
+ print("[2/6] 鎶� dist 鍐呭祵杩涘悗绔� static 骞舵墦 jar ...")
+ copied = []
+ try:
+ rmtree_force(STATIC)
+ shutil.copytree(dist, STATIC)
+ for r, d, fs in os.walk(STATIC):
+ for f in fs:
+ copied.append(os.path.join(r, f))
+ rc = run('cmd /c "mvn.cmd -o -q clean package -DskipTests -f traffic-audit-server\\pom.xml"',
+ ROOT, os.path.join(ROOT, "package_build.log"))
+ if rc != 0:
+ print(" 绂荤嚎鎵撳寘澶辫触锛屾敼涓鸿仈缃戞墦鍖� ...")
+ rc = run('cmd /c "mvn.cmd -q clean package -DskipTests -f traffic-audit-server\\pom.xml"',
+ ROOT, os.path.join(ROOT, "package_build.log"))
+ if rc != 0:
+ raise SystemExit("鍚庣鎵撳寘澶辫触锛岃 package_build.log")
+ finally:
+ rmtree_force(STATIC)
+ os.makedirs(STATIC, exist_ok=True)
+ jar = os.path.join(SERVER, "target", JAR_NAME)
+ if not os.path.isfile(jar):
+ raise SystemExit("鏈壘鍒� jar: " + jar)
+ print(" jar=%.1f MB" % (os.path.getsize(jar) / 1048576.0))
+
+ print("[3/6] 缁勮閮ㄧ讲鐩綍 %s ..." % STAGE)
+ rmtree_force(STAGE)
+ be = os.path.join(STAGE, "backend")
+ fe = os.path.join(STAGE, "frontend")
+ db = os.path.join(STAGE, "db")
+ for d in (be, fe, db):
+ os.makedirs(d)
+ shutil.copy2(jar, os.path.join(be, JAR_NAME))
+ rmtree_force(os.path.join(be, "docs"))
+ dst_docs = os.path.join(be, "docs")
+ os.makedirs(dst_docs)
+ for name in os.listdir(os.path.join(ROOT, "docs")):
+ if name in SKIP_DOC_DIRS:
+ continue
+ src = os.path.join(ROOT, "docs", name)
+ dst = os.path.join(dst_docs, name)
+ if os.path.isdir(src):
+ shutil.copytree(src, dst, ignore=shutil.ignore_patterns("杈撳嚭"))
+ else:
+ shutil.copy2(src, dst)
+ shutil.copytree(dist, os.path.join(fe, "dist"))
+ for s in ("init.sql", "sql_city_bus.sql", "sql_city_taxi.sql", "sql_wyc.sql"):
+ shutil.copy2(os.path.join(ROOT, "docs", s), os.path.join(db, s))
+
+ print("[4/6] 鍐欏叆閰嶇疆涓庡惎鍔ㄨ剼鏈� ...")
+ io.open(os.path.join(be, "application.yml"), "w", encoding="utf-8", newline="\r\n").write(APPLICATION_YML)
+ io.open(os.path.join(be, "start-backend.cmd"), "w", encoding="utf-8", newline="\r\n").write(START_CMD)
+ io.open(os.path.join(be, "start-backend.sh"), "w", encoding="utf-8", newline="\n").write(START_SH)
+ io.open(os.path.join(STAGE, "frontend", "nginx.conf.example"), "w", encoding="utf-8", newline="\n").write(NGINX)
+ io.open(os.path.join(STAGE, "README-閮ㄧ讲璇存槑.txt"), "w", encoding="utf-8", newline="\r\n").write(README)
+
+ print("[5/6] 鎵� zip ...")
+ if os.path.isfile(ZIP):
+ os.remove(ZIP)
+ n = 0
+ with zipfile.ZipFile(ZIP, "w", zipfile.ZIP_DEFLATED, compresslevel=6) as z:
+ for r, d, fs in os.walk(STAGE):
+ for f in fs:
+ full = os.path.join(r, f)
+ z.write(full, os.path.relpath(full, STAGE))
+ n += 1
+ print("[6/6] 瀹屾垚锛�%s (%.1f MB, %d 涓枃浠�)" % (ZIP, os.path.getsize(ZIP) / 1048576.0, n))
+
+APPLICATION_YML = u"""# ============================================================
+# TrafficAudit 鍚庣澶栭儴閰嶇疆锛堜笌 jar 鍚岀骇鍗冲彲鐢熸晥锛屼紭鍏堢骇楂樹簬 jar 鍐呯疆閰嶇疆锛�
+# 閮ㄧ讲鍒版柊鏈哄櫒鍚庯紝璇�**鑷冲皯**淇敼涓嬮潰鏍囨敞 TODO 鐨勪笁澶勬暟鎹簱閰嶇疆锛�
+# ============================================================
+server:
+ port: 8090
+app:
+ captcha:
+ required: false # 鐢熶骇鐜濡傞渶鍥惧舰楠岃瘉鐮侊紝鏀逛负 true
+spring:
+ datasource:
+ url: jdbc:mysql://127.0.0.1:3306/traffic_audit?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
+ username: root # TODO 鏀规垚浣犵殑 MySQL 璐﹀彿
+ password: 璇锋敼鎴愪綘鐨勬暟鎹簱瀵嗙爜 # TODO 鏀规垚浣犵殑 MySQL 瀵嗙爜
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ servlet:
+ multipart:
+ max-file-size: 100MB
+ max-request-size: 100MB
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: Asia/Shanghai
+mybatis-plus:
+ mapper-locations: classpath*:/mapper/**/*.xml
+ type-aliases-package: com.trafficaudit
+ configuration:
+ map-underscore-to-camel-case: true
+ global-config:
+ db-config:
+ id-type: auto
+ logic-delete-field: deleted
+ logic-delete-value: 1
+ logic-not-delete-value: 0
+jwt:
+ # 蹇呴』鏄�孊ase64 鍚堟硶瀛楃 + 闀垮害鏄� 4 鐨勫�嶆暟銆嶏紱涓嬮潰杩欎覆 32 浣嶅崄鍏繘鍒跺彲鐩存帴鐢紝
+ # 鐢熶骇鐜寤鸿鎹㈡垚鑷繁鐨勯殢鏈轰覆锛堝~涓枃鎴栦笉鍚堟硶瀛楃浼氬鑷寸櫥褰� 500锛�
+ secret: 8f2c1d64a7b34e09c5d81f6a2b0e7c93
+ expiration: 86400000
+docs:
+ template-root: docs
+city-passenger:
+ template-dir: docs/鍩庡競瀹㈣繍
+passenger:
+ template-dir: docs/鍏矾鏃呭
+freight:
+ template-dir: docs/璐ц繍
+energy:
+ template-dir: docs/鑳借��
+investment:
+ template-dir: docs/鎶曡祫/妯℃澘
+summary:
+ template-dir: docs/鐢熸垚姹囨�诲ぇ琛� # 姹囨�诲ぇ琛ㄦ瘝鐗堜笌鐗堝紡鍙傜収浠舵墍鍦ㄧ洰褰曪紙蹇呴渶锛�
+deepseek:
+ api-key: "" # AI 鍒嗘瀽鐢紱鐣欑┖鍒� AI 鍒嗘瀽涓嶅彲鐢�
+ api-url: https://api.deepseek.com/v1/chat/completions
+ model: deepseek-chat
+"""
+
+START_CMD = u"""@echo off
+chcp 65001 >nul
+cd /d %~dp0
+where java >nul 2>nul
+if errorlevel 1 (
+ echo [ERROR] 鏈壘鍒� java锛岃鍏堝畨瑁� JDK 8 骞跺姞鍏� PATH
+ pause
+ exit /b 1
+)
+echo ============================================
+echo TrafficAudit 鍚姩涓細http://localhost:8090
+echo 鍓嶇宸插唴宓岋紝鐩存帴璁块棶 8090 鍗冲彲锛堜笉闇�瑕� nginx锛�
+echo 鏃ュ織鏄剧ず鍦ㄦ湰绐楀彛锛屽叧闂獥鍙e嵆鍋滄鏈嶅姟
+echo ============================================
+java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar
+pause
+"""
+
+START_SH = u"""#!/bin/sh
+cd "$(dirname "$0")" || exit 1
+echo "TrafficAudit 鍚姩涓細http://localhost:8090 锛圕trl+C 鍋滄锛�"
+java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar 2>&1 | tee app.log
+"""
+
+NGINX = u"""# 鍓嶇 nginx 閰嶇疆绀轰緥锛堝彧鏈夊湪涓嶆兂鐢ㄣ�宩ar 鍐呭祵鍓嶇銆嶆椂鎵嶉渶瑕侊級
+server {
+ listen 8080;
+ server_name localhost;
+ root /opt/traffic-audit/frontend/dist; # 鏀规垚瀹為檯璺緞
+ index index.html;
+ location /api/ {
+ proxy_pass http://127.0.0.1:8090;
+ 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_read_timeout 300s;
+ }
+ location / { try_files $uri $uri/ /index.html; }
+}
+"""
+
+README = u"""TrafficAudit 浜ら�氳揣杩愮粺璁″鏍哥郴缁� 鈥斺�� 閮ㄧ讲鍖咃紙{stamp}锛�
+========================================================
+
+銆愮洰褰曠粨鏋勩��
+ backend/
+ traffic-audit-server-1.0.0-SNAPSHOT.jar 鍚庣绋嬪簭锛堝惈鍏ㄩ儴渚濊禆锛�**宸插唴宓屽墠绔�**锛�
+ docs/ 鎶ヨ〃妯℃澘涓庤繍琛屾暟鎹洰褰曪紙蹇呴渶锛屽嬁鍒狅級
+ application.yml 澶栭儴閰嶇疆锛堟敼杩欓噷鍗冲彲锛屾棤闇�閲嶆柊鎵撳寘锛�
+ start-backend.cmd / start-backend.sh 鍚姩鑴氭湰
+ frontend/
+ dist/ 鍓嶇鏋勫缓浜х墿锛堝鐢細鎯崇敤 nginx 鎵樼鏃剁敤锛�
+ nginx.conf.example nginx 閰嶇疆绀轰緥
+ db/
+ init.sql 寤哄簱寤鸿〃 + 棰勭疆璐﹀彿锛堝繀椤绘墽琛岋級
+ sql_city_bus.sql 鍩庡競瀹㈣繍-鍏氦鏈堝害琛紙蹇呴』鎵ц锛�
+ sql_city_taxi.sql 鍩庡競瀹㈣繍-鍑虹鏈堝害琛�/鍑虹鎺堟潈琛紙蹇呴』鎵ц锛�
+ sql_wyc.sql 缃戠害杞﹀叏鐪佹�婚噺琛�/璁㈠崟鍒嗗競宸炶〃锛堝繀椤绘墽琛岋級
+ README-閮ㄧ讲璇存槑.txt
+
+銆愰儴缃叉満鐜瑕佹眰銆�
+ JDK 8锛堝繀闇�锛�
+ MySQL 5.7 / 8.0锛堝繀闇�锛�
+ **涓嶉渶瑕� Redis**锛堜唬鐮佹湭浣跨敤锛涙棫鐗堣鏄庨噷鐨� Redis 鏄仐鐣欓厤缃紝鍙拷鐣ワ級
+ **涓嶉渶瑕� nginx**锛堝墠绔凡鍐呭祵杩� jar锛岃闂� 8090 鍗冲彲锛沶ginx 浠呬负澶囬�夋柟妗堬級
+
+銆愰儴缃叉楠ゃ��
+ 1. 鍒濆鍖栨暟鎹簱锛�4 涓剼鏈兘瑕佹墽琛岋紝椤哄簭濡備笅锛�
+ mysql --default-character-set=utf8mb4 -u root -p < db/init.sql
+ mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_city_bus.sql
+ mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_city_taxi.sql
+ mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_wyc.sql
+ 棰勭疆璐﹀彿锛歛dmin / admin123锛堥娆$櫥褰曞悗璇锋敼瀵嗙爜锛�
+
+ 2. 鏀归厤缃� backend/application.yml
+ - spring.datasource.url / username / password 锛氭敼鎴愰儴缃叉満鐨� MySQL锛堥粯璁ょ鍙� 3306锛�
+ - jwt.secret 锛氭敼鎴愪竴涓查殢鏈哄瓧绗︿覆锛�**蹇呴』鏄� Base64 鍚堟硶瀛楃涓旈暱搴︽槸 4 鐨勫�嶆暟**锛屽 32 浣嶅崄鍏繘鍒讹紱濉腑鏂囦細鐧诲綍澶辫触锛�
+ - deepseek.api-key 锛氶渶瑕� AI 鍒嗘瀽鏃跺~锛屼笉闇�瑕佸彲鐣欑┖
+ 娉細application.yml 涓� jar 鍚岀骇鍗崇敓鏁堬紝涓嶇敤閲嶆柊鎵撳寘銆�
+
+ 3. 鍚姩鍚庣锛堝湪 backend 鐩綍涓嬶級
+ Windows锛氬弻鍑� start-backend.cmd
+ Linux锛� sh start-backend.sh
+ 鎴愬姛鏍囧織锛氬嚭鐜� "Started TrafficAuditApplication" 涓� "Tomcat started on port(s): 8090"
+
+ 4. 璁块棶绯荤粺
+ 娴忚鍣ㄦ墦寮� http://<閮ㄧ讲鏈篒P>:8090 锛堝墠绔凡鍐呭祵锛岄〉闈笌鎺ュ彛鍚屾簮锛�
+ 璐﹀彿锛歛dmin / admin123
+
+銆愭暟鎹縼绉伙紙鍙�夛級銆�
+ 鎯虫妸鏈満鏁版嵁涓�骞舵惉鍒版柊鏈哄櫒锛岀敤 mysqldump锛堟湰鏈� MySQL 鑻ヤ笉鍦� 3306锛屾寜瀹為檯绔彛鏀癸級锛�
+ mysqldump -h 127.0.0.1 -P 3306 -u root -p --databases traffic_audit > traffic_audit_full.sql
+ 鍐嶅湪鏂版満鍣ㄦ墽琛岋細
+ mysql -u root -p < traffic_audit_full.sql
+ 娉ㄦ剰锛氬叏閲� dump 浼氬甫涓婃湰鏈虹殑璐﹀彿瀵嗙爜锛岃鐩� init.sql 棰勭疆鐨� admin 璐﹀彿銆�
+
+銆愬父瑙侀棶棰樸��
+ 1. 鍚姩鎶ャ�屾湭鎵惧埌鏁版嵁鐩綍 docs銆�/ 瀵煎嚭鎶ャ�屾湭鎵惧埌妯℃澘鏂囦欢銆嶏細
+ 蹇呴』鍦� backend 鐩綍涓嬪惎鍔紙jar 涓� docs 鍚岀骇锛夛紝涓嶈鍙嫹 jar銆�
+ 2. 鎶ヨ〃瀵煎嚭鎶ャ�屾湭鎵惧埌姹囨�昏〃姣嶇増銆奩YYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx銆嬨�嶏細
+ docs/鐢熸垚姹囨�诲ぇ琛� 涓嬬己灏戣鏈堜唤姣嶇増锛涙妸婧愭満鍣ㄧ殑璇ユ枃浠舵嫹杩囧幓銆�
+ 3. 8090 绔彛琚崰鐢細鏀� application.yml 鐨� server.port 鍚庨噸鍚��
+ 4. 椤甸潰鎵撳紑鏄┖鐧斤細纭璁块棶鐨勬槸 http://<IP>:8090 鏍硅矾寰勶紝涓旀祻瑙堝櫒寮哄埗鍒锋柊锛圕trl+F5锛夈��
+ 5. 涓婁紶澶ф枃浠跺け璐ワ細鍚庣闄愬埗 100MB锛屽凡閰嶇疆锛涘鍓嶉潰杩樻寕浜� nginx锛岄渶鍚屾鏀惧ぇ client_max_body_size銆�
+
+銆愬仠姝㈡湇鍔°��
+ Windows锛氬叧闂� start-backend.cmd 绐楀彛
+ Linux锛� Ctrl+C锛屾垨 kill 瀵瑰簲 java 杩涚▼锛坧s -ef | grep java锛�
+"""
+
+if __name__ == "__main__":
+ main()
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/security/utils/JwtUtils.java b/traffic-audit-server/src/main/java/com/trafficaudit/security/utils/JwtUtils.java
index 1b8baa2..214ca79 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/security/utils/JwtUtils.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/security/utils/JwtUtils.java
@@ -3,9 +3,13 @@
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.impl.TextCodec;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
+import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@@ -13,11 +17,27 @@
@Component
public class JwtUtils {
+ private static final Logger log = LoggerFactory.getLogger(JwtUtils.class);
+
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
+
+ /**
+ * 绛惧悕瀵嗛挜瀛楄妭锛歫jwt 0.9.x 榛樿鎶� secret 褰� Base64 瑙g爜锛岃嫢閰嶇疆鎴愪腑鏂囩瓑闈炴硶 Base64 浼氬湪鐧诲綍鏃舵姏
+ * ArrayIndexOutOfBoundsException锛岃〃鐜颁负銆岀櫥褰曟帴鍙� 500銆嶃�傝繖閲屽仛鍏滃簳锛氳兘鎸� Base64 瑙g爜灏辩敤瑙g爜缁撴灉
+ * 锛堜笌鍘嗗彶 token 鍏煎锛夛紝鍚﹀垯鎸� UTF-8 瀛楄妭澶勭悊锛屽苟鎶婃彁绀烘墦鍒版棩蹇楅噷銆�
+ */
+ private byte[] secretKeyBytes() {
+ try {
+ return TextCodec.BASE64.decode(secret);
+ } catch (Exception e) {
+ log.warn("jwt.secret 涓嶆槸鍚堟硶鐨� Base64 瀛楃涓诧紝宸叉寜 UTF-8 瀛楄妭浣滀负绛惧悕瀵嗛挜锛涘缓璁敼鎴� 32 浣嶉殢鏈哄崄鍏繘鍒朵覆銆�");
+ return secret.getBytes(StandardCharsets.UTF_8);
+ }
+ }
public String generateToken(String username) {
Map<String, Object> claims = new HashMap<>();
@@ -27,19 +47,19 @@
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration))
- .signWith(SignatureAlgorithm.HS256, secret)
+ .signWith(SignatureAlgorithm.HS256, secretKeyBytes())
.compact();
}
public String getUsernameFromToken(String token) {
- Claims claims = Jwts.parser().setSigningKey(secret)
+ Claims claims = Jwts.parser().setSigningKey(secretKeyBytes())
.parseClaimsJws(token).getBody();
return claims.getSubject();
}
public boolean validateToken(String token) {
try {
- Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
+ Jwts.parser().setSigningKey(secretKeyBytes()).parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
--
Gitblit v1.9.1