Java + Spring Boot(处理同步逻辑)、HttpClient(调用外卖平台 API(每 5 分钟检查一次库存差异)

34 阅读7分钟

以下是基于 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(50NOT NULL COMMENT '用户名(手机号/工号)',  `password` varchar(100NOT NULL COMMENT '密码(BCrypt加密)',  `name` varchar(50NOT NULL COMMENT '姓名',  `role` varchar(20NOT NULL COMMENT '角色:ROLE_OWNER(业主)、ROLE_ADMIN(管理员)、ROLE_REPAIR(维修员)',  `phone` varchar(20DEFAULT NULL COMMENT '手机号',  `id_card` varchar(20DEFAULT 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(20NOT NULL COMMENT '楼栋号',  `unit_no` varchar(10NOT NULL COMMENT '单元号',  `room_no` varchar(10NOT NULL COMMENT '房间号',  `house_area` decimal(10,2DEFAULT NULL COMMENT '房屋面积(㎡)',  `house_type` varchar(20DEFAULT 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(20NOT NULL COMMENT '费用类型:PROPERTY(物业费)、WATER(水费)、ELECTRIC(电费)',  `amount` decimal(10,2NOT NULL COMMENT '金额(元)',  `due_date` date NOT NULL COMMENT '到期日',  `status` varchar(20NOT NULL COMMENT '状态:UNPAID(未缴)、PAID(已缴)、OVERDUE(逾期)',  `pay_time` datetime DEFAULT NULL COMMENT '缴费时间',  `pay_no` varchar(50DEFAULT 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(20NOT NULL COMMENT '报修类型:ELECTRIC(电器)、PLUMBING(水管)、DOOR(门窗)',  `description` text COMMENT '问题描述',  `status` varchar(20NOT 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<StringObject> 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 展示缴费率、报修处理时效等统计数据 

◦ 实现物联网集成:对接智能门禁、水电表自动抄表