高校后勤报修系统是针对校园内各类设施维修需求设计的数字化管理平台。作为计算机专业的毕业设计选题,这个项目具有典型的实际应用价值和技术综合性。系统采用B/S架构,前端使用Vue.js框架,后端采用Django和Spring Boot双框架,数据库选用MySQL,形成了完整的技术栈组合。
在实际校园环境中,传统的电话或纸质报修方式存在诸多痛点:报修信息记录不完整、维修进度不透明、历史数据难以追溯等。这套系统通过数字化手段解决了这些问题,实现了报修流程的标准化、可视化和可追溯化。系统设计时特别考虑了高校的特殊性,比如用户群体固定(师生员工)、维修类型多样(水电、家具、网络等)、责任部门明确等特点。
从技术实现角度看,这个项目涵盖了Web开发的完整流程:需求分析、系统设计、数据库建模、前后端开发、测试部署等环节。对于计算机专业学生来说,既能锻炼全栈开发能力,又能学习到实际业务场景中的系统设计思路。
前端选择Vue.js主要基于以下考虑:
后端采用Django+Spring Boot双框架的决策依据:
数据库选择MySQL的原因:
系统采用经典的三层架构设计:
表现层(Presentation Layer):
业务逻辑层(Business Logic Layer):
数据访问层(Data Access Layer):
系统主要分为六大核心模块:
用户表(users)设计要点:
sql复制CREATE TABLE `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT '加密密码',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`email` varchar(100) DEFAULT NULL COMMENT '电子邮箱',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
`role_type` tinyint(4) NOT NULL COMMENT '角色类型(1管理员2审批员3维修人员4普通用户)',
`status` tinyint(4) DEFAULT '1' COMMENT '状态(0禁用1正常)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
报修申请表(repair_apply)关键字段:
sql复制CREATE TABLE `repair_apply` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`apply_no` varchar(32) NOT NULL COMMENT '报修单号',
`user_id` bigint(20) NOT NULL COMMENT '报修人ID',
`type_id` bigint(20) NOT NULL COMMENT '报修类型ID',
`title` varchar(100) NOT NULL COMMENT '报修标题',
`content` text NOT NULL COMMENT '详细描述',
`location` varchar(255) NOT NULL COMMENT '报修地点',
`urgency` tinyint(4) DEFAULT '1' COMMENT '紧急程度(1一般2紧急3特急)',
`images` varchar(1000) DEFAULT NULL COMMENT '图片URL,多个用逗号分隔',
`status` tinyint(4) DEFAULT '0' COMMENT '状态(0待审核1已通过2已拒绝3维修中4已完成)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_apply_no` (`apply_no`),
KEY `idx_user_id` (`user_id`),
KEY `idx_type_id` (`type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报修申请表';
系统主要表关系采用以下设计原则:
针对系统查询特点设计的索引:
注意:对于文本类型的搜索字段(如报修内容),考虑使用MySQL全文索引或引入Elasticsearch等搜索引擎,但在毕业设计阶段可以暂不实现。
前端Vue组件设计要点:
javascript复制// 报修表单组件
export default {
data() {
return {
form: {
typeId: null,
title: '',
content: '',
location: '',
urgency: 1,
images: []
},
rules: {
typeId: [{ required: true, message: '请选择报修类型' }],
title: [
{ required: true, message: '请输入报修标题' },
{ max: 100, message: '标题不超过100字符' }
],
content: [
{ required: true, message: '请输入详细描述' },
{ min: 10, message: '描述至少10个字符' }
]
}
}
},
methods: {
handleSubmit() {
this.$refs.form.validate(valid => {
if (valid) {
this.$axios.post('/api/repair/apply', this.form)
.then(res => {
this.$message.success('报修申请提交成功')
this.$router.push('/my-repairs')
})
}
})
},
handleUpload(response) {
this.form.images.push(response.data.url)
}
}
}
后端Spring Boot控制器示例:
java复制@RestController
@RequestMapping("/api/repair")
public class RepairController {
@Autowired
private RepairService repairService;
@PostMapping("/apply")
public Result apply(@RequestBody RepairApplyDTO dto,
@RequestHeader("Authorization") String token) {
Long userId = JwtUtil.getUserId(token);
String applyNo = repairService.createApply(dto, userId);
return Result.success(applyNo);
}
@GetMapping("/list")
public Result list(@RequestParam(required = false) Integer status,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
PageInfo<RepairVO> pageInfo = repairService.queryByStatus(status, page, size);
return Result.success(pageInfo);
}
}
系统采用基于优先级的轮询分配算法:
算法Java实现核心逻辑:
java复制public class RepairDispatcher {
public void dispatch(RepairApply apply) {
// 1. 获取可用的维修人员列表
List<Repairer> availableRepairers = repairerService
.findByTypeAndStatus(apply.getTypeId(), 1);
// 2. 按当前任务数排序(选择任务最少的)
availableRepairers.sort(Comparator
.comparingInt(r -> r.getCurrentTasks().size()));
if (!availableRepairers.isEmpty()) {
Repairer assignee = availableRepairers.get(0);
assignRepairTask(apply, assignee);
} else {
// 无可用维修人员,进入等待队列
queueService.addToWaitQueue(apply);
}
}
private void assignRepairTask(RepairApply apply, Repairer repairer) {
RepairTask task = new RepairTask();
task.setApplyId(apply.getId());
task.setRepairerId(repairer.getId());
task.setStatus(0); // 待接收
taskMapper.insert(task);
// 发送通知
notificationService.sendNewTaskNotice(repairer.getId(), apply);
}
}
报修单生命周期状态转换图:
code复制[新建] → [待审核] → [已拒绝]
↓
[已通过] → [已分配] → [维修中] → [已完成]
↓ ↓
[已取消] [维修失败]
状态转换规则:
Django中使用状态机字段实现:
python复制class RepairApply(models.Model):
STATUS_CHOICES = (
(0, '待审核'),
(1, '已通过'),
(2, '已拒绝'),
(3, '维修中'),
(4, '已完成'),
(5, '已取消'),
(6, '维修失败')
)
status = models.SmallIntegerField(choices=STATUS_CHOICES, default=0)
def approve(self):
if self.status != 0:
raise ValueError("只有待审核状态可以审批")
self.status = 1
self.save()
def reject(self):
if self.status != 0:
raise ValueError("只有待审核状态可以拒绝")
self.status = 2
self.save()
系统实现了多种通知方式:
WebSocket配置示例(Spring):
java复制@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOrigins("*")
.withSockJS();
}
}
前端订阅消息:
javascript复制const socket = new SockJS('/ws')
const stompClient = Stomp.over(socket)
stompClient.connect({}, frame => {
stompClient.subscribe('/topic/notifications', message => {
const notification = JSON.parse(message.body)
this.$notify({
title: notification.title,
message: notification.content,
type: 'info'
})
})
})
推荐的生产环境部署方案:
code复制前端服务器(Nginx) → 负载均衡 → [后端服务器1(Django+Spring)
后端服务器2(Django+Spring)]
↓
MySQL集群(主从复制)
Redis哨兵集群
Docker部署示例:
dockerfile复制# Django容器
FROM python:3.8
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "config.wsgi", "-b", "0.0.0.0:8000"]
# Spring Boot容器
FROM openjdk:11-jre
WORKDIR /app
COPY target/repair-system.jar .
CMD ["java", "-jar", "repair-system.jar"]
在实现这个毕业设计项目时,有几个关键点需要特别注意:首先是报修状态流转的逻辑严谨性,必须确保状态变更符合实际业务流程;其次是权限控制的细粒度实现,不同角色对同一数据可能有不同的操作权限;最后是异常情况的处理,如并发报修、重复提交等场景。我在开发过程中发现,提前设计好状态转换图和权限矩阵能大幅减少后期的返工。