# 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,启动后自动检测并提示更新
```