项目编号:BS-XX-148
前言:
中国汽车工业的发展以及人各城市汽车爆发式增长的态势,也让人们对停车场及其附属的相关设施给人们的生活及出行的便利要求也不断提高。停车场信息管理系统从用户的安全、可靠、高效、实用、智能、便利等方面的指导思想来进行设计,采用相关技术和编程语言来实现本系统的运行与维护。为实现本系统的稳定、高效的运行,我们需要做不定期的维护与更新,要跟得上软件科技的跟新速度。本系统致力于软件的设计,对于系统怎么与停车场车辆进出的信息进行联系,现在暂不说明,例如:通过红外线射频器进行扫描车辆车牌照进行进出等情况暂不提供技术支持。
传统停车场信息管理系统[1]存在收费过程太过依赖于人力,造成了许多不可避免的麻烦,还存在停车场车位利用率低下、管理漏洞、耗费大量人力物力等问题,本系统采用了线上交易的方式,按照计时计费进行管理,使用方便,收费清晰,减少了许多不必要的人力劳动,提高系统的可靠性、安全性、便捷性的同时也提高了操作者的工作效率[2]。减少停车场工作人员的使用压力,使管理者管理流程更加简单,清晰,明了。
一,项目简介
本系统基于 SpringBoot + Vue 的智能停车场项目,它不同于别的普通的停车管理系统,一般的停车管理系统都人工操作填写停车出入信息,较为繁琐,效率低下,容易出错,不易控制,而本系统主要模拟实现智能无人值守停车场的功能,自动识别车牌,自动检测出入时间并自动计算费用在线付费后开闸放行。利用工业物联网级消息通讯组件MQTT来进行硬件通知(模拟)开闸放闸。本系统是一个通知的停车场管理平台,为合作的停车场商户提供统一的管理服务。主要实现的功能如下所示:
- 系统管理:角色管理、系统菜单、全局配置
- 账号管理:用户管理、合作单位
- 系统监控:日志监控
- 财务管理:订单列表
- 停车记录:停车记录
- 车辆管理:车辆管理
- 车牌识别:车牌识别
- 停车场管理:停车场管理
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:Springboot+JPA
前台开发技术:Vue+ElementUI
其它:百度人脸识别、车牌识别解析
三,系统展示
用户登陆
首页统计功能
停车场管理
车牌识别:左边为摄相头对准汽车,右边为解析的车牌,会自动生成入场入出场记录
汽车管理:主要是添加长期租车位的用户,进停不收停车费
停车记录:自动生成,根据车牌解析来自动生成停车记录
角色管理:可为角色分配相应的权限
菜单管理:也就是权限管理,可以具体到按钮级别
统计管理
新增时指定统计查询SQL语句
订单列表:查询用户支付记录
用户管理
合作公司管理
系统日志
四,核心代码
package com.smart.module.sys.web; import com.smart.common.model.Result; import com.smart.module.sys.entity.SysConfig; import com.smart.module.sys.service.SysConfigService; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 参数设置 * * @author znz */ @RestController @RequestMapping("/sys/config") public class ConfigController { @Autowired private SysConfigService sysConfigService; /** * 参数列表 */ @PostMapping("/list") public Result list(SysConfig config){ return sysConfigService.list(config); } /** * 获取 */ @PostMapping("/get") public Result get(Long id){ return sysConfigService.get(id); } /** * 保存 */ @PostMapping("/save") @RequiresRoles("admin") public Result save(@RequestBody SysConfig config){ return sysConfigService.save(config); } /** * 删除 */ @PostMapping("/delete") @RequiresRoles("admin") public Result delete(Long id){ return sysConfigService.delete(id); } }
package com.smart.module.finance.web; import com.smart.common.model.Result; import com.smart.common.util.ExcelExport; import com.smart.module.finance.entity.Order; import com.smart.module.finance.service.OrderService; import org.apache.shiro.authz.annotation.Logical; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.text.SimpleDateFormat; import java.util.Date; @RestController @RequestMapping("/finance/order") public class OrderController { @Autowired private OrderService orderService; /** * 列表 */ @PostMapping("list") public Result list(Order entity){ return orderService.list(entity); } /** * 导出 */ @PostMapping("export") @RequiresRoles(value={"admin","orgAdmin"},logical = Logical.OR) public void export(Long orgId, Long parkManageId, HttpServletRequest request, HttpServletResponse response){ try{ ExcelExport excelExport = orderService.exportData(orgId,parkManageId); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); excelExport.writeTemplate(response, request, "订单信息-" + sdf.format(new Date()) + ".xls"); }catch (Exception e){ e.printStackTrace(); } } }
package com.smart.module.car.web; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; import com.smart.common.constant.SystemConstant; import com.smart.common.model.Result; import com.smart.common.util.CommonUtils; import com.smart.common.util.DateUtils; import com.smart.common.util.OrderUtils; import com.smart.module.car.entity.CarManage; import com.smart.module.car.entity.CarParkManage; import com.smart.module.car.entity.CarParkingRecord; import com.smart.module.car.repository.CarParkingRecordRepository; import com.smart.module.car.repository.ParkManageRepository; import com.smart.module.car.service.CarManageService; import com.smart.module.car.service.CarParkingRecordService; import com.smart.module.car.util.BaiDuUtils; import com.smart.module.car.util.CostUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.HashMap; import java.util.Map; /** * 接口管理 */ @RestController @RequestMapping("/api") public class ApiController { @Value("${file.path}") private String filePath; @Autowired private BaiDuUtils baiDuUtils; @Autowired private ParkManageRepository parkManageRepository; @Autowired private CarManageService carManageService; @Autowired private CarParkingRecordRepository carParkingRecordRepository; @Autowired private CarParkingRecordService carParkingRecordService; /** * 识别车牌 */ @RequestMapping("distinguish") public Result distinguish(MultipartFile file, Long id) { try { if(file!=null){ CarParkManage carParkManage = parkManageRepository.findById(id).orElse(new CarParkManage()); if(id==null||carParkManage==null){ return Result.error("请选择停车场"); } File parentFile = CommonUtils.createParentFile(filePath); String fileName = file.getOriginalFilename(); String suffix = fileName.substring(fileName.lastIndexOf(".")); String uuid = IdUtil.simpleUUID(); fileName = uuid + suffix; File imageFile = new File(parentFile,fileName); FileUtil.writeFromStream(file.getInputStream(), imageFile); String fileDay = DateUtil.thisYear()+"/"+(DateUtil.thisMonth()+1)+"/"+DateUtil.thisDayOfMonth(); String imagePath = SystemConstant.FILE + "/" + fileDay+"/"+fileName; String plateNumber = baiDuUtils.plateLicense(imageFile.getAbsolutePath()); if(StringUtils.isBlank(plateNumber)){ return Result.error("识别失败"); } Map<String, Object> map = new HashMap<>(); map.put("plateNumber",plateNumber); map.put("imagePath",imagePath); CarParkingRecord record = carParkingRecordService.getByPlateNumber(plateNumber,id); /** * 出厂 */ CarManage carManage = carManageService.getByPlateNumber(plateNumber,id); if(record!=null){ record.setCost(CostUtils.calculate(record,carParkManage)); record.setGmtOut(DateUtils.getTimestamp()); map.put("msg","出厂成功"); /** * 如果是临时车生成支付订单 */ if(carManage.getType().shortValue() == SystemConstant.CAR_TYPE_TEMP){ String orderNo = record.getOrderNo(); System.out.println("生成订单,并返回二维码"+orderNo); } }else{ record = new CarParkingRecord(); record.setOrgId(carParkManage.getOrgId()); record.setOrgName(carParkManage.getOrgName()); record.setParkManageId(carParkManage.getId()); record.setParkManageName(carParkManage.getName()); record.setGmtInto(DateUtils.getTimestamp()); record.setPlateNumber(plateNumber); if(carManage!=null){ record.setType(carManage.getType()); record.setOrderNo(""); }else{ record.setOrderNo(OrderUtils.getOrderNo(id)); record.setType(SystemConstant.CAR_TYPE_TEMP); } map.put("msg","进厂成功"); } carParkingRecordRepository.saveAndFlush(record); return Result.ok(map); }else{ return Result.error(); } } catch (Exception e) { e.printStackTrace(); return Result.error(); } } /** * 支付回调 */ @RequestMapping("/callBack") public String callBack() { /** * 生成订单、调用支付接口 */ return ""; } }
package com.smart.module.car.web; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; import com.smart.common.constant.SystemConstant; import com.smart.common.model.Result; import com.smart.common.util.CommonUtils; import com.smart.common.util.DateUtils; import com.smart.module.car.entity.CarManage; import com.smart.module.car.entity.CarParkManage; import com.smart.module.car.entity.CarParkingRecord; import com.smart.module.car.repository.CarParkingRecordRepository; import com.smart.module.car.repository.ParkManageRepository; import com.smart.module.car.service.CarManageService; import com.smart.module.car.service.CarParkingRecordService; import com.smart.module.car.util.BaiDuUtils; import com.smart.module.car.util.CostUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/car/distinguish") public class DistinguishController { @Value("${file.path}") private String filePath; @Autowired private BaiDuUtils baiDuUtils; @Autowired private ParkManageRepository parkManageRepository; @Autowired private CarManageService carManageService; @Autowired private CarParkingRecordRepository carParkingRecordRepository; @Autowired private CarParkingRecordService carParkingRecordService; /** * 演示上传 */ @RequestMapping("upload") public Result upload(MultipartFile file,Long id) { try { if(file!=null){ CarParkManage carParkManage = parkManageRepository.findById(id).orElse(new CarParkManage()); if(id==null||carParkManage==null){ return Result.error("请选择停车场"); } File parentFile = CommonUtils.createParentFile(filePath); String fileName = file.getOriginalFilename(); String suffix = fileName.substring(fileName.lastIndexOf(".")); String uuid = IdUtil.simpleUUID(); fileName = uuid + suffix; File imageFile = new File(parentFile,fileName); FileUtil.writeFromStream(file.getInputStream(), imageFile); String fileDay = DateUtil.thisYear()+"/"+(DateUtil.thisMonth()+1)+"/"+DateUtil.thisDayOfMonth(); String imagePath = SystemConstant.FILE + "/" + fileDay+"/"+fileName; String plateNumber = baiDuUtils.plateLicense(imageFile.getAbsolutePath()); if(StringUtils.isBlank(plateNumber)){ return Result.error("识别失败"); } Map<String, Object> map = new HashMap<>(); map.put("plateNumber",plateNumber); map.put("imagePath",imagePath); CarParkingRecord record = carParkingRecordService.getByPlateNumber(plateNumber,id); /** * 出厂 */ if(record!=null){ record.setCost(CostUtils.calculate(record,carParkManage)); record.setGmtOut(DateUtils.getTimestamp()); map.put("msg","出厂成功"); }else{ record = new CarParkingRecord(); record.setOrgId(carParkManage.getOrgId()); record.setOrgName(carParkManage.getOrgName()); record.setParkManageId(carParkManage.getId()); record.setParkManageName(carParkManage.getName()); record.setGmtInto(DateUtils.getTimestamp()); record.setPlateNumber(plateNumber); CarManage carManage = carManageService.getByPlateNumber(plateNumber,id); if(carManage!=null){ record.setType(carManage.getType()); }else{ record.setType(SystemConstant.CAR_TYPE_TEMP); } map.put("msg","进厂成功"); } carParkingRecordService.save(record); return Result.ok(map); }else{ return Result.error(); } } catch (Exception e) { e.printStackTrace(); return Result.error(); } } }
五,项目总结
传统停车场在管理及便利方面满足不了日益繁忙和不断发展的人们的需求。方便、快捷、高效、智能的停车场信息管理系统能够满足人们的需求和发展。以免造成财产、时间等不必要的浪费。以提高人们出行效率,缓解道路出行压力。
传统的停车场信息管理系统,与现代智能技术相比而言存在着大量的不足。例如,人力停车场如果进行管理的话,将会因为收费,找零等问题而耽误时间,这对于忙于事业和做活的工人来说,是非常耽误时间和金钱的。同时也因为一点点小麻烦伤了邻里之间的和气,非常划不来。尤其在早上七点到九点的时候和下午五点到七点之间,道路上车流量大,汽车、公交车、自行车、路人,这些种种因素给人们出行有了许多的障碍,本系统可以预约车位,帮助车主寻找停放车辆的地方,节省大家时间。同时本系统还包括车位,时间,费用等,方便用户的同时也确保了用户的信息安全,更加方便,快捷。
随着现代技术的飞速发展,在人们出行的时候,从以前的畜牧拉车、人力车、自行车到现在的电动车、汽车、电动汽车随处可见。所以将科技代替人力已经成为最普遍的现象。这就是我做这个系统的主要目的,运用现代化技术改变传统停车场已有的弊端,来实现人们出行的便利[3]。