CSDN-小区物业管理系统

110 阅读6分钟

小区物业管理系统源码与部署指南

一、系统架构设计

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 主要功能截图

  1. 业主信息管理界面

    • 支持Excel导入/导出
    • 业主信息批量更新
    • 联系方式快速检索
  2. 费用收缴看板

    • 实时显示收缴率
    • 欠费业主提醒
    • 扫码支付集成
  3. 维修工单处理

    • 工单状态可视化
    • 维修进度跟踪
    • 业主评价功能
  4. 数据统计报表

    • 收费情况统计
    • 工单处理时效分析
    • 业主满意度统计

六、常见问题解决方案

6.1 部署问题排查

问题现象可能原因解决方案
数据库连接失败密码错误/网络不通检查application.yml配置
前端访问API跨域问题未配置CORS添加@CrossOrigin注解
图片上传失败存储目录权限不足chmod -R 777 /upload
定时任务不执行未启用@EnableScheduling主类添加注解

6.2 开发注意事项

  1. 编码规范

    • 实体类字段使用包装类型(避免基本类型)
    • 控制器方法返回统一响应格式
    • 前端API调用添加错误处理
  2. 安全建议

    // 密码加密存储
    @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())
        );
    }
    
  3. 性能优化

    • 批量操作使用MyBatis的foreach标签
    • 频繁访问的数据添加Redis缓存
    • 复杂查询添加数据库索引

七、二次开发指南

7.1 扩展功能建议

  1. 移动端适配

    • 开发微信小程序版本
    • 集成公众号消息通知
    • 添加业主自助服务功能
  2. 智能硬件对接

    • 门禁系统集成
    • 停车场管理系统对接
    • 智能水电表数据采集
  3. 数据分析增强

    • 业主行为分析
    • 设备故障预测
    • 财务收支预测

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/               # 公共文件

本系统提供完整的物业管理系统解决方案,包含数据库设计文档、部署教程和二次开发指南。建议开发者:

  1. 先运行SQL脚本初始化数据库
  2. 按照部署指南启动前后端服务
  3. 使用admin/admin123登录系统
  4. 根据实际需求修改业务逻辑

获取完整源码请访问: [CSDN资源下载链接] 或 [Gitee开源仓库地址]