无人点餐、无人收银系统是一个颠覆传统行业的智能点单系统。无人点单、手机支付、免收银员、免点餐员、免硬件、免布线的一套智能管理系统。
扫码点餐,让每一个桌码都成为您的点餐、收银通道。微信/支付宝扫一扫,不用排队,上桌点餐,多人点餐,自动收银,解放老板娘,减少开支。
1.用VUE和Angular两种语言分别开发,方便不同公司、学员学习使用
2.支持微信、支付宝、浏览器多种扫码工具扫码点餐、
3.系统支持多人扫码点餐,点餐信息通过websocket同步(解决传统点餐的尴尬场景)
4.下单无线打印小票,后厨、服务员同时收到订单信息
5.微信、支付宝在线支付,自动收银,方便大数据分析
传统中西餐、快餐店、奶茶店、火锅店、咖啡店、甜品店、大排档、酒吧、小吃店、KTV
前端技术薪资介绍
Vue和Angular、React都是前端框架
中国人开发很重要——Vue简单 灵活 高效 国内的中小企业里面用的非常多
地址:http://npm.taobao.org/
安装cnpm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
https://cn.vuejs.org/v2/guide/installation.html
必须要安装nodejs
搭建vue的开发环境 ,安装vue的脚手架工具 官方命令行工具
npm install --global vue-cli/cnpm install --global vue-cli
(此命令只需要执行一次)
创建项目 必须cd到对应的一个项目里面
vue init webpack vue-demo01(创建的时候ESLint选择no,是一个代码检查器)
cd vue-demo01
cnpm install / npm install 如果创建项目的时候没有报错,这一步可以省略。
如果报错了 cd到项目里面运行 cnpm install / npm install
npm run dev
另一种创建项目的方式 (推荐) ***
vue init webpack-simple vuedemo02
cd vuedemo02
cnpm install / npm install
npm run dev
html代码
业务逻辑,JS代码
css代码
实例化VUE 业务逻辑: 挂载组件 数据绑定到属性上去 绑定html-让浏览器解析html代码 绑定数据另一种方式 绑定Class与Style style css里面要写东西 双向数据绑定 MVVM vue是一个MVVM框架 ref获取DOM节点 数组索引获取,再删除 生命周期函数与methods、data同级关系 style引用——父组件同时也会变 生命周期函数(生命周期钩子): axios 父组件给子组件传方法: 父组件给子组件传方法(方法中带参数): 父组件传整个传过去 props合法性验证: 父组件主动获取子组件的数据和方法 获取子组件的数据和方法 在需要广播的地方引入刚才定义的实例 通过 https://router.vuejs.org/ 安装 引入并 1.配置动态路由 2.对应页面获取动态路由的值 路由之间的传值:get传值 新闻列表接口: 新闻详情接口: 解析后台传过来的html代码 加样式、视口 到index.html里面加 编程式导航 HTML5 History模式 要结合后台服务器端配合 路由的嵌套 基于Vue的Ui框架 http://element.eleme.io/ http://mint-ui.github.io/#!/en mintUI的使用: 4.看文档直接使用。 在mintUi组件上面执行事件的写法 style Infinite scroll http://element.eleme.io/ element UI的使用: cnpm install babel-plugin-component -D 找到.babelrc 配置文件 element UI组件的单独使用(第一种方法): cnpm install babel-plugin-component -D 找到.babelrc 配置文件 element UI组件的单独使用(第二种方法): 路由模块分离 在独立的文件route.js Vuex 是一个专为 Vue.js 设计的状态管理模式 vuex解决了组件之间同一状态的共享问题。当我们的应用遇到多个组件共享状态时,会需要: 多个组件依赖于同一状态。传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。这需要你去学习下,vue编码中多个组件之间的通讯的做法。 以上的这些模式非常脆弱,通常会导致无法维护的代码。来自官网的一句话:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 它采用集中式存储管理应用的所有组件的状态。这里的关键在于集中式存储管理。这意味着本来需要共享状态的更新是需要组件之间通讯的,而现在有了vuex,就组件就都和store通讯了。问题就自然解决了。 这就是为什么官网再次会提到Vuex构建大型应用的价值。如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 vuex解决了组件之间同一状态的共享问题 (解决了不同组件之间的数据共享) 组件里面数据的持久化。 1、src目录下面新建一个vuex的文件夹 2、vuex 文件夹里面新建一个store.js 3、安装vuex 4、在刚才创建的store.js引入vue 引入vuex 并且use vuex 5、定义数据 6、定义方法 mutations里面放的是方法,方法主要用于改变state里面的数据 引入 store store的名字不要变 注册 获取state里面的数据 触发 mutations 改变 state里面的数据 提交载荷(Payload) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 vuex解决了组件之间同一状态的共享问题 (解决了不同组件之间的数据共享) 组件里面数据的持久化。 小项目不部建议用vuex getter 与 action 一般用不上 1、src目录下面新建一个vuex的文件夹 2、vuex 文件夹里面新建一个store.js 3、安装vuex 4、在刚才创建的store.js引入vue 引入vuex 并且use vuex 5、定义数据 6、定义方法 mutations里面放的是方法,方法主要用于改变state里面的数据 7、优点类似计算属性 , 改变state里面的count数据的时候会触发 getters里面的方法 获取新的值 (基本用不到) 8、 Action 基本没有用 1、 引入 store 2、 注册 3、 获取state里面的数据 4、 触发 mutations 改变 state里面的数据 5、 触发 actions里面的方法 6、获取 getters里面方法返回的的数据 本Vue基础知识是看大地老师视频学习的!!!
VUE的模板里面 所有的内容需要被一个根节点包含起来
所有东西都在中的
data()——业务逻辑里面定义的数据
绑定数据——{{msg}}
绑定对象——{{obj.name}}
绑定数组——数据渲染,数组嵌套代码示例:
list:['111','222','333'],
list1:[
{'title':'111'},
{'title':'222'},
{'title':'333'},
{'title':'444'}
],
list2:[
{
"cate":"国内新闻",
"list":[
{'title':'国内新闻111'},
{'title':'国内新闻222'}
]
},
{
"cate":"国际新闻",
"list":[
{'title':'国际新闻111'},
{'title':'国际新闻222'}
]
}
]
`
4.Vue绑定属性 绑定Html 绑定class 绑定style
——简写,动态绑定数据
其中——h:'
我是h2
',
5.Vue 及双向数据绑定 Vue事件介绍 以及Vue中的ref获取dom节点
自定义方法要放在export default里面
Model改变会影响View View改变反过来影响Model
借鉴Angular
双向数据绑定必须在表单中——input、select
获取表单数据——DOM节点
横线
换行
6.Vue事件 定义方法 执行方法 获取数据 改变数据 执行方法传值 以及事件对象
事件对象——可以获取DOM节点
e.srcElement
方法函数:
getMsg() {
alert(this.msg);
//小程序 获取数据——this.data.msg
//React 获取数据——this.state.msg
},
setMsg(){
this.msg='我将数据改变了';
},
requestData(){
for(var i=0;i<10;i++){
this.list.push('我是第'+i+'条数据');
}
},
deleteData(val){
alert(val);
},
eventFn(e){
console.log(e);
e.srcElement.style.background='red';
console.log(e.srcElement.dataset.aid); /*获取自定义属性的值*/
}
7.Vue 事件结合双向数据绑定实现todolist
addData()
addData(){
this.list.push(this.todo);
this.todo='';
}
deleteData()
deleteData(key){
this.list.splice(key,1);
}
8.Vue 事件结合双向数据绑定实现todolist 待办事项 已经完成 和进行中
9.Vue 中的模块化以及封装Storage实现todolist 待办事项 已经完成 和进行中持久化
/*生命周期函数,vue页面刷新就会触发*/
mounted(){
var list=storage.get('list');
if(list){ /*注意判断传过来的值是否为空 */
this.list=list;
}
}
10.Vue中创建单文件组件 注册组件 以及组件的使用
App.vue—根组件
import Home from ‘./components/Home.vue’;
前面的组件名称不可以和html标签一样 components:{
'v-home':Home
}
//作用域定义使用的地方
11.Vue中组件的生命周期函数
组件挂载、组件更新、组件销毁的时候触发的一系列的方法 这些方法叫做生命周期函数 beforeCreate(){
console.log('01实例刚刚被创建');
},
Create(){
console.log('02实例创建完成');
},
beforeMount(){
console.log('03模板编译之前');
},
mounted(){ 请求数据、操作DOM放在这个里面 必须记住
console.log('04模板编译完成');
},
beforeUpdate(){
console.log('05数据更新之前');
},
updated(){
console.log('06数据更新完毕');
},
beforeDestroy(){ 页面销毁的时候要保存一些数据,可以监听这个销毁的生命周期函数
console.log('07实例销毁之前');
},
destroyed(){
console.log('08实例销毁完成');
}
12.Vue vue-resource 请求数据
VUE请求数据:
官方:vue-resource 官方插件
进入项目目录安装
cnpm install vue-resource --save(会配置好package)import VueResource from 'vue-resource';
Vue.use(VueResource);
{
// GET /someUrl
this.$http.get('/someUrl').then(response => {
// get body data
this.someData = response.body;
}, response => {
// error callback
});
}
非官方也可以使用的插件
fetch-jsonp13.Axios fetchJsonp请求数据
axios使用:
import Axios from ‘axios’;var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20';
getData(){
var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20';
Axios.get(api).then(response=> {
// handle success
console.log(response);
this.list1 = response.data.result;
}) .catch(error=>{
// handle error
console.log(error);
});
}
14.Vue父组件给子组件传值 Vue父组件给子组件传方法 Vue父组件把整个实例传给子组件
父组件给子组件传值:
props:['title'] (与methods同级)
接收数据是一个对象15.父组件主动获取子组件的数据和方法 子组件主动获取父组件的数据和方法
this.$refs.header.属性
this.$refs.header.方法
子组件主动获取夫组件的数据和方法this.$parent.数据
this.$parent.方法
16.Vue非父子组件传值
非父子组件传值:
var bus= new Vue();
//触发组件A中的事件
bus.$emit('id-selectes',1)
//在组件B创建的钩子中监听事件
bus.$on('id-selected',function(id){
})
复杂情况考虑专门的状态管理模式
import Vue from 'vue'
var VueEvent = new Vue()
export default VueEvent;
import VueEvent from ‘…/model/VueEvent’; emitHome(){
VueEvent.$emit('to-home',this.msg);
}
注意'to-home'是有标识性的
$on
接收广播的数据mounted(){
VueEvent.$on('to-news',function(data){
console.log(data);
})
}
17.Vue中的路由 以及默认路由跳转
vue路由配置:
npm install vue-router --save / cnpm install vue-router --saveVue.use(VueRouter) (main.js)
import VueRouter from 'vue-router'
Vue.use(VueRouter)
1、创建组件 引入组件
2、定义路由 (建议复制s)
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar },
{ path: '*', redirect: '/home' } /*默认跳转路由*/
]
3、实例化VueRouter
const router = new VueRouter({
routes // (缩写)相当于 routes: routes
})
4、挂载
new Vue({
el: '#app',
router,
render: h => h(App)
})
5 、根组件的模板里面放上这句话
18.Vue动态路由 Get传值
路由之间的传值:动态路由:
const routes = [
{ path: '/home', component: Home },
{ path: '/news', component: News },
{ path: '/content/:aid', component: Content }, /*动态路由*/
{ path: '*', redirect: '/home' } /*默认跳转路由*/
]
mounted(){
console.log(this.$route.params); /*获取动态路由传值 */
}
路由跟普通路由一样 { path: '/pcontent', component: Pcontent },
mounted(){
//get传值
console.log(this.$route.query);
}
19.Vue路由结合请求数据 实现新闻列表 新闻详情数据渲染
http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1
http://www.phonegap100.com/appapi.php?a=getPortalArticle&aid=488
methods:{
requestData(){
//jsonp请求的话 后台api需要支持jsonp
var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1';
this.$http.jsonp(api).then(function(response){
console.log(response);
},function(err){
console.log(err);
})
}
},
mounted(){//执行请求数据方法
this.requestData();
}
20.Vue路由编程式的导航 以及vue路由History 模式 hash 模式
JS来跳转页面(路由跳转)——登录页面成功来确定
官方文档有错误 goNews(){
对象
this.$router.push({path:'news'});
this.$router.push({path:'content/495'});
命名路由
this.$router.push({name:'user',params:{userId:123}})
{ path: '/news', component: News, name:'news' },
this.$router.push({name:'news'});
}
hash模式转换为history模式const router = new VueRouter({
mode: 'history',
routes: [...]
})
21.Vue中路由的嵌套
{ path: '/user',
component: User,
children:[
{
path: 'useradd',
component: UserAdd
},
{
path: 'userlist',
component: UserList
}
]
},
22.Vue UI框架Mint UI的使用 button 索引列表 ActionSheet等
饿了么公司基于vue开的的vue的Ui组件库
Element Ui 基于vue pc端的UI框架
MintUi 基于vue 移动端的ui框架
import Mint from 'mint-ui';
Vue.use(Mint);
import 'mint-ui/lib/style.css'
@click.native
创建项目的时候必须选SCSS23.Vue UI框架Mint Ui infinite-scroll结合api接口实现真实上拉分页加载更多
无限滚动指令。
j为全局变量——j=0
loadMore(){
for(var i=0;i<20;i++,this.j++){
this.list.push('第'+this.j+'条');
}
console.log('Yes');
}
loadMore(){
this.requestData();
},
requestData(){
this.loading=true; /*请求数据的开关 */
var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page='+this.page;
this.$http.get(api).then((response)=>{
console.log(response);
this.list=this.list.concat(response.body.result);
++this.page; /*每次请求完成page++ */
this.loading=false; /*请求数据的开关 */
/*判断最后一页是否有数据 */
if(response.body.result.length<20){
this.loading=true; /*终止请求 */
}else{
this.loading=false; /*继续请求 */
}
},(err)=>{
console.log(err);
})
}
24.Vue UI框架 ElementUi的使用 以及webpack.config.js配置
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
http://element.eleme.io/1.4/#/zh-CN/component/quickstart {
test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/,
loader: 'file-loader'
}
element UI组件的单独使用(第一种方法):
{
"presets": [
["env", { "modules": false }],
"stage-3"
]
}
改为 注意:
{
"presets": [["env", { "modules": false }]],
"plugins": [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
]
]
}
import { Button, Select } from 'element-ui';
Vue.use(Button)
Vue.use(Select)
element UI组件的单独使用(第二种方法):
import { Button, Select } from 'element-ui';
Vue.use(Button)
Vue.use(Select)
引入对应的css
import 'element-ui/lib/theme-chalk/index.css';
如果报错: webpack.config.js 配置file_loader
{
test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/,
loader: 'file-loader'
}
或者加class配置图标的样式
25.Vue UI框架 ElementUi 按需引入
按需引入
把
{
"presets": [
["env", { "modules": false }],
"stage-3"
]
}
改为 注意:
{
"presets": [["env", { "modules": false }]],
"plugins": [
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
]
]
}
import { Button, Select } from 'element-ui';
Vue.use(Button)
Vue.use(Select)
import { Button, Select } from 'element-ui';
Vue.use(Button)
Vue.use(Select)
引入对应的css
import 'element-ui/lib/theme-chalk/index.css';
如果报错: webpack.config.js 配置file_loader
{
test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/,
loader: 'file-loader'
}
26.vue 路由模块化
单独一个文件//引入库
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter);
import Home from '../components/Home.vue';
import News from '../components/News.vue';
import Content from '../components/Content.vue';
import Pcontent from '../components/Pcontent.vue';
import User from '../components/User.vue';
import UserAdd from '../components/User/UserAdd.vue';
import UserList from '../components/User/UserList.vue';
const routes = [
{ path: '/home', component: Home },
{ path: '/user',
component: User,
children:[
{
path: 'useradd',
component: UserAdd
},
{
path: 'userlist',
component: UserList
}
]
},
{ path: '/news', component: News, name:'news' },
{ path: '/content/:aid', component: Content }, /*动态路由*/
{ path: '/pcontent', component: Pcontent },
{ path: '*', redirect: '/home' } /*默认跳转路由*/
]
const router = new VueRouter({
mode: 'history',
routes
})
export default router;
27.Vuex 的使用 State Mutation 实现多个页面共享计数
来自不同组件的行为需要变更同一状态。我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。
不是父子组件 也不是兄弟组件 也不是之前非父子组件一样
小项目用localStorage实现、SessionStorage实现数据共享
大项目就用Vuex
小项目不部建议用vuexvuex的使用:
cnpm install vuex --save
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
/*1.state在vuex中用于存储数据*/
var state={
count:1
}
var mutations={
incCount(){
++state.count;
}
}
暴露
const store = new Vuex.Store({
state,
mutations
})
export default store;
组件里面使用vuex:
import store from '../vuex/store.js';
export default{
data(){
return {
msg:'我是一个home组件',
value1: null,
}
},
store,
methods:{
incCount(){
this.$store.commit('incCount'); /*触发 state里面的数据*/
}
}
}
`this.$store.state.数据`
this.$store.commit('incCount');
你可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload):28.Vuex 的使用 State Mutation Getter Action 以及实现不同组件新闻数据共享 以及新闻数据的持久化
getter :改变数据时做一些操作vuex的使用:
cnpm install vuex --save
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
/*1.state在vuex中用于存储数据*/
var state={
count:1
}
var mutations={
incCount(){
++state.count;
}
}
var getters= {
computedCount: (state) => {
return state.count*2
}
}
Action 类似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。
var actions= {
incMutationsCount(context) { /*因此你可以调用 context.commit 提交一个 mutation*/
context.commit('incCount'); /*执行 mutations 里面的incCount方法 改变state里面的数据*/
}
}
暴露
const store = new Vuex.Store({
state,
mutations,
getters,
actions
})
export default store;
组件里面使用vuex:
` import store from '../vuex/store.js';`
export default{
data(){
return {
msg:'我是一个home组件',
value1: null,
}
},
store,
methods:{
incCount(){
this.$store.commit('incCount'); /*触发 state里面的数据*/
}
}
}
` this.$store.state.数据`
`this.$store.commit('incCount');`
`this.$store.dispatch('incCount');`
{{this.$store.getters.computedCount}}