基于Java+SpringBoot+Vue前后端分离小区管理系统设计与实现

news2024/9/23 21:31:59

博主介绍:✌全网粉丝3W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌

博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅文末关注公众号获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟
 

 ✨【微服务】Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)

目录

一、行业痛点与功能需求

1、物业行业痛点

2、产品核心功能(费用管理)

2.1、费用管理

 2.2、业主报修

2.3、日常管理

二、系统设计

1、系统运行环境

2、系统架构设计

 3、登录设计

4、项目模块设计

三、数据库设计

1、用户实体

2、房屋实体

3、小区实体

四、功能截图 

1、登录界面

2、我的小区

3、业主管理

3.1、业主信息

4、资产管理

4.1、楼栋信息

4.2、单元信息

4.3、房屋信息

5、智慧停车

5.1、停车场管理

5.2、车位信息

5.3、业主车辆

6、巡检管理

6.1、巡检点

6.2、巡检路线

6.3、巡检计划

五、实现代码

1、控制器

2、接口

3、实现类

六、获取源码


一、行业痛点与功能需求

1、物业行业痛点

2、产品核心功能(费用管理)

2.1、费用管理

 2.2、业主报修

2.3、日常管理

二、系统设计

1、系统运行环境

开发系统:Windows10

架构模式:MVC/前后端分离

JDK版本:Java JDK1.8

开发工具:IDEA

数据库版本: mysql5.7

数据库可视化工具: SQL yog或Navicat for MySQL

服务器:SpringBoot自带 apache tomcat

主要技术:Java、SpringBoot2.7、MyBatis-plus、SpringSecurity、JWT、MySQL、Redis、Html、Vue、Elementui等


2、系统架构设计

 3、登录设计

    借鉴微服务单点登录设计

 

4、项目模块设计

三、数据库设计

1、用户实体

2、房屋实体

3、小区实体

四、功能截图 

1、登录界面

2、我的小区

配置物业公司管理的小区,部署一套系统,可配置多个不同小区,减少物业的持有成本

3、业主管理

3.1、业主信息

小区业主管理,或者业主成员管理。其中业主成员包括家庭成员、租客、或者其他成员。添加类型不限。

4、资产管理

4.1、楼栋信息

4.2、单元信息

1)根据楼栋查询单元

2)单元列表

4.3、房屋信息

1)房屋列表

添加房屋功能点设计:

2)选择楼栋

 

 

3)选择单元

 

4)添加房屋

5、智慧停车

配置社区的停车场地,可对多块场地进行管理。对其中的车位、车辆信息进行登记,车辆黑名单、车位数、进出记录查询,或无人值守设置收费二维码等。

5.1、停车场管理

5.2、车位信息

1)列表

2)新增窗口

停车场需要查询停车场管理列表

5.3、业主车辆

1)列表

新增业主车辆功能点设计界面:

2)选择车位

 

3)选择业主

4)填写车辆信息

6、巡检管理

小区日常巡逻巡检。包括对设备、环境卫生等检查。可设置线路,制定巡检计划及任务检查。

6.1、巡检点

6.2、巡检路线

6.3、巡检计划

五、实现代码

1、控制器

@RestController
@AllArgsConstructor
@RequestMapping("/api/room")
public class RoomController {

    private IRoomService roomService;

    @GetMapping
    public Object loadRooms(@RequestParam Map<String, String> query) {
        PageInfo<RoomVO> pageInfo = roomService.loadRooms(query);
        return R.ok(pageInfo);
    }

    @GetMapping("/ownerRooms")
    public Object loadOwnerRoomInfos(@RequestParam Map<String, String> query) {
        PageInfo<RoomVO> pageInfo = roomService.loadOwnerRoomInfos(query);
        return R.ok(pageInfo);
    }

    @GetMapping("{ownerId}")
    public Object loadRoomsByOwnerId(@PathVariable String ownerId) {
        List<RoomVO> roomVoList = roomService.loadRoomsByOwnerId(ownerId);
        return R.ok(roomVoList);
    }

    @PostMapping
    public Object addRoom(@RequestBody RoomDTO roomDTO) {
        String s = roomService.addRoom(roomDTO);
        return R.ok(s);
    }

    @PutMapping
    public Object editRoom(@RequestBody RoomDTO roomDTO) {
        String s = roomService.editRoom(roomDTO);
        return R.ok(s);
    }

    @DeleteMapping("{roomId}")
    public Object deleteRoom(@PathVariable String roomId) {
        String s = roomService.deleteRoomById(roomId);
        return R.ok(s);
    }
}

2、接口

public interface IRoomService extends IService<Room> {

    PageInfo<RoomVO> loadRooms(Map<String, String> query);

    PageInfo<RoomVO> loadOwnerRoomInfos(Map<String, String> query);

    List<String> selectRoomIdByViewId(String floorId, String unitId);

    List<RoomVO> loadRoomsByOwnerId(String ownerId);

    String addRoom(RoomDTO roomDTO);

    String editRoom(RoomDTO roomDTO);

    String deleteRoomById(String roomId);
}

3、实现类

@Service
public class RoomServiceImpl extends ServiceImpl<RoomMapper, Room> implements IRoomService {

    @Override
    public PageInfo<RoomVO> loadRooms(Map<String, String> query) {
        CriticalQuery criticalQuery = CriticalQuery.create(query);
        PageParam pageParam = criticalQuery.pageParam();
        IPage<RoomVO> page = new Page<>(pageParam.getPage(), pageParam.getSize());
        QueryWrapper<Object> wrapper = criticalQuery.queryWrapper();
        page = baseMapper.loadRooms(page, wrapper);
        PageInfo<RoomVO> pageInfo = PageInfo.of(page.getCurrent(), page.getSize());
        List<RoomVO> voList = page.getRecords();
        pageInfo.setTotal(page.getTotal()).setList(voList);
        return pageInfo;
    }

    @Override
    public PageInfo<RoomVO> loadOwnerRoomInfos(Map<String, String> query) {
        CriticalQuery criticalQuery = CriticalQuery.create(query);
        PageParam pageParam = criticalQuery.pageParam();
        IPage<RoomVO> page = new Page<>(pageParam.getPage(), pageParam.getSize());
        QueryWrapper<Object> wrapper = criticalQuery.queryWrapper();
        page = baseMapper.loadOwnerRoomInfos(page, wrapper);
        PageInfo<RoomVO> pageInfo = PageInfo.of(page.getCurrent(), page.getSize());
        List<RoomVO> voList = page.getRecords();
        pageInfo.setTotal(page.getTotal()).setList(voList);
        return pageInfo;
    }

    @Override
    public List<String> selectRoomIdByViewId(String floorId, String unitId) {
        return baseMapper.selectRoomIdByViewId(floorId, unitId);
    }

    @Override
    public List<RoomVO> loadRoomsByOwnerId(String ownerId) {
        List<String> roomIds = baseMapper.selectRoomIdByOwnerId(ownerId);
        List<RoomVO> roomVoList = Lists.newArrayList();
        roomIds.forEach(id -> {
            RoomVO roomVo = baseMapper.loadRoomsByOwnerId(id);
            roomVoList.add(roomVo);
        });

        return roomVoList;
    }

    @Override
    public String addRoom(RoomDTO roomDTO) {
        Room room = BeanCopyUtil.copyProperties(roomDTO, Room::new);
        room.setUserId(SecurityUtils.getUserId());
        room.setCreateTime(LocalDateTime.now());
        save(room);
        return room.getRoomId();
    }

    @Override
    public String editRoom(RoomDTO roomDTO) {
        Room room =  BeanCopyUtil.copyProperties(roomDTO, Room::new);
        room.setUserId(SecurityUtils.getUserId());
        updateById(room);
        return room.getRoomId();
    }

    @Override
    public String deleteRoomById(String roomId) {
        return String.valueOf(baseMapper.deleteById(roomId));
    }
}

六、获取源码

 大家点赞收藏关注评论啦 、关注下方公众号获取联系方式👇🏻👇🏻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux——什么是互斥与互斥锁

目录 一.前提&#xff1a;临界区 & 临界资源 二.什么是互斥 &#xff08;一&#xff09;.互斥概念 &#xff08;二&#xff09;.为什么需要互斥 三.互斥锁介绍 &#xff08;一&#xff09;.互斥锁的概念 &#xff08;二&#xff09;.互斥锁的使用 ①系统API接口 ②…

内网服务器结合vxlan和iptables-snat实现内网服务器公网访问——筑梦之路

之前通过其他方式实现 CentOS搭建NAT和DHCP服务&#xff0c;实现共享上网_筑梦之路的博客-CSDN博客_vsphere 创建dhcp CentOS 7 firewalld实现共享上网和搭建本地yum仓库——筑梦之路_筑梦之路的博客-CSDN博客 如上图&#xff0c;有这样一种场景&#xff0c;我们经常遇到&am…

推荐和搜索系统的多样性研究综述

前言 检索结果的多样化是检索系统的一个重要研究课题&#xff0c;其可以满足用户的各种兴趣和供应商的平等公平曝光。 然而&#xff0c;检索系统中&#xff08;搜索与推荐领域&#xff09;的多样性研究缺乏一个系统的汇总&#xff0c;并且研究点相对零散。本次介绍的paper中&am…

深度学习可视化工具:Netron

Netron是一个用于神经网络、深度学习和机器学习模型的可视化工具。 Netron支持 ONNX、TensorFlow Lite、Caffe、Keras、Darknet、PaddlePaddle、ncnn、MNN、Core ML、RKNN、MXNet、MindSpore Lite、TNN、Barracuda、Tengine、CNTK、TensorFlow.js、Caffe2 和 UFF。 它还实验性…

[PyTorch]在PyTorch环境下使用Tensorboard

一、配置环境 在控制台中使用pip install语句安装Tensorboard&#xff08;同时需要安装tensorflow&#xff09; pip install tensorflow pip install tensorboard 添加引用并为其设置路径 from torch.utils.tensorboard import SummaryWriterwriter SummaryWriter(log_dir 日…

3轴数字罗盘IC HMC5883L介绍

3轴数字罗盘IC HMC5883L简介霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块&#xff0c;并带有数字接口的弱磁传感器芯片&#xff0c;应用于低成本罗盘和磁场检测领域。HMC5883L 包括最先进的高分辨率HMC118X 系列磁阻传感器&#xff0c;并附带霍尼韦尔专利的集成电路包括放大器…

Rstudio连接不上R语言常用解决方案

Rstudio链接不上R语言&#xff0c;默认情况下是不应该发生的&#xff0c;既然发生了&#xff0c;肯定是有些条件没有满足&#xff0c;如果将下面几个条件都满足&#xff0c;应该可以解决这个问题。 1. R和Rstudio安装路径为中文 虽然R和Rstudio支持中文&#xff0c;但是如果安…

干货 | 金融大数据风控利用个人信息的边界

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;大数据风控技术及应用现状在人民币贷款持续增长&#xff0c;市场环境日趋复杂的情况下&#xff0c;利用大数据进行风控是社会主义市场经济进行金融资源合理配置不可或缺的手…

jmeter做接口和自动化常见的使用方法

目录一、提取器1.JSON 提取器的应用场景1.1.提取某个特定值1.1.1.切片提取获取某个位标值1.2.提取多个值1.3.按条件查询按1.3.1.件提取是一个常用的方法1.3.2.还有其余几种用法1.4.提取值组成的列表2. 正则 提取器的应用场景二、CSV 参数化三、beanShell 脚本1.beanShell 引用变…

基于python inference 、ResNet实现的图像分类 (附完整代码可作为毕设参考)

这篇文章主要介绍了 图像分类的 inference,其中会着重介绍 ResNet。 2.模型概览 在torchvision.model中,有很多封装好的模型。 可以分类 3 类:

typecho去掉index.php

typecho去掉index.php一、前言二、配置过程三、问题所在四、解决方案五、一点体会一、前言 大家好&#xff0c;我是尝试中成长的站长&#xff0c;最近在使用typecho的过程中遇到了这种问题&#xff0c;index.php的伪静态没办法去掉&#xff0c;遂浏览器搜索了很多教程&#xf…

Jetpack架构组件库:WorkManager

WorkManager WorkManager 是Android最新一代的后台调度 API&#xff0c;主要是用来替换先前的旧版后台调度 API&#xff08;如 JobScheduler 等&#xff09;。 WorkManager 是适合用于持久性工作的推荐解决方案。如果工作始终要通过应用重启和系统重新启动来调度&#xff0c;…

无线局域网接入

非法接人是指非授权终端与无线局域网中的接入点&#xff08;Access Point&#xff0c;AP&#xff09;之间建立关联的过程&#xff0c;非法接入使得非授权终端可以与无线局域网中的授权终端交换数据&#xff0c;并可以通过AP访问网络资源。 非法登录是指非授权用户远程登录网络…

【JavaEE初阶】第八节.多线程(基础篇)阻塞队列(案例二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、阻塞队列概论 1.1 阻塞队列的概念与作用 1.2 阻塞队列的应用场景 —— 生产者消费者模型 1.3 生产者消费者模型的好处 二、阻塞队列的实现 2.1 Java标准库里面…

java中常见API该如何使用?

目录 API(Application Programming Interface)概述 如何使用API&#xff1f; API(Application Programming Interface)概述 –应用程序编程接口 –编写一个机器人程序去控制机器人踢足球&#xff0c;程序就需要向机器人发出向前跑、向后跑、射门、抢球等各种命令&#xff0c…

SECURECRT全局日志文件设置

SecureCRT配置自动记录日志很多人用SecureCRT时&#xff0c;希望自动记录日志&#xff0c;一个是方便以后查阅&#xff0c;一个是对自己的操作有个记录。可以看看自己做了什么操作&#xff0c;有时甚至可以看看之前是不是犯了什么错&#xff0c;是个很不错的功能。设置很简单&a…

[数据库迁移]-ES集群的部署

[数据库迁移]-ES集群的部署 森格 | 2023年1月 上一篇文件我们已经把Linux系统的LVM逻辑卷完成了&#xff0c;那下面我们就该把es集群环境搭建起来了&#xff0c;主要是以shell脚本来进行一键部署。 上文回顾&#xff1a;[数据库迁移]-LVM逻辑卷管理 一、环境介绍 1.1 环境配…

微分先行PID控制算法及仿真

微分先行PID控制的结构如图1所示&#xff0c;其特点是只对输出量y(k)进行微分&#xff0c;而对给定值y(k)不作微分。这样&#xff0c;在改变给定值时&#xff0c;输出不会改变&#xff0c;而被控量的变化通常是比较缓和的。这种输出量先行微分控制适用于给定值yd(k)频繁升降的场…

isNotEmpty() 和 isNotBlank() 的区别,字符串判空, StringUtils工具包 StringUtil工具类

目录1.StringUtils 和 StringUtilStringUtils 的依赖&#xff1a;StringUtils 的用法&#xff1a;StringUtil 工具类2. isNotEmpty() 和 isNotBlank()1.StringUtils 和 StringUtil 注&#xff1a;StringUtils 和 StringUtil 的区别&#xff08;StringUtil为自定义工具类&#…

微信小程序——获取接口调用凭据access_token

问题背景 今天在搞一个微信小程序的时候&#xff0c;使用到了发布内容的问题&#xff0c;然后想使用微信请求接口&#xff0c;结果遇到了请求接口需要获取调用凭证access_token。 查看微信小程序开发文档 打开微信小程序开发文档后&#xff0c;打开服务端相关文档&#xff0…