SpringBoot+Vue房屋租赁系统毕设:数据库设计到前端部署全流程解析
2026/9/24 21:53:49 网站建设 项目流程

又快到了毕设季。每年这个时候总有人拿一套源码来找我:“学长,为什么我跑不起来?”我点开一看,很多项目的源码和数据库脚本本身没太大毛病,问题全出在环境差异、版本不匹配,还有对整体流程根本不熟。今天拿这套SpringBoot+Vue的房屋租赁系统平台来做例子,完整源码、SQL脚本、接口文档都摆在手边,我把从数据库到前端页面的完整链路拆一遍,每一步怎么跑通、每个模块怎么实现、每个坑长什么样,一次性讲透。这篇内容适合三类人:做Java Web毕设想找可靠项目参考的同学、刚学完SpringBoot和Vue想找个完整项目练手的初学者,以及想搞明白前后端分离项目到底怎么组织的在校生。

1. 项目全貌:这套毕设源码包里到底藏了多少东西

1.1 从一张“房东-租客”的业务图说起

房屋租赁系统听起来复杂,本质上是把线下租房的流程搬到线上。线下你租房要看房、问价格、签约、交租金、到期退租,系统就是把这几件事拆成功能模块。

拿到这套源码,第一件事不是急着启动,而是先看业务边界。通常这套系统会分成两个端:用户端和管理端。用户端面向普通租客和房东,核心功能围绕“找房—看房—下单—租住—退租”这条主链路展开,包括注册登录、房源浏览、按区域租金筛选、房源收藏、在线下单租房、订单状态查询、退租申请、公告查看和个人信息维护。管理端则是管理员的工作台,负责房源审核上下架、订单处理、用户管理、公告发布和留言反馈处理。

理解业务边界很重要,因为后面所有表和接口都是围绕这张图转的。你要是上来就埋头看代码,很容易被Controller层几十个接口搞晕;先花半小时把功能模块画出来,整个源码的结构就清晰了。

1.2 为什么是SpringBoot+Vue:选型逻辑不是跟风

这套项目用SpringBoot做后端、Vue做前端,已经是Java Web毕设里最主流的组合了,但选它不是因为“所有人都这么干就跟着干”,而是有充分的理由。

后端用SpringBoot,最大的价值是解决了配置地狱。早期SSH、SSM那套方案要写一堆XML配置文件,SpringBoot用自动配置把大部分默认行为都做好了,你只需要在application.yml里写上数据源、端口、JWT密钥这些关键信息,就能跑起来一个可用的Web服务。对毕设来说,开发效率是第一位的,SpringBoot自带的嵌入式Tomcat也让部署变得极其简单,不需要额外装Tomcat容器。

前端选Vue,核心原因是组件化开发让页面复用变得很自然。房源卡片、分页条、表单弹窗这些都是高复用组件,写一次到处用。再加上Vue Router做页面跳转、Vuex或Pinia做状态管理,前后端通过JSON接口通信,职责边界非常清晰。整套组合学习成本不高,网上资料也全,遇到问题随便一搜就能找到解决方案,这对毕设阶段来说比技术本身新不新重要得多。

1.3 代码目录怎么组织,才会让老师看第一眼就加分

源码拿到手,先看目录结构,好的分层能看出一个开发者的基本功。这套项目的后端目录是典型的com.xxx.rent分包结构,entity放数据库实体类,mapper放数据访问接口和XML,service写业务逻辑,controller暴露HTTP接口,config放配置类,utils放工具类,common放统一返回结果和异常处理。这种分包方式的好处是每一层职责单一,出问题时定位快,答辩时讲起来也清晰。

前端目录也一样,views放页面组件,router放路由配置,api放封装好的请求方法,store放全局状态,components放复用组件。我特别建议你把前端每个页面的代码控制在200行以内,业务逻辑尽量抽到api层和store层,否则一个页面文件上千行,不光自己看着头疼,老师问起来你都说不清哪块是干嘛的。

2. 数据库脚本拆解:房屋租赁系统的表关系网

2.1 核心表结构盘点

SQL脚本是整个项目中价值密度最高的部分,哪怕是代码写得很一般的毕设项目,表设计也往往能看出不少心思。这套系统的SQL脚本拿到手,我建议先按“用户—房源—订单”这条主链去梳理表结构。

用户表(user)是最基础的,字段一般包含主键id、用户名、密码、真实姓名、手机号、头像、角色role、注册时间。角色字段很关键,通常用数字0、1、2区分普通用户、房东和管理员,权限控制全靠它。房源表(house)是最核心的一张业务表,字段会比较多,比如标题、封面图、轮播图、户型、面积、楼层、朝向、装修情况、月租金、所在省市区、详细地址、房源描述、出租状态status、发布人id和创建时间。

订单表(rent_order)则记录每一次租房交易,字段包括订单号、房源id、租客id、房东id、起租日期、结束日期、租期月份数、总租金、订单状态status、创建时间和更新时间。围绕这三张主表,还会有房屋类型表(house_type)、收藏表(favorite)、公告表(notice)、留言反馈表(feedback)等辅助表。

2.2 状态字段与业务流转:订单不是简单的增删改查

我第一次带学生做这类项目时发现,很多人把订单表当成普通的增删改查来做,结果状态一多就乱套。房屋租赁系统的核心难点不在CRUD,而在订单状态流转。

常见的订单状态可以设计为:0待审核、1已生效、2已退租、3已拒绝。租客下单后订单进入待审核,管理员或房东审核通过后变为已生效,租期到了或者申请退租被批准后变为已退租,如果房源条件不符或者已被出租,则可以拒绝。这个状态机一定要在代码里统一管理,前端展示按钮时根据状态判断显示“确认收房”“申请退租”“撤销订单”等操作,后端处理时也要校验前置状态。

设计表的时候,订单号最好单独用一个字段,格式可以用日期加随机数,比如20250528001。这样做的原因是订单号要展示给用户看,也用它在日志里追踪问题,自增id不适合直接暴露。还有一个细节,房源表里建议加一个version字段做乐观锁,防止两个租客同时下单同一套房导致超卖,这个在答辩时是非常能加分的点。

2.3 SQL脚本导入的三种姿势和常见翻车点

拿到rent.sql之后,怎么把它导进自己的数据库?这里有三种方式,任选其一。

第一种是命令行导入,在终端执行mysql -u root -p rent_house < rent.sql,前提是你已经建好了rent_house这个空数据库。这种方式最不容易出问题,推荐优先用。第二种是Navicat或DBeaver里右键数据库选择“运行SQL文件”,图形化界面操作直观,适合不习惯命令行的同学。第三种是直接在数据库客户端里打开SQL文件全选执行,小项目没问题,但如果脚本里包含建库语句,执行时就要注意当前连接的库对不对。

翻车点集中在两个地方。一个是字符集,导入的SQL文件必须保证是utf8mb4编码,否则中文会变成乱码,Windows下尤其容易踩这个坑,我建议打开SQL文件看一眼头部的CREATE DATABASE语句有没有DEFAULT CHARSET=utf8mb4。另一个是版本兼容,如果SQL脚本里用了MySQL 8.0的语法,比如WITH窗口函数或者是新的默认认证插件caching_sha2_password,在MySQL 5.7上就可能连不上或者报语法错误。导入之前先确认脚本适配哪个版本,能省下不少排查时间。

3. 后端接口实现:Controller-Service-Mapper怎么组织才经得起追问

3.1 登录鉴权:从JWT到拦截器的完整链路

这套系统的接口文档里,第一类接口肯定是登录注册相关。传统的Session方案在前后端分离项目里已经不占优势,因为前端可能是多端的,Session的跨域和共享问题处理起来很麻烦,所以这套项目用的是JWT(JSON Web Token)方案。

JWT的流程是这样的:用户在登录页输入账号密码,后端校验通过后用密钥生成一个token返回给前端,前端把它存在localStorage里,之后每次请求都在Header里带上Authorization: Bearer 。后端写一个拦截器,把所有需要登录的接口拦住,取到token后解析出用户id和角色,放行或者返回401。这样服务端不保存登录状态,天然支持分布式部署,接口无状态,很好用。

写拦截器的时候要注意放行路径的配置。登录、注册、房源列表、房源详情这些接口是匿名访问的,不能拦截,否则前端还没登录就连房源都看不到。我见过不少项目把拦截范围配错了,导致登录页都进不来,这种问题排查起来往往要花很长时间,建议在WebConfig配置类里明确写清楚excludePathPatterns的列表。

3.2 房源分页检索的核心实现

房源列表页面是一套房源多条件组合查询的典型场景,也是这套系统接口层最值得细看的部分。

后端实现用的是MyBatis-Plus的分页插件,只需要在配置类里注册一个MybatisPlusInterceptor,添加PaginationInnerInterceptor,然后你的Service层就可以直接调用page方法。和传统手写LIMIT记录偏移量相比,分页插件能自动帮你拼接count查询和limit语句,省去大量重复代码。我这几年带过不少项目,从手写分页迁移到MyBatis-Plus之后,代码量基本能砍掉三分之一,而且分页参数pageNum、pageSize的边界处理也自动做好了。

组合查询的条件构造是另一个核心。前端传来小区关键词、城市区域、价格区间、户型等参数,后端用LambdaQueryWrapper把这些条件像搭积木一样拼起来。区域用eq精确匹配,关键词用like模糊匹配,价格区间用ge和le拼接。这里要提醒一句,所有用户传入的参数都必须用MyBatis的#{}参数占位预编译,绝对不能把参数直接拼接进SQL字符串。

3.3 接口安全细节:参数校验、SQL注入与统一返回体

答辩时老师最喜欢问的一个问题就是:你的接口安全怎么做?这个问题回答好了,整个项目的水准都会被拉高。

第一是参数校验。实体类字段上标注@NotBlank、@Email、@Min这类注解,Controller层接口参数前加@Validated,框架会在进入业务逻辑之前就把非法参数拦下来。第二是防SQL注入,上面提到了用#{}预编译,这是根本手段,不要在XML或注解里写${}拼接。第三是统一返回体和全局异常处理,定义一个Result 类,包含code、message、data三个字段,再写一个@RestControllerAdvice全局异常处理器,把业务异常、参数校验异常、未知异常都转成统一的JSON结构返回给前端。这样做的好处是前端只需要处理一种数据格式,拦截器的401判断也只用看code就行。

这套项目里还应该处理密码加密。明文存密码是我见过最多也是最严重的安全硬伤,真到了答辩演示环节老师盯一眼就能看出来。建议使用BCryptPasswordEncoder对密码做哈希加密,登录时用matches方法比对,就算数据库泄露,密码也不会轻易暴露。这里顺便提一下XSS防护,如果有留言评论功能,前端展示时对文本内容做转义处理,后端也建议加一个全局过滤器对请求参数做清理,这两个举措能挡住大部分脚本注入攻击。

4. 前端Vue侧最容易出问题的几个环节

4.1 路由设计与页面权限控制

前端路由设计直接决定了这个系统用起来顺不顺手。我建议把页面按角色拆分成三个区域:不需要登录就能访问的页面、登录用户才能访问的页面、管理员才能访问的页面。在Vue Router配置里,每个路由对象都可以带meta字段,里面写上requiresAuth和role属性,然后在路由的beforeEach守卫里做统一判断。

比如访问发布房源或者管理后台时,如果token不存在或者角色不匹配,就强制跳回登录页。这里有个细节是,前端的路由守卫只能控制页面显示层面,真正的安全性一定要由后端接口拦截器保证,因为接口是可以被直接调用的,前端的跳转限制只是改善用户体验,不能作为安全防线。

4.2 Axios封装与401拦截到底在解决什么问题

这套项目的前端请求几乎全部通过Axios发出,所以封装一个统一的请求实例非常值得做。在api目录下创建一个request.js,用axios.create设置baseURL和超时时间,这个baseURL要和后端的接口前缀对上,然后通过请求拦截器从localStorage取出token,自动添加到请求头的Authorization字段。

响应拦截器做的事情更多。正常情况拿到后端返回的Result对象后,先判断code,如果code不为200则弹出错误提示;如果跳转到登录页才能解决。这套统一拦截机制能避免在每个页面里重复写错误处理逻辑,代码会干净很多。

4.3 房源列表到详情页的数据流转

房源列表页到详情页的数据流转,是很多前端新手卡壳最多的地方。常见做法有两种:一种是用URL传参,列表页点击卡片时通过this.$router.push({ path: '/house/detail', query: { id: row.id } }),详情页用this.$route.query.id拿到房源id,再调详情接口拿完整数据;另一种是放在状态管理里,列表页把当前选中的房源对象存到store,详情页直接从store里读。

我比较推荐第一种URL传参的方式。理由很简单,详情页是一个可以被分享的页面,如果数据放在内存里,刷新页面就丢了,还得重新进列表。URL传参则保证刷新后页面还能正常工作,只需要根据id重新查询一次。页面初始化时从URL读取参数这个动作,建议放在created生命周期里执行,这样进入页面第一时间就能发出请求。

5. 从空环境到跑通系统的完整手脚架

5.1 环境清单:别在版本上翻车

一个SpringBoot+Vue项目跑不起来,十有八九是环境版本问题,而不是代码问题。我把这套项目需要的环境清单列出来,对照着检查能省下不少时间。

后端需要JDK 8或11。如果源码是SpringBoot 2.7.x,用JDK 8完全没问题;如果源码是SpringBoot 3.x,那么必须用JDK 17及以上,并且注意包名是jakarta开头的。Maven用3.6以上版本,Idea导入项目时选择自带的Maven也行,但记得检查settings.xml的镜像仓库地址,不然下载依赖会等到怀疑人生。数据库用MySQL 5.7或8.0均可,对应驱动在pom.xml里已经声明好了,导入时把application.yml里的用户名密码改成你自己的就行。

前端环境这块,Vue 2项目建议用Node 14或16,Vue 3项目建议Node 16或18。node_modules目录一般是不会打进源码包的,所以拿到项目后第一步就是进入前端目录执行npm install。如果镜像源是国外地址,安装速度会非常慢,可以换npm config set registry https://registry.npmmirror.com,实测快很多。

5.2 后端启动四步走

后端启动其实就四步:第一步用IDEA打开后端项目文件夹,等待Maven把依赖下载完,这一步取决于网络环境,快则几分钟慢则半小时;第二步打开application.yml,检查数据源配置,把url里的数据库名、用户名、密码改成你自己的,再检查JWT的密钥和过期时间配置;第三步在数据库里执行SQL脚本,把表结构和初始化数据导进去;第四步找到启动类,也就是名字带Application的那个类,点运行。

启动成功后,控制台会打印出SpringBoot的Logo和Tomcat started on port(s) 8080这样的日志。为了验证接口是不是真的通了,我习惯先在浏览器直接访问一个查询类接口,比如http://localhost:8080/api/house/list?pageNum=1&pageSize=5,能返回JSON就说明后端没问题了,然后才开始启动前端联调。

5.3 前端环境与代理配置

前端启动前,要重点检查一个文件:vue.config.js。这个文件里的devServer.proxy配置决定了前端开发服务器怎么把接口请求转发给后端。

最常见的配置方式是把所有以/api开头的请求转发到http://localhost:8080,并且通过pathRewrite把前缀去掉。这样前端的Axios请求地址就可以统一写成/api/house/list,对于开发环境和后续打包部署都非常灵活。配好代理之后,运行npm run serve,看到Compiled successfully就说明前端起来了。

这里有个坑必须提醒:如果你直接用浏览器打开前端页面后发现列表数据加载不出来,先打开浏览器的开发者工具看Network面板。如果请求接口返回的是404,多半是代理没配好或者后端没启动;如果返回的是跨域错误,说明请求没有走代理,而是直接访问了后端地址。前端配了代理之后一般不需要后端再额外处理CORS,但如果前后端部署在同一个域名下,就不会有跨域问题了。

5.4 演示数据、测试账号和验收路径

一套毕设系统给老师演示的时候,照着业务主流程走一遍比东点一个西点一个强得多。这套系统的SQL脚本里一般会带上初始化数据,至少会有一个管理员账号和几个普通用户、几条房源记录。

默认的管理员账号通常是admin,密码admin123,普通用户可以用脚本里现成的演示账号登录。我建议你把验收路径固定成一条主线:用管理员账号登录后台,发布一条新公告,再新增一条房源;退出登录,用普通用户账号进入前端,搜索结果里找到刚发布的房源,点进详情并提交租房申请;再切回管理员账号审核订单,审核通过后订单状态变成已生效;最后用普通用户账号申请退租,管理员确认后退租完成。走完这条链路,整个系统的功能就演示完整了,给老师的印象也特别好。

6. 我踩过的坑、答辩前必须准备的十个小问题

6.1 运行期最常见的五个坑

第一个坑是端口被占用。后端启动报Port 8080 was already in use,这种情况在Windows下特别常见,用netstat -ano | findstr 8080命令找到占用进程的PID,然后用taskkill /PID 进程号 /F强制结束,或者直接改application.yml里的server.port换一个端口。

第二个坑是MySQL连接串时报错。MySQL 8.0的驱动类名是com.mysql.cj.jdbc.Driver,如果是5.7则可能还是com.mysql.jdbc.Driver。另外连接URL要加上serverTimezone=Asia/Shanghai和characterEncoding=utf8,否则会出现时区报错和中文乱码。

第三个坑是JWT密钥太简单导致token可以被伪造。源码里如果写死了一个很短的密钥,建议至少换成一个32位以上的随机字符串,虽然这是毕设,但安全规范还是要有的。

第四个坑是前端npm install失败。这通常和node-sass版本与Node版本不匹配有关,解决办法是删除node_modules和package-lock.json重新安装,或者切换到项目锁定的Node版本。也可以用nvm管理Node版本,随时切换,非常方便。

第五个坑是改代码后不生效。前端改了代码没反应,先确认运行的是不是当前文件;后端改了Java代码后需要重启应用,因为SpringBoot默认没有热部署;数据库表结构变了,也要检查实体类字段是否同步。

6.2 答辩高频问题与回答要点

最后一个环节,把答辩时最容易被问到的几个问题过一遍。

“为什么选SpringBoot和Vue?”回答思路是SpringBoot简化配置和部署、生态成熟;Vue组件化开发适合前后端分离,两者结合能快速构建高维护性的Web应用。“权限控制怎么实现的?”回答思路是JWT无状态认证加后端拦截器做统一鉴权,前端用路由守卫配合控制页面入口。“订单状态为什么这么设计?”回答思路是围绕租房生命周期拆分状态机,保证业务流转清晰可追踪。这几个问题你只要把设计思路讲清楚,就已经超过大多数只背代码的同学了。

“如何防止SQL注入?”回答用MyBatis的#{}预编译机制,严禁字符串拼接SQL,再配合参数校验。“密码为什么要加密存储?”答BCrypt哈希加密,防止数据库泄露导致账号被撞库。“缓存和性能优化有没有考虑过?”如果源码里用了Redis,就讲缓存缓存热点房源数据;如果没用到,也可以说这是后续可以扩展的方向,并结合实际演示数据量说明当前不需要。“项目部署到服务器上要怎么做?”答前端打包成dist目录由Nginx托管,后端打包成jar包运行,配置反向代理把/api请求转发到后端服务。这个回答既体现了工程实践能力,也符合当前主流部署方式。

还有几个小问题也容易踩到:“用户权限校验失败是怎么处理的?”、“多条件搜索时前端参数为空字符串怎么办”、“退租申请如果还没审核期间房东又把房源租给别人怎么办”。这些问题的核心都是边界情况的处理,回答时围绕参数校验、状态机约束和数据库事务三个角度来讲,基本能做到滴水不漏。

写到这里,这套SpringBoot+Vue房屋租赁系统的完整链路已经从业务设计、表结构、后端接口、前端页面、部署联调到答辩准备全部过了一遍。我自己带过的毕设项目里,凡是能完整跑通又认真想过这几个核心问题的,答辩成绩都不会差。如果你手头正拿着这套源码在调试,建议别急着改代码,先对照这篇文章把环境、数据库、启动流程过一遍,再逐个模块去理解。项目源码只是起点,真正值钱的是你把每条请求链路、每张表的关系理清之后的那个过程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询