小区物业管理系统源码与部署指南
一、系统架构设计
CSDN-小区物业管理系统---789it.top/14026/
1.1 技术栈选型
| 模块 | 技术实现 |
|---|---|
| 前端 | Vue 3 + Element Plus |
| 后端 | Spring Boot 2.7 + MyBatis |
| 数据库 | MySQL 8.0 |
| 安全框架 | Spring Security + JWT |
| 部署方式 | Docker容器化 |
1.2 功能模块划分
1. 业主管理模块
- 业主信息登记
- 家庭成员管理
- 车辆信息管理
2. 房产管理模块
- 楼栋信息管理
- 房屋信息管理
- 公区设施管理
3. 收费管理模块
- 物业费计算
- 水电费录入
- 收费记录查询
4. 维修管理模块
- 报修登记
- 工单分配
- 维修进度跟踪
5. 系统管理模块
- 角色权限管理
- 操作日志审计
- 系统参数配置
二、数据库设计
2.1 核心表结构
-- 业主信息表
CREATE TABLE `owner` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '业主姓名',
`phone` varchar(20) NOT NULL COMMENT '联系电话',
`id_card` varchar(18) COMMENT '身份证号',
`wechat` varchar(50) COMMENT '微信号',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 房屋信息表
CREATE TABLE `house` (
`id` bigint NOT NULL AUTO_INCREMENT,
`building_no` varchar(10) NOT NULL COMMENT '楼栋号',
`unit_no` varchar(5) NOT NULL COMMENT '单元号',
`room_no` varchar(10) NOT NULL COMMENT '房号',
`area` decimal(10,2) NOT NULL COMMENT '建筑面积',
`owner_id` bigint COMMENT '业主ID',
`status` tinyint DEFAULT 1 COMMENT '1-已入住 2-未售 3-已售未住',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_location` (`building_no`,`unit_no`,`room_no`),
FOREIGN KEY (`owner_id`) REFERENCES `owner` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 收费项目表
CREATE TABLE `charge_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '项目名称',
`unit_price` decimal(10,2) NOT NULL COMMENT '单价',
`unit` varchar(10) NOT NULL COMMENT '单位',
`cycle` tinyint NOT NULL COMMENT '1-月 2-季 3-年',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 收费记录表
CREATE TABLE `charge_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`house_id` bigint NOT NULL,
`item_id` bigint NOT NULL,
`amount` decimal(10,2) NOT NULL COMMENT '应收金额',
`actual_amount` decimal(10,2) COMMENT '实收金额',
`charge_date` date NOT NULL COMMENT '收费日期',
`operator` varchar(50) NOT NULL COMMENT '操作人',
`status` tinyint DEFAULT 0 COMMENT '0-未缴 1-已缴 2-部分缴',
PRIMARY KEY (`id`),
FOREIGN KEY (`house_id`) REFERENCES `house` (`id`),
FOREIGN KEY (`item_id`) REFERENCES `charge_item` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 初始化数据脚本
-- 基础收费项目
INSERT INTO `charge_item` (`name`, `unit_price`, `unit`, `cycle`)
VALUES
('物业管理费', 2.50, '元/平米', 1),
('生活垃圾清运费', 10.00, '元/户', 1),
('公共能耗费', 0.80, '元/平米', 1),
('车位管理费', 80.00, '元/个', 1);
-- 管理员账号
INSERT INTO `sys_user` (`username`, `password`, `real_name`, `phone`, `role`)
VALUES ('admin', '$2a$10$xVCHqIAX7XW7J.PJ5sQW..XUfUOQ8zYQDlDboWj7XJQm6L9JYq5W2', '系统管理员', '13800138000', 'ADMIN');
三、快速部署指南
3.1 开发环境部署
后端部署
# 克隆项目
git clone https://gitee.com/property-management/property-backend.git
# 导入数据库
mysql -u root -p < docs/sql/property_init.sql
# 修改配置文件
vim src/main/resources/application-dev.yml
# 启动项目
mvn spring-boot:run
前端部署
# 克隆项目
git clone https://gitee.com/property-management/property-frontend.git
# 安装依赖
npm install
# 启动开发服务器
npm run dev
3.2 生产环境Docker部署
# docker-compose.yml
version: '3'
services:
mysql:
image: mysql:8.0
container_name: property-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: property
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
restart: always
backend:
build: ./backend
container_name: property-backend
depends_on:
- mysql
ports:
- "8080:8080"
environment:
SPRING_PROFILES_ACTIVE: prod
restart: always
frontend:
build: ./frontend
container_name: property-frontend
ports:
- "80:80"
restart: always
四、核心功能实现代码
4.1 物业费自动生成
// ChargeService.java
@Scheduled(cron = "0 0 1 1 * ?") // 每月1日凌晨1点执行
@Transactional
public void generateMonthlyCharges() {
// 1. 获取所有已入住房屋
List<House> houses = houseMapper.selectByStatus(1);
// 2. 获取所有按月计费项目
List<ChargeItem> items = chargeItemMapper.selectByCycle(1);
// 3. 为每户生成费用记录
LocalDate today = LocalDate.now();
String operator = "system-auto";
houses.forEach(house -> {
items.forEach(item -> {
ChargeRecord record = new ChargeRecord();
record.setHouseId(house.getId());
record.setItemId(item.getId());
// 计算应收金额(物业费按面积计算)
if(item.getName().contains("管理费")) {
record.setAmount(
house.getArea().multiply(BigDecimal.valueOf(item.getUnitPrice()))
);
} else {
record.setAmount(BigDecimal.valueOf(item.getUnitPrice()));
}
record.setChargeDate(today);
record.setOperator(operator);
chargeRecordMapper.insert(record);
});
});
}
4.2 维修工单状态机
// RepairOrderService.java
public void changeStatus(Long orderId, RepairStatus newStatus, Long operatorId) {
RepairOrder order = repairOrderMapper.selectById(orderId);
RepairStatus currentStatus = order.getStatus();
// 状态转换校验
switch(currentStatus) {
case PENDING:
if(!newStatus.equals(RepairStatus.ASSIGNED)) {
throw new BusinessException("待处理工单只能转为已分配");
}
break;
case ASSIGNED:
if(!newStatus.equals(RepairStatus.PROCESSING)) {
throw new BusinessException("已分配工单只能转为处理中");
}
break;
case PROCESSING:
if(!newStatus.equals(RepairStatus.COMPLETED) &&
!newStatus.equals(RepairStatus.CANCELLED)) {
throw new BusinessException("处理中工单只能转为已完成或已取消");
}
break;
default:
throw new BusinessException("工单已结束,不能修改状态");
}
// 更新状态
order.setStatus(newStatus);
order.setUpdateTime(new Date());
repairOrderMapper.updateById(order);
// 记录状态变更历史
RepairOrderHistory history = new RepairOrderHistory();
history.setOrderId(orderId);
history.setFromStatus(currentStatus);
history.setToStatus(newStatus);
history.setOperatorId(operatorId);
repairOrderHistoryMapper.insert(history);
}
五、系统界面展示
5.1 主要功能截图
-
业主信息管理界面
- 支持Excel导入/导出
- 业主信息批量更新
- 联系方式快速检索
-
费用收缴看板
- 实时显示收缴率
- 欠费业主提醒
- 扫码支付集成
-
维修工单处理
- 工单状态可视化
- 维修进度跟踪
- 业主评价功能
-
数据统计报表
- 收费情况统计
- 工单处理时效分析
- 业主满意度统计
六、常见问题解决方案
6.1 部署问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 数据库连接失败 | 密码错误/网络不通 | 检查application.yml配置 |
| 前端访问API跨域问题 | 未配置CORS | 添加@CrossOrigin注解 |
| 图片上传失败 | 存储目录权限不足 | chmod -R 777 /upload |
| 定时任务不执行 | 未启用@EnableScheduling | 主类添加注解 |
6.2 开发注意事项
-
编码规范:
- 实体类字段使用包装类型(避免基本类型)
- 控制器方法返回统一响应格式
- 前端API调用添加错误处理
-
安全建议:
// 密码加密存储 @Override public UserDetails loadUserByUsername(String username) { User user = userMapper.selectByUsername(username); if(user == null) { throw new UsernameNotFoundException("用户不存在"); } return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), getAuthorities(user.getRoles()) ); } -
性能优化:
- 批量操作使用MyBatis的
foreach标签 - 频繁访问的数据添加Redis缓存
- 复杂查询添加数据库索引
- 批量操作使用MyBatis的
七、二次开发指南
7.1 扩展功能建议
-
移动端适配:
- 开发微信小程序版本
- 集成公众号消息通知
- 添加业主自助服务功能
-
智能硬件对接:
- 门禁系统集成
- 停车场管理系统对接
- 智能水电表数据采集
-
数据分析增强:
- 业主行为分析
- 设备故障预测
- 财务收支预测
7.2 代码结构说明
backend/
├── src/main/
│ ├── java/com/property/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 业务逻辑
│ │ ├── mapper/ # MyBatis接口
│ │ ├── entity/ # 实体类
│ │ └── util/ # 工具类
│ └── resources/
│ ├── mapper/ # XML映射文件
│ ├── static/ # 静态资源
│ └── application.yml
frontend/
├── src/
│ ├── api/ # 接口定义
│ ├── assets/ # 静态资源
│ ├── components/ # 公共组件
│ ├── router/ # 路由配置
│ ├── store/ # 状态管理
│ ├── utils/ # 工具方法
│ └── views/ # 页面组件
└── public/ # 公共文件
本系统提供完整的物业管理系统解决方案,包含数据库设计文档、部署教程和二次开发指南。建议开发者:
- 先运行SQL脚本初始化数据库
- 按照部署指南启动前后端服务
- 使用admin/admin123登录系统
- 根据实际需求修改业务逻辑
获取完整源码请访问: [CSDN资源下载链接] 或 [Gitee开源仓库地址]