From 89495b99f06cd9d897105759924d7b73ae907b44 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期六, 03 十月 2026 11:46:07 +0800
Subject: [PATCH] fix(部署): pack-deploy 补齐外置配置/启动脚本/docs/web 并修正模板端口(8090)

---
 HANDOFF.md                                                      |    9 +
 deploy-templates/README-部署说明.txt                                |    4 
 traffic-audit-server/src/main/resources/application.yml.example |    7 
 docs/打包部署说明.md                                                  |   10 +
 deploy-templates/backend/start-backend.sh                       |    6 +
 pack-deploy.ps1                                                 |  136 +++++++++++++++++++++------
 deploy-templates/backend/application.yml                        |    8 +
 deploy-templates/backend/start-backend.cmd                      |   10 ++
 deploy-templates/jar-application.yml                            |   94 ++++++++++++++++++
 9 files changed, 246 insertions(+), 38 deletions(-)

diff --git a/HANDOFF.md b/HANDOFF.md
index db8ab7d..a6b9243 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -6,6 +6,15 @@
 
 ## 鏈�鏂帮紙2026-10-03锛�
 
+### 琛ュ厖锛�10-03 涓嬪崍锛夛細鏈嶅姟鍣ㄩ儴缃叉姤 鈥淎ccess denied ... (using password: NO)鈥� 鈥斺�� 鏍瑰洜涓庝慨澶�
+- **鐜拌薄**锛氭妸 `deploy/traffic-audit-release-20261002/` 閮ㄧ讲鍒� `61.183.254.94` 鍚庯紝鍚庣鍚姩鎶� `java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)`銆�
+- **鏍瑰洜**锛歫ar 鍐呯疆閰嶇疆閲屽簱鍙d护鏄崰浣嶇 `${TRAFFIC_DB_PASSWORD:}`锛堥粯璁ょ┖涓诧級锛岃�� 10-02 閭d釜鍖�**鍙惈 jar + web + dist**锛屾病鏈夊缃� `application.yml`銆佹病鏈� `docs/`銆乣db/`銆佸惎鍔ㄨ剼鏈�傞儴缃叉満娌℃湁浠讳綍澶栭儴閰嶇疆瑕嗙洊锛孲pring 灏辨嬁绌哄瘑鐮佽繛鏈満 MySQL 鈫� `using password: NO`锛堟敞鎰忥細杩欐槸鈥滄湯浼犲瘑鐮佲�濓紝涓嶆槸瀵嗙爜閿欙級銆�
+- **鏈嶅姟鍣ㄤ晶涓�姝ヤ慨澶嶏紙鏃犻渶閲嶆墦鍖咃級**锛氬湪 jar 鍚岀骇鏀� `application.yml`锛屾妸 `spring.datasource.url/username/password` 鏀规垚鐜板満鐪熷疄鍊煎悗閲嶅惎鍗冲彲锛涗篃鍙敤鐜鍙橀噺 `TRAFFIC_DB_PASSWORD` 浠f浛銆傚惎鍔ㄨ剼鏈凡鍔犻妫�鎻愰啋锛堢己 `application.yml` / password 浠嶆槸鍗犱綅鏂囧瓧閮戒細 WARN锛夈�備慨澶嶅悗鑻ユ姤鈥滄湭鎵惧埌鏁版嵁鐩綍 docs鈥濆垯璇存槑鍖呭唴缂� `backend/docs`锛屼粠鏂板寘鎴栨簮鏈哄櫒鎷枫��
+- **鎵撳寘宸ュ叿宸蹭慨锛堝師 鈥滄墦鍖呭伐鍏峰緟淇�� 涓ら」鍧囧凡钀藉疄锛�**锛歚pack-deploy.ps1` 閲嶅啓涓轰簲姝ワ細鈶� 鐢ㄦ柊澧炴ā鏉� `deploy-templates/jar-application.yml`锛�**鍏ㄥ崰浣嶇**锛変复鏃舵浛鎹㈡簮鐮侀厤缃悗 `mvn clean package`锛屾棤璁烘垚璐ラ兘杩樺師鐪熷疄閰嶇疆锛涒憽 瑙e帇 jar 鍘诲瘑鑷锛涒憿 鍓嶇鏋勫缓锛涒懀 缁勮**瀹屾暣鍖�**锛歚backend/{jar, application.yml, start-backend.cmd/.sh, docs/, web/}` + `frontend/dist` + `db/*.sql` + README锛坄backend/web` 浠� dist 鑷姩鍚屾锛岄�愭枃浠朵竴鑷达級锛涒懁 鏁村寘鏄庢枃瀵嗛挜鎵弿銆傛柊澧� `-SkipBackend` 鍙鐢ㄧ幇鏈� jar 蹇�熼噸缁勫寘銆�
+- **妯℃澘鍚屾淇**锛歚deploy-templates/backend/application.yml` 鐨� `server.port` 鐢� 8080 鏀瑰洖 8090锛堝師鍊间細瀵艰嚧鍚庣璧峰湪 8080锛夈�佽ˉ `static-locations: file:./web/` 涓� password 闄烽槺娉ㄩ噴锛沗README-閮ㄧ讲璇存槑.txt` 甯歌闂鏂板璇ユ姤閿欏缃紱`docs/鎵撳寘閮ㄧ讲璇存槑.md` 鎺掗敊琛ㄦ柊澧炶琛岋紱`application.yml.example` 鐜鍙橀噺鍚嶇粺涓�涓� `TRAFFIC_DB_USER/TRAFFIC_DB_PASSWORD/TRAFFIC_JWT_SECRET`锛堝師鏉ヨ鐢� `MYSQL_PASSWORD`/`JWT_SECRET`锛屼笌 `start-dev.ps1` 涓嶄竴鑷达級銆�
+- **鏂板寘锛堟湰鍦帮紝涓嶅叆搴擄級**锛歚deploy/traffic-audit-deploy-20261003/`锛�388 鏂囦欢 / 93.07 MB锛寊ip 76.37 MB锛夛紝宸查獙璇侊細jar 鍐呯疆閰嶇疆鍏ㄥ崰浣嶇锛堝幓瀵嗚嚜妫�閫氳繃锛夈�乣backend/web` 涓� `frontend/dist` 閫愭枃浠朵竴鑷达紙鍚� 44 涓級銆乣backend/docs/鐢熸垚姹囨�诲ぇ琛╜ 姣嶇増瀛樺湪銆乣鍔熻兘娴嬭瘯鎶ュ憡/宸ヤ綔鏃ョ粨/闂姹囨��/_cache` 宸叉帓闄ゃ��
+- **韪╁潙锛堥噸瑕侊級**锛氭湰鏈� PowerShell 5.1 鎶婃棤 BOM 鐨� `.ps1` 褰� ANSI 璇伙紝涓枃娉ㄩ噴浼氬彉鎴愪贡鐮佸苟瀵艰嚧鑴氭湰瑙f瀽澶辫触銆俙pack-deploy.ps1` 蹇呴』淇濆瓨涓� **UTF-8 with BOM**锛堜粨搴撳叾浠� `*.ps1` 涔熼兘鏄� BOM锛夛紱鎺掓煡涓浘瀹為檯韪╁埌銆�
+
 - **杩愯鐘舵�侊紙鍐欎氦鎺ユ椂锛�**锛氬悗绔� 8090銆佸墠绔� 8080 鍧囨湭鐩戝惉锛涙柊瀵硅瘽濡傜户缁紑鍙戞垨娴嬭瘯锛屽厛鎵ц `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1`銆傛暟鎹簱浠嶄负 `127.0.0.1:3305/traffic_audit`锛孧ySQL 鏈嶅姟鏈仠銆�
 - **鍙戝竷鏋勫缓锛堝凡瀹屾垚锛�**锛氬簲鈥滃彂甯冪紪璇戔�濊姹傦紝宸插畬鎴愬悗绔� `mvn clean package -DskipTests` 鍜屽墠绔� `npm run build`銆俲ar 鍐呭凡鍋氬幓瀵嗚嚜妫�锛屽彧淇濈暀鐜鍙橀噺鍗犱綅绗︼紱鏋勫缓鍚庢湰鏈虹湡瀹� `src/main/resources/application.yml` 宸插師鏍锋仮澶嶃��
 - **鍙戝竷浜х墿锛堟湰鍦帮紝鏈叆搴擄級**锛�
diff --git "a/deploy-templates/README-\351\203\250\347\275\262\350\257\264\346\230\216.txt" "b/deploy-templates/README-\351\203\250\347\275\262\350\257\264\346\230\216.txt"
index df4d115..942ac50 100644
--- "a/deploy-templates/README-\351\203\250\347\275\262\350\257\264\346\230\216.txt"
+++ "b/deploy-templates/README-\351\203\250\347\275\262\350\257\264\346\230\216.txt"
@@ -58,6 +58,10 @@
   娉ㄦ剰锛氬叏閲� dump 浼氬甫涓婃湰鏈虹殑璐﹀彿瀵嗙爜锛岃鐩� init.sql 棰勭疆鐨� admin 璐﹀彿銆�
 
 銆愬父瑙侀棶棰樸��
+  0. 鍚姩鎶� java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)锛�
+     鈥渦sing password: NO鈥� = 鍚庣鎷垮埌鐨勬暟鎹簱瀵嗙爜鏄┖涓诧紙涓嶆槸瀵嗙爜閿欙級銆�
+     妫�鏌� backend/application.yml 鏄惁涓� jar 鍚岀骇涓� spring.datasource.password 宸插~鐪熷疄瀵嗙爜锛�
+     鑻ユ湭鏀� application.yml锛屼篃鍙敤鐜鍙橀噺 TRAFFIC_DB_PASSWORD 浠f浛銆傛敼瀹岄噸鍚嵆鍙紝鏃犻渶閲嶆柊鎵撳寘銆�
   1. 鍚姩鎶ャ�屾湭鎵惧埌鏁版嵁鐩綍 docs銆�/ 瀵煎嚭鎶ャ�屾湭鎵惧埌妯℃澘鏂囦欢銆嶏細
      蹇呴』鍦� backend 鐩綍涓嬪惎鍔紙jar 涓� docs 鍚岀骇锛夛紝涓嶈鍙嫹 jar銆�
   2. 鎶ヨ〃瀵煎嚭鎶ャ�屾湭鎵惧埌姹囨�昏〃姣嶇増銆奩YYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx銆嬨�嶏細
diff --git a/deploy-templates/backend/application.yml b/deploy-templates/backend/application.yml
index 7cf2f24..ace265a 100644
--- a/deploy-templates/backend/application.yml
+++ b/deploy-templates/backend/application.yml
@@ -3,15 +3,19 @@
 # 閮ㄧ讲鍒版柊鏈哄櫒鍚庯紝璇�**鑷冲皯**淇敼涓嬮潰鏍囨敞 TODO 鐨勪笁澶勬暟鎹簱閰嶇疆锛�
 # ============================================================
 server:
-  port: 8080
+  port: 8090            # 鍗曠鍙fā寮忥細鍚庣 8090 鍚屾椂鎵樼鍓嶇椤甸潰锛堜笉瑕佹敼鎴� 8080锛�
 app:
   captcha:
     required: false        # 鐢熶骇鐜濡傞渶鍥惧舰楠岃瘉鐮侊紝鏀逛负 true
 spring:
+  web:
+    resources:
+      # 鍗曠鍙fā寮忥細浼樺厛璇诲彇 jar 鍚岀骇 web\ 鐩綍锛堟墦鍖呮椂鐢卞墠绔� dist 鑷姩鐢熸垚锛�
+      static-locations: file:./web/,classpath:/static/
   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 瀵嗙爜
+    password: 璇锋敼鎴愪綘鐨勬暟鎹簱瀵嗙爜      # TODO 鏀规垚浣犵殑 MySQL 瀵嗙爜锛涚暀绌轰細鎶� Access denied ... (using password: NO)
     driver-class-name: com.mysql.cj.jdbc.Driver
   servlet:
     multipart:
diff --git a/deploy-templates/backend/start-backend.cmd b/deploy-templates/backend/start-backend.cmd
index a95e5c3..5ddb279 100644
--- a/deploy-templates/backend/start-backend.cmd
+++ b/deploy-templates/backend/start-backend.cmd
@@ -7,6 +7,16 @@
   pause
   exit /b 1
 )
+if not exist "%~dp0application.yml" (
+  echo [WARN] 鏈壘鍒� %~dp0application.yml
+  echo        娌℃湁澶栫疆閰嶇疆鏃讹紝jar 鍐呯疆瀵嗙爜鍗犱綅绗︿細瑙f瀽涓虹┖锛�
+  echo        鍚姩灏嗘姤 java.sql.SQLException: Access denied ... ^(using password: NO^)
+)
+findstr /C:"璇锋敼鎴愪綘鐨勬暟鎹簱瀵嗙爜" "%~dp0application.yml" >nul 2>nul
+if not errorlevel 1 (
+  echo [WARN] application.yml 閲� spring.datasource.password 杩樻槸鍗犱綅鏂囧瓧锛�
+  echo        璇峰厛鏀规垚閮ㄧ讲鏈虹湡瀹炵殑 MySQL 瀵嗙爜鍐嶅惎鍔ㄣ��
+)
 echo ============================================
 echo  TrafficAudit 鍚姩涓細http://localhost:8090
 echo  鍓嶇宸插唴宓岋紝鐩存帴璁块棶 8090 鍗冲彲锛堜笉闇�瑕� nginx锛�
diff --git a/deploy-templates/backend/start-backend.sh b/deploy-templates/backend/start-backend.sh
index 0d84961..6d2dd7f 100644
--- a/deploy-templates/backend/start-backend.sh
+++ b/deploy-templates/backend/start-backend.sh
@@ -1,4 +1,10 @@
 #!/bin/sh
 cd "$(dirname "$0")" || exit 1
+if [ ! -f application.yml ]; then
+  echo "[WARN] 鏈壘鍒� application.yml锛坖ar 鍚岀骇锛夛細鏁版嵁搴撳瘑鐮佷細瑙f瀽涓虹┖锛屽彲鑳芥姤 Access denied ... (using password: NO)"
+fi
+if grep -q "璇锋敼鎴愪綘鐨勬暟鎹簱瀵嗙爜" application.yml 2>/dev/null; then
+  echo "[WARN] application.yml 閲� spring.datasource.password 杩樻槸鍗犱綅鏂囧瓧锛岃鍏堟敼鎴愮湡瀹� MySQL 瀵嗙爜"
+fi
 echo "TrafficAudit 鍚姩涓細http://localhost:8090 锛圕trl+C 鍋滄锛�"
 java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar 2>&1 | tee app.log
diff --git a/deploy-templates/jar-application.yml b/deploy-templates/jar-application.yml
new file mode 100644
index 0000000..9bfc876
--- /dev/null
+++ b/deploy-templates/jar-application.yml
@@ -0,0 +1,94 @@
+# ============================================================
+# 鎵撳寘鐢ㄣ�岃繘 jar 鐨勯粯璁ら厤缃�嶁�斺�斿彧鍏佽鍗犱綅绗︼紝绂佹鐪熷疄瀵嗛挜/鍙d护锛�
+#
+# pack-deploy.ps1 鏋勫缓鍓嶄細鐢ㄦ湰鏂囦欢涓存椂鏇挎崲
+#   traffic-audit-server/src/main/resources/application.yml
+# 鏋勫缓瀹屾垚锛堝惈鍘诲瘑鑷锛夊悗鑷姩杩樺師寮�鍙戞満鐨勭湡瀹為厤缃��
+#
+# 閮ㄧ讲鏈虹湡瀹炲�肩敱涓嬮潰涓ょ鏂瑰紡瑕嗙洊锛屼紭鍏堢骇 鐜鍙橀噺 > jar 鍚岀骇 application.yml > 鏈枃浠讹細
+#   1) jar 鍚岀骇锛堝惎鍔ㄥ伐浣滅洰褰曪級鏀� application.yml锛岃 deploy-templates/backend/application.yml
+#   2) 鐜鍙橀噺 TRAFFIC_DB_URL / TRAFFIC_DB_USER / TRAFFIC_DB_PASSWORD /
+#      TRAFFIC_JWT_SECRET / DEEPSEEK_API_KEY
+#
+# 娉ㄦ剰锛歱assword 榛樿鍊间负绌轰覆锛岃嫢閮ㄧ讲鏈烘棦娌℃湁澶栫疆 application.yml 涔熸病璁�
+# TRAFFIC_DB_PASSWORD锛屽惎鍔ㄤ細鎶� java.sql.SQLException: Access denied ... (using password: NO)
+# ============================================================
+server:
+  port: 8090
+  tomcat:
+    basedir: .
+    threads:
+      max: 500
+    accesslog:
+      enabled: true
+      directory: logs
+      prefix: access
+      suffix: .log
+      pattern: '%h %l %u %t "%r" %s %b %D'
+
+spring:
+  web:
+    resources:
+      static-locations: file:./web/,classpath:/static/
+  datasource:
+    url: ${TRAFFIC_DB_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: ${TRAFFIC_DB_USER:root}
+    password: ${TRAFFIC_DB_PASSWORD:}
+    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
+    # 鏄惧紡鎸囧畾 Slf4j锛歁yBatis-Plus 榛樿 StdOutImpl 浼氭妸鏁磋鏁版嵁锛堝惈浼佷笟鍚�/鐢佃瘽锛夋墦杩涙棩蹇�
+    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
+  global-config:
+    db-config:
+      id-type: auto
+      logic-delete-field: deleted
+      logic-delete-value: 1
+      logic-not-delete-value: 0
+
+jwt:
+  secret: ${TRAFFIC_JWT_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: ${DEEPSEEK_API_KEY:}
+  api-url: https://api.deepseek.com/v1/chat/completions
+  model: deepseek-chat
+
+app:
+  cors:
+    allowed-origins: http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:*
+  captcha:
+    required: false
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 3a99c6d..4433eca 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"
@@ -209,6 +209,7 @@
 | 鐧诲綍鎺ュ彛 500 | `jwt.secret` 濉簡闈炴硶瀛楃锛堝涓枃锛夛紱鏀规垚 32 浣嶅崄鍏繘鍒朵覆 |
 | 椤甸潰鑳藉紑浣嗘帴鍙� 404 | 璧� nginx 鏂规鏃舵病閰� `/api` 鍙嶄唬锛涙敼鐢� jar 鍐呭祵璁块棶 8090 |
 | 鏁版嵁搴撹繛鎺ュけ璐� | 妫�鏌� `application.yml`锛涚‘璁� 5 涓� SQL 鑴氭湰宸叉墽琛� |
+| 鍚姩鎶� `Access denied ... (using password: NO)` | 鍚庣鎷垮埌鐨勫簱鍙d护鏄�**绌轰覆**锛歫ar 鍐呯疆 `${TRAFFIC_DB_PASSWORD:}` 鏈澶栫疆閰嶇疆瑕嗙洊銆傛妸 `backend/application.yml` 鏀惧湪 jar 鍚岀骇骞跺~ `spring.datasource.password`锛屾垨璁剧幆澧冨彉閲� `TRAFFIC_DB_PASSWORD`锛涙敼瀹岄噸鍚紝鏃犻渶閲嶆墦鍖� |
 | 绔彛鍗犵敤 | 鏀� `server.port`锛涘墠绔紑鍙戠鍙� 8080 |
 
 ## 鍗併�佸紑鍙戠幆澧冩棩甯稿惎鍔�
@@ -268,10 +269,15 @@
 ```
 
 鑴氭湰鍋氬洓浠朵簨锛�
-1. `mvn clean package -DskipTests` 鏋勫缓鍚庣 jar锛�
+1. 鐢� `deploy-templates/jar-application.yml`锛堝叏鍗犱綅绗︼級涓存椂鏇挎崲婧愮爜 `application.yml`锛屽啀 `mvn clean package -DskipTests`锛屾瀯寤哄悗鑷姩杩樺師寮�鍙戞満鐪熷疄閰嶇疆锛�
 2. **瑙e帇 jar 鑷**锛氭鏌� `BOOT-INF/classes/application.yml` 鏄惁鍏ㄤ负鍗犱綅绗︹�斺�斾竴鏃﹀彂鐜� `sk-` 鎴栨槑鏂囧彛浠�**鐩存帴涓鎵撳寘**锛�
 3. `npm run build` 閲嶅缓鍓嶇 `dist`锛�
-4. 鎸� `deploy-templates/` 缁勮瀹屾暣閮ㄧ讲鍖咃紙backend / frontend / db / README-閮ㄧ讲璇存槑.txt锛夛紝杈撳嚭鍒� `<OutRoot>\traffic-audit-deploy-<yyyyMMdd>`銆�
+4. 鎸� `deploy-templates/` 缁勮瀹屾暣閮ㄧ讲鍖咃紙backend / frontend / db / README-閮ㄧ讲璇存槑.txt锛夆�斺�擿backend/` 鍚� jar銆乣application.yml`銆佸惎鍔ㄨ剼鏈�乣docs/`銆乣web/`锛堢敱 dist 鑷姩鍚屾锛屼緵 8090 鍗曠鍙fā寮忥級锛岃緭鍑哄埌 `<OutRoot>\traffic-audit-deploy-<yyyyMMdd>`锛�
+5. 瀵圭粍瑁呭悗鐨勬暣鍖呭啀鎵竴閬嶆槑鏂囧瘑閽ャ��
+
+鍙�夊弬鏁帮細`-OutRoot` 鎸囧畾杈撳嚭鐩綍锛堥粯璁や粨搴� `deploy\`锛夈�乣-SkipFrontend` 澶嶇敤鐜版湁 dist銆乣-SkipBackend` 澶嶇敤鐜版湁 jar锛堝彧閲嶇粍鍖呫�佷笉閲嶇紪璇戯紝鐢ㄤ簬蹇�熻ˉ鍖咃級銆�
+
+> 璁板綍锛�2026-10-03锛夛細姝ゅ墠鎵嬪伐浜у嚭鐨� 10-02 鍖呭彧鏈� jar+web+dist锛岀己 `application.yml`/`docs`/`db`/鍚姩鑴氭湰锛岄儴缃叉満鍚姩鎶� `Access denied ... (using password: NO)`銆傜幇宸茬敱鑴氭湰鑷姩琛ラ綈杩欎簺鏂囦欢骞跺湪鎵撳寘鍓嶆浛鎹㈠崰浣嶇閰嶇疆銆�
 
 妯℃澘浠剁粺涓�鏀惧湪 **`deploy-templates/`**锛堝凡鍏ュ簱锛夛細澶栭儴 `application.yml`銆乣start-backend.cmd/.sh`銆乣nginx.conf.example`銆乣db\{init.sql,sql_city_bus,sql_city_taxi,sql_wyc}.sql`銆乣README-閮ㄧ讲璇存槑.txt`銆傛敼妯℃澘鍗虫敼鎵撳寘浜х墿銆�
 
diff --git a/pack-deploy.ps1 b/pack-deploy.ps1
index 5b5631c..1e31977 100644
--- a/pack-deploy.ps1
+++ b/pack-deploy.ps1
@@ -1,34 +1,75 @@
 锘�<#
-  涓�閿墦鍖呴儴缃插寘锛堝惈"鍘诲瘑鑷"锛夆�斺�� 2026-09-27 鏂板
+  涓�閿墦鍖呴儴缃插寘锛堝惈"鍘诲瘑鑷"锛夆�斺�� 2026-09-27 鏂板锛�2026-10-03 淇
   鐢ㄦ硶锛�
     powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1
     powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1 -OutRoot "E:\璇曢獙" -SkipFrontend
-  鍋氬洓浠朵簨锛�
-    1) mvn clean package 鏋勫缓鍚庣 jar
+
+  鍋氫簲浠朵簨锛�
+    1) 鐢� deploy-templates\jar-application.yml锛堝叏鍗犱綅绗︼級涓存椂鏇挎崲婧愮爜 application.yml锛�
+       鎵ц mvn clean package锛涙棤璁烘垚璐ラ兘杩樺師寮�鍙戞満鐪熷疄閰嶇疆
     2) 瑙e帇 jar 妫�鏌ュ唴缃� application.yml锛氬繀椤诲叏鏄崰浣嶇锛堢姝� sk- 瀵嗛挜 / 鏄庢枃鍙d护锛夛紝涓嶅悎鏍肩洿鎺ヤ腑姝�
-    3) npm run build 鏋勫缓鍓嶇 dist锛堝彲 -SkipFrontend锛�
-    4) 缁勮 deploy 鐩綍缁撴瀯锛坆ackend / frontend / db / README-閮ㄧ讲璇存槑.txt锛夛紝杈撳嚭鍒� <OutRoot>\traffic-audit-deploy-<yyyyMMdd>
+    3) npm run build 閲嶅缓鍓嶇 dist锛堝彲 -SkipFrontend锛�
+    4) 缁勮瀹屾暣閮ㄧ讲鍖咃細backend(jar + application.yml + 鍚姩鑴氭湰 + docs + web) / frontend/dist / db / README
+    5) 瀵圭粍瑁呭悗鐨勬暣鍖呭啀鎵竴閬嶆槑鏂囧瘑閽�
+
+  淇鑳屾櫙锛�2026-10-03锛夛細2026-10-02 鎵嬪伐浜у嚭鐨勫寘缂� application.yml / docs / db / 鍚姩鑴氭湰锛�
+  涓旀病鏈夋妸 dist 鍚屾鍒� backend\web锛岄儴缃叉満鍚姩鐩存帴鎶�
+  "java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)"銆�
+  鏈増鎶婁笂杩版枃浠跺叏閮ㄨˉ榻愶紝骞舵寜 jar 鍐呯疆鍗犱綅绗﹂厤缃噸鏂版瀯寤猴紝閬垮厤鍐嶆鍑虹幇銆�
 #>
 param(
-  [string]$OutRoot = 'E:\璇曢獙',
-  [switch]$SkipFrontend
+  [string]$OutRoot = '',
+  [switch]$SkipFrontend,
+  [switch]$SkipBackend      # 澶嶇敤宸插瓨鍦ㄧ殑 jar锛堜笉閲嶇紪璇戙�佷笉鍔ㄦ簮鐮侀厤缃級锛屼粎鐢ㄤ簬琛ュ叏/閲嶇粍鍙戝竷鍖�
 )
 
 $ErrorActionPreference = 'Stop'
 $root = Split-Path -Parent $MyInvocation.MyCommand.Path
-$tplDir = Join-Path $root 'deploy-templates'                  # 鎵撳寘妯℃澘浠讹紙宸插叆搴擄紝2026-09-27 璧凤級
-$jarRel = 'traffic-audit-server\target\traffic-audit-server-1.0.0-SNAPSHOT.jar'
-$jar = Join-Path $root $jarRel
+if (-not $OutRoot) { $OutRoot = Join-Path $root 'deploy' }      # 榛樿杈撳嚭鍒颁粨搴� deploy\锛堝凡 gitignore锛�
+$tplDir    = Join-Path $root 'deploy-templates'                  # 鎵撳寘妯℃澘浠讹紙宸插叆搴擄級
+$tplJarCfg = Join-Path $tplDir 'jar-application.yml'             # 杩� jar 鐨勫崰浣嶇閰嶇疆
+$srcCfg    = Join-Path $root 'traffic-audit-server\src\main\resources\application.yml'
+$jarRel    = 'traffic-audit-server\target\traffic-audit-server-1.0.0-SNAPSHOT.jar'
+$jar       = Join-Path $root $jarRel
+$webDist   = Join-Path $root 'traffic-audit-web\dist'
 
-Write-Host '[1/5] 鏋勫缓鍚庣锛坢vn clean package -DskipTests锛�...'
-Push-Location $root
-cmd /c "mvn.cmd -q clean package -DskipTests -f traffic-audit-server\pom.xml > pack-build.log 2>&1"
-$rc = $LASTEXITCODE
-Pop-Location
-if ($rc -ne 0) { throw '鍚庣鏋勫缓澶辫触锛岃瑙� pack-build.log' }
+if (-not (Test-Path $tplJarCfg)) { throw "缂哄皯鎵撳寘妯℃澘锛�$tplJarCfg" }
+
+# ---------- [1/5] 鐢ㄥ崰浣嶇閰嶇疆鏋勫缓 jar锛屾瀯寤哄悗杩樺師寮�鍙戞満鐪熷疄閰嶇疆 ----------
+if ($SkipBackend) {
+  Write-Host '[1/5] 宸叉寚瀹� -SkipBackend锛岃烦杩囧悗绔瀯寤猴紝澶嶇敤鐜版湁 jar'
+  if (-not (Test-Path $jar)) { throw "鏈壘鍒扮幇鏈� jar锛�$jar锛堝幓鎺� -SkipBackend 閲嶆柊鏋勫缓锛�" }
+} else {
+Write-Host '[1/5] 鏋勫缓鍚庣锛坢vn clean package -DskipTests锛屾瀯寤烘湡浣跨敤鍗犱綅绗﹂厤缃級...'
+$backupCfg = $null
+$hadCfg = Test-Path $srcCfg
+try {
+  if ($hadCfg) {
+    $backupCfg = [System.IO.Path]::GetTempFileName()
+    Copy-Item $srcCfg $backupCfg -Force
+  }
+  Copy-Item $tplJarCfg $srcCfg -Force
+  Push-Location $root
+  try {
+    cmd /c "mvn.cmd -q clean package -DskipTests -f traffic-audit-server\pom.xml > pack-build.log 2>&1"
+    $rc = $LASTEXITCODE
+  } finally { Pop-Location }
+  if ($rc -ne 0) { throw '鍚庣鏋勫缓澶辫触锛岃瑙� pack-build.log' }
+} finally {
+  if ($backupCfg) {
+    Copy-Item $backupCfg $srcCfg -Force
+    Remove-Item $backupCfg -Force -ErrorAction SilentlyContinue
+    Write-Host '      宸茶繕鍘熷紑鍙戞満 src\main\resources\application.yml'
+  } elseif (-not $hadCfg) {
+    Remove-Item $srcCfg -Force -ErrorAction SilentlyContinue
+    Write-Host '      娉ㄦ剰锛氭瀯寤哄墠婧愮爜鐩綍鏈潵娌℃湁 application.yml锛屽凡娓呮帀涓存椂鍗犱綅绗︽枃浠�'
+  }
+}
 if (-not (Test-Path $jar)) { throw "鏈壘鍒版瀯寤轰骇鐗╋細$jar" }
+}
 Write-Host ("      浜х墿锛歿0:N1} MB" -f ((Get-Item $jar).Length / 1MB))
 
+# ---------- [2/5] 鍘诲瘑鑷锛歫ar 鍐呯疆閰嶇疆蹇呴』鍏ㄦ槸鍗犱綅绗� ----------
 Write-Host '[2/5] 鍘诲瘑鑷锛氳В鍘� jar 妫�鏌� BOOT-INF/classes/application.yml ...'
 Add-Type -AssemblyName System.IO.Compression.FileSystem
 $zip = [System.IO.Compression.ZipFile]::OpenRead($jar)
@@ -40,29 +81,43 @@
   $sr.Close()
 } finally { $zip.Dispose() }
 
-$bad = @()
-if ($text -match 'sk-[A-Za-z0-9]{16,}') { $bad += '鐤戜技鏄庢枃 API key锛坰k-鈥︼級' }
-foreach ($line in ($text -split "`n")) {
-  if ($line -match '^\s*(password|api-key|secret)\s*:\s*(.+)$') {
-    $v = $matches[2].Trim().Trim('"')
-    if ($v -and -not $v.StartsWith('${')) { $bad += ("$($matches[1]) 涓嶆槸鍗犱綅绗�") }
+function Get-SecretHits([string]$ymlText) {
+  $hits = @()
+  if ($ymlText -match 'sk-[A-Za-z0-9]{16,}') { $hits += '鐤戜技鏄庢枃 API key(sk-...)' }
+  foreach ($line in ($ymlText -split "`n")) {
+    if ($line -match '^\s*(password|api-key|secret)\s*:\s*(.+)$') {
+      $v = $matches[2].Trim().Trim('"')
+      if ($v -and -not $v.StartsWith('${')) { $hits += ("$($matches[1]) 涓嶆槸鍗犱綅绗�") }
+    }
   }
+  return $hits
 }
+
+$bad = Get-SecretHits $text
 if ($bad.Count -gt 0) {
-  throw ('鍘诲瘑鑷鏈�氳繃锛�' + ($bad -join '锛�') + '銆傝妫�鏌� traffic-audit-server\src\main\resources\application.yml')
+  throw ('鍘诲瘑鑷鏈�氳繃锛�' + ($bad -join '锛�') + "銆傝妫�鏌� $tplJarCfg")
+}
+if ($text -notmatch 'password:\s*\$\{TRAFFIC_DB_PASSWORD') {
+  Write-Host '      璀﹀憡锛歫ar 鍐呯疆 password 涓嶆槸 TRAFFIC_DB_PASSWORD 鍗犱綅绗﹀舰寮忥紝璇风‘璁ゆā鏉裤��'
 }
 Write-Host '      閫氳繃锛歫ar 鍐呯疆閰嶇疆鍏ㄩ儴涓哄崰浣嶇锛屾棤鏄庢枃瀵嗛挜/鍙d护銆�'
 
+# ---------- [3/5] 鍓嶇鏋勫缓 ----------
 Write-Host '[3/5] 鏋勫缓鍓嶇锛坣pm run build锛屽彲 -SkipFrontend 璺宠繃锛�...'
 if (-not $SkipFrontend) {
   Push-Location (Join-Path $root 'traffic-audit-web')
-  cmd /c "npm.cmd run build > ..\pack-front.log 2>&1"
-  $rc2 = $LASTEXITCODE
-  Pop-Location
+  try {
+    cmd /c "npm.cmd run build > ..\pack-front.log 2>&1"
+    $rc2 = $LASTEXITCODE
+  } finally { Pop-Location }
   if ($rc2 -ne 0) { throw '鍓嶇鏋勫缓澶辫触锛岃瑙� pack-front.log' }
   Write-Host '      鍓嶇 dist 宸查噸寤�'
+} else {
+  Write-Host '      宸叉寜 -SkipFrontend 璺宠繃锛屼娇鐢ㄧ幇鏈� dist'
 }
+if (-not (Test-Path $webDist)) { throw "鏈壘鍒板墠绔骇鐗╋細$webDist锛堝幓鎺� -SkipFrontend 閲嶆柊鏋勫缓锛�" }
 
+# ---------- [4/5] 缁勮瀹屾暣閮ㄧ讲鐩綍 ----------
 Write-Host '[4/5] 缁勮閮ㄧ讲鐩綍...'
 $stamp = Get-Date -Format 'yyyyMMdd'
 $dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp)
@@ -74,9 +129,12 @@
 Copy-Item (Join-Path $tplDir 'backend\application.yml') (Join-Path $dest 'backend') -Force
 Copy-Item (Join-Path $tplDir 'backend\start-backend.cmd') (Join-Path $dest 'backend') -Force
 Copy-Item (Join-Path $tplDir 'backend\start-backend.sh') (Join-Path $dest 'backend') -Force
-Copy-Item (Join-Path $root 'traffic-audit-web\dist') (Join-Path $dest 'frontend') -Recurse -Force
+Copy-Item $webDist (Join-Path $dest 'frontend') -Recurse -Force
 Copy-Item (Join-Path $tplDir 'frontend\nginx.conf.example') (Join-Path $dest 'frontend') -Force
 Copy-Item (Join-Path $tplDir 'db\*.sql') (Join-Path $dest 'db') -Force
+
+# 鍗曠鍙� 8090 妯″紡锛氬悗绔粠 jar 鍚岀骇 web\ 璇诲墠绔潤鎬佹枃浠讹紝蹇呴』鍜� dist 鍐呭涓�鑷�
+Copy-Item $webDist (Join-Path $dest 'backend\web') -Recurse -Force
 
 # docs锛氳繍琛屾椂妯℃澘 + 鐢ㄦ埛鏂囨。锛涙帓闄ゅ紑鍙戣繃绋嬫枃妗d笌缂撳瓨/澶囦唤锛堝噺灏忎綋绉�侀伩鍏嶆妸鍐呴儴娓呭崟甯﹀嚭鍘伙級
 $docsDest = Join-Path $dest 'backend\docs'
@@ -86,13 +144,29 @@
 # db 鑴氭湰涔熸斁涓�浠藉埌 docs锛堜笌鏃у寘涓�鑷达細docs/init.sql 绛夛級
 Copy-Item (Join-Path $tplDir 'db\init.sql'), (Join-Path $tplDir 'db\sql_city_bus.sql'), (Join-Path $tplDir 'db\sql_city_taxi.sql'), (Join-Path $tplDir 'db\sql_wyc.sql'), (Join-Path $tplDir 'db\sql_holiday.sql'), (Join-Path $tplDir 'db\sql_holiday_decimal_migration.sql'), (Join-Path $tplDir 'db\sql_holiday_comparison_base_migration.sql') $docsDest -Force -ErrorAction SilentlyContinue
 
-# README锛氱敤鏃у寘妯℃澘骞舵浛鎹㈡棩鏈熷崰浣�
+# README锛氱敤妯℃澘骞舵浛鎹㈡棩鏈熷崰浣�
 $readme = Get-Content (Join-Path $tplDir 'README-閮ㄧ讲璇存槑.txt') -Raw -Encoding UTF8
 $readme = $readme.Replace('{stamp}', $stamp)
 Set-Content -LiteralPath (Join-Path $dest 'README-閮ㄧ讲璇存槑.txt') -Value $readme -Encoding UTF8
 
-Write-Host '[5/5] 姹囨��...'
+# ---------- [5/5] 鏁村寘鏄庢枃瀵嗛挜鎵弿 + 姹囨�� ----------
+Write-Host '[5/5] 鏁村寘鎵弿 + 姹囨��...'
+$leak = @()
+foreach ($f in (Get-ChildItem (Join-Path $dest 'backend') -File | Where-Object { $_.Extension -in '.yml', '.yaml', '.cmd', '.sh', '.txt' })) {
+  $t = Get-Content $f.FullName -Raw -Encoding UTF8 -ErrorAction SilentlyContinue
+  if ($t -and $t -match 'sk-[A-Za-z0-9]{16,}') { $leak += $f.Name + '(鐤戜技鏄庢枃 API key)' }
+}
+if ($leak.Count -gt 0) { throw ('鏁村寘鎵弿鏈�氳繃锛�' + ($leak -join '锛�')) }
+
 $files = Get-ChildItem $dest -Recurse -File
+$mb = (($files | Measure-Object Length -Sum).Sum / 1MB)
 Write-Host ("      杈撳嚭鐩綍锛歿0}" -f $dest)
-Write-Host ("      鏂囦欢鏁帮細{0}銆�鍚堣锛歿1:N2} MB" -f $files.Count, (($files | Measure-Object Length -Sum).Sum / 1MB))
-Write-Host '      鎻愰啋锛氭妸鍖呮嫹鍒伴儴缃叉満鍚庯紝鍙渶鏀� backend\application.yml 閲岀殑鏁版嵁搴撲笁澶� + 闇�瑕佹椂濉� deepseek.api-key銆�'
+Write-Host ("      鏂囦欢鏁帮細{0}  鍚堣锛歿1:N2} MB" -f $files.Count, $mb)
+
+$zipPath = $dest + '.zip'
+if (Get-Command Compress-Archive -ErrorAction SilentlyContinue) {
+  if (Test-Path $zipPath) { Remove-Item $zipPath -Force }
+  Compress-Archive -Path (Join-Path $dest '*') -DestinationPath $zipPath -CompressionLevel Optimal
+  Write-Host ("      鍘嬬缉鍖咃細{0}锛坽1:N2} MB锛�" -f $zipPath, ((Get-Item $zipPath).Length / 1MB))
+}
+Write-Host '      鎻愰啋锛氭嫹鍒伴儴缃叉満鍚庯紝鍔″繀鍏堟敼 backend\application.yml 鐨� spring.datasource锛坲rl/username/password锛夊啀鍚姩銆�'
diff --git a/traffic-audit-server/src/main/resources/application.yml.example b/traffic-audit-server/src/main/resources/application.yml.example
index dc87cf7..3c03dbd 100644
--- a/traffic-audit-server/src/main/resources/application.yml.example
+++ b/traffic-audit-server/src/main/resources/application.yml.example
@@ -15,8 +15,8 @@
 spring:
   datasource:
     url: jdbc:mysql://localhost:3305/traffic_audit?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
-    username: root
-    password: ${MYSQL_PASSWORD:root}
+    username: ${TRAFFIC_DB_USER:root}
+    password: ${TRAFFIC_DB_PASSWORD:root}
     driver-class-name: com.mysql.cj.jdbc.Driver
   servlet:
     multipart:
@@ -41,7 +41,8 @@
       logic-not-delete-value: 0
 
 jwt:
-  secret: ${JWT_SECRET:change-me-jwt-secret}
+  # 蹇呴』鏄�孊ase64 鍚堟硶瀛楃 + 闀垮害鏄� 4 鐨勫�嶆暟銆嶏紱涓嬮潰杩欎覆 32 浣嶅崄鍏繘鍒跺彲鐩存帴鐢�
+  secret: ${TRAFFIC_JWT_SECRET:8f2c1d64a7b34e09c5d81f6a2b0e7c93}
   expiration: 86400000
 
 docs:

--
Gitblit v1.9.1