GitHub50K+Star的前后端分离的仿饿了么Vue大型单页面应用项目
The following article is from TJ君 Author TJ
今天TJ君和大家分享一个前后端分离的模仿饿了么页面的项目。在GitHub上已经累计了近50K+的star(前端+后端)
前端是基于vue2 + vuex
构建的一个具有45个页面的大型单页面应用;
后端是基于node.js + Mongodb
构建的后台系统。
使用的技术栈包含:
nodejs + express + mongodb + mongoose + es6/7 + vue + element-ui
对于想学习vue实战的小伙伴是个不错的学习目标。前端项目根据饿了么官网接口,总共包含了各种功能的45个页面,例如注册、登录、商品展示、购物车、下单等,就是模拟了一个完整的饿了么买外卖流程,TJ君觉得基本上你要是学会了这个项目的话,一般市面上公司要做的单页面应用都可以驾轻就熟了。后端系统也保持了和饿了么官网一致的API接口。
例如:
这里要提醒下的是,项目里运用了不少ES6/7的属性,这方面不太熟悉的小伙伴可以看这里(元宵节,找点开源免费的学习资料,一起来提升下ECMAScript能力!),TJ君之前专门介绍过关于ES6的学习资料。
前端启动项目的话只需要下载代码,执行如下命令:
cd vue2-elm
npm install 或 yarn(推荐)
npm run dev
后端也是类似:
cd node-elm
npm install 或 yarn(推荐)
npm run dev
访问: http://localhost:8001(如果已启动前台程序,则不需打开此地址)
这里需要注意的是,如果想体验前后台同时开发,此时启动本项目的命令为:npm run local
而不是 npm run dev
。
目前已经实现的功能包含:
定位功能 选择城市 搜索地址 展示所选地址附近商家列表 搜索美食,餐馆 -- 完成 根据距离、销量、评分、特色菜、配送方式等进行排序和筛选 餐馆食品列表页 购物车功能 店铺评价页面 单个食品详情页面 商家详情页 登录、注册 修改密码 个人中心 发送短信、语音验证 下单功能 订单列表 订单详情 下载App 添加、删除、修改收货地址 帐户信息 服务中心 红包 上传头像
不过要注意的是,这只是一个模仿效果项目,真的要想下单点外卖的话,还是要用饿了么的官方应用哦...
我们看下实际做出来的项目效果:
商铺页面:
加入购物车页面:
确认订单页面:
登陆界面、个人界面:
是不是还原度很高?那最后我们再来看下程序代码结构,大家一起来学习下吧:
前端:
.
├── build // webpack配置文件
├── config // 项目打包路径
├── elm // 上线项目文件,放在服务器即可正常访问
├── screenshots // 项目截图
├── src // 源码目录
│ ├── components // 组件
│ │ ├── common // 公共组件
│ │ │ ├── alertTip.vue // 弹出框组件
│ │ │ ├── buyCart.vue // 购物车组件
│ │ │ ├── computeTime.vue // 倒计时组件
│ │ │ ├── loading.vue // 页面初始化加载数据的动画组件
│ │ │ ├── mixin.js // 组件混合(包括:指令-下拉加载更多,处理图片地址)
│ │ │ ├── ratingStar.vue // 评论的五颗星组件
│ │ │ └── shoplist.vue // msite和shop页面的餐馆列表公共组件
│ │ ├── footer
│ │ │ └── footGuide.vue // 底部公共组件
│ │ └── header
│ │ └── head.vue // 头部公共组件
│ ├── config // 基本配置
│ │ ├── env.js // 环境切换配置
│ │ ├── fetch.js // 获取数据
│ │ ├── mUtils.js // 常用的js方法
│ │ └── rem.js // px转换rem
│ ├── images // 公共图片
│ ├── page
│ │ ├── balance
│ │ │ ├── balance.vue // 余额页
│ │ │ └── children
│ │ │ └── detail.vue // 余额说明
│ │ ├── benefit
│ │ │ ├── benefit.vue // 红包页
│ │ │ └── children
│ │ │ ├── commend.vue // 推荐有奖
│ │ │ ├── coupon.vue // 代金券说明
│ │ │ ├── exchange.vue // 兑换红包
│ │ │ ├── hbDescription.vue // 红包说明
│ │ │ └── hbHistory.vue // 历史红包
│ │ ├── city
│ │ │ └── city.vue // 当前城市页
│ │ ├── confirmOrder
│ │ │ ├── children
│ │ │ │ ├── children
│ │ │ │ │ ├── addAddress.vue // 添加地址页
│ │ │ │ │ └── children
│ │ │ │ │ └── searchAddress.vue // 搜索地址页
│ │ │ │ ├── chooseAddress.vue // 选择地址页
│ │ │ │ ├── invoice.vue // 选择发票页
│ │ │ │ ├── payment.vue // 付款页
│ │ │ │ ├── remark.vue // 订单备注页
│ │ │ │ └── userValidation.vue // 用户验证页
│ │ │ └── confirmOrder.vue // 确认订单页
│ │ ├── download
│ │ │ └── download.vue // 下载App
│ │ ├── find
│ │ │ └── find.vue // 发现页
│ │ ├── food
│ │ │ └── food.vue // 食品筛选排序页
│ │ ├── forget
│ │ │ └── forget.vue // 忘记密码,修改密码页
│ │ ├── home
│ │ │ └── home.vue // 首页
│ │ ├── login
│ │ │ └── login.vue // 登录注册页
│ │ ├── msite
│ │ │ └── msite.vue // 商铺列表页
│ │ ├── order
│ │ │ ├── children
│ │ │ │ └── orderDetail.vue // 订单详情页
│ │ │ └── order.vue // 订单列表页
│ │ ├── points
│ │ │ ├── children
│ │ │ │ └── detail.vue // 积分说明
│ │ │ └── points.vue // 积分页
│ │ ├── profile
│ │ │ ├── children
│ │ │ │ ├── children
│ │ │ │ │ ├── address.vue // 地址
│ │ │ │ │ └── children
│ │ │ │ │ ├── add.vue // 新增地址
│ │ │ │ │ └── children
│ │ │ │ │ └── addDetail.vue // 搜索地址
│ │ │ │ ├── info.vue // 帐户信息
│ │ │ │ └── setusername.vue // 重置用户名
│ │ │ └── profile.vue // 个人中心
│ │ ├── search
│ │ │ └── search.vue // 搜索页
│ │ ├── service
│ │ │ ├── children
│ │ │ │ └── questionDetail.vue // 问题详情
│ │ │ └── service.vue // 服务中心
│ │ ├── shop
│ │ │ ├── children
│ │ │ │ ├── children
│ │ │ │ │ └── shopSafe.vue // 商铺认证信息页
│ │ │ │ ├── foodDetail.vue // 商铺信息页
│ │ │ │ └── shopDetail.vue // 单个商铺信息页
│ │ │ └── shop.vue // 商铺筛选页
│ │ └── vipcard
│ │ ├── children
│ │ │ ├── invoiceRecord.vue // 购买记录
│ │ │ ├── useCart.vue // 使用卡号购买
│ │ │ └── vipDescription.vue // 会员说明
│ │ └── vipcard.vue // 会员卡办理页
│ ├── plugins // 引用的插件
│ ├── router
│ │ └── router.js // 路由配置
│ ├── service // 数据交互统一调配
│ │ ├── getData.js // 获取数据的统一调配文件,对接口进行统一管理
│ │ └── tempdata // 开发阶段的临时数据
│ ├── store // vuex的状态管理
│ │ ├── action.js // 配置actions
│ │ ├── getters.js // 配置getters
│ │ ├── index.js // 引用vuex,创建store
│ │ ├── modules // store模块
│ │ ├── mutation-types.js // 定义常量muations名
│ │ └── mutations.js // 配置mutations
│ └── style
│ ├── common.scss // 公共样式文件
│ ├── mixin.scss // 样式配置文件
│ └── swiper.min.css
│ ├── App.vue // 页面入口文件
│ ├── main.js // 程序入口文件,加载各种公共组件
├── favicon.ico // 图标
├── index.html // 入口html文件
.
56 directories, 203 files
后端:
.
├── InitData 初始化数据
│ ├── activity.js 餐馆活动
│ ├── category.js 餐馆分类
│ ├── cities.js 城市列表
│ ├── delivery.js 配送方式
│ ├── entry.js 食品分类
│ ├── explain.js 解释说明
│ ├── hongbao.js 红包
│ ├── payments.js 支付方式
│ ├── rate.js 评论
│ └── remark.js 备注列表
├── config 运行配置
│ ├── default.js 默认配置
│ └── development.js 开发环境
├── controller 处理中心,负责路由及数据库的具体操作
│ ├── admin
│ │ └── admin.js 管理员
│ ├── bos
│ ├── eus
│ ├── member
│ │ └── vipcart.js 会员卡
│ ├── payapi
│ ├── promotion
│ │ └── hongbao.js 红包
│ ├── shopping
│ │ ├── category.js 餐馆分类
│ │ ├── food.js 食品
│ │ └── shop.js 餐馆
│ ├── statis
│ │ └── statis.js 数据统计
│ ├── ugc
│ │ └── rating.js 评论
│ ├── v1
│ │ ├── address.js 收获地址
│ │ ├── captchas.js 验证码
│ │ ├── carts.js 购物车
│ │ ├── cities.js 城市列表
│ │ ├── order.js 订单
│ │ ├── remark.js 备注
│ │ └── search.js 搜索
│ ├── v2
│ │ ├── entry.js 食品分类
│ │ └── user.js 用户信息
│ ├── v3
│ │ └── explain.js 解析说明
│ └── v4
├── logs 日志文件
├── middlewares 中间件
│ ├── check.js 权限验证
│ └── statistic.js API数据统计
├── models 模型(数据库)
│ ├── admin
│ │ └── admin.js 管理员模型
│ ├── bos
│ │ └── order.js 订单模型
│ ├── eus
│ ├── ids.js
│ ├── member
│ ├── payapi
│ ├── promotion
│ │ └── hongbao.js 红包模型
│ ├── shopping
│ │ ├── activity.js 餐馆活动模型
│ │ ├── category.js 餐馆分类模型
│ │ ├── delivery.js 配送方式模型
│ │ ├── food.js 食品模型
│ │ └── shop.js 餐馆模型
│ ├── statis
│ │ └── statis.js 数据统计模型
│ ├── ugc
│ │ └── rating.js 评论模型
│ ├── v1
│ │ ├── address.js 收获地址模型
│ │ ├── cart.js 购物车模型
│ │ ├── cities.js 城市列表模型
│ │ ├── payments.js 付款方式模型
│ │ └── remark.js 备注模型
│ ├── v2
│ │ ├── entry.js 食品分类模型
│ │ ├── user.js 用户模型
│ │ └── userInfo.js 用户信息模型
│ ├── v3
│ │ └── explain.js 解释说明模型
│ └── v4
├── mongodb 连接数据库
│ └── db.js
├── prototype 基础功能Class
│ ├── addressComponent.js 与腾讯、百度地图API相关的Class
│ └── baseComponent.js 底层类
├── public 静态资源目录
├── routes 路由配置
│ ├── admin.js 管理员
│ ├── bos.js 订单
│ ├── eus.js 用户
│ ├── index.js 路由配置主文件
│ ├── member.js 会员卡
│ ├── payapi.js 付款
│ ├── promotion.js 红包
│ ├── shopping.js 餐馆、食品、Menu
│ ├── statis.js 数据统计
│ ├── ugc.js 评论
│ ├── v1.js 城市、用户、收获地址
│ ├── v2.js 登陆、退出
│ ├── v3.js 解释说明
│ └── v4.js 餐馆
├── screenshots 项目截图
├── views
├── .babelrc
├── .gitignore
├── API.md 接口文档
├── app.js 基础配置
├── COPYING GPL协议
├── index.js 入口文件
├── package.json
├── README.md
.
47 directories, 197 files
点击下方卡片,关注公众号“TJ君”
回复“饿了么2022”,获取仓库地址
关注我,每天了解一个牛x、好用、有趣的东东