• 【生活美好】h5_vue_paw_mall


    首先放上作者的github地址:
    https://github.com/yuanfang289/h5_vue_paw_mall
    接下来我们一起看代码
    main.js

    //main.js
    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import wx from 'weixin-js-sdk';
    import axios from 'axios';
    import Popup from './components/popup';
    import { Icon } from 'vant';
    import { Lazyload } from 'vant';
    import { Loading } from 'vant';
    import {localData, sessionData} from "./assets/js/storage.js";
    const debug = process.env.NODE_ENV !== 'production'
    Vue.prototype.localData = localData;
    Vue.prototype.sessionData=sessionData;
    
    // vant 
    Vue.use(Icon);
    Vue.use(Lazyload);
    Vue.use(Loading);
    // 注册时可以配置额外的选项
    Vue.use(Lazyload, {
      lazyComponent: true
    });
    
    
    Vue.prototype.$popup = Popup.install;
    axios.defaults.timeout = 5000 // 请求超时
    axios.defaults.baseURL = debug?'/api':''  // api vue.config.js 中配置的地址
    Vue.prototype.wx = wx;
    Vue.prototype.$axios = axios;
    Vue.config.productionTip = false;
    
    router.beforeEach((to,from,next)=>{
    	if(to.meta.title){
    		document.title = to.meta.title
    	}
    	next()
    })
    Vue.use(router);
    new Vue({
      router,
      axios,
      render: h => h(App),
    }).$mount('#app')
    
    

    与我们平时不一样的是这里引用了wexin-js-sdk

    //app.vue 入口
    <template>
      <div id="app">
        <router-view></router-view>
      </div>
    </template>
    
    <script>
    export default {
      name: 'app',
      components: {
        
      }
    }
    </script>
    
    <style>
    #app {
        display: flex;
        justify-content: center;
    }
    </style>
    
    

    接下来是router.js定义了页面渲染的顺序

    import Vue from 'vue'
     
    import Router from 'vue-router'
    
    import Home from '../pages/Home'
    
    import Detail from '../pages/Detail'
    
    import Exlist from '../pages/Exlist'
    
    import Success from '../pages/Success'
    
    Vue.use(Router)
    
    export default new Router({
      routes: [
       {
            path : '/',  //到时候地址栏会显示的路径
            name : 'Home',
            component :  Home   // Home是组件的名字,这个路由对应跳转到的组件。。注意component没有加“s”.
        },
        {
            path : '/detail',
            name : 'Detail',
            component :  Detail
        },
    	{
    	    path : '/exlist',
    	    name : 'Exlist',
    	    component :  Exlist,
    		meta:{
    		   title:'兑换记录'
    		}
    	},
    	{
    	    path : '/success',
    	    name : 'Success',
    	    component :  Success
    	}
    ],
        mode: "hash"
    })
    

    这个是首页的

    我们看下代码

    //Home.vue
    <template>
      <div class="hello">
    		<div class="user_info">
    			<div class="left">
    				<div class="head_img">
    					<img :src="userInfo.avatar || 'http://oss.icebear.me/static/image/noAnswers.png'" />
    					<!-- <van-icon size="1.04rem" :name="userInfo.avatar || 'http://oss.icebear.me/static/image/noAnswers.png'" /> -->
    				</div>
    				<div class="paw_info">
    					<p>熊掌余额</p>
    					<div class="num">
    						<img class="paw_icon" src="https://oss.icebear.me/static/image/icon/paw_icon.png" />
    						<span>{{userInfo.paw_num}}</span>
    					</div>
    				</div>
    			</div>
    			<router-link  :to="'/exlist'" class="right">
    				<span style="margin-right: 2px;">兑换记录</span><van-icon name="arrow" />
    			</router-link>
    		</div>
    		<!-- <van-pull-refresh v-model="refreshing" @refresh="onRefresh"> -->  <!-- :to="'/detail?id='+item.id" -->
    		  <van-list
    		    v-model="loading"
    		    :finished="finished"
    		    finished-text=" "
    		    @load="getGoodsList"
    		  >
    		  <div class="list">
    			<template v-for="item in list">
    				<div class="item" @click="goDetail(item)">  
    					<img :src="item.pic_url" />
    					<div class="p">
    						<p>
    							{{item.name}}
    						</p>
    					</div>
    					<div class="price">
    						<img class="paw_icon" src="https://oss.icebear.me/static/image/icon/paw_icon.png"/>
    						<span>{{item.paw_price}}</span>
    					</div>
    				</div>
    			</template>
    			<template v-if="list.length==0">
    				<div class="nodata">
    				   <img :src="nodataimg"/>
    				   <p>今日商品已售馨,请明日再来~</p>
    				</div>
    			</template>
    		  </div>
    		  </van-list>
    		<!-- </van-pull-refresh> -->
      </div>
    </template>
    
    <script>
    	import { List } from 'vant';
    	import { PullRefresh } from 'vant';
    	import { Toast } from 'vant';
    	export default {
    		components: {
    			 [List.name]: List,
    			 [PullRefresh.name]: PullRefresh
    		},
    	  name: 'Home',
    	  props: {
    		msg: String
    	  },
    	  data(){
    		return{
    			nodataimg:'https://oss.icebear.me/static/image/empty.png',
    			userInfo:{
    				"avatar": "",
    				"paw_num": ''
    			},
    			token:'',//用户唯一标识
    			list: [],
    			loading: false,
    			finished: false,
    			refreshing: false,
    			page:1,
    			page_size:10
    		};
    	  },
    	  created() {
    		let _ = this;
    		_.token = _.$route.query.token;
    		_.localData("set","token",_.token); 
    		// _.localData("set","icebearappid",_.$route.query.appid); 
    		_.getUserInfo()
    	  },
    	  methods:{
    		getUserInfo(){  
    		  let _ = this;
    		  _.$axios.post('/h5/paw/shop/init_shop', {token:_.token}).then(
    			 function (res) {
    			_.userInfo = res.data.data
    		  }).catch(
    			 function (error) {
    		  });
    		},
    		getGoodsList(){
    			let _ = this;
    			_.$axios.post('/h5/paw/shop/get_goods_list', {token:_.token,page:_.page,page_size:_.page_size}).then(
    			   function (res) {
    				    console.log(res)
    				    let list = res.data.data.list;
    				    if(list.length>0){_.list = _.list.concat(list)};
    					_.page++;
    				    console.log(_.list)
    				   	_.loading = false;// 加载状态结束
    				   	_.refreshing = false; //下拉加载状态结束
    				    if(list.length<_.page_size){
    				   	   _.finished = true;
    				    }
    			}).catch(
    			   function (error) {
    			});
    		},
    		onRefresh() {
    		  let _ = this;
    		  // 清空列表数据
    		  this.finished = false;
    		  // 重新加载数据
    		  // 将 loading 设置为 true,表示处于加载状态
    		  this.loading = true;
    		  this.getGoodsList();
    		  Toast('刷新成功');
    		},
    		goDetail(item) {
    			console.log(item);
    			let _ = this;
    			let obj = {
    				clickName:'商品的点击',
    				data:item
    			}
    			_.wx.miniProgram.postMessage({ data: obj });
    			_.$router.push({
    			  name: 'Detail',
    			  query:{           
    			    id:item.id, 
    			  }
    			})
    		}
    	  }
    	}
    </script>
    
    <!-- Add "scoped" attribute to limit CSS to this component only -->
    <style lang="less" scoped>
    	.hello {
    		 7.5rem;
    		font-size: 0.32rem;
    		padding: 0 0.4rem;
    		.user_info{
    			font-size: 0.32rem;
    			display: flex;
    			align-items: center;
    			justify-content: space-between;
    			padding: 0.4rem 0;
    			border-bottom: 1px solid rgba(0, 0, 0, 0.1);
    			.left{
    				display: flex;
    				align-items: center;
    				justify-content: flex-start;
    				.head_img{
    					   1.06rem;
    					  height: 1.06rem;
    					  border-radius: 50%;
    					  margin-right: 0.2rem;
    					  overflow: hidden;
    					  img{
    						   1.06rem;
    						  height: 1.06rem;
    					  }
    				}
    				.paw_info{
    					font-size: 0.26rem;
    					.num{
    						margin-top: 0.08rem;
    						display: flex;
    						align-items: center;
    						.paw_icon{
    							   0.6rem;
    							  height: 0.6rem;
    							  border-radius: 50%;
    							  margin-right: 0.04rem;
    						}
    						span{
    							  font-size: 0.56rem;
    							  font-weight: bold;
    							  color: #ff7211;
    						}
    					}
    				}
    			}
    			.right{
    				  height: 0.4rem;
    				  line-height: 0.4rem;
    				  font-family: PingFangSC;
    				  font-size: 0.28rem;
    				  color: #8e8e93;
    				  display: flex;
    				  align-items: center;
    				  justify-content: center;
    			}
    		}
    		.list{
    			display: flex;
    			flex-wrap: wrap;
    			align-items: center;
    			justify-content: space-between;
    			padding-top: 0.41rem;
    			.item{
    				 3.2rem;
    				height: 4.06rem;
    				border-radius: 0.08rem;
    				box-shadow: 0 0 0.16rem 0 rgba(0, 0, 0, 0.06);
    				background-color: #ffffff;
    				overflow: hidden;
    				margin-bottom: 0.3rem;
    				img{
    					 100%;
    					height: 2rem;
    				}
    				.p{
    					padding: 0.2rem;
    					overflow : hidden;
    					p{
    						2.8rem;
    						height: 0.88rem;
    						line-height: 0.44rem;
    						overflow : hidden;
    						text-overflow: ellipsis;
    						display: -webkit-box;
    						-webkit-line-clamp: 2;
    						 /*! autoprefixer: off */
    					    -webkit-box-orient: vertical;
    					     /* autoprefixer: on */
    					}
    				}
    				.price{
    					display: flex;
    					align-items: center;
    					justify-content: flex-start;
    					padding: 0 0.2rem;
    					font-size: 0.28rem;
    					font-weight: bold;
    					color: #ff7211;
    					.paw_icon{
    						 0.48rem;
    						height: 0.48rem;
    						border-radius: 50%;
    						margin-right: 0.08rem;
    					}
    				}
    			}
    			.nodata{
    				 100vw;
    				height: 50vh;
    				display: flex;
    				flex-direction: column;
    				align-items: center;
    				justify-content: center;
    				img{
    					 3.9rem;
    					height: 2.24rem;
    				}
    				p{
    					font-size: 0.28rem;
    					text-align: center;
    					color: #7e7e7e;
    					margin-top: 0.42rem;
    				}
    			}
    		}
    	}
    
    </style>
    
    

    接下来我们看detail页面
    home页面中定义了不是wx的话,内容显示不出来,我们也只是看一下代码

    //detail
    <template>
      <div class="detail"> 
    		<template v-if="info">
    		  <!-- 课程 -->
    		  <template v-if="info.type_id == 1">
    		    <img class="goods_img" :src="info.lesson_detail.lesson_introduce_miniapp_head_img"/>
    		    <div class="info">
    		    	<p class="name">{{info.name}}</p>
    		    	<div class="date">
    		    		<span class="time" v-if="info.lesson_detail.camp_time&&info.lesson_detail.camp_time.from">时间:{{info.lesson_detail.camp_time.from}}-{{info.lesson_detail.camp_time.to}}</span>
    					<span class="time" v-else>时间:随报随学,自由安排</span>
    		    		<span class="people_num">{{info.lesson_detail.buy_nums||0}} 人学过</span>
    		    	</div>
    		    </div>
    		    <div class="description">
    		    	<div class="content">
    		    		<img v-if="info.lesson_detail.lesson_introduce_top_img" class="decImg width-100" v-lazy="info.lesson_detail.lesson_introduce_top_img"> 
    		    		<template v-if="info.lesson_detail.lesson_introduce_model_list.length>0" v-for="(item,index) in info.lesson_detail.lesson_introduce_model_list">
    		    		    <div :data-index="index" class="contentBox">
    		    				<div id="course" class="section-item no-margin">
    		    					<div class="titleBox">
    		    						<img v-lazy="info.lesson_detail.lesson_introduce_title_img" class="titleBg"> 
    		    						<span class="content_title" :style="'color: '+info.lesson_detail.lesson_introduce_title_color">{{item.model_title}}</span>
    		    					</div>
    		    					<div v-if="item.model_title_img.length>0" v-for="src in item.model_title_img" class="decBox">
    		    						<img v-lazy="src" class="decImg margin-40">
    		    					</div>
    		    				</div>
    		    			</div>
    		    		</template>
    		    	</div>
    		    </div>
    		  </template>
    		  <!-- 周边 -->
    		  <template v-else>
    		  	<img class="goods_img" :src="info.head_pic_url"/>
    		  	<div class="info">
    		  		<p class="name">{{info.name}}</p>
    		  	</div>
    		  	<div class="description">
    		  		<div class="content">
    		  			<!-- <img class="decImg width-100" v-lazy="info.head_pic_url"> -->
    		  			<div class="contentBox">
    		  				<div id="course" class="section-item no-margin">
    		  					<div v-if="info.introduce_pic_url_list.length>0" v-for="src in info.introduce_pic_url_list" class="decBox">
    		  						<img v-lazy="src" class="decImg margin-40">
    		  					</div>
    		  				</div>
    		  			</div>
    		  		</div>
    		  	</div>
    		  </template>
    		  <div class="kong"></div>
    		  <div class="fixed_btn">
    			  <div v-if="info.is_online == 0" class="btn already">
    			  			  已下架
    			  </div>
    			  <div v-else-if="info.is_buy == 1" class="btn already">
    			  			  已购买
    			  </div>
    			  <div v-else-if="info.is_exchange==1" class="btn already">
    			  	  已经兑换
    			  </div>
    			  <div v-else class="btn" @click="exchange()">
    			  	{{info.paw_price}}熊掌兑换
    			  </div>
    		  </div>
    		</template>
      </div>
    </template>
    
    <script>
    import { Toast } from 'vant';
    export default {
      name: 'Detail',
      props: {
        msg: String
      },
      data(){
      	return{
    		appid:'',
    		token:'',
    		goods_id:'',
    		paw_num:'',//用户熊掌数
    		info:null
    	};
      },
      computed:{
    
      },
      mounted() {
    	 console.log('mounted')
      },
      created() {
    	let _ = this;
    	console.log('token   '+ _.localData("get","token"))
    	_.token = _.localData("get","token");
    	// _.appid = _.localData("get","icebearappid");
    	_.goods_id = _.$route.query.id;
    	_.getDetail();
    	_.getUserInfo();
      },
      methods:{
    	  getUserInfo(){
    		  let _ = this;
    		  _.$axios.post('/h5/paw/shop/init_shop', {token:_.token}).then(
    			 function (res) {
    			_.paw_num = res.data.data.paw_num
    		  }).catch(
    			 function (error) {
    		  });
    	  },
    	getDetail(){
    		let _ = this;
    		this.$axios.post('/h5/paw/shop/get_goods_detail', {token:_.token,goods_id:_.goods_id}).then(
    		    (res)=> {
    			   console.log(res)
    			   if(res.data.code){
    				   _.info = res.data.data;  
    			   }else{
    				    Toast(res.data.msg)
    			   }  
    		}).catch((error)=> {
    			   Toast('服务器错误')
    		});
    	},
    	exchange(){
    		let _ = this;
    		let obj = {
    			clickName:'底部兑换的点击',
    			data:_.info
    		}
    		_.wx.miniProgram.postMessage({ data: obj });
    		let num = _.info.paw_price - _.paw_num
    		if(num<=0){
    			_.$popup({
    				title: '兑换商品',
    				content: '支付 '+_.info.paw_price+' 个熊掌兑换商品',
    				btnText: '确定兑换',
    				click: () => {
    					// 调用接口 获取data     
    					 _.exchangeApi()
    					 let obj = {
    					 	clickName:'确定兑换的点击',
    					 	data:_.info
    					 }
    					 _.wx.miniProgram.postMessage({ data: obj });
    				}
    			})
    		}else{
    			_.$popup({
    				title: '熊掌不足',
    				content: '呜呜~还缺'+num+'个熊掌',
    				btnText: '获取更多熊掌',
    				click: () => {
    					//跳转微信小程序页面  pages/ucenter/bear_paw
    					let obj = {
    						clickName:'获取更多熊掌的点击',
    						data:_.info
    					}
    					_.wx.miniProgram.postMessage({ data: obj });
    					_.wx.miniProgram.navigateTo({
    						url: '/pages/ucenter/bear_paw'
    					})
    				}
    			})
    		}
    	},
    	exchangeApi(data){
    		let _ = this;
    		_.$axios.post('/h5/paw/shop/goods_exchange', {token:_.token,goods_id:_.goods_id}).then(
    		    (res)=> {
    			  if(res.data.code == 1){
    			  	_.$router.push({
    			  	  name: 'Success',
    			  	  query:{           
    			  	    orderId:res.data.data.order_id, 
    			  	  }
    			  	})
    			  }else{
    			  	 Toast(res.data.msg);
    			  }
    		}).catch( (error)=> {
    			    Toast('服务器错误')
    		});
    	}
      }
    }
    </script>
    
    <!-- Add "scoped" attribute to limit CSS to this component only -->
    <style lang="less" scoped>
      .detail{
    	  //  7.5rem;
    	  .loading{
    		   100vw;
    		  height: 100vh;
    		  position: fixed;
    		  top: 0;
    		  left: 0;
    		  display: flex;
    		  align-items: center;
    		  justify-content: center;
    	  }
    	  font-size: 0;
    	  background-color: #faf8f6;
    	  .goods_img{
    		   100%;
    		  background-color: #ffffff;
    	  }
    	  .info{
    		line-height: 1.5;
    		padding: 0.4rem 0.36rem;
    		background-color: #ffffff;
    		.name{
    			font-size: 0.4rem;
    			font-weight: bold;
    			color: #482929;
    		}
    		.date{
    			font-size: 0.28rem;
    			color: #482929;
    			margin-top: 0.12rem;
    			display: flex;
    			align-items: center;
    			justify-content: space-between;
    			.people_num{
    			    font-size: 0.24rem;
    				color: #747474;
    			}
    		}
    	  }
    	  .description{
    		   100%;
    		  font-size: 0.28rem;
    		  margin-top: 0.2rem;
    		  padding: 0.4rem 0.36rem;
    		  background-color: #ffffff;
    		  img{
    			 100%;  
    		  }
    		  .titleBox{
    			  position: relative;
    			  margin: 0.48rem 0 0.4rem;
    			   100%;
    			  .content_title{
    				position: absolute;
    				top: 50%;
    				left: 50%;
    				transform: translate(-50%,-50%);
    				font-size: 0.4rem;
    				font-weight: 700;
    				color: #482929;
    			  }
    		   }
    		  
    	  }
    	  .kong{
    		height: 0.98rem; 
    		box-sizing: border-box;
    		background-color: #ffffff;
    	    padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
    	    padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */
    	  }
    	  .fixed_btn{
    		  position: fixed;
    		   100%;
    		  left: 0;
    		  bottom: 0;
    		  box-sizing: border-box;
    		  background: #ffffff;
    		  padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
    		  padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */
    		  .btn{
    		  		 100%;
    		  		height: 0.98rem;
    		  		line-height: 0.98rem;
    		  		background-color: #ff982e;
    		  		font-size: 0.4rem;
    		  		font-weight: 500;
    		  		color: #ffffff;
    		  		text-align: center;
    		  }
    		  .already{
    		  		background-color: #dedede;
    		  		color: #ffffff;
    		  }
    	  }
      }
    </style>
    
    

    Exlist页面

    //exlist.vue
    <template>
      <div class="exlist">
    	  <div v-if="list.length == 0&&finished" class="nodata">
    		  <img :src="nodataimg" />
    		  <p>暂无兑换记录</p>
    	  </div>
    	  <div v-else class="list">
    	  		  <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
    	  		    <van-list
    	  		      v-model="loading"
    	  		      :finished="finished"
    	  		      finished-text=" "
    	  		      @load="onLoad"
    	  		    >
    	  		      <div v-for="item in list" class="item" @click="gosuccess(item)">
    	  		      	<div class="content">
    	  		      		{{item.name}}
    	  		      	</div>
    	  		      	<div class="cost">
    	  		      		<p class="date">{{item.pay_time}}</p>
    	  		      		<div class="price">
    	  		      			<p class="num">-{{item.price}}</p>
    	  		      			<img class="paw_icon" src="https://oss.icebear.me/static/image/icon/paw_icon.png" />
    	  		      		</div>
    	  		      	</div>
    	  		      </div>
    	  		    </van-list>
    	  		  </van-pull-refresh>
    	  </div>
      </div>
    </template>
    
    <script>
    import { List } from 'vant';
    import { PullRefresh } from 'vant';
    import { Toast } from 'vant';
    export default {
      components: {  
    	 [List.name]: List,
    	 [PullRefresh.name]: PullRefresh
      },
      name: 'Exlist',
      props: {
        msg: String
      },
      data(){
    	return{
    		token:'',
    		nodataimg:'https://oss.icebear.me/static/image/empty.png',
    		list:[] ,
    		loading: false,
    		finished: false,
    		refreshing: false,
    		page:1,
    		page_size:10
    	};
      },
      created() {
    	 let _ = this;
    	_.token = _.localData("get","token");
      },
      methods: {
    		onLoad() {
    			let _ = this;
    			_.$axios.post('/h5/paw/shop/get_order_list', {
    				token:_.token,	
    				page:_.page,	
    				page_size:_.page_size
    			}).then(
    			   function (res) {
    				   let list = res.data.data.list;
    				   if(list.length>0){
    					   _.list = _.list.concat(list)
    					   _.page++
    					};
    				   	_.loading = false;// 加载状态结束
    				   	_.refreshing = false; //下拉加载状态结束
    				   if(list.length<_.page_size){
    					   _.finished = true;
    				   }
    			}).catch(
    			   function (error) {
    			});
    		},
    	    onRefresh() {
    		  let _ = this;
    		  // 清空列表数据
    		  _.finished = false;
    		  _.list = [];
    		  _.page = 1
    		  // 重新加载数据
    		  // 将 loading 设置为 true,表示处于加载状态
    		  _.loading = true;
    		  _.onLoad();
    		  Toast('刷新成功');
    		},
    		gosuccess(item){
    			let _ = this;
    			_.$router.push({
    			  name: 'Success',
    			  query:{           
    			    orderId:item.id, 
    			  }
    			})
    		}
    	}
    }
    </script>
    
    <!-- Add "scoped" attribute to limit CSS to this component only -->
    <style lang="less" scoped>
    	
    	.exlist{
    		min-height: 100vh;
    		background-color: #fafafa;
    		.list{
    			 100vw;
    			padding: 0 0.3rem 0.4rem 0.3rem;
    			.item{
    				 100%;
    				height: 1.94rem;
    				margin-top: 0.3rem;
    				font-size: 0.48rem;
    				border-radius: 0.16rem;
    				box-shadow: 0 0 0.12rem 0 rgba(0, 0, 0, 0.04);
    				background-color: #ffffff;
    				.content{
    					height: 1.05rem;
    					line-height: 1.05rem;
    					font-size: 0.32rem;
    					color: #000000;
    					padding: 0 0.3rem;
    					border-bottom: 0.01rem solid #fafafa;
    					 100%;
    					white-space:nowrap;/* 规定文本是否折行 */  
    					overflow: hidden;/* 规定超出内容宽度的元素隐藏 */
    					text-overflow: ellipsis;
    				}
    				.cost{
    					height: 0.88rem;
    					line-height: 0.88rem;
    					padding: 0 0.3rem;
    					display: flex;
    					align-items: center;
    					justify-content: space-between;
    					.date{
    						font-size: 0.28rem;
    						color: #9b9b9b;
    					}
    					.price{
    						display: flex;
    						align-items: center;
    						justify-content: space-between;
    						.num{
    							font-size: 0.32rem;
    							font-weight: bold;
    							color: #ff7211;
    							margin-right: 0.08rem;
    						}
    						.paw_icon{
    							 0.48rem;
    							height: 0.48rem;
    						}
    					}
    				}
    			}
    		}
    		.nodata{
    			// background-color: #ffffff;
    			 100vw;
    			height: 100vh;
    			position: fixed;
    			top: 0;
    			left: 0;
    			z-index: 100;
    			display: flex;
    			flex-direction: column;
    			align-items: center;
    			justify-content: center;
    			img{
    				 3.9rem;
    				height: 2.24rem;
    			}
    			p{
    				font-size: 0.28rem;
    				text-align: center;
    				color: #7e7e7e;
    				margin-top: 0.42rem;
    			}
    		}
    	}
    </style>
    
    

    这个里面还有一个popup组件

    //popup
    <template>
      <transition name='fade'>
        <!-- 蒙版 -->
        <div class="mask" v-if="show" @touchmove.prevent>
          <div class="window">
            <!-- <img class="shadow" :src="imgUrl" alt=""> -->
            <h1>{{title}}</h1>
            <p>{{content}}</p>
            <div class="btn" @click="btnClick">{{btnText}}</div>
          </div>
    	  <div class="close" @click="show = false">
    		  <van-icon name="cross" size="0.4rem" color="#ffffff"/>
    	  </div>
        </div>
      </transition>
    </template>
    
    <script>
    export default {
      name: 'app',
      data () {
        return {
          show: false,		 // 显示隐藏
          imgUrl: '',        // imgUrl: require('../../../static/images/shadow.png'), // 顶部图片
          title: '',		 //主标题
          content: '',      //内容
          btnText: '',      // button文案
          click: ''         //按钮事件
        }
      },
      created () {
      },
      methods: {
        btnClick () {
          this.click()
          this.show = false
        }
      }
    }
    </script>
    
    <style lang="less" scoped>
      // 渐变过渡
      .fade-enter,
      .fade-leave-active {
        opacity: 0;
      }
      .fade-enter-active,
      .fade-leave-active {
        transition: opacity .35s;
      }
      // 全局弹窗
      .mask {
    	 100vw;
    	height: 100vh;
        position: fixed;
    	top: 0;
    	left: 0;
        z-index: 10;
        background:rgba(0,0,0,0.65);
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        padding: 0.5rem;
        .window{
          // height: 4.84rem;
    	  line-height: 1.3;
           100%;
          background: #fff;
          border-radius:0.24rem;
          text-align: center;
    	  box-shadow: 0 0 0.06rem 0 rgba(0, 0, 0, 0.24);
    	  padding: 0.9rem 0.76rem;
          .shadow{
             270/75rem;
            margin-top: -90/75rem;
          }
          h1{
            font-size: 0.44rem;
            font-weight: bolder;
            text-align: center;
            color: #482929;
          }
          p{
            margin-top: 0.3rem;
    		font-size: 0.32rem;
    		text-align: center;
    		color: #666666;
          }
          .btn{
    		 100%;
    		height: 1rem;
    		line-height: 1rem;
    		border-radius: 0.5rem;
    		background-color: #ffcc2d;
            margin-top: 0.7rem;
            font-size: 0.36rem;
            font-weight: bold;
            text-align: center;
            color: #482929;
          }
        }
        .close{
          0.6rem;
          height:0.6rem;
          margin-top: 0.2rem;
    	  border: none;
    	  border-radius: 0.3rem;
    	  background-color: rgba(0, 0, 0, 0.4);
    	  display: flex;
    	  align-items: center;
    	  justify-content: center;
        }
      }
    </style>
    

    还有success组件

    <template>
      <div class="success">
    	<div class="bg"></div>
    	<div v-if="detail" class="content">
    		<div class="title">
    			<div class="icon-tit">
    				<van-icon size="0.52rem" name="https://oss.icebear.me/static/image/icon/right.png" />
    			</div>
    			<div class="tit">兑换成功!</div>
    		</div>
    		<div class="name van-hairline--bottom">
    			- {{detail.goods_name}} -<br>{{detail.order_id}}
    		</div>
    <!-- 		<div class="orderid"> 
    			
    		</div> -->
    		<div class="qrcode">
    			<img v-lazy="detail.service_wechat_url"/>
    		</div>
    		<div class="tips">
    			  {{detail.bottom_text}}  <!-- 截图扫码前往白熊学院小程序学习 -->
    		</div>
    	</div>
      </div>
    </template>
    
    <script>
    	
    export default {
      components: {  
    	
      },
      name: 'Success',
      props: {
       
      },
      data(){
      	return{
      		qrcode:'https://oss.icebear.me/static/image/successbg.png',
      		detail:'',
      	};
      },
      created() {
    	    let _ = this;
    	    _.orderId = _.$route.query.orderId;
    		_.token = _.localData("get","token");
    		_.getExchangeDetail()
      },
      methods: {
    	getExchangeDetail(){
    		  let _ = this;
    		  _.$axios.post('/h5/paw/shop/get_goods_exchange_detail', {token:_.token,order_id:_.orderId}).then(
    			 function (res) {
    			_.detail = res.data.data;
    			console.log(_.detail);
    		  }).catch(
    			 function (error) {
    		  });
    	},
      }
    }
    </script>
    
    <!-- Add "scoped" attribute to limit CSS to this component only -->
    <style lang="less" scoped>
    	.success{
    		 100vw;
    		min-height: 100vh;
    		background-color: #ffda65;	
    		display: flex;
    		flex-direction: column;
    		align-items: center;
    		.bg{
    			 6.9rem;
    			height: 2.8rem;
    			background-image: url('https://oss.icebear.me/static/image/successbg.png');
    			background-size: 100%;background-repeat: no-repeat;
    		}
    		.content{
    			 6.9rem;
    			// height: 8.08rem;
    			border-radius: 0.16rem;
    			box-shadow: 0 0 0.06rem 0 rgba(0, 0, 0, 0.24);
    			background-color: #ffffff;
    			margin-top: -0.48rem;
    			text-align: center;
    			padding: 0.6rem 0.4rem 1.1rem 0.4rem;
    			.title{
    				font-size: 0.48rem;
    				font-weight: bold;
    				color: #482929;
    				display: flex;
    				align-items: center;
    				justify-content: center;
    				.icon-tit{
    					display: flex;
    					align-items: center;
    					justify-content: center;
    					margin-right: 0.16rem;
    				}
    				.tit{
    					line-height: 1.3;
    				}
    			}
    			.name{
    				font-size: 0.28rem;
    				text-align: center;
    				color: #482929;
    				margin-top: 0.2rem;
    				line-height: 1.5;
    				padding-bottom: 0.3rem;
    			}
    			// .orderid{
    			// 	font-size: 0.36rem;
    			// 	margin-top: 0.2rem;
    			// }
    			.qrcode{
    				margin-top: 0.31rem;
    				img{
    					 5.7rem;
    				}
    			}
    			.tips{
    			    font-size: 0.32rem;
    			    font-weight: bold;
    			    text-align: center;
    			    color: #ff742b;
    				line-height: 1.3;
    				margin-top: 0.3rem;
    			}
    		}
    	}
    </style>
    
    

    这个项目里面大概就是这些内容了

  • 相关阅读:
    分布式理论基础(三)时间、时钟和事件顺序
    分布式理论基础(二)选举、多数派和租约
    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC
    spark入门(三)键值对操作
    spark入门(二)RDD基础操作
    Python的Flask框架入门-Ubuntu
    Python __str__(self)和__unicode__(self)
    Windows下安装和使用MongoDB
    Virtualenv介绍
    python的import与from…import的区别
  • 原文地址:https://www.cnblogs.com/smart-girl/p/12936676.html
Copyright © 2020-2023  润新知