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

6.3 KiB
Raw Blame History

外贸供应链管理系统

一个专为外贸企业设计的供应链与客户管理系统。

功能模块

工作台

  • 工作日历:日程安排、节日标注、今日待办
  • 汇率计算器与时区时钟
  • AI 助手(可接入自有模型)

业务管理

  • 询盘管理 - 询盘登记、明细与跟进
  • 客户报价单管理 - 报价单编制、英文大写金额
  • PI合同管理 - PI 合同台账、收款条件
  • 订单管理 - 订单跟踪与状态管理

客户管理

  • 我的客户 - 客户信息、联系人、跟进记录
  • 新客开发 - 线索登记、AI 智能分析
  • 客户公海 - 未分配客户的领取与分配

采购管理

  • 采购单管理 - 采购单登记与跟踪
  • 产品管理 - SKU/SPU 两层管理、包装参数、阶梯价格、产品图片
  • 供应商管理 - 供应商档案与采购价
  • 合同清洗中心 - 合同文件导入、解析与校对

系统管理

  • 用户管理 - 账号、角色与启停用
  • 权限组管理 - 角色 → 权限组 → 权限点三级授权
  • 数据迁移 - 业务数据按类别导出/导入(产品、客户、订单…),账号与系统设置不随包迁移
  • 系统日志 - 登录、改密与数据变更审计

技术栈

后端

  • Node.js + Express
  • SQLite + better-sqlite3-multiple-ciphers

前端

  • React 18
  • React Router
  • Vite
  • 原生 CSS

快速开始

安装依赖

需要 Node.js 22 或更高版本。

# 后端
cd backend
npm install --ignore-scripts

# 前端
cd frontend
npm install

启动开发环境

# 启动后端服务器(终端1)
cd backend
npm start

# 启动前端开发服务器(终端2)
cd frontend
npm run dev

访问系统

默认账号

  • 用户名: 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。 整个库里有账号、权限、组织、设置(含大模型密钥)、 登录会话与审计日志,直接替换等于换掉一整套后台。请用「系统管理 · 数据迁移」按类别 导出业务数据包再导入,系统数据保持目标部署自己那份。详见 业务数据导入导出。

已知限制:数据库当前未加密。 驱动选用的是 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 部署,包含构建、数据库备份、服务重启及失败后的应用恢复;首次需要部署包含此功能的版本。详见 网页更新配置与恢复说明。

所有用户可在「个人资料 → 修改用户名」验证当前密码后修改自己的登录名;业务数据归属不变,其它设备需重新登录。

开发计划

Phase 1 至 Phase 3 已完成;Phase 4、Phase 5 部分完成,未完成项保留为待办。

Phase 1:基础框架 ✅

  • 项目结构搭建
  • 数据库设计
  • 前后端基础框架
  • 工作台页面

Phase 2:供应商与产品管理 ✅

  • 迁移 SKU Manager 功能
  • 阶梯价格管理
  • 合同解析引擎
  • 产品图片管理

Phase 3:客户 CRM

  • 客户详细页面
  • 联系人管理
  • 跟进活动时间线
  • 商机管道视图(deals 表已建,前端界面待实现)

Phase 4:订单管理

  • 订单创建和编辑
  • 订单状态管理
  • 订单备注系统
  • PDF 导出

Phase 5:自动获客

  • AI 智能分析
  • 线索转化(客户公海领取)
  • 集成 GoodJob 获客引擎
  • 数据源适配

许可证

本项目采用 GNU Affero 通用公共许可证 v3.0(AGPL-3.0)。

你可以自由使用、修改和分发,但需要遵守 AGPL-3.0 的核心义务: 如果你修改后的版本通过网络对外提供服务,必须向使用者公开你的完整源代码, 并以同样的许可证授权。完整的条款见 LICENSE。

作者

Wayne