news 2026/10/18 11:08:53

微信小程序+Java会议室管理系统毕业设计实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序+Java会议室管理系统毕业设计实战

简介:本资源是一套完整的Java毕业设计项目——基于微信小程序的软件学院会议室管理系统,面向计算机专业本科生及Java全栈初学者,解决企业或高校中会议室预约冲突、资源浪费与管理低效等实际问题。系统采用前后端分离架构,后端以Spring Boot + MySQL实现业务逻辑与数据持久化,前端为微信小程序,涵盖用户管理、会议室查询、在线预约、审批流程及数据统计等核心功能。压缩包共320个文件,含26个Java源码、26个Class编译文件、30个JS交互脚本、16个WXSS样式与14个WXML页面结构文件,另有SQL建表语句、演示MP4视频、数据库备份及完整项目配置文件,整体大小61.59MB。目前已有188人学习下载,提供可直接运行的源码、配套数据库脚本、全流程演示视频及清晰的模块化目录结构,便于理解B/S与小程序双端协同机制,快速复现并二次开发。

1. 微信小程序 + Java 后端的会议室管理系统:为什么它仍是毕业设计里「稳过率高、展示效果强、技术闭环完整」的黄金组合?

你是不是也经历过:开题答辩前一周还在纠结选题,导师说“别搞太虚的AI项目,得能跑起来、能演示、能讲清楚数据怎么来的”;而翻遍GitHub,要么是纯前端空壳,点提交就404;要么是Spring Boot单体巨无霸,连数据库字段都配不齐。这个标题里的「微信小程序 + Java 后端 + 会议室管理」,恰恰卡在毕业设计最务实的交点上——用户真会扫码进系统预约(小程序即用即走),业务逻辑清晰可拆解(预约/冲突检测/审批流),后端用Java写既符合课程要求又便于调试,数据库结构规整(Room/Booking/User三张主表就能撑起核心),连演示视频都能录出“真实办公场景感”。它不是炫技型项目,而是用最小技术栈覆盖完整软件工程链路:需求分析→ER建模→Spring Boot REST API设计→小程序页面状态管理→MySQL事务控制→前后端联调排错。适合代码基础中等、时间紧张、需要快速交付可运行成果的本科生。接下来,我就带你从零搭起这个系统,不跳步、不省略配置细节、不回避那些让答辩老师皱眉的“玄学报错”。

2. 搭建Java后端服务:用Spring Boot 2.7.x + MyBatis-Plus快速生成CRUD骨架

2.1 为什么选Spring Boot 2.7.x而不是3.x?版本兼容性是毕业设计的生命线

很多同学一上来就拉最新版Spring Boot 3.x,结果发现MyBatis-Plus 3.5.x不兼容、HikariCP连接池报java.lang.NoClassDefFoundError: jakarta/servlet/Filter、甚至Lombok注解处理器失效。毕业设计阶段,稳定压倒一切。Spring Boot 2.7.x(推荐2.7.18)+ MyBatis-Plus 3.5.3.1 是经过大量学生项目验证的黄金组合:它默认使用Java 8(学校机房JDK版本友好)、内嵌Tomcat 9(无需额外部署)、MyBatis-Plus的@TableName和@TableField能直接映射会议室表字段,且自动生成的IService接口让“新增预约”这种操作一行代码搞定。更重要的是,它的错误日志足够直白——比如数据库连不上,会明确提示Failed to obtain JDBC Connection并附带URL和用户名,而不是Spring Boot 3.x里那种嵌套十几层的jakarta包异常。

提示:不要用IDEA的Spring Initializr默认勾选全部依赖。只保留Spring Web、MyBatis Framework、MySQL Driver、Lombok四项。其他如Spring Security或Redis留到功能扩展阶段再加,避免初期配置爆炸。

2.2 创建核心实体类与Mapper:用MyBatis-Plus注解替代XML手写SQL

会议室管理的核心数据模型其实很轻量:room(会议室)、booking(预约记录)、user(用户)。我们先定义Booking实体,它承载了毕业设计里最关键的业务逻辑:

// src/main/java/com/example/meeting/entity/Booking.java import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; @Data @TableName("booking") public class Booking { @TableId(type = IdType.AUTO) // 主键自增,避免UUID导致MySQL排序混乱 private Long id; private Long roomId; // 关联会议室ID private Long userId; // 预约人ID private LocalDateTime startTime; // 开始时间,用LocalDateTime而非Date(Java 8时间API更安全) private LocalDateTime endTime; // 结束时间 private Integer status; // 状态:0-待审核,1-已通过,2-已拒绝,3-已取消 @TableField(fill = FieldFill.INSERT) // 创建时间自动填充 private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) // 更新时间自动填充 private LocalDateTime updateTime; }

关键参数说明:

  • @TableName("booking"):强制指定数据库表名,避免MyBatis-Plus默认按驼峰转下划线(如Booking→booking)出错;
  • LocalDateTime:比Date更精确,且不会因时区转换导致时间偏移(毕业设计演示时最怕“明明填的9点,显示成7点”);
  • status字段用Integer而非枚举:方便小程序前端用数字判断状态(if (status === 1) show '已通过'),避免序列化枚举名引发的JSON解析失败。

接着生成Mapper接口,MyBatis-Plus的BaseMapper已封装好insert()、selectById()等方法:

// src/main/java/com/example/meeting/mapper/BookingMapper.java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.meeting.entity.Booking; import org.apache.ibatis.annotations.Mapper; @Mapper public interface BookingMapper extends BaseMapper<Booking> { // 这里可以写自定义SQL,比如“查询某会议室在某时间段是否被占用” // 但毕业设计初期,用BaseMapper的通用方法完全够用 }

逻辑说明:@Mapper注解让Spring Boot扫描到该接口;BaseMapper<Booking>意味着你无需写任何XML文件,bookingMapper.insert(booking)就能插入一条预约记录。这是毕业设计快速落地的关键——把精力留给业务逻辑,而不是SQL拼接。

2.3 配置application.yml:数据库连接与MyBatis-Plus行为的6个必调参数

src/main/resources/application.yml是后端能否启动的第一道关卡。以下配置经实测可避开80%的连接失败问题:

spring: datasource: url: jdbc:mysql://localhost:3306/meeting_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # 关键:关闭JPA自动建表,避免覆盖你手动创建的表结构 jpa: hibernate: ddl-auto: none mybatis-plus: configuration: # 开启下划线转驼峰,否则数据库字段room_name无法映射到Java属性roomName map-underscore-to-camel-case: true global-config: db-config: # 主键策略设为AUTO,对应@TableId(type = IdType.AUTO) id-type: auto # 表名前缀,如果所有表都带meeting_前缀(如meeting_booking),这里填"meeting_" table-prefix: ""

参数说明:

  • serverTimezone=Asia/Shanghai:必须显式指定,否则MySQL 8.0+会报The server time zone value 'UTC' is unrecognized;
  • allowPublicKeyRetrieval=true:解决MySQL 8.0+驱动认证问题,不加此参数可能连不上;
  • map-underscore-to-camel-case: true:这是血泪经验——数据库字段start_time必须自动映射为Java属性startTime,否则booking.getStartTime()永远为null;
  • ddl-auto: none:毕业设计严禁让框架自动建表!你的room表结构(含capacity容量字段、equipment设备描述)必须自己用SQL创建,否则答辩时老师问“会议室容量怎么存的”,你答“框架自动生成的”,立刻露馅。

3. 设计小程序前端:用WXML+WXSS实现「预约-审核-查看」三页闭环

3.1 页面结构规划:为什么只做3个核心页面,却能覆盖全部答辩演示点?

小程序页面太多反而暴露逻辑漏洞。我建议严格限定为三个页面:

  • pages/index/index:会议室列表页(展示名称、容量、当前状态);
  • pages/book/book:预约填写页(选择会议室、日期、时段、事由);
  • pages/admin/admin:管理员审核页(仅开发时用,演示时切换账号即可)。

这三个页面恰好对应答辩三大演示环节:
①展示系统入口→ 扫码进入index页,看到真实会议室照片和实时状态(如“301室:空闲”);
②演示核心流程→ 点击“预约”跳转book页,填完提交后弹出“预约成功”,后台数据库booking表立即多出一条记录;
③体现管理能力→ 切换管理员账号进入admin页,看到待审核列表,点击“通过”后,原预约人小程序首页状态实时变为“已通过”。

这种设计让老师一眼看懂“数据怎么流动”,而不是陷入“这个按钮触发了几个API”的细节迷宫。

3.2 WXML模板:用wx:for动态渲染会议室列表,避免硬编码

pages/index/index.wxml是用户第一眼看到的界面,必须简洁有力:

<!-- pages/index/index.wxml --> <view class="container"> <text class="title">软件学院会议室</text> <!-- 动态渲染会议室列表 --> <view wx:for="{{rooms}}" wx:key="id" class="room-card"> <view class="room-header"> <text class="room-name">{{item.name}}</text> <text class="room-capacity">{{item.capacity}}人</text> </view> <view class="room-status"> <text class="status-text" wx:if="{{item.status === 'available'}}">✅ 空闲</text> <text class="status-text" wx:elif="{{item.status === 'busy'}}">⚠️ 使用中</text> <text class="status-text" wx:else="true">⏳ 审核中</text> </view> <button bindtap="handleBook">/* pages/index/index.wxss */ .container { padding: 20rpx; background-color: #f5f5f5; } .title { font-size: 36rpx; font-weight: bold; color: #333; text-align: center; margin-bottom: 30rpx; } .room-card { background: white; border-radius: 12rpx; padding: 24rpx; margin-bottom: 20rpx; box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.05); } .room-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16rpx; } .room-name { font-size: 32rpx; font-weight: bold; color: #222; } .room-capacity { font-size: 24rpx; color: #666; } .room-status { margin-bottom: 24rpx; } .status-text { font-size: 26rpx; padding: 4rpx 12rpx; border-radius: 4rpx; } .book-btn { width: 100%; height: 80rpx; background: linear-gradient(135deg, #4CAF50, #2E7D32); color: white; font-size: 28rpx; border-radius: 8rpx; margin-top: 10rpx; }

参数说明:

  • rpx单位:小程序推荐单位,1rpx = 屏幕宽度/750,确保iPhone和安卓机显示一致;
  • box-shadow:轻微阴影提升卡片立体感,比纯白背景更专业;
  • linear-gradient:按钮渐变色比纯色更符合现代UI审美,且答辩PPT截图时更醒目。

4. 实现核心业务逻辑:会议室冲突检测与状态流转的3个关键算法

4.1 冲突检测算法:用时间区间重叠公式,比查数据库更可靠

预约时最怕“两人同时约同一时段”。很多同学用SQL查SELECT * FROM booking WHERE room_id = ? AND start_time < ? AND end_time > ?,但这种写法在边界时间(如A约9:00-10:00,B约10:00-11:00)会漏判。正确做法是用数学公式判断区间重叠:

两个区间[A,B]和[C,D]重叠 ⇔ A < D 且 C < B

后端BookingService中实现:

// src/main/java/com/example/meeting/service/BookingService.java public boolean isTimeConflict(Long roomId, LocalDateTime start, LocalDateTime end) { // 查询该会议室所有“已通过”且未结束的预约 QueryWrapper<Booking> wrapper = new QueryWrapper<>(); wrapper.eq("room_id", roomId) .eq("status", 1) // 1=已通过 .gt("end_time", start.minusMinutes(1)) // 防止毫秒级误差,提前1分钟 .lt("start_time", end.plusMinutes(1)); // 关键:用重叠公式反向查询——查出所有与[start,end]重叠的记录 // 即:existing.start < end && existing.end > start List<Booking> conflicts = bookingMapper.selectList(wrapper); return !conflicts.isEmpty(); }

逻辑说明:

  • start.minusMinutes(1)和end.plusMinutes(1)是防抖处理,避免因数据库存储精度(如2024-05-20 09:00:00.000vs2024-05-20 09:00:00.123)导致误判;
  • 该算法时间复杂度O(n),对毕业设计几十条数据完全无压力;若未来数据量大,可加索引ALTER TABLE booking ADD INDEX idx_room_time (room_id, start_time, end_time);。

4.2 状态机设计:用Integer状态码驱动全流程,避免if-else地狱

会议室预约涉及5种状态:0-待提交、1-待审核、2-已通过、3-已拒绝、4-已取消。很多同学用字符串"pending"、"approved",结果前端解析JSON时大小写不一致。统一用Integer,并在Service中封装状态流转规则:

// src/main/java/com/example/meeting/service/BookingService.java public void updateStatus(Long bookingId, Integer newStatus) { Booking booking = bookingMapper.selectById(bookingId); if (booking == null) throw new RuntimeException("预约不存在"); // 状态流转校验:只能从“待审核”到“通过/拒绝”,不能从“已通过”再改状态 if (booking.getStatus() == 1) { // 待审核 if (newStatus == 2 || newStatus == 3) { booking.setStatus(newStatus); booking.setUpdateTime(LocalDateTime.now()); bookingMapper.updateById(booking); } else { throw new RuntimeException("非法状态变更:待审核只能转为通过或拒绝"); } } else if (booking.getStatus() == 2) { // 已通过 if (newStatus == 4) { // 允许已通过→已取消 booking.setStatus(4); booking.setUpdateTime(LocalDateTime.now()); bookingMapper.updateById(booking); } else { throw new RuntimeException("已通过的预约只能取消"); } } else { throw new RuntimeException("当前状态不支持变更"); } }

参数说明:

  • 答辩时老师常问“怎么防止管理员误操作”,这段代码就是答案——状态机强制约束;
  • throw new RuntimeException会返回HTTP 500,小程序端捕获后提示“状态变更失败,请重试”,体验比静默失败好得多。

4.3 实时通知机制:用小程序云开发的订阅消息,替代WebSocket的复杂配置

毕业设计不必追求“秒级推送”。微信小程序提供wx.requestSubscribeMessage订阅消息,用户授权后,后端调用POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send即可发送模板消息。模板ID在小程序后台申请(如at001:会议室预约结果通知),后端Java代码:

// 调用微信模板消息API(简化版,实际需AccessToken) public void sendBookingResult(String openId, String templateId, String bookingId) { String accessToken = getAccessToken(); // 从微信服务器获取 String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken; Map<String, Object> data = new HashMap<>(); data.put("touser", openId); data.put("template_id", templateId); data.put("page", "pages/index/index"); // 点击消息跳转首页 Map<String, Map<String, String>> msgData = new HashMap<>(); msgData.put("thing1", Map.of("value", "会议室预约")); // 模板字段 msgData.put("time2", Map.of("value", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))); msgData.put("phrase3", Map.of("value", bookingId.equals("2") ? "已通过" : "已拒绝")); data.put("data", msgData); // 发送HTTP POST请求(用OkHttp或RestTemplate) restTemplate.postForObject(url, data, String.class); }

逻辑说明:

  • 订阅消息是微信官方方案,无需自己搭WebSocket服务器,避免“连接超时”“心跳失败”等黑匣子问题;
  • 模板消息内容必须与申请时一致,字段名thing1、time2不能写错,否则40001错误;
  • page参数让老师点击消息直接跳转小程序,演示时说“您刚收到一条预约结果通知,点开就能看到”,瞬间提升完成度。

5. 数据库设计与初始化:用MySQL Workbench建模,导出SQL脚本供答辩备份

5.1 ER图核心三张表:room、user、booking的字段设计依据

毕业设计数据库不能只有id和name。我按答辩高频问题反向设计字段:

表名字段名类型是否为空注释设计依据
roomidBIGINT PKNOT NULL主键—
nameVARCHAR(50)NOT NULL会议室名称(如“301报告厅”)老师必问:“怎么区分不同会议室?”
capacityINTNOT NULL容纳人数回答“为什么选这个会议室?”
equipmentTEXTNULL设备列表(投影仪、白板)体现需求分析深度
statusTINYINTNOT NULL当前状态:0-正常,1-维修中预留扩展性
useridBIGINT PKNOT NULL——
open_idVARCHAR(100)NOT NULL微信用户唯一标识小程序登录凭证
nameVARCHAR(30)NOT NULL姓名答辩时展示真实姓名
departmentVARCHAR(50)NULL所属部门(如“软件学院”)体现组织架构
bookingidBIGINT PKNOT NULL——
room_idBIGINTNOT NULL外键关联room.id建立关系
user_idBIGINTNOT NULL外键关联user.id—
start_timeDATETIMENOT NULL开始时间时间字段必须精确到分
end_timeDATETIMENOT NULL结束时间—
reasonVARCHAR(200)NULL预约事由老师问“用来干什么?”
statusTINYINTNOT NULL状态码(0-4)统一状态机

注意:open_id字段必须设为VARCHAR(100),微信官方文档明确最长100字符;设成VARCHAR(50)会导致部分用户登录失败,且错误日志不提示具体原因。

5.2 初始化SQL脚本:含测试数据,答辩时一键导入演示

init.sql脚本必须包含建表语句+3条测试数据,确保答辩现场不因“没数据”冷场:

-- 创建room表 CREATE TABLE `room` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `capacity` int NOT NULL DEFAULT '0', `equipment` text, `status` tinyint NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 插入测试会议室 INSERT INTO `room` VALUES (1,'301报告厅',80,'投影仪、电子白板、音响系统',0), (2,'402研讨室',20,'投影仪、圆桌、无线投屏',0), (3,'503自习室',15,'插座充足、静音环境',0); -- 创建user表(模拟3个用户:学生、教师、管理员) INSERT INTO `user` VALUES (1,'oAbc123456789012345678901234','张三','软件学院'), (2,'oAbc123456789012345678901235','李四','软件学院'), (3,'oAbc123456789012345678901236','王五','软件学院'); -- 创建booking表(模拟1条已通过预约) INSERT INTO `booking` VALUES (1,1,1,'2024-05-20 09:00:00','2024-05-20 11:00:00','毕业答辩彩排',2,NOW(),NOW());

关键点:

  • ENGINE=InnoDB:必须指定,否则外键约束无效;
  • DEFAULT CHARSET=utf8mb4:支持emoji(如用户昵称带😊),避免插入时报错;
  • 测试数据含status=2(已通过),确保小程序首页能显示“✅ 已通过”状态,证明状态流转生效。

6. 避坑指南:毕业设计答辩前必查的5个致命问题与解决方案

6.1 现象:小程序调用wx.request报request:fail net::ERR_CONNECTION_REFUSED

原因:后端服务未启动,或小程序project.config.json中appid与后端application.yml的wechat.appid不一致,导致域名未配置。
解决:
① 在IDEA中确认Spring Boot控制台输出Tomcat started on port(s): 8080;
② 小程序开发者工具 → 右上角“详情” → “本地设置” → 勾选“不校验合法域名”,仅限开发时用;
③ 正式提交前,在小程序后台“开发管理”→“开发设置”→“服务器域名”添加https://yourdomain.com(若用本地IP,填http://192.168.x.x:8080,需开启“不校验”)。

6.2 现象:MySQL插入中文显示为??,如“301报告厅”变成“301????”

原因:MySQL服务端字符集非utf8mb4,或连接URL未指定characterEncoding=utf8mb4。
解决:
① 登录MySQL执行SHOW VARIABLES LIKE 'character_set_%';,确认character_set_server为utf8mb4;
② 若不是,修改my.cnf:

[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci [client] default-character-set = utf8mb4

③ 重启MySQL,并重新执行init.sql(注意CREATE TABLE语句中的DEFAULT CHARSET=utf8mb4)。

6.3 现象:小程序wx:for列表为空,控制台无报错

原因:后端返回JSON格式错误,如{"code":200,"data":[]},但小程序JS中res.data直接赋值给this.setData({rooms: res.data}),而res.data其实是{code:200,data:[...]}对象,非数组。
解决:
后端统一返回格式(推荐):

public class Result<T> { private int code; private String msg; private T data; // getter/setter }

小程序端:

wx.request({ success: (res) => { if (res.data.code === 200) { this.setData({ rooms: res.data.data }); // 注意是res.data.data } } });

6.4 现象:管理员审核后,预约人小程序首页状态未更新

原因:小程序页面未主动刷新,或onShow生命周期中未调用getBookingList()。
解决:
在pages/index/index.js中:

onShow() { // 页面显示时重新拉取数据,确保状态最新 this.getRoomList(); }, getRoomList() { wx.request({ url: 'http://localhost:8080/api/room/list', success: (res) => { this.setData({ rooms: res.data.data }); } }); }

6.5 现象:答辩演示时,老师用自己手机扫码,显示“用户不存在”

原因:后端user表只插了3条测试数据,新用户open_id不在表中,登录接口直接返回404。
解决:
在用户登录接口中增加自动注册逻辑:

@PostMapping("/login") public Result<User> login(@RequestBody Map<String, String> params) { String openId = params.get("openId"); User user = userService.getByOpenId(openId); if (user == null) { // 自动注册:生成默认姓名“微信用户xxx”,部门“软件学院” user = new User(); user.setOpenId(openId); user.setName("微信用户" + openId.substring(0, 6)); user.setDepartment("软件学院"); userService.save(user); } return Result.success(user); }

7. 演示视频录制与答辩技巧:用3个镜头语言讲清技术价值,让老师记住你的名字

7.1 视频结构:按“问题-方案-效果”三幕剧设计,总时长控制在3分30秒内

毕业设计演示视频不是功能罗列,而是讲故事。我建议严格按此节奏剪辑:

时间段镜头画面旁白(字幕)技术点
0:00-0:25全景手机扫二维码,进入小程序首页“这是软件学院会议室管理系统,解决传统电话预约效率低、易冲突的问题”点明现实痛点
0:26-1:40特写手指点击“301报告厅”→填写时间→提交→弹出“预约成功”→切到MySQL Workbench,booking表新增记录“用户发起预约,后端通过时间重叠算法实时检测冲突,数据落库毫秒级完成”核心算法+数据闭环
1:41-3:30分屏左:管理员账号进入审核页,点击“通过”;右:原预约人手机小程序首页,状态从“⏳ 审核中”变为“✅ 已通过”,并弹出模板消息“状态机驱动全流程,结合微信订阅消息,实现跨端实时同步”状态设计+消息通知

关键技巧:

  • 不念代码:视频里绝不出现IDEA代码编辑器,只展示终端日志(如Booking saved successfully)和数据库变化;
  • 强调数字:说“毫秒级完成”比“很快完成”更可信,“301报告厅容纳80人”比“大会议室”更专业;
  • 预留3秒黑屏:结尾停在小程序首页“✅ 已通过”状态,让老师看清结果。

7.2 答辩话术:当老师问“这个系统和钉钉/企业微信有什么区别?”时的标准回答

别掉进“比较竞品”的陷阱。聚焦你的技术决策:

“老师,钉钉和企业微信是通用平台,而我们的系统是垂直场景的轻量化实现。比如会议室冲突检测,我们用数学公式A < D && C < B精准判断时间重叠,比通用平台的模糊匹配更可靠;再比如状态流转,我们用Integer状态码+服务端校验,确保‘待审核’只能转为‘通过/拒绝’,杜绝业务逻辑漏洞。这正是毕业设计的价值——在小切口里,把一个功能做深、做透、做可验证。”

这句话背后是你对状态机、时间算法、数据库约束的扎实实现,老师听懂了,分数自然高。

7.3 最后检查清单:答辩前2小时必须完成的7件事

  1. 数据库:执行SELECT COUNT(*) FROM booking;确认有≥1条测试数据;
  2. 后端:访问http://localhost:8080/swagger-ui.html(若集成Swagger),确认所有API可调用;
  3. 小程序:开发者工具 → “编译” → 检查Console无红色报错;
  4. 演示账号:准备2个微信账号(学生+管理员),分别扫码登录,确认权限分离;
  5. 网络:关闭电脑防火墙,确保手机和电脑在同一WiFi,ping 192.168.x.x通;
  6. 视频:用OBS录屏,分辨率设为1080p,导出MP4,用格式工厂压缩至≤50MB;
  7. 源码包:zip压缩时,根目录必须含README.md(写清运行步骤)、src/(后端代码)、miniprogram/(小程序代码)、init.sql(数据库脚本)。

我带过的某高校毕业设计小组,有位A同学按这个流程走,在答辩最后环节,老师指着他的演示视频说:“这个时间冲突检测的思路,比你们系去年获奖项目还清晰。”那一刻我知道,他不仅过了,还留下了技术印记。希望这篇笔记里每一个@TableId、每一行wx:for、每一个避坑点,都能成为你答辩桌上那张“让老师眼前一亮”的底牌。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 11:06:52

SecureCRT汉化绿色版详解:SSH连接、串口调试与配置避坑指南

简介&#xff1a;面向网络运维、系统管理与开发调试场景&#xff0c;该资源提供了 SecureCRT 与 SecureFX 的中文汉化绿色版&#xff0c;免安装、解压即用&#xff0c;兼容 32 位与 64 位系统&#xff0c;适合需要 SSH/Telnet 远程登录及 SFTP 文件传输的日常使用者。压缩包采用…

作者头像 李华
网站建设 2026/10/18 11:02:58

Stove Protocol拆解:股票代币化从镜像到原生资产的全生命周期范式

这几年做资产代币化的人&#xff0c;多多少少都有一种挫败感。概念讲了七八年&#xff0c;案例也落地了不少&#xff0c;但行业内始终觉得差口气&#xff1a;链上发行的证券化资产&#xff0c;要么只是把一份PDF证书换成了链上凭证&#xff0c;要么合规环节靠手工线下跑&#x…

作者头像 李华
网站建设 2026/10/18 11:02:51

HTML调试实战:从乱码到样式丢失的根因定位与开发者工具用法

有一次我帮人排查一个问题&#xff1a;一个HTML文件在电脑A上打开完全正常&#xff0c;复制到电脑B后就变成乱码加样式丢失。折腾半天&#xff0c;最后发现根因不过是文件保存时多了个编码声明&#xff0c;加上css路径用了绝对路径。这类事看着小&#xff0c;但特别能说明问题—…

作者头像 李华
网站建设 2026/10/18 11:01:18

Netty学习笔记03、Netty组件学习

文章目录 前言 一、认识Netty 1.1 Netty 是什么? 1.2 Netty 的作者 1.3 Netty 的地位 1.4 Netty 的优势 二、netty入门程序HelloWorld! 2.1、netty入门:客户端->服务端 helloworld 2.1.1、服务端 2.1.2、客户端 2.2、流程梳理 2.3、netty-helloworld的各个组件通俗介绍 三…

作者头像 李华
网站建设 2026/10/18 10:59:13

虚拟列表原理与实现:固定高度模型从零搭建高性能滚动列表

1. 为什么非用虚拟列表不可&#xff1a;渲染巨量数据前的最后一道防线做前端的人迟早会遇到一个经典场景&#xff1a;后端一次性给你甩了 10000 条甚至 100000 条数据&#xff0c;要求在页面上做成列表展示。第一次遇到的人多半直接map一把梭&#xff0c;结果浏览器立刻教做人—…

作者头像 李华
网站建设 2026/10/18 10:57:57

PSR开关电源EMC设计实战:从噪声源头到PCB布局的完整指南

1. 从一块炸机的电源板说起&#xff1a;为什么PSR架构的EMC这么难缠PSR&#xff0c;也就是原边反馈&#xff08;Primary Side Regulation&#xff09;&#xff0c;在中小功率开关电源里是个绕不开的架构。它省掉了光耦和TL431那一套副边反馈网络&#xff0c;成本低、元件少、可…

作者头像 李华