SpringBoot+Vue小区物业管理系统 附带详细运行指导视频

news2024/11/25 3:30:24

文章目录

  • 一、项目演示
  • 二、项目介绍
  • 三、运行截图
  • 四、主要代码
    • 1.用户登录代码
    • 2.查询小区信息代码
    • 3.保存缴费信息代码

一、项目演示

项目演示地址: 视频地址

二、项目介绍

项目描述:这是一个基于SpringBoot+Vue框架开发的小区物业管理系统。首先,这是一个前后端分离的项目,代码简洁规范,注释说明详细,易于理解和学习。其次,这项目功能丰富,具有一个小区物业管理系统该有的所有功能。

项目功能:此项目分为三个角色:业主物业员工管理员业主有登录、管理个人信息、查看物业员工和管理员信息、查看所属小区信息、查询个人房屋信息、查看所属小区的车位信息、查看个人缴费信息、支付缴费、查看所属小区公告信息、管理个人维修信息、管理个人投诉信息、查看个人数据统计等等功能。物业员工有登录、管理所属小区的业主信息、管理个人信息、查看管理员信息、查看所属小区信息、管理所属小区的楼栋信息和房屋信息、管理所属小区的车位信息、管理所属小区业主的缴费信息、管理个人发布的公告信息、受理所属小区业主的维修、投诉信息、查看所属小区数据统计等等功能。管理员有登录、管理个人信息、管理所有业主信息、管理所有物业员工信息、管理所有小区信息、管理所有楼栋、房屋信息、管理所有车位信息、管理所有缴费信息。管理所有公告信息、管理所有维修信息、管理所有投诉信息、查看数据统计等等功能。

应用技术:SpringBoot + Vue3 + MySQL + MyBatis + Redis + ElementUI-Plus + XXL-JOB

运行环境:IntelliJ IDEA2019.3.5 + MySQL5.7(项目压缩包中自带) + Redis5.0.5(项目压缩包中自带) + JDK1.8 + Maven3.6.3(项目压缩包中自带)+ Node14.16.1(项目压缩包中自带)

三、运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、主要代码

1.用户登录代码

	/**
     * 用户登录操作
     * @param userDTO
     * @return
     */
    @Override
    public ResponseDTO<UserDTO> login(UserDTO userDTO) {
        // 进行是否为空判断
        if(CommonUtil.isEmpty(userDTO.getPhone())){
            return ResponseDTO.errorByMsg(CodeMsg.PHONE_EMPTY);
        }
        if(CommonUtil.isEmpty(userDTO.getPassword())){
            return ResponseDTO.errorByMsg(CodeMsg.PASSWORD_EMPTY);
        }
        // 对比昵称和密码是否正确
        UserExample userExample = new UserExample();
        userExample.createCriteria().andPhoneEqualTo(userDTO.getPhone()).andPasswordEqualTo(userDTO.getPassword()).andRoleIdEqualTo(userDTO.getRoleId());
        List<User> userList = userMapper.selectByExample(userExample);
        if(userList == null || userList.size() != 1){
            return ResponseDTO.errorByMsg(CodeMsg.PHONE_PASSWORD_ERROR);
        }
        // 生成登录token并存入Redis中
        UserDTO selectedUserDTO = CopyUtil.copy(userList.get(0), UserDTO.class);
        String token = UuidUtil.getShortUuid();
        selectedUserDTO.setToken(token);
        //把token存入redis中 有效期1小时
        stringRedisTemplate.opsForValue().set("USER_" + token, JSON.toJSONString(selectedUserDTO), 3600, TimeUnit.SECONDS);
        return ResponseDTO.successByMsg(selectedUserDTO, "登录成功!");
    }

2.查询小区信息代码

	/**
     * 分页获取小区数据
     * @param pageDTO
     * @return
     */
    @Override
    public ResponseDTO<PageDTO<DistrictDTO>> getDistrictList(PageDTO<DistrictDTO> pageDTO) {
        DistrictExample districtExample = new DistrictExample();
        // 不知道当前页多少,默认为第一页
        if(pageDTO.getPage() == null){
            pageDTO.setPage(1);
        }
        // 不知道每页多少条记录,默认为每页5条记录
        if(pageDTO.getSize() == null){
            pageDTO.setSize(5);
        }
        DistrictExample.Criteria c1 = districtExample.createCriteria();
        if(pageDTO.getParam() != null) {
            DistrictDTO districtDTO = pageDTO.getParam();
            if(!CommonUtil.isEmpty(districtDTO.getName())) {
                c1.andNameLike("%" + districtDTO.getName() + "%");
            }
            if(!CommonUtil.isEmpty(districtDTO.getLocation())) {
                c1.andLocationLike("%" + districtDTO.getLocation() + "%");
            }
            if(!CommonUtil.isEmpty(districtDTO.getId())) {
                c1.andIdEqualTo(districtDTO.getId());
            }
        }
        PageHelper.startPage(pageDTO.getPage(), pageDTO.getSize());
        // 分页查出小区数据
        List<District> districtList = districtMapper.selectByExample(districtExample);
        PageInfo<District> pageInfo = new PageInfo<>(districtList);
        // 获取数据的总数
        pageDTO.setTotal(pageInfo.getTotal());
        // 将domain类型数据  转成 DTO类型数据
        List<DistrictDTO> districtDTOList = CopyUtil.copyList(districtList, DistrictDTO.class);
        for(DistrictDTO districtDTO : districtDTOList) {
            // 查询此小区的楼栋数
            BuildingExample buildingExample = new BuildingExample();
            buildingExample.createCriteria().andDistrictIdEqualTo(districtDTO.getId());
            List<Building> buildingList = buildingMapper.selectByExample(buildingExample);
            int buildingTotal = (int) buildingList.stream().map(Building::getName).distinct().count();
            districtDTO.setBuildingTotal(buildingTotal);
            // 查询此小区的房屋数
            List<String> buildingIdList = buildingList.stream().map(Building::getId).collect(Collectors.toList());
            if(buildingIdList.size() > 0) {
                HouseExample houseExample = new HouseExample();
                houseExample.createCriteria().andBuildingIdIn(buildingIdList);
                int houseTotal = houseMapper.selectByExample(houseExample).size();
                districtDTO.setHouseTotal(houseTotal);
            } else {
                districtDTO.setHouseTotal(0);
            }
            // 查询此小区的车位数
            ParkingExample parkingExample = new ParkingExample();
            parkingExample.createCriteria().andDistrictIdEqualTo(districtDTO.getId());
            districtDTO.setParkingTotal(parkingMapper.selectByExample(parkingExample).size());
        }
        pageDTO.setList(districtDTOList);
        return ResponseDTO.success(pageDTO);
    }

3.保存缴费信息代码

	/**
     * 保存缴费信息
     * @param feeDTO
     * @return
     */
    @Override
    public ResponseDTO<Boolean> saveFee(FeeDTO feeDTO) {
        // 进行统一表单验证
        CodeMsg validate = ValidateEntityUtil.validate(feeDTO);
        if (!validate.getCode().equals(CodeMsg.SUCCESS.getCode())) {
            return ResponseDTO.errorByMsg(validate);
        }
        Fee fee = CopyUtil.copy(feeDTO, Fee.class);
        User user = userMapper.selectByPrimaryKey(fee.getUserId());
        if(user == null) {
            return ResponseDTO.errorByMsg(CodeMsg.USER_NOT_EXIST);
        }
        // 准备创建xxl-job任务
        DefaultXxlJobAddParam defaultXxlJobAddParam = new DefaultXxlJobAddParam();
        defaultXxlJobAddParam.setAuthor("杨杨吖");
        defaultXxlJobAddParam.setJobDesc("缴费逾期罚金处理任务");
        defaultXxlJobAddParam.setExecutorHandler("feeHandler");
        Calendar calendar = Calendar.getInstance();
        if(fee.getDeadTime() != null) {
            calendar.setTime(fee.getDeadTime());
            int day = calendar.get(Calendar.DAY_OF_MONTH);
//            defaultXxlJobAddParam.setScheduleConf("0/0 0/0 0/0 " + day + "/1 * ?");
            defaultXxlJobAddParam.setScheduleConf("0/0 0/0 0/0 * * ?");
        }
        if(CommonUtil.isEmpty(fee.getId())) {
            // 添加操作
            fee.setId(UuidUtil.getShortUuid());
            fee.setCreateTime(new Date());
            if(fee.getDeadTime() != null) {
                defaultXxlJobAddParam.setExecutorParam(fee.getId());
                Integer taskId = xxlJobService.add(defaultXxlJobAddParam);
                xxlJobService.start(taskId);
                fee.setTaskId(String.valueOf(taskId));
            }
            if(feeMapper.insertSelective(fee) == 0) {
                return ResponseDTO.errorByMsg(CodeMsg.FEE_ADD_ERROR);
            }
        } else {
            // 修改操作
            Fee feeDB = feeMapper.selectByPrimaryKey(fee.getId());
            if(!FeeStateEnum.PAYED.getCode().equals(feeDB.getState()) && FeeStateEnum.PAYED.getCode().equals(fee.getState())) {
                fee.setPayTime(new Date());
                xxlJobService.remove(Integer.parseInt(feeDB.getTaskId()));
            }
            if(feeDB.getDeadTime().getTime() != fee.getDeadTime().getTime()) {
                defaultXxlJobAddParam.setExecutorParam(feeDB.getId());
                Integer taskId = xxlJobService.add(defaultXxlJobAddParam);
                xxlJobService.start(taskId);
                fee.setTaskId(String.valueOf(taskId));
            }
            if(feeMapper.updateByPrimaryKeySelective(fee) == 0) {
                return ResponseDTO.errorByMsg(CodeMsg.FEE_EDIT_ERROR);
            }
        }
        return ResponseDTO.successByMsg(true, "保存成功!");
    }

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

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

相关文章

安全生产管理系统——特殊作业管控

特殊作业环节面临事故多发、频发、死亡率高&#xff0c;如何做到有效管理是一大考验&#xff0c;进行系统全面的规整很有必要。安全生产管理系统中特殊作业管理通过整合资源和采用信息化技术对动火、受限空间、盲板抽堵、高处、吊装、临时用电、动土、断路等特殊作业全过程管理…

Hi3861 OpenHarmony嵌入式应用入门--基于HI-12F开发板烧写程序

首先需要一个开发板&#xff0c;我已经在嘉立创上进行了开源&#xff0c;基于安信可hi-12f模块的开发板&#xff0c;集成了两个按键&#xff0c;一个三色灯&#xff0c;一个滑动变阻器&#xff0c;可外接一个0.96寸液晶。 【HI-12F】基于安信可hi-12f模块的开发板 - 嘉立创EDA…

数据价值管理-数据使用标准

前情提要&#xff1a;数据价值管理是指通过一系列管理策略和技术手段&#xff0c;帮助企业把庞大的、无序的、低价值的数据资源转变为高价值密度的数据资产的过程&#xff0c;即数据治理和价值变现。第一讲介绍了业务架构设计的基本逻辑和思路。 前面我们讲完了数据资产建设标准…

pnpm run build报错throw new Error(‘Callback was already called.‘);

\node_modules\.pnpm\vuecli-service4.5.19_l3k57h4lccq2gytfrrziribsfe\node_modules\vue\cli-service\node_modules\neo-async\async.js:16throw new Error(Callback was already called.);解决&#xff1a;清除所有node_modules 我这里使用的命令pnpm run clean,可以根据自己…

东明第19届西瓜节背后的秘密

中共东明县委书记孙迁国致辞 6月16日&#xff0c;随着华灯初上&#xff0c;东明县小井镇沉浸在一片欢乐祥和的氛围中。备受瞩目的第十九届西瓜节在这里盛大开幕&#xff0c;数万观众汇聚一堂&#xff0c;共同见证了东明县以西瓜为纽带&#xff0c;连接传统与现代、文化与经济的…

安卓实现输入快递单号生成二维码,摄像头扫描快递单号生成的二维码,可以得到快递信息

背景&#xff1a; 1、实现二维码的生成和识别2、实现andriod&#xff08;或虚拟机&#xff09;部署&#xff0c;调用摄像头3、实现网络管理&#xff0c;包括数据库【取消】2、3可以组队实现&#xff0c;1必须单人实现 过程&#xff1a; 安卓APP主界面 输入快递单号信息&#…

成都爱尔林江院长建议近视防控从小做起,具体怎么做

预防近视应从小做起&#xff0c;知识储备多多益善。孩子如何做到近视防控&#xff1f; 成都爱尔眼科医院小儿眼科专家林江院长建议家长和孩子同时树立科学观念&#xff0c;让孩子拥有一个丰富多彩假期的同时强身健体也保护好眼睛。 不宅家、多户外 确保每天至少2个小时的户外…

可穿戴设备:苹果“吃老底”、华为“忙复苏”、小米“再扩容”

配图来自Canva可画 随着产品功能的创新&#xff0c;可穿戴设备不再被简单地视为手机的延伸&#xff0c;而是被当成一种独立的、具有独特功能和优势的产品&#xff0c;受到了越来越多人的青睐。 一方面&#xff0c;技术的进步使得可穿戴设备在功能、性能和使用体验上得到显著提…

打造工业操作系统开源开放体系

我国制造业具有细分行业、领域众多&#xff0c;产品丰富&#xff0c;制造模式多样等特点&#xff0c;围绕以工业操作系统为核心的工业软件赋能体系建设&#xff0c;离不开平台运营商、工业软件开发商、系统服务商、科研机构、工业企业等多方联合参与。聚众同行、聚力创新&#…

跳舞电动机器人单片机方案

这款机器人形状智能电子玩具是一款集娱乐、教育和互动于一身的高科技产品。它的主要功能包括&#xff1a; 1、智能对话&#xff1a;机器人可以进行简单的对话&#xff0c;回答用户的问题&#xff0c;提供有趣的互动体验。 2、前进、后退、左转、右转、滑行&#xff1a;机器人…

nuxt3+vue3+vite+TS实现国际化

前言 博主最近打算用Nuxt3重构了自己SSR博客&#xff0c;打算添加国际化功能&#xff0c;众所周知&#xff0c;实现国际化已是一个很常见的功能。用户可以根据自己的喜好&#xff0c;设置页面的自己合适的语言&#xff0c;从而实现国际化浏览。这样用户体验度会大大提升。博客…

Laravel 高级版:鲜为人知但实用的 Composer 命令

Composer 是 PHP 的首选依赖项管理器,如果您使用 Laravel,那么您已经熟悉常用的命令,例如composer install和composer update。 Composer 还提供了一些鲜为人知但在使用 Laravel 应用程序时很有用的命令。 以下是五个您可能不知道但很想使用的 Composer 命令。 1.composer …

Linux初识地址空间

前言 上一期我们对进程优先级、命令行参数以及环境和变量做了介绍&#xff01;以前我们就提到过一个问题有了运行队列为什么还要有优先级&#xff1f;本期将带你揭晓&#xff01; 本期内容介绍 虚拟地址空间的引入 虚拟地址空间的介绍 如何理解地址空间 为什么要有地址空间 如…

这些话术怎么我准备面试的时候没有刷到过!

“金三银四"过半&#xff0c;打算趁此转岗、跳槽的你还顺利吗...... 最近收到很多关于面试的咨询&#xff0c;小伙伴表示找工作真的太难了&#xff0c; 一个比一个卷&#xff0c;甚至到了怀疑自己的地步&#xff1a;自己是不是不够优秀&#xff1f; 有时候不是自己不够优…

一文入门gcc

今天我们来玩玩gcc。 是因为突然发现ESP-IDF用的是CMake&#xff0c;要了解CMake最好就要先学习Makefile有个基础&#xff0c;学习Makefile最好就要先熟悉gcc&#xff0c;所以就有了今天这篇文章。 首先我们要明确一个问题&#xff0c;那就是gcc/g是什么&#xff0c;它们有什…

IntelliJ IDEA 使用 Maven 时不加载本地私服的最新版本快照(snapshot)JAR 包

IntelliJ IDEA 使用 Maven 时不加载本地私服的最新版本快照&#xff08;snapshot&#xff09;JAR 包 目录 IntelliJ IDEA 使用 Maven 时不加载本地私服的最新版本快照&#xff08;snapshot&#xff09;JAR 包1. 检查 settings.xml2. IDEA Maven 配置3. 强制更新 Snapshot4. 使用…

解锁5G新营销:视频短信的优势与全方位推广策略

随着5G时代的全面来临&#xff0c;企业的数字化转型步伐日益加快&#xff0c;视频短信作为新兴的数字营销工具&#xff0c;正逐步展现出其巨大的潜力。视频短信群发以其独特的形式和内容&#xff0c;将图片、文字、视频、声音融为一体&#xff0c;为用户带来全新的直观感受&…

6月17号直播预告 | 认识XPCIE1032H控制卡以及单轴PSO视觉飞拍和精准输出知识分享

在智能装备领域&#xff0c;精度、效率和产能是关键的竞争力指标&#xff0c;大多数都面临备货排产要求高、需要调度协同生产和更高的加工精度等问题&#xff0c;特别是在3C电子、半导体设备、锂电光伏等高速高精制造领域。 运动控制系统的性能直接影响生产质量和效率&#xf…

Vue54-浏览器的本地存储webStorage

一、本地存储localStorage的作用 二、本地存储的代码实现 2-1、存储数据 注意&#xff1a; localStorage是window上的函数&#xff0c;所以&#xff0c;可以把window.localStorage直接写成localStorage&#xff08;直接调用&#xff01;&#xff09; 默认调了p.toString()方…

充电宝什么牌子耐用?2024年四大品牌推荐!这四款值得入!

在现代生活中&#xff0c;充电宝已经成为我们日常必备的数码配件之一。无论是旅行、出差还是日常通勤&#xff0c;拥有一款耐用且高效的充电宝&#xff0c;能够为我们的电子设备提供源源不断的电力支持。然而&#xff0c;市场上充电宝品牌众多&#xff0c;质量参差不齐&#xf…