ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SpringBoot3 + Vue3 + MySQL 构建社区物业管理系统实战解析

SpringBoot3 + Vue3 + MySQL 构建社区物业管理系统实战解析 “社区物业管理系统”是 Java 后端项目里出现频率很高的实战选题技术组合也基本固定为 JAVA SpringBoot3 Vue.js3 MySQL。这类项目本质上不是比框架多新而是考量你能否把业主信息、房产楼栋、报修工单、物业缴费、停车位、公告投诉这些业务用一套前后端分离的代码串起来并且能启动、能演示、能回答面试官的问题。这篇文章不使用某个成品源码的神秘路径而是从技术方案视角讲清楚一套可以落地的社区物业管理系统骨架包含 MySQL 表结构怎么设计、SpringBoot3 后端怎么分层、Vue.js3 前端怎么对接、接口 API 怎么测试以及本地启动和后续部署的常见坑。读者可以是正在做 Java 课程设计的学生也可以是准备毕设或想快速复刻一套内部管理系统的开发。1. 社区物业管理系统核心功能与技术栈速览维度方案说明项目类型前后端分离的管理系统 Web 项目后端技术Java 17 SpringBoot3 MyBatis-Plus MySQL 8前端技术Vue.js3 Vite Element Plus Pinia Axios数据库MySQL 8.x表结构统一使用 utf8mb4认证方式登录后签发 JWT Token后端拦截器校验主要模块业主管理、楼栋房产、报修工单、物业缴费、车位管理、公告通知、投诉建议、首页统计适用人群课设、毕设、小型物业公司内部管理系统、全栈入门练习API 能力RESTful JSON 接口可分页、按状态过滤支持批量导入业主和定时生成缴费单扩展点后续可接 Redis 缓存、文件上传服务、消息通知、微信小程序端核心模块看起来很多实际开发时建议按业务主线拆先做登录和用户权限再做业主与房产绑定然后做报修、缴费这两个高频业务最后补公告、车位和统计页面。这套顺序能避免一上来就陷入细枝末节。2. 系统架构、适用场景与使用边界2.1 前后端分离架构社区物业管理系统采用典型的前后端分离结构浏览器访问 Vue.js3 打包后的静态页面前端通过/api前缀请求 SpringBoot3 后端接口后端 Controller 负责接收请求Service 处理业务MyBatis-Plus 操作 MySQL 数据库登录成功后后端返回 JWT前端保存到本地之后每次请求在请求头中携带生产环境通常用 Nginx 托管前端静态文件并把/api反向代理到 Spring Boot 服务端口。这种结构的优点是前后端可以独立部署、独立联调也更容易在课设答辩时分别展示后端接口和前端页面。2.2 适合解决的业务场景社区物业管理系统比较适合管理单个或少数小区主要解决这些实际问题业主底册不统一管家还在用 Excel 维护住户和房屋关系报修电话容易漏记缺少工单状态跟踪业主不知道师傅什么时候上门物业费、停车费是否已缴很难一眼看出月底财务对账费时公告、停水停电通知靠微信群刷屏没有统一发布入口管理层想统计本月报修量、缴费率缺少可视化数据。2.3 使用边界与合规提醒如果只是做课设和毕设这套系统的数据结构已经够用。但如果要用于真实物业公司需要注意几个边界本项目不是完整财务系统涉及业委会资金监管、电子发票、银行对账等需求时需要单独扩展系统会保存业主姓名、手机号、房号等个人信息真实上线前必须做数据加密存储、权限隔离并对管理员操作留痕演示和测试时应使用模拟数据不要直接导入真实业主信息。3. 环境准备与前置条件社区物业管理系统使用的是 SpringBoot3因此不是随便装一个 JDK 8 就能跑起来。Spring Boot 3 最低要求 JDK 17这一点最容易踩坑。下面是推荐的本地开发环境。软件推荐版本说明JDKJava 17 以上SpringBoot3 强制要求不能使用 JDK 8Maven3.8 以上用于后端依赖管理和打包Node.js18 或 20 LTS用于 Vue3 前端开发与构建MySQL8.0 以上推荐 8.0字符集统一 utf8mb4IDEIntelliJ IDEA / VS Code后端用 IDEA前端用 VS Code 都可以3.1 JDK 环境变量配置Windows 下安装 JDK 后通常需要配置JAVA_HOME和PATH方便 Maven 打包时找到 Java 命令。配置完成后在命令行执行java -version mvn -version node -v npm -v如果java -version能显示 17 或更高版本说明 JDK 配置正常。这里有一个常见误区用户本地安装过多个 JDKSpringBoot3 项目明明要求 JDK 17但 IDEA 里 Project SDK 仍然选择 JDK 8启动时会直接报错。建议在 IDEA 的 Project Structure 中把 SDK 和 Java Compiler 的 Target 都设置为 17。3.2 MySQL 安装与数据库初始化如果是本地 Windows 环境可以下载 MySQL 8 安装包安装时选择默认端口 3306设置一个自己记得住的 root 密码。安装完成后可以用 Navicat 或命令行连接数据库。更省事的开发环境方案是使用 Docker 直接启动 MySQL 8Linux 和 Windows 都适用docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEproperty_db \ -v mysql_data:/var/lib/mysql \ mysql:8.0执行后再用 Navicat 连接IP 为localhost端口3306用户名root密码123456。连接时如果提示error 2002优先检查 MySQL 服务有没有启动以及端口是否被占用。Linux 环境也可以直接用系统包管理器安装 MySQL安装完成后首次登录通常需要修改 root 密码。创建数据库时统一使用 utf8mb4避免中文乱码CREATE DATABASE IF NOT EXISTS property_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;3.3 依赖仓库加速初次拉取 Maven 依赖可能很慢建议在 Maven 的settings.xml中配置阿里云镜像mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror前端 npm 依赖也可以设置淘宝源npm config set registry https://registry.npmmirror.com4. MySQL 数据库设计社区物业核心表MySQL 表结构是整个系统的地基。建议用以下这些核心表覆盖主要功能系统用户表、业主信息表、楼栋房产表、报修工单表、缴费记录表、停车位表和公告表。下面给出简化后的表设计思路。表名主要作用关键字段sys_user登录账号与角色id, username, password, role, statusowner_info业主/住户信息id, user_id, real_name, phone, room_id, statusbuilding_room楼栋房屋id, building_no, unit, room_no, area, owner_idrepair_order报修工单id, repair_no, room_id, owner_id, type, description, statusproperty_fee物业缴费单id, room_id, fee_type, amount, fee_month, status, pay_timeparking_space车位信息id, space_no, room_id, lease_status, expire_timenotice_info公告通知id, title, content, publisher_id, publish_time, top_flag4.1 系统用户表设计CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL COMMENT 登录名, password VARCHAR(100) NOT NULL COMMENT BCrypt加密后的密码, real_name VARCHAR(50) DEFAULT NULL COMMENT 显示姓名, role VARCHAR(20) NOT NULL DEFAULT OWNER COMMENT 角色: ADMIN/PROPERTY/OWNER, phone VARCHAR(20) DEFAULT NULL, status TINYINT NOT NULL DEFAULT 1 COMMENT 1启用 0禁用, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted TINYINT NOT NULL DEFAULT 0, UNIQUE KEY uk_username (username) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4 COMMENT 系统用户表;角色建议先拆成管理员、物业人员和业主三类。注意不要把大量业主账号直接塞进 sys_user如果业主本身不登录系统可以用 owner_info 单独维护如果业主需要登录查看账单和报修进度再把 sys_user 和 owner_info 关联。4.2 业主和房产表设计业主与房产的关系在实际物业场景里是多对多一个业主可能有多套房一套房也可能登记多个共有人。为了控制课设复杂度可以简化设计为一家房产对应一个主要联系人owner_info 中保存 owner_id 指向 sys_userowner_info 与 building_room 关联。CREATE TABLE owner_info ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT DEFAULT NULL COMMENT 关联sys_user.id, real_name VARCHAR(50) NOT NULL, phone VARCHAR(20) NOT NULL, id_card VARCHAR(18) DEFAULT NULL COMMENT 脱敏后展示, room_id BIGINT DEFAULT NULL COMMENT 关联building_room.id, status TINYINT NOT NULL DEFAULT 1, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, deleted TINYINT NOT NULL DEFAULT 0, KEY idx_phone (phone) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4 COMMENT 业主信息表;4.3 报修工单表设计报修工单是物业管理系统里最有业务感的表状态变化需要重点设计。这里使用小型状态机字段值可设计为0 待派单、1 处理中、2 待确认、3 已完成、4 已取消。CREATE TABLE repair_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, repair_no VARCHAR(32) NOT NULL COMMENT 工单号如BX20250301001, room_id BIGINT NOT NULL COMMENT 报修房屋, owner_id BIGINT NOT NULL COMMENT 报修业主, type VARCHAR(20) NOT NULL COMMENT 水/电/门禁/电梯/其他, description VARCHAR(500) NOT NULL, images VARCHAR(1000) DEFAULT NULL COMMENT 图片URL逗号分隔, status TINYINT NOT NULL DEFAULT 0, handler_id BIGINT DEFAULT NULL COMMENT 处理人sys_user.id, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, finish_time DATETIME DEFAULT NULL, deleted TINYINT NOT NULL DEFAULT 0, UNIQUE KEY uk_repair_no (repair_no), KEY idx_status (status) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4 COMMENT 报修工单表;查询业主报修列表时需要先根据当前登录用户找到 room_id再查询 repair_order。查询物业待办列表时则需要通过status过滤。为了方便测试可以给 repair_order 预填一些状态不同的数据。4.4 物业缴费记录表缴费金额必须使用DECIMAL(10,2)不要使用double或float否则金额累计会出现精度问题。缴费记录按月份唯一约束防止定时生成缴费单时重复插入。CREATE TABLE property_fee ( id BIGINT PRIMARY KEY AUTO_INCREMENT, room_id BIGINT NOT NULL, fee_type VARCHAR(20) NOT NULL DEFAULT PROPERTY COMMENT 物业费/停车费/维修费, amount DECIMAL(10,2) NOT NULL, fee_month VARCHAR(7) NOT NULL COMMENT 账期月份如2025-03, status TINYINT NOT NULL DEFAULT 0 COMMENT 0未缴 1已缴, pay_time DATETIME DEFAULT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, deleted TINYINT NOT NULL DEFAULT 0, UNIQUE KEY uk_room_month (room_id, fee_month, fee_type) ) ENGINE InnoDB DEFAULT CHARSET utf8mb4 COMMENT 物业缴费记录表;5. SpringBoot3 后端工程搭建与启动5.1 后端项目目录结构以一个 Maven 单模块工程为例建议把工程按照 common / config / controller / service / mapper / entity / dto / vo 分层。property-admin/ ├── pom.xml └── src/main/java/com/example/property/ ├── PropertyApplication.java ├── common/ # Result、PageResult、全局异常 ├── config/ # MybatisPlus配置、WebMvc拦截器配置 ├── controller/ # 接口层 ├── service/ # 业务层 ├── mapper/ # MyBatis-Plus Mapper ├── entity/ # 表对应实体 ├── dto/ # 入参对象 └── vo/ # 返回对象如果是课设答辩这种分包方式也是面试官比较认可的结构。业务简单的模块可以合并 dto 和 vo但如果后续要接真实项目建议还是严格拆分。5.2 Maven 核心依赖SpringBoot3 项目的 Maven 依赖需要特别注意版本。Spring Boot 3 使用jakarta.*命名空间因此很多老包不能再直接用。下面是适合启动的基础依赖集合parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.4/version relativePath/ /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-spring-boot3-starter/artifactId version3.5.7/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies如果要用 MyBatis-PlusSpringBoot3 项目一定要选择mybatis-plus-spring-boot3-starter而不是旧版mybatis-plus-boot-starter否则会出现 ClassNotFoundException 或自动配置不生效。5.3 application.yml 数据源配置server: port: 8080 spring: application: name: property-admin datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/property_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue username: root password: 123456 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0连接 MySQL 时经常遇到的坑是serverTimezone未设置或设置错误报错信息会出现 “The server time zone value xxx is unrecognized”。建议直接在 url 中加入serverTimezoneAsia/Shanghai。5.4 登录认证与 JWT 拦截器社区物业管理系统不需要一开始就引入完整的 Spring Security使用 JWT Spring MVC 拦截器更直观也更容易在课设答辩时讲清楚原理。登录流程如下前端发起登录请求传入 username 和 password后端根据 username 查询 sys_user密码校验通过后生成包含 userId 和 role 的 JWT前端保存 token后续请求在 Header 中携带Authorization: Bearer token后端自定义拦截器解析 token把当前登录用户放入请求上下文。登录接口代码可以简化如下RestController RequestMapping(/api/auth) public class AuthController { private final SysUserService userService; private final JwtUtil jwtUtil; public AuthController(SysUserService userService, JwtUtil jwtUtil) { this.userService userService; this.jwtUtil jwtUtil; } PostMapping(/login) public ResultLoginVO login(RequestBody Valid LoginDTO dto) { SysUser user userService.findByUsername(dto.getUsername()); if (user null) { return Result.fail(用户名或密码错误); } if (!userService.matchesPassword(dto.getPassword(), user.getPassword())) { return Result.fail(用户名或密码错误); } if (user.getStatus() 0) { return Result.fail(账号已被禁用); } String token jwtUtil.createToken(user.getId(), user.getRole(), user.getRealName()); return Result.ok(new LoginVO(token, user)); } }建议密码不要用明文存储后台先用 BCrypt 加密。项目初次初始化数据时可以用一个临时接口生成加密后的默认密码再写入数据库。6. Vue.js3 前端工程搭建与页面联调6.1 初始化 Vue3 工程前端建议使用 Vite 初始化 Vue3 工程npm create vitelatest property-web -- --template vue cd property-web npm install再安装 Element Plus、Vue Router、Pinia 和 Axiosnpm install element-plus element-plus/icons-vue vue-router pinia axios6.2 前端目录结构建议把工程内部分成以下目录property-web/ ├── index.html └── src/ ├── api/ # 与后端接口对应的调用方法 ├── assets/ # 静态资源 ├── components/ # 公共组件如上传、搜索栏 ├── layout/ # 后台布局左侧菜单和顶栏 ├── router/ # 路由配置 ├── store/ # Pinia 状态 └── views/ # 页面如 OwnerView、RepairView、FeeView6.3 Vite 代理配置本地开发时前端和后端端口不同前端默认是 5173后端是 8080。直接在vite.config.js中把/api代理到后端可以避免联调时产生跨域问题。import { defineConfig } from vite import vue from vitejs/plugin-vue export default defineConfig({ plugins: [vue()], server: { host: 0.0.0.0, port: 5173, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } })6.4 Axios 请求封装与 Token 注入封装一个request.js统一处理请求头、响应错误和 401 跳转是管理系统前端联调的关键。示例代码如下import axios from axios import { ElMessage } from element-plus import router from ../router const service axios.create({ baseURL: /api, timeout: 10000 }) service.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${token} } return config }) service.interceptors.response.use( response { const res response.data if (res.code 401) { localStorage.removeItem(token) router.push(/login) return Promise.reject(new Error(未登录或登录已过期)) } if (res.code ! 0) { ElMessage.error(res.msg || 请求失败) return Promise.reject(new Error(res.msg || 请求失败)) } return res }, error { ElMessage.error(error.message || 网络异常) return Promise.reject(error) } ) export default service这里约定后端统一返回{ code: 0, msg: success, data: {} }code 为 0 表示成功code 为 401 表示未登录或 token 过期。前后端统一使用这套返回结构之后页面逻辑会干净很多。6.5 路由与登录鉴权在路由配置中增加全局前置守卫判断是否存在 token。以 Vue Router 新写法为例router.beforeEach((to) { const token localStorage.getItem(token) if (!token to.path ! /login) { return /login } return true })有路由守卫后刷新页面不会直接跳走未登录用户访问后台页面也会被拦截到登录页。7. 关键业务模块实现细节7.1 业主列表与房产绑定业主查询页是后台管理系统最常见的“条件 分页”页面。后端接口接收pageNum、pageSize、keywordkeyword 可以匹配姓名或手机号。MyBatis-Plus 的 LambdaQueryWrapper 写法比较简洁PageOwnerVO page ownerMapper.selectOwnerPage( new Page(dto.getPageNum(), dto.getPageSize()), dto.getKeyword() );如果业主表关联了 sys_user 表也可以直接用 XML 写多表联查返回自定义的 OwnerVO。这里不建议把所有字段都select *前端只需要业主姓名、手机号、所在楼栋、绑定房屋数、入住状态等字段。7.2 报修工单状态流转报修工单需要支持业主发起报修、物业接单、处理完成、业主确认关闭。建议在 Service 层提供以下方法创建工单、派单、开始处理、完成处理、取消工单。状态流转期间需要注意两个细节。第一业主只能看到自己的房屋相关工单需要根据当前登录用户查询其名下 room_id 列表再进行 in 查询。第二工单号建议统一生成格式可以类似BX20250301001避免数据库主键直接暴露给前端。后端处理状态流转时建议使用更新条件防止并发修改boolean updated updateById(new RepairOrder() {{ setStatus(1); setHandlerId(currentUserId); }});如果在小型并发场景下希望更严谨可以在 SQL 中加上WHERE status 0避免同一个工单被两个操作员重复接单。7.3 物业缴费与月度账单生成缴费模块最容易问到的知识点是“怎么避免重复生成缴费单”。这里不是每天新建一条缴费记录而是每个月针对每套房生成一条对应账期的账单。实现思路如下每月定时任务扫描 building_room 表中在用的房屋按计费规则计算当月费用以(room_id, fee_month, fee_type)作为唯一键插入 property_fee已存在记录的房屋跳过不重复插入。可以先用一个临时管理页面手动触发“生成某月账单”方便演示。确认逻辑稳定后再加入Scheduled定时任务。使用 SpringBoot3 内置定时任务只需要启动类加EnableScheduling并在方法上写Scheduled(cron 0 0 3 1 * ?) public void generateMonthlyFee() { // 每月1日凌晨3点生成当月账单 }缴费页面则需要联表查询房间号、业主姓名、账期、金额和状态。对于逾期未缴的账单可以加一个“欠费统计”接口用来在首页汇总展示。7.4 停车位与到期提醒停车位模块适合做一个到期时间字段expire_time。当天检查时如果到期时间还剩 7 天状态标记为“即将到期”超过当前时间则标记为“已到期”同时解绑车辆信息释放车位。这个过程也可以放在定时任务里每天执行一次。7.5 数据统计与首页展示首页通常想看三件事本月报修总数、本月缴费率、入住业主数。常见做法是提供一个聚合接口例如/api/dashboard/summary在 MySQL 中使用COUNT、SUM和CASE WHEN完成统计然后返回一个 summary VO。不要把明细数据全部返回前端再循环统计这样数据量上升后接口会明显变慢。8. 接口 API、批量任务与联调测试8.1 统一接口清单社区物业管理系统前期可以先定义一组 RESTful 风格接口这里给出一个通用接口清单实际路径需要按你自己项目里的权限控制和业务命名调整。模块请求方法接口示例说明登录POST/api/auth/login登录获取 Token当前用户GET/api/auth/me获取当前用户信息业主分页GET/api/owner/page分页查询业主业主新增POST/api/owner新增业主报修工单POST/api/repair创建报修工单报修分页GET/api/repair/page分页查询工单缴费分页GET/api/fee/page分页查询缴费记录缴费生成POST/api/fee/generate手动生成月度账单公告分页GET/api/notice/page获取公告列表首页统计GET/api/dashboard/summary获取核心统计数据8.2 后端统一返回与分页结构为了保证前端代码整洁所有接口建议统一返回 Result 结构。分页接口的 data 建议固定为{ code: 0, msg: success, data: { records: [], total: 100, pageNum: 1, pageSize: 10 } }这样前端表格组件可以直接绑定records分页组件绑定total不需要在每一个请求里都做数据转换。8.3 Postman 或 Apifox 测试接口后端启动后建议先用 Apifox 或 Postman 验证两个核心链路。第一个链路是登录鉴权。使用 POST 请求调用/api/auth/login请求体{ username: admin, password: 123456 }如果登录成功把返回的 token 复制到请求头中Authorization: Bearer token第二个链路是分页查询。请求GET /api/owner/page?pageNum1pageSize10keyword张观察返回是否包含 total 和 records。如果返回 401说明 token 没有生效或拦截器配置有问题如果返回 500则优先查看后端控制台日志。8.4 批量导入业主功能管理系统通常需要从 Excel 导入业主名单。建议使用 EasyExcel 或 Apache POI 读取文件。处理流程为前端上传 Excel 文件后端读取每一行数据校验手机号格式、房屋编号是否存在校验通过的数据插入 owner_info校验失败的数据记录原因最后返回导入结果摘要。这里不推荐逐行查询数据库判断房屋编号更稳的做法是先把 Excel 中所有 room 编号收集成集合一次查出已存在的 room再在内存中做匹配。数据量只有几百上千条时一次性查询即可满足。如果每条数据还需要同步生成 sys_user 登录账号就要使用Transactional事务。只要某个业主插入失败整批回滚避免出现部分业主有账号、部分业主没有账号的脏数据。8.5 系统测试要点在完成项目后按照以下顺序进行系统测试登录错误密码、禁用账号、正常登录业主模块新增、编辑、分页搜索报修模块业主提交报修管理员接单处理完成后状态变化缴费模块手动生成月度账单确认不会重复生成标记已缴后累计金额正确权限普通业主不能调用新增物业人员的接口异常情况数据库未启动时后端是否给出友好错误而不是直接抛堆栈。9. 打包部署与资源占用观察社区物业管理系统完成开发后可以打包到 Linux 服务器上运行。前后端分离项目通常按以下方式部署。9.1 后端打包并启动在property-admin目录执行mvn clean package -DskipTests打包后在target目录得到property-admin.jar。上传到服务器后启动java -Xms512m -Xmx1024m -jar property-admin.jar观察进程是否正常jps -l netstat -tlnp | grep 8080如果提示OutOfMemoryError: insufficient memory说明 JVM 初始化堆内存超出系统可用内存。可以把-Xms和-Xmx调小例如-Xms256m -Xmx512m或者先检查服务器物理内存余量。Linux 下可以用free -h查看。9.2 前端打包在property-web目录执行npm run build构建完成后生成dist目录。把dist里的文件上传到 Nginx 的 HTML 目录例如/usr/share/nginx/html/property-web。9.3 Nginx 反向代理Nginx 配置必须把/api请求代理到 Java 后端server { listen 80; server_name your-domain.com; location / { root /usr/share/nginx/html/property-web; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }如果前端路由使用了 history 模式刷新页面时 Nginx 必须配置try_files否则会出现 404。9.4 进程与性能观察Web 管理系统对硬件要求不高但仍建议在演示前观察基础资源CPU 和内存Linux 下执行top观察 java 进程和 mysqld 进程磁盘执行df -h确认磁盘空间足够MySQL 慢日志如果业主列表页查询变慢检查是否建立了phone、room_id等索引后端请求日志使用tail -f查看 Spring Boot 日志确认操作过程中没有异常堆栈。如果是课程设计演示建议把后端和数据库放在本机前端页面通过浏览器 localhost 访问这样环境最简单。不要为了演示临时去改数据库密码避免把账号密码弄混。10. 社区物业管理系统常见问题与排查方法问题现象可能原因排查方式解决方案后端启动直接报错提示 Java 版本问题SpringBoot3 需要 JDK17但当前使用 JDK8执行java -version切换 JDK 版本IDEA 里同步修改 Project SDK启动报错Access denied for user rootlocalhostMySQL 密码或账号错误使用 Navicat 或命令行登录验证修改 application.yml 中的账号密码启动报错Unknown database property_db数据库未创建登录 MySQL 查询数据库列表执行建库 SQL中文乱码MySQL 表或连接字符集不是 utf8mb4查看表字符集建表时使用 utf8mb4连接串加 characterEncodingutf8前端访问接口 502Nginx 代理目标或后端服务未启动检查后端 8080 端口启动 Spring Boot检查 Nginx 代理地址前端调用接口提示 401token 未传或已过期检查请求头 Authorization确认登录后把 token 加入请求头启动报port 8080 was already in use端口被占用Windows 执行netstat -ano | findstr :8080换端口或结束占用进程后端抛出OutOfMemoryErrorJVM 内存配置过高或代码有内存泄漏检查启动参数和服务器内存调小-Xms/-Xmx检查分页避免全表查询MyBatis-Plus 自动填充不生效未配置 MetaObjectHandler查看配置类添加自动填充处理器或手动 set 时间实际开发中遇到问题先看启动日志的第一行异常不要只看报错标题。SpringBoot3 对依赖版本更敏感遇到自动配置类找不到时优先检查依赖坐标是否与 Spring Boot 3 兼容。11. 二次开发与最佳实践建议11.1 后端工程规范社区物业管理系统能跑起来只是第一步代码规范决定了后续扩展是否顺畅。建议从一开始就约定统一响应结构、全局异常和接口命名。全局异常可以用RestControllerAdvice捕获业务异常和参数校验异常避免每个 Controller 重复写 try-catch。自定义业务异常时可以继承RuntimeException并指定错误码。这样前端对后端返回的错误处理会非常稳定。如果是毕设或真实项目建议补上方法级权限校验不能只依靠前端隐藏按钮。最简单的方式是自己定义角色注解在 HandlerInterceptor 中判断当前登录用户角色。11.2 数据库设计建议所有表都保留create_time、update_time、deleted字段MyBatis-Plus 配置逻辑删除后后续统一用 deleteById 也不会真正删数据业主手机号、姓名等高频查询字段在数据量变大时要加索引金额字段统一使用DECIMAL报修状态、缴费状态优先使用TINYINT加注释前端再写映射字典避免在业务代码里散布魔法数字尽量不要把密码明文放在数据库中即使课设项目也要养成使用 BCrypt 的习惯。11.3 面试复习角度如果你把社区物业管理系统作为简历项目需要能回答这些常见后端问题SpringBoot3 和 SpringBoot2 的核心区别Jakarta EE 命名空间变化登录认证流程中 JWT 的结构解析和过期处理MyBatis-Plus 分页插件的工作原理MySQL 优化报修列表查询时添加的索引为什么使用逻辑删除而不是物理删除定时生成缴费账单时如何防止重复插入金额计算为什么不能用 double。把这些知识点覆盖到代码只是最终呈现真正加分的是你对系统设计和数据库细节的思考。总结与下一步社区物业管理系统属于非常标准的 Java 全栈业务系统如果只复制别人的代码很难记住完整链路。更推荐的做法是亲手跑一遍 MySQL 建表、SpringBoot3 接口、Vue3 页面联调的全过程至少把登录、业主管理、报修工单、缴费记录这四条链路跑通再做 UI 优化和功能扩展。第一次动手时先把数据库初始化脚本配好再启动后端并逐个测试接口最后再启动 Vue 前端联调。遇到问题不要频繁重装环境先看日志中是哪一层报错MySQL 连接失败优先查账号密码和端口接口 401 优先检查 token前端 502 优先检查 Nginx 代理地址。这套系统跑顺之后再加住户满意度评分、移动端小程序、报修消息通知、停车费自动扣费方向都是清晰的。建议收藏保存后续做项目或准备 SpringBoot 全栈面试时可以直接对照。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进