From 709a314107895d0d423850cb179cf48e07d9fd90 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Thu, 30 Apr 2026 10:11:45 +0800 Subject: [PATCH] Fix breadcrumb dashboard detection --- .gitignore | 3 +- build_release_892.sh | 95 ++++++++++++++++++ ...ort-2026-04-27-root-release-package-892.md | 27 +++++ ...ort-2026-04-28-breadcrumb-duplicate-key.md | 20 ++++ doc/~$上虞_客户内码客户_历史利率_映射表.xlsx | Bin 0 -> 165 bytes doc/上虞_客户内码客户_历史利率_映射表.xlsx | Bin 0 -> 11350 bytes doc/利率定价接口.txt | 18 ++++ ruoyi-ui/src/components/Breadcrumb/index.vue | 5 +- tongweb_63311.properties | 15 +++ 9 files changed, 180 insertions(+), 3 deletions(-) create mode 100755 build_release_892.sh create mode 100644 doc/implementation-report-2026-04-27-root-release-package-892.md create mode 100644 doc/implementation-report-2026-04-28-breadcrumb-duplicate-key.md create mode 100644 doc/~$上虞_客户内码客户_历史利率_映射表.xlsx create mode 100644 doc/上虞_客户内码客户_历史利率_映射表.xlsx create mode 100644 doc/利率定价接口.txt create mode 100644 tongweb_63311.properties diff --git a/.gitignore b/.gitignore index 0b3dcfa..d962aac 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ nbdist/ logs/ ruoyi-ui/dist.zip +????????_892.zip */src/test/ ruoyi-ui/tests .playwright-cli @@ -57,4 +58,4 @@ tongweb_63310.properties audit.log .DS_Store -*/.DS_Store \ No newline at end of file +*/.DS_Store diff --git a/build_release_892.sh b/build_release_892.sh new file mode 100755 index 0000000..e2bdb3f --- /dev/null +++ b/build_release_892.sh @@ -0,0 +1,95 @@ +#!/bin/sh + +set -eu + +ROOT_DIR=$(CDPATH= cd -- "$(dirname "$0")" && pwd) +DATE_STAMP=$(date "+%Y%m%d") +RELEASE_ZIP="$ROOT_DIR/${DATE_STAMP}_892.zip" +BACKEND_JAR_SOURCE="$ROOT_DIR/ruoyi-admin/target/ruoyi-admin.jar" +FRONTEND_DIR="$ROOT_DIR/ruoyi-ui" +FRONTEND_DIST_DIR="$FRONTEND_DIR/dist" +FRONTEND_DIST_ZIP="$FRONTEND_DIR/dist.zip" +NODE_VERSION="14" + +log_info() { + printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" +} + +log_error() { + printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" >&2 +} + +require_command() { + if ! command -v "$1" >/dev/null 2>&1; then + log_error "缺少命令: $1" + exit 1 + fi +} + +cleanup() { + if [ -n "${WORK_DIR:-}" ] && [ -d "$WORK_DIR" ]; then + rm -rf "$WORK_DIR" + fi +} + +build_backend() { + log_info "开始构建后端生产 jar" + ( + cd "$ROOT_DIR" + mvn -pl ruoyi-admin -am clean package -DskipTests + ) + + if [ ! -f "$BACKEND_JAR_SOURCE" ]; then + log_error "未生成后端 jar: $BACKEND_JAR_SOURCE" + exit 1 + fi +} + +build_frontend() { + log_info "开始构建前端生产 dist" + ROOT_DIR="$ROOT_DIR" NODE_VERSION="$NODE_VERSION" zsh -lic 'nvm use "$NODE_VERSION" >/dev/null && npm --prefix "$ROOT_DIR/ruoyi-ui" run build:prod' + + if [ ! -f "$FRONTEND_DIST_DIR/index.html" ]; then + log_error "前端生产构建失败,未找到: $FRONTEND_DIST_DIR/index.html" + exit 1 + fi + + rm -f "$FRONTEND_DIST_ZIP" + ( + cd "$FRONTEND_DIR" + zip -qr "$FRONTEND_DIST_ZIP" dist + ) + + if [ ! -f "$FRONTEND_DIST_ZIP" ]; then + log_error "未生成前端压缩包: $FRONTEND_DIST_ZIP" + exit 1 + fi +} + +package_release() { + WORK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/loan_pricing_release.XXXXXX") + trap cleanup EXIT INT TERM + + cp "$BACKEND_JAR_SOURCE" "$WORK_DIR/ruoyi-admin.jar" + cp "$FRONTEND_DIST_ZIP" "$WORK_DIR/dist.zip" + + rm -f "$RELEASE_ZIP" + ( + cd "$WORK_DIR" + zip -qr "$RELEASE_ZIP" ruoyi-admin.jar dist.zip + ) + + log_info "上线压缩包已生成: $RELEASE_ZIP" +} + +main() { + require_command mvn + require_command zsh + require_command zip + + build_backend + build_frontend + package_release +} + +main "$@" diff --git a/doc/implementation-report-2026-04-27-root-release-package-892.md b/doc/implementation-report-2026-04-27-root-release-package-892.md new file mode 100644 index 0000000..d20d649 --- /dev/null +++ b/doc/implementation-report-2026-04-27-root-release-package-892.md @@ -0,0 +1,27 @@ +# 根目录 892 上线压缩包生成脚本实施记录 + +## 保存路径检查 +- 脚本保存路径:项目根目录 `build_release_892.sh` +- 实施记录保存路径:`doc/implementation-report-2026-04-27-root-release-package-892.md` + +## 修改内容 +- 新增根目录脚本 `build_release_892.sh` +- 脚本执行后自动在项目根目录生成 `YYYYMMDD_892.zip` +- 压缩包根层结构固定为: + - `ruoyi-admin.jar` + - `dist.zip` +- 后端产物来自最新执行的 `mvn -pl ruoyi-admin -am clean package -DskipTests` +- 前端产物来自 `nvm use 14` 后执行的 `npm --prefix ruoyi-ui run build:prod` +- 前端构建完成后重新生成 `ruoyi-ui/dist.zip` +- 更新 `.gitignore`,忽略根目录生成的 `????????_892.zip` + +## 验证结果 +- 已执行 `sh -n build_release_892.sh`,语法校验通过 +- 已执行 `./build_release_892.sh`,后端 Maven 构建成功,前端生产构建成功 +- 前端构建过程中仅出现原有包体积 warning 与 npm 更新检查权限提示,不影响产物生成 +- 已生成根目录压缩包:`20260427_892.zip` +- 已按最新要求调整压缩包结构,根层直接放置两个文件,不再包含 `deploy/` 目录 +- 已执行 `unzip -l 20260427_892.zip`,确认压缩包内容为: + - `ruoyi-admin.jar` + - `dist.zip` +- 已执行 `git check-ignore -v 20260427_892.zip ruoyi-ui/dist.zip`,确认根目录上线压缩包和前端临时压缩包均不会进入 git diff --git a/doc/implementation-report-2026-04-28-breadcrumb-duplicate-key.md b/doc/implementation-report-2026-04-28-breadcrumb-duplicate-key.md new file mode 100644 index 0000000..503f1c1 --- /dev/null +++ b/doc/implementation-report-2026-04-28-breadcrumb-duplicate-key.md @@ -0,0 +1,20 @@ +# 面包屑重复 key 告警处理实施记录 + +## 修改内容 + +- 修复流程列表首页进入后控制台出现 `Duplicate keys detected: '/index'` 的问题。 +- 根因是当前首页实际路由为 `/index`,面包屑组件仍只按路由名 `Index` 判断首页,导致额外追加的“首页”项与“流程列表”项使用相同路径 `/index` 作为 key。 +- 将面包屑首页判断补充为同时识别 `path === '/index'`,避免在首页路由重复追加“首页”项。 + +## 验证方式 + +- 启动前端开发服务后,使用真实浏览器访问 `/index`。 +- 检查控制台不再出现 `Duplicate keys detected: '/index'`。 +- 检查流程列表页面仍可正常展示。 + +## 验证结果 + +- 已使用 Node 14.21.3 启动前端开发服务并通过 Playwright 访问真实页面 `http://127.0.0.1:8080/index`。 +- 页面成功进入“流程列表”,面包屑仅展示“流程列表”,未再重复追加“首页”。 +- 浏览器控制台统计为 `Errors: 0, Warnings: 0`,未再出现 `Duplicate keys detected: '/index'`。 +- 验证结束后已关闭本次启动的前端 `8080` 进程;后端 `63310` 为验证前已有进程,未做关闭处理。 diff --git a/doc/~$上虞_客户内码客户_历史利率_映射表.xlsx b/doc/~$上虞_客户内码客户_历史利率_映射表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3c3a794080821fc614a37e537889505a44d8e2ae GIT binary patch literal 165 ZcmZQB&rVh#9WXPLGh{O)Gbqpn0sshg4^aRB literal 0 HcmV?d00001 diff --git a/doc/上虞_客户内码客户_历史利率_映射表.xlsx b/doc/上虞_客户内码客户_历史利率_映射表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5a602337d60de4d880013e71c6507b9133272abe GIT binary patch literal 11350 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 eIn|%c|Cy_m