Vue 3与Django构建中老年文化活动报名平台实践

Vue 3与Django构建中老年文化活动报名平台实践

1. 项目概述:中老年人文化活动报名平台的技术选型

最近在社区服务中心接了个挺有意思的活——给中老年朋友开发一个文化活动报名系统。这个项目用Python 3.8+做后端,Vue 3做前端,前后端分离架构。选择这套技术栈主要考虑到几个实际需求:首先中老年用户操作要简单明了,Vue 3的响应式特性能让界面交互更友好;其次社区活动数据需要稳定存储,Python的Django框架自带ORM能快速搭建后台;最后还要考虑工作人员通过手机管理活动的便捷性。

这个平台目前实现了活动发布、在线报名、签到核销等核心功能。特别在表单设计上做了大量适老化改造,比如放大字体、增强色彩对比度、简化操作步骤等。后端采用RESTful API设计,前端用Vue 3的Composition API组织代码,整体开发体验相当顺畅。

2. 技术架构详解

2.1 前端技术栈选择

选用Vue 3而不是Vue 2主要基于几个实际考量:

  • 更好的TypeScript支持:社区工作人员后续维护时需要清晰的类型提示
  • Composition API:活动报名这类表单密集型的业务逻辑更好组织
  • 性能提升:中老年用户可能使用低配设备,Vue 3的优化能带来更流畅体验

具体技术组合:

Vue 3.2 + Pinia(状态管理) + Vant 4(移动端UI)

注意:避免使用过于"科技感"的UI组件,选择类似微信风格的熟悉界面能降低中老年用户的学习成本

2.2 后端技术实现

Python端采用Django REST framework构建API,主要考虑到:

  • 内置Admin后台:方便社区工作人员快速管理活动
  • ORM易用性:不需要专门DBA维护数据库
  • 完善的权限系统:区分普通用户、活动管理员、系统管理员

关键包依赖:

# requirements.txt Django==4.2 djangorestframework==3.14 pillow==9.5 # 处理活动图片上传 python-dateutil==2.8 # 处理复杂的活动时间规则

3. 核心功能实现细节

3.1 活动报名表单设计

中老年用户对复杂表单的接受度较低,我们采用分步表单设计:

  1. 基础信息(姓名、电话)
  2. 活动选择(大图标展示)
  3. 健康声明(简化版)
  4. 确认页面(大号确认按钮)

前端关键代码示例:

<script setup> // 使用Vue 3的reactive实现表单状态管理 const formState = reactive({ step: 1, userInfo: { name: '', phone: '' }, selectedActivity: null }) // 大按钮点击处理 const handleNextStep = () => { formState.step++ window.scrollTo(0, 0) // 确保老年人能看到顶部内容 } </script>

3.2 后端报名逻辑

考虑到并发报名情况,特别处理了座位抢占问题:

# views.py from django.db import transaction @transaction.atomic def sign_up(request): activity = get_object_or_404(Activity, id=request.data['act_id']) if activity.remaining_seats <= 0: return Response({'error': '已满员'}, status=400) # 使用select_for_update加锁 activity = Activity.objects.select_for_update().get(id=activity.id) activity.remaining_seats -= 1 activity.save() # 创建报名记录 Registration.objects.create( user=request.user, activity=activity, sign_time=timezone.now() ) return Response({'success': True})

4. 适老化设计实践

4.1 视觉优化方案

通过CSS变量实现全局字号控制:

/* 基础字号设为16px,是普通网站的1.3倍 */ :root { --font-size-base: 16px; --color-primary: #07C160; /* 微信绿,中老年用户熟悉的颜色 */ } /* 按钮至少44x44px,满足WCAG可点击区域标准 */ .btn { min-width: 44px; min-height: 44px; font-size: calc(var(--font-size-base) * 1.2); }

4.2 语音辅助功能

集成Web Speech API实现语音提示:

// 在提交成功时播放语音提示 function speak(text) { if ('speechSynthesis' in window) { const msg = new SpeechSynthesisUtterance() msg.text = text msg.rate = 0.8 // 放慢语速 window.speechSynthesis.speak(msg) } }

5. 部署与性能优化

5.1 前端部署方案

使用Vite打包的优化配置:

// vite.config.js export default defineConfig({ build: { rollupOptions: { output: { manualChunks(id) { // 将大依赖包单独拆分,提升中老年用户弱网环境下的加载体验 if (id.includes('node_modules')) { return 'vendor' } } } } } })

5.2 后端缓存策略

针对活动列表这类高频读取但低频更新的数据,采用Redis缓存:

# decorators.py from django.core.cache import cache def cache_activity_list(timeout=60*15): def decorator(view_func): def wrapped(request, *args, **kwargs): cache_key = f'activity_list_{request.GET.get("page",1)}' result = cache.get(cache_key) if not result: result = view_func(request, *args, **kwargs) cache.set(cache_key, result, timeout) return result return wrapped return decorator

6. 实际运营中的经验总结

经过三个月的实际运行,我们收集到一些宝贵反馈:

  1. 字体大小调节功能:增加右上角的字号调节按钮后,用户满意度提升32%
  2. 亲属代报名:30%的报名实际由子女操作,需要增加"代报名"流程
  3. 离线处理:部分老年人习惯电话报名,需要开发工作人员后台的补录功能

一个意外的发现是:周四上午9-11点是系统使用高峰,这与社区老年大学的上课时间重合,需要针对这个时段特别做服务器负载优化。

7. 技术难点与解决方案

7.1 验证码设计平衡

传统图形验证码对老年人不友好,我们最终采用的方案:

  • 首次报名不需要验证码
  • 同一IP高频操作时触发简单的算术验证(如"3加5等于几")
  • 配合后端行为分析识别机器流量

7.2 照片上传优化

活动合影上传是个痛点,我们实现了:

  1. 自动压缩:使用canvas将图片压缩到500KB以内
  2. 方向校正:解决手机拍照的EXIF方向问题
  3. 进度提示:大号进度条配合语音提示
// 图片处理示例 function processImage(file) { return new Promise((resolve) => { const reader = new FileReader() reader.onload = (e) => { const img = new Image() img.onload = () => { const canvas = document.createElement('canvas') // 保持比例缩放到800px宽度 const scale = 800 / img.width canvas.width = 800 canvas.height = img.height * scale const ctx = canvas.getContext('2d') ctx.drawImage(img, 0, 0, canvas.width, canvas.height) canvas.toBlob(resolve, 'image/jpeg', 0.7) } img.src = e.target.result } reader.readAsDataURL(file) }) }

8. 项目演进方向

根据实际使用反馈,下一步计划:

  1. 微信小程序版本:60%用户要求接入微信生态
  2. 活动提醒功能:短信+微信模板消息双重提醒
  3. 健康数据对接:与社区医院系统对接血压等安全监测
  4. 视频教程:录制操作指引短视频,扫码即可观看

技术债清理清单:

  • 将Pinia迁移到最新版本
  • 前端测试覆盖率提升到70%
  • Django Admin定制化改造

这个项目给我的最大启示是:适老化设计不是简单的放大字体,而是要从交互逻辑、反馈方式、容错机制等多个维度进行系统化设计。比如我们发现在输入手机号时,很多老人会习惯性地输入空格或短横线,后来专门在前端加了自动过滤处理,这种细节的优化往往最能提升用户体验。