以下是基于 Java Spring Boot 开发的完整物业管理系统设计方案,包含核心功能模块、技术架构、数据库设计及代码实现,可直接作为项目开发蓝本。
一、系统架构设计
1. 技术栈选型
-
后端框架
:Spring Boot 2.7.x
-
ORM 框架
:MyBatis-Plus 3.5.x(简化 CRUD 操作)
-
数据库
:MySQL 8.0(存储业务数据)
-
安全框架
:Spring Security + JWT(认证授权)
-
API 文档
:Knife4j(Swagger 增强,接口可视化)
-
前端技术
:Vue 3 + Element Plus(管理端)、微信小程序(业主端)
-
其他工具
:Redis(缓存会话 / 热点数据)、EasyExcel(报表导出)
2. 系统核心模块
| 模块名称 | 功能描述 |
|---|---|
| 用户管理 | 业主 / 物业员工注册、登录、权限控制(区分业主 / 管理员 / 维修员角色) |
| 房产管理 | 房屋信息(楼栋、单元、房间)维护、业主房屋绑定 |
| 缴费管理 | 物业费 / 水电费生成、在线缴费、缴费记录查询、欠费提醒 |
| 报修管理 | 业主提交报修、维修员接单 / 处理、进度跟踪、评价反馈 |
| 投诉建议 | 业主提交投诉 / 建议、物业回复处理、满意度统计 |
| 公告管理 | 物业发布通知公告、业主查看历史公告、公告阅读状态追踪 |
| 停车位管理 | 停车位信息维护、租赁 / 购买记录、费用结算 |
| 设备管理 | 公共设备(电梯、水泵)登记、巡检记录、维修保养提醒 |
二、数据库设计(核心表结构)
1. 用户表(sys_user)
CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(50) NOT NULL COMMENT '用户名(手机号/工号)', `password` varchar(100) NOT NULL COMMENT '密码(BCrypt加密)', `name` varchar(50) NOT NULL COMMENT '姓名', `role` varchar(20) NOT NULL COMMENT '角色:ROLE_OWNER(业主)、ROLE_ADMIN(管理员)、ROLE_REPAIR(维修员)', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `id_card` varchar(20) DEFAULT NULL COMMENT '身份证号(业主)', `status` tinyint DEFAULT 1 COMMENT '状态:0-禁用,1-正常', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`)) ENGINE=InnoDB COMMENT='系统用户表';
一键获取完整项目代码
2. 房屋信息表(property_house)
CREATE TABLE `property_house` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '房屋ID', `building_no` varchar(20) NOT NULL COMMENT '楼栋号', `unit_no` varchar(10) NOT NULL COMMENT '单元号', `room_no` varchar(10) NOT NULL COMMENT '房间号', `house_area` decimal(10,2) DEFAULT NULL COMMENT '房屋面积(㎡)', `house_type` varchar(20) DEFAULT NULL COMMENT '户型(3室2厅)', `owner_id` bigint DEFAULT NULL COMMENT '业主ID(关联sys_user.id)', `is_occupied` tinyint DEFAULT 0 COMMENT '是否入住:0-未入住,1-已入住', PRIMARY KEY (`id`), UNIQUE KEY `uk_house` (`building_no`,`unit_no`,`room_no`)) ENGINE=InnoDB COMMENT='房屋信息表';
一键获取完整项目代码
3. 缴费记录表(payment_record)
CREATE TABLE `payment_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', `house_id` bigint NOT NULL COMMENT '房屋ID', `payment_type` varchar(20) NOT NULL COMMENT '费用类型:PROPERTY(物业费)、WATER(水费)、ELECTRIC(电费)', `amount` decimal(10,2) NOT NULL COMMENT '金额(元)', `due_date` date NOT NULL COMMENT '到期日', `status` varchar(20) NOT NULL COMMENT '状态:UNPAID(未缴)、PAID(已缴)、OVERDUE(逾期)', `pay_time` datetime DEFAULT NULL COMMENT '缴费时间', `pay_no` varchar(50) DEFAULT NULL COMMENT '支付单号', PRIMARY KEY (`id`), KEY `idx_house` (`house_id`), KEY `idx_status` (`status`)) ENGINE=InnoDB COMMENT='缴费记录表';
一键获取完整项目代码
4. 报修表(repair_order)
CREATE TABLE `repair_order` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '报修ID', `house_id` bigint NOT NULL COMMENT '房屋ID', `owner_id` bigint NOT NULL COMMENT '业主ID', `repair_type` varchar(20) NOT NULL COMMENT '报修类型:ELECTRIC(电器)、PLUMBING(水管)、DOOR(门窗)', `description` text COMMENT '问题描述', `status` varchar(20) NOT NULL COMMENT '状态:SUBMITTED(已提交)、ACCEPTED(已接单)、COMPLETED(已完成)、CANCELED(已取消)', `repairer_id` bigint DEFAULT NULL COMMENT '维修员ID', `repair_time` datetime DEFAULT NULL COMMENT '维修时间', `evaluation` tinyint DEFAULT NULL COMMENT '评价(1-5星)', PRIMARY KEY (`id`), KEY `idx_owner` (`owner_id`), KEY `idx_repairer` (`repairer_id`), KEY `idx_status` (`status`)) ENGINE=InnoDB COMMENT='报修表';
一键获取完整项目代码
三、项目结构(Spring Boot 后端)
com.property├── PropertyApplication.java // 启动类├── config // 配置类│ ├── SecurityConfig.java // Spring Security配置(JWT+权限)│ ├── MyBatisPlusConfig.java // MyBatis-Plus配置(分页插件)│ └── Knife4jConfig.java // API文档配置├── controller // 控制器│ ├── UserController.java // 用户管理接口│ ├── HouseController.java // 房产管理接口│ ├── PaymentController.java // 缴费管理接口│ └── RepairController.java // 报修管理接口├── service // 服务层│ ├── impl // 服务实现│ ├── UserService.java│ └── PaymentService.java├── mapper // 数据访问层│ ├── UserMapper.java│ └── PaymentMapper.java├── entity // 实体类│ ├── User.java│ └── PaymentRecord.java├── dto // 数据传输对象│ ├── LoginDTO.java // 登录请求参数│ └── PaymentDTO.java // 缴费参数├── vo // 响应视图对象│ ├── Result.java // 统一响应结果│ └── PaymentVO.java // 缴费记录VO└── util // 工具类 ├── JwtUtil.java // JWT工具 └── ExcelUtil.java // Excel导出工具
一键获取完整项目代码
四、核心功能实现代码
1. 统一响应结果(Result.java)
import lombok.Data;@Datapublic class Result<T> { private int code; // 状态码:200-成功,400-失败,401-未认证 private String msg; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMsg("成功"); result.setData(data); return result; } public static <T> Result<T> fail(String msg) { Result<T> result = new Result<>(); result.setCode(400); result.setMsg(msg); return result; }}
一键获取完整项目代码
2. 用户登录与 JWT 认证
(1)JWT 工具类(JwtUtil.java)
import io.jsonwebtoken.*;import java.util.Date;import java.util.HashMap;import java.util.Map;public class JwtUtil { // 密钥(生产环境需配置在环境变量) private static final String SECRET = "property-management-system-secret-key"; // 过期时间:24小时 private static final long EXPIRATION = 24 * 60 * 60 * 1000; // 生成Token public static String generateToken(Long userId, String role) { Date now = new Date(); Date expirationDate = new Date(now.getTime() + EXPIRATION); Map<String, Object> claims = new HashMap<>(); claims.put("userId", userId); claims.put("role", role); return Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(expirationDate) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); } // 解析Token获取用户ID public static Long getUserIdFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token) .getBody(); return Long.valueOf(claims.get("userId").toString()); } // 验证Token是否有效 public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token); return true; } catch (Exception e) { return false; } }}
一键获取完整项目代码
(2)登录接口实现(UserController.java)
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController { @Autowired private UserService userService; @Autowired private BCryptPasswordEncoder passwordEncoder; @PostMapping("/login") public Result<String> login(@RequestBody LoginDTO loginDTO) { // 1. 查询用户 User user = userService.getByUsername(loginDTO.getUsername()); if (user == null) { return Result.fail("用户名不存在"); } // 2. 验证密码 if (!passwordEncoder.matches(loginDTO.getPassword(), user.getPassword())) { return Result.fail("密码错误"); } // 3. 生成JWT令牌 String token = JwtUtil.generateToken(user.getId(), user.getRole()); return Result.success(token); }}
一键获取完整项目代码
3. 物业费缴费功能(PaymentController.java)
import com.baomidou.mybatisplus.core.metadata.IPage;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.access.prepost.PreAuthorize;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping("/payments")public class PaymentController { @Autowired private PaymentService paymentService; // 业主查询自己的缴费记录(分页) @GetMapping("/my") @PreAuthorize("hasRole('OWNER')") // 仅业主可访问 public Result<IPage<PaymentVO>> getMyPayments( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { Long userId = SecurityUtil.getCurrentUserId(); // 从JWT中获取当前用户ID IPage<PaymentVO> page = paymentService.getOwnerPayments(new Page<>(pageNum, pageSize), userId); return Result.success(page); } // 管理员生成物业费账单 @PostMapping("/generate") @PreAuthorize("hasRole('ADMIN')") // 仅管理员可访问 public Result<Void> generatePropertyFee(@RequestBody PaymentGenerateDTO dto) { paymentService.generatePropertyFee(dto.getBuildingNo(), dto.getMonth()); return Result.success(null); } // 业主在线缴费 @PostMapping("/pay") @PreAuthorize("hasRole('OWNER')") public Result<PaymentVO> payFee(@RequestBody PaymentPayDTO dto) { PaymentVO payment = paymentService.pay(dto.getRecordId(), dto.getPayType()); return Result.success(payment); }}
一键获取完整项目代码
4. 报修功能实现(RepairController.java)
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.access.prepost.PreAuthorize;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping("/repairs")public class RepairController { @Autowired private RepairService repairService; // 业主提交报修 @PostMapping @PreAuthorize("hasRole('OWNER')") public Result<RepairOrder> createRepair(@RequestBody RepairCreateDTO dto) { Long userId = SecurityUtil.getCurrentUserId(); RepairOrder order = repairService.createRepair(dto, userId); return Result.success(order); } // 维修员接单 @PutMapping("/{id}/accept") @PreAuthorize("hasRole('REPAIR')") public Result<Void> acceptRepair(@PathVariable Long id) { Long repairerId = SecurityUtil.getCurrentUserId(); repairService.acceptRepair(id, repairerId); return Result.success(null); } // 维修员完成维修 @PutMapping("/{id}/complete") @PreAuthorize("hasRole('REPAIR')") public Result<Void> completeRepair(@PathVariable Long id, @RequestBody RepairCompleteDTO dto) { repairService.completeRepair(id, dto.getDescription()); return Result.success(null); }}
一键获取完整项目代码
五、前端核心页面(Vue 示例)
1. 业主缴费页面(Payment.vue)
<template> <div class="payment-container"> <el-table :data="paymentList" border> <el-table-column prop="houseNo" label="房屋编号"></el-table-column> <el-table-column prop="paymentType" label="费用类型"></el-table-column> <el-table-column prop="amount" label="金额(元)"></el-table-column> <el-table-column prop="dueDate" label="到期日"></el-table-column> <el-table-column prop="status" label="状态"> <template #default="scope"> <el-tag :type="scope.row.status === 'UNPAID' ? 'danger' : 'success'"> {{ scope.row.status === 'UNPAID' ? '未缴' : '已缴' }} </el-tag> </template> </el-table-column> <el-table-column label="操作"> <template #default="scope"> <el-button v-if="scope.row.status === 'UNPAID'" type="primary" @click="handlePay(scope.row.id)" > 立即缴费 </el-button> </template> </el-table-column> </el-table> <el-pagination @current-change="handlePageChange" :current-page="pageNum" :page-size="pageSize" :total="total" ></el-pagination> </div></template><script setup>import { ref, onMounted } from 'vue';import { getMyPayments } from '@/api/payment';const pageNum = ref(1);const pageSize = ref(10);const total = ref(0);const paymentList = ref([]);// 加载缴费记录const loadPayments = async () => { const res = await getMyPayments(pageNum.value, pageSize.value); paymentList.value = res.data.records; total.value = res.data.total;};// 分页切换const handlePageChange = (val) => { pageNum.value = val; loadPayments();};onMounted(() => { loadPayments();});// 缴费处理const handlePay = (recordId) => { // 调用缴费接口逻辑};</script>
一键获取完整项目代码
六、系统部署与扩展
1. 部署步骤:
◦ 打包后端:mvn clean package -Dmaven.test.skip=true ◦ 部署 MySQL:初始化脚本(sql/init.sql)
◦ 启动后端:java -jar property-management-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod ◦
部署前端:npm run build 生成静态文件,Nginx 代理访问
2. 扩展建议:
◦ 集成短信服务(阿里云 SMS):欠费提醒、报修进度通知 ◦ 对接支付接口(微信支付 / 支付宝):在线缴费功能
◦ 加入数据看板:用 ECharts 展示缴费率、报修处理时效等统计数据
◦ 实现物联网集成:对接智能门禁、水电表自动抄表