1. 项目背景与核心需求
高校教材管理一直是教务工作中既基础又复杂的环节。记得去年帮本地一所师范院校优化教材管理流程时,他们的教务主任拿着厚厚一摞Excel表格向我吐槽:"每学期开学前两个月就开始统计教材,结果还是会出现漏订、错订,学生领书时经常要排队两三个小时..."这个场景正是催生本项目的现实需求。
传统教材征订管理普遍存在三个痛点:
- 信息孤岛现象严重:院系、教师、书商、财务部门数据不互通
- 人工统计错误率高:纸质表格传递导致版本混乱,重复录入易出错
- 流程可视化程度低:无法实时跟踪教材采购状态,应急调整滞后
我们设计的这套系统要实现四个核心目标:
- 建立全流程数字化管理:从教师提交书单到仓库发放的完整闭环
- 实现多角色协同工作:教师、教务员、书商、学生各司其职
- 内置智能校验机制:教材版本冲突检测、库存预警、预算超支提醒
- 提供决策支持数据:教材使用率分析、采购成本统计、供应商评估
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计解析
2.1 前后端分离架构选择
采用SpringBoot+Vue的组合主要基于三点考量:
- 迭代效率:前端可独立开发调试,不影响后端API演进
- 性能优化:Nginx静态资源托管+Vue路由懒加载提升响应速度
- 人才储备:高校IT部门普遍具备Java和Web前端开发能力
技术栈全景图:
code复制[前端]
Vue 3 + Element Plus + Axios
Vue Router实现权限路由动态加载
ECharts可视化教材使用数据
[后端]
SpringBoot 2.7 + MyBatis-Plus
JWT + Spring Security权限控制
Redis缓存热点数据(如教材目录)
Quartz定时生成征订报表
[数据库]
MySQL 8.0(主库) + MySQL 5.7(备库)
分表策略:按学年拆分征订记录表
2.2 关键业务模块设计
征订流程状态机
java复制// 简化的状态枚举定义
public enum BookOrderStatus {
DRAFT("草稿", Teacher.class),
APPROVED("已审核", AcademicAffairs.class),
CONFIRMED("已确认", Supplier.class),
DELIVERING("配送中", Logistics.class),
COMPLETED("已完成", Warehouse.class),
REJECTED("已驳回", Teacher.class);
// 状态处理器设计模式实现
public interface StatusHandler {
void handle(OrderContext context);
}
}
并发控制方案
采用乐观锁解决征订高峰期的库存冲突:
sql复制UPDATE textbook_stock
SET quantity = quantity - #{orderNum}
WHERE isbn = #{isbn} AND quantity >= #{orderNum}
3. 核心功能实现细节
3.1 智能教材匹配系统
教师端操作流程:
- 输入课程代码自动带出历史使用教材
- 系统推荐近三年同类课程热门教材
- 版本冲突检测(同一课程不同班级使用不同版本时预警)
关键技术实现:
vue复制<template>
<el-autocomplete
v-model="courseCode"
:fetch-suggestions="queryCourse"
@select="loadHistoryBooks"
>
<template #suggestion="{ item }">
<span>{{ item.code }} - {{ item.name }}</span>
</template>
</el-autocomplete>
</template>
<script>
// 课程模糊搜索实现
const queryCourse = async (queryString, cb) => {
const res = await api.searchCourses(queryString)
cb(res.data.map(v => ({
value: `${v.code} ${v.name}`,
code: v.code,
name: v.name
})))
}
</script>
3.2 征订审批工作流
设计亮点:
- 动态审批路径:根据教材总金额自动路由
- <5万元:教研室主任审批
- 5-10万元:院系主任审批
-
10万元:教务处审批
- 电子签章系统:审批人使用USB Key进行数字签名
审批流程图解:
code复制教师提交 → 系统预审(格式校验) → 金额判断 → 对应审批人 → 书商确认
↑____________驳回修改___________|
4. 典型问题排查实录
4.1 批量导入内存溢出
现象:导入5000+教材信息时服务崩溃
原因:默认JVM堆内存不足 + MyBatis一级缓存累积
解决方案:
- 增加JVM参数:-Xms512m -Xmx1024m
- 分批次提交:
java复制// 每处理100条提交一次
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
for (int i = 0; i < list.size(); i++) {
mapper.insert(list.get(i));
if (i % 100 == 0 || i == list.size() - 1) {
sqlSession.commit();
sqlSession.clearCache();
}
}
} finally {
sqlSession.close();
}
4.2 跨域Cookie丢失
现象:前端域名course.jwc.edu.cn,后端api.jwc.edu.cn
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://course.jwc.edu.cn")
.allowCredentials(true)
.allowedMethods("*");
}
}
5. 部署优化实践
5.1 前端性能调优
- 启用Gzip压缩(Nginx配置):
nginx复制gzip on;
gzip_types text/plain application/xml application/javascript;
gzip_min_length 1024;
- 路由懒加载:
javascript复制const BookList = () => import('./views/BookList.vue')
5.2 数据库连接池配置
推荐使用HikariCP配置:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
idle-timeout: 30000
connection-timeout: 5000
validation-timeout: 1000
这套系统在某高校运行一学年后,教材发放差错率从6.8%降至0.3%,教务人员工作效率提升约40%。特别值得一提的是,通过系统积累的教材使用数据,学校发现约有15%的教材三年内从未被学生翻阅,这为后续的课程改革提供了重要参考依据。
