博主介紹:?全網(wǎng)粉絲30W+,csdn特邀作者、博客專家、CSDN新星計劃導(dǎo)師、Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者,博客之星、掘金/華為云/阿里云/InfoQ等平臺優(yōu)質(zhì)作者、專注于Java技術(shù)領(lǐng)域和畢業(yè)項目實戰(zhàn)?
??文末獲取源碼聯(lián)系??
?????精彩專欄推薦訂閱?????不然下次找不到喲
2022-2024年最全的計算機軟件畢業(yè)設(shè)計選題大全:1000個熱門選題推薦?
Java項目精品實戰(zhàn)案例《100套》
Java微信小程序項目實戰(zhàn)《100套》文章來源地址http://www.zghlxwxcb.cn/news/detail-544135.html
目錄
一、摘要介紹:
二、主要技術(shù):
2.1 SpringBoot框架
2.3 Java技術(shù)
2.3 BS架構(gòu)
2.4 微信開發(fā)者工具
三、功能設(shè)計:
3.1 小程序端用戶功能結(jié)構(gòu)圖設(shè)計
3.2 后端管理員功能結(jié)構(gòu)圖設(shè)計
3.3 系統(tǒng)功能設(shè)計
四、功能實現(xiàn):
4.1 后端系統(tǒng)
4.1.1.登錄模塊
4.1.2.資訊管理
4.1.3.商城管理:
4.1.4.模塊管理:
4.2 微信小程序端
4.2.1 小程序首頁
4.2.2 菜品信息詳情
4.2.3 購物管理頁面
4.2.4 訂單管理頁面
4.2.5 個人中心頁面
五、關(guān)鍵代碼:
六、數(shù)據(jù)庫設(shè)計:
七、論文參考:
八、其他案例:
九、源碼獲?。?/p>
?
一、摘要介紹:
? ? ? ?自從計算機發(fā)展開始,計算機軟硬件相關(guān)技術(shù)的發(fā)展速度越來越快,在信息化高速發(fā)展的今天,計算機應(yīng)用技術(shù)似乎已經(jīng)應(yīng)用到了各個領(lǐng)域。在餐飲行業(yè),除了外賣以外就是到店里就餐,在店里就餐如果需要等待點餐的話,用戶的體驗度就會急劇下降,很多餐飲店也開始開發(fā)線上訂餐的系統(tǒng),這樣的系統(tǒng)給用戶帶來了新的體驗,尤其是在時間和空間上,讓使用者不管身在何處,只要連上網(wǎng)就能夠選購菜品,進(jìn)行訂餐。外賣系統(tǒng)小程序的開發(fā)項目以Springboot框架為基礎(chǔ),基于B/S模式,采用Java編程語言,使用MySQL數(shù)據(jù)庫,首選對外賣系統(tǒng)小程序的各個功能以及用戶的需求做出了解釋,然后根據(jù)用戶線上訂餐的需求,再介紹了系統(tǒng)的總體設(shè)計以及其詳細(xì)設(shè)計,給用戶提供了外賣系統(tǒng)小程序的總體結(jié)構(gòu)的搭建方法。從而滿足用戶線上訂餐的需求。
二、主要技術(shù):
2.1 SpringBoot框架
Spring框架是Java平臺上的一種開源應(yīng)用框架,提供具有控制反轉(zhuǎn)特性的容器。盡管Spring框架自身對編程模型沒有限制,但其在Java應(yīng)用中的頻繁使用讓它備受青睞,以至于后來讓它作為EJB(EnterpriseJavaBeans)模型的補充,甚至是替補。Spring框架為開發(fā)提供了一系列的解決方案,比如利用控制反轉(zhuǎn)的核心特性,并通過依賴注入實現(xiàn)控制反轉(zhuǎn)來實現(xiàn)管理對象生命周期容器化,利用面向切面編程進(jìn)行聲明式的事務(wù)管理,整合多種持久化技術(shù)管理數(shù)據(jù)訪問,提供大量優(yōu)秀的Web框架方便開發(fā)等等。Spring框架具有控制反轉(zhuǎn)(IOC)特性,IOC旨在方便項目維護(hù)和測試,它提供了一種通過Java的反射機制對Java對象進(jìn)行統(tǒng)一的配置和管理的方法。
2.3 Java技術(shù)
Java是美國sun公司所推出的一款程序設(shè)計語言,其能夠在多個平臺內(nèi)應(yīng)用,具有良好兼容性,進(jìn)而其憑借自身優(yōu)勢在數(shù)據(jù)中心、個人PC與科技超級計算機等平臺內(nèi)廣泛應(yīng)用,具有目前最為龐大的開發(fā)者專業(yè)社群[3]。
JDK為美國sun公司為java開發(fā)員所推出的一款全新產(chǎn)品,要是沒有JDK的情況下,所安裝的java程序也就無法運行[4]。
2.3 BS架構(gòu)
基于Java技術(shù)開發(fā)的B/S架構(gòu)系統(tǒng),需要借助Tomcat服務(wù)器應(yīng)用程序進(jìn)行部署運行[5]。用戶訪問系統(tǒng)的時候,通過瀏覽器向應(yīng)用程序服務(wù)器端發(fā)起訪問請求,服務(wù)器端的程序在接到用戶請求以后,服務(wù)器端應(yīng)用程序?qū)蛻粽埱笞龀鱿鄳?yīng),在調(diào)用服務(wù)器端的業(yè)務(wù)邏輯程序完成和數(shù)據(jù)庫端的交互,進(jìn)一步生成相應(yīng)的HTML/XML數(shù)據(jù),最終把結(jié)果反饋給瀏覽器端用戶[5]。
在該系統(tǒng)的開發(fā)中,開發(fā)模式采用B/S架構(gòu)技術(shù)進(jìn)行實現(xiàn),通過部署服務(wù)器端應(yīng)用程序,實現(xiàn)用戶通過網(wǎng)站域名或者內(nèi)網(wǎng)IP地址訪問系統(tǒng),實現(xiàn)系統(tǒng)中數(shù)據(jù)的動態(tài)化呈現(xiàn)和管理,加之頁面效果的動態(tài)化呈現(xiàn),不僅提升了頁面的表現(xiàn)力,而且管理者可以隨時更新系統(tǒng)中的各種信息,充分滿足管理者和訪問用戶之間的信息交互[6]。
2.4 微信開發(fā)者工具
微信開發(fā)者工具是一款專為小程序開發(fā)而設(shè)計的應(yīng)用,它不斷改進(jìn),提供了便捷的操作方式,并且在開發(fā)過程中可以通過微信掃描二維碼來訪問,從而實現(xiàn)快速、準(zhǔn)確的小程序開發(fā)和調(diào)試。
根據(jù)用戶的需求,我們將采用不同的屏幕大小來制作小程序。
在完成了視圖布置之后,可以通過執(zhí)行編輯功能,快速更改當(dāng)前的視圖界面。
控制臺:方便調(diào)試打印輸出信息。
將代碼上傳至騰訊服務(wù)器,并在審核過程中填寫版本號和備注信息,以確保代碼的安全性和準(zhǔn)確性。
三、功能設(shè)計:
本外賣系統(tǒng)小程序總體的體系結(jié)構(gòu)圖分為前端用戶體系結(jié)構(gòu)和后端管理員體系結(jié)構(gòu),其具體結(jié)構(gòu)圖如圖4-1和圖4-2所示
3.1 小程序端用戶功能結(jié)構(gòu)圖設(shè)計
?圖外賣系統(tǒng)小程序前端功能結(jié)構(gòu)圖
3.2 后端管理員功能結(jié)構(gòu)圖設(shè)計
圖4外賣系統(tǒng)小程序后端功能結(jié)構(gòu)圖
3.3 系統(tǒng)功能設(shè)計
用戶管理模塊
該模塊是為所有用戶登錄設(shè)計的,如注冊用戶這種普通用戶登錄后只能進(jìn)行自己的普通功能操作(如個人信息修改),管理員能對整個系統(tǒng)的數(shù)據(jù)進(jìn)行管理,主要是用戶的登錄權(quán)限以及用戶登錄后在系統(tǒng)里的操作權(quán)限。
菜品信息模塊
普通用戶和菜品信息存在學(xué)習(xí)關(guān)系,關(guān)系為一對多,根據(jù)菜品信息用戶將菜品購買數(shù)據(jù)傳入到訂單數(shù)據(jù)中,操作人為普通用戶,然后生成訂單列表,普通用戶查看個人歷史訂單列表,可以進(jìn)行數(shù)據(jù)銷毀。
美食資訊模塊
普通用戶和美食資訊存在學(xué)習(xí)關(guān)系,關(guān)系為一對多,根據(jù)美食資訊來將評論數(shù)據(jù)傳入到美食資訊數(shù)據(jù)中,操作人為普通用戶,然后生成評論列表,普通用戶可以進(jìn)行數(shù)據(jù)銷毀。
菜品信息維護(hù)模塊
操作人來錄入菜品信息數(shù)據(jù),點擊菜品信息錄入按鈕,依次填寫要錄入的菜品信息數(shù)據(jù),點擊提交按鈕,將數(shù)據(jù)提交至數(shù)據(jù)庫,然后刷新菜品信息數(shù)據(jù)頁面,每條數(shù)據(jù)右邊有刪除和編輯按鈕,來完成相應(yīng)的刪除和更新功能。
菜品分類模塊
管理員點擊菜品分類管理菜單,點擊新增添加菜品分類,添加菜品分類數(shù)據(jù),填寫標(biāo)題、內(nèi)容、類別、圖片,提交成功后,菜品分類管理頁面刷新,新數(shù)據(jù)成功載入頁面。
訂單管理模塊
訂單管理分為用戶訂單頁面和商家訂單管理頁面,用戶登錄系統(tǒng)后,選擇想要加購的美食,生成訂單,商家查詢該訂單信息,是否生成已支付訂單,并對此訂單點擊發(fā)貨。
四、功能實現(xiàn):
4.1 后端系統(tǒng)
4.1.1.登錄模塊
4.1.2.資訊管理
4.1.3.商城管理:
4.1.4.模塊管理:
4.2 微信小程序端
4.2.1 小程序首頁
當(dāng)進(jìn)入外賣系統(tǒng)小程序的時候,首先映入眼簾的是系統(tǒng)的導(dǎo)航欄,導(dǎo)航欄上邊是輪播圖以及公告欄,其主界面展示如下圖所示
4.2.2 菜品信息詳情
當(dāng)訪客點擊了任意菜品分類后將會進(jìn)入該款菜品的詳情界面,可以了解到該菜品的圖片信息、分類信息、價錢信息等,同時可以對該菜品進(jìn)行加購、評論,菜品詳情展示頁面如圖所示,購買流程圖如圖所示
4.2.3 購物管理頁面
當(dāng)用戶點擊“購物車”按鈕則會顯示自己加入購物車的美食信息,然后對其進(jìn)行購買管理,購物管理界面如下圖所示
4.2.4 訂單管理頁面
?
4.2.5 個人中心頁面
五、關(guān)鍵代碼:
/**
* 用戶賬戶:用于保存用戶登錄信息(User)表控制層
*/
@Slf4j
@RestController
@RequestMapping("user")
public class UserController extends BaseController<User, UserService> {
/**
* 服務(wù)對象
*/
@Autowired
public UserController(UserService service) {
setService(service);
}
/**
* Token服務(wù)
*/
@Autowired
private AccessTokenService tokenService;
@Autowired
private UserGroupService userGroupService;
/**
* 注冊
* @param user
* @return
*/
@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
// 查詢用戶
Map<String, String> query = new HashMap<>();
query.put("username",user.getUsername());
List list = service.select(query, new HashMap<>()).getResultList();
if (list.size()>0){
return error(30000, "用戶已存在");
}
user.setUserId(null);
user.setPassword(service.encryption(user.getPassword()));
service.save(user);
return success(1);
}
/**
* 找回密碼
* @param form
* @return
*/
@PostMapping("forget_password")
public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {
JSONObject ret = new JSONObject();
String username = form.getUsername();
String code = form.getCode();
String password = form.getPassword();
// 判斷條件
if(code == null || code.length() == 0){
return error(30000, "驗證碼不能為空");
}
if(username == null || username.length() == 0){
return error(30000, "用戶名不能為空");
}
if(password == null || password.length() == 0){
return error(30000, "密碼不能為空");
}
// 查詢用戶
Map<String, String> query = new HashMap<>();
query.put("username",username);
Query select = service.select(query, service.readConfig(request));
List list = select.getResultList();
if (list.size() > 0) {
User o = (User) list.get(0);
JSONObject query2 = new JSONObject();
JSONObject form2 = new JSONObject();
// 修改用戶密碼
query2.put("user_id",o.getUserId());
form2.put("password",service.encryption(password));
service.update(query, service.readConfig(request), form2);
return success(1);
}
return error(70000,"用戶不存在");
}
/**
* 登錄
* @param data
* @param httpServletRequest
* @return
*/
@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {
log.info("[執(zhí)行登錄接口]");
String username = data.get("username");
String email = data.get("email");
String phone = data.get("phone");
String password = data.get("password");
List resultList = null;
Map<String, String> map = new HashMap<>();
if(username != null && "".equals(username) == false){
map.put("username", username);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(email != null && "".equals(email) == false){
map.put("email", email);
resultList = service.select(map, new HashMap<>()).getResultList();
}
else if(phone != null && "".equals(phone) == false){
map.put("phone", phone);
resultList = service.select(map, new HashMap<>()).getResultList();
}else{
return error(30000, "賬號或密碼不能為空");
}
if (resultList == null || password == null) {
return error(30000, "賬號或密碼不能為空");
}
//判斷是否有這個用戶
if (resultList.size()<=0){
return error(30000,"用戶不存在");
}
User byUsername = (User) resultList.get(0);
Map<String, String> groupMap = new HashMap<>();
groupMap.put("name",byUsername.getUserGroup());
List groupList = userGroupService.select(groupMap, new HashMap<>()).getResultList();
if (groupList.size()<1){
return error(30000,"用戶組不存在");
}
UserGroup userGroup = (UserGroup) groupList.get(0);
//查詢用戶審核狀態(tài)
if (!StringUtils.isEmpty(userGroup.getSourceTable())){
String sql = "select examine_state from "+ userGroup.getSourceTable() +" WHERE user_id = " + byUsername.getUserId();
String res = String.valueOf(service.runCountSql(sql).getSingleResult());
if (res==null){
return error(30000,"用戶不存在");
}
if (!res.equals("已通過")){
return error(30000,"該用戶審核未通過");
}
}
//查詢用戶狀態(tài)
if (byUsername.getState()!=1){
return error(30000,"用戶非可用狀態(tài),不能登錄");
}
String md5password = service.encryption(password);
if (byUsername.getPassword().equals(md5password)) {
// 存儲Token到數(shù)據(jù)庫
AccessToken accessToken = new AccessToken();
accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
accessToken.setUser_id(byUsername.getUserId());
tokenService.save(accessToken);
// 返回用戶信息
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));
user.put("token", accessToken.getToken());
JSONObject ret = new JSONObject();
ret.put("obj",user);
return success(ret);
} else {
return error(30000, "賬號或密碼不正確");
}
}
/**
* 修改密碼
* @param data
* @param request
* @return
*/
@PostMapping("change_password")
public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){
// 根據(jù)Token獲取UserId
String token = request.getHeader("x-auth-token");
Integer userId = tokenGetUserId(token);
// 根據(jù)UserId和舊密碼獲取用戶
Map<String, String> query = new HashMap<>();
String o_password = data.get("o_password");
query.put("user_id" ,String.valueOf(userId));
query.put("password" ,service.encryption(o_password));
Query ret = service.count(query, service.readConfig(request));
List list = ret.getResultList();
Object s = list.get(0);
int count = Integer.parseInt(list.get(0).toString());
if(count > 0){
// 修改密碼
Map<String,Object> form = new HashMap<>();
form.put("password",service.encryption(data.get("password")));
service.update(query,service.readConfig(request),form);
return success(1);
}
return error(10000,"密碼修改失敗!");
}
/**
* 登錄態(tài)
* @param request
* @return
*/
@GetMapping("state")
public Map<String, Object> state(HttpServletRequest request) {
JSONObject ret = new JSONObject();
// 獲取狀態(tài)
String token = request.getHeader("x-auth-token");
// 根據(jù)登錄態(tài)獲取用戶ID
Integer userId = tokenGetUserId(token);
log.info("[返回userId] {}",userId);
if(userId == null || userId == 0){
return error(10000,"用戶未登錄!");
}
// 根據(jù)用戶ID獲取用戶
Map<String,String> query = new HashMap<>();
query.put("user_id" ,String.valueOf(userId));
// 根據(jù)用戶ID獲取
Query select = service.select(query,service.readConfig(request));
List resultList = select.getResultList();
if (resultList.size() > 0) {
JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(resultList.get(0)));
user.put("token",token);
ret.put("obj",user);
return success(ret);
} else {
return error(10000,"用戶未登錄!");
}
}
/**
* 登錄態(tài)
* @param request
* @return
*/
@GetMapping("quit")
public Map<String, Object> quit(HttpServletRequest request) {
String token = request.getHeader("x-auth-token");
JSONObject ret = new JSONObject();
Map<String, String> query = new HashMap<>(16);
query.put("token", token);
try{
tokenService.delete(query,service.readConfig(request));
}catch (Exception e){
e.printStackTrace();
}
return success("退出登錄成功!");
}
/**
* 獲取登錄用戶ID
* @param token
* @return
*/
public Integer tokenGetUserId(String token) {
log.info("[獲取的token] {}",token);
// 根據(jù)登錄態(tài)獲取用戶ID
if(token == null || "".equals(token)){
return 0;
}
Map<String, String> query = new HashMap<>(16);
query.put("token", token);
AccessToken byToken = tokenService.findOne(query);
if(byToken == null){
return 0;
}
return byToken.getUser_id();
}
/**
* 重寫add
* @return
*/
@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
Map<String,Object> map = service.readBody(request.getReader());
map.put("password",service.encryption(String.valueOf(map.get("password"))));
service.insert(map);
return success(1);
}
}
六、數(shù)據(jù)庫設(shè)計:
下面是整個外賣系統(tǒng)小程序中主要的數(shù)據(jù)庫表總E-R實體關(guān)系圖。
外賣系統(tǒng)小程序總E-R關(guān)系圖?
七、論文參考:
本次寫作的論文,在結(jié)構(gòu)方面主要分為七大部分,每一部分都必不可少,共同組合形成一個完好的論文結(jié)構(gòu),具體的安排列出如下。
緒論部分,該部分講述的是外賣系統(tǒng)小程序的開發(fā)背景,明確開發(fā)的意義以及系統(tǒng)的研究動態(tài),并對系統(tǒng)的整個章節(jié)安排進(jìn)行介紹。
系統(tǒng)分析部分,該部分首先從可行性入手進(jìn)行分析,明確程序開發(fā)可行后,進(jìn)而對程序的功能以及姓名需求進(jìn)行分析。
系統(tǒng)概要設(shè)計,對系統(tǒng)前后臺的功能分別進(jìn)行設(shè)計,然后完成系統(tǒng)的總體功能以及各個子模塊的設(shè)計。
系統(tǒng)數(shù)據(jù)庫的設(shè)計,對系統(tǒng)的數(shù)據(jù)庫實體以及數(shù)據(jù)庫表進(jìn)行設(shè)計
系統(tǒng)的實現(xiàn)部分,對系統(tǒng)每一角色主要實現(xiàn)的功能的頁面來進(jìn)行展示一下。
系統(tǒng)測試部分,介紹測試的測試目的,用例,完成對程序測試工作,讓投入運行的程序減少出錯的幾率,力求最好。
總結(jié)部分,此刻所有的工作都已經(jīng)完成了,在此進(jìn)行總結(jié),展望。
八、其他案例:
?
?
?
九、源碼獲取:
大家點贊、收藏、關(guān)注、評論啦 、查看????獲取聯(lián)系方式????
?精彩專欄推薦訂閱:在下方專欄????
2022-2024年最全的計算機軟件畢業(yè)設(shè)計選題大全:1000個熱門選題推薦?
Java項目精品實戰(zhàn)案例《100套》文章來源:http://www.zghlxwxcb.cn/news/detail-544135.html
Java微信小程序項目實戰(zhàn)《100套》
到了這里,關(guān)于基于Java+SpringBoot+Vue+uniapp微信小程序外賣系統(tǒng)設(shè)計和實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!