基于 RuoYi-Vue 框架构建的三端协同平台 —— 覆盖业委会筹备、成立备案、业主大会召开、小区日常自治全流程
Project Overview — 为什么要做、做什么、怎么做
在《民法典》框架下,小区业委会的成立和运作涉及大量流程:业主身份认证、筹备组组建、业主大会召开、投票表决、日常事务公示、财务管理等。传统线下方式效率低、不透明,容易引发纠纷。本系统将全流程线上化,服务三端用户。
| 角色 | 编码 | 使用端 | 核心职责 |
|---|---|---|---|
| 业主 | OWNER | 微信小程序 | 身份认证、参与投票、查看公示、提交诉求 |
| 业委会委员 | COMMITTEE | 手机H5 + PC | 发起大会、管控投票、处理工单、管理财务 |
| 物业人员 | PROPERTY | 手机H5 + PC | 业主审核、工单处理、公告发布 |
| 系统管理员 | ADMIN | PC管理端 | 系统配置、数据管理、角色权限分配 |
System Architecture — 技术选型与分层设计
| 层级 | 技术选型 | 版本 | 说明 |
|---|---|---|---|
| 业主端 | 微信原生小程序 | — | 微信生态最佳性能,API 无阉割 |
| 手机管理端 | React + Ant Design Mobile | 18 / 5.x | H5 浏览器可访问,不依赖微信审核 |
| PC管理端 | RuoYi-Vue (Vue2 + Element UI) | 3.9.2 | 成熟的后台管理框架,权限体系开箱即用 |
| 后端框架 | Spring Boot | 3.2.0 | 企业级 Java 框架 |
| ORM | MyBatis | — | XML Mapper,灵活控制 SQL |
| 分页 | PageHelper | — | 与 MyBatis 深度集成 |
| 安全 | Spring Security + JWT | — | RBAC 权限模型,按钮级控制 |
| 数据库 | MySQL | 8.0 | 关系型数据库,业主/房产/投票强关系模型 |
| 缓存 | Redis | — | Token 缓存、验证码、投票高峰期加速 |
| 连接池 | Druid | — | 阿里开源,监控完善 |
Vue2 + Element UI (PC)
React + Antd Mobile (H5)
微信小程序 (业主端)
ruoyi-admin (Controller)
ruoyi-system (Service/Domain)
ruoyi-framework (Security/AOP)
MySQL 8.0 (主库)
Redis (缓存/Token)
Druid (连接池监控)
# ===== 后端 (Spring Boot 多模块) ===== src/backend/ ├── ruoyi-admin/ # 启动模块 + Controller 层 │ └── controller/ │ ├── system/ # RuoYi 内置:用户/角色/菜单/部门 │ └── biz/ # ★ 业务模块:小区/楼栋/公告/工单/业委会/大会/财务/认证 ├── ruoyi-common/ # 公共工具:BaseEntity、AjaxResult、注解 ├── ruoyi-framework/ # 框架层:Security 配置、AOP 切面、过滤器 ├── ruoyi-system/ # 业务层:Domain + Mapper + Service │ ├── domain/ # RuoYi 内置领域模型 │ ├── biz/domain/ # ★ 业务领域模型 │ ├── biz/mapper/ # ★ 业务 Mapper 接口 │ └── biz/service/ # ★ 业务 Service ├── ruoyi-generator/ # 代码生成器 └── ruoyi-quartz/ # 定时任务 # ===== 前端 (Vue2 SPA) ===== src/admin-pc/ ├── src/ │ ├── api/biz/ # ★ 业务 API 层 (8 个模块) │ ├── views/biz/ # ★ 业务 Vue 页面 (8 个模块) │ ├── router/ # 路由配置 │ └── utils/request.js # Axios 封装 (Token 拦截) └── vue.config.js # 代理 /dev-api → 后端 :8080 # ===== 小程序 + 手机端 ===== src/miniapp/ # 微信小程序 (原生框架) src/admin-mobile/ # 手机 H5 管理端 (React)
Database Design — 20 张 RuoYi 系统表 + 22 张业务表
┌──────────────┐
│ community │ 小区信息
└──────┬───────┘
│ 1:N
┌──────▼───────┐
│ building │ 楼栋
└──────┬───────┘
│ 1:N
┌──────▼───────┐ ┌──────────────┐ ┌──────────────┐
│ house │ │ sys_user │ │ sys_role │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└──────┬─────────────┘ │
│ N:M │
┌──────▼───────┐ │
│ owner_house │ 业主-房产绑定 │
└──────┬───────┘ │
│ │
┌────────────┼────────────┐ │
│ │ │ │
┌──────▼──┐ ┌──────▼──┐ ┌──────▼──────┐ │
│ meeting │ │complaint│ │announcement │ │
│ 业主大会 │ │ 诉求工单 │ │ 公示公告 │ │
└──────┬──┘ └─────────┘ └─────────────┘ │
│ │
┌────────────┼────────────┐ │
┌────▼─────┐ ┌────▼─────┐ ┌───▼──────┐ │
│ vote │ │ vote_ │ │ sign_in │ │
│ _config │ │ record │ │ 签到 │ │
└──────────┘ └──────────┘ └──────────┘ │
│
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ committee │ │ financial_ │ │ preparation │ │
│ 业委会 │ │ record │ │ 筹备记录 │ │
└──────────────┘ └──────────────┘ └──────────────┘ │
由 RuoYi 框架提供,处理认证、权限、日志等通用功能
| 表名 | 说明 | 核心字段 |
|---|---|---|
sys_user | 用户账号 | user_id, user_name, password, phonenumber, status, dept_id |
sys_role | 角色 | role_id, role_name, role_key, role_sort, data_scope |
sys_menu | 菜单权限 | menu_id, menu_name, parent_id, path, component, perms, menu_type |
sys_dept | 部门 | dept_id, parent_id, dept_name, order_num, leader |
sys_user_role | 用户-角色关联 | user_id, role_id |
sys_role_menu | 角色-菜单关联 | role_id, menu_id |
sys_config | 系统配置 | config_name, config_key, config_value |
sys_dict_type | 字典类型 | dict_name, dict_type |
sys_dict_data | 字典数据 | dict_label, dict_value, dict_type |
sys_oper_log | 操作日志 | oper_name, business_type, method, oper_time |
sys_logininfor | 登录日志 | user_name, ipaddr, status, login_time |
sys_notice | 系统通知 | notice_title, notice_type, notice_content |
| …… 共 20 张,详见 RuoYi 官方文档 | ||
| 表名 | 说明 | 核心字段 |
|---|---|---|
community | 小区信息 | id, name, address, province, city, district, street_office(所属街道办), total_area(总面积), total_households(总户数) |
building | 楼栋 | id, community_id(FK→community), name, floors(层数), units(单元数), elevator_count |
house | 房屋 | id, building_id(FK→building), room_number(房号), floor, area(面积), house_type(户型), property_type(房屋性质) |
owner_house | 业主-房产绑定 | id, owner_id(FK→sys_user), house_id(FK→house), relation(业主/租户/家属), cert_images(证件照), audit_status(审核状态), audit_reason |
certification | 认证记录 | id, owner_house_id, type(房产证/购房合同), images, result, reason |
| 表名 | 说明 | 核心字段 |
|---|---|---|
preparation | 筹备申请 | id, community_id, initiator_id, status(申请/审核中/公示/完成), street_office, filing_no |
preparation_member | 筹备组成员 | id, preparation_id, owner_id, role(组长/副组长/成员), audit_status |
committee | 业委会 | id, community_id, name, established_date, term(届期), term_start/term_end(任期), member_count, status(在任/到期/解散), filing_no |
committee_member | 委员 | id, committee_id, user_id, position(主任/副主任/委员), duty(分管职责), term_start, term_end |
meeting | 业主大会 | id, community_id, title, meeting_type(年度/临时/换届), start_time, end_time, location, online_url, content, status(草稿/已发布/进行中/已结束) |
meeting_topic | 大会议题 | id, meeting_id, title, description, topic_type(选举/表决/维修资金) |
| 表名 | 说明 | 核心字段 |
|---|---|---|
vote_config | 投票配置 | id, topic_id, start_time, end_time, vote_type(单选/多选), anonymity, min_vote_rate(最低投票率) |
vote_option | 投票选项 | id, config_id, content(同意/反对/弃权/候选人), sort, vote_count(实时计票) |
vote_record | 投票记录 | id, config_id, option_id, voter_id, vote_weight(票权权重), vote_time — 唯一约束(voter_id+config_id) |
vote_right | 投票权 | id, owner_id, meeting_id, house_id, vote_weight, status |
sign_in | 会议签到 | id, meeting_id, owner_id, sign_type(线上/线下扫码), sign_time |
| 表名 | 说明 | 核心字段 |
|---|---|---|
announcement | 公示公告 | id, community_id, title, content, summary, type(政策/财务/维修/表决), is_top, audit_status, publish_time |
complaint | 诉求工单 | id, owner_id, community_id, type(报修/建议/投诉/咨询), title, content, images, status(待处理→已分派→处理中→已解决→已关闭), assignee_id, result, rating(1-5星) |
financial_record | 收支记录 | id, community_id, record_type(收入/支出), category, amount, description, occur_date, voucher(凭证), audit_status |
public_revenue | 公共收益 | id, community_id, source(来源), amount, period(期间) |
maintenance_fund | 维修资金 | id, community_id, house_id, total_amount, used_amount, balance |
| 决策 | 说明 |
|---|---|
| 票权权重模型 | vote_right 表按业主房产面积计算票权权重,一人一票 + 权重系数,确保投票公正 |
| 一人一票防刷 | vote_record 的 UNIQUE(voter_id, config_id) 约束,每个投票每人只能投一次 |
| 工单状态机 | PENDING → ASSIGNED → PROCESSING → RESOLVED → CLOSED,五阶段状态流转 |
| 审核流程 | 业主认证、公告发布、财务记录均设计多级审核:草稿 → 待审核 → 通过/驳回 |
| 业委会任期 | term_start/term_end 记录每届任期,支持换届历史追溯 |
Backend Design — 代码组织、分层规范、API 设计
每个业务模块遵循统一的分层结构(以 Community 为例):
// 1. Domain — 数据模型,继承 RuoYi 的 BaseEntity public class Community extends BaseEntity { private Long id; private String name; private String address; // ... getter / setter } // 2. Mapper 接口 — MyBatis 数据访问 public interface CommunityMapper { List<Community> selectCommunityList(Community c); Community selectCommunityById(Long id); int insertCommunity(Community c); int updateCommunity(Community c); int deleteCommunityByIds(Long[] ids); } // 3. Mapper XML — SQL 映射,支持动态条件查询 <!-- CommunityMapper.xml --> <!-- 使用 <include refid="selectVo"/> 复用字段列表 --> <!-- <if test="..."> 实现动态 WHERE 条件 --> // 4. Service 接口 + 实现 public interface ICommunityService { ... } // CommunityServiceImpl — 注入 Mapper,委托调用 // 5. Controller — RESTful API,继承 BaseController @RestController @RequestMapping("/biz/community") public class CommunityController extends BaseController { @Autowired private ICommunityService service; @GetMapping("/list") public TableDataInfo list(Community c) { startPage(); // PageHelper 分页 List<Community> list = service.selectCommunityList(c); return getDataTable(list); // 统一分页响应体 } @PostMapping @PreAuthorize("@ss.hasPermi('biz:community:add')") // 按钮级权限 public AjaxResult add(@RequestBody Community c) { return toAjax(service.insertCommunity(c)); } }
| 场景 | 返回类型 | 示例 |
|---|---|---|
| 分页列表 | TableDataInfo | {code:200, rows:[], total:100, msg:"查询成功"} |
| 单条/非分页 | AjaxResult | {code:200, data:{...}, msg:"操作成功"} |
| 操作结果 | AjaxResult | {code:200, msg:"修改成功"} 或 {code:500, msg:"错误信息"} |
| 模块 | Base URL | 方法 | 权限标识 |
|---|---|---|---|
| 小区管理 | /biz/community | GET list · GET :id · POST · PUT · DELETE | biz:community:list/add/edit/remove |
| 楼栋管理 | /biz/building | GET list · GET :id · POST · PUT · DELETE | biz:building:list |
| 公示公告 | /biz/announcement | GET list · GET :id · POST · PUT · DELETE | biz:announcement:list/add/edit/remove |
| 诉求工单 | /biz/complaint | GET list · GET :id · PUT assign · PUT resolve · DELETE | biz:complaint:list |
| 业主认证 | /biz/owner-house | GET list · GET :id · PUT audit · DELETE | biz:owner:list/remove |
| 业委会管理 | /biz/committee | GET list · GET :id · POST · PUT · DELETE | biz:committee:list/add/edit/remove |
| 业主大会 | /biz/meeting | GET list · GET :id · POST · PUT · DELETE | biz:meeting:list |
| 财务管理 | /biz/financial | GET list · GET :id · POST · PUT · DELETE | biz:financial:list/add/edit/remove |
基于 Spring Security + RBAC 的三级权限控制:
| 级别 | 实现方式 | 示例 |
|---|---|---|
| 菜单级 | sys_menu 表 + 前端 v-hasPermi 指令 | 无权限者看不到菜单入口 |
| 接口级 | @PreAuthorize("@ss.hasPermi('xxx')") | 无权限者调 API 返回 403 |
| 按钮级 | 前端 v-hasPermi="['biz:community:add']" | 无权限者看不到"新增"按钮 |
Frontend Design — PC 管理端、小程序端、手机端
基于 RuoYi-Vue 前端框架,所有业务页面遵循统一模板:
el-form :inline 内联搜索表单,支持条件筛选 + 重置v-hasPermi 指令控制显隐el-table + pagination 分页组件,多选支持批量删除el-dialog 内嵌 el-form,新增/编辑复用同一组件@/api/biz/xxx.js 模块封装,自动携带 Token// src/api/biz/community.js import request from '@/utils/request' export function listCommunity(query) { return request({ url: '/biz/community/list', method: 'get', params: query }) } export function getCommunity(id) { return request({ url: '/biz/community/' + id, method: 'get' }) } export function addCommunity(data) { return request({ url: '/biz/community', method: 'post', data }) } export function updateCommunity(data) { return request({ url: '/biz/community', method: 'put', data }) } export function delCommunity(ids) { return request({ url: '/biz/community/' + ids, method: 'delete' }) }
业务菜单存储在 sys_menu 表中,通过数据库动态配置(无需重启前端):
| menu_id | menu_name | parent_id | path | component | perms |
|---|---|---|---|---|---|
| 1061 | 业主自治 | 0 | biz | — | — |
| 1062 | 小区管理 | 1061 | community | biz/community/index | biz:community:list |
| 1063 | 楼栋管理 | 1061 | building | biz/community/building | biz:building:list |
| 1064 | 公示公告 | 1061 | announcement | biz/announcement/index | biz:announcement:list |
| 1065 | 诉求工单 | 1061 | complaint | biz/complaint/index | biz:complaint:list |
| 1066 | 业主认证 | 1061 | owner-cert | biz/owner/index | biz:owner:list |
| 1067 | 业委会管理 | 1061 | committee | biz/committee/index | biz:committee:list |
| 1068 | 业主大会 | 1061 | meeting | biz/meeting/index | biz:meeting:list |
| 1069 | 财务管理 | 1061 | financial | biz/financial/index | biz:financial:list |
| Tab | 页面 | 功能 |
|---|---|---|
| 首页 | pages/index/index | 轮播通知、快速入口(业主认证/投票/诉求/报修)、最新公告 |
| 筹备/大会 | pages/preparation/preparation | 业委会筹备进度、业主大会列表 |
| 投票 | pages/vote/vote | 进行中的投票列表、跳转投票详情 |
| 服务 | pages/service/service | 提交诉求、费用查询、车位管理、自治章程 |
| 我的 | pages/mine/mine | 登录、我的房产、投票记录、诉求记录、设置 |
使用 wx.login 获取 code → 后端换取 openid → JWT Token 认证
| Tab | 页面 | 功能 |
|---|---|---|
| 工作台 | pages/Dashboard | 待审核数、进行中投票、待处理工单、超时工单 |
| 审核 | pages/OwnerAudit | 业主认证审核列表 |
| 投票 | pages/VoteManage | 投票管控、新建投票 |
| 工单 | pages/ComplaintManage | 诉求工单处理、分派 |
| 我的 | pages/Mine | 委员信息、工作台账、系统设置 |
Module Details — 每个模块的业务逻辑与交互设计
管理小区基础信息(名称、省市区、所属街道、面积、户数)。新增小区后,方可创建楼栋和房屋。
CRUD 关联楼栋
管理每个小区下的楼栋信息,关联所属小区。信息包含:楼栋名称、层数、单元数、电梯数。
CRUD 关联小区 关联房屋
发布小区公告(政策/财务/维修/表决结果),支持置顶、草稿/发布状态切换、富文本内容。
CRUD 审核流程 置顶排序
业主提交报修/建议/投诉/咨询,管理员分派处理、跟踪状态、记录结果、业主评价。
状态机 5 阶段流转 评价体系
业委会/物业审核业主身份绑定申请。查看业主姓名、手机号、房屋信息、证件材料,支持通过/驳回操作。
审核流 通过/驳回 关联房屋
管理业委会信息:名称、所属小区、成立日期、届期、任期起止、委员人数、备案编号、状态(在任/到期/解散)。
CRUD 任期管理 状态流转
创建业主大会(年度/临时/换届),设置会议时间、地点、线上链接、会议内容。支持草稿→发布流程。
CRUD 发布流程 关联投票
管理小区收支记录:收入/支出类型、类别(物业费/公共收益/维修资金)、金额、发生日期、凭证、审核状态。
CRUD 审核流程 收支分类
Deployment Guide — 环境要求与启动步骤
| 组件 | 版本 | 说明 |
|---|---|---|
| JDK | 17+ | Spring Boot 3.2 最低要求 |
| MySQL | 8.0+ | 支持窗口函数、CTE |
| Redis | 6.0+ | 缓存 + Token 存储 |
| Node.js | 14+ | 前端构建(开发环境) |
| Maven | 3.6+ | 后端构建 |
# 导入 RuoYi 系统表 mysql -h host -u user -p lianyue < src/backend/sql/ry_20260417.sql mysql -h host -u user -p lianyue < src/backend/sql/quartz.sql # 业务表已通过 application.yml 自动建表(MyBatis) # 如需手动创建,执行 src/backend/wuye-server/.../sql/init.sql
# 编辑 src/backend/ruoyi-admin/src/main/resources/application-druid.yml datasource: druid: master: url: jdbc:mysql://YOUR_HOST:PORT/lianyue?... # 修改数据库连接 username: YOUR_USER # 修改用户名 password: YOUR_PASSWORD # 修改密码
cd src/backend mvn clean package -DskipTests # 编译打包 java -jar ruoyi-admin/target/ruoyi-admin.jar # 启动 (端口 8080)
cd src/admin-pc npm install # 安装依赖 npm run dev # 启动开发服务器 (默认端口 1024) # 访问 http://localhost:1024 # 默认账号: admin / admin123
| 后端 | 运行中 | http://localhost:8080 |
| PC管理端 | 运行中 | http://localhost:1024 |
| 数据库 | 连接正常 | 47.91.3.189:3562 / lianyue (45 张表) |
| Redis | 连接正常 | localhost:6379 |
小区业主自治管理系统 · 设计文档 · 2026-06-08
基于 RuoYi-Vue 3.9.2 · Spring Boot 3.2.0 · Vue 2.6 · MySQL 8.0