最近忙著創(chuàng)業(yè),好久沒(méi)有寫(xiě)文章了。今天就抽空給點(diǎn)餐系統(tǒng)加一個(gè)排號(hào)等位功能,想加這個(gè)功能很久了,一直沒(méi)有瞅到時(shí)間寫(xiě)。今天就把這個(gè)功能實(shí)現(xiàn)了,順便寫(xiě)個(gè)文章出來(lái)。
老規(guī)矩,先給大家看效果圖
只顧實(shí)現(xiàn)功能了,ui沒(méi)怎么美化,后面有時(shí)間再做下ui美化吧。下面就來(lái)給大家講解下。
講之前,先給大家看一個(gè)簡(jiǎn)單的流程圖。
流程其實(shí)很簡(jiǎn)單,就是客戶(hù)端(小程序端)操作,點(diǎn)擊排位。
然后Java后臺(tái),入庫(kù),并生成排位的號(hào)碼,用戶(hù)端可以看到自己當(dāng)前排在第幾號(hào)。
然后管理員在后臺(tái)操作,排到位的客戶(hù)可以入座。
等到號(hào)的用戶(hù),就會(huì)出現(xiàn)可入座的標(biāo)識(shí)。后面會(huì)增加排到號(hào)的用戶(hù)接受微信訂閱消息通知的功能。敬請(qǐng)期待。
流程基本上講完了,接下來(lái)就給大家講解代碼部分。這里只把重要的代碼貼出來(lái)給到大家,順便給大家講下思路。后面也會(huì)錄制完整的講解視頻:《點(diǎn)餐系統(tǒng),java后臺(tái)+點(diǎn)餐小程序》
一,小程序端代碼
1,排號(hào)相關(guān)代碼
我們先來(lái)講講排號(hào)相關(guān)的代碼,從上圖可以看出,我們排號(hào)的wxml文件里可以顯示兩種狀態(tài),未排號(hào)和已排號(hào)。上圖展示的是未排號(hào)的狀態(tài),用戶(hù)點(diǎn)擊完取號(hào)以后,就可以展示已排號(hào)狀態(tài)了。
其實(shí)排號(hào)的小程序端代碼很簡(jiǎn)單。下面再把paihao.js的代碼貼出來(lái)給到大家。
let app = getApp()
Page({
data: {
num: 1111, //當(dāng)前排號(hào)
type: 1,
currentSmall: -1,
currentBig: -1
},
onShow: function () {
this.getNum()
},
//取號(hào)
quhao(event) {
let type = event.currentTarget.dataset.type
let that = this;
//如果openid不存在,就重新請(qǐng)求接口獲取openid
var openid = app.globalData.openid;
if (openid === null || openid === undefined) {
app.getOpenid();
wx.showToast({ //這里提示失敗原因
title: 'openid為空!',
duration: 1500
})
return;
}
wx.request({
url: app.globalData.baseUrl + '/paihao/quhao',
method: "POST",
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: {
openid: openid,
type: type,
},
success(res) {
if (res && res.data && res.data.data) {
wx.showToast({
title: '排號(hào)成功',
})
console.log(res)
that.setData({
type: res.data.data.type,
num: res.data.data.num
})
}
},
fail(res) {
console.log("排號(hào)失敗", res)
}
})
},
//查詢(xún)我的排號(hào)
getNum() {
let that = this;
//如果openid不存在,就重新請(qǐng)求接口獲取openid
var openid = app.globalData.openid;
if (openid === null || openid === undefined) {
app.getOpenid();
wx.showToast({ //這里提示失敗原因
title: 'openid為空!',
duration: 1500
})
return;
}
wx.request({
url: app.globalData.baseUrl + '/paihao/getNum',
data: {
openid: openid
},
success: function (res) {
if (res && res.data && res.data.data) {
let dataList = res.data.data;
console.log("請(qǐng)求到的排號(hào)情況", dataList)
that.setData({
type: dataList.type,
num: dataList.num,
smallOkNum: dataList.smallOkNum,
bigOkNum: dataList.bigOkNum,
})
} else {
that.setData({
num: -1
})
}
},
fail(res) {
console.log("查詢(xún)排號(hào)失敗", res)
}
})
}
})
這里需要注意一點(diǎn),就是一定要先獲取用戶(hù)的openid,因?yàn)閛penid是用戶(hù)的唯一標(biāo)識(shí)。每人每天只能排一次號(hào)。買(mǎi)我點(diǎn)餐系統(tǒng)這門(mén)課的同學(xué),都知道如何獲取openid,我課程配套的視頻也有講。
二,Java后臺(tái)代碼講解
如果有仔細(xì)看上面第一步小程序端代碼,應(yīng)該可以看到wx.request網(wǎng)絡(luò)請(qǐng)求部分,其實(shí)這個(gè)網(wǎng)絡(luò)請(qǐng)求就是請(qǐng)求的我們Java后臺(tái)。下面先把Java后臺(tái)源碼貼出來(lái)。
/**
* 小程序端排號(hào)相關(guān)接口
*/
@RestController
@RequestMapping("/paihao")
@Slf4j
public class WxPaihaoController {
@Autowired
PaihaoRepository repository;
/*
* 取號(hào)
* */
@PostMapping("/quhao")
public ResultVO quhao(@RequestParam(value = "type") Integer type,
@RequestParam("openid") String openid) {
int size = repository.findByDayAndType(TimeUtils.getYMD(), type).size();
log.info("當(dāng)前排號(hào)數(shù)={}", size);
Paihao paihao = new Paihao();
paihao.setDay(TimeUtils.getYMD());
paihao.setNum(size + 1);
paihao.setType(type);
paihao.setOpenid(openid);
paihao.setRuzuo(false);
return ApiUtil.success(repository.save(paihao));
}
/*
* 查詢(xún)當(dāng)前排號(hào)
* */
@GetMapping("/getNum")
public ResultVO getNum(@RequestParam("openid") String openid) {
//獲取當(dāng)前小桌入座情況
List<Paihao> listSmall = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 0);
//獲取當(dāng)前大桌入座情況
List<Paihao> listBig = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 1);
//查詢(xún)當(dāng)前客戶(hù)的排號(hào)情況
List<Paihao> listKeHu = repository.findByOpenidAndDay(openid,TimeUtils.getYMD());
//組裝數(shù)據(jù)返回給小程序端
PaihaoVO paihao = new PaihaoVO();
if (listSmall != null && listSmall.size() > 0) {
paihao.setSmallOkNum(listSmall.get(listSmall.size() - 1).getNum());
} else {
paihao.setSmallOkNum(0);
}
if (listBig != null && listBig.size() > 0) {
paihao.setBigOkNum(listBig.get(listBig.size() - 1).getNum());
} else {
paihao.setBigOkNum(0);
}
if (listKeHu != null && listKeHu.size() > 0) {
paihao.setNum(listKeHu.get(listKeHu.size() - 1).getNum());
paihao.setType(listKeHu.get(listKeHu.size() - 1).getType());
} else {
paihao.setNum(0);
paihao.setType(0);
}
return ApiUtil.success(paihao);
}
}
可以看到我們一共給小程序前端提供兩個(gè)接口,一個(gè)是取號(hào),一個(gè)是查詢(xún)當(dāng)前排號(hào)狀態(tài)。
1,先給大家講講取號(hào)
/*
* 取號(hào)
* */
@PostMapping("/quhao")
public ResultVO quhao(@RequestParam(value = "type") Integer type,
@RequestParam("openid") String openid) {
int size = repository.findByDayAndType(TimeUtils.getYMD(), type).size();
log.info("當(dāng)前排號(hào)數(shù)={}", size);
Paihao paihao = new Paihao();
paihao.setDay(TimeUtils.getYMD());
paihao.setNum(size + 1);
paihao.setType(type);
paihao.setOpenid(openid);
paihao.setRuzuo(false);
return ApiUtil.success(repository.save(paihao));
}
取號(hào)其實(shí)很簡(jiǎn)單,就是先查詢(xún)當(dāng)前已經(jīng)排到第幾號(hào),然后新排號(hào)的客戶(hù)號(hào)碼再前面排號(hào)的基礎(chǔ)上加一。然后數(shù)據(jù)入庫(kù)就可以了。
2,再給大家講下排號(hào)狀態(tài)查詢(xún)。
@GetMapping("/getNum")
public ResultVO getNum(@RequestParam("openid") String openid) {
//獲取當(dāng)前小桌入座情況
List<Paihao> listSmall = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 0);
//獲取當(dāng)前大桌入座情況
List<Paihao> listBig = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), true, 1);
//查詢(xún)當(dāng)前客戶(hù)的排號(hào)情況
List<Paihao> listKeHu = repository.findByOpenidAndDay(openid,TimeUtils.getYMD());
//組裝數(shù)據(jù)返回給小程序端
PaihaoVO paihao = new PaihaoVO();
if (listSmall != null && listSmall.size() > 0) {
paihao.setSmallOkNum(listSmall.get(listSmall.size() - 1).getNum());
} else {
paihao.setSmallOkNum(0);
}
if (listBig != null && listBig.size() > 0) {
paihao.setBigOkNum(listBig.get(listBig.size() - 1).getNum());
} else {
paihao.setBigOkNum(0);
}
if (listKeHu != null && listKeHu.size() > 0) {
paihao.setNum(listKeHu.get(listKeHu.size() - 1).getNum());
paihao.setType(listKeHu.get(listKeHu.size() - 1).getType());
} else {
paihao.setNum(0);
paihao.setType(0);
}
return ApiUtil.success(paihao);
}
這一步稍微復(fù)雜一點(diǎn)。這一步的主要就是給小程序端返回所需的數(shù)據(jù),比如當(dāng)前大桌排到了第幾號(hào),小桌排到了第幾號(hào),當(dāng)前用戶(hù)的排號(hào),當(dāng)前用戶(hù)是否被叫到。代碼里注釋都很清楚了,感興趣的同學(xué)仔細(xì)看下上面代碼即可。
3,管理員端
管理員就是用來(lái)操作誰(shuí)可以入座的。
這個(gè)頁(yè)面主要是用freemarker寫(xiě)的前端頁(yè)面。代碼如下圖。
對(duì)應(yīng)的后臺(tái)接口。
/**
* 排號(hào)相關(guān)
*/
@Controller
@RequestMapping("/adminPaihao")
@Slf4j
public class AdminPaihaoController {
@Autowired
PaihaoRepository repository;
/*
* 頁(yè)面相關(guān)
* */
@GetMapping("/list")
public String list(ModelMap map) {
//獲取小桌未入座的用戶(hù)
List<Paihao> listSmall = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), false, 0);
//獲取大桌未入座的用戶(hù)
List<Paihao> listBig = repository.findByDayAndRuzuoAndTypeOrderByNum(TimeUtils.getYMD(), false, 1);
map.put("listSmall", listSmall);
map.put("listBig", listBig);
return "paihao/list";
}
@GetMapping("/ruzhuo")
public String ruzhuo(@RequestParam("id") int id, ModelMap map) {
try {
Paihao paihao = repository.findById(id).orElse(null);
if (paihao == null) {
throw new DianCanException(ResultEnum.PAIHAO_NOT_EXIST);
}
if (paihao.getRuzuo()) {
throw new DianCanException(ResultEnum.PAIHAO_STATUS_ERROR);
}
paihao.setRuzuo(true);
repository.save(paihao);
} catch (DianCanException e) {
map.put("msg", e.getMessage());
map.put("url", "/diancan/adminPaihao/list");
return "zujian/error";
}
map.put("url", "/diancan/adminPaihao/list");
return "zujian/success";
}
}
管理頁(yè)對(duì)應(yīng)的代碼很簡(jiǎn)單,就是一個(gè)顯示當(dāng)前排號(hào)數(shù)據(jù)列表,另外一個(gè)就是操作到號(hào)用戶(hù)入座,后面還會(huì)添加到號(hào)后微信訂閱消息通知相應(yīng)用戶(hù)的功能。
到這里完整的點(diǎn)餐排號(hào)等位功能就差不多實(shí)現(xiàn)了,相應(yīng)的講解視頻和源碼我會(huì)放到網(wǎng)盤(pán),感興趣的同學(xué)可以聯(lián)系石頭哥vx: 2501902696
本文摘自 :https://blog.51cto.com/u