基于Springboot+Vue实现智能停车场管理系统

简介: 基于Springboot+Vue实现智能停车场管理系统

项目编号:BS-XX-148

前言:


中国汽车工业的发展以及人各城市汽车爆发式增长的态势,也让人们对停车场及其附属的相关设施给人们的生活及出行的便利要求也不断提高。停车场信息管理系统从用户的安全、可靠、高效、实用、智能、便利等方面的指导思想来进行设计,采用相关技术和编程语言来实现本系统的运行与维护。为实现本系统的稳定、高效的运行,我们需要做不定期的维护与更新,要跟得上软件科技的跟新速度。本系统致力于软件的设计,对于系统怎么与停车场车辆进出的信息进行联系,现在暂不说明,例如:通过红外线射频器进行扫描车辆车牌照进行进出等情况暂不提供技术支持。


传统停车场信息管理系统[1]存在收费过程太过依赖于人力,造成了许多不可避免的麻烦,还存在停车场车位利用率低下、管理漏洞、耗费大量人力物力等问题,本系统采用了线上交易的方式,按照计时计费进行管理,使用方便,收费清晰,减少了许多不必要的人力劳动,提高系统的可靠性、安全性、便捷性的同时也提高了操作者的工作效率[2]。减少停车场工作人员的使用压力,使管理者管理流程更加简单,清晰,明了。

一,项目简介


本系统基于 SpringBoot + Vue 的智能停车场项目,它不同于别的普通的停车管理系统,一般的停车管理系统都人工操作填写停车出入信息,较为繁琐,效率低下,容易出错,不易控制,而本系统主要模拟实现智能无人值守停车场的功能,自动识别车牌,自动检测出入时间并自动计算费用在线付费后开闸放行。利用工业物联网级消息通讯组件MQTT来进行硬件通知(模拟)开闸放闸。本系统是一个通知的停车场管理平台,为合作的停车场商户提供统一的管理服务。主要实现的功能如下所示:


- 系统管理:角色管理、系统菜单、全局配置


- 账号管理:用户管理、合作单位


- 系统监控:日志监控


- 财务管理:订单列表


- 停车记录:停车记录


- 车辆管理:车辆管理


- 车牌识别:车牌识别


- 停车场管理:停车场管理

二,环境介绍


语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+JPA

前台开发技术:Vue+ElementUI

其它:百度人脸识别、车牌识别解析

三,系统展示


用户登陆

image.png

首页统计功能

image.png

停车场管理

image.png

车牌识别:左边为摄相头对准汽车,右边为解析的车牌,会自动生成入场入出场记录

image.png

汽车管理:主要是添加长期租车位的用户,进停不收停车费

image.png

停车记录:自动生成,根据车牌解析来自动生成停车记录

image.png

角色管理:可为角色分配相应的权限

image.png

image.png

菜单管理:也就是权限管理,可以具体到按钮级别

image.png

统计管理

image.png

新增时指定统计查询SQL语句

image.png

订单列表:查询用户支付记录

image.png

用户管理

image.png

合作公司管理

image.png

系统日志

image.png

四,核心代码


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.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]。

相关文章
|
22天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
107 13
|
30天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
351 1
|
2月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
53 0
|
JavaScript Java 关系型数据库
Springboot+vue打包部署到线上服务器
整合springboot+vue的项目,打包成jar包到线上服务器运行
Springboot+vue打包部署到线上服务器
|
6天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
51 1
|
17天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
48 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
34 1
|
2月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
40 1
vue学习第四章