文章目录
- 一、项目演示
- 二、项目介绍
- 三、运行截图
- 四、主要代码
- 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, "保存成功!");
}