123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=no,minimal-ui">
- <title>菩提阁</title>
- <link rel="icon" href="images/favico.ico">
- <!--不同屏幕尺寸根字体设置-->
- <script src="js/base.js"></script>
- <!--element-ui的样式-->
- <link rel="stylesheet" href="../backend/plugins/element-ui/index.css" />
- <!--引入vant样式-->
- <link rel="stylesheet" href="styles/vant.min.css"/>
- <!-- 引入样式 -->
- <link rel="stylesheet" href="styles/index.css" />
- <!--本页面内容的样式-->
- <link rel="stylesheet" href="styles/main.css" />
- </head>
- <body>
- <div id="main" class="app">
- <div class="divHead">
- <img src="images/user.png" @click="toUserPage"/>
- </div>
- <div class="divTitle">
- <div class="divStatic">
- <img src="images/logo.png" class="logo"/>
- <div class="divDesc">
- <div class="divName">菩提阁餐厅</div>
- <div class="divSend">
- <span><img src="images/time.png"/> 距离1.5km</span>
- <span><img src="images/money.png"/> 配送费6元</span>
- <span><img src="images/location.png"/> 预计时长12min</span>
- </div>
- </div>
- </div>
- <div class="divDesc">
- 简介: 菩提阁中餐厅是菩提阁点餐的独立的品牌,定位“大众 化的美食外送餐饮”,旨为顾客打造专业美食。
- </div>
- </div>
- <div class="divBody">
- <div class="divType">
- <ul>
- <li v-for="(item,index) in categoryList" :key="index" @click="categoryClick(index,item.id,item.type)" :class="{active:activeType === index}">{{item.name}}</li>
- </ul>
- </div>
- <div class="divMenu">
- <div>
- <div class="divItem" v-for="(item,index) in dishList" :key="index" @click="dishDetails(item)">
- <el-image :src="imgPathConvert(item.image)" >
- <div slot="error" class="image-slot">
- <img src="images/noImg.png"/>
- </div>
- </el-image>
- <div>
- <div class="divName">{{item.name}}</div>
- <div class="divDesc">{{item.description}}</div>
- <div class="divDesc">{{'月销' + (item.saleNum ? item.saleNum : 0) }}</div>
- <div class="divBottom"><span>¥</span><span>{{item.price/100}}</span></div>
- <div class="divNum">
- <div class="divSubtract" v-if="item.number > 0">
- <img src="images/subtract.png" @click.prevent.stop="subtractCart(item)"/>
- </div>
- <div class="divDishNum">{{item.number}}</div>
- <div class="divTypes" v-if="item.flavors && item.flavors.length > 0 && !item.number " @click.prevent.stop="chooseFlavorClick(item)">选择规格</div>
- <div class="divAdd" v-else>
- <img src="images/add.png" @click.prevent.stop="addCart(item)"/>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="divLayer">
- <div class="divLayerLeft"></div>
- <div class="divLayerRight"></div>
- </div>
- <div class="divCart" v-if="categoryList.length > 0">
- <div :class="{imgCartActive: cartData && cartData.length > 0, imgCart:!cartData || cartData.length<1}" @click="openCart"></div>
- <div :class="{divGoodsNum:1===1, moreGoods:cartData && cartData.length > 99}" v-if="cartData && cartData.length > 0">{{ goodsNum }}</div>
- <div class="divNum">
- <span>¥</span>
- <span>{{goodsPrice}}</span>
- </div>
- <div class="divPrice"></div>
- <div :class="{btnSubmitActive: cartData && cartData.length > 0, btnSubmit:!cartData || cartData.length<1}" @click="toAddOrderPage">去结算</div>
- </div>
- <van-dialog v-model="dialogFlavor.show" :show-confirm-button="false" class="dialogFlavor" ref="flavorDialog">
- <div class="dialogTitle">{{dialogFlavor.name}}</div>
- <div class="divContent">
- <div v-for="flavor in dialogFlavor.flavors" :key="flavor.id">
- <div class="divFlavorTitle">{{flavor.name}}</div>
- <span v-for="item in JSON.parse(flavor.value)"
- :key="item"
- @click="flavorClick(flavor,item)"
- :class="{spanActive:flavor.dishFlavor === item}"
- >{{item}}</span>
- </div>
- </div>
- <div class="divBottom">
- <div><span class="spanMoney">¥</span>{{dialogFlavor.price/100}}</div>
- <div @click="dialogFlavorAddCart">加入购物车</div>
- </div>
- <div class="divFlavorClose" @click="dialogFlavor.show = false">
- <img src="images/close.png"/>
- </div>
- </van-dialog>
- <van-popup v-model="cartDialogShow" position="bottom" :style="{ height: '50%' }" class="dialogCart">
- <div class="divCartTitle">
- <div class="title">购物车</div>
- <div class="clear" @click="clearCart">
- <i class="el-icon-delete"></i> 清空
- </div>
- </div>
- <div class="divCartContent">
- <div v-for="item in cartData" :key="item.id" class="divCartItem">
- <el-image :src="imgPathConvert(item.image)" >
- <div slot="error" class="image-slot">
- <img src="images/noImg.png"/>
- </div>
- </el-image>
- <div class="divDesc">
- <div class="name">{{item.name}}</div>
- <div class="price">
- <span class="spanMoney">¥</span>{{item.amount}}</div>
- </div>
- <div class="divNum">
- <div class="divSubtract">
- <img src="images/subtract.png" @click="cartNumberSubtract(item)"/>
- </div>
- <div class="divDishNum">{{item.number}}</div>
- <div class="divAdd">
- <img src="images/add.png" @click="cartNumAdd(item)"/>
- </div>
- </div>
- <div class="divSplit"></div>
- </div>
- </div>
- </van-popup>
- <van-dialog v-model="detailsDialog.show"
- :show-confirm-button="false"
- class="detailsDialog"
- ref="detailsDialog"
- v-if="detailsDialog.show"
- >
- <div class="divContainer">
- <el-image :src="imgPathConvert(detailsDialog.item.image)" >
- <div slot="error" class="image-slot">
- <img src="images/noImg.png"/>
- </div>
- </el-image>
- <div class="title">{{detailsDialog.item.name}}</div>
- <div class="content">{{detailsDialog.item.description}}</div>
- </div>
- <div class="divNum">
- <div class="left">
- <span>¥</span><span>{{detailsDialog.item.price/100}}</span>
- </div>
- <div class="right">
- <div class="divSubtract" v-if="detailsDialog.item.number > 0">
- <img src="images/subtract.png" @click="subtractCart(detailsDialog.item)"/>
- </div>
- <div class="divDishNum">{{detailsDialog.item.number}}</div>
- <div class="divTypes" v-if="detailsDialog.item.flavors && detailsDialog.item.flavors.length > 0 && !detailsDialog.item.number " @click ="chooseFlavorClick(detailsDialog.item)">选择规格</div>
- <div class="divAdd" v-else>
- <img src="images/add.png" @click="addCart(detailsDialog.item)"/>
- </div>
- </div>
- </div>
- <div class="detailsDialogClose" @click="detailsDialog.show = false">
- <img src="images/close.png"/>
- </div>
- </van-dialog>
- <van-dialog v-model="setMealDialog.show"
- :show-confirm-button="false"
- class="setMealDetailsDialog"
- ref="setMealDetailsDialogd"
- v-if="setMealDialog.show"
- >
- <div class="divContainer">
- <div class="title">{{setMealDialog.item.name}}</div>
- <div class="item" v-for="(item,index) in setMealDialog.item.list" :key="index">
- <el-image :src="imgPathConvert(item.image)">
- <div slot="error" class="image-slot">
- <img src="images/noImg.png"/>
- </div>
- </el-image>
- <div class="divSubTitle">{{item.name + '(' + item.copies + '份)' }}
- <div class="divPrice">
- <span>¥</span><span>{{item.price/100}}</span>
- </div>
- </div>
- <div class="content">{{item.description}}</div>
- </div>
- </div>
- <div class="divNum">
- <div class="left">
- <span>¥</span><span>{{setMealDialog.item.price/100}}</span>
- </div>
- <div class="right">
- <div class="divSubtract" v-if="setMealDialog.item.number > 0">
- <img src="images/subtract.png" @click="subtractCart(setMealDialog.item)"/>
- </div>
- <div class="divDishNum">{{setMealDialog.item.number}}</div>
- <div class="divAdd" v-if="setMealDialog.item.number">
- <img src="images/add.png" @click="addCart(setMealDialog.item)"/>
- </div>
- <div class="addCart" @click="addCart(setMealDialog.item)" v-if="!setMealDialog.item.number">加入购物车</div>
- </div>
- </div>
- <div class="detailsDialogClose" @click="setMealDialog.show = false">
- <img src="images/close.png"/>
- </div>
- </van-dialog>
- </div>
- <!-- 开发环境版本,包含了有帮助的命令行警告 -->
- <script src="../backend/plugins/vue/vue.js"></script>
- <!-- 引入组件库 -->
- <script src="../backend/plugins/element-ui/index.js"></script>
- <!-- 引入vant样式 -->
- <script src="js/vant.min.js"></script>
- <!-- 引入axios -->
- <script src="../backend/plugins/axios/axios.min.js"></script>
- <script src="js/request.js"></script>
- <script src="js/common.js"></script>
- <script src="api/main.js"></script>
- </body>
- <script>
- new Vue({
- el:'#main',
- data(){
- return {
- //左边菜品类别index
- activeType:0,
- categoryList:[],
- categoryId:undefined,
- dishList:[],
- cartData:[],
- dialogFlavor:{
- name:'',
- flavors:[],
- dishId:undefined,
- price:undefined,
- show:false,
- image:''
- },
- cartDialogShow:false,
- detailsDialog:{
- show:false,
- item:{image:''}
- },
- setMealDialog:{
- show:false,
- item:{}
- },
- }
- },
- computed:{
- goodsNum(){
- let num = 0
- this.cartData.forEach(item=>{
- num += item.number
- })
- if(num <99){
- return num
- }else{
- return '99+'
- }
- },
- goodsPrice(){
- let price = 0
- this.cartData.forEach(item=>{
- price += (item.number * item.amount)
- })
- return price
- }
- },
- created(){
- },
- watch:{
- 'dialogFlavor.show'(flag){
- if(flag){
- document.querySelector('.divCart').style.zIndex = 1
- }else{
- document.querySelector('.divCart').style.zIndex = 3000
- }
- },
- },
- mounted(){
- this.initData()
- },
- methods:{
- //初始化数据
- initData(){
- Promise.all([categoryListApi(),cartListApi({})]).then(res=>{
- //获取分类数据
- if(res[0].code === 1){
- this.categoryList = res[0].data
- if(Array.isArray(res[0].data) && res[0].data.length > 0){
- this.categoryId = res[0].data[0].id
- if(res[0].data[0].type === 1){
- this.getDishList()
- }else{
- this.getSetmealData()
- }
- }
- }else{
- this.$notify({ type:'warning', message:res[0].msg});
- }
- //获取菜品数据
- if(res[1].code === 1){
- this.cartData = res[1].data
- }else{
- this.$notify({ type:'warning', message:res[1].msg});
- }
- })
- },
- //分类点击
- categoryClick(index,id,type){
- this.activeType = index
- this.categoryId = id
- if(type === 1){//菜品
- this.getDishList()
- }else{
- this.getSetmealData()
- }
- },
- //获取菜品数据
- async getDishList(){
- if(!this.categoryId){
- return
- }
- const res = await dishListApi({categoryId:this.categoryId,status:1})
- if(res.code === 1){
- let dishList = res.data
- const cartData = this.cartData
- if(dishList.length > 0 && cartData.length > 0){
- dishList.forEach(dish=>{
- cartData.forEach(cart=>{
- if(dish.id === cart.dishId){
- dish.number = cart.number
- }
- })
- })
- }
- this.dishList = dishList
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
- //获取套餐数据setmealId
- async getSetmealData(){
- if(!this.categoryId){
- return
- }
- const res = await setmealListApi({categoryId:this.categoryId,status:1})
- if(res.code === 1){
- let dishList = res.data
- const cartData = this.cartData
- if(dishList.length > 0 && cartData.length > 0){
- dishList.forEach(dish=>{
- cartData.forEach(cart=>{
- if(dish.id === cart.setmealId){
- dish.number = cart.number
- }
- })
- })
- }
- this.dishList = dishList
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
- //获取购物车数据
- async getCartData(){
- const res = await cartListApi({})
- if(res.code === 1){
- this.cartData = res.data
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
- //菜单中往购物车中添加商品
- async addCart(item){
- let params = {
- amount:item.price/100,//金额
- dishFlavor:item.dishFlavor,//口味 如果没有传undefined
- dishId:undefined,//菜品id
- setmealId:undefined,//套餐id
- name:item.name,
- image:item.image
- }
- if(Array.isArray(item.flavors)){//表示是菜品
- params.dishId = item.id
- }else{//表示套餐 套餐没有口味
- params.setmealId = item.id
- }
- const res = await addCartApi(params)
- if(res.code === 1){
- this.dishList.forEach(dish=>{
- if(dish.id === item.id){
- dish.number = res.data.number
- }
- })
- if(this.setMealDialog.show){
- item.number = res.data.number
- }
- this.getCartData()
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
- //菜单中减少选中的商品
- async subtractCart(item){
- let params = {
- dishId:item.id,
- }
- if(!Array.isArray(item.flavors)){
- params = {
- setmealId:item.id,
- }
- }
- const res = await updateCartApi(params)
- if(res.code === 1){
- this.dishList.forEach(dish=>{
- if(dish.id === item.id){
- dish.number = (res.data.number === 0 ? undefined : res.data.number)
- }
- })
- if(this.setMealDialog.show){
- item.number = (res.data.number === 0 ? undefined : res.data.number)
- }
- this.getCartData()
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
-
- //展开购物车
- openCart(){
- if(this.cartData.length > 0){
- this.cartDialogShow = true
- }
- },
- //购物车中增加商品数量
- async cartNumAdd(item){
- let params = {
- amount:item.amount,//金额
- dishFlavor:item.dishFlavor,//口味 如果没有传undefined
- dishId:item.dishId,//菜品id
- setmealId:item.setmealId,//套餐id
- name:item.name,
- image:item.image
- }
- const res = await addCartApi(params)
- if(res.code === 1){
- this.dishList.forEach(dish=>{
- if(dish.id === (item.dishId || item.setmealId)){
- dish.number = res.data.number
- }
- })
- console.log(this.dishList)
- this.getCartData()
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
- //购物车中减少商品数量
- async cartNumberSubtract(item){
- let params = {
- dishId:item.dishId,
- setmealId:item.setmealId,
- }
- const res = await updateCartApi(params)
- if(res.code === 1){
- this.dishList.forEach(dish=>{
- if(dish.id === (item.dishId || item.setmealId)){
- dish.number = (res.data.number === 0 ? undefined : res.data.number)
- }
- })
- this.getCartData()
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
-
- //修改商品列表中的数据number
- changeDishList(item){
- for(let ele of this.dishList){
- if(ele.id === (item.setmealId || item.dishId)){
- ele.number = item.number
- }
- }
- },
-
- //清空购物车
- async clearCart(){
- const res = await clearCartApi()
- if(res.code === 1){
- for(let ele of this.dishList){
- ele.number = undefined
- }
- this.cartData = []
- this.cartDialogShow = false
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- },
- //点击选择规格
- chooseFlavorClick(item){
- this.dialogFlavor = {
- name:'',
- flavors:[],
- dishId:undefined,
- price:undefined,
- show:false
- }
- this.dialogFlavor={
- name:item.name,
- flavors:item.flavors,
- dishId:item.id,
- price:item.price,
- show:true,
- image:item.image
- }
- },
- flavorClick(flavor,item){
- flavor.dishFlavor = item
- //强制刷新dialog的dom
- this.dialogFlavor.show = false
- this.dialogFlavor.show = true
- },
- //选择规格加入购物车
- dialogFlavorAddCart(){
- const dialogFlavor = this.dialogFlavor
- let flag = true
- let dishFlavor = []
- dialogFlavor.flavors.forEach(item=>{
- if(item.dishFlavor){
- dishFlavor.push(item.dishFlavor)
- }else{
- flag = false
- Notify({ type: 'warning', message: '请选择'+ item.name });
- }
- })
- if(flag){
- this.addCart({
- price:dialogFlavor.price,
- dishFlavor:dishFlavor.join(","),
- id:dialogFlavor.dishId,
- flavors:[],
- image:dialogFlavor.image,
- name:dialogFlavor.name
- })
- this.dialogFlavor.show = false
- }
-
- },
- //网络图片路径转换
- imgPathConvert(path){
- return imgPath(path)
- },
- //跳转到去结算界面
- toAddOrderPage(){
- if(this.cartData.length > 0){
- window.requestAnimationFrame(()=>{
- window.location.href ='/front/page/add-order.html'
- })
- }
- },
- toUserPage(){
- window.requestAnimationFrame(()=>{
- window.location.href= '/front/page/user.html'
- })
- },
- async dishDetails(item){
- //先清除对象数据,如果不行的话dialog使用v-if
- this.detailsDialog.item = {}
- this.setMealDialog.item = {}
- if(Array.isArray(item.flavors)){
- this.detailsDialog.item = item
- this.detailsDialog.show = true
- }else{
- //显示套餐的数据
- const res = await setMealDishDetailsApi(item.id)
- if(res.code === 1){
- this.setMealDialog.item = {...item,list:res.data}
- this.setMealDialog.show = true
- }else{
- this.$notify({ type:'warning', message:res.msg});
- }
- }
- }
- }
- })
- </script>
- </html>
|