社区物业管理系统复盘

前言

这是对基于SpringBoot+Layui社区物业管理系统业务逻辑的复盘

正文内容

用代码生成器生成脚手架

一、基础信息管理部分

1.1、楼宇管理

楼宇管理主要就是显示出多少栋,多少单元,只需要building表中的属性,CRUD即可
dao层:查询所有楼宇queryBuildAll,参数numbers可以根据楼号进行查询,xml进行实现,sql语句也很简单
service层:写一个分页查询所有楼宇的方法findBuildAll,实现类就调用dao层的queryBuildAll,然后new PageInfo<>(list)作为返回,这个在图书管理都经常写,简单。
controller层:调用service中方法findBuildAll,返回JsonObject类,类中包含code,msg,count,data四个属性,这是返回一个json对象给前端,code是成功或失败代码,msg是成功或失败信息,count是总数量,data是数据,类型是泛型T,这样的话用户表就是用户数据,学生表就是学生数据。
前端页面:到layuimini官网下载模板,layuimini是基于layui的后端管理系统前端模板,下载后进行修改,这个也可以参考一下博客中图书管理系统,修改主要修改url,cols中显示的字段,图书管理用到了jsp,这里不用jsp,也就是进行解耦,前端就是纯前端,增删改都做了一个封装,封装成base.js,因为增删改基本都是一样的,就是url,content不同,调用的时候传这些参数即可。还有修改功能以前jsp都是后端先查找对象,然后将对象放到作用域中,以便前端获取,这里不用jsp了,用渲染form数据的方式,实现点击修改后,就会跳出有数据的form表单,就不需要${},这种EL表达式实现。

1.2、房屋管理

同楼宇管理,略

1.3、业主管理

实体类:实体类中除了本身的属性以外还需要一个house对象,因为显示的时候需要知道业主的房子是哪个也就是房屋编号是多少,如1-401,就是1单元401。
dao层:dao层就是先写一个查询所有业主的方法queryOwnerAll,因为加入了另外一个表,我们就需要在xml实现的时候,用resultMap并继承BaseResultMap,使得业主中包含house中的id和numbers属性。
service层、controller层:和之前一样写分页查询所有记录即可,这个已经写过很多遍了
前端页面:和之前一样增删改,房屋编号在cols数组中以下面形式添加

{templet:'<div>{{d.house.numbers}}</div>',width: 100, title: '房屋编号'}
1.4、车位管理

实体类:车位管理显示的记录应该有车位号,车位是哪个业主的,即有业主姓名和业主联系电话,这就说明车位Park实体类中除了本身的属性以外,还要一个Owner业主对象
dao层、service层、controller层:这三层跟之前一样常规写查询所有即可,都是重复操作
前端页面:改动url地址,以及在cols中以templet:方式添加业主姓名和业主电话,车位的状态1表示使用,0表示未使用,可以用一个function写,如下,以前图书管理也常见这个状态未借出和已借出,还有还书类型,有正常还书、延迟还书、破损还书、丢失还书等,都是这种形式

{field: 'status', width: 80, title: '状态',
    templet:function(res){
        if(res.status=='1'){
            return '<span class="layui-badge layui-bg-green">使用</span>';
        }else{
            return '<span class="layui-badge layui-bg-orange">未使用</span>';
        }
    }},
1.5、抄表管理(难点)

抄表管理是一个重难点,我们来好好理一理
实体类:实体类,这里用另一种方式引入其他表属性,新建一个实体类RecordVo,然后继承以前的Records
dao层:先写一个查询所有抄表记录的方法queryRecordsAll,以及其实现,重点是它的xml文件中的sql

   SELECT rec.*,hou.numbers,own.username,type.`name` as typename
   FROM records rec
   LEFT JOIN property_type type ON type.id = rec.type_id
   LEFT JOIN house hou ON hou.id = rec.house_id
   LEFT JOIN OWNER own ON own.house_id = hou.id

因为records抄表本省有type_id(费用类型:水费,电费还是其他),还有house_id,所以前端需要显示的门牌号,户主姓名(业主),费用类型都可以通过type_id和house_id这两个外键进行与owner表和house表连接,从而获取到hou.numbers(门牌号),业主姓名和费用类型
service层:该层正常写查询所有即可,分页查询
controller层:查询所有正常写,和之前一样操作。注意这里只要添加和删除,抄表的信息不能修改,添加叫抄表登记,我们暂且还叫添加,添加和删除过程还是相对之前内容,业务逻辑更加复杂了。先来说说添加(抄表登记),抄表登记分两步:1、添加抄表记录信息 2、添加物业收费信息 ,也就是涉及两个表。首先由于我们需要根据记录中的房子和类型查询上次抄表的度数以及相关时间信息,所以需要从dao层开始,加上方法queryByHouIdAndTypeId,倒序排列,第一个就是最后一次登记信息。查到的登记信息若非空,则获取上次的度数以及上次抄表时间,把ontime和num2更为上次度数,为空则说明没抄表过,所以上次度数做一个初始化0。然后checkTime设置当前时间,当前时间也就是checkTime。添加收费物业信息,物业信息先获取到houId,typeId,将缴费状态设置为未缴费,若抄表记录上次抄表时间为0,则ontime作为startDate,不为空则将uptime作为startDate。enddate设置为本次最新登记的时间,即ontime。下面就是计算费用类型的费用,先通过id查询到费用类型,然后获取收费标准,用(num2-num)*price就是费用,num2-num是一段时间内用的度数。money算出来后,setMoney到物业信息中,remarks同时也set,这样property_info表中所有属性都set赋值了。删除:既然添加需要涉及两个表,records和property_info,删除首先要通过id查询到需要删除的records,然后通过records获取到houseId,再获取到本次时间ontime,最后records和property_info分别调用删除方法。property_info调用的删除方法deleteInfoByHouIdAndTime需要到dao层依次实现,因为如果仅仅按照houId删除的话,有很多相同的houId会被一起删除,所以加一个参数ontime这样就唯一了。
前端页面:费用类型下拉框显示物业费,水费,电费,车位费这些,和图书馆里的一样动态获取费用类型数据,并渲染数据到select标签。其他都是以前常做的,复制之前的修改即可

$.get("findAllList",{},function (data) {
    var list=data;
    var select=document.getElementById("typeId");
    if(list!=null|| list.size()>0){
        for(var obj in list){
            var option=document.createElement("option");
            option.setAttribute("value",list[obj].id);
            option.innerText=list[obj].name;
            select.appendChild(option);
        }
    }
    form.render('select');
},"json")
1.6、管理员管理

dao层:dao层由于涉及修改密码,所以需要有一个查询账号密码的方法queryUserByNameAndPwd
service层:正常调用即可
controller层:这里修改密码需要通过id查询到userinfo,然后判断输入的旧密码和用户的密码是否相等,相等表示输入正确,然后就可以执行新密码更新
前端页面:都是写过的,复制修改即可

二、核心业务处理模块

2.1、车位收费管理

实体类:车位收费实体类还要加入两个属性,owner和parking,即需要知道哪个车位要收费,即车位号是多少,以及这个车位的车主叫什么
dao层,service层:正常写
controller层:这里查询,新增和更新需要说一说,先说查询,查询分为业主的和管理的,管理需要看到车位号,所以需要set一个numbers,而业主就只能看到自己,所以首先通过用户名查询到业主,然后获取到业主id,车位收费中set(业主id),这样业主就只能看到自己的车位信息,而不能看到其他的车主。这里初始化数据是添加一种,就是已经在使用的车位过了几个月又要缴费了,就直接初始化数据,queryParkingByStatus先查询到状态为1,也就是正在使用车位,并且该车位业主不为空,查到需要初始化的车位列表,遍历初始化。这样已经缴费的,到新的时间段初始化一下,就又需要缴费。更新操作就是缴费操作,只要将缴费状态改为1即可,setId是为了找到哪个需要更改。
前端页面:复制修改即可,之前做过很多次了。

2.2、物业收费管理

实体类:都是本身的属性
dao层:一个查询所有记录的方法,根据登记时间和房子id删除当前记录信息
service层:service层中需要将日期格式转化成日期对应的字符串类型,也就是删除的参数ontime是string
controller层:这个和车位收费管理类似,分为业主查询所有记录和管理员,管理员可能通过房屋号查询,房屋号不为空,就是特定的查询,房屋好为空就是查询所有,也就是默认的情况。业主就只能查询到自己的房屋收费情况,先通过名字获取到houId,再查询这个houId的信息。初始化操作就是跟车位收费一样,将已经存在的车主,缴新的阶段的费用,计算费用,然后设置id表示哪些需要缴费了,状态改为未缴费状态0,再进行添加,这样就是最新阶段需要缴费。更新操作就是缴费,点击缴费,成功后就会变为已缴费,也就是将status设置为1
前端页面:这里主要讲一个这里独有的一个功能,也就是打印票据,打印票据在前端触发的事件是print,打印票据必须是同一个用户,并且是缴费状态,符合条件,就进行数据渲染,这里打印票据其实就是往表格里渲染数据,金额、用户、时间,新弹出的界面就是html写的一个表格,然后用js的方法往里面填数据,也就是数据渲染,点击打印后可以保存成pdf,也可以打印,这个了解即可

2.3、投诉信息管理

略,就只要写个查询所有记录,没啥特别的,写了很多遍了

2.4、报修信息管理

略,一样的没啥特别的,就写个查询所有,统计报修是属于统计部分,统计简单说下,主要是到ECharts官网找到需要的图,数据传到data中,改成data需要的格式,repairMapper中写统计的方法以及实现,service和controller都直接调用即可。

三、登录部分

登录分为登录和退出,登录的LoginController中,首先创建一个HashMap,用于存键值,包括状态码,信息msg,登录时首先通过queryUserByNameAndPwd()方法到userinfo表中查询,输入的账号密码是否存在,若存在则将user对象保存至session中(session.attribute)。不存在则提示用户名或密码错。退出功能就是将session注销,即session.invalidate()。然后重定向跳转到登录页面。登录成功后,还需要配置拦截器,在com.yx包下新建一个interceptor包,一个配置类,一个拦截类。配置类中实现WebMvcConfigurer,配置拦截与不拦截信息。拦截类中,在preHandle方法中通过判断session中是否有user,进而决定放不放行。preHandle请求之前进行得调用

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小样x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值