Files
happy-export/README.md
T
Drsakura 1a759ef37d feat(data): 业务数据与系统数据分离的导入导出
数据迁移不再整体替换 trade.db —— 那条路会把账号、权限组、组织、设置(含大模型密钥)、
登录会话与审计日志一起搬到目标部署。改为按类别搬运业务数据,系统数据永远是目标部署自己那份。

- backend/lib/dataTransfer:表目录(30 张业务表,依赖顺序)、gzip JSONL 数据包(每表 sha256)、导入内核
- 归属统一给导入人;冲突跳过不覆盖;父记录按 __refs 自然键快照补壳
- 流水表(price_history)按整行内容判重:用 (sku, changed_at) 当键实测 643 行丢 186 行
- 预览在库副本上真跑一遍导入,报告与真导同源;导入前 VACUUM INTO 备份,单事务写入
- 新权限点 data.transfer(仅超管组),导出/导入均写审计
- 前端「数据迁移」页:按类别勾选导出、上传后预览逐表明细、确认导入;移除设置里的静态占位「数据交换」
- 测试:单测 7 项(含目录外键顺序、BLOB、重复导入、包被改坏)、API 端到端 1 项(两个真实实例互传)
- 用真实库副本彩排:3854 行 0 失败,29 张业务表行数全部一致,包 1.22 MB
2026-10-23 13:46:26 +08:00

198 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 外贸供应链管理系统
一个专为外贸企业设计的供应链与客户管理系统。
## 功能模块
### 工作台
- 工作日历:日程安排、节日标注、今日待办
- 汇率计算器与时区时钟
- AI 助手(可接入自有模型)
### 业务管理
- **询盘管理** - 询盘登记、明细与跟进
- **客户报价单管理** - 报价单编制、英文大写金额
- **PI合同管理** - PI 合同台账、收款条件
- **订单管理** - 订单跟踪与状态管理
### 客户管理
- **我的客户** - 客户信息、联系人、跟进记录
- **新客开发** - 线索登记、AI 智能分析
- **客户公海** - 未分配客户的领取与分配
### 采购管理
- **采购单管理** - 采购单登记与跟踪
- **产品管理** - SKU/SPU 两层管理、包装参数、阶梯价格、产品图片
- **供应商管理** - 供应商档案与采购价
- **合同清洗中心** - 合同文件导入、解析与校对
### 系统管理
- **用户管理** - 账号、角色与启停用
- **权限组管理** - 角色 → 权限组 → 权限点三级授权
- **数据迁移** - 业务数据按类别导出/导入(产品、客户、订单…),账号与系统设置不随包迁移
- **系统日志** - 登录、改密与数据变更审计
## 技术栈
### 后端
- Node.js + Express
- SQLite + better-sqlite3-multiple-ciphers
### 前端
- React 18
- React Router
- Vite
- 原生 CSS
## 快速开始
### 安装依赖
需要 Node.js 22 或更高版本。
```bash
# 后端
cd backend
npm install --ignore-scripts
# 前端
cd frontend
npm install
```
### 启动开发环境
```bash
# 启动后端服务器(终端1)
cd backend
npm start
# 启动前端开发服务器(终端2)
cd frontend
npm run dev
```
### 访问系统
- 前端开发地址: http://127.0.0.1:5300
- 后端 API 地址: http://127.0.0.1:4300
### 默认账号
- 用户名: `admin`
- 密码: `admin123`
**⚠️ 首次登录后请立即修改密码!**
## 项目结构
```
happy-export/
├── backend/ # 后端
│ ├── db/ # 数据库
│ │ ├── schema.sql # 数据库结构
│ │ └── db.js # 数据库连接
│ ├── lib/ # 工具库
│ ├── routes/ # API 路由
│ ├── data/ # 数据存储目录
│ ├── uploads/ # 上传文件
│ ├── server.js # 服务器入口
│ └── package.json
├── frontend/ # 前端
│ ├── src/
│ │ ├── components/ # 组件
│ │ ├── pages/ # 页面
│ │ ├── services/ # API 服务
│ │ ├── styles/ # 样式
│ │ ├── App.jsx # 主应用
│ │ └── main.jsx # 入口文件
│ ├── index.html
│ ├── vite.config.js
│ └── package.json
├── docs/ # 文档
└── README.md
```
## 数据库与配置
SQLite 单文件存储:
- 数据库文件:`backend/data/trade.db`
- 首次启动时自动建表
- 支持备份和迁移
- 数据目录与上传文件已在 `.gitignore` 中排除,不会入库
> **换机器 / 上云请不要直接覆盖 `trade.db`。** 整个库里有账号、权限、组织、设置(含大模型密钥)、
> 登录会话与审计日志,直接替换等于换掉一整套后台。请用「系统管理 · 数据迁移」按类别
> 导出业务数据包再导入,系统数据保持目标部署自己那份。详见 [业务数据导入导出](docs/data-transfer.md)。
> **已知限制:数据库当前未加密。** 驱动选用的是 `better-sqlite3-multiple-ciphers`
> (本身具备 SQLCipher 能力),但代码尚未设置加密密钥,`trade.db` 以明文存放。
> 部署到共享主机或不可信环境前,请自行启用磁盘加密。
后端可识别的环境变量(全部有代码默认值,不设置也能跑):
| 变量 | 默认值 | 说明 |
| --- | --- | --- |
| `DATA_DIR` | `backend/data` | 数据库与汇率缓存所在目录 |
| `PORT` | `4300` | 后端监听端口 |
| `SECURE_COOKIE` | `0` | HTTPS 部署设为 `1`,为会话 Cookie 添加 `Secure`;本地 HTTP 开发保持默认 |
| `CONTRACT_RETENTION_DAYS` | `7` | 合同导入原文件的保留天数 |
| `HAPPY_UPDATE_REPO` | `Drsakura/happy-export` | 网页更新使用的 GitHub 公共仓库 |
| `HAPPY_UPDATE_SERVICE` | `erp` | 网页更新重启的 systemd 服务名,不含 `.service` 后缀 |
> 注意:后端**没有引入 dotenv**,不会自动读取 `.env` 文件。
> 请通过系统环境变量、启动脚本或容器编排来设置上述变量。
## 网页更新与账号
管理员可在「设置 → 系统与更新」输入当前密码安装新版本,查看更新进度和日志。支持 Linux systemd 部署,包含构建、数据库备份、服务重启及失败后的应用恢复;首次需要部署包含此功能的版本。详见 [网页更新配置与恢复说明](docs/web-updates.md)。
所有用户可在「个人资料 → 修改用户名」验证当前密码后修改自己的登录名;业务数据归属不变,其它设备需重新登录。
## 开发计划
Phase 1 至 Phase 3 已完成;Phase 4、Phase 5 部分完成,未完成项保留为待办。
### Phase 1:基础框架 ✅
- [x] 项目结构搭建
- [x] 数据库设计
- [x] 前后端基础框架
- [x] 工作台页面
### Phase 2:供应商与产品管理 ✅
- [x] 迁移 SKU Manager 功能
- [x] 阶梯价格管理
- [x] 合同解析引擎
- [x] 产品图片管理
### Phase 3:客户 CRM
- [x] 客户详细页面
- [x] 联系人管理
- [x] 跟进活动时间线
- [ ] 商机管道视图(`deals` 表已建,前端界面待实现)
### Phase 4:订单管理
- [x] 订单创建和编辑
- [x] 订单状态管理
- [ ] 订单备注系统
- [ ] PDF 导出
### Phase 5:自动获客
- [x] AI 智能分析
- [x] 线索转化(客户公海领取)
- [ ] 集成 GoodJob 获客引擎
- [ ] 数据源适配
## 许可证
本项目采用 [GNU Affero 通用公共许可证 v3.0](LICENSE)(AGPL-3.0)。
你可以自由使用、修改和分发,但需要遵守 AGPL-3.0 的核心义务:
**如果你修改后的版本通过网络对外提供服务,必须向使用者公开你的完整源代码**,
并以同样的许可证授权。完整的条款见 [LICENSE](LICENSE)。
## 作者
Wayne