From 25bc00ac5188741efec6c0bd965d83e7a7fb6b2b Mon Sep 17 00:00:00 2001 From: zikai <1621362626@qq.com> Date: Tue, 28 Jul 2026 11:12:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=B8=85=E7=90=86=E6=AD=BB?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=20+=20=E6=8F=90=E5=89=8D=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=20+=20=E9=94=99=E8=AF=AF=E8=AE=B0=E5=BD=95=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - downloadUrl 提升为顶层纯函数导出, JobList 不再为此实例化整个 api 对象 - createPdfApi 返回对象移除内部用的 getJob / downloadUrl (高内聚) - useLocale 移除未用的 isZh/pick 返回值 - 移除 4 个死 i18n key (upload.uploading/submitted/failed/networkError) - App.vue: import {watch} 提升至顶部; onDelete 补 try/catch + console.error - usePdfApi: pollPending 单任务失败补 console.warn; uploadFile 响应解析失败补 console.error - docs: 新增 error-handling.md / integration.md (嵌入细节从 README 移入) - README: 修正 dev 端口 5173->5175; 补 apache2 部署说明 --- README.md | 11 ++++++----- docs/error-handling.md | 21 +++++++++++++++++++++ docs/integration.md | 19 +++++++++++++++++++ src/App.vue | 12 ++++++++---- src/components/JobList.vue | 5 ++--- src/composables/useLocale.js | 5 +---- src/composables/usePdfApi.js | 17 ++++++++++------- src/i18n/locales/en.js | 6 +----- src/i18n/locales/zh-CN.js | 6 +----- test/usePdfApi.test.js | 4 ++-- 10 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 docs/error-handling.md create mode 100644 docs/integration.md diff --git a/README.md b/README.md index 6df0f00..77bd182 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ zPDF_package/ | Node.js | ≥ 18 | | zTools2 | 后端 `/api/pdf/*`(同源调用,cookie 自动管理) | -> 前端纯静态,无运行期后端依赖;API 由 zTools2 提供。 +> 前端纯静态,无运行期后端依赖;API 由 zTools2 提供。生产部署经 [zMainPage](https://git.zikai.wang/zikai/zMainPage) 作为子模块集成,由其 apache2 静态托管 + `/api` 反代到 zTools2(无独立 apache2 配置)。 ## 如何使用 @@ -51,16 +51,16 @@ git clone https://git.zikai.wang/zikai/zPDF_package.git cd zPDF_package npm install # 已配 npmmirror 镜像加速 -npm run dev # 开发服务器 http://localhost:5173(需 zTools2 在同源或配置代理) +npm run dev # 开发服务器 http://localhost:5175(vite.config.js 已配 /api 代理到 zTools2:6867) npm run build # 构建到 dist/ npm test # 单元测试(20 项) ``` -> 开发时 `/api/pdf/*` 需指向 zTools2。可配 Vite 代理;生产环境由 mainPage 同源反代到 zTools2,cookie 第一方生效。 +> 开发时 `/api/pdf/*` 由 vite 代理到本地 zTools2(127.0.0.1:6867);生产环境由 mainPage 同源反代到 zTools2,cookie 第一方生效。 ## 嵌入 mainPage -作为 [mainPage](https://git.zikai.wang/zikai/zMainPage) 的 git submodule(`third_party/zPDF_package`),mainPage 在构建期直接 `import` 本项目的 `src/App.vue` 作为组件挂载(非 iframe,与 [timeTableFix](https://git.zikai.wang/zikai/timeTableFix) 同范式):mainPage 侧 `src/modules/pdf/Pdf.vue` 套 `PageShell` 并透传 `:locale`;组件内 `usePdfApi.js` 同源 fetch `/api/pdf/*`,httpOnly cookie(`zk_pdf`)经反代第一方自动携带,无需 CORS。组件自身保持「无 host 依赖」:不持 `defineOptions({ name })`、不引 mainPage 的 i18n,仅靠 `:locale` prop 驱动自有 i18n 实例。详见 mainPage 的 `docs/submodule-zPDF_package.md`。 +作为 [mainPage](https://git.zikai.wang/zikai/zMainPage) 的 git submodule,经构建期组件 import 集成(非 iframe)。详见 [`docs/integration.md`](./docs/integration.md)。 ## 技术栈 @@ -75,5 +75,6 @@ npm test # 单元测试(20 项) ## 了解更多 -- [嵌入 mainPage(构建期组件 import)](../zMainPage/docs/submodule-zPDF_package.md) +- [嵌入 mainPage(构建期组件 import)](./docs/integration.md) +- [错误处理与日志约定](./docs/error-handling.md) - 后端 API 与转换实现见 [zTools2](https://git.zikai.wang/zikai/zTools2) README diff --git a/docs/error-handling.md b/docs/error-handling.md new file mode 100644 index 0000000..f0c08e2 --- /dev/null +++ b/docs/error-handling.md @@ -0,0 +1,21 @@ +# 错误处理与日志约定 + +zPDF_package 的错误处理分两层:API 客户端 fail-fast(抛错),UI 层捕获后既写控制台又给用户反馈。 + +## API 客户端(src/composables/usePdfApi.js) + +- `load` / `getJob` / `remove`:fetch 不可用抛 `fetch unavailable`;非 2xx 抛 `HTTP `。 +- `uploadFile`:XHR 不可用抛 `XMLHttpRequest unavailable`;网络错误 reject `network error`;响应非 200 时解析 `detail` 字段,无则 `HTTP `。 +- `pollPending`:单个任务查询失败不中断整体轮询,但 `console.warn` 记录(避免持久故障完全不可见)。 +- `downloadUrl`:纯函数,无副作用。 + +## UI 层(src/App.vue, src/components/) + +- `refresh()` 失败:捕获写入 `loadError`,JobList 显示「加载失败」。 +- `onDelete()` 失败:`console.error` 记录 + 写入 `loadError` 提示用户。 +- `Uploader.handle()` 失败:捕获写入 `errMsg` 显示。 +- `validateFile` 返回 i18n key(非抛错),由 `onUpload` 翻译后抛 `Error(t(key))` 交给 Uploader 显示。 + +## 控制台前缀 + +所有 `[zPDF]` 前缀的日志来自本子项目,便于嵌入宿主时与宿主日志区分。 diff --git a/docs/integration.md b/docs/integration.md new file mode 100644 index 0000000..b3ca24a --- /dev/null +++ b/docs/integration.md @@ -0,0 +1,19 @@ +# 嵌入 mainPage + +zPDF_package 作为 [mainPage](https://git.zikai.wang/zikai/zMainPage) 的 git submodule(`third_party/zPDF_package`),经构建期组件 import 集成(非 iframe,与 timeTableFix 同范式)。 + +## 集成方式 + +- mainPage 侧 `src/modules/pdf/Pdf.vue` 套 `PageShell` 并透传 `:locale`。 +- 构建期直接 `import` 本项目 `src/App.vue`,共享 mainPage 的构建与 KeepAlive 缓存。 +- 组件内 `usePdfApi.js` 同源 fetch `/api/pdf/*`,httpOnly cookie(`zk_pdf`)经反代第一方自动携带,无需 CORS。 + +## 便携式设计(无 host 依赖) + +组件自身保持「无 host 依赖」: + +- 不持 `defineOptions({ name })`(避免与宿主组件名冲突)。 +- 不引 mainPage 的 i18n,仅靠 `:locale` prop 驱动自有 i18n 实例。 +- `useLocale` 直接读本子项目模块级 `i18n.global`,而非 `useI18n()`(后者嵌入时会解析到宿主实例,文案回退成 key)。 + +详见 mainPage 的 `docs/submodule-zPDF_package.md`。 diff --git a/src/App.vue b/src/App.vue index 6a57ee4..e80a264 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@