Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mobile-web/src/api/promotion.js
#	mobile-web/src/config/request.js
This commit is contained in:
sin
2019-04-08 23:41:25 +08:00
41 changed files with 1193 additions and 185 deletions

View File

@@ -15,5 +15,45 @@ export function getProductRecommendList() {
return request({
url: '/promotion-api/users/product_recommend/list',
method: 'get',
params: {
id,
}
});
}
// Coupon Template
export function getCouponTemplate(id) {
return request({
url: '/promotion-api/users/coupon/template/get',
method: 'get',
params: {
id,
}
});
}
export function doAddCouponCard(templateId) {
return request({
url: '/promotion-api/users/coupon/card/add',
method: 'post',
params: {
templateId,
}
});
}
// Coupon Card
export function getCouponPage(status, pageNo, pageSize) {
return request({
url: '/promotion-api/users/coupon/card/page',
method: 'get',
params: {
status,
pageNo,
pageSize
}
});
}

View File

@@ -1,12 +1,12 @@
/**
* 配置编译环境和线上环境之间的切换
*
*
* baseUrl: 域名地址
* routerMode: 路由模式
* dataSources数据源
*/
let baseUrl = '';
let baseUrl = '';
let routerMode = 'hash';
let dataSources='local';//local=本地,其他值代表非本地
@@ -27,4 +27,4 @@ export {
baseUrl,
routerMode,
dataSources,
}
}

View File

@@ -135,8 +135,8 @@ service.interceptors.request.use(
const { target, prefix } = serviceRouter(config.url)
let url = config.url = config.url.replace(`${prefix}`, target);
// TODO 芋艿,这些 url 不用增加认证 token 。可能这么写,有点脏,后面看看咋优化下。
if (url.indexOf('user-api/users/passport/mobile/send_register_code') != -1
|| url.indexOf('user-api/users/passport/mobile/register') != -1) {
if (url.indexOf('user-api/users/passport/mobile/send_register_code') !== -1
|| url.indexOf('user-api/users/passport/mobile/register') !== -1) {
return config;
}

View File

@@ -1,6 +1,8 @@
import Vue from 'vue';
import Router from 'vue-router';
import { getAccessToken } from '../utils/cache';
Vue.use(Router);
const routes = [
@@ -84,7 +86,8 @@ const routes = [
path: '/user/coupon',
component: () => import('../page/user/coupon/list'),
meta: {
title: '我的优惠券'
title: '我的优惠券',
requireAuth: true,
}
},
{
@@ -192,6 +195,13 @@ const routes = [
title: '分类'
}
},
{
path: '/coupon/fetch',
component: () => import('../page/coupon/fetch'),
meta: {
title: '优惠劵领取'
}
}
];
// add route path
@@ -202,10 +212,23 @@ routes.forEach(route => {
const router = new Router({ routes });
router.beforeEach((to, from, next) => {
// 判断是否需要认证
const requireAuth = to.meta && to.meta.requireAuth;
if (requireAuth) {
if (!getAccessToken()) { // 未登陆
next({
path: '/login',
query: {redirect: to.fullPath} // 将跳转的路由path作为参数登录成功后跳转到该路由
});
return;
}
}
// 处理标题
const title = to.meta && to.meta.title;
if (title) {
document.title = title;
}
// 继续路由
next();
});

View File

@@ -7,6 +7,8 @@ import VueLazyload from 'vue-lazyload'
import components from './config/components.js';
import { Dialog } from 'vant';
import { formatDate } from './utils/date.js';
Vue.use(components);
Vue.use(VueLazyload);
@@ -16,4 +18,10 @@ new Vue({
router,
el: '#app',
render: h => h(App)
});
});
Vue.filter('formatDate', function(date, pattern) {
if (date) {
return formatDate(date, pattern);
}
});

View File

@@ -73,8 +73,9 @@ export default {
message: '登陆成功',
beforeClose: function (action, done) {
done();
// TODO 芋艿,先暂时不做 callback
that.$router.push('/user/index');
// TODO 芋艿,简单的 callback 后续完善
let redirect = that.$route.query.redirect || '/user/index';
that.$router.push(redirect);
}
});
});

View File

@@ -0,0 +1,54 @@
<template>
<div>
<van-cell-group>
<van-cell title="优惠劵编号" :value="couponTemplate.id" />
<van-cell title="优惠劵名" :value="couponTemplate.title"/>
</van-cell-group>
<van-button slot="button" size="small" type="primary" @click="onFetchClick">领取优惠劵</van-button>
</div>
</template>
<script>
import { getCouponTemplate, doAddCouponCard } from '../../api/promotion';
import { Dialog } from 'vant';
import { setLoginToken } from '../../utils/cache';
export default {
data() {
return {
couponTemplate: {
}
}
},
mounted() {
let id = this.$route.query.id;
let response = getCouponTemplate(id);
response.then(data => {
this.couponTemplate = data;
});
},
methods: {
onFetchClick: function () {
let that = this;
let id = this.$route.query.id;
let response = doAddCouponCard(id);
response.then(data => {
Dialog.alert({
title: '系统提示',
message: '领取成功',
beforeClose: function (action, done) {
// 关闭弹窗
done();
// 跳转到我的优惠劵
that.$router.push('/user/coupon');
}
});
});
}
}
}
</script>

View File

@@ -65,9 +65,9 @@ export default {
}
},
created:function(){
GetPage().then(response=>{
this.page=response;
});
// GetPage().then(response=>{
// this.page=response;
// });
},
mounted: function() {
// 加载 Banner

View File

@@ -6,7 +6,7 @@
center
clearable
placeholder="请输入优惠码"
v-model="couponCode"
>
<van-button slot="button" size="small" type="primary" :loading="exchangeLoading" @click="onExchange">兑换</van-button>
@@ -16,41 +16,50 @@
<van-tab title="未使用">
<ul>
<van-list
v-model="loading"
:finished="finished"
v-model="unusedData.loading"
:finished="unusedData.finished"
@load="onLoad"
>
<li v-for="(item,index) in list" :key="index" :class="'couponitem '+(item.show?'show':'') ">
<li v-for="(item,index) in unusedData.list" :key="index" :class="'couponitem '+(item.show?'show':'') ">
<div class="couponTop">
<div class="cpnamount">
<div class="amountWrap">
<div class="amount">
<span class="amountSign" v-if="item.SignPosition=='left'" >{{item.Sign}}</span>
<span class="amountNum">{{item.Coupon}}</span>
<span class="amountSign" v-if="item.SignPosition=='right'" >{{item.Sign}}</span>
<div class="amount" v-if="item.preferentialType === 1">
<span class="amountSign" ></span>
<span class="amountNum">{{item.priceOff / 100}}</span>
</div>
<div class="amount" v-else="item.preferentialType === 2">
<span class="amountNum">{{item.percentOff / 10.0}}</span>
<span class="amountSign"></span>
</div>
<div class="condition">
<span>{{item.Condition}}</span>
<span> {{item.priceAvailable}} 元可用</span>
</div>
</div>
</div>
<div class="couponInfoWrap">
<div class="cpninfo">
<div class="detail">
<span class="name">{{item.Name}}</span></div>
<span class="name">{{item.title}}</span></div>
</div>
<div class="validity">
<span>{{item.BeginDate}}-{{item.EndDate}}
</span>
<span>{{item.validStartTime | formatDate('yyyy-MM-dd')}}
~ {{item.validEndTime | formatDate('yyyy-MM-dd')}}</span>
</div>
<van-button type="danger" size="mini">立即使用</van-button>
</div>
</div>
<div class="couponMid " v-if="item.Info!=''">
<span>详细信息</span>
<van-icon name="arrow" class="down" @click="onShowInfo(item.Id,index)" />
</div>
<div class="info" v-if="item.Info!=''" >
<!-- <div class="couponMid " v-if="item.Info!=''">-->
<!-- <span>详细信息</span>-->
<!-- <van-icon name="arrow" class="down" @click="onShowInfo(item.Id,index)" />-->
<!-- </div>-->
<!-- <div class="info" v-if="item.Info!=''" >-->
<!-- <div class="text">-->
<!-- {{item.Info}}-->
<!-- </div>-->
<!-- </div>-->
<!-- todo 芋艿后续做优化指定哪些商品 / 分类可用 -->
<div class="info" v-if="item.Info!=''" >
<div class="text">
{{item.Info}}
</div>
@@ -62,32 +71,35 @@
<van-tab title="使用记录">
<ul class="gray" >
<van-list
v-model="useLoading"
:finished="useFinished"
v-model="usedData.loading"
:finished="usedData.finished"
@load="onLoadUse"
>
<li v-for="(item,index) in useList" :key="index" class="couponitem">
<li v-for="(item,index) in usedData.list" :key="index" class="couponitem">
<div class="couponTop">
<div class="cpnamount">
<div class="amountWrap">
<div class="amount">
<span class="amountSign" v-if="item.SignPosition=='left'" >{{item.Sign}}</span>
<span class="amountNum">{{item.Coupon}}</span>
<span class="amountSign" v-if="item.SignPosition=='right'" >{{item.Sign}}</span>
<div class="amount" v-if="item.preferentialType === 1">
<span class="amountSign" ></span>
<span class="amountNum">{{item.priceOff / 100}}</span>
</div>
<div class="amount" v-else="item.preferentialType === 2">
<span class="amountNum">{{item.percentOff / 10.0}}</span>
<span class="amountSign"></span>
</div>
<div class="condition">
<span>{{item.Condition}}</span>
<span> {{item.priceAvailable}} 元可用</span>
</div>
</div>
</div>
<div class="couponInfoWrap">
<div class="cpninfo">
<div class="detail">
<span class="name">{{item.Name}}</span></div>
<span class="name">{{item.title}}</span></div>
</div>
<div class="validity">
<span>{{item.BeginDate}}-{{item.EndDate}}
</span>
<span>{{item.validStartTime | formatDate('yyyy-MM-dd')}}
~ {{item.validEndTime | formatDate('yyyy-MM-dd')}}</span>
</div>
</div>
</div>
@@ -97,34 +109,37 @@
</van-tab>
<van-tab title="已过期">
<ul class="gray" >
<van-list
v-model="endLoading"
:finished="endFinished"
v-model="expireData.loading"
:finished="expireData.finished"
@load="onLoadEnd"
>
<li v-for="(item,index) in endList" :key="index" class="couponitem">
<li v-for="(item,index) in expireData.list" :key="index" class="couponitem">
<div class="couponTop">
<div class="cpnamount">
<div class="amountWrap">
<div class="amount">
<span class="amountSign" v-if="item.SignPosition=='left'" >{{item.Sign}}</span>
<span class="amountNum">{{item.Coupon}}</span>
<span class="amountSign" v-if="item.SignPosition=='right'" >{{item.Sign}}</span>
<div class="amount" v-if="item.preferentialType === 1">
<span class="amountSign" ></span>
<span class="amountNum">{{item.priceOff / 100}}</span>
</div>
<div class="amount" v-else="item.preferentialType === 2">
<span class="amountNum">{{item.percentOff / 10.0}}</span>
<span class="amountSign"></span>
</div>
<div class="condition">
<span>{{item.Condition}}</span>
<span> {{item.priceAvailable}} 元可用</span>
</div>
</div>
</div>
<div class="couponInfoWrap">
<div class="cpninfo">
<div class="detail">
<span class="name">{{item.Name}}</span></div>
<span class="name">{{item.title}}</span></div>
</div>
<div class="validity">
<span>{{item.BeginDate}}-{{item.EndDate}}
</span>
<span>{{item.validStartTime | formatDate('yyyy-MM-dd')}}
~ {{item.validEndTime | formatDate('yyyy-MM-dd')}}</span>
</div>
</div>
</div>
@@ -138,83 +153,131 @@
<script>
import { GetCoupon,ExchangeCoupon } from "../../../api/user.js";
import { getCouponPage } from "../../../api/promotion.js";
export default {
components: {
},
data() {
return {
loading:false,
finished:false,
list:[],
page:0,
useLoading:false,
useFinished:false,
useList:[],
usePage:0,
endLoading:false,
endFinished:false,
endList:[],
endPage:0,
// loading:false,
// finished:false,
// list:[],
// page:0,
//
//
// useLoading:false,
// useFinished:false,
// useList:[],
// usePage:0,
//
//
// endLoading:false,
// endFinished:false,
// endList:[],
// endPage:0,
couponCode:'',
exchangeLoading:false,
unusedData: {
page: 0,
pageSize: 10,
list: [],
loading: false,
finished: false,
},
usedData: {
page: 0,
pageSize: 10,
list: [],
loading: false,
finished: false,
},
expireData: {
page: 0,
pageSize: 10,
list: [],
loading: false,
finished: false,
},
};
},
computed: {
},
methods: {
onLoad() {
this.page++;
GetCoupon({page:this.page}).then(response=>{
response.List.forEach(item => {
item.show=false;
this.list.push(item);
});
this.loading = false;
if(response.TotalPage<=this.page){
this.finished = true;
}
})
},
onShowInfo(id,index){
this.list.forEach((item,itemIndex) => {
if(index==itemIndex){
item.show=!item.show;
return;
}
// 进入下一页
let page = this.unusedData.page + 1;
getCouponPage(1, page, this.unusedData.pageSize).then(data => {
// debugger;
// 设置下页面
this.unusedData.page = page;
// 数据保存到 list 中
this.unusedData.list.push(...data.list);
// 判断页数
if (this.unusedData.list.length >= data.total) {
this.unusedData.finished = true;
}
// 标记不在加载中
this.unusedData.loading = false;
});
// GetCoupon({page:this.page}).then(response=>{
// response.List.forEach(item => {
// item.show=false;
// this.list.push(item);
// });
// this.loading = false;
// if(response.TotalPage<=this.page){
// this.finished = true;
// }
//
// })
},
// onShowInfo(id,index){
// this.list.forEach((item,itemIndex) => {
// if(index==itemIndex){
// item.show=!item.show;
// return;
// }
// });
// },
onLoadUse() {
this.usePage++;
GetCoupon({page:this.usePage}).then(response=>{
response.List.forEach(item => {
this.useList.push(item);
});
this.useLoading = false;
if(response.TotalPage<=this.usePage){
this.useFinished = true;
}
})
// 进入下一页
let page = this.usedData.page + 1;
getCouponPage(2, page, this.usedData.pageSize).then(data => {
// debugger;
// 设置下页面
this.usedData.page = page;
// 数据保存到 list 中
this.usedData.list.push(...data.list);
// 判断页数
if (this.usedData.list.length >= data.total) {
this.usedData.finished = true;
}
// 标记不在加载中
this.usedData.loading = false;
});
},
onLoadEnd() {
this.endPage++;
GetCoupon({page:this.endPage}).then(response=>{
response.List.forEach(item => {
this.endList.push(item);
});
this.endLoading = false;
if(response.TotalPage<=this.endPage){
this.endFinished = true;
}
})
// 进入下一页
let page = this.expireData.page + 1;
getCouponPage(3, page, this.expireData.pageSize).then(data => {
// debugger;
// 设置下页面
this.expireData.page = page;
// 数据保存到 list 中
this.expireData.list.push(...data.list);
// 判断页数
if (this.expireData.list.length >= data.total) {
this.expireData.finished = true;
}
// 标记不在加载中
this.expireData.loading = false;
});
},
onExchange(){
if(this.exchangeLoading){
@@ -222,9 +285,9 @@ export default {
}
this.exchangeLoading=true;
ExchangeCoupon(this.couponCode).then(response=>{
this.$toast('兑换成功');
this.$toast('兑换成功');
this.exchangeLoading=false;
this.$router.go(0);
this.$router.go(0);
})
}
}
@@ -308,7 +371,7 @@ export default {
line-height: 31px;
padding-left: 16px;
font-size: 12px;
background-color: #fcebeb;
border-left: 1px solid #f3d4d4;
border-right: 1px solid #f3d4d4;
@@ -321,10 +384,10 @@ export default {
position: absolute;
top: 8px;
-webkit-transform: rotate(90deg);
transform: rotate(90deg);
transform: rotate(90deg);
}
}
.info{
display: none;
background-color: #fcebeb;
@@ -338,14 +401,14 @@ padding: 10px 25px 12px 15px;
}
}
.show{
.couponMid {
border-bottom: 1px dashed #f3d4d4;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
i{
-webkit-transform: rotate(-90deg);
transform: rotate(-90deg);
transform: rotate(-90deg);
}
}
.info{

View File

@@ -0,0 +1,15 @@
// TODO 临时代码
export function formatDate(date, pattern) {
if (!(date instanceof Date)) {
date = new Date(date);
}
if (pattern === 'yyyy-MM-dd') {
let d = date.getDate();
let m = date.getMonth() + 1; //Month from 0 to 11
let y = date.getFullYear();
return '' + y + '-' + (m <= 9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
} else {
return '暂不支持';
}
}