第一章:项目初始化与环境搭建

各位同学,欢迎来到《手写ERP系统核心模块实战》的第一章。

说实话,很多新手做项目,上来就写代码。结果呢?写到一半发现环境冲突,数据库选错了,目录乱成一锅粥。我见过太多这样的案例了。所以这一章,咱们先把地基打牢。

1.1 Python虚拟环境搭建

为什么要用虚拟环境?说白了,就是隔离依赖。

你想想看,你电脑上可能同时有Django 3.2和Django 4.2的项目。如果没有虚拟环境,它们会打架。我当年刚入行时,就因为全局装了某个包,导致公司老项目直接崩了。嗯,从那以后,我养成了每个项目必建虚拟环境的习惯。

我个人习惯用 venv,Python 3.3+ 自带,轻量又好用。当然,你也可以用 condapoetry,看团队习惯。

创建虚拟环境:

# 进入项目目录
mkdir erp-system
cd erp-system

# 创建虚拟环境(我习惯叫 venv)
python -m venv venv

# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate

# 验证是否激活
which python  # 应该指向 venv 目录下的 python

小技巧: 我习惯在项目根目录放一个 .python-version 文件,写上 Python 版本号。这样队友一看就知道该用哪个版本。

1.2 Django vs FastAPI:框架选型

这个问题,几乎每个做ERP的人都会纠结。我直接说结论:

维度 Django FastAPI
学习曲线 中等(自带ORM、Admin) 低(轻量,但需自己搭ORM)
ORM 内置,成熟稳定 需搭配 SQLAlchemy 或 Tortoise
Admin后台 自带,开箱即用 需第三方库(如 FastAPI Admin)
性能 中等(同步为主) 高(原生异步)
社区生态 极其丰富 快速成长中
适合场景 传统ERP、CMS、后台管理 高并发API、微服务

我个人建议:做ERP系统,首选Django。为什么?

  • ERP的核心是数据管理和业务流程,不是高并发。
  • Django自带Admin后台,省去你写大量CRUD的时间。
  • Django ORM的迁移机制,在ERP这种长生命周期项目中太重要了。

当然,如果你要做的是ERP的API网关,或者需要处理大量实时数据,那FastAPI更合适。我在一个项目中就遇到过这种情况——核心业务用Django,对外API用FastAPI,两者通过消息队列通信。

避坑指南: 我曾经见过一个团队,为了追求“新技术”,用FastAPI做整个ERP。结果开发到一半发现,没有现成的Admin后台,权限管理要自己写,数据迁移要自己配。最后工期翻了一倍。所以,选框架别只看技术热度,要看项目类型。

1.3 数据库选型:PostgreSQL vs MySQL

这个问题,我直接给结论:ERP系统,选PostgreSQL

为什么?我给你列几个关键点:

  • 事务支持: PostgreSQL的MVCC实现更成熟,适合ERP这种高并发读写场景。
  • 复杂查询: ERP经常需要多表关联、窗口函数、CTE。PostgreSQL的优化器比MySQL强太多。
  • JSON支持: ERP中经常需要存一些非结构化数据(比如配置、扩展字段)。PostgreSQL的JSONB字段,比MySQL的JSON好用得多。
  • 扩展性: 支持分区表、并行查询、物化视图。这些在ERP报表场景下太实用了。

当然,MySQL也不是不能用。如果你的ERP规模很小(比如几十个用户),或者团队对MySQL更熟悉,那用MySQL也没问题。但如果你要做的是企业级ERP,我建议直接上PostgreSQL。

安装与配置:

# macOS (Homebrew)
brew install postgresql@15
brew services start postgresql@15

# Ubuntu/Debian
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl start postgresql

# 创建数据库
sudo -u postgres createdb erp_db

# 设置密码(重要!)
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'your_password';"

个人经验: 我习惯在开发环境用 docker-compose 跑PostgreSQL,这样版本切换方便,也不会污染宿主机。生产环境再用云数据库。

1.4 项目目录结构设计

目录结构这东西,没有标准答案。但我有一套经过多个项目验证的模板,分享给你:

erp-system/
├── apps/                    # 所有业务模块
│   ├── common/              # 公共模块(基础模型、工具类)
│   ├── inventory/           # 库存管理
│   ├── sales/               # 销售管理
│   ├── purchase/            # 采购管理
│   ├── finance/             # 财务管理
│   └── hr/                  # 人力资源管理
├── config/                  # 配置文件
│   ├── settings/            # Django settings 分环境
│   │   ├── base.py          # 公共配置
│   │   ├── dev.py           # 开发环境
│   │   └── prod.py          # 生产环境
│   ├── urls.py              # 主路由
│   └── wsgi.py              # WSGI 入口
├── docs/                    # 文档
├── scripts/                 # 运维脚本
├── static/                  # 静态文件
├── templates/               # 模板文件
├── tests/                   # 测试
├── venv/                    # 虚拟环境(不提交)
├── .env                     # 环境变量(不提交)
├── .gitignore               # Git 忽略规则
├── requirements.txt         # 依赖清单
├── manage.py                # Django 管理脚本
└── README.md                # 项目说明

这个结构有几个好处:

  • 模块化: 每个业务模块独立成app,互不干扰。
  • 配置分离: 开发、测试、生产环境配置分开,避免误操作。
  • 测试独立: 所有测试放在一起,方便CI/CD集成。

避坑指南: 我曾经见过一个项目,把所有代码都塞在 apps/ 下面,连配置文件都放进去。结果后来要拆分微服务,发现耦合得一塌糊涂。所以,从一开始就要把配置、脚本、文档和业务代码分开。

1.5 Git版本控制初始化

Git是每个开发者的基本功。但很多人只停留在 git addgit commit 上。我来说说ERP项目应该怎么用Git。

首先,创建 .gitignore 文件:

# Python
__pycache__/
*.py[cod]
*.so
*.egg-info/
dist/
build/

# 虚拟环境
venv/
.venv/

# 环境变量
.env
.env.local

# IDE
.idea/
.vscode/
*.swp
*.swo

# 数据库
*.sqlite3
*.db

# 操作系统
.DS_Store
Thumbs.db

然后,初始化仓库:

git init
git add .
git commit -m "chore: 初始化ERP项目结构"

# 关联远程仓库(以GitHub为例)
git remote add origin git@github.com:yourname/erp-system.git
git push -u origin main

我个人习惯用 Git Flow 分支模型:

  • main:生产分支,只接受合并请求。
  • develop:开发分支,日常开发基于此。
  • feature/*:功能分支,从develop拉出,完成后合并回develop。
  • release/*:发布分支,从develop拉出,测试通过后合并到main和develop。
  • hotfix/*:紧急修复分支,从main拉出,修复后合并到main和develop。

小技巧: 我习惯在每次commit时,写清楚「做了什么」和「为什么做」。比如 feat: 添加库存盘点功能,支持批量导入导出。这样半年后回头看,还能知道当时的设计意图。

本章小结

好了,第一章的内容就到这里。我们做了几件事:

  • 搭建了Python虚拟环境
  • 选定了Django作为主框架
  • 选择了PostgreSQL作为数据库
  • 设计了项目目录结构
  • 初始化了Git版本控制

这些看起来都是基础工作,但基础不牢,地动山摇。我见过太多项目,因为环境问题、目录混乱、版本失控而返工。所以,别嫌麻烦,把这些做好,后面写代码会顺畅很多。

下一章,我们开始搭建Django项目,配置数据库连接,并跑通第一个Hello World页面。到时候见。


公众号:蓝海资料掘金营,微信deep3321