毕设实战:基于Spring Boot的社区养老服务平台,从需求到测试全流程拆解,助你轻松通关!
家人们谁懂啊!做社区养老服务平台毕设时,光用户表和申请表的外键关联就让我卡了整整3天——一开始没设计审核流程,用户申请服务后数据全乱套,导师看了直接说“重新设计数据库关系”😫。后来踩了无数坑才总结出这套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全讲透,让你轻松搞定毕设!
一、先搞懂“社区养老服务平台要啥”!需求分析是基础
刚开始我直接跳过需求分析写代码,花了两周做了个“社区活动分享”功能,结果导师一句“核心是服务管理与申请审核,不是社交功能”直接打回重做!后来才明白,需求分析要先抓准“谁用系统、要干啥”,这步做对了,后面能少走90%的弯路。
1. 核心用户&功能拆解(实践总结版)
社区养老服务平台主要有三类核心用户:管理员、服务提供方和普通老人用户(别乱加“志愿者角色”!我当初加了后,权限逻辑全乱了,服务审核流程全卡住,最后砍掉才顺畅):
- 管理员端(核心功能):
- 用户管理:审核用户信息、查看用户列表、重置密码(支持按姓名/手机号模糊查询,我当初没加,查用户要翻几十页)
- 服务管理:发布养老服务、分类管理(助餐/助洁/医疗等)、设置服务状态(用下拉框选“可申请/已满员”,别让管理员手动输)
- 申请审核:审核服务申请、查看申请详情、反馈审核结果(加“审核时间”字段,方便后续追溯)
- 公告管理:发布社区通知、删除过期公告(加“公告类型”字段,比如“政策通知/活动预告”,方便筛选)
- 服务提供方端(重要功能):
- 服务发布:新增服务项目(填名称/描述/时间段)、上传服务图片(支持批量上传,我当初没加,手动传图效率低)
- 申请处理:查看用户申请、处理申请状态(用不同颜色标“待审核/已通过/已拒绝”,直观清晰)
- 服务统计:查看服务数据、导出申请记录(别漏“服务时间段”字段,避免时间冲突)
- 老人用户端(核心功能):
- 服务浏览:按分类/时间筛选、看服务详情(含服务内容/时间/地点)、收藏服务(按“点击量”排序,我当初没加,老人找热门服务要翻半天)
- 服务申请:选择服务时间段、填写申请信息、提交申请(支持一键申请,简化操作流程)
- 个人中心:管理个人信息、查看申请记录、修改联系方式(显示审核状态和结果,透明清晰)
2. 需求分析避坑指南(经验教训!)
- 别光靠“想象”!找几位社区老人和工作人员模拟提意见:比如有老人说“想快速查看我的申请状态”,我才加了“申请进度追踪”,比瞎加“社交圈”实用多了
- 一定要画用例图!用DrawIO画简单版,标清“管理员-审核服务”“用户-提交申请”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听了20分钟还没get到逻辑)
- 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“服务时间段不能冲突”“审核必须有结果”),编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从3个角度写,显得专业:
- 技术可行性:Spring Boot、Vue.js、MySQL都是主流技术,学习资料丰富(别选复杂的前端框架!我当初想用React,环境配置卡了一周,换回Vue才顺利)
- 经济可行性:所有工具全免费!IDEA社区版、MySQL、Node.js官网直接下,开发成本几乎为零,答辩时说“开发成本极低”,导师会觉得你懂成本控制
- 操作可行性:界面用Element-UI做,布局清晰,操作简单,我找社区工作人员测试,5分钟就学会申请服务,导师直接认可
二、技术选型要务实!这套组合稳定高效
刚开始我跟风用Spring Boot+React+Redis,结果“服务信息缓存”卡了4天——Redis配置不熟,数据总不同步😫。后来换成Spring Boot+Vue.js+MySQL,新手友好度拉满,调试效率翻倍!
1. 技术栈详细对比(附避坑提醒)
别盲目追求“最新技术”,稳定比炫酷重要!我整理了4个核心工具的选择理由和坑点,直接参考:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Spring Boot | 配置简单,自带依赖管理,快速开发 | 别用3.x版本!2.7.x就行,兼容性好 |
| Vue.js 2.x | 渐进式框架,学习曲线平缓 | 别用Vue 3!生态还在完善中,容易遇到兼容问题 |
| MySQL 8.0 | 性能稳定,社区资源丰富 | 安装时设“utf8mb4”编码!否则中文乱码 |
| Element-UI | 组件丰富,界面美观 | 按需引入组件!全量引入会导致打包体积过大 |
2. 开发环境搭建(step by step 实操)
很多同学卡在“环境配置”,跟着步骤来超简单:
- 装JDK 1.8:记路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”别错
- 装Node.js 14.x:官网下载LTS版本,安装后验证npm版本
- 装MySQL 8.0:用Navicat管理(可视化工具超方便)
- 创建Spring Boot项目:IDEA里选“Spring Initializr”,勾“Spring Web”“MySQL Driver”“MyBatis”
- 创建Vue项目:命令行执行
vue create community-oldcare-frontend
3. 架构图一定要画!答辩加分项
用DrawIO画前后端分离架构图,标清“前端Vue-后端Spring Boot-数据库MySQL”:比如用户点“申请服务”→前端发请求→后端Controller处理→Service业务逻辑→Mapper操作数据库。去年答辩时,评委特意夸这图“架构清晰”,比光说“我用了前后端分离”专业多了!
三、数据库设计:表关联是关键
这部分是毕设的“核心骨架”,我当初没关联“用户表”和“申请表”,查“某用户的所有申请”要写复杂SQL,调试到凌晨2点😫。后来按“实体-属性-关系”设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定“实体”(用户、服务、申请),再想“属性”,别漏关键字段!我整理了必做的7张表,直接照着画ER图:
- 用户表(yonghu):id(主键)、username(账号)、password(MD5加密!)、yonghu_name(姓名)、yonghu_phone(手机号)
- 服务表(fuwu):id(主键)、fuwu_name(名称)、fuwu_types(类型)、fuwu_content(详情)、fuwu_time(服务时间)
- 申请表(fuwushenqing):id(主键)、fuwu_id(关联服务)、yonghu_id(关联用户)、shenqing_time(申请时间)、status(状态)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“用户”“服务”)
- 椭圆代表“属性”(比如用户的“姓名”“手机号”)
- 菱形代表“关系”(比如“用户-申请-服务”是多对多,一个用户能申请多个服务,一个服务能被多个用户申请)
避坑提醒:别把“服务图片”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/upload/fuwu1.jpg)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,转成实际表,字段类型和约束别乱设!比如“服务时间”用DATETIME,别用VARCHAR,不然无法做时间比较;“申请状态”用INT,配合字典表做状态管理。
给同学们贴“服务表”的建表SQL,复制到Navicat就能用:
CREATE TABLE `fuwu` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '服务ID',
`fuwu_name` VARCHAR(200) NOT NULL COMMENT '服务名称',
`fuwu_types` INT DEFAULT NULL COMMENT '服务类型:1助餐/2助洁/3医疗',
`fuwu_content` TEXT COMMENT '服务详情',
`fuwu_time` DATETIME DEFAULT NULL COMMENT '服务时间',
`fuwu_address` VARCHAR(200) DEFAULT NULL COMMENT '服务地点',
`max_people` INT DEFAULT 10 COMMENT '最大参与人数',
`current_people` INT DEFAULT 0 COMMENT '当前报名人数',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务表';
3. 表关联测试!别等编码才发现错
建完表一定要测关联!比如在“申请表”插数据(用户ID=1,服务ID=1),用JOIN查询:
SELECT y.yonghu_name, f.fuwu_name, fs.shenqing_time, fs.status
FROM fuwushenqing fs
JOIN yonghu y ON fs.yonghu_id = y.id
JOIN fuwu f ON fs.fuwu_id = f.id
WHERE fs.id = 1;
如果能查出“用户名+服务名+申请时间+状态”,说明关联没问题;如果报错,大概率是外键没设对。
四、功能实现:核心模块代码+页面设计
不用做所有功能!先搞定4个核心模块,答辩时足够出彩。每个模块我都附了代码片段和页面设计要点,同学们直接套就行。
1. 用户端:服务申请模块(必做!)
这是用户的核心功能,实现“浏览服务、提交申请、查看进度”,重点说“申请提交”——别漏“人数校验”,我当初就是这里踩了大坑!
(1)核心代码片段(Spring Boot + Vue)
后端Controller层(处理服务申请):
@RestController
@RequestMapping("/api/fuwushenqing")
public class FuwushenqingController {
@Autowired
private FuwushenqingService fuwushenqingService;
@Autowired
private FuwuService fuwuService;
// 提交服务申请
@PostMapping("/add")
public Result add(@RequestBody Fuwushenqing fuwushenqing, HttpServletRequest request) {
// 1. 获取当前登录用户
Integer userId = (Integer) request.getSession().getAttribute("userId");
if (userId == null) {
return Result.error("请先登录");
}
// 2. 检查服务是否存在且未满员
Fuwu fuwu = fuwuService.getById(fuwushenqing.getFuwuId());
if (fuwu == null) {
return Result.error("服务不存在");
}
if (fuwu.getCurrentPeople() >= fuwu.getMaxPeople()) {
return Result.error("该服务已满员");
}
// 3. 检查用户是否已申请该服务
QueryWrapper<Fuwushenqing> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("fuwu_id", fuwushenqing.getFuwuId())
.eq("yonghu_id", userId)
.in("status", Arrays.asList(0, 1)); // 0待审核,1已通过
if (fuwushenqingService.count(queryWrapper) > 0) {
return Result.error("您已申请该服务,请勿重复申请");
}
// 4. 设置申请信息
fuwushenqing.setYonghuId(userId);
fuwushenqing.setStatus(0); // 0待审核
fuwushenqing.setShenqingTime(new Date());
// 5. 保存申请并更新服务人数
fuwushenqingService.save(fuwushenqing);
fuwu.setCurrentPeople(fuwu.getCurrentPeople() + 1);
fuwuService.updateById(fuwu);
return Result.success("申请提交成功");
}
}
前端Vue组件(服务申请页面):
<template>
<div class="fuwu-detail">
<el-card>
<h2>{{ fuwu.fuwuName }}</h2>
<p><strong>服务时间:</strong>{{ fuwu.fuwuTime }}</p>
<p><strong>服务地点:</strong>{{ fuwu.fuwuAddress }}</p>
<p><strong>剩余名额:</strong>{{ fuwu.maxPeople - fuwu.currentPeople }} / {{ fuwu.maxPeople }}</p>
<el-button
type="primary"
:disabled="fuwu.currentPeople >= fuwu.maxPeople"
@click="handleApply"
>
{{ fuwu.currentPeople >= fuwu.maxPeople ? '已满员' : '立即申请' }}
</el-button>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
fuwu: {}
};
},
methods: {
async handleApply() {
try {
const res = await this.$http.post('/api/fuwushenqing/add', {
fuwuId: this.fuwu.id
});
if (res.data.code === 200) {
this.$message.success('申请成功');
// 刷新服务信息
this.loadFuwuDetail();
} else {
this.$message.error(res.data.msg);
}
} catch (error) {
this.$message.error('申请失败,请重试');
}
},
async loadFuwuDetail() {
const res = await this.$http.get(`/api/fuwu/detail/${this.$route.params.id}`);
this.fuwu = res.data.data;
}
},
mounted() {
this.loadFuwuDetail();
}
};
</script>
(2)页面设计要点(Element-UI)
页面标题:服务详情与申请页面
(插入图片位置:此处放“服务申请页面截图”,需包含以下元素)
- 服务信息区:
- 服务名称(大标题,突出显示)
- 服务时间、地点、类型(用图标+文字形式展示)
- 剩余名额(进度条显示,红色为紧张,绿色为充足)
- 申请按钮:根据剩余名额动态显示“立即申请”或“已满员”
- 申请记录:显示当前用户的申请状态(待审核/已通过/已拒绝)
(3)避坑提醒
- 添加申请防重提交!用用户ID+服务ID做唯一约束:
ALTER TABLE fuwushenqing ADD UNIQUE KEY uk_user_fuwu (yonghu_id, fuwu_id); - 申请成功后发通知!集成消息推送:
// 发送微信模板消息或短信通知 messageService.sendApplySuccess(userPhone, fuwuName);
2. 管理员端:申请审核模块(答辩亮点!)
这个功能最能体现“管理属性”,导师超爱问!核心是“审核申请、反馈结果”,别漏“审核理由必填”,不然用户不知道为啥被拒。
(1)核心代码片段
Service层(处理申请审核):
@Service
@Transactional
public class FuwushenqingService {
@Autowired
private FuwushenqingMapper fuwushenqingMapper;
@Autowired
private FuwuMapper fuwuMapper;
public Result audit(Integer shenqingId, Integer status, String auditReason) {
Fuwushenqing shenqing = fuwushenqingMapper.selectById(shenqingId);
if (shenqing == null) {
return Result.error("申请记录不存在");
}
// 验证审核理由(拒绝时必须填写理由)
if (status == 2 && StringUtils.isBlank(auditReason)) {
return Result.error("拒绝申请必须填写理由");
}
// 更新申请状态
shenqing.setStatus(status);
shenqing.setAuditReason(auditReason);
shenqing.setAuditTime(new Date());
fuwushenqingMapper.updateById(shenqing);
// 如果审核拒绝,释放服务名额
if (status == 2) {
Fuwu fuwu = fuwuMapper.selectById(shenqing.getFuwuId());
fuwu.setCurrentPeople(fuwu.getCurrentPeople() - 1);
fuwuMapper.updateById(fuwu);
}
// 记录审核日志
auditLogService.addLog(shenqingId, status, auditReason);
return Result.success("审核完成");
}
}
(2)页面设计要点
页面标题:管理员-申请审核页面
(插入图片位置:此处放“申请审核页面截图”,需包含以下元素)
- 筛选条件:申请状态下拉(全部/待审核/已通过/已拒绝)、申请时间范围
- 申请列表表格:列名“申请人、服务名称、申请时间、状态、操作”
- 审核操作:点击“审核”弹出审核窗口,含“通过”“拒绝”按钮,拒绝时必须填写理由
- 审核记录:显示每次审核的操作人和时间
3. 服务管理模块(核心功能)
管理员可以发布、编辑、下架养老服务,这个模块要注意“时间冲突校验”和“图片上传”。
页面设计要点
页面标题:服务管理页面
(插入图片位置:此处放“服务管理页面截图”,需包含以下元素)
- 服务发布表单:
- 服务名称(必填,最大长度50字)
- 服务类型(单选:助餐/助洁/医疗/其他)
- 服务时间(时间段选择,避免冲突)
- 服务地点(带地图选择功能)
- 服务图片(支持拖拽上传,限制5MB)
- 最大人数(默认10,不能为0)
- 服务列表:支持按类型、时间、状态筛选
- 批量操作:支持批量上架/下架
五、测试别敷衍!这3步让答辩不翻车
很多同学觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“并发申请”,导致超员问题,导师说“不符合实际场景”,当场扣分😫。测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:
(1)服务申请测试(表1:服务申请测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 正常申请 | 选择未满员服务→提交 | 申请成功,名额-1 | ||
| 重复申请 | 对同一服务再次申请 | 提示“已申请,请勿重复” | ||
| 满员申请 | 选择已满员服务申请 | 按钮禁用,提示“已满员” |
(2)申请审核测试(表2:申请审核测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 审核通过 | 选择申请→点击通过 | 状态变“已通过” | ||
| 审核拒绝 | 选择申请→拒绝不填理由 | 提示“必须填写理由” | ||
| 审核拒绝 | 填写理由后拒绝 | 状态变“已拒绝”,名额释放 |
(3)服务发布测试(表3:服务发布测试用例)
| 测试场景 | 输入数据 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 必填项为空 | 不填服务名称→提交 | 提示“服务名称必填” | ||
| 时间冲突 | 发布已有时段服务 | 提示“该时段已有服务” | ||
| 正常发布 | 填写完整信息提交 | 发布成功,显示在列表 |
2. 性能测试(容易忽略的点)
- 并发申请测试:模拟50个用户同时申请同一服务,验证名额控制
- 数据量测试:导入1000条服务数据,验证列表加载速度
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,含“测试环境、用例设计、执行结果、问题分析”,导师会觉得你“做事严谨”。比如:
- 问题总结:“并发申请时出现超员,加数据库锁解决;图片上传未限制大小,添加5MB限制”
- 测试结论:“核心功能通过测试,系统稳定可用”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“优秀”:
- 演示流程要顺畅:提前录演示视频,按“用户申请→管理员审核→结果通知”的完整流程演示
- 重点讲“解决的实际问题”:比如“老人操作不便,我们做了大字体、一键申请”,比光说“功能齐全”有亮点
- 准备常见问题:导师可能问“怎么保证数据安全”“用户多了怎么优化”,提前准备:“密码加密存储、SQL注入防护;用户多了加缓存、分库分表”
最后:毕设通关的温馨提示
以上就是基于Spring Boot的社区养老服务平台从0到1的实战经验!毕设没那么难,关键是脚踏实地,别追求花哨功能。
需要完整源码(带详细注释)、数据库脚本(含测试数据)、部署文档的同学,可以评论区留言;遇到具体问题(比如Vue路由配置、Spring Boot事务管理),也可以提问,我会尽力解答。
祝大家毕设顺利,轻松毕业!🎓