| HANDOFF.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| deploy-templates/README-部署说明.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| deploy-templates/backend/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| deploy-templates/backend/start-backend.cmd | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| deploy-templates/backend/start-backend.sh | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| deploy-templates/jar-application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/打包部署说明.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| pack-deploy.ps1 | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/resources/application.yml.example | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
HANDOFF.md
@@ -6,6 +6,15 @@ ## ææ°ï¼2026-10-03ï¼ ### è¡¥å ï¼10-03 ä¸åï¼ï¼æå¡å¨é¨ç½²æ¥ âAccess 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)`ã - **æ ¹å **ï¼jar å ç½®é ç½®éåºå£ä»¤æ¯å ä½ç¬¦ `${TRAFFIC_DB_PASSWORD:}`ï¼é»è®¤ç©ºä¸²ï¼ï¼è 10-02 é£ä¸ªå **åªå« jar + web + dist**ï¼æ²¡æå¤ç½® `application.yml`ãæ²¡æ `docs/`ã`db/`ãå¯å¨èæ¬ãé¨ç½²æºæ²¡æä»»ä½å¤é¨é ç½®è¦çï¼Spring å°±æ¿ç©ºå¯ç è¿æ¬æº MySQL â `using password: NO`ï¼æ³¨æï¼è¿æ¯âæ«ä¼ å¯ç âï¼ä¸æ¯å¯ç éï¼ã - **æå¡å¨ä¾§ä¸æ¥ä¿®å¤ï¼æ ééæå ï¼**ï¼å¨ jar åçº§æ¾ `application.yml`ï¼æ `spring.datasource.url/username/password` æ¹æç°åºçå®å¼åéå¯å³å¯ï¼ä¹å¯ç¨ç¯å¢åé `TRAFFIC_DB_PASSWORD` 代æ¿ãå¯å¨èæ¬å·²å 颿£æéï¼ç¼º `application.yml` / password 仿¯å 使åé½ä¼ WARNï¼ãä¿®å¤åè¥æ¥âæªæ¾å°æ°æ®ç®å½ docsâå说æå å 缺 `backend/docs`ï¼ä»æ°å ææºæºå¨æ·ã - **æå å·¥å ·å·²ä¿®ï¼å âæå å·¥å ·å¾ ä¿®â 两项åå·²è½å®ï¼**ï¼`pack-deploy.ps1` éåä¸ºäºæ¥ï¼â ç¨æ°å¢æ¨¡æ¿ `deploy-templates/jar-application.yml`ï¼**å ¨å ä½ç¬¦**ï¼ä¸´æ¶æ¿æ¢æºç é ç½®å `mvn clean package`ï¼æ 论æè´¥é½è¿åçå®é ç½®ï¼â¡ è§£å 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ï¼zip 76.37 MBï¼ï¼å·²éªè¯ï¼jar å ç½®é ç½®å ¨å ä½ç¬¦ï¼å»å¯èªæ£éè¿ï¼ã`backend/web` ä¸ `frontend/dist` éæä»¶ä¸è´ï¼å 44 个ï¼ã`backend/docs/çææ±æ»å¤§è¡¨` æ¯çåå¨ã`åè½æµè¯æ¥å/工使¥ç»/é®é¢æ±æ»/_cache` å·²æé¤ã - **踩åï¼éè¦ï¼**ï¼æ¬æº PowerShell 5.1 ææ BOM ç `.ps1` å½ ANSI 读ï¼ä¸ææ³¨éä¼åæä¹±ç 并导è´èæ¬è§£æå¤±è´¥ã`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`ï¼MySQL æå¡æªåã - **åå¸æå»ºï¼å·²å®æï¼**ï¼åºâåå¸ç¼è¯âè¦æ±ï¼å·²å®æå端 `mvn clean package -DskipTests` åå端 `npm run build`ãjar å å·²åå»å¯èªæ£ï¼åªä¿çç¯å¢åéå ä½ç¬¦ï¼æå»ºåæ¬æºçå® `src/main/resources/application.yml` å·²åæ ·æ¢å¤ã - **åå¸äº§ç©ï¼æ¬å°ï¼æªå ¥åºï¼**ï¼ deploy-templates/README-²¿Êð˵Ã÷.txt
@@ -58,6 +58,10 @@ 注æï¼å ¨é dump ä¼å¸¦ä¸æ¬æºçè´¦å·å¯ç ï¼è¦ç init.sql é¢ç½®ç admin è´¦å·ã ã常è§é®é¢ã 0. å¯å¨æ¥ java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)ï¼ âusing password: NOâ = å端æ¿å°çæ°æ®åºå¯ç æ¯ç©ºä¸²ï¼ä¸æ¯å¯ç éï¼ã æ£æ¥ backend/application.yml æ¯å¦ä¸ jar åçº§ä¸ spring.datasource.password 已填çå®å¯ç ï¼ è¥æªæ¹ application.ymlï¼ä¹å¯ç¨ç¯å¢åé TRAFFIC_DB_PASSWORD 代æ¿ãæ¹å®éå¯å³å¯ï¼æ ééæ°æå ã 1. å¯å¨æ¥ãæªæ¾å°æ°æ®ç®å½ docsã/ å¯¼åºæ¥ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼ å¿ é¡»å¨ backend ç®å½ä¸å¯å¨ï¼jar ä¸ docs å级ï¼ï¼ä¸è¦åªæ· jarã 2. æ¥è¡¨å¯¼åºæ¥ãæªæ¾å°æ±æ»è¡¨æ¯çãYYYYå¹´Mæéè·¯è¿è¾éæ±æ»è¡¨.xlsxããï¼ deploy-templates/backend/application.yml
@@ -3,15 +3,19 @@ # é¨ç½²å°æ°æºå¨åï¼è¯·**è³å°**ä¿®æ¹ä¸é¢æ 注 TODO çä¸å¤æ°æ®åºé ç½®ï¼ # ============================================================ server: port: 8080 port: 8090 # åç«¯å£æ¨¡å¼ï¼å端 8090 åæ¶æç®¡å端页é¢ï¼ä¸è¦æ¹æ 8080ï¼ app: captcha: required: false # ç产ç¯å¢å¦éå¾å½¢éªè¯ç ï¼æ¹ä¸º true spring: web: resources: # åç«¯å£æ¨¡å¼ï¼ä¼å 读å 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: 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 å ç½®å¯ç å ä½ç¬¦ä¼è§£æä¸ºç©ºï¼ 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ï¼ 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ï¼jar å级ï¼ï¼æ°æ®åºå¯ç ä¼è§£æä¸ºç©ºï¼å¯è½æ¥ 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 ï¼Ctrl+C 忢ï¼" java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar 2>&1 | tee app.log deploy-templates/jar-application.yml
New file @@ -0,0 +1,94 @@ # ============================================================ # æå ç¨ãè¿ jar çé»è®¤é ç½®ãââåªå 许å ä½ç¬¦ï¼ç¦æ¢çå®å¯é¥/å£ä»¤ï¼ # # 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 # # 注æï¼password é»è®¤å¼ä¸ºç©ºä¸²ï¼è¥é¨ç½²æºæ¢æ²¡æå¤ç½® 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ï¼MyBatis-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 docs/´ò°ü²¿Êð˵Ã÷.md
@@ -209,6 +209,7 @@ | ç»å½æ¥å£ 500 | `jwt.secret` å¡«äºéæ³å符ï¼å¦ä¸æï¼ï¼æ¹æ 32 ä½åå è¿å¶ä¸² | | 页é¢è½å¼ä½æ¥å£ 404 | èµ° nginx æ¹æ¡æ¶æ²¡é `/api` åä»£ï¼æ¹ç¨ jar å åµè®¿é® 8090 | | æ°æ®åºè¿æ¥å¤±è´¥ | æ£æ¥ `application.yml`ï¼ç¡®è®¤ 5 个 SQL èæ¬å·²æ§è¡ | | å¯å¨æ¥ `Access denied ... (using password: NO)` | å端æ¿å°çåºå£ä»¤æ¯**空串**ï¼jar å ç½® `${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. **è§£å 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 åç«¯å£æ¨¡å¼ï¼ï¼è¾åºå° `<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`ãæ¹æ¨¡æ¿å³æ¹æå 产ç©ã 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) è§£å jar æ£æ¥å ç½® application.ymlï¼å¿ é¡»å ¨æ¯å ä½ç¬¦ï¼ç¦æ¢ sk- å¯é¥ / ææå£ä»¤ï¼ï¼ä¸åæ ¼ç´æ¥ä¸æ¢ 3) npm run build æå»ºå端 distï¼å¯ -SkipFrontendï¼ 4) ç»è£ deploy ç®å½ç»æï¼backend / 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 èµ·ï¼ 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] æå»ºå端ï¼mvn clean package -DskipTestsï¼...' 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] æå»ºå端ï¼mvn 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 Pop-Location } 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] å»å¯èªæ£ï¼jar å ç½®é ç½®å¿ é¡»å ¨æ¯å ä½ç¬¦ ---------- 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ï¼sk-â¦ï¼' } foreach ($line in ($text -split "`n")) { 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('${')) { $bad += ("$($matches[1]) 䏿¯å ä½ç¬¦") } 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 ' è¦åï¼jar å ç½® password 䏿¯ TRAFFIC_DB_PASSWORD å ä½ç¬¦å½¢å¼ï¼è¯·ç¡®è®¤æ¨¡æ¿ã' } Write-Host ' éè¿ï¼jar å ç½®é ç½®å ¨é¨ä¸ºå ä½ç¬¦ï¼æ ææå¯é¥/å£ä»¤ã' # ---------- [3/5] å端æå»º ---------- Write-Host '[3/5] æå»ºå端ï¼npm run buildï¼å¯ -SkipFrontend è·³è¿ï¼...' if (-not $SkipFrontend) { Push-Location (Join-Path $root 'traffic-audit-web') try { cmd /c "npm.cmd run build > ..\pack-front.log 2>&1" $rc2 = $LASTEXITCODE Pop-Location } 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ï¼è¿è¡æ¶æ¨¡æ¿ + ç¨æ·ææ¡£ï¼æé¤å¼åè¿ç¨ææ¡£ä¸ç¼å/å¤ä»½ï¼åå°ä½ç§¯ãé¿å æå 鍿¸ å带åºå»ï¼ $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ï¼url/username/passwordï¼åå¯å¨ã' 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} # å¿ é¡»æ¯ãBase64 åæ³å符 + é¿åº¦æ¯ 4 çåæ°ãï¼ä¸é¢è¿ä¸² 32 ä½åå è¿å¶å¯ç´æ¥ç¨ secret: ${TRAFFIC_JWT_SECRET:8f2c1d64a7b34e09c5d81f6a2b0e7c93} expiration: 86400000 docs: