关于项目
这是一个点餐系统,包含用户点餐、商家出餐、管理员管理三部分功能
这个项目本来是校内实训,需要用java编写,我负责一部分。但是我不太喜欢用java,且时间足够,就自己独自做了一份,用于学习。
项目的功能和需求是根据前期小组讨论出来的,也基本都是仿饿了么的
各项功能基本都实现了
线上地址:(比较慢)47.93.254.91:3333
源码地址:chihuobao
|
|
功能结构
调试运行
|
|
|
|
页面截图
总体分析
使用的框架、插件等
- 用Vue-cli脚手架、vue-router、vuex
- 用element-ui样式框架
- 用axios发请求
- 用koa2做后台,在node高版本直接用async、await
- 用mongoose连接mongodb数据库
包含的功能
- 手机注册,登录,重置密码
- 用户点餐,该商家会收到消息提示有新订单(用轮询实现)
- 用户查看自己的订单,评价、删除等
- 修改自己的信息,申请成为商户等
- 商家管理订单,接单等
- 统计商家订单数,评分等(页面上的月销量是总销量)
- 商家管理菜单、查看评论
- 管理员管理用户、商铺、分类等
- 搜索功能
目录结构
顶层就是vue-cli的结构,主要看前端src和后台server的结构
|
|
|
|
开发过程
使用vue-cli
我之前用react,为了熟悉webpack就没有使用脚手架(如yeoman),深深感受到了babel的复杂,webpack配置的繁琐。用到vue-cli简直就是一个字:爽,各种复杂的配置都配好了,如使用sass下载后在style配置一下就好了,不用再到webpack配置,这些发杂的配置本该就不要重复做。现在Parceiljs打包工具也出来了,以后可以更爽快的开发了
对vue的感觉就是真的对新手很友好,官网教程很全,例子很多,上手快。
使用vuex + map辅助函数用起来很方便
下面是一个登陆的例子
|
|
|
|
|
|
数据的流向是单向的
开发遇到的问题
vuex分模块的修改
一开始没有分模块是这样写的
|
|
分了模块写法有区别的
|
|
父子组件通信
一般父子组件,是父组件向子组件传入数据,子组件显示数据,数据单向流动。
当子组件需要传递数据给父组件时,通过触发函数,以参数的形式向父组件传递数据,跟react数据传递一样
|
|
上面的例子中,不能修改父组件传入的数据。若要修改数据,则需要在$emit前复制一份数据然后修改,再传递给父组件,也可以用sync实现父子组件数据双向绑定。sync在2.0被移除因为这破坏了单向数据流,但2.3又引入了,因为有场景需要如一些复用的组件。但sync和以前的实现又有点不一样,它只是一个语法糖,会被扩展为一个自动更新父组件属性的 v-on 监听器。
并且子组件需要显示触发更新:this.$emit(‘update:xx’, newVal)
|
|
element-ui设置样式无效
使用了element-ui样式框架,有时需要对他们的组件做一些样式的修改。但它是封装好的,我就需要查看源代码才知道它内部定义的类或标签来自定义样式,但是发现无效,举个例子
|
|
监听$route要仔细
在查看商铺页面,可以选择不同类型商家,也可以搜索商家,可以有不同的实现方法。可以把状态全放在在组件内或vuex管理,但是这样刷新后状态就消失了。所以我选择用url的hash来保存状态,通过监听路由变化来加载不同数据。商家列表数据放在vuex
|
|
后面使用时,发现了bug:在别的页面变动路由,这里会加载了重复的数据。所以要限定监听路由变动的路由,在本页面才有效
|
|
然后又发现bug:从别的页面回到这里,也加载了重复的数据,解决办法是离开组件时把原数据删除。要这样做是因为我把数据存入了vuex,感觉不必要存入vuex..
|
|
请求异常跳转登录页
请求有时需要出现异常如401,需要让用户重新登录,我用的是axios
|
|
koa2基本配置
使用koa生成器初始化项目
|
|
加入session中间件
|
|
设置静态资源缓存
|
|
传输文件压缩
|
|
mongoose使用遇到的坑
在建表时需要注意数据类型,若schema定义是Number,存入的却是String,会报错。
若schema没有定义字段,创建collection时传入其他字段,会存不进去
数据库的Number数据,用字符查找会找不到如:user.find({age: ‘18’})
moment解决mongodb时区问题
mongodb用的是中时区的时间,我们是东八区,所以时间都会晚8小时,用moment插件处理
moment是用在客户端,而不是存储。存储的数据是中时区的,在显示数据时修正
因为moment很多地方都要用,所以我直接将它放入Vue的原型,这样所有vue实例都可以拿到这个方法
|
|
其他
传输数据格式转换
用post传输数据,用x-www-form-urlencoded格式,但是表单里有个对象数组:
|
|
我用node做后台,拿这个数据一点问题都没有,但是小组内跟java后台配合,不能这样传对象数组字符串。他需要直接用List<>包装,需要这样传递才行
看到这样的取值,我想:卧槽,还有这样传的。。
虽然感觉很不合理,但还是做了转换。下面的代码就能达到这个目的
|
|
mongodb导入数据
server/db_vue
路径是导出的数据,可以导入到自己的mongodb数据库
|
|
总结
总体来说,项目结构还算清晰,我对Vue还不是很熟悉,所以运用的还不是很好,比如使用Vuex的使用,我对于不同组件需要共享的数据存入store或同时存在本地,对于单个组件内的数据,感觉没必要存入store。
对koa2也不是很熟悉,一开始总是忘记await等各种小问题,写完虽然做了缓存压缩,因为不是一个后端,所以性能上还是弄不好,线上的可能比较卡,因为是学生服务器。
写完这个对Vue熟悉一点了,接下来会继续学学Vue的原理,学学新东西
以上就是对项目的总结,如果有错,望指正