1. 项目背景与核心需求
校园物资采购是高校后勤管理中的重要环节,传统的人工招标方式存在效率低下、透明度不足等问题。我去年为某高校开发的这套系统,正是为了解决这些痛点。系统基于Python的Django框架构建,实现了从供应商注册、标书发布到在线投标、评标定标的完整电子化流程。
这个系统的核心价值在于:
- 将平均招标周期从原来的45天缩短至20天
- 实现全流程电子留痕,杜绝人为干预
- 通过智能比价功能为学校节省约15%的采购成本
- 建立供应商信用评价体系,优化采购生态
2. 技术架构设计
2.1 框架选型对比
我们最终选择Django而非Flask的主要原因:
- Django自带的Admin后台能快速搭建管理系统
- ORM对复杂查询的支持更完善(物资分类涉及多级关联)
- 内置的权限系统适合招标这种多角色场景
- 表单验证机制更健全(标书有严格的格式要求)
python复制# 典型的多角色权限控制实现
class User(AbstractUser):
USER_TYPE_CHOICES = (
(1, 'admin'),
(2, 'tender_manager'),
(3, 'supplier'),
(4, 'expert')
)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)
2.2 核心模块设计
系统采用六层架构:
- 表现层:Vue.js + ElementUI
- API层:Django REST framework
- 业务逻辑层:自定义service模块
- 数据访问层:Django ORM + Redis缓存
- 存储层:MySQL + MinIO文件存储
- 基础设施:Docker + Nginx
特别注意:招标文件存储需要符合《电子招标投标办法》要求,我们采用PDF/A格式并添加数字签名。
3. 关键功能实现
3.1 动态表单引擎
为适应不同物资的招标需求(教学设备/办公用品/食堂食材),开发了可配置的表单引擎:
python复制class BidTemplate(models.Model):
name = models.CharField(max_length=100)
fields = JSONField() # 存储表单字段定义
def render_form(self):
return {
'template_name': self.name,
'fields': json.loads(self.fields)
}
实际应用中,采购管理员可以通过后台动态添加:
- 技术参数表格
- 资质证明上传项
- 报价明细表等
3.2 智能评标算法
评标模块包含三个核心维度:
- 价格分(60%):采用分段线性插值法计算
- 技术分(30%):专家背靠背打分去掉最高最低
- 商务分(10%):根据历史履约记录自动计算
python复制def calculate_score(bid):
# 价格分计算示例
base_price = tender.budget * 0.8 # 最优报价基准
if bid.price <= base_price:
price_score = 60
else:
price_score = 60 * (base_price / bid.price)
# 综合得分
return price_score + bid.tech_score + bid.business_score
4. 安全与合规设计
4.1 关键安全措施
- 投标文件加密:使用AES-256加密,密钥分片存储
- 操作审计:记录所有敏感操作的MongoDB日志
- 防篡改校验:区块链存证关键操作哈希
- 围标识别:基于IP/设备指纹/投标时间聚类分析
4.2 高并发优化
针对开标时段的流量高峰,我们做了以下优化:
- 使用Celery异步处理文件解密
- 报价展示采用Server-Sent Events实时推送
- 数据库读写分离+Redis缓存热点数据
python复制# 使用select_for_update解决并发出价问题
with transaction.atomic():
tender = Tender.objects.select_for_update().get(pk=tender_id)
if tender.status != 'OPEN':
raise ValidationError("招标已结束")
Bid.objects.create(...)
5. 部署与运维实践
5.1 容器化部署方案
采用Docker Compose编排服务:
yaml复制version: '3'
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- redis
- db
celery:
build: .
command: celery -A core worker -l info
redis:
image: redis:alpine
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
5.2 性能监控配置
使用Prometheus+Grafana监控:
- 自定义指标:投标响应时间、并发用户数
- 预警规则:数据库连接数 > 80%时触发告警
- 日志收集:ELK分析操作日志
6. 典型问题解决方案
6.1 文件上传中断处理
通过断点续传技术解决大文件上传问题:
- 前端将文件分块(每块2MB)
- 服务端记录已接收的块序号
- 使用MD5校验文件完整性
javascript复制// 前端上传逻辑示例
const uploadChunk = (chunk) => {
const formData = new FormData();
formData.append('chunk', chunk);
formData.append('chunkNumber', chunkNumber);
return axios.post('/upload', formData);
}
6.2 历史数据迁移策略
旧系统迁移时需要注意:
- 供应商数据去重(统一社会信用代码校验)
- 招标项目状态映射(5种状态转换规则)
- 附件文件迁移(保持原有目录结构)
我们开发了专门的迁移工具包,包含:
- 数据清洗脚本
- 异常记录报告
- 回滚机制
7. 项目演进方向
在实际运行半年后,我们正在扩展:
- 移动端投标应用(uniapp跨平台开发)
- 智能合同生成(基于招标结果自动生成)
- 供应链金融对接(支持中标后融资)
- 大数据分析看板(采购趋势分析)
这个项目的关键经验是:招标系统不仅要考虑技术实现,更要吃透《招标投标法实施条例》等法规要求。我们在开发过程中邀请了法律顾问参与评审,确保每个业务流程都符合规范。