b3f3095d53d6da2cced5891ec921d97c0a13f691
dealerhub · 经销商 SaaS
类似管家婆的进销存+财务+分销管理 SaaS。技术栈:Django 5.2 + DRF + adrf + Granian + PostgreSQL。
目录结构
dealerhub/
├── PLAN.md # 总体实施计划(5 个阶段)
├── README.md # 本文件
└── backend/ # Django 后端
├── manage.py
├── requirements.in
├── pytest.ini
├── conftest.py
├── config/ # 项目配置(settings/{base,dev,prod,test}.py + asgi.py)
├── apps/ # 业务应用
│ ├── core/ # 多租户/多组织/审计日志
│ └── catalog/ # 商品中心
├── tests/ # 集成测试
└── .env
快速开始
1. 安装依赖(本机已有 Django 5.2.16 + DRF + adrf + Granian 2.8)
pip install -r backend/requirements.txt
2. 初始化数据库(SQLite)
cd backend
python manage.py migrate
python manage.py seed_initial_data
python manage.py createsuperuser
3. 启动 Granian(ASGI)
cd backend
sh infra/scripts/run_dev.sh
# 或直接:
DJANGO_SETTINGS_MODULE=config.settings.dev granian config.asgi:application \
--interface asgi --host 0.0.0.0 --port 8000 --reload
4. 验证
curl http://127.0.0.1:8000/api/v1/ping/
返回示例:
{
"ok": true,
"service": "dealerhub",
"ts": "2026-09-07T00:30:00+00:00",
"versions": {
"python": "3.12.x",
"django": "5.2.x",
"granian": "2.8.x"
}
}
5. 运行测试
cd backend
pytest
6. 构建生产镜像(自包含前端)
生产镜像使用仓库根目录作为构建上下文,Docker 多阶段构建会自动编译 Vue 前端并把产物交给 Django:
# 在仓库根目录执行
DJANGO_SECRET_KEY='replace-me' POSTGRES_PASSWORD='replace-me' \\
docker compose -f backend/infra/docker/docker-compose.yml config
DJANGO_SECRET_KEY='replace-me' POSTGRES_PASSWORD='replace-me' \\
docker compose -f backend/infra/docker/docker-compose.yml build backend
本地演示账套:
cd backend
python manage.py seed_demo --reset
python manage.py seed_full_finance
seed_demo --reset 会重建商城、库存、销售、采购、应收和六档账龄数据;seed_full_finance 为全部启用租户初始化科目和会计期间。生产环境请通过部署密钥注入 DJANGO_SECRET_KEY 与 POSTGRES_PASSWORD,不要把凭据写进仓库。
当前阶段
AGI 迭代基线(2026-09-11):进销存、财务、商城和扩展模块已形成可运行闭环,当前本地回归为 460 passed / 4 skipped。
- ✅ Django + DRF + adrf + Granian 异步链路打通
- ✅ 多租户数据过滤、JWT 鉴权与审计日志
- ✅ 商品、批次、单位换算、自动取价、最低售价、抹零、信用额度
- ✅ 销售/采购开单、过账、库存 FEFO、应收应付与财务报表
- ✅ 商城、渠道、通知预警、开放 API、打印和 AI 录单
- ✅ Docker 多阶段构建:自动编译前端并复制到 Django 静态目录
- ✅ 前端交易金额/单位换算回归测试与
npm test - ⏳ PostgreSQL 并发用例需在可用的 PG 环境执行(本地 SQLite 回归跳过 4 项)
多租户调用示例
# 1. 拿 token
TOKEN=$(curl -s -X POST http://127.0.0.1:8000/api/v1/auth/token/ \
-H "Content-Type: application/json" \
-d '{"username":"alice","password":"alice12345"}' | jq -r .access)
# 2. 带 X-Tenant-Id 调业务 API
curl -H "Authorization: Bearer $TOKEN" \
-H "X-Tenant-Id: default" \
http://127.0.0.1:8000/api/v1/catalog/products/
架构预留点
详见 PLAN.md §"关键架构决策记录"。已落地:
- ✅ 多租户单数据库(
tenant_id列隔离) - ✅ 多组织预留(
Org模型 +org_path) - ✅ 软删除(
is_deleted) - ✅ 扩展 JSON(
ext_data) - ✅ 来源渠道(
source_channel,预留 AI/电商对接)
待落地(阶段 3):
- ⏳ 多币种/多税率
- ⏳ 财务模块对接接口(LedgerAdapter)
- ⏳ 电商平台对接(ChannelAdapter)
- ⏳ 工作流引擎(StateMachine 服务化)
- ⏳ 插件钩子(HookRegistry)
- ⏳ 报表元数据
- ⏳ AI Agent 接入点
- ⏳ 开放 API + Webhook
Languages
Python
79.6%
Vue
17.1%
HTML
1.3%
JavaScript
1.2%
Shell
0.8%