2026创新项目实训-项目博客(三)
2026/4/20 1:46:08
效率提升实战:基于Spring Boot的房屋租赁系统毕业设计开题与架构优化
毕设开题就像装修前的设计图,一旦画歪,后面全是返工。房屋租赁系统看似简单,但很多同学会陷入以下误区:
一句话:毕设不是商业项目,能跑、能写、能吹才是硬道理。下面给出一条“能 3 周交付”的效率路线。
| 维度 | 单体 Spring Boot | 微服务 | 传统 JDBC | MyBatis Plus |
|---|---|---|---|---|
| 启动成本 | 1 个 jar,IDE 一键跑 | N 个服务 + 网关 + 注册中心 | 手写 SQL、映射爆炸 | 内置 CRUD,分页插件 |
| 调试难度 | 低,单断点 | 高,跨服务日志追踪 | 中,SQL 散落在 DAO | 低,方法名即 SQL |
| 毕设打分 | 老师看得懂 | 老师以为你抄大厂 | 代码臃肿 | 简洁、注解友好 |
| 部署成本 | 一台 1C2G 云主机 | 容器集群,钱包先毕业 | 无连接池,易 OOM | 内置 HikariCP |
结论:毕设场景选“单体 + MyBatis Plus”性价比最高;微服务留给入职后再玩。
以“用户—房源—订单”为主线,采用“控制器→服务→持久层”纵向分包,再按业务横向拆模块:
用户认证模块
access_token+refresh_token,减少 Session 复制烦恼。UserDetailsService,角色(房东/租客/管理员)用枚举写死,省掉 RBAC 表关联。房源管理模块
订单创建模块
(house_id, tenant_id, status),防止用户手抖双击产生两条“待支付”。以下代码均来自实际毕设,可直接粘贴运行,注释比代码多,方便写论文时直接截屏。
R<T>(省略 getter/setter)/** * 全局响应包装类,论文截图利器 */ public class R<T> implements Serializable { private int code; > 0 成功,>1000 业务异常 private String msg; private T data; public static <T> R<T> ok(T data) { return new R<>(0, "success", data); } public static <T> R<T> fail(String msg) { return new R<>(1001, msg, null); } }@Component public class JwtTool { @Value("${jwt.secret}") private String secret; private final long ACCESS = 60 * 60 * 1000; // 1h private final long REFRESH = 7 * 24 * 60 * 60 * 1000; // 7d public String createAccess(String username) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + ACCESS)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } public String getUsername(String token) { return Jwts.parser().setSigningKey(secret) .parseClaimsJws(token).getBody().getSubject(); } }@RestController @RequiredArgsConstructor @RequestMapping("/house") public class HouseController { private final HouseService houseService; @PostMapping public R<String> publish(@Valid @RequestBody HouseDTO dto, @AuthenticationPrincipal User user) { Long houseId = houseService.publish(dto, user.getId()); return R.ok(houseId.toString()); } @GetMapping("/latest") @Cacheable(value = "house", key = "'latest'") public R<List<HouseVO>> latest() { return R.ok(houseService.lambdaQuery() .orderByDesc(House::getCreateTime) .last("LIMIT 10") .list() .stream().map(HouseVO::fromPO) .collect(Collectors.toList())); } }@Service public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService { @Transactional public Long createOrder(Long houseId, Long tenantId) { Order order = new Order(); order.setHouseId(houseId); order.setTenantId(tenantId); order.setStatus(OrderStatusEnum.LOCKED.getCode()); // 唯一索引兜底,重复插入会抛 DuplicateKeyException try { save(order); } catch (DuplicateKeyException e) { throw new BizException("您已提交过该房源订单,请勿重复操作"); } return order.getId(); } }以上代码遵循:
status字段用tinyint,省空间。R对象,前端无需解析一堆堆栈。库存超卖
JWT 令牌刷新
access_token过期前端用refresh_token换新的,无需重新登录。SQL 注入
lambdaQuery()根本拼接不到字符串,直接免疫。/${xxx}参数执行关键词拦截,双重保险。数据库命名
t_xxx,字段小写 + 下划线,MySQL 8 默认区分大小写,Linux 下踩坑能少一半。tinyint,注释写清0-待租 1-已租 2-退租中,方便 DBA 看懂。日志分级
dev开 DEBUG,云服务器prod只到 INFO,磁盘满过一次就知道痛。MD标记,例如订单号,ELK 收集时直接检索,排错 5 分钟搞定。本地 vs 云
备份脚本
mysqldump+ 打包到 OSS,保留 7 天,毕设演示当天误删库,3 分钟恢复,老师直呼专业。| 周次 | 目标 | 产出 |
|---|---|---|
| 第 1 周 | 需求冻结 + 原型 | 用墨刀画 10 张核心页面,写开题报告技术路线 |
| 第 2 周 | 后端完成 + 联调 | 上述代码全部跑通,接口文档放 Swagger |
| 第 3 周 | 前端收尾 + 压测 PPT | JMeter 出一份 TPS 截图,写“性能优化”章节 |
按这个节奏,第 3 周还能空出 2 天剪演示视频,答辩气定神闲。
毕设不是“造火箭”,而是“造滑板车”——能滑、不摔、外观整洁就能拿高分。本文给的 Spring Boot + MyBatis Plus 方案,已帮两届学长 3 周交稿,源码注释直接截图放论文,查重 0 风险。你可以在此基础上换前端框架、加微信小程序、甚至接入支付宝当面付,但记住:先做出 MVP,再去炫技。动手把项目跑起来,比收藏十篇架构文更有用。祝你一次答辩过,毕业快乐!