EasyPark共享停車位的設計與實現

 

EasyPark共享停車位的設計與實現

 

江宏暉

 

         EasyPark這個項目是我在大學學習Java期間自主設計並編寫的一個項目。項目前端的界面佈局均由我自主設計,但是前端頁面實現部分,請求了實驗室裏兄弟姐妹的幫助,非常感謝他們。首先我想先向各位大牛小牛們交流一下我萌生這個作品的理由。

        “停車”成爲了很多車主面臨的一個難題,我此次將開發的APP將在實現共享停車的基礎上,增加各類停車策略以實現各類空閒車位資源的合理分配,利用網絡技術,建立客戶集羣,通過“用戶-系統-車位”的溝通機制,採用共享經濟的模式,儘可能有效地緩解“停車難”問題,併爲社會帶來良好的經濟效益。

         在系統開發的前期,我曾經想過許多種停車場的經營模式,也結合了當時自己的能力,最後才設計出了EasyPark的模型:

用戶在註冊之後進行登錄,並同時獲得租戶和戶主兩種身份,本系統採用兩種車位租賃形式,爲即時租位和預約租位。

即時租位模式:戶主即時發佈己有車位,登記相關地理位置信息、截止時間以及每小時單價。租客在所處位置即時搜尋附近空餘即時車位,選擇車位按下“租賃”按鈕的同時APP記錄停車時間並更改車位狀態爲“已租出”,在截止時間前按下“結束停車”按鈕,APP更改車位狀態爲“未租出”並計算停車時間以及費用,扣除租客餘額添加至戶主賬戶中。

預約租位模式:戶主以預約形式發佈己有車位,登記相關地理位置信息、車位空閒起始時間、車位空閒截止時間以及期間總價格。租客選擇停車目的地位置以及預約車位使用時間段,即可搜索出符合地點及時間段的空閒預約車位,直接點擊租賃,APP將車位信息更改爲“已租出”狀態,扣除租客相對應的停車費添加到戶主賬戶中。

         實現過程中較爲困難的兩個模塊當屬數據庫建立以及查詢指定地區附近車位模塊,前者在做的過程中不斷進行完善,後者我借用了Redis技術達到了預期效果。

部分接口模塊作用:

註冊:查詢手機號是否已被註冊,需在未被註冊情況下才能註冊;

登錄:查詢手機號是否存在,驗證密碼後才能登錄;

戶主發佈即時車位:從前臺獲取車位名稱、地址、經度、緯度、截止時間;

戶主查看己有即時車位:從後臺獲取車位名稱、價格、截止時間、使用情況;

租客查詢即時車位:從前臺獲取當前位置經度、緯度、當前時間;

                                     從後臺返回車位名稱、截止時間、價格;

租賃即時車位:綁定車位租客信息,記錄停車時間,更改車位狀態;

停止租賃即時車位:從前臺獲取當前時間,從後臺獲取停車時間,計算總停車時間及費用,扣除租客餘額,增加戶主餘額,更改車位狀態;

租賃預約車位:綁定車位租客信息,扣除租客餘額,增加戶主餘額,更改車位狀態;

查看預約車位詳情頁:從後臺獲取車位名稱、地址、起始/截止時間、價格;

APP部分截圖:

 

 

        APP實現所有設計功能,空閒車位查詢反應良好,停車操作狀態更改設計反應良好,費用計算設計反應良好,數據庫數據更新良好,得到了預期的效果。

        本項目設計功能全部實現,自行設計的交易流程清晰明確,前臺模塊還實現引用“地圖”模塊,特色優點在共享形式之外,計費系統還拋棄了以往的按時收費方式,採用按分鐘收費(不滿一元以一元計算)。對於一個課設成果來說我認爲還是比較成功的,但是對於一個真實的APP來說還是欠缺一定的真實性,可在後期結合硬件模塊對本APP進行進一步的完善。

     硬件模塊我暫時的目標是鏈接一個藍牙鎖模塊,在車主靠近停車位時使用手機藍牙打開地鎖停入車位。

參考文獻

[1]張輝.停車位共享系統的設計與實現[J].中國戰略新興產業,

2017(8):117-120

[2] 閻湜潘鵬屈婧喬磊孫鳳禹.共享經濟下閒置車位利用對城市交通的影響[J].中國商論,2017(12):165-167

 

附錄,實驗主要函數與代碼。

    /**

    * 戶主查詢即時租出車位

    */

    @SuppressWarnings("unchecked")

 

    public ServerResponse<List<PageData>> findParkNowByLessor(PageData pd)throws Exception {

        List<PageData> results = (List<PageData>) this.dao.findForList("CarportMapper.findParkNowByLessor", pd);

        if (results ==null) {

            return ServerResponse.createByErrorMessage("沒有相關車位");

        }

        return ServerResponse.createBySuccess(results);

    }

    /**

    * 租戶查詢預約出租車位

    */

    @SuppressWarnings({ "unchecked" })

    public ServerResponse<?> findParkPlanByTenant(PageData pd)throws Exception {

        Double longitude1 = (Double) pd.get("longitude");

        Double latitude1 = (Double) pd.get("latitude");

        int radius1 = 10;

 

        List<PageData> results = (List<PageData>) this.dao.findForList("CarportMapper.findAllParkPlanByTenant",pd);//查找所有車位的經緯度和Id

        List<String> ids = new ArrayList<String>();

        String random = RandomUtil.getStringRandom(8);

        for (PageData pageData : results) {//取每個車位的經緯度和id信息去匹配

            String id = Integer.toString((int) pageData.get("carport_id"));

            double longitude = (Double) pageData.get("longitude");

            double latitude = (Double) pageData.get("latitude");

            JedisUtil.geoADD(random, longitude, latitude, id);

        }

        // ids是指得到的符合經緯度範圍的機構id

        ids = JedisUtil.geoRadius(random, longitude1, latitude1, radius1, Const.UNIT, Const.ASC);

 

        if (ids.size() > 0) {

            pd.put("ids", ids);//將符合地區的車位id放入pd

            List<PageData> list = (List<PageData>) dao.findForList("CarportMapper.findParkPlanByTenant", pd);

            return ServerResponse.createBySuccess(list);

        } else {

            return ServerResponse.createByErrorMessage("附近沒有車位");

        }

    }

    /**

     * 添加即時停車位

     */

    public ServerResponse<?> addParkNow(PageData requestPd)throws Exception {

        Integer save = (Integer)dao.save("CarportMapper.addParkNow",requestPd);

        if(save!=0){

            

            Long id = (Long) requestPd.get("id");

            PageData pd = new PageData();

            pd.put("carport_id", id);

            dao.save("CarportMapper.addParkUser",pd);

            return ServerResponse.createBySuccess(save);

        }

        return ServerResponse.createByErrorMessage("創建失敗!");  

    }

    /**

     *租賃預約車位

     * */

    public ServerResponse<Integer> buyParkPlan(PageData pd)throws Exception {

        Integer update = (Integer) dao.update("CarportMapper.updateTenant", pd);

        if (update != 0) {

            double result = (double)dao.findForObject("CarportMapper.findPrice", pd);

            Integer lessor = (Integer) dao.findForObject("CarportMapper.findLessor", pd);

            pd.put("lessor_id", lessor);

            pd.put("balance_pay", result);

            dao.update("CarportMapper.updateBalanceOfTenant", pd);

            Integer update2 = (Integer) dao.update("CarportMapper.updateBalanceOfLessor", pd);

            if(update2 != 0){

            return ServerResponse.createBySuccessMessage("成功了!"); }

            }

        return ServerResponse.createByErrorMessage("沒有相關信息");

    }

    /**

     * 點擊結束

     * */

    public ServerResponse<Integer> endPark(PageData pd)throws Exception {

        Integer update1 = (Integer) dao.update("CarportMapper.deleteTenant", pd);

        if (update1 != 0) {

            double result = (double)dao.findForObject("CarportMapper.findPrice", pd);

            Integer lessor = (Integer) dao.findForObject("CarportMapper.findLessor", pd);

            pd.put("lessor_id", lessor);

            Integer start_time = (Integer) dao.findForObject("CarportMapper.findStartTime", pd);

            Integer over_time = Integer.valueOf(pd.getString("time_now_num"));

            int result1 = (int) ((over_time-start_time)*result/3600000);

            pd.put("balance_pay", result1);

            dao.update("CarportMapper.updateBalanceOfTenant", pd);

            Integer update2 = (Integer) dao.update("CarportMapper.updateBalanceOfLessor", pd);

            if(update2 != 0){

            return ServerResponse.createBySuccessMessage("成功了!");  }

        }

        return ServerResponse.createByErrorMessage("沒有相關信息");

    }

本文章僅限於本人保存作品之用,若有引用意向,請事先與我聯繫,望理解,謝謝。


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章