基于SpringBoot+Vue的社区物业交流服务平台 - 源码深度解析
在现代社区物业管理中,信息不对称和沟通效率低下是长期存在的痛点。传统模式下,业主报修依赖电话沟通容易导致占线遗漏,物业通知依靠张贴公告触达率低,邻里之间缺乏合规的交流渠道。这些问题不仅造成物业响应滞后、服务质量难以保障,更限制了健康社区互动生态的形成。
系统架构与技术栈设计
后端架构设计
该平台采用前后端分离的现代化架构,后端基于SpringBoot 2.x框架构建,充分利用其"约定优于配置"的理念简化开发流程。系统采用经典的三层架构模式:
- 控制层(Controller):通过@RestController注解封装RESTful API接口,统一处理HTTP请求和响应
- 服务层(Service):封装工单流转、通知推送、权限验证等核心业务逻辑,确保业务规则的一致性
- 持久层(Dao/Mapper):基于MyBatis-Plus 3.x实现,极大简化了传统MyBatis的CRUD操作
前端技术选型
前端采用Vue.js 3.x组合式API架构,具备以下技术特点:
- 组件化开发:将报修表单、公告列表、评论区域等功能拆分为可复用组件
- 路由管理:使用Vue Router实现单页面应用(SPA)的无刷新页面切换
- 状态管理:通过Vuex集中管理用户登录状态、未读消息数等全局数据
- 异步处理:采用Axios库处理API请求,支持请求拦截和响应拦截
核心配置文件解析
项目的application.yml配置文件展示了完整的技术集成方案:
# 数据库连接配置
spring:
datasource:
url: jdbc:mysql://192.168.99.4:3306/vue_wuyejiaoliusite?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
username: vue_wuyejiaoliusite
password: vue_wuyejiaoliusite
driver-class-name: com.mysql.cj.jdbc.Driver
# Redis缓存配置
redis:
host: java.envdown.site
port: 6379
password: 1234
database: 0
timeout: 3000ms
# 文件上传配置
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
location: /tmp
# 服务器配置
server:
port: 8080
servlet:
context-path: /vue_wuyejiaoliusite
# MyBatis-Plus配置
mybatis-plus:
global-config:
db-config:
table-prefix: t_
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
配置亮点说明:
- 数据库连接使用MySQL 8.0+的新特性,包括时区设置和UTF-8编码支持
- Redis配置实现会话管理和缓存机制,提升系统性能
- 文件上传配置支持大文件传输,满足社区多媒体需求
- MyBatis-Plus表前缀配置实现数据库命名规范统一
数据库设计深度解析
报修业务流程表设计
报修模块采用主从表结构设计,实现业务流程的完整闭环管理。
-- 报修主表结构
CREATE TABLE `t_baoxiu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`title` varchar(255) DEFAULT NULL COMMENT '报修问题摘要',
`content` varchar(255) DEFAULT NULL COMMENT '报修详细描述',
`jindu` varchar(255) DEFAULT NULL COMMENT '当前处理进度',
`bz` varchar(255) DEFAULT NULL COMMENT '补充备注信息',
`user_id` int(11) DEFAULT NULL COMMENT '报修用户ID',
`add_time` datetime DEFAULT NULL COMMENT '创建时间戳',
`update_time` datetime DEFAULT NULL COMMENT '最后更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_add_time` (`add_time`),
CONSTRAINT `fk_baoxiu_user` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='物业报修工单表';
-- 报修进度跟踪表
CREATE TABLE `t_baoxiujindu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`jindu` varchar(255) DEFAULT NULL COMMENT '进度状态描述',
`bz` varchar(255) DEFAULT NULL COMMENT '处理备注',
`baoxiu_id` int(11) DEFAULT NULL COMMENT '关联报修工单ID',
`add_time` datetime DEFAULT NULL COMMENT '进度记录时间',
`operator_id` int(11) DEFAULT NULL COMMENT '操作人员ID',
PRIMARY KEY (`id`),
KEY `idx_baoxiu_id` (`baoxiu_id`),
KEY `idx_add_time` (`add_time`),
CONSTRAINT `fk_jindu_baoxiu` FOREIGN KEY (`baoxiu_id`) REFERENCES `t_baoxiu` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='报修进度跟踪表';
数据库设计优化策略:
索引优化
- 为
user_id和baoxiu_id建立B+树索引,提升关联查询性能 - 时间字段索引支持按时间范围的高效查询
- 为
外键约束设计
- 使用ON DELETE CASCADE确保数据一致性
- 外键约束防止孤儿记录的产生
字符集选择
- 采用utf8mb4字符集完整支持Unicode,包括emoji表情
- 排序规则使用unicode_ci实现大小写不敏感的字符串比较

角色权限管理系统设计
系统采用标准的RBAC(Role-Based Access Control)模型,实现灵活的权限控制。
-- 角色定义表
CREATE TABLE `t_role` (
`role_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色唯一标识',
`role_name` varchar(50) NOT NULL COMMENT '角色名称(admin,user,repairman)',
`role_desc` varchar(100) DEFAULT NULL COMMENT '角色功能描述',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '角色创建时间',
`status` tinyint(1) DEFAULT '1' COMMENT '角色状态(1启用,0禁用)',
PRIMARY KEY (`role_id`),
UNIQUE KEY `uk_role_name` (`role_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统角色定义表';
-- 用户角色关联表
CREATE TABLE `t_user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '关联记录ID',
`user_id` int(11) NOT NULL COMMENT '用户ID',
`role_id` int(11) NOT NULL COMMENT '角色ID',
`assign_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '角色分配时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`user_id`,`role_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_role_id` (`role_id`),
CONSTRAINT `fk_ur_user` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE CASCADE,
CONSTRAINT `fk_ur_role` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`role_id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户角色关联表';
权限系统优势分析:
- 多角色支持:单个用户可同时拥有多个角色,适应复杂的社区管理场景
- 权限粒度控制:通过角色-权限的映射实现细粒度的访问控制
- 审计追踪:记录角色分配时间,满足安全审计要求
- 状态管理:角色启用/禁用状态控制,实现灵活的权限管理

通用评论系统设计
评论模块采用多态关联设计,支持系统内多种资源的评论功能。
CREATE TABLE `t_comment` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '评论ID',
`target` varchar(50) NOT NULL COMMENT '评论目标类型(repair,notice,article)',
`tid` int(11) NOT NULL COMMENT '目标资源ID',
`content` text NOT NULL COMMENT '评论内容',
`parent_id` int(11) DEFAULT '0' COMMENT '父评论ID(支持回复功能)',
`bz` varchar(500) DEFAULT NULL COMMENT '扩展备注',
`user_id` int(11) NOT NULL COMMENT '评论用户ID',
`add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '评论时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`like_count` int(11) DEFAULT '0' COMMENT '点赞数',
`status` tinyint(1) DEFAULT '1' COMMENT '评论状态(1正常,0删除)',
PRIMARY KEY (`id`),
KEY `idx_target_tid` (`target`,`tid`),
KEY `idx_user_id` (`user_id`),
KEY `idx_add_time` (`add_time`),
KEY `idx_parent_id` (`parent_id`),
CONSTRAINT `fk_comment_user` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通用评论系统表';
评论系统创新特性:
- 多态关联设计:通过target字段区分不同业务实体,实现高度复用
- 树形结构支持:parent_id字段支持评论回复功能,构建讨论线程
- 内容审核机制:status字段实现评论的软删除和内容审核
- 社交互动功能:like_count字段记录点赞数,增强用户互动性
核心功能实现详解
报修工单管理系统
报修功能采用完整的CRUD操作,支持全生命周期的工单管理。
@RestController
@RequestMapping("/api/baoxiu")
@Api(tags = "报修工单管理")
public class BaoxiuController {
@Autowired
private BaoxiuService baoxiuService;
@Autowired
private CommentService commentService;
@Autowired
private UserService userService;
@PostMapping("/create")
@ApiOperation("创建报修工单")
public ResponseEntity<ResultVO> createBaoxiu(@RequestBody @Valid BaoxiuDTO baoxiuDTO,
HttpServletRequest request) {
// 从JWT token中获取当前用户ID
Integer userId = JwtUtil.getUserIdFromToken(request);
baoxiuDTO.setUserId(userId);
BaoxiuEntity baoxiu = baoxiuService.createBaoxiu(baoxiuDTO);
return ResponseEntity.ok(ResultVO.success("报修提交成功", baoxiu));
}
@GetMapping("/list")
@ApiOperation("分页查询报修记录")
public ResponseEntity<ResultVO> getBaoxiuList(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size,
@RequestParam(required = false) String status) {
Page<BaoxiuVO> result = baoxiuService.getBaoxiuByPage(page, size, status);
return ResponseEntity.ok(ResultVO.success(result));
}
@PostMapping("/progress/{id}")
@ApiOperation("更新报修进度")
@PreAuthorize("hasRole('ADMIN') or hasRole('REPAIRMAN')")
public ResponseEntity<ResultVO> updateProgress(@PathVariable Integer id,
@RequestBody ProgressDTO progressDTO) {
baoxiuService.updateProgress(id, progressDTO);
return ResponseEntity.ok(ResultVO.success("进度更新成功"));
}
}
业务逻辑层实现:
@Service
@Transactional
public class BaoxiuServiceImpl implements BaoxiuService {
@Autowired
private BaoxiuMapper baoxiuMapper;
@Autowired
private BaoxiuJinduMapper jinduMapper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public BaoxiuEntity createBaoxiu(BaoxiuDTO baoxiuDTO) {
// 数据验证
if (StringUtils.isBlank(baoxiuDTO.getTitle())) {
throw new BusinessException("报修标题不能为空");
}
// DTO转Entity
BaoxiuEntity baoxiu = new BaoxiuEntity();
BeanUtils.copyProperties(baoxiuDTO, baoxiu);
baoxiu.setAddTime(new Date());
baoxiu.setJindu("待受理");
// 保存报修记录
baoxiuMapper.insert(baoxiu);
// 记录初始进度
BaoxiuJinduEntity jindu = new BaoxiuJinduEntity();
jindu.setBaoxiuId(baoxiu.getId());
jindu.setJindu("工单已创建");
jindu.setAddTime(new Date());
jinduMapper.insert(jindu);
// 清除缓存
redisTemplate.delete("baoxiu:list:*");
return baoxiu;
}
@Override
public Page<BaoxiuVO> getBaoxiuByPage(Integer page, Integer size, String status) {
String cacheKey = String.format("baoxiu:list:%d:%d:%s", page, size, status);
// 缓存查询
Page<BaoxiuVO> cachedResult = (Page<BaoxiuVO>) redisTemplate.opsForValue().get(cacheKey);
if (cachedResult != null) {
return cachedResult;
}
// 数据库查询
Page<BaoxiuEntity> entityPage = new Page<>(page, size);
LambdaQueryWrapper<BaoxiuEntity> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(status)) {
queryWrapper.eq(BaoxiuEntity::getJindu, status);
}
queryWrapper.orderByDesc(BaoxiuEntity::getAddTime);
Page<BaoxiuEntity> resultPage = baoxiuMapper.selectPage(entityPage, queryWrapper);
// Entity转VO
Page<BaoxiuVO> voPage = new Page<>(resultPage.getCurrent(), resultPage.getSize(), resultPage.getTotal());
List<BaoxiuVO> voList = resultPage.getRecords().stream()
.map(this::convertToVO)
.collect(Collectors.toList());
voPage.setRecords(voList);
// 设置缓存,过期时间5分钟
redisTemplate.opsForValue().set(cacheKey, voPage, Duration.ofMinutes(5));
return voPage;
}
}
技术实现亮点:
- 事务管理:使用@Transactional注解确保数据一致性
- 缓存优化:Redis缓存分页查询结果,提升系统响应速度
- 权限控制:通过@PreAuthorize实现方法级别的权限验证
- 异常处理:统一的异常处理机制,提供友好的错误信息
- 数据验证:使用JSR-303验证注解确保数据完整性
该系统通过现代化的技术架构和精心的数据库设计,为社区物业管理提供了高效、可靠的数字化解决方案,显著提升了物业服务质量和居民满意度。