# bidding-client **Repository Path**: xx9658/bidding-client ## Basic Information - **Project Name**: bidding-client - **Description**: 招投标文件制作客户端 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-18 - **Last Updated**: 2026-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 电子招投标投标文件制作客户端 跨平台桌面客户端,用于电子招投标投标文件离线制作。 **技术架构**:Electron + Vue 3 + 本地 Java 服务(Spring Boot) **目标平台**:Windows(优先)/ macOS / Linux --- ## 环境要求 | 工具 | 版本要求 | 说明 | |------|----------|------| | Node.js | 20.x LTS | 前端构建和 Electron | | Java JDK | 21 LTS | Spring Boot 服务 | | Maven | 3.6+ | Java 依赖管理 | --- ## 快速开始 ### 1. 安装依赖 ```bash npm install ``` ### 2. 启动开发模式(单命令) ```bash npm run electron:dev ``` 启动脚本会自动: 1. 构建 Java 服务 JAR(`mvn package -DskipTests`) 2. 编译 Vue 前端 + Electron 3. 启动 Electron 窗口并拉起 Java 服务 ### 3. 验证启动成功 ```bash curl http://localhost:18080/api/health # 期望响应:{"code":0,"message":"success","data":{"status":"UP",...}} ``` --- ## 常用命令 ### 开发 ```bash # 启动(自动打包 Java + Electron) npm run electron:dev # 只重打包 Java(修改后端代码后) npm run package:java ``` ### Java 服务 ```bash cd bidding-client-service # 编译 mvn compile # 打包(跳过测试) mvn package -DskipTests # 运行测试 mvn test ``` ### 生产打包 ```bash # 构建安装包(.exe / .dmg) npm run electron:build ``` --- ## 目录结构 ``` bidding-client/ ├── electron/ # Electron 主进程 │ ├── main.ts # 主进程入口 │ ├── preload.ts # contextBridge 预加载 │ ├── constants.ts # 常量定义 │ ├── logger.ts # 日志 │ ├── java/ # Java 进程管理 │ │ ├── java-process-manager.ts │ │ ├── port-finder.ts │ │ ├── port-cache.ts │ │ ├── pid-file-manager.ts │ │ └── health-checker.ts │ ├── ipc/ # IPC 处理器 │ │ └── ipc-handlers.ts │ ├── window/ # 窗口与托盘管理 │ │ ├── window-manager.ts │ │ └── tray-manager.ts │ ├── updater/ # 自动更新 │ │ └── auto-updater.ts │ └── sign/ # CA 签章集成 │ └── pdfSignEmbedClient.js ├── vue-app/ # Vue 3 渲染进程 │ └── src/ │ ├── api/ # API 封装 │ ├── stores/ # Pinia 状态 │ ├── views/ # 页面组件 │ ├── components/ # 公共组件 │ └── composables/ # 可复用逻辑 ├── bidding-client-service/ # Spring Boot 本地服务 │ └── src/main/java/cn/minmetals/purchase/bidding/client/ │ ├── controller/ │ ├── service/ │ ├── repository/ │ ├── model/ │ └── common/ ├── docs/ # 设计文档 ├── prd/ # 需求文档 + CA 集成文档 ├── scripts/ │ ├── dev.js # 开发启动脚本 │ ├── build-all.sh # 构建 jar + 裁剪 JRE + electron-builder │ ├── build-java.sh # 单独构建 Java 服务 │ ├── download-jre.sh # 下载裁剪 JRE │ ├── generate-latest-yaml.js # 生成 latest.yml │ └── update-server.js # 本地更新测试服务器 └── package.json ``` --- ## 调试 | 操作 | 方式 | |------|------| | 打开 DevTools | 开发模式自动打开,或 `Ctrl+Shift+I` | | Java 日志 | 终端控制台直接输出 | | 数据库文件 | `%USERPROFILE%\bidding-client\data\bidding.db`(发布)
`%USERPROFILE%\bidding-client-dev\data\bidding.db`(开发) | | 重置数据库 | 删除对应的 `bidding.db`,下次启动自动重建 | ### 端口冲突 Java 端口默认 18080,端口被占用时会在 18081–18180 范围内自动查找可用端口。 ```bash # 查找占用 18080-18180 的进程 netstat -ano | findstr :180 # 强制结束 taskkill /F /PID ``` --- ## 文档 | 文档 | 说明 | |------|------| | [docs/architecture.md](docs/architecture.md) | 技术架构设计 | | [docs/BJCAJM.md](docs/BJCAJM.md) | BJCA CA 签章与加密集成指南 | | [docs/BJCA_PDF.md](docs/BJCA_PDF.md) | BJCA PDF 签章客户端集成 | | [prd/prd.html](prd/prd.html) | 产品需求文档 | | [CLAUDE.md](CLAUDE.md) | AI 辅助开发规范 | --- ## 自动更新 — 发版流程 ### 原理 客户端启动后定期下载 `latest.yml` 比对版本号。发现新版本时通知用户下载 `.exe`,安装后重启即完成更新。 核心文件: | 文件 | 作用 | |------|------| | `electron/updater/auto-updater.ts` | 检查更新 / 下载 / 安装逻辑 | | `electron-builder.yml` | `publish.url` 配置 | | `vue-app/src/components/common/UpdateNotifier.vue` | 右下角更新提示条 UI | | `scripts/update-server.js` | 本地测试用的简易文件服务器 | ### 方案 A:CAP 文件中心 + 静态 latest.yml `latest.yml` 部署在代码仓库静态服务上,`.exe` 上传至 CAP 文件中心。每次发版 3 步: **第 1 步:改版本号 + 构建** ```bash # 编辑 package.json,version 递增,如 1.0.2 → 1.0.3 npm run electron:build ``` 构建后在 `dist/` 生成 `Setup 1.0.3.exe` + `latest.yml`。 **第 2 步:更新 latest.yml** 将 `dist/latest.yml` 覆盖到代码仓库的 `static/releases/latest.yml`,提交推送: ``` https://your-server.com/static/releases/latest.yml ``` `electron-builder.yml` 中的 `publish.url` 指向这个地址: ```yaml publish: provider: generic url: https://your-server.com/static/releases ``` **第 3 步:上传 .exe 到 CAP 文件中心** 将 `.exe` 上传到 CAP 文件中心,更新下载接口指向新文件。 ### 方案 B:传统 HTTP 文件服务器 `latest.yml` 和 `.exe` 都放在同一个 HTTP 服务器上。每次发版 4 步: **第 1 步:修改版本号** ```bash # 编辑 package.json,version 递增 ``` **第 2 步:修改更新服务器地址** 编辑 `electron-builder.yml`: ```yaml publish: provider: generic url: https://update.your-company.com/releases ``` **第 3 步:构建安装包** ```bash npm run electron:build ``` **第 4 步:上传到服务器** 将 `dist/` 下**所有文件**上传到步骤 2 中配置的 URL 对应目录。确保 HTTP GET 能直接访问: ``` https://update.your-company.com/releases/latest.yml → 200 https://update.your-company.com/releases/...Setup 1.0.3.exe → 200 ``` ### 工作流程 ``` 客户端启动 │ ▼(30秒后,之后每4小时) GET {publish.url}/latest.yml │ ├── 版本相同 → 无操作 │ └── 版本更新 → 弹窗"发现新版本 X.X.X" │ ├── 点"立即下载" → 下载 .exe → 弹窗"立即安装" │ └── 点"立即安装" → 退出 → 替换文件 → 重新打开 ``` ### 本地测试 ```bash # 1. 构建 npm run electron:build # 2. 启动测试服务器(以 dist/ 为根目录,端口 8765) node scripts/update-server.js # 3. 安装旧版 .exe,启动后自动检测并提示更新 ```