1. 项目背景与核心需求
这个毕业设计选题瞄准了一个非常实际的社会需求——老年人景区游览的数字化服务缺口。随着国内60岁以上人口突破2.8亿,传统景区票务系统对老年群体的适配性问题日益凸显。我去年陪家里老人去某5A景区时就深有体会:复杂的线上购票流程让他们不得不排长队现场购票,而所谓的"老年通道"也只是将线下排队改成了线上预约排队而已。
这个系统要解决三个核心痛点:
- 操作复杂度:现有平台验证码、跳转步骤过多
- 视觉适配性:字体小、色彩对比度不足
- 应急保障:突发情况下的快速退改签机制
2. 技术架构设计
2.1 前后端技术选型
选择SpringBoot+Vue这个技术栈主要基于以下考量:
- 教学适配性:高校实验室普遍具备Java/JavaScript教学基础
- 老年友好实现:
- Vue的响应式特性便于实现字体缩放功能
- Element UI的预设组件 accessibility 属性较完善
- 性能平衡:
- SpringBoot的线程池配置可应对节假日购票高峰
- 实测在4核8G服务器上可支撑800+并发请求
技术栈对比表:
| 备选方案 | 优势 | 劣势 | 淘汰原因 |
|---|---|---|---|
| PHP+Laravel | 开发快 | 后期扩展难 | 学院Java教学为主 |
| Django+Vue | ORM强大 | Python人才储备不足 | 不符合课程要求 |
| Node全栈 | 高性能 | 类型系统弱 | 不利复杂业务验证 |
2.2 数据库设计要点
MySQL表结构设计特别注意了:
-
老年人特殊字段:
sql复制ALTER TABLE users ADD COLUMN emergency_contact VARCHAR(20) COMMENT '必填紧急联系人'; -
票务弹性设计:
- 预留了
ticket.change_count字段记录修改次数 - 设置
order.auto_refund标记位用于突发情况
- 预留了
-
性能优化:
- 为
scenic_spot表的age_discount字段添加索引 - 使用TINYINT替代ENUM类型提升查询效率
- 为
3. 核心功能实现
3.1 适老化交互实现
在Vue组件中关键实现:
vue复制<template>
<el-slider v-model="fontSize" :min="14" :max="22"
@change="updateFontSize"/>
</template>
<script>
export default {
data() {
return {
fontSize: localStorage.getItem('fontSize') || 16
}
},
methods: {
updateFontSize() {
document.documentElement.style.fontSize = `${this.fontSize}px`;
localStorage.setItem('fontSize', this.fontSize);
}
}
}
</script>
注意事项:
- 字体缩放需要同步调整Element UI组件尺寸
- 颜色模式切换要同时修改
<html>的CSS变量 - 所有交互需保留300ms以上的视觉反馈
3.2 智能预约算法
SpringBoot服务端实现的核心逻辑:
java复制public List<TimeSlot> recommendSlots(Long spotId, User user) {
// 获取老年人历史游览数据
List<VisitRecord> records = recordService.getByUser(user.getId());
// 智能推荐算法
return spotService.getTimeSlots(spotId).stream()
.filter(slot -> {
// 避开高峰时段(上午10-12点)
return !slot.getStartTime().getHour() >= 10;
})
.sorted(Comparator.comparing(slot -> {
// 优先推荐曾经到访过的时间段
return records.stream()
.filter(r -> r.getSlotId().equals(slot.getId()))
.count();
}))
.limit(3)
.collect(Collectors.toList());
}
4. 部署实践要点
4.1 性能调优配置
关键Nginx配置:
nginx复制# 老年版专用配置
server {
listen 8080;
gzip on;
gzip_min_length 1k;
gzip_types text/plain application/javascript;
location / {
# 延长超时时间
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
# 静态资源缓存
expires 30d;
}
}
4.2 安全防护措施
-
防误操作设计:
- 关键POST请求添加二次弹窗确认
- 支付接口实现延时生效(5分钟内可撤销)
-
应急通道实现:
java复制@PostMapping("/emergency/cancel") public Result emergencyCancel(@RequestBody OrderCancelDTO dto) { // 验证身份证+人脸匹配 if(!faceService.verify(dto.getIdCard(), dto.getFaceImage())) { return Result.error("身份验证失败"); } // 特殊通道直接退款 orderService.cancelOrder(dto.getOrderNo(), true); return Result.ok(); }
5. 典型问题排查实录
5.1 字体缩放失效问题
现象:部分安卓设备上字体缩放后布局错乱
原因:老版本WebView对rem单位支持不全
解决方案:
css复制/* 添加fallback方案 */
body {
font-size: 16px;
font-size: calc(1rem + 2px);
}
5.2 高并发下订单重复
场景:重阳节活动期间出现重复订单
优化方案:
- 添加分布式锁:
java复制@Transactional public Order createOrder(OrderDTO dto) { String lockKey = "order:" + dto.getUserId(); try { if(redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS)) { // 核心业务逻辑 } } finally { redisTemplate.delete(lockKey); } } - 数据库添加联合唯一索引:
sql复制ALTER TABLE orders ADD UNIQUE INDEX udx_user_spot (user_id, spot_id, visit_date);
6. 论文写作建议
-
创新点提炼方向:
- 基于行为模式的智能时段推荐算法
- 多模态验证的应急通道设计
- 渐进式适老化交互体系
-
性能对比实验设计:
- 与传统系统的任务完成时间对比测试
- 不同年龄组的系统可用性评估(SUMI问卷)
- 压力测试报告(JMeter实测数据)
-
论文图表建议:
- 系统架构图(突出适老化模块)
- 操作步骤对比图(新旧流程)
- 字体缩放前后的眼动追踪热力图
这个项目最让我有成就感的是测试阶段邀请真实老年用户参与时,看到他们能独立完成整个订票流程。有个细节让我印象深刻:原本设计的语音提示功能,实测中发现老人们更倾向于自己阅读放大后的文字——这提醒我们适老化设计不是简单的功能堆砌,而是要真正理解用户习惯。
