一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery
智能家居管理系统是一款基于B/S架构的综合性家居管理平台,采用Spring Boot框架作为后端支撑,结合Vue前端技术与MySQL数据库实现数据持久化存储。该系统涵盖了智能家居设备的全生命周期管理,从家居分类、信息录入、在线购买到远程控制与智能连接,为用户提供一站式管理服务。系统特别设计了完善的售后服务模块,包括家居报修、维修员管理、报修安排、接单处理、维修反馈及用户评价等环节,形成闭环式服务流程。同时集成了留言反馈、交流论坛等社区功能,用户可以在论坛中分享使用心得、讨论家居方案,管理员通过论坛分类管理与举报记录管理维护良好的交流环境。系统针对不同角色设置了差异化权限,普通用户可以购买设备、提交报修、参与论坛互动,维修员负责接单处理与反馈,管理员则统筹整个平台的运营与维护,实现了智能家居设备从采购到维护的全流程数字化管理。
三、视频解说
四、部分功能展示
五、部分代码展示
/**
* 家居报修管理 - 提交报修申请
* 处理用户提交的家居设备报修请求,包括参数校验、设备状态检查、工单生成等业务逻辑
*/
@PostMapping("/submitRepair")
public Result submitRepair(@RequestBody RepairOrder repairOrder, HttpSession session) {
User currentUser = (User) session.getAttribute("user");
if (currentUser == null) {
return Result.error("用户未登录");
}
// 校验报修的家居设备是否属于当前用户
HomeDevice device = homeDeviceMapper.selectById(repairOrder.getDeviceId());
if (device == null) {
return Result.error("设备不存在");
}
if (!device.getUserId().equals(currentUser.getId())) {
return Result.error("无权对该设备提交报修");
}
// 检查该设备是否有未完成的报修单
QueryWrapper<RepairOrder> wrapper = new QueryWrapper<>();
wrapper.eq("device_id", repairOrder.getDeviceId())
.in("status", Arrays.asList(0, 1, 2)); // 0待分配 1已分配 2维修中
RepairOrder existingOrder = repairOrderMapper.selectOne(wrapper);
if (existingOrder != null) {
return Result.error("该设备存在进行中的报修单,请勿重复提交");
}
// 填充报修单基本信息
repairOrder.setUserId(currentUser.getId());
repairOrder.setUserName(currentUser.getUsername());
repairOrder.setUserPhone(currentUser.getPhone());
repairOrder.setDeviceName(device.getDeviceName());
repairOrder.setDeviceCategory(device.getCategoryName());
repairOrder.setStatus(0); // 待分配
repairOrder.setCreateTime(new Date());
repairOrder.setOrderNo("RO" + System.currentTimeMillis() + RandomUtil.randomNumbers(4));
// 根据设备分类和故障描述进行优先级评估
String faultDesc = repairOrder.getFaultDescription().toLowerCase();
if (faultDesc.contains("漏电") || faultDesc.contains("漏水") || faultDesc.contains("冒烟")) {
repairOrder.setPriority(3); // 高优先级
} else if (faultDesc.contains("无法启动") || faultDesc.contains("完全失效")) {
repairOrder.setPriority(2); // 中优先级
} else {
repairOrder.setPriority(1); // 普通优先级
}
// 保存报修单到数据库
int insertResult = repairOrderMapper.insert(repairOrder);
if (insertResult > 0) {
// 更新设备状态为报修中
device.setRepairStatus(1);
homeDeviceMapper.updateById(device);
// 记录操作日志
SystemLog log = new SystemLog();
log.setUserId(currentUser.getId());
log.setOperation("提交报修");
log.setDetails("设备:" + device.getDeviceName() + ",工单号:" + repairOrder.getOrderNo());
log.setCreateTime(new Date());
systemLogMapper.insert(log);
return Result.success("报修申请提交成功,工单号:" + repairOrder.getOrderNo());
}
return Result.error("提交失败,请重试");
}
/**
* 报修安排管理 - 分配维修员
* 管理员将报修工单分配给合适的维修员,考虑维修员技能、工作负荷等因素
*/
@PostMapping("/assignRepairman")
public Result assignRepairman(@RequestParam Long orderId, @RequestParam Long repairmanId, HttpSession session) {
User admin = (User) session.getAttribute("user");
if (admin == null || admin.getRole() != 1) {
return Result.error("无权限操作");
}
// 查询报修单详情
RepairOrder order = repairOrderMapper.selectById(orderId);
if (order == null) {
return Result.error("报修单不存在");
}
if (order.getStatus() != 0) {
return Result.error("该报修单已分配或已完成,无法重复分配");
}
// 查询维修员信息并验证
Repairman repairman = repairmanMapper.selectById(repairmanId);
if (repairman == null) {
return Result.error("维修员不存在");
}
if (repairman.getStatus() != 1) {
return Result.error("该维修员当前不可用");
}
// 检查维修员技能是否匹配设备分类
String[] skills = repairman.getSkillCategories().split(",");
boolean skillMatched = false;
for (String skill : skills) {
if (skill.equals(order.getDeviceCategory())) {
skillMatched = true;
break;
}
}
if (!skillMatched) {
return Result.error("维修员技能与设备分类不匹配");
}
// 查询维修员当前未完成工单数量
QueryWrapper<RepairOrder> workloadWrapper = new QueryWrapper<>();
workloadWrapper.eq("repairman_id", repairmanId)
.in("status", Arrays.asList(1, 2));
Long currentWorkload = repairOrderMapper.selectCount(workloadWrapper);
if (currentWorkload >= 5) {
return Result.error("该维修员当前工单较多,建议分配给其他维修员");
}
// 更新报修单分配信息
order.setRepairmanId(repairmanId);
order.setRepairmanName(repairman.getName());
order.setRepairmanPhone(repairman.getPhone());
order.setStatus(1); // 已分配
order.setAssignTime(new Date());
order.setAssignBy(admin.getUsername());
int updateResult = repairOrderMapper.updateById(order);
if (updateResult > 0) {
// 创建报修安排记录
RepairAssignment assignment = new RepairAssignment();
assignment.setOrderId(orderId);
assignment.setOrderNo(order.getOrderNo());
assignment.setRepairmanId(repairmanId);
assignment.setAssignBy(admin.getId());
assignment.setAssignTime(new Date());
assignment.setExpectedTime(calculateExpectedTime(order.getPriority()));
repairAssignmentMapper.insert(assignment);
// 更新维修员工单统计
repairman.setTotalOrders(repairman.getTotalOrders() + 1);
repairmanMapper.updateById(repairman);
return Result.success("分配成功");
}
return Result.error("分配失败");
}
/**
* 远程控制管理 - 执行设备控制指令
* 用户对已连接的智能家居设备发送控制命令,实现远程开关、调节等操作
*/
@PostMapping("/controlDevice")
public Result controlDevice(@RequestParam Long deviceId, @RequestParam String action,
@RequestParam(required = false) String params, HttpSession session) {
User currentUser = (User) session.getAttribute("user");
if (currentUser == null) {
return Result.error("用户未登录");
}
// 查询设备并验证权限
HomeDevice device = homeDeviceMapper.selectById(deviceId);
if (device == null) {
return Result.error("设备不存在");
}
if (!device.getUserId().equals(currentUser.getId())) {
return Result.error("无权控制该设备");
}
// 检查设备连接状态
if (device.getConnectionStatus() != 1) {
return Result.error("设备未连接,无法执行控制");
}
if (device.getRepairStatus() == 1) {
return Result.error("设备报修中,暂时无法控制");
}
// 验证控制指令合法性
List<String> allowedActions = Arrays.asList("power_on", "power_off", "adjust", "mode_switch", "timer_set");
if (!allowedActions.contains(action)) {
return Result.error("不支持的控制指令");
}
// 构建控制命令对象
ControlCommand command = new ControlCommand();
command.setDeviceId(deviceId);
command.setDeviceType(device.getDeviceType());
command.setAction(action);
command.setParams(params);
command.setCommandId("CMD" + System.currentTimeMillis());
// 根据设备类型和动作执行特定逻辑
String executeResult = "";
if ("power_on".equals(action) || "power_off".equals(action)) {
device.setPowerStatus("power_on".equals(action) ? 1 : 0);
executeResult = deviceControlService.executePowerControl(command);
} else if ("adjust".equals(action)) {
// 解析调节参数(如温度、亮度等)
if (params == null || params.isEmpty()) {
return Result.error("调节操作需要提供参数");
}
JSONObject paramJson = JSONObject.parseObject(params);
Integer value = paramJson.getInteger("value");
if (value == null) {
return Result.error("参数格式错误");
}
// 根据设备类型验证参数范围
if ("空调".equals(device.getCategoryName()) && (value < 16 || value > 30)) {
return Result.error("温度设置范围为16-30度");
}
executeResult = deviceControlService.executeAdjustment(command);
} else if ("mode_switch".equals(action)) {
executeResult = deviceControlService.executeModeSwitch(command);
}
// 更新设备状态
device.setLastControlTime(new Date());
homeDeviceMapper.updateById(device);
// 记录控制历史
ControlHistory history = new ControlHistory();
history.setUserId(currentUser.getId());
history.setDeviceId(deviceId);
history.setAction(action);
history.setParams(params);
history.setExecuteResult(executeResult);
history.setExecuteTime(new Date());
controlHistoryMapper.insert(history);
return Result.success("控制指令已发送", executeResult);
}
// 辅助方法:根据优先级计算预期完成时间
private Date calculateExpectedTime(Integer priority) {
Calendar calendar = Calendar.getInstance();
if (priority == 3) {
calendar.add(Calendar.HOUR, 4); // 高优先级4小时
} else if (priority == 2) {
calendar.add(Calendar.HOUR, 24); // 中优先级1天
} else {
calendar.add(Calendar.HOUR, 48); // 普通优先级2天
}
return calendar.getTime();
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊