1. 项目背景与核心需求
学生用品采购系统是高校后勤管理中的重要一环。传统的手工登记、Excel表格管理方式存在数据易丢失、统计效率低下、审批流程不透明等问题。基于SpringBoot的JavaWeb解决方案能够有效解决这些痛点。
这个系统需要满足三个层级的用户需求:
- 学生端:在线提交采购申请、查看审批进度、接收领取通知
- 教师/辅导员端:审核采购申请、批量导出采购清单
- 管理员端:管理商品目录、设置采购规则、生成统计报表
实际开发中发现,不同院系的采购审批流程差异很大。建议在设计工作流引擎时采用可配置的审批链模式,而非硬编码流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 基础技术栈选型
采用经典的三层架构:
- 前端:Thymeleaf + Bootstrap(兼顾管理端复杂表格和学生端简洁界面)
- 后端:SpringBoot 2.7 + Spring MVC + Spring Security
- 数据库:MySQL 8.0(需要支持JSON字段存储动态表单数据)
java复制// 典型Controller结构示例
@Controller
@RequestMapping("/purchase")
@PreAuthorize("hasRole('STUDENT')")
public class PurchaseController {
@Autowired
private PurchaseService purchaseService;
@PostMapping("/apply")
public String apply(@Valid PurchaseForm form) {
// 业务逻辑处理
}
}
2.2 核心功能模块
-
采购申请模块
- 动态表单设计(支持不同品类不同字段)
- 附件上传(发票扫描件等)
- 草稿自动保存功能
-
审批工作流引擎
- 基于Activiti的可视化流程设计
- 多级审批路由规则
- 审批意见留痕
-
库存联动系统
- 实时库存检查
- 采购到货自动入库
- 低库存预警
3. 数据库设计要点
3.1 主要表结构
| 表名 | 关键字段 | 说明 |
|---|---|---|
| t_item | id, name, spec, unit_price | 商品主数据 |
| t_purchase | id, applicant_id, status, total_amount | 采购单头 |
| t_purchase_item | id, purchase_id, item_id, quantity | 采购明细 |
| t_approval | id, purchase_id, approver_id, result | 审批记录 |
3.2 特殊设计考虑
- 历史价格追踪:在t_item_price表中记录每次采购的实际成交价
- 审批链版本控制:使用version字段管理审批流程变更
- 软删除实现:所有表添加is_deleted字段而非物理删除
sql复制-- 典型查询示例:待审批列表
SELECT p.*, u.real_name
FROM t_purchase p
JOIN t_user u ON p.applicant_id = u.id
WHERE p.status = 'PENDING_APPROVAL'
AND p.id IN (
SELECT purchase_id FROM t_approval_flow
WHERE approver_id = #{currentUserId}
)
ORDER BY p.create_time DESC;
4. 关键实现细节
4.1 防止重复提交设计
- 前端防抖:提交按钮添加300ms冷却时间
- 后端幂等:使用Redis存储请求指纹(用户ID+表单摘要+时间窗口)
- 数据库唯一约束:同一用户相同商品组合的未完成采购单限制
java复制// 幂等控制示例
public String submitPurchase(PurchaseForm form) {
String requestKey = "purchase:" + userId + ":" + DigestUtils.md5Hex(form.toString());
if (redisTemplate.opsForValue().setIfAbsent(requestKey, "1", 5, TimeUnit.MINUTES)) {
// 正常处理逻辑
} else {
throw new BusinessException("请勿重复提交");
}
}
4.2 审批流动态配置
采用规则引擎实现:
- 金额分级:不同金额走不同审批路径
- 特殊品类:实验器材需要实验室主任审批
- 紧急采购:可设置绿色通道
实际测试发现,超过3级的审批链会导致用户体验显著下降。建议通过金额阈值自动升级到更高级别审批人,而非简单追加审批环节。
5. 部署与性能优化
5.1 生产环境配置
- JVM参数:
bash复制
-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m - 数据库连接池:
yaml复制spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000
5.2 缓存策略
- 商品目录:Redis缓存 + 定时刷新
- 审批人列表:Guava Cache(5分钟过期)
- 统计报表:Ehcache二级缓存
6. 安全防护措施
-
XSS防护:
- 前端:DOMPurify过滤
- 后端:Jackson的@JsonSerialize注解
-
CSRF防护:
html复制<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> -
数据权限控制:
java复制@PostFilter("filterObject.departmentId == authentication.principal.departmentId") public List<Purchase> getMyDepartmentPurchases() { // ... }
7. 扩展性设计
-
API版本控制:
java复制@GetMapping(value = "/v1/items") @GetMapping(value = "/v2/items") -
插件式架构:
- 定义采购策略接口
- 通过Spring的@Conditional按需加载实现类
-
监控端点:
yaml复制management: endpoints: web: exposure: include: health,metrics,purchasestats
我在实际部署中发现,采购高峰时段(开学季)的系统负载是平时的5-7倍。建议提前做好以下准备:
- 对采购申请接口进行压力测试
- 准备数据库读写分离方案
- 审批通知邮件采用异步队列发送
- 关键操作增加操作日志审计功能
