校园活动管理系统是每所高校都需要的数字化基础设施。传统的人工登记方式存在信息滞后、统计困难、反馈不及时等问题。我们团队开发的这套系统采用前后端分离架构,前端使用Vue.js实现响应式界面,后端基于SpringBoot提供RESTful API服务。系统上线后,某高校学生会使用数据显示,活动报名效率提升300%,组织者管理时间减少65%。
这个系统特别适合两类人群:
采用Vue 3 + Element Plus的组合主要基于三点考虑:
关键代码结构:
code复制src/
├── api/ # 接口封装
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Pinia状态管理
└── views/ # 页面组件
SpringBoot 2.7 + MyBatis-Plus的选型理由:
数据库设计核心表:
sql复制CREATE TABLE `activity` (
`id` bigint NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL COMMENT '活动名称',
`start_time` datetime NOT NULL COMMENT '开始时间',
`location` varchar(200) NOT NULL COMMENT '活动地点',
`max_people` int DEFAULT NULL COMMENT '人数限制',
`status` tinyint DEFAULT '0' COMMENT '状态:0未开始 1进行中 2已结束'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
组织者后台的关键实现点:
java复制// 活动创建接口示例
@PostMapping("/create")
public Result createActivity(@Valid @RequestBody ActivityDTO dto) {
String lockKey = "activity:lock:" + dto.getTitle();
try {
if (redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS)) {
return activityService.create(dto);
}
throw new BusinessException("操作过于频繁");
} finally {
redisTemplate.delete(lockKey);
}
}
学生端的核心交互逻辑:
前端报名关键代码:
vue复制<template>
<el-form :model="form" :rules="rules" ref="formRef">
<el-form-item label="姓名" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<!-- 动态字段渲染 -->
<template v-for="item in extraFields" :key="item.id">
<el-form-item :label="item.label" :prop="'extras.' + item.id">
<component :is="getComponent(item.type)" v-model="form.extras[item.id]" />
</el-form-item>
</template>
</el-form>
</template>
java复制// 优化后的查询示例
public Page<ActivityVO> queryActivities(ActivityQuery query) {
return lambdaQuery()
.eq(query.getStatus() != null, Activity::getStatus, query.getStatus())
.ge(Activity::getStartTime, query.getStartDate())
.le(Activity::getEndTime, query.getEndDate())
.page(query.toPage())
.convert(this::toVO);
}
配置示例:
javascript复制// vite.config.js
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
editor: ['@wangeditor/editor'],
charts: ['echarts']
}
}
}
}
})
Docker Compose编排方案:
yaml复制version: '3'
services:
backend:
image: openjdk:17-jdk
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
frontend:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./dist:/usr/share/nginx/html
Prometheus + Grafana监控指标:
告警规则示例:
yaml复制- alert: HighErrorRate
expr: rate(http_server_requests_errors_total[1m]) > 0.1
for: 5m
labels:
severity: warning
重要提示:MyBatis-Plus的updateById方法不会更新null字段,需要配合@TableField(updateStrategy = FieldStrategy.IGNORED)使用
微信通知集成时遇到的坑:
性能测试数据对比:
| 场景 | 原始方案 | 优化方案 | 提升 |
|---|---|---|---|
| 活动列表加载 | 1200ms | 400ms | 66% |
| 并发报名 | 15TPS | 45TPS | 200% |
这套系统在浙江大学某学院实际运行半年后,支撑了87场活动、累计报名5362人次。最大的收获是认识到:校园场景下,系统的易用性比功能丰富度更重要,90%的用户只会用到20%的核心功能。