目錄
一、前言介紹:
二、系統設計:
2.1 系統架構設計:
2.2 系統整體架構:
2.3 系統功能結構圖:
三、資料設計:
3.1 管理者屬性圖:
3.2 會員屬性圖圖:
3.3 農産品委托屬性圖:
3.4 訂單配送屬性圖:
四、功能截圖:
4.1 登入注冊:
4.2 前端首頁:
4.2.1 農産品公告資訊:
4.2.2 農産品委托資訊:
4.2.3 委托詳情資訊:
4.2.4 添加委托資訊:
4.2.5 農産品公司簡介:
4.2.6 使用者個人中心:
4.2.7 使用者背景配送:
4.2.8 配送訂單資訊:
4.3 後端管理者:
4.3.1 使用者管理:
4.3.2 農産品公告管理:
4.3.3 農産品委托管理:
4.3.4 農産品公司簡介:
4.3.5 農産品車源管理:
4.3.6 配送訂單管理:
4.3.7 配送行車路線管理:
4.3.8 訂單評價回報管理:
4.3.9 系統輪播圖管理:
五、代碼實作:
5.1 使用者登入:
5.2 檔案上傳:
5.3 訂單管理:
六、項目總結:
七、源碼擷取:
一、前言介紹:
随着社會生活愈來愈好,群眾對食品的要求和生活品質需求也在逐漸提高。農産品物流作為進行農村生産資料流動和農業流通的必要手段,對我們國家農業生産與農民生活等諸多方面都有相當重要的作用。衆所周知,我國既是一座農業人口強國,同時我國又是一座制造、貿易和消費農産品的工業強國。農産品生産經營管理的全面更新、農村産品和服務現代化大流通與城市大市場的合理銜接,是實作我國農業食品安全生産和全面農村現代化發展的重要保證。
走進二十一世紀,在各國對網際網路及其相關資訊技術的廣泛普及和提升的大背景之下,中國的網際網路資訊技術更是飛速的發展了起來。随着網際網路資訊技術的快速發展,電子商務在各行業中迅猛開展。盡管在發展過程中遇到了許多挑戰,但卻為中國各産業提供了史無前例的機遇。在此情形下,各行各業争相發展網際網路電子商務,不僅使商品銷售形态更加多元化,同時使銷售産品的服務範圍也更為廣闊化,而另外一個更為重要的優勢便是電子商務的商産品能夠突破不同地域之間存在的距離限制,進而進行資源共享。 由于我國的市場經濟與發展環境對農産品依賴性比較強,是以農業作為我國的第一産業,在國民經濟中的重要性有目共睹,而全面發展農村經濟也是國家政府部門長期以來主要發展的責任與義務。随着網際網路電商潮流的蓬勃發展,傳統的農産品行業也搭上了發展的快車。“網際網路+農業”成為目前農村經濟發展的一個十分重要的方向,國家出台了一系列的政策全面促進了“網際網路+農業”的蓬勃發展,而對于傳統農産品生産行業依賴性偏大的地方的各級人民政府也都把農産品電子商務形式視為當地農産品生産行業和農産品貿易發展的一個重點發展的方向,也成為提高農民經濟水準和進一步發展農村壯大區域經濟的一條重要的管道。在此背景下,傳統農産品貿易主體以網際網路電子商務形式進行貿易活動變得普遍起來,且參加的數量每年也呈現出大環比增長的态勢,農産品電子商務的興起與發展,對農産品貿易行業的發展與由其帶動的相關産業的發展,提供了很大的助力。但在參與農産品電子商務的商家中了解一番之後,就會發現目前大多數的農産品電子商務商家目前都處于略虧損的狀态,能夠保持盈利狀态的商家屬于很少的一部分。其中一大部分原因是由于農産品物流配送的成本過高,是以農産品物流配送行業的發展是目前農産品電子商務産業發展的關鍵所在,是優化農産品電子商務必然趨勢,為了目前的農産品電子商務産業整體的發展,隻有借助網際網路發展速度不斷幫助改進提升農産品物流配送行業相關的能力。
目前,國内的農産品物流市場正在逐漸走向完善,全國各地基本形成了從生産到收購到配送到銷售的一體化組織環節。但總體上看,農産品物流體系發展由于各個地區經濟上發展的不平衡,也呈現出同樣不平衡的發展情勢。國内從事農産品物流行業的主體也非常的多,既有國有企業、民營企業等大型的成規模的商業集團,也有農村生産戶,農村協會等小規模組織。雖然我國從事農産品物流的主體很多,其中的一些大型企業也對行業的發展起到了很重要的作用,但許多參與的個體組織程度不夠,規模也不大,使得其競争力也偏弱,無法實作競争優勢。在物流的管道上面,不僅有傳統的業務做支撐,目前各家超市推出的生鮮模式,還有電商産品的火爆,也開發了行業的新賽道,使得農産品物流行業有了更加廣闊的發展空間。
但我國農産品物流市場目前也遇到了自己的發展困境,有許多問題需要解決。由于中國農産品在目前的運輸設施與手段相較于歐美發達國家來說還比較滞後,交通運力和倉庫的存儲條件不能滿足目前市場的需要。由于我國農業生産目前仍然是以家庭承包型的生産方式為主,不是類似美國的大農場生産方式,導緻我國目前的農業生産群體龐大。這些農戶又居住分散,溝通不太友善,使得我們對于農産品資訊搜集很困難,資訊化速度很慢。物流技術也比較落後,農産品保鮮對于冷鍊技術的要求很高,農産品标準化處理也要成規模的大型企業牽頭。分散的物流方式又使得物流成本偏高,使得進行物流作業的主體風險相應增大。
二、系統設計:
2.1 系統架構設計:
農産品物流配送系統使用的是B/S架構模式,即浏覽器和伺服器架構模式開發模式進行開發。現在這種體系結構是目前主流的、可以了解為是對 C/S 架構體系結構的改變和促進,以前C/S模式架構需要安裝本地程式、這樣的話系統的擴充以及移植行都比較差、B/S架構模式可以進行後面的系統資訊分布式處理和結構維護,這樣的話系統的維護資源成本就降低了,也提高設計的系統性能以及看擴充性。在這種架構下,前端負責樣式代碼的編寫和接口的對接、後端主要負責事務邏輯的處理以及流程資訊的控制。系統的前端表現層樣式是展示給使用者前端可以直接觀看的效果,用于顯示渲染資料和接收背景傳遞的的資料、根據請求送出之後、交給系統背景進行業務邏輯處理,目前系統設計采用了HTTP/HTTPS協定通信模式、AJAX請求、以及和一些需要常用API方法元件、系統的控制層主要負責從前端發送HTTP請求中擷取參數資訊降請求送出到背景controlle控制層,控制層注入處理服務(service層)、并将其分發給不同的處理服務(service層),調用資料庫底層執行SQL的一系列操作、然後向前端傳回service層處理後的資料、傳回的都是json格式的資料結果集、前端根據結果集進行資料渲染和前端的展示、系統的業務邏輯層将使用者的輸入資訊進行甄别處理、實作具體的功能業務邏輯實作,以及對SQL資料的通路;系統的資料通路層主要負責操作資料,為業務層或控制層提供資料服務服務;實作具體的業務都需要以資料為支撐,需要記錄資訊才能實作業務
2.2 系統整體架構:
2.3 系統功能結構圖:
三、資料設計:
學習程式設計,我們都知道資料庫設計是基于需要設計的系統功能,我們需要建立一個資料庫關系模型,用于存儲資料資訊,這樣當我們在程式中時,就沒有必要為程式頁面添加資料,進而提高系統的效率。資料庫存儲了很多資訊,可以說是資訊管理系統的核心和基礎,資料庫還提供了添加、删除、修改和檢查,使系統能夠快速找到自己想要的資訊,而不是在程式代碼中找到。資料庫中資訊表的每個部分根據一定的關系精确地組合,排列群組合成資料表。 通過物流管理系統的功能進行規劃分成幾個實體資訊,實體資訊将通過ER圖進行說明,本系統的主要實體圖如下
3.1 管理者屬性圖:
3.2 會員屬性圖圖:
3.3 農産品委托屬性圖:
3.4 訂單配送屬性圖:
四、功能截圖:
4.1 登入注冊:
頁面設計主要是在首頁頭部引入common以及vue元件等公共的js和css樣式布局檔案,通過recommend index-pv2 DIV樣式設計頭部幾個輸入框和菜單欄的顯示。使用者點選注冊的時候點選其中一個div或注冊的按鈕觸發注冊添加使用者的操作、頁面就加載架構的布局、調用提前寫好的.index-pv1 .animation-box:hover CSS檔案等來渲染整個前端頁面、使用者登入注冊,注冊是使用者輸入input注冊框之後點選确定事件(onsubmit)按鈕、送出的時候綁定函數、書寫對應的函數(擷取使用者輸入的資料<擷取資料時需要在指定位置定義一個id>)、然後對form表單的資料進行判斷、進行資料合法(form表單送出)、若資料非法(給出錯誤提示資訊彈窗button,不讓表單送出)、注冊送出的時候對各個屬性字段進行了驗證、比如使用者名不能為空、年齡的整數判斷、手機号碼以及郵箱号碼的正确格式進行驗證。
4.2 前端首頁:
系統首頁是這個農産品物流配送系統項目啟動成功之後的首頁、在這樣可以看見系統的前台首頁布局和實作、主要設計是頭部采用vue主鍵、最頂部的DIV采用了EL表達式的方法對系統的項目名稱進行渲染、{{this.$project.projectName}}、引入router 路由的router-static靜态資源檔案進行布局和架構的使用、首頁會根據通過 if(this.$storage.get('Token')){方法來判斷使用者是否登入、登入之後使用者可以進行對應的農産品委托功能操作。
4.2.1 農産品公告資訊:
在農産品物流公告管理頁面點選可以檢視物流公告的資訊、點選搜尋框可以通過物流公告名稱進行關鍵字的模糊搜尋操作。
4.2.2 農産品委托資訊:
點選上方農産品委托頁面、可以檢視或添加委托農産品的操作、點選添加可以錄入農産品的委托編号、會員号碼、會員姓名、委托農産品的重量、委托地點、運輸地點、收貨人資訊、委托貨物圖檔、備注等基本詳細内容。
4.2.3 委托詳情資訊:
4.2.4 添加委托資訊:
4.2.5 農産品公司簡介:
4.2.6 使用者個人中心:
4.2.7 使用者背景配送:
4.2.8 配送訂單資訊:
4.3 後端管理者:
管理者登入農産品物流配送系統後,可以對首頁、個人中心、會員管理、農産品公告管理、農産品委托管理、農産品公司簡介管理、農産品車源資訊管理、農産品配送訂單管理、農産品行車路線管理、農産品評價回報管理以及系統管理等功能進行相應操作。
4.3.1 使用者管理:
4.3.2 農産品公告管理:
在農産品物流公告管理頁面點選可以檢視物流公告的資訊、點選搜尋框可以通過物流公告名稱進行關鍵字的模糊搜尋操作、可以對物流公告标題資訊、釋出時間、釋出人以及圖檔休息等内容進行詳情清單檢視、點選詳情以及修改或删除按鈕可以進行農産品物流公告資訊資料的維護操作。
4.3.3 農産品委托管理:
4.3.4 農産品公司簡介:
4.3.5 農産品車源管理:
4.3.6 配送訂單管理:
在物流訂單管理頁面點選可以檢視物流訂單的資訊、點選搜尋框可以通過物流訂單名稱進行關鍵字的模糊搜尋操作、可以對委托編号、會員姓名、貨物名稱、會員手機、委托地點、貨物圖檔、運輸地點、司機姓名、收貨人、司機電話、物流狀态、路線名稱、路線編号、運輸價格以及是否支付等内容進行詳情清單檢視、點選詳情以及修改或删除按鈕可以進行物流訂單資訊資料的維護操作。
4.3.7 配送行車路線管理:
4.3.8 訂單評價回報管理:
4.3.9 系統輪播圖管理:
五、代碼實作:
5.1 使用者登入:
/**
* 登入
*/
@IgnoreAuth
@PostMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
if(user==null || !user.getPassword().equals(password)) {
return R.error("賬号或密碼不正确");
}
String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
return R.ok().put("token", token);
}
5.2 檔案上傳:
@Async
@RequestMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
if (file.isEmpty()) {
throw new EIException("上傳檔案不能為空");
}
String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
File upload = new File("D:/work/");
if(!upload.exists()) {
upload.mkdirs();
}
String fileName = new Date().getTime()+"."+fileExt;
File dest = new File(upload+"/"+fileName);
file.transferTo(dest);
if(StringUtils.isNotBlank(type) && type.equals("1")) {
ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
if(configEntity==null) {
configEntity = new ConfigEntity();
configEntity.setName("faceFile");
configEntity.setValue(fileName);
} else {
configEntity.setValue(fileName);
}
configService.insertOrUpdate(configEntity);
}
return R.ok().put("file", fileName);
}
5.3 訂單管理:
/**
* 配送訂單
* @date 2022-03-06 13:38:47
*/
@RestController
@RequestMapping("/peisongdingdan")
public class PeisongdingdanController {
@Autowired
private PeisongdingdanService peisongdingdanService;
/**
* 後端清單
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,PeisongdingdanEntity peisongdingdan, HttpServletRequest request){
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("huiyuan")) {
peisongdingdan.setHuiyuanhao((String)request.getSession().getAttribute("username"));
}
EntityWrapper<PeisongdingdanEntity> ew = new EntityWrapper<PeisongdingdanEntity>();
PageUtils page = peisongdingdanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, peisongdingdan), params), params));
return R.ok().put("data", page);
}
/**
* 前端清單
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,PeisongdingdanEntity peisongdingdan, HttpServletRequest request){
EntityWrapper<PeisongdingdanEntity> ew = new EntityWrapper<PeisongdingdanEntity>();
PageUtils page = peisongdingdanService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, peisongdingdan), params), params));
return R.ok().put("data", page);
}
/**
* 清單
*/
@RequestMapping("/lists")
public R list( PeisongdingdanEntity peisongdingdan){
EntityWrapper<PeisongdingdanEntity> ew = new EntityWrapper<PeisongdingdanEntity>();
ew.allEq(MPUtil.allEQMapPre( peisongdingdan, "peisongdingdan"));
return R.ok().put("data", peisongdingdanService.selectListView(ew));
}
/**
* 查詢
*/
@RequestMapping("/query")
public R query(PeisongdingdanEntity peisongdingdan){
EntityWrapper< PeisongdingdanEntity> ew = new EntityWrapper< PeisongdingdanEntity>();
ew.allEq(MPUtil.allEQMapPre( peisongdingdan, "peisongdingdan"));
PeisongdingdanView peisongdingdanView = peisongdingdanService.selectView(ew);
return R.ok("查詢配送訂單成功").put("data", peisongdingdanView);
}
/**
* 後端詳情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
PeisongdingdanEntity peisongdingdan = peisongdingdanService.selectById(id);
return R.ok().put("data", peisongdingdan);
}
/**
* 前端詳情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
PeisongdingdanEntity peisongdingdan = peisongdingdanService.selectById(id);
return R.ok().put("data", peisongdingdan);
}
/**
* 後端儲存
*/
@RequestMapping("/save")
public R save(@RequestBody PeisongdingdanEntity peisongdingdan, HttpServletRequest request){
peisongdingdan.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(peisongdingdan);
peisongdingdanService.insert(peisongdingdan);
return R.ok();
}
/**
* 前端儲存
*/
@RequestMapping("/add")
public R add(@RequestBody PeisongdingdanEntity peisongdingdan, HttpServletRequest request){
peisongdingdan.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(peisongdingdan);
peisongdingdanService.insert(peisongdingdan);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody PeisongdingdanEntity peisongdingdan, HttpServletRequest request){
//ValidatorUtils.validateEntity(peisongdingdan);
peisongdingdanService.updateById(peisongdingdan);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
peisongdingdanService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
六、項目總結: