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


    一、项目演示

    项目演示地址: 视频地址

    二、项目介绍

    项目描述:这是一个基于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, "保存成功!");
        }
    
  • 相关阅读:
    算法金 | DL 骚操作扫盲,神经网络设计与选择、参数初始化与优化、学习率调整与正则化、Loss Function、Bad Gradient
    《倍增商业成功宝典》全新升级上线!炙夏新品,久等终至!
    shell编程之循环
    SpringCloud的nacos多项目、多环境的命名空间和分组配置
    Jupyter Nbextensions插件
    拼多多商品详情api接口
    【开篇】汇编语言之基础知识篇
    CADD课程学习(6)-- 获得已有的虚拟化合物库(Drugbank、ZINC)
    千钧一发之际赢得暂缓令,苹果App Store要反败为胜了?
    仿真1. 什么是仿真系统
  • 原文地址:https://blog.csdn.net/dgfdhgghd/article/details/139725773