每年的毕业设计季,都会有一大批"基于SpringBoot的XX管理系统"课题涌出来,其中合同信息管理系统的出场率相当高。原因很简单:合同管理是企业刚需,业务逻辑清晰,CRUD加文件上传就能撑起一个完整课题,又不涉及高并发、复杂算法,特别适合做课程设计或毕业设计。这类课题的交付包通常长这样:源码 + lw(论文/课程设计报告)+ 部署文档 + 讲解视频,听起来很齐全,但很多同学拿到手之后,第一反应是打开IDEA直接跑,跑不起来就慌,跑起来也不知道每一层代码在干嘛,等答辩老师一问就露馅。
这篇文章我结合带过多届课程设计的经验,把这套系统从"为什么这么设计"到"怎么部署跑通",再到"论文怎么写、答辩怎么讲"完整拆一遍。适合两类人看:一类是拿到这套课题包、需要交作业并通过答辩的学生;另一类是真的想做一个合同管理小系统用于实际办公场景的开发者。看完你至少能回答三个问题:这套系统到底做了什么?每段核心代码为什么这么写?部署和答辩环节最容易在哪些地方栽跟头?
1. 别急着敲代码:先搞清楚合同管理系统到底要管什么
1.1 传统合同管理方式的三个真实痛点
很多人以为合同管理就是"记录一下合同的基本信息",其实做系统之前,得先理解企业为什么需要它。我接触过不少中小企业,它们的合同管理大多是这个状态:
第一,合同信息散落在Excel和多张纸面上,业务员手里一份、财务一份、行政一份,版本对不上,查一份合同要翻半天聊天记录和邮箱。第二,合同原件(PDF、Word、扫描件)存在个人电脑里,人走了文件也跟着走了,后续续签、付款、举证时找不到依据。第三,合同到期和付款节点完全靠人记,忙起来就忘,续签遗漏可能造成事实合同,付款逾期会产生违约金。
这三个痛点对应到系统上,就是三块核心功能:合同台账(统一录入、查询、编辑)、合同附件(上传、下载、归档)、到期提醒(按日期自动扫描并提示)。别小看这三件事,很多看似功能复杂的系统,实际高频使用的也就是这三板斧。做课题时把这三块做扎实,比堆一堆花哨但无用的功能更有说服力。
1.2 系统的功能边界:哪些是该做的,哪些是画蛇添足
不少同学会陷入一个误区:觉得功能越多越好,于是硬塞了一堆"电商式"能力,比如在线支付、电子签章、流程引擎。结果代码量爆炸,自己也说不清楚,答辩时被问几个细节就崩了。我建议这套系统守住以下边界:
- 用户登录与权限区分:管理员和普通用户,普通用户只管自己名下的合同,管理员能看到全部。
- 合同信息管理:新增、修改、删除、分页查询、关键字模糊搜索、按状态和日期筛选。
- 合同附件管理:单文件上传、下载、删除,文件与合同记录一一关联。
- 合同状态管理:草稿 -> 审批中 -> 已生效 -> 已到期 -> 已归档,用状态字段驱动,不过度设计。
- 到期提醒:定时任务扫描30天内到期的合同,在首页和列表页用状态标识出来。
- 首页统计:合同总数、总金额、各状态数量,几个聚合查询搞定。
把这几块做好了,就是一个逻辑完整、能演示、能答辩的系统。电子签章、多级审批这类扩展,写进论文的"未来展望"就够了,不要硬塞进前端页面。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与表结构设计:这套系统的骨架怎么搭的
2.1 为什么是SpringBoot + MyBatis-Plus + MySQL + Layui
这套课题包的技术栈几乎是固定的,但它能成为标配是有原因的。SpringBoot最大的价值是"约定大于配置",内嵌Tomcat,一个Application类就能启动,不需要把WAR部署到外部容器,对课程设计非常友好——你只需要关注业务代码,不会被一堆XML配置淹没。MyBatis-Plus在MyBatis基础上封装了单表CRUD,Mapper XML都不用写,自带分页插件,分页查询这种高频操作几行代码就能搞定。MySQL是通用性最强的数据库,答辩老师基本都会用,不会因为数据库太冷门被质疑。
前端为什么用Layui或者Thymeleaf,而不上Vue全家桶?如果搞前后端分离,需要处理跨域、Token、路由守卫一堆问题,对课题项目来说复杂度反而上去了。Layui是国内老牌简洁UI框架,表格、分页、弹窗都封装好了,直接用HTML加JS就能实现管理后台,演示时还很流畅。用Thymeleaf则走服务端渲染,每个页面就是一个模板,代码更直观。当然,如果你本身Vue很熟,用Vue + Element UI写前端也完全没问题,切记别为了炫技给自己挖坑。
2.2 核心表结构:合同表和用户表怎么设计
数据库设计是论文里必写的一章,也是答辩老师最爱问的地方。以我的经验,这套系统两张核心表就够了,如果需要,再加一张附件表也行,但通常没必要——把文件路径直接存在合同表里更简单直观。
sql复制CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '登录名',
`password` varchar(100) NOT NULL COMMENT '密码(MD5加密存储)',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`role` tinyint(4) DEFAULT '1' COMMENT '角色:1普通用户,2管理员',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
sql复制CREATE TABLE `contract` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`contract_no` varchar(50) NOT NULL COMMENT '合同编号',
`contract_name` varchar(200) NOT NULL COMMENT '合同名称',
`party_a` varchar(100) DEFAULT NULL CO
