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 0000000..3c3a794 Binary files /dev/null and b/doc/~$上虞_客户内码客户_历史利率_映射表.xlsx differ diff --git a/doc/上虞_客户内码客户_历史利率_映射表.xlsx b/doc/上虞_客户内码客户_历史利率_映射表.xlsx new file mode 100644 index 0000000..5a60233 Binary files /dev/null and b/doc/上虞_客户内码客户_历史利率_映射表.xlsx differ diff --git a/doc/利率定价接口.txt b/doc/利率定价接口.txt new file mode 100644 index 0000000..6cbdf26 --- /dev/null +++ b/doc/利率定价接口.txt @@ -0,0 +1,18 @@ +--------客户号与客户内码映射接口 +----对私 +http://552f7aff0acd4c09ac3b83dbfee57fa0.apigateway.res.dc-pdt-zj96596.com/shangyu_lilvcesuan_ind_idmapno?appCode=1a89fa84abda480ba93ed73fd01ffd07&cust_id= +---案例:1对1 101330419198206033217 101330419197511072429 +---案例:1对n 101330682197911073012 10133062319810217642X + + +----对公 +http://552f7aff0acd4c09ac3b83dbfee57fa0.apigateway.res.dc-pdt-zj96596.com/shangyu_lilvcesuan_ent_idmapno?appCode=1a89fa84abda480ba93ed73fd01ffd07&cust_id= +---案例:1对1 20291330600146150140Y 20291330600146150466L +---案例:1对n 202913306047458026221 2029133060475302009XU + + + +-----历史合同查询接口 +http://552f7aff0acd4c09ac3b83dbfee57fa0.apigateway.res.dc-pdt-zj96596.com/shangyu_loan_rate_history?appCode=1a89fa84abda480ba93ed73fd01ffd07&cust_isn= +----1对1 81033011438 81035265634 +----1对n 82002469287 82000882275 \ No newline at end of file diff --git a/ruoyi-ui/src/components/Breadcrumb/index.vue b/ruoyi-ui/src/components/Breadcrumb/index.vue index 84f4831..b2307b3 100644 --- a/ruoyi-ui/src/components/Breadcrumb/index.vue +++ b/ruoyi-ui/src/components/Breadcrumb/index.vue @@ -72,10 +72,11 @@ export default { }, isDashboard(route) { const name = route && route.name - if (!name) { + const path = route && route.path + if (!name && !path) { return false } - return name.trim() === 'Index' + return (name && name.trim() === 'Index') || path === '/index' }, handleLink(item) { const { redirect, path } = item diff --git a/tongweb_63311.properties b/tongweb_63311.properties new file mode 100644 index 0000000..27c8757 --- /dev/null +++ b/tongweb_63311.properties @@ -0,0 +1,15 @@ +#TongTech License properties +#Wed Apr 29 13:50:24 CST 2026 +application.location=/Users/wkc/Desktop/loan-pricing/loan-pricing +license.create.date=2024-12-10 +license.customer.name=\u6D59\u6C5F\u519C\u6751\u5546\u4E1A\u8054\u5408\u94F6\u884C\u80A1\u4EFD\u6709\u9650\u516C\u53F8 +license.end.date=-1 +license.extern.properties.name=validateType,order_number,license_info +license.extern.properties.value=file,2024-2121,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 +license.file.content=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 +license.file.path=classpath\:license.dat +license.max.number=-1 +license.project.name=\u6D59\u6C5F\u519C\u6751\u5546\u4E1A\u8054\u5408\u94F6\u884C\u80A1\u4EFD\u6709\u9650\u516C\u53F8\u5173\u4E8E\u56FD\u4EA7\u5316\u5E94\u7528\u670D\u52A1\u5668\u4E2D\u95F4\u4EF6\u91C7\u8D2D +license.type=release +license.validate.type=file +server.number=7.0.E.7