畢業(yè)設(shè)計(jì) - 基于JAVA的小區(qū)/園區(qū)停車管理系統(tǒng)(簡便易上手

基于JAVA的小區(qū)停車管理系統(tǒng)畢業(yè)設(shè)計(jì)作品分享一下塔猾,希望能幫助到有需要的同學(xué)們妄均。

【背景/簡介】
基于JAVA的停車管理系統(tǒng)由車主用戶管理桑孩、車主資源管理竟坛、和車輛進(jìn)出記錄管理三大模塊組成闽巩,整體簡單實(shí)用,構(gòu)成了停車管理系統(tǒng)的核心功能担汤。本篇文章為大家展示基于JAVA實(shí)現(xiàn)的停車管理系統(tǒng)功能涎跨,有需者可參考。

【技術(shù)框架】
系統(tǒng)采用的技術(shù)是基于JAVA語言開發(fā)的后臺(tái)管理系統(tǒng)崭歧,前后端不分離隅很,數(shù)據(jù)庫采用mysql。技術(shù)棧如下:
一率碾、后端技術(shù):SpringBoot2.0 + Spring Data Jpa + Shiro
二叔营、前端技術(shù):Layui + thymeleaf

【核心開發(fā)】
一、數(shù)據(jù)庫設(shè)計(jì)
核心表包括車主用戶管理表所宰、車位資源表绒尊、車輛進(jìn)出記錄表,具體字段如下:

(1)車主用戶管理表(or_carOwner)

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String name;
    // 車牌號(hào)碼
    private String plateNumber;
    // 電話
    private String phone;
    // 創(chuàng)建時(shí)間
    @CreatedDate
    private Date createDate;
    // 數(shù)據(jù)狀態(tài)
    private Byte status = StatusEnum.OK.getCode();

(2)車位資源表(or_carPort)

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    // 車位編碼
    private String portNum;
    // 開放開始時(shí)間
    @DateTimeFormat(pattern="HH:mm:ss")
    @Temporal(TemporalType.TIME)
    private Date beginTime;
    // 開放結(jié)束時(shí)間,@Temporal這個(gè)注解是用來轉(zhuǎn)化mysql time類型的
    @DateTimeFormat(pattern="HH:mm:ss")
    @Temporal(TemporalType.TIME)
    private Date endTime;
    // 是否空余 0在用 1空余
    private Byte ifFree;
    // 當(dāng)前車主車牌
    private String carNum;
    // 創(chuàng)建時(shí)間
    @CreatedDate
    private Date createDate;
    // 數(shù)據(jù)狀態(tài)
    private Byte status = StatusEnum.OK.getCode();

(3)車輛進(jìn)出記錄表(or_carRecord)

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    // 車牌號(hào)碼
    private String plateNumber;
    // 車位編碼
    private String portNum;
    private String name;
    // 進(jìn)入時(shí)間
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date etherTime;
    // 離開時(shí)間
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date leaveTime;
    // 創(chuàng)建時(shí)間
    @CreatedDate
    private Date createDate;
    // 數(shù)據(jù)狀態(tài)
    private Byte status = StatusEnum.OK.getCode();

【功能展示】
一仔粥、車主用戶管理

二垒酬、車位資源管理


三、車輛進(jìn)出記錄


(1)車輛入庫管理件炉,當(dāng)車輛入庫時(shí)候勘究,記錄車牌號(hào)碼、車位編碼以及進(jìn)入時(shí)間斟冕。

車輛入庫出現(xiàn)以下情況則不能入庫成功:
A口糕、當(dāng)車輛已經(jīng)入庫,但尚未出庫時(shí)候磕蛇,如果繼續(xù)對(duì)該車輛入庫景描,會(huì)彈出提示“該車主目前已經(jīng)入庫停車中十办,不能重復(fù)添加入庫”。


B超棺、當(dāng)入庫時(shí)間大于當(dāng)前時(shí)間向族,也會(huì)進(jìn)行彈框提示


當(dāng)車牌號(hào)碼符合入庫條件時(shí)候,則保存成功棠绘,同時(shí)車位狀態(tài)變成在用件相,以及展示在用的車牌號(hào):



入庫核心代碼如下:

     /**
     * 保存進(jìn)入的數(shù)據(jù),車輛入庫
     */
    @PostMapping("/save")
    @ResponseBody
    public ResultVo save(@Validated CarRecordValid valid, CarRecord carRecord) throws Exception {
        if(carRecord.getEtherTime() == null){
            return ResultVoUtil.error("車輛入庫時(shí)間不能為空");
        }else if(carRecord.getEtherTime().after(new Date())){
            return ResultVoUtil.error("車輛入庫時(shí)間不能大于當(dāng)前時(shí)間");
        }

        //查詢車位的信息
        CarPort carPort = carPortService.getByPortNum(carRecord.getPortNum());

        //轉(zhuǎn)化為long格式氧苍,才能用compareTo()方法進(jìn)行比較,判斷車輛入庫時(shí)間不在車位的開放時(shí)間內(nèi)
        String timeNow = SimpleDateFormat.getTimeInstance(2).format(carRecord.getEtherTime());
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        Long timeNowNow= sdf.parse(timeNow).getTime();
        long startTime = carPort.getBeginTime().getTime();
        Long endTime= carPort.getEndTime().getTime();
        //當(dāng)前時(shí)間大于開始時(shí)間 小于結(jié)束時(shí)間
        if (!(timeNowNow.compareTo(endTime) < 0 && timeNowNow.compareTo(startTime) > 0)) {
            return ResultVoUtil.error("車庫開放時(shí)間在"+carPort.getBeginTime()+" - "+carPort.getEndTime());
        }

        //獲取該車牌號(hào)現(xiàn)有所有的記錄
        List<CarRecord> carRecordList = carRecordService.getAllByPlateNumberOrderById(carRecord.getPlateNumber());
        if(carRecordList.size() > 0){
            //判斷最近一條有沒有在入庫但還沒出庫的數(shù)據(jù)
            CarRecord newCarRecord = carRecordList.get(0);
            if(newCarRecord.getEtherTime() != null && newCarRecord.getLeaveTime() == null){
                return ResultVoUtil.error("該車主目前已經(jīng)在入庫停車中夜矗,不能重復(fù)添加入庫");
            }
            // 保存數(shù)據(jù)
            carRecordService.save(carRecord);

            //設(shè)置車位在用
            carPort.setIfFree((byte)0);//在用
            carPort.setCarNum(carRecord.getPlateNumber());//在用車牌
            carPortService.save(carPort);

            //查看用戶是否存在,不存在就增加
            CarOwner carOwner = carOwnerService.getByPlateNum(carRecord.getPlateNumber());
            if(carOwner == null){
                CarOwner owner = new CarOwner();
                owner.setPlateNumber(carRecord.getPlateNumber());
                owner.setName(carRecord.getPlateNumber()+"-車主");
                carOwnerService.save(owner);
            }
            return ResultVoUtil.SAVE_SUCCESS;
        }else {
            // 保存數(shù)據(jù)
            carRecordService.save(carRecord);

            //設(shè)置車位在用
            carPort.setIfFree((byte)0);//在用
            carPort.setCarNum(carRecord.getPlateNumber());//在用車牌
            carPortService.save(carPort);

            //查看用戶是否存在让虐,不存在就增加
            CarOwner carOwner = carOwnerService.getByPlateNum(carRecord.getPlateNumber());
            if(carOwner == null){
                CarOwner owner = new CarOwner();
                owner.setPlateNumber(carRecord.getPlateNumber());
                owner.setName(carRecord.getPlateNumber()+"-車主");
                carOwnerService.save(owner);
            }

            return ResultVoUtil.SAVE_SUCCESS;
        }
    }

(2)車輛出庫管理紊撕,當(dāng)車輛出庫時(shí)候,記錄車牌號(hào)碼赡突、車位編碼以及離開時(shí)間对扶。

車輛出庫出現(xiàn)以下情況則不能出庫成功:
A、當(dāng)車輛尚未有最新入庫操作惭缰,如果繼續(xù)對(duì)該車輛出庫浪南,會(huì)彈出提示“該車主沒有最新入庫停車操作,不能做出庫操作”从媚。


B逞泄、當(dāng)出庫的車位選擇錯(cuò)誤時(shí)候患整,會(huì)做對(duì)應(yīng)的提示“該車主入庫的車位為xxx拜效,與出庫的車位跟不一致,請(qǐng)重新選擇車位”:


當(dāng)出庫成功后各谚,車位對(duì)應(yīng)就會(huì)變成空閑:


出庫核心代碼如下:

    /**
     * 保存離開記錄,車輛出庫
     */
    @PostMapping("/saveLeaveRecond")
    @ResponseBody
    public ResultVo saveLeaveRecond(@Validated CarRecordValid valid, CarRecord carRecord) {
        if(carRecord.getLeaveTime() == null){
            return ResultVoUtil.error("車輛出庫時(shí)間不能為空");
        }

        //獲取該車牌號(hào)現(xiàn)有所有的記錄
        List<CarRecord> carRecordList = carRecordService.getAllByPlateNumberOrderById(carRecord.getPlateNumber());
        if(carRecordList.size() > 0){
            //判斷最近一條有沒有在入庫但還沒出庫的數(shù)據(jù)
            CarRecord newCarRecord = carRecordList.get(0);
            if(newCarRecord.getEtherTime() != null && newCarRecord.getLeaveTime() != null){
                return ResultVoUtil.error("該車主沒有最新入庫停車操作紧憾,不能做出庫操作");
            }else if(!newCarRecord.getPortNum().equals(carRecord.getPortNum())){
                return ResultVoUtil.error("該車主入庫的車位為"+newCarRecord.getPortNum()+",與出庫的車位跟不一致昌渤,請(qǐng)重新選擇車位");
            }else if(carRecord.getLeaveTime().before(newCarRecord.getEtherTime())){
                return ResultVoUtil.error("車輛出庫時(shí)間不能小于入庫時(shí)間");
            }
            // 保存數(shù)據(jù)
            carRecord.setEtherTime(newCarRecord.getEtherTime());
            carRecord.setId(newCarRecord.getId());
            carRecord.setCreateDate(newCarRecord.getCreateDate());
            carRecord.setUpdateDate(new Date());
            carRecordService.save(carRecord);

            //設(shè)置車位在用
            CarPort carPort = carPortService.getByPortNum(carRecord.getPortNum());
            carPort.setIfFree((byte)1);//空余
            carPort.setCarNum(null);//在用車牌
            carPortService.save(carPort);

            return ResultVoUtil.SAVE_SUCCESS;
        }else {
            return ResultVoUtil.error("該車主沒有最新入庫停車操作赴穗,不能做出庫操作");
        }
    }

【總結(jié)】
小區(qū)停車管理系統(tǒng)主要是圍繞車輛入庫和出庫兩個(gè)核心功能進(jìn)行拓展,并進(jìn)行一系列的校驗(yàn)控制膀息,上手容易般眉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市潜支,隨后出現(xiàn)的幾起案子甸赃,更是在濱河造成了極大的恐慌,老刑警劉巖冗酿,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埠对,死亡現(xiàn)場離奇詭異络断,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)项玛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門貌笨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人襟沮,你說我怎么就攤上這事锥惋。” “怎么了臣嚣?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵净刮,是天一觀的道長。 經(jīng)常有香客問我硅则,道長淹父,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任怎虫,我火速辦了婚禮暑认,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘大审。我一直安慰自己蘸际,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布徒扶。 她就那樣靜靜地躺著粮彤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姜骡。 梳的紋絲不亂的頭發(fā)上导坟,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音圈澈,去河邊找鬼惫周。 笑死,一個(gè)胖子當(dāng)著我的面吹牛康栈,可吹牛的內(nèi)容都是我干的递递。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼啥么,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼登舞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悬荣,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤菠秒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后隅熙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稽煤,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡核芽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酵熙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧简。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匾二,靈堂內(nèi)的尸體忽然破棺而出哮独,到底是詐尸還是另有隱情,我是刑警寧澤察藐,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布皮璧,位于F島的核電站,受9級(jí)特大地震影響分飞,放射性物質(zhì)發(fā)生泄漏悴务。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一譬猫、第九天 我趴在偏房一處隱蔽的房頂上張望讯檐。 院中可真熱鬧,春花似錦染服、人聲如沸别洪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挖垛。三九已至,卻和暖如春秉颗,著一層夾襖步出監(jiān)牢的瞬間痢毒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工站宗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闸准,地道東北人益愈。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓梢灭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒸其。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敏释,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容