1. 项目概述:SpringBoot+Vue+MySQL全栈租房管理系统
这套租房管理系统采用当前主流的前后端分离架构,后端基于SpringBoot框架构建RESTful API,前端使用Vue.js实现动态交互界面,数据存储选用MySQL关系型数据库。系统设计目标是为房产中介、房东或物业管理公司提供完整的房源管理解决方案,包含从房源录入、租客管理到合同跟踪的全生命周期功能模块。
我在实际开发同类系统时发现,许多初学者常陷入技术堆砌的误区,而忽略了业务逻辑的完整性。这套源码的价值在于:它不仅提供了可直接运行的基础框架(包含Maven依赖配置、Vue CLI工程结构和MySQL建表脚本),更重要的是展示了如何将三大技术栈有机整合。例如在房源图片上传功能中,你会看到SpringBoot如何处理MultipartFile文件流,Vue前端如何实现拖拽上传,以及MySQL中BLOB字段与文件系统的取舍考量——这些实战细节在官方文档中往往分散在不同章节。
2. 技术栈选型与项目配置
2.1 后端技术栈深度解析
SpringBoot 2.7.x版本提供了开箱即用的特性:
- 内嵌Tomcat服务器(默认端口8080)
- 自动配置的JDBC连接池(需在application.yml配置MySQL参数)
- 集成MyBatis-Plus 3.5.x(简化CRUD操作)
关键配置示例:
yaml复制# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/rental_db?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
servlet:
multipart:
max-file-size: 10MB # 限制上传文件大小
踩坑提示:MySQL 8.0+必须指定serverTimezone参数,否则会报时区错误。建议开发环境使用UTC时区统一标准。
2.2 前端工程结构说明
Vue 3.x项目采用以下核心配置:
- Vue Router 4.x处理前端路由
- Axios 1.x封装HTTP请求
- Element Plus 2.x组件库提供UI支持
典型API请求封装:
javascript复制// src/api/room.js
import request from '@/utils/request'
export function listRooms(params) {
return request({
url: '/room/list',
method: 'get',
params
})
}
2.3 数据库设计要点
MySQL 5.7+表结构设计遵循三范式原则:
- 房源表(room_info):包含字段id、title、address、price等
- 租客表(tenant):关联user_id、room_id、contract_id等
- 合同表(contract):记录start_date、end_date、deposit等
sql复制CREATE TABLE `room_info` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL COMMENT '房源标题',
`area` decimal(10,2) DEFAULT NULL COMMENT '面积(m²)',
`price` decimal(10,2) NOT NULL COMMENT '月租金',
`status` tinyint DEFAULT '0' COMMENT '0-待租 1-已租',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能模块实现
3.1 房源管理模块
后端Controller典型实现:
java复制@RestController
@RequestMapping("/room")
public class RoomController {
@Autowired
private RoomService roomService;
@GetMapping("/list")
public Result list(@RequestParam Map<String,Object> params) {
PageUtils page = roomService.queryPage(params);
return Result.ok().put("page", page);
}
@PostMapping("/uploadImg")
public Result uploadImg(@RequestParam("file") MultipartFile file) {
String url = roomService.uploadImage(file);
return Result.ok().put("url", url);
}
}
前端Vue组件关键逻辑:
vue复制<template>
<el-upload
action="/api/room/uploadImg"
:on-success="handleSuccess"
drag>
<i class="el-icon-upload"></i>
<div>将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</template>
<script>
export default {
methods: {
handleSuccess(res) {
this.imageUrl = res.data.url
}
}
}
</script>
3.2 租约合同管理
采用PDF生成技术方案:
- 后端使用Apache PDFBox生成合同PDF
- 前端通过iframe嵌入预览
- 电子签名使用canvas绘制
合同状态机设计:
java复制public enum ContractStatus {
DRAFT("草稿"),
EFFECTIVE("生效中"),
TERMINATED("已终止"),
RENEWED("已续约");
private String desc;
// constructor & getter
}
4. 系统部署与运维
4.1 本地开发环境搭建
- MySQL安装配置:
bash复制# 使用Docker快速启动
docker run --name rental-mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7 --character-set-server=utf8mb4
- 后端启动:
bash复制mvn spring-boot:run -Dspring-boot.run.profiles=dev
- 前端启动:
bash复制npm install
npm run serve
4.2 生产环境部署方案
Nginx配置示例:
nginx复制server {
listen 80;
server_name rental.example.com;
location / {
root /opt/rental-frontend/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
4.3 常见问题排查指南
- 跨域问题解决方案:
- 开发环境:配置Vue proxyTable
- 生产环境:Nginx反向代理
- MySQL连接池报错:
yaml复制# 调整连接池参数
spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
- Vue路由刷新404:
javascript复制// router/index.js
const router = createRouter({
history: createWebHistory(),
routes
})
5. 项目扩展与二次开发建议
5.1 功能增强方向
- 微信小程序端接入:
- 使用uni-app框架复用现有Vue组件
- 后端增加JWT认证接口
- 智能推荐算法:
java复制// 基于用户浏览历史的协同过滤
public List<Room> recommendRooms(Long userId) {
// 实现推荐逻辑
}
5.2 性能优化方案
- 缓存策略:
java复制@Cacheable(value = "rooms", key = "#params.toString()")
public PageUtils queryPage(Map<String,Object> params) {
// 查询逻辑
}
- 图片存储优化:
- 使用阿里云OSS替代本地存储
- 实现WebP格式自动转换
- 数据库索引优化:
sql复制ALTER TABLE room_info ADD INDEX idx_area_price (area, price);
5.3 安全加固措施
- 接口防护:
java复制@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/**").authenticated();
}
}
- SQL注入防护:
- 坚持使用MyBatis参数绑定
- 避免字符串拼接SQL
- XSS防御:
vue复制<template>
<div v-html="sanitize(content)"></div>
</template>
<script>
import DOMPurify from 'dompurify'
export default {
methods: {
sanitize(input) {
return DOMPurify.sanitize(input)
}
}
}
</script>
我在实际部署这类系统时,发现三个容易被忽视但至关重要的细节:1) MySQL的max_connections参数需要根据并发量调整 2) SpringBoot的multipart文件上传需要同时配置max-file-size和max-request-size 3) Vue生产环境需要配置正确的publicPath。这些经验通常需要踩过坑才能深刻理解,而本套源码在这些关键点都提供了最佳实践参考。
