【帶并發(fā)限制的異步調(diào)度器Ⅲ】點餐排隊系統(tǒng)

在前兩篇文章
【帶并發(fā)限制的異步調(diào)度器Ⅰ】原始Demo
【帶并發(fā)限制的異步調(diào)度器Ⅱ】點餐排隊系統(tǒng)Demo
的基礎(chǔ)上沼头,這次加入了圖形化界面国夜,這樣就升級成一個完整的項目。我把這三篇文章總結(jié)為以下三種遞進的階段:
①單通道的任務(wù)調(diào)度器
②多通道的任務(wù)調(diào)度器准谚,無頁面的應(yīng)用場景演示Demo阿纤,并增加了通道數(shù)及任務(wù)運行數(shù)的初始化配置
③多通道的任務(wù)調(diào)度器甚负,有頁面的應(yīng)用場景操作纬傲,可配置初始化信息并持久化保存襟衰,可查看某一任務(wù)的運行情況贴铜,可實時添加及移除任務(wù)

第三階段的技術(shù)總結(jié)如下:

  1. React組件圖形化界面,形成最原始的可視化頁面
  2. Egg.js企業(yè)級Node.js框架瀑晒,提供接口請求以及安全防護
  3. Mongoose數(shù)據(jù)庫存儲绍坝,持久化配置信息
  4. React-redux提供組件間交互的狀態(tài)管理,store機制給所有組件(隔層組件以及不同頁面組件)提供全局數(shù)據(jù)
  5. Ant Design模態(tài)框提供便于交互的組件服務(wù)

第三階段的功能點總結(jié)如下:

  1. 在“初始化”界面添加配置桌子信息苔悦,可移除添加的信息轩褐,可編輯添加的信息(添加相同人數(shù)的桌子信息即可覆蓋原信息),可點擊“完成配置”持久化配置數(shù)據(jù)玖详,以供下次啟動試用把介,可立即切換到“點餐排隊”使用配置信息
初始化頁面
添加配置數(shù)據(jù)
完成添加
  1. 進入系統(tǒng)時,系統(tǒng)會自動請求配置數(shù)據(jù)接口初始化操作頁面需要用到的全局數(shù)據(jù)store(“點餐排隊”和“初始化”使用的是store里的同一個數(shù)據(jù)源)
初始界面
數(shù)據(jù)加載后界面
  1. 點擊初始化后蟋座,會出現(xiàn)后續(xù)操作按鈕拗踢,點擊“查看桌子使用信息”,會出現(xiàn)桌子的使用信息情況


    操作按鈕
桌子使用情況
  1. 點擊“用餐入座”向臀,相應(yīng)的顧客就會在N人桌里占一個位子巢墅,如果有空閑桌,可以直接用餐(若按原始Demo的說法,就是執(zhí)行任務(wù)隊列有空缺君纫,任務(wù)直接進入執(zhí)行任務(wù)隊列運行驯遇,若已滿,則會進入待執(zhí)行任務(wù)隊列)蓄髓,若沒有叉庐,則會拿到一個排隊編號等待入座


    添加用餐信息
取號情況
  1. 當拿到編號時,可點擊“查看某桌排隊情況”会喝,輸入相應(yīng)編號來查看此編號目前所處的情況陡叠,具體情況如下:
  • 無此桌點餐信息
  • 正在用餐
  • 排隊情況
無此桌點餐信息
正在用餐
  • 排隊情況
  1. 當某桌用餐結(jié)束時,可點擊“結(jié)束用餐”好乐,輸入桌子編號匾竿,把執(zhí)行任務(wù)從正在用餐隊列里移除
移除用餐前
移除用餐
移除用餐后

以上就是此系統(tǒng)的全部功能,完整項目放在github上蔚万,如有需要請自取岭妖。

總結(jié)下開發(fā)此系統(tǒng)遇到的問題:

  1. 服務(wù)端無法接受 post 請求,并且請求接口報錯 403 :message: 'invalid csrf token'
    原因:Egg框架內(nèi)置中間件安全防護反璃,默認開啟防止 XSS 攻擊 和 CSRF 攻擊昵慌,所以前端請求post接口時需要在header請求頭里添加csrfToken,讓Egg幫忙驗證淮蜈,具體配置如下:
    server端:
//config.default.js
  //csrf配置
  exports.security= {
    csrf : {
      headerName: 'x-csrf-token', // 自定義請求頭
    }
 }

client端:

'use strict'
import api from './api';
// 封裝獲取 cookie 的方法
function getCookie(name){
  var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
  if(arr=document.cookie.match(reg))
  return unescape(arr[2]);
  else
  return null;
}

function saveSetting(deskData, successCB, failCB) {
  return $.ajax({
    url: api.COMPANY + '/setting',
    method: 'POST',
    contentType: 'application/json',
    headers:{
      // 前后端不分離的情況加每次打開客戶端斋攀,egg會直接在客戶端的 Cookie 中寫入密鑰 ,
      //密鑰的 Key 就是 'scrfToken' 這個字段梧田,所以直接獲取就好了
      'x-csrf-token': getCookie("csrfToken"), 
    },
    data: JSON.stringify({ data:deskData })
  }).then(successCB, failCB);
}
  1. 開發(fā)前端的操作頁面時淳蔼,對React-redux的store使用不當,導(dǎo)致不同頁面組件獲取store中的全局數(shù)據(jù)出現(xiàn)問題裁眯。
    具體情況:當把頁面組件從UI組件變?yōu)槿萜鹘M件(使用connect處理)時鹉梨,未能成功獲取到store數(shù)據(jù),但實際是錯誤理解了React-redux和redux獲取全局數(shù)據(jù)store的方式穿稳。
    解決:React-redux子組件獲取store的方式是在mapStateToProps方法中處理的存皂,而redux是通過this.context.store來獲取,以下是React-redux獲取store的項目代碼:
/app/view/container/DinnerPane.js

import { connect } from 'react-redux';
import dinnerPane from '../component/dinnerPane/dinnerPane';

function mapStateToProps(state) {
  return {
    deskData: state.deskData||{}
  };
}

function mapDispatchToProps(dispatch) {
  return {};
}

export default connect(mapStateToProps, mapDispatchToProps)(dinnerPane);

初始化store是在dinnerPane的上層容器Content里處理的逢艘,先請求配置數(shù)據(jù)get接口旦袋,然后dispatchinitDeskDataAction到store里更新數(shù)據(jù):

/app/view/container/content/Content.js

import { connect } from 'react-redux';
import Content from '../../component/Content/Content';
import { getSetting } from '../../utils/WebAPIUtils';
import { initDeskDataAction } from '../../action/initDataActionCreator'

function mapStateToProps(state) {
  return {
    deskData: state.deskData
  };
}

function mapDispatchToProps(dispatch) {
  return {
    initDeskDataRequest: function (companyId, callback) {
      return getSetting(companyId, function (result) {
        callback(null, result);
      }, function (err){
        callback(err);
      });
    },
    initDeskData: function(deskData){
      dispatch(initDeskDataAction(deskData));
    }
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Content);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市它改,隨后出現(xiàn)的幾起案子疤孕,更是在濱河造成了極大的恐慌,老刑警劉巖央拖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祭阀,死亡現(xiàn)場離奇詭異截亦,居然都是意外死亡,警方通過查閱死者的電腦和手機柬讨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袍啡,“玉大人踩官,你說我怎么就攤上這事【呈洌” “怎么了蔗牡?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嗅剖。 經(jīng)常有香客問我辩越,道長,這世上最難降的妖魔是什么信粮? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任黔攒,我火速辦了婚禮,結(jié)果婚禮上强缘,老公的妹妹穿的比我還像新娘督惰。我一直安慰自己,他們只是感情好旅掂,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布赏胚。 她就那樣靜靜地躺著,像睡著了一般商虐。 火紅的嫁衣襯著肌膚如雪觉阅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天秘车,我揣著相機與錄音典勇,去河邊找鬼。 笑死鲫尊,一個胖子當著我的面吹牛痴柔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疫向,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咳蔚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搔驼?” 一聲冷哼從身側(cè)響起谈火,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舌涨,沒想到半個月后糯耍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年温技,在試婚紗的時候發(fā)現(xiàn)自己被綠了革为。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡舵鳞,死狀恐怖震檩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜓堕,我是刑警寧澤抛虏,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站套才,受9級特大地震影響迂猴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜背伴,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一沸毁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挂据,春花似錦以清、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至个绍,卻和暖如春勒葱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巴柿。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工凛虽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人广恢。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓凯旋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钉迷。 傳聞我的和親對象是個殘疾皇子至非,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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