扫码点餐各个页面是如何实现的

登录界面

首先用到的模块是 ‘react-router-dom’ 的 withRouter 和封装好的 axios API。整个登录逻辑写在 withRouter中,在 jsx 里使用 ref 获得输入的用户名、密码、验证码,登录先 preventDefault 然后用户名密码验证码分别是 ref 获取到的当前输入值,使用 try-catch 用 post 请求发送给后端,如果成功就用 history.push 给 url 传值转跳页面,不然就 alert 后端设定好的错误信息。

点餐界面:

首先用到的模块是 ‘prop-types’,’immer’,’history’,’socket.io-client’。

菜单内容是一个函数组件,参数是 food,onupdate 和 amount,返回的 jsx 是一个菜单列表,列表里的每个菜都有按钮可以增减选择数量,使用 onupdate 来控制点击按钮时的菜品数量增减。
随后用到了 React 的属性验证功能 要求菜单内容这个函数组件必须要传参数且必须要传指定类型的参数。calTotaoPrice 是一个用 reduce 来计算下单总价的函数,初始值为 0 元。

购物车状态是一个函数组件,返回的 jsx 显示了当前下单总价,以及展开收起按钮,使用 useState 来控制是否展开,默认 false。

点餐主界面是一个类组件,state 里有三个属性:cart 数组里放当前点了的菜,foodMenu 数组里放当前提供可选的菜品列表,deskInfo 对象里是当前的餐桌号,顾客数,总价,点了的菜。

接下来是各个生命周期里做的事情:在 componentDidMount 中,首先用 props.match.params 拿到路由传递过来的参数 params,然后用 get 请求到当前餐桌 id 和菜单信息用 setState 设置为当前餐桌和当前菜单信息。为了同步同一餐桌不同用户间的点单,设置 socket 的路径和请求,在接入餐桌连接时用 socket.on 在 ‘cart food’ 时向后端发送字符串命令和餐桌 id。后端发回此桌面已点菜单,这里用到了 immer 的 produce:先定义一个变更,有数据时再执行这个变更,然后用 socket.on 在 ‘new food’ 时调用 foodChange 函数变更菜品和数量,下单成功时用 socket.on 在 ‘placeorder success’ 时用路由 push 点餐成功页面的路径并将订单状态设置为 order。componentWillUnmount 中关闭 socket 链接。

cartChange 函数用 socket.emit 在 ‘new food’ 时向后端发送当前餐桌 id,所点食物和数量。placeOrder 函数用于下单,用 post 请求向后端发送路径和当前订单信息后转跳到成功界面,state 设置为 res.data。

最后点餐主界面 render 了菜单列表,返回的菜单列表用 map 渲染,返回的是当前能点的菜的列表。

菜品管理:

列表中每个菜是一个函数组件,可以进行菜品的删改增查,使用了三个 hook 来管理状态:setFoodInfo、setIsModify、setFoodProps,默认分别是food、false、和属性是菜品各项信息的对象。save 函数 new 一个 FormDate 后将遍历到的菜品属性键值对插入进去,然后用 put 请求向后端放松当前菜品 id 和属性后将菜品信息设置为当前菜品信息。

change 和 imgChange 函数用于重新设置菜品信息,使用 setFoodProps 将菜品信息设置为当前传入事件参数的值即可。然后是菜品的删除、设置是否提供,用put请求向后端发送状态后使用 hook 变更菜品属性即可。最后 jsx 返回的是修改界面,根据是修改将对应的 html 样式返回即可。最后整个函数组件返回的是菜品展示图和一些功能按钮(修改、保存、下架、上架、删除)。

订单管理:

首先用到的模块是 ‘socket.io-client’,’immer’ 和封装好的 axios API。订单状态用 hook 的 useState 管理。订单列表使用函数组件。

然后是实现各个逻辑的函数。使订单状态变为确认:用 put 请求向后端发送当前订单 id 的状态变更为 confirmed,然后用 setOrder 将订单的属性设置为当前属性为 confirmed,setComplete 同理。

删除订单则是直接向后端发送对应订单 id 的 delete 请求即可。最后订单列表返回显示总价格、人数、订单状态、打印、确认、完成、删除功能的 jsx。

订单管理使用类组件,state 为由 orders 组成的数组。

在订单管理的生命周期中,componentDidMount 首先获取参数,定义 socket 的路径和请求,在 on ‘connect’ 是向后端发送当前加入餐厅 id,在 on ‘new order’ 时发送在当前页面新增一个订单。用 get 请求获取当前订单。componentWillUnmount 中关闭 socket 连接,和删除订单的函数。最后 render 的是订单管理页面,根据订单长度 map 一个订单项列表。