1. 项目背景与核心价值
最近在帮某中型企业实施设备采购管理系统时,基于Python+Vue的技术栈开发了一套完整的解决方案。这个系统完美解决了传统采购流程中的三大痛点:纸质审批效率低下、供应商管理混乱、资产台账更新滞后。采用前后端分离架构后,系统响应速度提升60%以上,采购周期从平均15天缩短到7天。
这套系统特别适合50-500人规模的企业使用,涵盖从采购申请、比价、合同签订到入库管理的全生命周期。技术选型上,后端采用Django+Flask双框架组合(Django处理核心业务流,Flask负责微服务接口),前端用Vue3+Element Plus实现响应式界面,PyCharm作为主力开发工具提供了完整的调试支持。
2. 技术架构设计解析
2.1 前后端分离方案
采用Vue作为前端框架主要考虑到其组件化开发优势。在实际项目中,我们将采购流程拆分为多个功能组件:
- 采购申请组件(包含动态表单生成)
- 比价看板组件(集成ECharts可视化)
- 合同审批工作流组件
- 设备二维码管理组件
后端API网关使用Flask构建,主要考虑到其轻量级特性适合处理高频接口请求。例如比价接口的响应时间控制在200ms内:
python复制# Flask比价接口示例
@app.route('/api/price/compare', methods=['POST'])
def price_compare():
req_data = request.get_json()
vendors = Vendor.query.filter(Vendor.goods_type == req_data['type']).all()
return jsonify([{
'vendor': v.name,
'price': float(v.base_price) * (1 - v.discount),
'delivery': v.avg_delivery_days
} for v in vendors])
2.2 Django核心模块设计
Django部分采用经典的MTV模式,关键模型包括:
python复制class PurchaseRequest(models.Model):
STATUS_CHOICES = [
('draft', '草稿'),
('submitted', '已提交'),
('approved', '已批准'),
('rejected', '已拒绝')
]
requester = models.ForeignKey(User, on_delete=models.PROTECT)
equipment = models.CharField(max_length=100)
quantity = models.PositiveIntegerField()
budget = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='draft')
created_at = models.DateTimeField(auto_now_add=True)
def get_approval_flow(self):
"""自定义审批流逻辑"""
if self.budget > 100000:
return ['部门经理', '财务总监', '总经理']
elif self.budget > 50000:
return ['部门经理', '财务经理']
else:
return ['部门主管']
关键技巧:Django的Model设计要预留足够的扩展字段,比如我们后来增加的urgent_level字段就避免了数据库结构变更
3. 核心功能实现细节
3.1 采购审批工作流
实现多级审批的关键是状态机设计。我们采用django-fsm库管理状态流转:
python复制from django_fsm import FSMField, transition
class PurchaseApproval(models.Model):
@transition(field=status, source='draft', target='submitted')
def submit(self):
"""提交审批"""
self.submit_time = timezone.now()
@transition(field=status, source='submitted', target='approved',
permission=lambda instance, user: user in instance.get_approvers())
def approve(self, user):
"""通过审批"""
self.approver = user
self.approve_time = timezone.now()
前端对应实现审批流程图时,使用Vue的draggable组件实现审批节点拖拽配置:
vue复制<template>
<draggable v-model="approvalFlow" @end="saveFlow">
<div v-for="(step, index) in approvalFlow" :key="index">
<el-tag>{{ step.role }}</el-tag>
<el-input-number v-model="step.threshold" />
</div>
</draggable>
</template>
3.2 供应商智能匹配
系统内置的供应商评价算法考虑五个维度:
- 历史报价偏差率(20%权重)
- 交货准时率(30%权重)
- 质量合格率(25%权重)
- 售后服务评分(15%权重)
- 合作年限系数(10%权重)
计算逻辑封装在Flask微服务中:
python复制def calculate_vendor_score(vendor_id):
vendor = Vendor.query.get(vendor_id)
history = PurchaseHistory.query.filter_by(vendor_id=vendor_id)
score = (
0.2 * (1 - vendor.price_deviation) +
0.3 * vendor.on_time_delivery_rate +
0.25 * vendor.quality_pass_rate +
0.15 * vendor.service_score +
0.1 * min(1, vendor.cooperation_years/10)
)
return round(score * 100, 2)
4. 开发环境配置指南
4.1 PyCharm专业版配置
推荐使用PyCharm Professional版本,关键配置项:
- 启用Django支持:File > Settings > Languages & Frameworks > Django
- 配置JavaScript调试:Run > Edit Configurations > 添加JavaScript Debug
- 数据库工具连接:Database面板 > 添加PostgreSQL连接
- 安装必备插件:
- Vue.js
- Django
- Rainbow CSV
- TabNine(AI代码补全)
4.2 前后端联调技巧
后端跨域配置建议使用django-cors-headers:
python复制# settings.py
INSTALLED_APPS += ['corsheaders']
MIDDLEWARE.insert(2, 'corsheaders.middleware.CorsMiddleware')
CORS_ORIGIN_WHITELIST = ['http://localhost:8080']
前端开发服务器代理配置(vue.config.js):
javascript复制module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8000',
changeOrigin: true,
pathRewrite: {'^/api': ''}
}
}
}
}
5. 典型问题排查实录
5.1 并发审批冲突
现象:多人同时审批时出现状态覆盖
解决方案:采用select_for_update()实现行级锁:
python复制def approve_request(request_id):
with transaction.atomic():
req = PurchaseRequest.objects.select_for_update().get(pk=request_id)
if req.status == 'submitted':
req.status = 'approved'
req.save()
5.2 大文件上传超时
现象:设备说明书等大文件上传失败
优化方案:
- 前端分片上传(使用vue-upload-component)
- 后端Nginx调优:
nginx复制client_max_body_size 50M;
proxy_read_timeout 300s;
5.3 数据库查询性能
慢查询优化案例:
python复制# 优化前(N+1查询问题)
vendors = Vendor.objects.all()
for v in vendors:
print(v.recent_orders.count())
# 优化后
vendors = Vendor.objects.prefetch_related(
Prefetch('order_set',
queryset=Order.objects.filter(create_time__gte=timezone.now()-timedelta(days=30)),
to_attr='recent_orders')
)
6. 项目部署方案
6.1 生产环境架构
推荐部署方案:
code复制前端服务:Nginx(80端口) → Vue静态文件
↓ 代理
后端服务:Gunicorn(8000端口) → Django
↓
Celery(异步任务)
↓
PostgreSQL + Redis
6.2 Docker编排配置
docker-compose.yml关键配置:
yaml复制version: '3'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- redis
- db
vue:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./frontend/dist:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
部署经验:建议将Django的ALLOWED_HOSTS设置为动态配置,避免每次环境变更需要重新构建镜像
7. 扩展功能建议
根据实际项目反馈,后续可增加:
- 采购风险预警模块(机器学习预测价格波动)
- 供应商门户(SSO集成)
- 移动端审批(Uniapp跨平台方案)
- 与财务系统对接(生成凭证接口)
在PyCharm中开发时,可以创建专门的运行配置来管理这些扩展模块。比如为机器学习模块单独配置Python解释器环境:
code复制Run > Edit Configurations >
添加Python配置 → 选择conda虚拟环境