Merge branch 'master' of http://git.luyuan.tk/luyuan/deming into zmr
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
.vscode
|
||||
node_modules
|
||||
/node_modules/*
|
||||
unpackage
|
12
README.md
@ -42,11 +42,11 @@
|
||||
unescapeHTML(temp){}
|
||||
|
||||
/**
|
||||
* php时间戳转为格式化日期
|
||||
* @param { String } timestamp 必填 php 返回的时间戳
|
||||
* @param { String } spacer 可选 日期间隔符,默认 '-'
|
||||
* @param { String } end 可选 年月日时分秒截止位置,默认 day,可传 second
|
||||
* @return { String } 格式化日期
|
||||
* 上传文件(只能单文件上传)
|
||||
* @param { String } url 服务器 url
|
||||
* @param { String } filePath 要上传文件资源的路径
|
||||
* @param { String } type 上传文件验证类型 默认: img 可选: video
|
||||
* @return { object } promise 对象 resolve 返回文件服务器地址 reject 返回错误信息
|
||||
*/
|
||||
timestampToDate({timestamp, spacer = '-', end = 'day'} = {}) {}
|
||||
uploadFile({ url, filePath, type = 'img' } = {}) {}
|
||||
```
|
@ -103,6 +103,14 @@ export default {
|
||||
cart_id: cart_id,
|
||||
});
|
||||
},
|
||||
// 选择地区计算运费
|
||||
getFreight({ freight_hash, city_id, area_id }) {
|
||||
return vm.$u.post('Buy/change_addr', {
|
||||
freight_hash: freight_hash,
|
||||
city_id: city_id,
|
||||
area_id: area_id,
|
||||
});
|
||||
},
|
||||
// 商品详情
|
||||
getGoodsDetails({ id }) {
|
||||
return vm.$u.post('Goods/goodDetails', {
|
||||
@ -114,6 +122,16 @@ export default {
|
||||
id: id,
|
||||
page:page
|
||||
});
|
||||
},
|
||||
getStoreImgVideoList({id}){
|
||||
return vm.$u.post('Store/getStoreImgVideoList', {
|
||||
id: id
|
||||
});
|
||||
},
|
||||
goodsInfo({id}){
|
||||
return vm.$u.post('goods/goodsInfo', {
|
||||
goods_id: id
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -195,7 +195,7 @@ export default {
|
||||
},
|
||||
// 修改绑定手机号
|
||||
changeMemberPhone({ old_mobile, old_code, new_mobile, new_code }) {
|
||||
return vm.$u.post('Member/changeMemberInfo', {
|
||||
return vm.$u.post('Member/memberChangeMobile', {
|
||||
old_mobile: old_mobile,
|
||||
old_code: old_code,
|
||||
new_mobile: new_mobile,
|
||||
@ -211,16 +211,57 @@ export default {
|
||||
return vm.$u.post('Setting/CertificateInfo');
|
||||
},
|
||||
// 用户浏览记录
|
||||
getBrowseList() {
|
||||
return vm.$u.post('Member/BrowseList');
|
||||
getBrowseList({ page }) {
|
||||
return vm.$u.post('Member/BrowseList', {
|
||||
page: page,
|
||||
});
|
||||
},
|
||||
// 意见反馈列表
|
||||
getFeedbackList({ page }) {
|
||||
return vm.$u.post('Member/feedbackList', {
|
||||
page: page,
|
||||
});
|
||||
},
|
||||
// 意见反馈-写意见
|
||||
writeFeedback({ fb_content, fb_images }) {
|
||||
return vm.$u.post('Member/writeFeedback', {
|
||||
fb_content: fb_content,
|
||||
fb_images: fb_images,
|
||||
});
|
||||
},
|
||||
// 订单列表
|
||||
getOrderList({ page }) {
|
||||
return vm.$u.post('Goods/orderList', { page });
|
||||
getOrderList({ page, type }) {
|
||||
let params = { page: page };
|
||||
if(type >= 0) Object.assign(params, {state_type: type})
|
||||
return vm.$u.post('Goods/orderList', params);
|
||||
},
|
||||
// 订单详情
|
||||
getOrderInfo({ order_id }) {
|
||||
return vm.$u.post('Goods/orderInfo', { order_id });
|
||||
return vm.$u.post('Goods/orderInfo', { order_id: order_id });
|
||||
},
|
||||
// 查询订单的评价信息
|
||||
getOrderEvaluateInfo({ id }) {
|
||||
return vm.$u.post('Order/getOrderEvaluateInfo', { id: id });
|
||||
},
|
||||
// 订单评价/修改评价
|
||||
updateOrderEvaluate({ id, content, scores_one, scores_two, scores_three, file }) {
|
||||
return vm.$u.post('Order/orderEvaluate', {
|
||||
id: id,
|
||||
content: content,
|
||||
scores_one: scores_one,
|
||||
scores_two: scores_two,
|
||||
scores_three: scores_three,
|
||||
file: file,
|
||||
});
|
||||
},
|
||||
// 上传图片视频
|
||||
uploadfile({ file }) {
|
||||
const params = {
|
||||
file: file
|
||||
}
|
||||
console.log(params);
|
||||
|
||||
return vm.$u.post('Upload/uploadfile', params);
|
||||
},
|
||||
// 信息模块
|
||||
messageIndex({ }) {
|
||||
|
@ -118,16 +118,19 @@ export default {
|
||||
// latitude,
|
||||
}).then((res)=>{
|
||||
if (res.errCode == 0) {
|
||||
this.$refs.uToast.show({
|
||||
title: res.message,
|
||||
type: 'success',
|
||||
// url: '/pageE/more/Address',
|
||||
callback() {
|
||||
uni.redirectTo({
|
||||
url: '/pageE/more/Address'
|
||||
});
|
||||
}
|
||||
})
|
||||
uni.redirectTo({
|
||||
url: '/pageE/more/Address'
|
||||
});
|
||||
// this.$refs.uToast.show({
|
||||
// title: res.message,
|
||||
// type: 'success',
|
||||
// // url: '/pageE/more/Address',
|
||||
// callback() {
|
||||
// uni.redirectTo({
|
||||
// url: '/pageE/more/Address'
|
||||
// });
|
||||
// }
|
||||
// })
|
||||
} else {
|
||||
this.showToast(res.message, 'warning');
|
||||
}
|
||||
@ -148,16 +151,19 @@ export default {
|
||||
// latitude,
|
||||
}).then((res)=>{
|
||||
if (res.errCode == 0) {
|
||||
this.$refs.uToast.show({
|
||||
title: res.message,
|
||||
type: 'success',
|
||||
// url: '/pageE/more/Address',
|
||||
callback() {
|
||||
uni.redirectTo({
|
||||
url: '/pageE/more/Address'
|
||||
});
|
||||
}
|
||||
})
|
||||
uni.redirectTo({
|
||||
url: '/pageE/more/Address'
|
||||
});
|
||||
// this.$refs.uToast.show({
|
||||
// title: res.message,
|
||||
// type: 'success',
|
||||
// // url: '/pageE/more/Address',
|
||||
// callback() {
|
||||
// uni.redirectTo({
|
||||
// url: '/pageE/more/Address'
|
||||
// });
|
||||
// }
|
||||
// })
|
||||
} else {
|
||||
this.showToast(res.message, 'warning');
|
||||
}
|
||||
|
131
components/mine/coupon/index.vue
Normal file
@ -0,0 +1,131 @@
|
||||
<template>
|
||||
<view class="c-coupon">
|
||||
<view :class="status == 0 ? 'coupon-usable' : 'coupon-unable'">
|
||||
<view class="info-type" :style="{ backgroundImage: 'url(' + (status == 0 ? '/static/image/mine/30.png' : '/static/image/mine/31.png') + ')', backgroundSize:'contain', backgroundRepeat: 'no-repeat' }">
|
||||
<div class="wrap_left_top"></div>
|
||||
{{ couponInfo.index&1 ? '店铺优惠券' : '平台优惠券' }}
|
||||
</view>
|
||||
<view class="coupon-info">
|
||||
<view class="info-usable">
|
||||
<view class="price">¥<span>10</span></view>
|
||||
<view class="condition">满100使用</view>
|
||||
</view>
|
||||
<view class="info-store u-line-1">仅限 nike官方旗舰店 鞋子商品使用</view>
|
||||
<view class="info-integral">兑换积分:200积分</view>
|
||||
<view class="info-date">有效期2018.09.06-2018.10.06</view>
|
||||
</view>
|
||||
<view class="coupon-btn">
|
||||
<text v-if="type == 0 && status == 0" @click="exchange">立即兑换</text>
|
||||
<text v-if="type == 1 && status == 0" @click="use">立即使用</text>
|
||||
<image v-if="status == 1" src="/static/image/mine/28.png"></image>
|
||||
<image v-if="status == 2" src="/static/image/mine/29.png"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
/**
|
||||
* coupon 优惠券
|
||||
* @description 优惠券组件
|
||||
* @property {Number} type 优惠券操作方式(兑换优惠券: 0 / 使用优惠券: 1)
|
||||
* @property {Object} coupon-info 优惠券信息
|
||||
* @event {Function} exchange 兑换优惠券
|
||||
* @event {Function} use 使用优惠券
|
||||
*/
|
||||
export default {
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
props: {
|
||||
status: Number,
|
||||
type: Number,
|
||||
couponInfo: Object,
|
||||
},
|
||||
methods: {
|
||||
exchange() {
|
||||
this.$emit('exchange', this.couponInfo.index);
|
||||
},
|
||||
use() {
|
||||
this.$emit('use', this.couponInfo.index);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.c-coupon {
|
||||
position: relative;
|
||||
z-index: 9;
|
||||
@mixin coupon-image($url) {
|
||||
width: 690rpx;
|
||||
height: 194rpx;
|
||||
background: url($url) no-repeat left top / contain;
|
||||
color: #FFFFFF;
|
||||
.info-type {
|
||||
width: 150rpx;
|
||||
height: 30rpx;
|
||||
line-height: 30rpx;
|
||||
font-size: 20rpx;
|
||||
border-radius: 10rpx 0rpx 10rpx 0rpx;
|
||||
padding-left: 25rpx;
|
||||
margin-bottom: 6rpx;
|
||||
}
|
||||
.coupon-info {
|
||||
z-index: 10;
|
||||
position: absolute;
|
||||
top: 36rpx;
|
||||
left: 0;
|
||||
font-weight: 500;
|
||||
padding-left: 20rpx;
|
||||
width: 360rpx;
|
||||
.info-usable{
|
||||
margin-bottom: 6rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.price {
|
||||
margin-right: 16rpx;
|
||||
font-size: 40rpx;
|
||||
> span {
|
||||
font-size: 50rpx;
|
||||
}
|
||||
}
|
||||
.condition {
|
||||
font-size: 24rpx;
|
||||
}
|
||||
}
|
||||
.info-store{
|
||||
margin-bottom: 10rpx;
|
||||
font-size: 22rpx;
|
||||
}
|
||||
.info-integral{
|
||||
margin-bottom: 10rpx;
|
||||
font-size: 22rpx;
|
||||
}
|
||||
.info-date{
|
||||
font-size: 20rpx;
|
||||
}
|
||||
}
|
||||
.coupon-btn {
|
||||
z-index: 10;
|
||||
position: absolute;
|
||||
right: 60rpx;
|
||||
top: 50%;
|
||||
transform: translate(0, -50%);
|
||||
> text {
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: rgba(255,255,255,1);
|
||||
}
|
||||
> image {
|
||||
width: 122rpx;
|
||||
height: 122rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.coupon-usable {
|
||||
@include coupon-image('/static/image/mine/26.png');
|
||||
}
|
||||
.coupon-unable {
|
||||
@include coupon-image('/static/image/mine/27.png');
|
||||
}
|
||||
}
|
||||
</style>
|
@ -2,30 +2,32 @@
|
||||
<view class="order-item">
|
||||
<view class="order-title">
|
||||
<view class="store-info">
|
||||
<image src="@/pageE/static/mine/23.png"></image>
|
||||
<view class="store-name">胖胖的店</view>
|
||||
<image :src="order.extend_store.store_avatar"></image>
|
||||
<view class="store-name">{{ order.extend_store.store_name }}</view>
|
||||
</view>
|
||||
<view class="order-status">交易成功</view>
|
||||
<view class="order-status">{{ order.order_state | viewState }}</view>
|
||||
</view>
|
||||
<view class="goods-info" @click="toDetailsPage">
|
||||
<image src="@/pageE/static/mine/23.png"></image>
|
||||
<view class="goods-text">
|
||||
<view class="goods-name u-line-2">木糖少女小紫薯西装领连衣裙夏季新款女装夏收腰格子格纹裙子</view>
|
||||
<view class="goods-sku u-line-1" v-if="current !== 5 && current !== 6">XL;红色条纹XL;红色条纹XL;红色条纹</view>
|
||||
<view class="goods-time u-line-1" v-if="current == 1 || current == 4">距离结束:23:23:38</view>
|
||||
<view class="goods-price u-line-1" v-if="current == 5 || current == 6">总价:¥99.00,实付款¥99</view>
|
||||
<view class="goods-date" v-if="current == 5 || current == 6">
|
||||
<image src="@/pageE/static/mine/26.png"></image>
|
||||
<view>2020.05.17</view>
|
||||
<view class="goods-info">
|
||||
<view class="goods-item" @click="toDetailsPage" v-for="goods in order.extend_order_goods" :key="goods.goods_id">
|
||||
<image :src="goods.goods_image"></image>
|
||||
<view class="goods-text">
|
||||
<view class="goods-name u-line-2">{{ goods.goods_name }}</view>
|
||||
<view class="goods-sku u-line-1" v-if="order.order_state !== 20 && order.order_state !== 40">XL;红色条纹XL;红色条纹XL;红色条纹</view>
|
||||
<view class="goods-time u-line-1" v-if="order.order_state == 10 || order.order_state == 10">距离结束:23:23:38</view>
|
||||
<view class="goods-price u-line-1" v-if="order.order_state == 20 || order.order_state == 40">总价:¥99.00,实付款¥99</view>
|
||||
<view class="goods-date" v-if="order.order_state == 20 || order.order_state == 40">
|
||||
<image src="@/pageE/static/mine/26.png"></image>
|
||||
<view>2020.05.17</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="order-btn" v-if="[0, 2, 4].indexOf(current) < 0">
|
||||
<view class="logistics" v-if="current == 3" @click="toLogistics">查看物流</view>
|
||||
<view class="comment" v-if="current == 5" @click="toComment">立即评价</view>
|
||||
<view class="payment" v-if="current == 1">立即支付</view>
|
||||
<view class="service" v-if="current == 6">联系官方客服</view>
|
||||
<view class="submit" v-if="current == 6">提交官方审核</view>
|
||||
<view class="order-btn" v-if="[10, 30, 20, 40].indexOf(order.order_state) >= 0">
|
||||
<view class="logistics" v-if="order.order_state == 30" @click="toLogistics">查看物流</view>
|
||||
<view class="comment" v-if="order.order_state == 20" @click="toComment">立即评价</view>
|
||||
<view class="payment" v-if="order.order_state == 10">立即支付</view>
|
||||
<view class="service" v-if="order.order_state == 40">联系官方客服</view>
|
||||
<view class="submit" v-if="order.order_state == 40">提交官方审核</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
@ -35,12 +37,40 @@ export default {
|
||||
return {}
|
||||
},
|
||||
props: {
|
||||
current: Number
|
||||
order: Object
|
||||
},
|
||||
filters: {
|
||||
viewState(value) {
|
||||
let state;
|
||||
switch (value) {
|
||||
case 10:
|
||||
state = '待支付';
|
||||
break;
|
||||
case 0:
|
||||
state = '已取消';
|
||||
break;
|
||||
case 30:
|
||||
state = '待收货';
|
||||
break;
|
||||
case -1:
|
||||
state = '试穿试送';
|
||||
break;
|
||||
case 20:
|
||||
state = '待评价';
|
||||
break;
|
||||
case 40:
|
||||
state = '售后';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return state;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
toDetailsPage() {
|
||||
uni.navigateTo({
|
||||
url: '/pageE/order/Details?current=' + this.current
|
||||
url: '/pageE/order/Details?order.order_state=' + this.order.order_state
|
||||
});
|
||||
},
|
||||
toLogistics() {
|
||||
@ -87,49 +117,51 @@ export default {
|
||||
}
|
||||
}
|
||||
.goods-info {
|
||||
display: flex;
|
||||
margin-bottom: 28rpx;
|
||||
> image {
|
||||
flex-shrink: 0;
|
||||
width: 180rpx;
|
||||
height: 160rpx;
|
||||
border-radius: 10rpx;
|
||||
margin-right: 30rpx;
|
||||
}
|
||||
.goods-text {
|
||||
.goods-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
.goods-name {
|
||||
font-size: 28rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
line-height: 38rpx;
|
||||
margin-bottom: 28rpx;
|
||||
> image {
|
||||
flex-shrink: 0;
|
||||
width: 180rpx;
|
||||
height: 160rpx;
|
||||
border-radius: 10rpx;
|
||||
margin-right: 30rpx;
|
||||
}
|
||||
.goods-sku {
|
||||
max-width: 230rpx;
|
||||
background: rgba(236,236,236,1);
|
||||
border-radius: 6rpx;
|
||||
padding: 10rpx 15rpx;
|
||||
font-size: 24rpx;
|
||||
color: rgba(153,153,153,1);
|
||||
}
|
||||
.goods-time {
|
||||
font-size: 24rpx;
|
||||
color: rgba(255,49,49,1);
|
||||
}
|
||||
.goods-price {
|
||||
font-size: 24rpx;
|
||||
color: rgba(253,211,96,1);
|
||||
}
|
||||
.goods-date {
|
||||
.goods-text {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 24rpx;
|
||||
color: rgba(153,153,153,1);
|
||||
> image {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin-right: 21rpx;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
.goods-name {
|
||||
font-size: 28rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
line-height: 38rpx;
|
||||
}
|
||||
.goods-sku {
|
||||
max-width: 230rpx;
|
||||
background: rgba(236,236,236,1);
|
||||
border-radius: 6rpx;
|
||||
padding: 10rpx 15rpx;
|
||||
font-size: 24rpx;
|
||||
color: rgba(153,153,153,1);
|
||||
}
|
||||
.goods-time {
|
||||
font-size: 24rpx;
|
||||
color: rgba(255,49,49,1);
|
||||
}
|
||||
.goods-price {
|
||||
font-size: 24rpx;
|
||||
color: rgba(253,211,96,1);
|
||||
}
|
||||
.goods-date {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 24rpx;
|
||||
color: rgba(153,153,153,1);
|
||||
> image {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin-right: 21rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,245 +0,0 @@
|
||||
const BindingX = uni.requireNativePlugin('bindingx');
|
||||
const dom = uni.requireNativePlugin('dom');
|
||||
const animation = uni.requireNativePlugin('animation');
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
right: 0,
|
||||
button: [],
|
||||
preventGesture: false
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
show(newVal) {
|
||||
if (!this.position || JSON.stringify(this.position) === '{}') return;
|
||||
if (this.autoClose) return
|
||||
if (this.isInAnimation) return
|
||||
if (newVal) {
|
||||
this.open()
|
||||
} else {
|
||||
this.close()
|
||||
}
|
||||
},
|
||||
},
|
||||
created() {
|
||||
if (this.swipeaction.children !== undefined) {
|
||||
this.swipeaction.children.push(this)
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.boxSelector = this.getEl(this.$refs['selector-box-hock']);
|
||||
this.selector = this.getEl(this.$refs['selector-content-hock']);
|
||||
this.buttonSelector = this.getEl(this.$refs['selector-button-hock']);
|
||||
this.position = {}
|
||||
this.x = 0
|
||||
setTimeout(() => {
|
||||
this.getSelectorQuery()
|
||||
}, 200)
|
||||
},
|
||||
beforeDestroy() {
|
||||
if (this.timing) {
|
||||
BindingX.unbind({
|
||||
token: this.timing.token,
|
||||
eventType: 'timing'
|
||||
})
|
||||
}
|
||||
if (this.eventpan) {
|
||||
BindingX.unbind({
|
||||
token: this.eventpan.token,
|
||||
eventType: 'pan'
|
||||
})
|
||||
}
|
||||
this.swipeaction.children.forEach((item, index) => {
|
||||
if (item === this) {
|
||||
this.swipeaction.children.splice(index, 1)
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
onClick(index, item) {
|
||||
this.$emit('click', {
|
||||
content: item,
|
||||
index
|
||||
})
|
||||
},
|
||||
touchstart(e) {
|
||||
if (this.isInAnimation) return
|
||||
if (this.stop) return
|
||||
this.stop = true
|
||||
if (this.autoClose) {
|
||||
this.swipeaction.closeOther(this)
|
||||
}
|
||||
let endWidth = this.right
|
||||
let boxStep = `(x+${this.x})`
|
||||
let pageX = `${boxStep}> ${-endWidth} && ${boxStep} < 0?${boxStep}:(x+${this.x} < 0? ${-endWidth}:0)`
|
||||
|
||||
let props = [{
|
||||
element: this.selector,
|
||||
property: 'transform.translateX',
|
||||
expression: pageX
|
||||
}]
|
||||
|
||||
let left = 0
|
||||
for (let i = 0; i < this.options.length; i++) {
|
||||
let buttonSelectors = this.getEl(this.$refs['button-hock'][i]);
|
||||
if (this.button.length === 0 || !this.button[i] || !this.button[i].width) return
|
||||
let moveMix = endWidth - left
|
||||
left += this.button[i].width
|
||||
let step = `(${this.x}+x)/${endWidth}`
|
||||
let moveX = `(${step}) * ${moveMix}`
|
||||
let pageButtonX = `${moveX}&& (x+${this.x} > ${-endWidth})?${moveX}:${-moveMix}`
|
||||
props.push({
|
||||
element: buttonSelectors,
|
||||
property: 'transform.translateX',
|
||||
expression: pageButtonX
|
||||
})
|
||||
}
|
||||
|
||||
this.eventpan = this._bind(this.boxSelector, props, 'pan', (e) => {
|
||||
if (e.state === 'end') {
|
||||
this.x = e.deltaX + this.x;
|
||||
if (this.x < -endWidth) {
|
||||
this.x = -endWidth
|
||||
}
|
||||
if (this.x > 0) {
|
||||
this.x = 0
|
||||
}
|
||||
this.stop = false
|
||||
this.bindTiming();
|
||||
}
|
||||
})
|
||||
},
|
||||
touchend(e) {
|
||||
this.$nextTick(() => {
|
||||
if (this.isopen && !this.isDrag && !this.isInAnimation) {
|
||||
this.close()
|
||||
}
|
||||
})
|
||||
},
|
||||
bindTiming() {
|
||||
if (this.isopen) {
|
||||
this.move(this.x, -this.right)
|
||||
} else {
|
||||
this.move(this.x, -40)
|
||||
}
|
||||
},
|
||||
move(left, value) {
|
||||
if (left >= value) {
|
||||
this.close()
|
||||
} else {
|
||||
this.open()
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 开启swipe
|
||||
*/
|
||||
open() {
|
||||
this.animation(true)
|
||||
},
|
||||
/**
|
||||
* 关闭swipe
|
||||
*/
|
||||
close() {
|
||||
this.animation(false)
|
||||
},
|
||||
/**
|
||||
* 开启关闭动画
|
||||
* @param {Object} type
|
||||
*/
|
||||
animation(type) {
|
||||
this.isDrag = true
|
||||
let endWidth = this.right
|
||||
let time = 200
|
||||
this.isInAnimation = true;
|
||||
|
||||
let exit = `t>${time}`;
|
||||
let translate_x_expression = `easeOutExpo(t,${this.x},${type?(-endWidth-this.x):(-this.x)},${time})`
|
||||
let props = [{
|
||||
element: this.selector,
|
||||
property: 'transform.translateX',
|
||||
expression: translate_x_expression
|
||||
}]
|
||||
|
||||
let left = 0
|
||||
for (let i = 0; i < this.options.length; i++) {
|
||||
let buttonSelectors = this.getEl(this.$refs['button-hock'][i]);
|
||||
if (this.button.length === 0 || !this.button[i] || !this.button[i].width) return
|
||||
let moveMix = endWidth - left
|
||||
left += this.button[i].width
|
||||
let step = `${this.x}/${endWidth}`
|
||||
let moveX = `(${step}) * ${moveMix}`
|
||||
let pageButtonX = `easeOutExpo(t,${moveX},${type ? -moveMix + '-' + moveX: 0 + '-' + moveX},${time})`
|
||||
props.push({
|
||||
element: buttonSelectors,
|
||||
property: 'transform.translateX',
|
||||
expression: pageButtonX
|
||||
})
|
||||
}
|
||||
|
||||
this.timing = BindingX.bind({
|
||||
eventType: 'timing',
|
||||
exitExpression: exit,
|
||||
props: props
|
||||
}, (e) => {
|
||||
if (e.state === 'end' || e.state === 'exit') {
|
||||
this.x = type ? -endWidth : 0
|
||||
this.isInAnimation = false;
|
||||
|
||||
this.isopen = this.isopen || false
|
||||
if (this.isopen !== type) {
|
||||
this.$emit('change', type)
|
||||
}
|
||||
this.isopen = type
|
||||
this.isDrag = false
|
||||
}
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 绑定 BindingX
|
||||
* @param {Object} anchor
|
||||
* @param {Object} props
|
||||
* @param {Object} fn
|
||||
*/
|
||||
_bind(anchor, props, eventType, fn) {
|
||||
return BindingX.bind({
|
||||
anchor,
|
||||
eventType,
|
||||
props
|
||||
}, (e) => {
|
||||
typeof(fn) === 'function' && fn(e)
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 获取ref
|
||||
* @param {Object} el
|
||||
*/
|
||||
getEl(el) {
|
||||
return el.ref
|
||||
},
|
||||
/**
|
||||
* 获取节点信息
|
||||
*/
|
||||
getSelectorQuery() {
|
||||
dom.getComponentRect(this.$refs['selector-content-hock'], (data) => {
|
||||
if (this.position.content) return
|
||||
this.position.content = data.size
|
||||
})
|
||||
for (let i = 0; i < this.options.length; i++) {
|
||||
dom.getComponentRect(this.$refs['button-hock'][i], (data) => {
|
||||
if (!this.button) {
|
||||
this.button = []
|
||||
}
|
||||
if (this.options.length === this.button.length) return
|
||||
this.button.push(data.size)
|
||||
this.right += data.size.width
|
||||
if (this.autoClose) return
|
||||
if (this.show) {
|
||||
this.open()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,204 +0,0 @@
|
||||
/**
|
||||
* 监听页面内值的变化,主要用于动态开关swipe-action
|
||||
* @param {Object} newValue
|
||||
* @param {Object} oldValue
|
||||
* @param {Object} ownerInstance
|
||||
* @param {Object} instance
|
||||
*/
|
||||
function sizeReady(newValue, oldValue, ownerInstance, instance) {
|
||||
var state = instance.getState()
|
||||
state.position = JSON.parse(newValue)
|
||||
if (!state.position || state.position.length === 0) return
|
||||
var show = state.position[0].show
|
||||
state.left = state.left || state.position[0].left;
|
||||
// 通过用户变量,开启或关闭
|
||||
if (show) {
|
||||
openState(true, instance, ownerInstance)
|
||||
} else {
|
||||
openState(false, instance, ownerInstance)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始触摸操作
|
||||
* @param {Object} e
|
||||
* @param {Object} ins
|
||||
*/
|
||||
function touchstart(e, ins) {
|
||||
var instance = e.instance;
|
||||
var state = instance.getState();
|
||||
var pageX = e.touches[0].pageX;
|
||||
// 开始触摸时移除动画类
|
||||
instance.removeClass('ani');
|
||||
var owner = ins.selectAllComponents('.button-hock')
|
||||
for (var i = 0; i < owner.length; i++) {
|
||||
owner[i].removeClass('ani');
|
||||
}
|
||||
// state.position = JSON.parse(instance.getDataset().position);
|
||||
state.left = state.left || state.position[0].left;
|
||||
// 获取最终按钮组的宽度
|
||||
state.width = pageX - state.left;
|
||||
ins.callMethod('closeSwipe')
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始滑动操作
|
||||
* @param {Object} e
|
||||
* @param {Object} ownerInstance
|
||||
*/
|
||||
function touchmove(e, ownerInstance) {
|
||||
var instance = e.instance;
|
||||
var disabled = instance.getDataset().disabled
|
||||
var state = instance.getState()
|
||||
// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
|
||||
disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
|
||||
|
||||
if (disabled) return
|
||||
var pageX = e.touches[0].pageX;
|
||||
move(pageX - state.width, instance, ownerInstance)
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束触摸操作
|
||||
* @param {Object} e
|
||||
* @param {Object} ownerInstance
|
||||
*/
|
||||
function touchend(e, ownerInstance) {
|
||||
var instance = e.instance;
|
||||
var disabled = instance.getDataset().disabled
|
||||
var state = instance.getState()
|
||||
|
||||
// fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
|
||||
disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
|
||||
|
||||
if (disabled) return
|
||||
// 滑动过程中触摸结束,通过阙值判断是开启还是关闭
|
||||
// fixed by mehaotian 定时器解决点击按钮,touchend 触发比 click 事件时机早的问题 ,主要是 ios13
|
||||
moveDirection(state.left, -40, instance, ownerInstance)
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置移动距离
|
||||
* @param {Object} value
|
||||
* @param {Object} instance
|
||||
* @param {Object} ownerInstance
|
||||
*/
|
||||
function move(value, instance, ownerInstance) {
|
||||
var state = instance.getState()
|
||||
// 获取可滑动范围
|
||||
var x = Math.max(-state.position[1].width, Math.min((value), 0));
|
||||
state.left = x;
|
||||
instance.setStyle({
|
||||
transform: 'translateX(' + x + 'px)',
|
||||
'-webkit-transform': 'translateX(' + x + 'px)'
|
||||
})
|
||||
// 折叠按钮动画
|
||||
buttonFold(x, instance, ownerInstance)
|
||||
}
|
||||
|
||||
/**
|
||||
* 移动方向判断
|
||||
* @param {Object} left
|
||||
* @param {Object} value
|
||||
* @param {Object} ownerInstance
|
||||
* @param {Object} ins
|
||||
*/
|
||||
function moveDirection(left, value, ins, ownerInstance) {
|
||||
var state = ins.getState()
|
||||
var position = state.position
|
||||
var isopen = state.isopen
|
||||
if (!position[1].width) {
|
||||
openState(false, ins, ownerInstance)
|
||||
return
|
||||
}
|
||||
// 如果已经是打开状态,进行判断是否关闭,还是保留打开状态
|
||||
if (isopen) {
|
||||
if (-left <= position[1].width) {
|
||||
openState(false, ins, ownerInstance)
|
||||
} else {
|
||||
openState(true, ins, ownerInstance)
|
||||
}
|
||||
return
|
||||
}
|
||||
// 如果是关闭状态,进行判断是否打开,还是保留关闭状态
|
||||
if (left <= value) {
|
||||
openState(true, ins, ownerInstance)
|
||||
} else {
|
||||
openState(false, ins, ownerInstance)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置按钮移动距离
|
||||
* @param {Object} value
|
||||
* @param {Object} instance
|
||||
* @param {Object} ownerInstance
|
||||
*/
|
||||
function buttonFold(value, instance, ownerInstance) {
|
||||
var ins = ownerInstance.selectAllComponents('.button-hock');
|
||||
var state = instance.getState();
|
||||
var position = state.position;
|
||||
var arr = [];
|
||||
var w = 0;
|
||||
for (var i = 0; i < ins.length; i++) {
|
||||
if (!ins[i].getDataset().button) return
|
||||
var btnData = JSON.parse(ins[i].getDataset().button)
|
||||
|
||||
// fix by mehaotian TODO 在 app-vue 中,字符串转对象,需要转两次,这里先这么兼容
|
||||
if (typeof(btnData) === 'string') {
|
||||
btnData = JSON.parse(btnData)
|
||||
}
|
||||
|
||||
var button = btnData[i] && btnData[i].width || 0
|
||||
w += button
|
||||
arr.push(-w)
|
||||
// 动态计算按钮组每个按钮的折叠动画移动距离
|
||||
var distance = arr[i - 1] + value * (arr[i - 1] / position[1].width)
|
||||
if (i != 0) {
|
||||
ins[i].setStyle({
|
||||
transform: 'translateX(' + distance + 'px)',
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 开启状态
|
||||
* @param {Boolean} type
|
||||
* @param {Object} ins
|
||||
* @param {Object} ownerInstance
|
||||
*/
|
||||
function openState(type, ins, ownerInstance) {
|
||||
var state = ins.getState()
|
||||
var position = state.position
|
||||
if (state.isopen === undefined) {
|
||||
state.isopen = false
|
||||
}
|
||||
// 只有状态有改变才会通知页面改变状态
|
||||
if (state.isopen !== type) {
|
||||
// 通知页面,已经打开
|
||||
ownerInstance.callMethod('change', {
|
||||
open: type
|
||||
})
|
||||
}
|
||||
// 设置打开和移动状态
|
||||
state.isopen = type
|
||||
|
||||
|
||||
// 添加动画类
|
||||
ins.addClass('ani');
|
||||
var owner = ownerInstance.selectAllComponents('.button-hock')
|
||||
for (var i = 0; i < owner.length; i++) {
|
||||
owner[i].addClass('ani');
|
||||
}
|
||||
// 设置最终移动位置
|
||||
move(type ? -position[1].width : 0, ins, ownerInstance)
|
||||
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
sizeReady: sizeReady,
|
||||
touchstart: touchstart,
|
||||
touchmove: touchmove,
|
||||
touchend: touchend
|
||||
}
|
@ -1,160 +0,0 @@
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
isshow: false,
|
||||
viewWidth: 0,
|
||||
buttonWidth: 0,
|
||||
disabledView: false,
|
||||
x: 0,
|
||||
transition: false
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
show(newVal) {
|
||||
if (this.autoClose) return
|
||||
if (newVal) {
|
||||
this.open()
|
||||
} else {
|
||||
this.close()
|
||||
}
|
||||
},
|
||||
},
|
||||
created() {
|
||||
if (this.swipeaction.children !== undefined) {
|
||||
this.swipeaction.children.push(this)
|
||||
}
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.swipeaction.children.forEach((item, index) => {
|
||||
if (item === this) {
|
||||
this.swipeaction.children.splice(index, 1)
|
||||
}
|
||||
})
|
||||
},
|
||||
mounted() {
|
||||
this.isopen = false
|
||||
this.transition = true
|
||||
setTimeout(() => {
|
||||
this.getQuerySelect()
|
||||
}, 50)
|
||||
|
||||
},
|
||||
methods: {
|
||||
onClick(index, item) {
|
||||
this.$emit('click', {
|
||||
content: item,
|
||||
index
|
||||
})
|
||||
},
|
||||
touchstart(e) {
|
||||
let {
|
||||
pageX,
|
||||
pageY
|
||||
} = e.changedTouches[0]
|
||||
this.transition = false
|
||||
this.startX = pageX
|
||||
if (this.autoClose) {
|
||||
this.swipeaction.closeOther(this)
|
||||
}
|
||||
},
|
||||
touchmove(e) {
|
||||
let {
|
||||
pageX,
|
||||
} = e.changedTouches[0]
|
||||
this.slide = this.getSlide(pageX)
|
||||
if (this.slide === 0) {
|
||||
this.disabledView = false
|
||||
}
|
||||
|
||||
},
|
||||
touchend(e) {
|
||||
this.stop = false
|
||||
this.transition = true
|
||||
if (this.isopen) {
|
||||
if (this.moveX === -this.buttonWidth) {
|
||||
this.close()
|
||||
return
|
||||
}
|
||||
this.move()
|
||||
} else {
|
||||
if (this.moveX === 0) {
|
||||
this.close()
|
||||
return
|
||||
}
|
||||
this.move()
|
||||
}
|
||||
},
|
||||
open() {
|
||||
this.x = this.moveX
|
||||
this.$nextTick(() => {
|
||||
this.x = -this.buttonWidth
|
||||
this.moveX = this.x
|
||||
|
||||
if(!this.isopen){
|
||||
this.isopen = true
|
||||
this.$emit('change', true)
|
||||
}
|
||||
})
|
||||
},
|
||||
close() {
|
||||
this.x = this.moveX
|
||||
this.$nextTick(() => {
|
||||
this.x = 0
|
||||
this.moveX = this.x
|
||||
if(this.isopen){
|
||||
this.isopen = false
|
||||
this.$emit('change', false)
|
||||
}
|
||||
})
|
||||
},
|
||||
move() {
|
||||
if (this.slide === 0) {
|
||||
this.open()
|
||||
} else {
|
||||
this.close()
|
||||
}
|
||||
},
|
||||
onChange(e) {
|
||||
let x = e.detail.x
|
||||
this.moveX = x
|
||||
if (x >= this.buttonWidth) {
|
||||
this.disabledView = true
|
||||
this.$nextTick(() => {
|
||||
this.x = this.buttonWidth
|
||||
})
|
||||
}
|
||||
},
|
||||
getSlide(x) {
|
||||
if (x >= this.startX) {
|
||||
this.startX = x
|
||||
return 1
|
||||
} else {
|
||||
this.startX = x
|
||||
return 0
|
||||
}
|
||||
|
||||
},
|
||||
getQuerySelect() {
|
||||
const query = uni.createSelectorQuery().in(this);
|
||||
query.selectAll('.viewWidth-hook').boundingClientRect(data => {
|
||||
|
||||
this.viewWidth = data[0].width
|
||||
this.buttonWidth = data[1].width
|
||||
this.transition = false
|
||||
this.$nextTick(() => {
|
||||
this.transition = true
|
||||
})
|
||||
|
||||
if (!this.buttonWidth) {
|
||||
this.disabledView = true
|
||||
}
|
||||
|
||||
if (this.autoClose) return
|
||||
if (this.show) {
|
||||
this.open()
|
||||
}
|
||||
}).exec();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,158 +0,0 @@
|
||||
// #ifdef APP-NVUE
|
||||
const dom = weex.requireModule('dom');
|
||||
// #endif
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
uniShow: false,
|
||||
left: 0
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
moveLeft() {
|
||||
return `translateX(${this.left}px)`
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
show(newVal) {
|
||||
if (!this.position || JSON.stringify(this.position) === '{}') return;
|
||||
if (this.autoClose) return
|
||||
if (newVal) {
|
||||
this.$emit('change', true)
|
||||
this.open()
|
||||
} else {
|
||||
this.$emit('change', false)
|
||||
this.close()
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.position = {}
|
||||
if (this.swipeaction.children !== undefined) {
|
||||
this.swipeaction.children.push(this)
|
||||
}
|
||||
setTimeout(() => {
|
||||
this.getSelectorQuery()
|
||||
}, 100)
|
||||
},
|
||||
beforeDestoy() {
|
||||
this.swipeaction.children.forEach((item, index) => {
|
||||
if (item === this) {
|
||||
this.swipeaction.children.splice(index, 1)
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
onClick(index, item) {
|
||||
this.$emit('click', {
|
||||
content: item,
|
||||
index
|
||||
})
|
||||
this.close()
|
||||
},
|
||||
touchstart(e) {
|
||||
const {
|
||||
pageX
|
||||
} = e.touches[0]
|
||||
if (this.disabled) return
|
||||
const left = this.position.content.left
|
||||
if (this.autoClose) {
|
||||
this.swipeaction.closeOther(this)
|
||||
}
|
||||
this.width = pageX - left
|
||||
if (this.isopen) return
|
||||
if (this.uniShow) {
|
||||
this.uniShow = false
|
||||
this.isopen = true
|
||||
this.openleft = this.left + this.position.button.width
|
||||
}
|
||||
},
|
||||
touchmove(e, index) {
|
||||
if (this.disabled) return
|
||||
const {
|
||||
pageX
|
||||
} = e.touches[0]
|
||||
this.setPosition(pageX)
|
||||
},
|
||||
touchend() {
|
||||
if (this.disabled) return
|
||||
if (this.isopen) {
|
||||
this.move(this.openleft, 0)
|
||||
return
|
||||
}
|
||||
this.move(this.left, -40)
|
||||
},
|
||||
setPosition(x, y) {
|
||||
if (!this.position.button.width) {
|
||||
return
|
||||
}
|
||||
// this.left = x - this.width
|
||||
this.setValue(x - this.width)
|
||||
},
|
||||
setValue(value) {
|
||||
// 设置最大最小值
|
||||
this.left = Math.max(-this.position.button.width, Math.min(parseInt(value), 0))
|
||||
this.position.content.left = this.left
|
||||
if (this.isopen) {
|
||||
this.openleft = this.left + this.position.button.width
|
||||
}
|
||||
},
|
||||
move(left, value) {
|
||||
if (left >= value) {
|
||||
this.$emit('change', false)
|
||||
this.close()
|
||||
} else {
|
||||
this.$emit('change', true)
|
||||
this.open()
|
||||
}
|
||||
},
|
||||
open() {
|
||||
this.uniShow = true
|
||||
this.left = -this.position.button.width
|
||||
this.setValue(-this.position.button.width)
|
||||
},
|
||||
close() {
|
||||
this.uniShow = true
|
||||
this.setValue(0)
|
||||
setTimeout(() => {
|
||||
this.uniShow = false
|
||||
this.isopen = false
|
||||
}, 300)
|
||||
},
|
||||
getSelectorQuery() {
|
||||
// #ifndef APP-NVUE
|
||||
const views = uni.createSelectorQuery()
|
||||
.in(this)
|
||||
views
|
||||
.selectAll('.selector-query-hock')
|
||||
.boundingClientRect(data => {
|
||||
this.position.content = data[1]
|
||||
this.position.button = data[0]
|
||||
if (this.autoClose) return
|
||||
if (this.show) {
|
||||
this.open()
|
||||
} else {
|
||||
this.close()
|
||||
}
|
||||
})
|
||||
.exec()
|
||||
// #endif
|
||||
// #ifdef APP-NVUE
|
||||
dom.getComponentRect(this.$refs['selector-content-hock'], (data) => {
|
||||
if (this.position.content) return
|
||||
this.position.content = data.size
|
||||
})
|
||||
dom.getComponentRect(this.$refs['selector-button-hock'], (data) => {
|
||||
if (this.position.button) return
|
||||
this.position.button = data.size
|
||||
if (this.autoClose) return
|
||||
if (this.show) {
|
||||
this.open()
|
||||
} else {
|
||||
this.close()
|
||||
}
|
||||
})
|
||||
// #endif
|
||||
}
|
||||
}
|
||||
}
|
@ -1,97 +0,0 @@
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
position: [],
|
||||
button: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
pos() {
|
||||
return JSON.stringify(this.position)
|
||||
},
|
||||
btn() {
|
||||
return JSON.stringify(this.button)
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
show(newVal) {
|
||||
if (this.autoClose) return
|
||||
let valueObj = this.position[0]
|
||||
if (!valueObj) {
|
||||
this.init()
|
||||
return
|
||||
}
|
||||
valueObj.show = newVal
|
||||
this.$set(this.position, 0, valueObj)
|
||||
}
|
||||
},
|
||||
created() {
|
||||
if (this.swipeaction.children !== undefined) {
|
||||
this.swipeaction.children.push(this)
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.init()
|
||||
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.swipeaction.children.forEach((item, index) => {
|
||||
if (item === this) {
|
||||
this.swipeaction.children.splice(index, 1)
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
|
||||
setTimeout(() => {
|
||||
this.getSize()
|
||||
this.getButtonSize()
|
||||
}, 50)
|
||||
},
|
||||
closeSwipe(e) {
|
||||
if (!this.autoClose) return
|
||||
this.swipeaction.closeOther(this)
|
||||
},
|
||||
|
||||
change(e) {
|
||||
this.$emit('change', e.open)
|
||||
let valueObj = this.position[0]
|
||||
if (valueObj.show !== e.open) {
|
||||
valueObj.show = e.open
|
||||
this.$set(this.position, 0, valueObj)
|
||||
}
|
||||
},
|
||||
onClick(index, item) {
|
||||
this.$emit('click', {
|
||||
content: item,
|
||||
index
|
||||
})
|
||||
},
|
||||
appTouchStart(){},
|
||||
appTouchEnd(){},
|
||||
getSize() {
|
||||
const views = uni.createSelectorQuery().in(this)
|
||||
views
|
||||
.selectAll('.selector-query-hock')
|
||||
.boundingClientRect(data => {
|
||||
if (this.autoClose) {
|
||||
data[0].show = false
|
||||
} else {
|
||||
data[0].show = this.show
|
||||
}
|
||||
this.position = data
|
||||
})
|
||||
.exec()
|
||||
},
|
||||
getButtonSize() {
|
||||
const views = uni.createSelectorQuery().in(this)
|
||||
views
|
||||
.selectAll('.button-hock')
|
||||
.boundingClientRect(data => {
|
||||
this.button = data
|
||||
})
|
||||
.exec()
|
||||
}
|
||||
}
|
||||
}
|
@ -1,270 +0,0 @@
|
||||
<template>
|
||||
<view class="uni-swipe">
|
||||
<!-- 在微信小程序 app vue端 h5 使用wxs 实现-->
|
||||
<!-- #ifdef APP-VUE || MP-WEIXIN || H5 -->
|
||||
<view class="uni-swipe_content">
|
||||
<view :data-disabled="disabled" :data-position="pos" :change:prop="swipe.sizeReady" :prop="pos" class="uni-swipe_move-box selector-query-hock move-hock"
|
||||
@touchstart="swipe.touchstart" @touchmove="swipe.touchmove" @touchend="swipe.touchend" @change="change">
|
||||
<view class="uni-swipe_box">
|
||||
<slot />
|
||||
</view>
|
||||
<view ref="selector-button-hock" class="uni-swipe_button-group selector-query-hock move-hock">
|
||||
<!-- 使用 touchend 解决 ios 13 不触发按钮事件的问题-->
|
||||
<view v-for="(item,index) in options" :data-button="btn" :key="index" :style="{
|
||||
backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
|
||||
fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
|
||||
}"
|
||||
class="uni-swipe_button button-hock" @touchend="onClick(index,item)"><text class="uni-swipe_button-text" :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
|
||||
<!-- app nvue端 使用 bindingx -->
|
||||
<!-- #ifdef APP-NVUE -->
|
||||
<view ref="selector-box-hock" class="uni-swipe_content" @horizontalpan="touchstart" @touchend="touchend">
|
||||
<view ref="selector-button-hock" class="uni-swipe_button-group selector-query-hock move-hock" :style="{width:right+'px'}">
|
||||
<view ref="button-hock" v-for="(item,index) in options" :key="index" :style="{
|
||||
backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',left: right+'px'}"
|
||||
class="uni-swipe_button " @click.stop="onClick(index,item)"><text class="uni-swipe_button-text" :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'}">{{ item.text }}</text></view>
|
||||
</view>
|
||||
<view ref='selector-content-hock' class="uni-swipe_move-box selector-query-hock">
|
||||
<view class="uni-swipe_box">
|
||||
<slot />
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
|
||||
<!-- 在非 app 端、非微信小程序、支付宝小程序、h5端使用 js -->
|
||||
<!-- #ifndef APP-PLUS || MP-WEIXIN || MP-ALIPAY || H5 -->
|
||||
<view class="uni-swipe_content">
|
||||
<view ref="selector-button-hock" class="uni-swipe_button-group selector-query-hock move-hock">
|
||||
<view v-for="(item,index) in options" :data-button="btn" :key="index" :style="{
|
||||
backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
|
||||
fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
|
||||
}"
|
||||
class="uni-swipe_button button-hock" @click.stop="onClick(index,item)"><text class="uni-swipe_button-text" :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text></view>
|
||||
</view>
|
||||
<view ref='selector-content-hock' class="selector-query-hock" @touchstart="touchstart" @touchmove="touchmove"
|
||||
@touchend="touchend" :class="{'ani':uniShow}" :style="{transform:moveLeft}">
|
||||
<view class="uni-swipe_move-box" >
|
||||
<view class="uni-swipe_box">
|
||||
<slot />
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
<!-- #ifdef MP-ALIPAY -->
|
||||
<view class="uni-swipe-box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend">
|
||||
<view class="viewWidth-hook">
|
||||
<movable-area v-if="viewWidth !== 0" class="movable-area" :style="{width:(viewWidth-buttonWidth)+'px'}">
|
||||
<movable-view class="movable-view" direction="horizontal" :animation="!transition" :style="{width:viewWidth+'px'}"
|
||||
:class="[transition?'transition':'']" :x="x" :disabled="disabledView" @change="onChange">
|
||||
<view class="movable-view-box">
|
||||
<slot></slot>
|
||||
</view>
|
||||
</movable-view>
|
||||
</movable-area>
|
||||
</view>
|
||||
<view ref="selector-button-hock" class="uni-swipe_button-group viewWidth-hook">
|
||||
<view v-for="(item,index) in options" :data-button="btn" :key="index" :style="{
|
||||
backgroundColor: item.style && item.style.backgroundColor ? item.style.backgroundColor : '#C7C6CD',
|
||||
fontSize: item.style && item.style.fontSize ? item.style.fontSize : '16px'
|
||||
}"
|
||||
class="uni-swipe_button button-hock" @click.stop="onClick(index,item)"><text class="uni-swipe_button-text" :style="{color: item.style && item.style.color ? item.style.color : '#FFFFFF',}">{{ item.text }}</text></view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
</view>
|
||||
</template>
|
||||
<script src="./index.wxs" module="swipe" lang="wxs"></script>
|
||||
<script>
|
||||
// #ifdef APP-VUE|| MP-WEIXIN || H5
|
||||
import mpwxs from './mpwxs'
|
||||
// #endif
|
||||
|
||||
// #ifdef APP-NVUE
|
||||
import bindingx from './bindingx.js'
|
||||
// #endif
|
||||
|
||||
// #ifndef APP-PLUS|| MP-WEIXIN || MP-ALIPAY || H5
|
||||
import mixins from './mpother'
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-ALIPAY
|
||||
import mpalipay from './mpalipay'
|
||||
// #endif
|
||||
|
||||
/**
|
||||
* SwipeActionItem 滑动操作子组件
|
||||
* @description 通过滑动触发选项的容器
|
||||
* @tutorial https://ext.dcloud.net.cn/plugin?id=181
|
||||
* @property {Boolean} show = [true|false] 开启关闭组件,auto-close = false 时生效
|
||||
* @property {Boolean} disabled = [true|false] 是否禁止滑动
|
||||
* @property {Boolean} autoClose = [true|false] 其他组件开启的时候,当前组件是否自动关闭
|
||||
* @property {Array} options 组件选项内容及样式
|
||||
* @event {Function} click 点击选项按钮时触发事件,e = {content,index} ,content(点击内容)、index(下标)
|
||||
* @event {Function} change 组件打开或关闭时触发,true:开启状态;false:关闭状态
|
||||
*/
|
||||
|
||||
export default {
|
||||
// #ifdef APP-VUE|| MP-WEIXIN||H5
|
||||
mixins: [mpwxs],
|
||||
// #endif
|
||||
|
||||
// #ifdef APP-NVUE
|
||||
mixins: [bindingx],
|
||||
// #endif
|
||||
|
||||
// #ifndef APP-PLUS|| MP-WEIXIN || MP-ALIPAY || H5
|
||||
mixins: [mixins],
|
||||
// #endif
|
||||
|
||||
// #ifdef MP-ALIPAY
|
||||
mixins: [mpalipay],
|
||||
// #endif
|
||||
|
||||
props: {
|
||||
/**
|
||||
* 按钮内容
|
||||
*/
|
||||
options: {
|
||||
type: Array,
|
||||
default () {
|
||||
return []
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 禁用
|
||||
*/
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
/**
|
||||
* 变量控制开关
|
||||
*/
|
||||
show: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
/**
|
||||
* 是否自动关闭
|
||||
*/
|
||||
autoClose: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
},
|
||||
inject: ['swipeaction']
|
||||
|
||||
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.uni-swipe {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.uni-swipe-box {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.uni-swipe_content {
|
||||
flex: 1;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.uni-swipe_move-box {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
position: relative;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.uni-swipe_box {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
flex-shrink: 0;
|
||||
/* #endif */
|
||||
/* #ifdef APP-NVUE */
|
||||
flex: 1;
|
||||
/* #endif */
|
||||
font-size: 14px;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.uni-swipe_button-group {
|
||||
/* #ifndef APP-VUE|| MP-WEIXIN||H5 */
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 0;
|
||||
/* #endif */
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.uni-swipe_button {
|
||||
/* #ifdef APP-NVUE */
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
/* #endif */
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 0 20px;
|
||||
}
|
||||
|
||||
.uni-swipe_button-text {
|
||||
/* #ifndef APP-NVUE */
|
||||
flex-shrink: 0;
|
||||
/* #endif */
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.ani {
|
||||
transition-property: transform;
|
||||
transition-duration: 0.3s;
|
||||
transition-timing-function: cubic-bezier(0.165, 0.84, 0.44, 1);
|
||||
}
|
||||
|
||||
/* #ifdef MP-ALIPAY */
|
||||
.movable-area {
|
||||
width: 300px;
|
||||
height: 100%;
|
||||
height: 45px;
|
||||
}
|
||||
|
||||
.movable-view {
|
||||
position: relative;
|
||||
width: 160%;
|
||||
height: 45px;
|
||||
z-index: 2;
|
||||
}
|
||||
.transition {
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.movable-view-box {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #fff;
|
||||
}
|
||||
/* #endif */
|
||||
</style>
|
@ -1,58 +0,0 @@
|
||||
<template>
|
||||
<view>
|
||||
<slot></slot>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
/**
|
||||
* SwipeAction 滑动操作
|
||||
* @description 通过滑动触发选项的容器
|
||||
* @tutorial https://ext.dcloud.net.cn/plugin?id=181
|
||||
*/
|
||||
export default {
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
provide() {
|
||||
return {
|
||||
swipeaction: this
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.children = []
|
||||
},
|
||||
methods: {
|
||||
closeOther(vm) {
|
||||
let children = this.children
|
||||
children.forEach((item, index) => {
|
||||
if (vm === item) return
|
||||
// 支付宝执行以下操作
|
||||
// #ifdef MP-ALIPAY
|
||||
if (item.isopen) {
|
||||
item.close()
|
||||
}
|
||||
// #endif
|
||||
|
||||
// app vue 端、h5 、微信、支付宝 执行以下操作
|
||||
// #ifdef APP-VUE || H5 || MP-WEIXIN
|
||||
let position = item.position[0]
|
||||
let show = position.show
|
||||
if (show) {
|
||||
position.show = false
|
||||
}
|
||||
// #endif
|
||||
|
||||
// nvue 执行以下操作
|
||||
// #ifdef APP-NVUE || MP-BAIDU || MP-QQ || MP-TOUTIAO
|
||||
item.close()
|
||||
// #endif
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
64
pageB/components/sdetails/guige.vue
Normal file
@ -0,0 +1,64 @@
|
||||
<template>
|
||||
<view class="guige">
|
||||
<view class="title">
|
||||
{{title}}
|
||||
</view>
|
||||
<view class="item">
|
||||
<text v-for="(i,j) in item" @click="select = j" :class="select == j ? 'xuanzhong' : ''" :key="j">
|
||||
{{i}}
|
||||
</text>
|
||||
<!-- <text @click="select = 1" :class="select == 1 ? 'xuanzhong' : ''">S</text> -->
|
||||
<!-- <text @click="select = 2" :class="select == 2 ? 'xuanzhong' : ''">M</text> -->
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.guige{
|
||||
margin-top: 30rpx;
|
||||
padding-bottom: 30rpx;
|
||||
border-bottom: #ececec solid 2rpx;
|
||||
.title{
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
margin-bottom: 29rpx;
|
||||
|
||||
}
|
||||
.item{
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
>text{
|
||||
min-width: 120rpx;
|
||||
height: 60rpx;
|
||||
background-color: #ececec;
|
||||
color: #999;
|
||||
text-align: center;
|
||||
line-height: 60rpx;
|
||||
box-sizing: border-box;
|
||||
border-radius: 6rpx;
|
||||
margin-right: 26rpx;
|
||||
}
|
||||
.xuanzhong{
|
||||
border: #ff780f 1rpx solid;
|
||||
color: #FF780F;
|
||||
background-color: #FFF1E6;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
export default {
|
||||
name:"guige",
|
||||
data(){
|
||||
return {
|
||||
select:0
|
||||
}
|
||||
},
|
||||
props:['item','title'],
|
||||
watch:{
|
||||
select(){
|
||||
// console.log(this.select)
|
||||
this.$emit("sel",this.select)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -1,36 +1,109 @@
|
||||
<template>
|
||||
<view class="tloos">
|
||||
<view class="navs">
|
||||
<image></image>
|
||||
店铺
|
||||
<view>
|
||||
<view class="tloos">
|
||||
<view class="navs">
|
||||
<image></image>
|
||||
店铺
|
||||
</view>
|
||||
<view class="navs" style="margin-right:30rpx">
|
||||
<image></image>
|
||||
客服
|
||||
</view>
|
||||
<view class="button" style="background:rgba(253,211,96,0.6);">试穿试送</view>
|
||||
<view class="button" style="background:rgba(253,211,96,1);" @click="buy(2)">加入购物车</view>
|
||||
<view class="button" style="background:rgba(255,120,15,1);" @click="buy(1)">立即购买</view>
|
||||
|
||||
</view>
|
||||
<view class="navs" style="margin-right:30rpx">
|
||||
<image></image>
|
||||
客服
|
||||
</view>
|
||||
<view class="button" style="background:rgba(253,211,96,0.6);">试穿试送</view>
|
||||
<view class="button" style="background:rgba(253,211,96,1);" @click="addCart">加入购物车</view>
|
||||
<view class="button" style="background:rgba(255,120,15,1);">立即购买</view>
|
||||
<u-toast ref="uToast" />
|
||||
<u-popup v-model="show" mode="bottom">
|
||||
<scroll-view scroll-y="true" class="popup">
|
||||
<view>
|
||||
<view class="head">
|
||||
<image class="image" :src="info.goods_image"></image>
|
||||
<view class="info">
|
||||
<text class="u-line-2">{{info.goods_name}}</text>
|
||||
<text>¥{{info.goods_price}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<guige @sel="self" ref="guige" v-for="(item,index) in info.spec_value" :key="index" :title="info.spec_name[index]" :item="item"></guige>
|
||||
<view class="num">
|
||||
<text>购买数量</text>
|
||||
<u-number-box v-model="value" @change="valChange"></u-number-box>
|
||||
</view>
|
||||
<view style="height:180rpx"></view>
|
||||
</view>
|
||||
<u-toast ref="uToast" />
|
||||
|
||||
</scroll-view>
|
||||
</u-popup>
|
||||
</view>
|
||||
|
||||
</template>
|
||||
<script>
|
||||
import guige from "./guige"
|
||||
export default {
|
||||
name:"tloos",
|
||||
props: ['id'],
|
||||
props: ['id','info'],
|
||||
components:{
|
||||
guige
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
show:false,
|
||||
value:1,
|
||||
sel:"",
|
||||
quanxuan:false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
addCart() {
|
||||
this.$u.api.addCart({
|
||||
goods_id: this.id,
|
||||
quantity: 1,
|
||||
}).then(res => {
|
||||
this.$refs.uToast.show({
|
||||
title: res.message,
|
||||
type: res.errCode == 0 ? 'success' : 'warning',
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
buy(type){
|
||||
let that = this;
|
||||
if(this.show){
|
||||
if(this.info.spec_value == null){
|
||||
this.$emit("buy",{type,value:that.value})
|
||||
}else if(this.quanxuan){
|
||||
this.$emit("buy",{type,value:that.value})
|
||||
}else{
|
||||
this.$refs.uToast.show({
|
||||
title: '请选择规格',
|
||||
type: 'warning',
|
||||
})
|
||||
}
|
||||
}else{
|
||||
this.show = true
|
||||
}
|
||||
|
||||
},
|
||||
valChange(e) {
|
||||
console.log(this.value)
|
||||
},
|
||||
self(){
|
||||
// console.log(this.$refs.guige)
|
||||
let index = 0;
|
||||
let arr = [];
|
||||
for(let i in this.info.spec_value){
|
||||
// console.log(i)
|
||||
// console.log(this.$refs.guige[index++].select)
|
||||
// index++;
|
||||
let sel = this.$refs.guige[index++].select
|
||||
if(sel != 0){
|
||||
arr.push(sel)
|
||||
}
|
||||
|
||||
}
|
||||
// console.log(arr.length)
|
||||
if(arr.length == index){
|
||||
this.sel = arr.join("|")
|
||||
this.quanxuan = true
|
||||
// console.log(this.sel)
|
||||
}
|
||||
}
|
||||
},
|
||||
watch:{
|
||||
sel(){
|
||||
// console.log(this.sel)
|
||||
this.$emit('xuanze',this.sel)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
@ -42,6 +115,7 @@ export default {
|
||||
width: 100%;
|
||||
bottom:0;
|
||||
border-top: 1rpx solid #ececec;
|
||||
z-index: 1000000;
|
||||
.navs{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@ -67,5 +141,48 @@ export default {
|
||||
color: #fff;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
.popup{
|
||||
padding: 30rpx;
|
||||
box-sizing: border-box;
|
||||
max-height: 750rpx;
|
||||
.head{
|
||||
display: flex;
|
||||
margin-bottom: 30rpx;
|
||||
.image{
|
||||
width: 195rpx;
|
||||
height: 195rpx;
|
||||
border-radius: 10rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.info{
|
||||
display: flex;
|
||||
padding: 21rpx 0;
|
||||
justify-content: space-between;
|
||||
margin-left: 27rpx;
|
||||
flex-direction: column;
|
||||
>text:first-child{
|
||||
font-size: 28rpx;
|
||||
color: #333;
|
||||
}
|
||||
>text:last-child{
|
||||
font-size: 30rpx;
|
||||
color: #ff3131;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.num{
|
||||
height: 84rpx;
|
||||
display: flex;
|
||||
border-bottom: #ececec solid 2rpx;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
>text{
|
||||
font-size: 26rpx;
|
||||
color: #666;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -23,18 +23,22 @@
|
||||
<view class="rich">
|
||||
<rich-text :nodes="goodsInfo.mobile_body"></rich-text>
|
||||
</view>
|
||||
<tloos :id="goodsInfo.goods_commonid"></tloos>
|
||||
<tloos @buy="buy" @xuanze="xuanze" :id="goodsInfo.goods_commonid" :info="info"></tloos>
|
||||
<u-toast ref="uToast" />
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import navs from "../components/sdetails/navs"
|
||||
import tloos from "../components/sdetails/tloos"
|
||||
export default {
|
||||
export default {
|
||||
name:"sdetails",
|
||||
data() {
|
||||
return {
|
||||
list: [],
|
||||
goodsInfo: {},
|
||||
goodsInfo: {},
|
||||
info:{},
|
||||
glist:[],
|
||||
id:0
|
||||
}
|
||||
},
|
||||
components:{
|
||||
@ -42,10 +46,25 @@ export default {
|
||||
tloos
|
||||
},
|
||||
onLoad(option) {
|
||||
this.getGoodsDetails(option.id);
|
||||
this.getGoodsDetails(option.id);
|
||||
|
||||
},
|
||||
methods: {
|
||||
buy(info){
|
||||
if(info.type == 2){
|
||||
this.$u.api.addCart({
|
||||
goods_id: this.id,
|
||||
quantity: info.value,
|
||||
}).then(res => {
|
||||
this.$refs.uToast.show({
|
||||
title: res.errCode[1],
|
||||
type: res.errCode == 0 ? 'success' : 'warning',
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
getGoodsDetails(id) {
|
||||
this.id = id;
|
||||
this.$u.api.getGoodsDetails({ id: id }).then((res)=>{
|
||||
if (res.errCode == 0) {
|
||||
this.goodsInfo = res.data;
|
||||
@ -58,8 +77,17 @@ export default {
|
||||
// console.log(this.goodsInfo.mobile_body);
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
this.$u.api.goodsInfo({id}).then((res)=>{
|
||||
console.log(res)
|
||||
this.info = res.data.goods;
|
||||
this.glist = res.data.spec_list;
|
||||
})
|
||||
},
|
||||
xuanze(id){
|
||||
console.log(id)
|
||||
this.getGoodsDetails(this.glist[id])
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
@ -4,10 +4,10 @@
|
||||
<image src="../static/image/2.png" class="address-icon"></image>
|
||||
<view class="address">
|
||||
<view class="user-info">
|
||||
<view>胖胖</view>
|
||||
<view>18220171014</view>
|
||||
<view>{{ addressInfo.address_realname }}</view>
|
||||
<view>{{ addressInfo.address_mob_phone }}</view>
|
||||
</view>
|
||||
<view class="address-text u-line-2">山东省泰安市泰山区东岳大街与克山路交汇口银山店四楼橙天影视南邻山东省泰安市泰山区东岳大街与克山路交汇口银山店四楼橙天影视南邻</view>
|
||||
<view class="address-text u-line-2">{{ addressInfo.area_info + addressInfo.address_detail }}</view>
|
||||
</view>
|
||||
<image src="../static/image/1.png" class="right"></image>
|
||||
</view>
|
||||
@ -75,6 +75,8 @@ export default {
|
||||
return {
|
||||
orderInfo: {},
|
||||
totalPrice: '0.00',
|
||||
addressInfo: {},
|
||||
freight: '',
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
@ -92,36 +94,24 @@ export default {
|
||||
onLoad(option) {
|
||||
console.log(JSON.parse(option.info));
|
||||
this.orderInfo = JSON.parse(option.info);
|
||||
// this.orderListInit();
|
||||
this.addressInfo = this.orderInfo.address_info;
|
||||
this.showTotalPrice();
|
||||
this.getFreight();
|
||||
},
|
||||
methods: {
|
||||
// orderListInit() {
|
||||
// this.orderList = this.orderInfo.store_list;
|
||||
// for (const key in this.orderList) {
|
||||
// if (this.orderList.hasOwnProperty(key)) {
|
||||
// const element = this.orderList[key];
|
||||
// let tempArray = Object.entries(this.orderInfo.store_cart_list);
|
||||
// tempArray.forEach(item => {
|
||||
// if (item[0])
|
||||
// })
|
||||
// let temp = this.orderInfo.store_cart_list.filters(store => {
|
||||
// return store.store_id == item.store_id
|
||||
// })
|
||||
// element
|
||||
// }
|
||||
// }
|
||||
// this.orderList.forEach(item => {
|
||||
// let temp = this.orderInfo.store_cart_list.filters(store => {
|
||||
// return store.store_id == item.store_id
|
||||
// })
|
||||
// Object.assign(item, { goods_list: temp });
|
||||
// })
|
||||
// console.log(this.orderList);
|
||||
|
||||
// },
|
||||
showTotalPrice() {
|
||||
|
||||
},
|
||||
getFreight() {
|
||||
this.$u.api.getFreight({
|
||||
freight_hash: this.orderInfo.freight_hash,
|
||||
city_id: this.addressInfo.city_id,
|
||||
area_id: this.addressInfo.area_id,
|
||||
}).then(res => {
|
||||
if(res.errCode == 0) {
|
||||
// this.freight = res.
|
||||
}
|
||||
})
|
||||
},
|
||||
settlement() {
|
||||
uni.navigateTo({
|
||||
@ -177,6 +167,7 @@ export default {
|
||||
}
|
||||
}
|
||||
.main {
|
||||
margin-bottom: 100rpx;
|
||||
> view {
|
||||
.goods-info {
|
||||
background-color: #ffffff;
|
||||
@ -220,6 +211,7 @@ export default {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.info {
|
||||
flex: 1;
|
||||
// width: 418rpx;
|
||||
height: 160rpx;
|
||||
display: flex;
|
||||
|
@ -85,6 +85,7 @@ export default {
|
||||
},
|
||||
// 结算
|
||||
settlementOrder() {
|
||||
// 拼接后端需要的数据形式
|
||||
let id = [], temp = '';
|
||||
this.checkedGoods.forEach(item => {
|
||||
temp = item.cart_id + '|' + item.goods_num;
|
||||
@ -147,16 +148,14 @@ export default {
|
||||
this.cartUpdateNumber(e.index, e.value);
|
||||
},
|
||||
async cartUpdateNumber(id, number) {
|
||||
try {
|
||||
await this.$u.api.cartUpdateNumber({
|
||||
cart_id: id,
|
||||
quantity: number,
|
||||
}).then(res => {
|
||||
this.getCartList();
|
||||
})
|
||||
} catch (error) {
|
||||
await this.$u.api.cartUpdateNumber({
|
||||
cart_id: id,
|
||||
quantity: number,
|
||||
}).then(res => {
|
||||
this.getCartList();
|
||||
}
|
||||
}).catch(() => {
|
||||
this.geCartList();
|
||||
})
|
||||
},
|
||||
totalChange(e) {
|
||||
// 切换所有商品的状态
|
||||
@ -193,16 +192,7 @@ export default {
|
||||
}
|
||||
},
|
||||
onNavigationBarButtonTap(btn) {
|
||||
console.log(btn);
|
||||
// this.status = btn.text;
|
||||
// #ifdef H5
|
||||
if(this.status == '编辑'){
|
||||
this.status = "完成";
|
||||
} else {
|
||||
this.status = "编辑";
|
||||
}
|
||||
console.log(this.status);
|
||||
// #endif
|
||||
// console.log(btn);
|
||||
if(btn.index == 0){
|
||||
let pages = getCurrentPages();
|
||||
let page = pages[pages.length - 1];
|
||||
|
26
pageC/components/merchant/image-top.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<view class="imageTop">
|
||||
<image :src="url"></image>
|
||||
</view>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.imageTop{
|
||||
width: 100%;
|
||||
height: 500rpx;
|
||||
margin-bottom: 20rpx;
|
||||
>image{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
export default {
|
||||
name:"imageTop",
|
||||
data(){
|
||||
return {
|
||||
}
|
||||
},
|
||||
props:['url']
|
||||
}
|
||||
</script>
|
28
pageC/components/merchant/list-item.vue
Normal file
@ -0,0 +1,28 @@
|
||||
<template>
|
||||
<view class="listItem">
|
||||
<video v-if="type == '2'" :src="url" :show-fullscreen-btn="true"></video>
|
||||
<image v-else :src="url"></image>
|
||||
</view>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.listItem{
|
||||
width: 365rpx;
|
||||
height: 500rpx;
|
||||
margin-bottom: 20rpx;
|
||||
>image,video{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
export default {
|
||||
name:"listItem",
|
||||
data(){
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
props:['url','type']
|
||||
}
|
||||
</script>
|
26
pageC/components/merchant/video-top.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<view class="videoTop">
|
||||
<video :src="url" :show-fullscreen-btn="true"></video>
|
||||
</view>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.videoTop{
|
||||
width: 100%;
|
||||
height: 284rpx;
|
||||
margin-bottom: 20rpx;
|
||||
>video{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
export default {
|
||||
name:"videoTop",
|
||||
data(){
|
||||
return {
|
||||
}
|
||||
},
|
||||
props:['url']
|
||||
}
|
||||
</script>
|
@ -38,7 +38,14 @@
|
||||
</view>
|
||||
<view class="main">
|
||||
<view class="classify" v-if="cur==0">
|
||||
111
|
||||
<view v-for="item in indextop" :key="item.id">
|
||||
<videoTop :url="item.url" v-if="item.type == 2"></videoTop>
|
||||
<imageTop v-else :url="item.url"></imageTop>
|
||||
</view>
|
||||
<view style="display: flex;flex-wrap: wrap;">
|
||||
<listitem :style="{'margin-left': index%2 == 1 ? '20rpx':'0'}" v-for="(item,index) in indexlist" :key="item.id" :type="item.type" :url="item.url"></listitem>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
<!-- 商品筛选排序未完成 -->
|
||||
<view class="item" v-if="cur==1">
|
||||
@ -67,16 +74,25 @@
|
||||
</template>
|
||||
<script>
|
||||
import item from "@/components/shop/list/item"
|
||||
import videoTop from "../components/merchant/video-top"
|
||||
import imageTop from "../components/merchant/image-top"
|
||||
import listitem from "../components/merchant/list-item"
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
show: false,
|
||||
cur: 0,
|
||||
list:[]
|
||||
list:[],
|
||||
indexlist:[],
|
||||
indextop:[]
|
||||
}
|
||||
},
|
||||
components:{
|
||||
item
|
||||
item,
|
||||
videoTop,
|
||||
imageTop,
|
||||
listitem
|
||||
},
|
||||
methods: {
|
||||
toDetailsPage() {
|
||||
@ -87,9 +103,14 @@ export default {
|
||||
},
|
||||
onLoad(){
|
||||
this.$u.api.getStoreGoodsList({id:1}).then((res)=>{
|
||||
console.log(res.data)
|
||||
// console.log(res.data)
|
||||
this.list= res.data.list
|
||||
})
|
||||
this.$u.api.getStoreImgVideoList({id:1}).then((res)=>{
|
||||
console.log(res.data)
|
||||
this.indextop = [res.data[0],res.data[1]]
|
||||
this.indexlist = res.data.slice(2,)
|
||||
})
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@ -155,7 +176,7 @@ export default {
|
||||
background-color: #ffffff;
|
||||
width: 100%;
|
||||
margin-bottom: 20rpx;
|
||||
height: 140rpx;
|
||||
// height: 140rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 20rpx 30rpx;
|
||||
|
@ -1,8 +1,9 @@
|
||||
<template>
|
||||
<view class="edit-info">
|
||||
<view class="user-info">
|
||||
<view class="info-avatar">
|
||||
<image src="../static/mine/23.png"></image>
|
||||
<view class="info-avatar" @click="changeAvatar">
|
||||
<u-avatar :src="avatar" :size="120"></u-avatar>
|
||||
<view class="avatar-text">更换头像</view>
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<view class="title">昵称</view>
|
||||
@ -26,7 +27,7 @@
|
||||
<image src="../static/mine/21.png"></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="edit-tips">注意:修改手机号需要原手机号获取验证码,无原手机验证码,请联系后台</view>
|
||||
<view class="edit-tips">注意:修改手机号需要原手机号获取验证码,无原手机验证码,请联系客服</view>
|
||||
<view class="edit-btn" @click="updateMemberInfo">完成</view>
|
||||
</view>
|
||||
</template>
|
||||
@ -55,7 +56,7 @@ export default {
|
||||
minute: false,
|
||||
second: false
|
||||
},
|
||||
nickname: '胖胖',
|
||||
nickname: '',
|
||||
gender: '', // 1男 2女
|
||||
birthday: '',
|
||||
phoneNumber: '',
|
||||
@ -65,15 +66,37 @@ export default {
|
||||
onLoad() {
|
||||
this.getUserInfo();
|
||||
},
|
||||
onNavigationBarButtonTap(e) {
|
||||
if( e.index == 0 ) uni.navigateBack();
|
||||
},
|
||||
methods: {
|
||||
changeAvatar() {
|
||||
const url = this.$u.http.config.baseUrl + '/Upload/uploadfile';
|
||||
uni.chooseImage({
|
||||
count: 1,
|
||||
sizeType: ['original', 'compressed'],
|
||||
sourceType: ['album'],
|
||||
success: (res) => {
|
||||
this.avatar = res.tempFilePaths[0];
|
||||
common.uploadFile({
|
||||
url: url,
|
||||
filePath: res.tempFilePaths[0]
|
||||
}).then(result => {
|
||||
this.avatar = result;
|
||||
}, error => {
|
||||
this.$u.toast(error);
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
getUserInfo() {
|
||||
this.$u.api.getMemberInfo().then(res => {
|
||||
if (res.errCode == 0) {
|
||||
let userInfo = res.data.MemberArray;
|
||||
[this.nickname, this.phoneNumber, this.birthday, this.gender, this.avatar] = [
|
||||
userInfo.member_nickname,
|
||||
userInfo.member_mobile,
|
||||
common.timestampToDate({timestamp: userInfo.member_birthday}),
|
||||
userInfo.member_mobile,
|
||||
userInfo.member_birthday,
|
||||
userInfo.member_sex,
|
||||
userInfo.member_avatar,
|
||||
];
|
||||
@ -115,15 +138,16 @@ export default {
|
||||
padding-top: 1rpx;
|
||||
.user-info {
|
||||
.info-avatar {
|
||||
text-align: center;
|
||||
height: 160rpx;
|
||||
height: 202rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: rgba(255,255,255,1);
|
||||
> image {
|
||||
flex-shrink: 0;
|
||||
width: 120rpx;
|
||||
height: 120rpx;
|
||||
border-radius: 50%;
|
||||
margin-top: 20rpx;
|
||||
.avatar-text {
|
||||
margin-top: 12rpx;
|
||||
font-size: 24rpx;
|
||||
color: rgba(255,120,15,1);
|
||||
}
|
||||
}
|
||||
.info-item {
|
||||
|
@ -3,37 +3,58 @@
|
||||
<view class="integral-top">
|
||||
<view>
|
||||
<view class="title">总积分</view>
|
||||
<view class="value">999</view>
|
||||
<view class="value">{{ memberInfo.member_points }}</view>
|
||||
</view>
|
||||
<view>
|
||||
<view class="title">经验值</view>
|
||||
<view class="value">999</view>
|
||||
<view class="value">{{ memberInfo.member_exppoints }}</view>
|
||||
</view>
|
||||
<view>
|
||||
<view @click="viewProgress">
|
||||
<view class="title">预计进度</view>
|
||||
<view class="value">999</view>
|
||||
<!-- <view class="value">{{ memberInfo.next_grade_exppoints_diff }}</view> -->
|
||||
<view class="value">
|
||||
<image src="/static/image/mine/32.png"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<scroll-view scroll-y class="integral-botom">
|
||||
<scroll-view scroll-y class="integral-botom" :style="{ height: integralHeight }">
|
||||
<rich-text :nodes="nodes"></rich-text>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import common from '@/static/js/common.js';
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
nodes: '<h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1>',
|
||||
integralHeight: 0
|
||||
memberInfo: {},
|
||||
integralHeight: 0,
|
||||
nodes: '',
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
this.setIntegralHeight();
|
||||
this.getMemberPointsStat();
|
||||
},
|
||||
methods: {
|
||||
setIntegralHeight() {
|
||||
// this.integralHeight =
|
||||
}
|
||||
const res = uni.getSystemInfoSync();
|
||||
// console.log(res.windowHeight);
|
||||
this.integralHeight = res.windowHeight - 251 / 2 + 'px';
|
||||
},
|
||||
getMemberPointsStat() {
|
||||
this.$u.api.getMemberPointsStat().then((res)=>{
|
||||
if (res.errCode == 0) {
|
||||
this.memberInfo = res.data;
|
||||
this.nodes = common.unescapeHTML(this.memberInfo.points_rule);
|
||||
}
|
||||
})
|
||||
},
|
||||
viewProgress() {
|
||||
this.$u.route({
|
||||
url: '/pageE/mine/MineProgress'
|
||||
})
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@ -61,13 +82,19 @@ export default {
|
||||
font-size: 48rpx;
|
||||
font-weight: 500;
|
||||
color: rgba(255,255,255,1);
|
||||
> image {
|
||||
width: 52rpx;
|
||||
height: 35rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.integral-botom {
|
||||
box-sizing: border-box;
|
||||
padding: 30rpx;
|
||||
position: absolute;
|
||||
width: 750rpx;
|
||||
height: calc(100vh - 251rpx);
|
||||
width: 100%;
|
||||
// height: calc(100vh - 251rpx);
|
||||
background: rgba(255,255,255,1);
|
||||
border-radius: 20rpx 20rpx 0rpx 0rpx;
|
||||
top: 251rpx;
|
||||
|
@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<view class="member">
|
||||
<view>
|
||||
<!-- <view> -->
|
||||
<u-tabs-swiper ref="tabs" :list="list" :is-scroll="false" active-color="#FF780F" :current="current" font-size="32" :show-bar="false" @change="tabsChange" height="88" ></u-tabs-swiper>
|
||||
</view>
|
||||
<swiper :current="swiperCurrent" @animationfinish="animationfinish">
|
||||
<!-- </view> -->
|
||||
<swiper :current="swiperCurrent" @animationfinish="animationfinish" :style="{ height: swiperHeight }">
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y class="integral">
|
||||
<view class="integral">
|
||||
<view class="integral-top">
|
||||
<view>
|
||||
<view class="title">总积分</view>
|
||||
@ -15,31 +15,20 @@
|
||||
<view class="title">经验值</view>
|
||||
<view class="value">{{ memberInfo.member_exppoints }}</view>
|
||||
</view>
|
||||
<view>
|
||||
<view @click="viewProgress">
|
||||
<view class="title">预计进度</view>
|
||||
<view class="value">999</view>
|
||||
<view class="value">{{ memberInfo.next_grade_exppoints_diff }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="integral-botom">
|
||||
<scroll-view scroll-y class="integral-botom" :style="{ height: richHeight }">
|
||||
<rich-text :nodes="nodes"></rich-text>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y class="coupon">
|
||||
<view v-for="(item, index) in 13" :key="index" class="coupon-item">
|
||||
<img src="../static/mine/23.png" />
|
||||
<view class="coupon-main">
|
||||
<view class="coupon-title">萌店十元优惠券</view>
|
||||
<view class="coupon-date">
|
||||
<img src="../static/mine/26.png" />
|
||||
<view>2020.05.17-2020.06.17</view>
|
||||
</view>
|
||||
<view class="coupon-integral">299积分</view>
|
||||
</view>
|
||||
<view class="coupon-btn">兑换</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
<view class="coupon">
|
||||
<CouponView></CouponView>
|
||||
</view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y class="details">
|
||||
@ -52,12 +41,15 @@
|
||||
{{ item.pl_addtime > 0 ? item.pl_addtime : '+' + 10.00 }}
|
||||
</view>
|
||||
</view>
|
||||
<u-empty text="暂无明细" mode="data" color="#000" v-if="!pointslogList.length"></u-empty>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import common from '@/static/js/common.js';
|
||||
import CouponView from "./MemberServeCoupon";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@ -68,16 +60,22 @@ export default {
|
||||
}, {
|
||||
name: '积分明细'
|
||||
}],
|
||||
richHeight: '',
|
||||
swiperHeight: '',
|
||||
current: 0,
|
||||
swiperCurrent: 0,
|
||||
nodes: '<h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1><h1>2</h1>',
|
||||
pointslogList: [],
|
||||
memberInfo: {}
|
||||
pointslogList: [],
|
||||
memberInfo: {},
|
||||
nodes: '',
|
||||
}
|
||||
},
|
||||
components: {
|
||||
CouponView
|
||||
},
|
||||
onShow() {
|
||||
this.getMemberPointsStat();
|
||||
this.getPointslogList();
|
||||
this.setViewHeight();
|
||||
},
|
||||
methods: {
|
||||
tabsChange(index) {
|
||||
@ -92,6 +90,7 @@ export default {
|
||||
this.$u.api.getMemberPointsStat().then((res)=>{
|
||||
if (res.errCode == 0) {
|
||||
this.memberInfo = res.data;
|
||||
this.nodes = common.unescapeHTML(this.memberInfo.points_rule);
|
||||
}
|
||||
})
|
||||
},
|
||||
@ -101,7 +100,19 @@ export default {
|
||||
this.pointslogList = res.data;
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
setViewHeight() {
|
||||
const res = uni.getSystemInfoSync();
|
||||
// console.log(res.windowHeight);
|
||||
this.richHeight = res.windowHeight - (88 + 250) / 2 + 'px';
|
||||
// console.log(this.richHeight);
|
||||
this.swiperHeight = res.windowHeight - 88 / 2 + 'px';
|
||||
},
|
||||
viewProgress() {
|
||||
this.$u.route({
|
||||
url: '/pageE/mine/MineProgress'
|
||||
})
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -111,18 +122,20 @@ export default {
|
||||
background-color: #ECECEC;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
> uni-swiper {
|
||||
flex: 1;
|
||||
}
|
||||
// > uni-swiper {
|
||||
// flex: 1;
|
||||
// height: calc()
|
||||
// }
|
||||
.swiper-item {
|
||||
padding-top: 10rpx;
|
||||
.integral {
|
||||
height: 100%;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
.integral-top {
|
||||
padding: 79rpx 88rpx;
|
||||
width: 750rpx;
|
||||
height: 271rpx;
|
||||
height: 270rpx;
|
||||
background: linear-gradient(0deg,rgba(246,211,119,1) 1%,rgba(240,154,105,1) 100%);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
@ -142,66 +155,18 @@ export default {
|
||||
}
|
||||
}
|
||||
.integral-botom {
|
||||
box-sizing: border-box;
|
||||
padding: 30rpx;
|
||||
position: absolute;
|
||||
width: 750rpx;
|
||||
// height: 856rpx;
|
||||
width: 100%;
|
||||
background: rgba(255,255,255,1);
|
||||
border-radius: 20rpx 20rpx 0rpx 0rpx;
|
||||
top: 251rpx;
|
||||
top: 250rpx;
|
||||
z-index: 9;
|
||||
}
|
||||
}
|
||||
.coupon {
|
||||
height: 100%;
|
||||
.coupon-item {
|
||||
padding: 30rpx;
|
||||
background-color: #ffffff;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
margin-bottom: 2rpx;
|
||||
> img {
|
||||
width: 180rpx;
|
||||
height: 160rpx;
|
||||
border-radius: 10rpx;
|
||||
margin-right: 30rpx;
|
||||
}
|
||||
.coupon-main {
|
||||
.coupon-title {
|
||||
font-size: 30rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
}
|
||||
.coupon-date {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 29rpx 0 20rpx;
|
||||
> img {
|
||||
width: 24rpx;
|
||||
height: 24rpx;
|
||||
margin-right: 15rpx;
|
||||
}
|
||||
> view {
|
||||
font-size: 24rpx;
|
||||
color: rgba(153,153,153,1);
|
||||
}
|
||||
}
|
||||
.coupon-integral {
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: rgba(255,120,15,1);
|
||||
}
|
||||
}
|
||||
.coupon-btn {
|
||||
margin-left: auto;
|
||||
width: 85rpx;
|
||||
// height: 42rpx;
|
||||
border: 2rpx solid rgba(255,120,15,1);
|
||||
border-radius: 10rpx;
|
||||
font-size: 26rpx;
|
||||
color: rgba(255,120,15,1);
|
||||
line-height: 42rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
.details {
|
||||
height: 100%;
|
||||
|
161
pageE/mine/MemberServeCoupon.vue
Normal file
@ -0,0 +1,161 @@
|
||||
<template>
|
||||
<view class="coupon-swiper">
|
||||
<u-tabs-swiper ref="coupon" :list="couponGroupList" :is-scroll="true" active-color="#FF780F" :current="couponCurrent" font-size="24" :show-bar="false" @change="couponTabsChange" height="88" ></u-tabs-swiper>
|
||||
<swiper :current="swiperCouponCurrent" @animationfinish="couponAnimationFinish" :style="{ height: swiperHeight }">
|
||||
<swiper-item class="swiper-coupon-item" v-for="(_, i) in couponGroupList" :key="i">
|
||||
<scroll-view scroll-y style="height: 100%;">
|
||||
<view v-for="(coupon, index) in couponList" :key="index" class="coupon-item">
|
||||
<!-- <img src="../static/mine/23.png" />
|
||||
<view class="coupon-main">
|
||||
<view class="coupon-title">萌店十元优惠券</view>
|
||||
<view class="coupon-date">
|
||||
<img src="../static/mine/26.png" />
|
||||
<view>2020.05.17-2020.06.17</view>
|
||||
</view>
|
||||
<view class="coupon-integral">299积分</view>
|
||||
</view>
|
||||
<view class="coupon-btn">兑换</view> -->
|
||||
<Coupon :couponInfo="coupon" :status='0' :type="0" @exchange="exchangeCoupon($event)"></Coupon>
|
||||
</view>
|
||||
<u-empty text="暂无优惠券" mode="coupon" color="#000" v-if="!couponList.length"></u-empty>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import Coupon from "@/components/mine/coupon/index";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
swiperHeight: '',
|
||||
couponCurrent: 0,
|
||||
swiperCouponCurrent: 0,
|
||||
couponGroupList: [
|
||||
{
|
||||
name: '平台'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}, {
|
||||
name: '分类名称'
|
||||
}
|
||||
],
|
||||
couponList: [
|
||||
{
|
||||
index: 0
|
||||
},
|
||||
{
|
||||
index: 1
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
components: {
|
||||
Coupon
|
||||
},
|
||||
created() {
|
||||
this.setViewHeight();
|
||||
},
|
||||
methods: {
|
||||
exchangeCoupon(id) {
|
||||
console.log(id);
|
||||
|
||||
},
|
||||
couponTabsChange(index) {
|
||||
this.couponCurrent = index;
|
||||
},
|
||||
couponAnimationFinish(e) {
|
||||
const current = e.detail.current;
|
||||
this.swiperCouponCurrent = current;
|
||||
this.couponCurrent = current;
|
||||
},
|
||||
setViewHeight() {
|
||||
const res = uni.getSystemInfoSync();
|
||||
this.swiperHeight = res.windowHeight - ((88 + 10 + 88) / 2) + 'px';
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.coupon-swiper {
|
||||
.swiper-coupon-item {
|
||||
box-sizing: border-box;
|
||||
background-color: #ffffff;
|
||||
padding: 30rpx {
|
||||
top: 0;
|
||||
};
|
||||
.coupon-item {
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
// .coupon-item {
|
||||
// padding: 30rpx;
|
||||
// background-color: #ffffff;
|
||||
// display: flex;
|
||||
// align-items: flex-end;
|
||||
// // margin-bottom: 2rpx;
|
||||
// > img {
|
||||
// width: 180rpx;
|
||||
// height: 160rpx;
|
||||
// border-radius: 10rpx;
|
||||
// margin-right: 30rpx;
|
||||
// }
|
||||
// .coupon-main {
|
||||
// .coupon-title {
|
||||
// font-size: 30rpx;
|
||||
// color: rgba(51,51,51,1);
|
||||
// }
|
||||
// .coupon-date {
|
||||
// display: flex;
|
||||
// align-items: center;
|
||||
// margin: 29rpx 0 20rpx;
|
||||
// > img {
|
||||
// width: 24rpx;
|
||||
// height: 24rpx;
|
||||
// margin-right: 15rpx;
|
||||
// }
|
||||
// > view {
|
||||
// font-size: 24rpx;
|
||||
// color: rgba(153,153,153,1);
|
||||
// }
|
||||
// }
|
||||
// .coupon-integral {
|
||||
// font-size: 30rpx;
|
||||
// font-weight: 500;
|
||||
// color: rgba(255,120,15,1);
|
||||
// }
|
||||
// }
|
||||
// .coupon-btn {
|
||||
// margin-left: auto;
|
||||
// width: 85rpx;
|
||||
// // height: 42rpx;
|
||||
// border: 2rpx solid rgba(255,120,15,1);
|
||||
// border-radius: 10rpx;
|
||||
// font-size: 26rpx;
|
||||
// color: rgba(255,120,15,1);
|
||||
// line-height: 42rpx;
|
||||
// text-align: center;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<view class="information">
|
||||
<view class="info-avatar">
|
||||
<image src="../static/mine/23.png"></image>
|
||||
<u-avatar :src="userInfo.member_avatar" :size="120"></u-avatar>
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<view class="title">昵称</view>
|
||||
@ -13,7 +13,7 @@
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<view class="title">生日</view>
|
||||
<view class="value">{{ userInfo.member_birthday | dateFormat }}</view>
|
||||
<view class="value">{{ userInfo.member_birthday }}</view>
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<view class="title">手机号</view>
|
||||
@ -21,7 +21,7 @@
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<view class="title">等级</view>
|
||||
<view class="value">{{ userInfo.level }}</view>
|
||||
<view class="value">{{ userInfo.member_level }}</view>
|
||||
</view>
|
||||
<view class="info-item">
|
||||
<view class="title">积分数</view>
|
||||
@ -41,17 +41,12 @@ export default {
|
||||
userInfo: {}
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
onShow() {
|
||||
this.getUserInfo();
|
||||
},
|
||||
onNavigationBarButtonTap() {
|
||||
this.toEditPage();
|
||||
},
|
||||
filters: {
|
||||
dateFormat(value) {
|
||||
return common.timestampToDate({ timestamp: value });
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getUserInfo() {
|
||||
this.$u.api.getMemberInfo().then(res => {
|
||||
@ -74,16 +69,11 @@ export default {
|
||||
background-color: #ECECEC;
|
||||
padding-top: 1rpx;
|
||||
.info-avatar {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 160rpx;
|
||||
background: rgba(255,255,255,1);
|
||||
> image {
|
||||
flex-shrink: 0;
|
||||
width: 120rpx;
|
||||
height: 120rpx;
|
||||
border-radius: 50%;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
}
|
||||
.info-item {
|
||||
display: flex;
|
||||
|
172
pageE/mine/MineProgress.vue
Normal file
@ -0,0 +1,172 @@
|
||||
<template>
|
||||
<view class="progress">
|
||||
<view class="header">
|
||||
<view class="line-progress">
|
||||
<view class="rank-value">lv1</view>
|
||||
<view class="line-box">
|
||||
<u-line-progress :percent="70" :show-percent="false" inactive-color="#FFFFFF" active-color="#F1A36B" height="30"></u-line-progress>
|
||||
<text>78/99</text>
|
||||
</view>
|
||||
<view class="rank-value">lv2</view>
|
||||
</view>
|
||||
<view class="exp-value">经验值<span>78</span></view>
|
||||
<view class="distance">距离下一级还需要21经验值</view>
|
||||
</view>
|
||||
<view class="body">
|
||||
<view class="title">
|
||||
<image src="/static/image/mine/34.png"></image>
|
||||
<text>等级定义</text>
|
||||
</view>
|
||||
<view class="rank-list">
|
||||
<view v-for="(rank, index) in rank" :key="index" class="list-item">
|
||||
<view class="rank-value">lv{{ rank.level }}</view>
|
||||
<view class="rank-interval"><span>经验值:</span>{{ rank.max == '--' ? rank.min + '及以上' : rank.min + '~' + rank.max }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
rank: [
|
||||
{
|
||||
level: 1,
|
||||
min: 50,
|
||||
max: 99,
|
||||
},
|
||||
{
|
||||
level: 2,
|
||||
min: 100,
|
||||
max: 199,
|
||||
},
|
||||
{
|
||||
level: 3,
|
||||
min: 200,
|
||||
max: 399,
|
||||
},
|
||||
{
|
||||
level: 4,
|
||||
min: 400,
|
||||
max: 999,
|
||||
},
|
||||
{
|
||||
level: 5,
|
||||
min: 1000,
|
||||
max: 1999,
|
||||
},
|
||||
{
|
||||
level: 6,
|
||||
min: 2000,
|
||||
max: 4999,
|
||||
},
|
||||
{
|
||||
level: 7,
|
||||
min: 5000,
|
||||
max: '--',
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.progress {
|
||||
.header {
|
||||
width: 750rpx;
|
||||
height: 271rpx;
|
||||
background: url('/static/image/mine/33.png') no-repeat left top / contain;
|
||||
padding: 30rpx {
|
||||
top: 82rpx;
|
||||
};
|
||||
color: #FFF;
|
||||
.line-progress {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 5rpx;
|
||||
.rank-value {
|
||||
height: 30rpx;
|
||||
line-height: 30rpx;
|
||||
box-sizing: content-box;
|
||||
background:rgba(255,213,101,1);
|
||||
border-radius: 6rpx;
|
||||
padding: 0 10rpx;
|
||||
}
|
||||
.line-box {
|
||||
width: 400rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
margin: 0 16rpx;
|
||||
/deep/ .u-progress {
|
||||
.u-active {
|
||||
box-sizing: border-box;
|
||||
border: 4rpx solid #FFF;
|
||||
border-radius: 50rpx;
|
||||
}
|
||||
}
|
||||
> text {
|
||||
margin-top: 12rpx;
|
||||
font-size: 20rpx;
|
||||
color: rgba(255,255,255,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
.exp-value {
|
||||
font-size: 28rpx;
|
||||
margin-bottom: 32rpx;
|
||||
> span {
|
||||
margin-left: 20rpx;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
}
|
||||
.distance {
|
||||
font-size: 22rpx;
|
||||
}
|
||||
}
|
||||
.body {
|
||||
.title {
|
||||
height: 88rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 30rpx;
|
||||
font-weight: 500;
|
||||
color: rgba(51,51,51,1);
|
||||
border-bottom: #ECECEC 1rpx solid;
|
||||
> image {
|
||||
width: 29rpx;
|
||||
height: 36rpx;
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
}
|
||||
.rank-list {
|
||||
padding: 30rpx;
|
||||
.list-item {
|
||||
margin-bottom: 40rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.rank-value {
|
||||
color: #FFF;
|
||||
height: 30rpx;
|
||||
line-height: 30rpx;
|
||||
box-sizing: content-box;
|
||||
background:rgba(255,213,101,1);
|
||||
border-radius: 6rpx;
|
||||
padding: 0 10rpx;
|
||||
margin-right: 15rpx;
|
||||
}
|
||||
.rank-interval {
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
> span {
|
||||
margin-right: 10rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -4,7 +4,7 @@
|
||||
<view class="old-phone">
|
||||
<view class="phone-number">
|
||||
<view class="title">原手机号</view>
|
||||
<input type="text" v-model="oldNumber" placeholder="请输入手机号码" />
|
||||
<input type="text" v-model="oldMobile" placeholder="请输入手机号码" />
|
||||
</view>
|
||||
<view class="code">
|
||||
<view class="title">验证码</view>
|
||||
@ -16,7 +16,7 @@
|
||||
<view class="new-phone">
|
||||
<view class="phone-number">
|
||||
<view class="title">新手机号</view>
|
||||
<input type="text" v-model="newNumber" placeholder="请输入手机号码" />
|
||||
<input type="text" v-model="newMobile" placeholder="请输入手机号码" />
|
||||
</view>
|
||||
<view class="code">
|
||||
<view class="title">验证码</view>
|
||||
@ -24,54 +24,59 @@
|
||||
<u-verification-code :seconds="seconds" @end="end" @start="start" ref="uNewCode" @change="newCodeChange" unique-key="new" change-text="x秒"></u-verification-code>
|
||||
<view class="get-code" @click="getCode(1)">{{ btnText[1] }}</view>
|
||||
</view>
|
||||
<u-toast ref="uToast" />
|
||||
</view>
|
||||
</view>
|
||||
<view class="tips">注意:修改手机号需要原手机号获取验证码,无原手机验证码,请联系后台</view>
|
||||
<view class="btn">保存</view>
|
||||
<view class="tips">注意:修改手机号需要原手机号获取验证码,无原手机验证码,请联系客服</view>
|
||||
<view class="btn" @click="changeMemberPhone">保存</view>
|
||||
<u-toast ref="uToast" />
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
oldNumber: '',
|
||||
oldMobile: '',
|
||||
oldCode: '',
|
||||
newNumber: '',
|
||||
newMobile: '',
|
||||
newCode: '',
|
||||
btnText: ['获取验证码', '获取验证码'],
|
||||
seconds: 60, // 获取验证码间隔时间
|
||||
}
|
||||
},
|
||||
onNavigationBarButtonTap(e) {
|
||||
if( e.index == 0 ) uni.navigateBack();
|
||||
},
|
||||
methods: {
|
||||
verifyValue(type) {
|
||||
const phone = type == 0 ? this.oldNumber : this.newNumber;
|
||||
return this.$u.test.mobile(phone);
|
||||
},
|
||||
// @param Number type 0: 原手机号 1: 新手机号
|
||||
getSmsCode (type) {
|
||||
if(!this.verifyValue(type)) {
|
||||
let tips = type == 0 ? '请填写正确的原手机号' : '请填写正确的新手机号';
|
||||
// 验证发送验证码
|
||||
verifySendCode(type) {
|
||||
const [phone, tips] = type == 0
|
||||
? [this.oldMobile, '请填写正确的原手机号']
|
||||
: [this.newMobile, '请填写正确的新手机号'];
|
||||
if (!this.$u.test.mobile(phone)) {
|
||||
this.$u.toast(tips);
|
||||
return false;
|
||||
}
|
||||
if(this.seconds > 0) {
|
||||
this.$u.toast('倒计时结束后再发送');
|
||||
return true;
|
||||
},
|
||||
// 验证修改绑定手机号
|
||||
verifyChangeMobile() {
|
||||
if(!this.$u.test.mobile(oldMobile)) {
|
||||
this.$u.toast('请填写正确的原手机号');
|
||||
return false;
|
||||
}
|
||||
uni.showLoading({
|
||||
title: '正在获取验证码'
|
||||
})
|
||||
this.$u.api.sendSmsCode({
|
||||
member_mobile: type == 0 ? this.oldNumber: this.newNumber,
|
||||
smslog_type: 4 // 类型[1:注册,2:登录,3:找回密码,4:绑定手机]
|
||||
}).then(res => {
|
||||
uni.hideLoading();
|
||||
if(res.errCode == 0) {
|
||||
|
||||
} else {
|
||||
this.$u.toast(res.message);
|
||||
}
|
||||
})
|
||||
if(this.$u.test.isEmpty(oldCode)) {
|
||||
this.$u.toast('验证码为空');
|
||||
return false;
|
||||
}
|
||||
if(!this.$u.test.mobile(newMobile)) {
|
||||
this.$u.toast('请填写正确的新手机号');
|
||||
return false;
|
||||
}
|
||||
if(this.$u.test.isEmpty(newCode)) {
|
||||
this.$u.toast('验证码为空');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
oldCodeChange(text) {
|
||||
this.$set(this.btnText, 0, text);
|
||||
@ -79,40 +84,66 @@ export default {
|
||||
newCodeChange(text) {
|
||||
this.$set(this.btnText, 1, text);
|
||||
},
|
||||
// @param Number type 0: 原手机号 1: 新手机号
|
||||
async getSmsCode (type) {
|
||||
if(!this.verifySendCode(type)) return false;
|
||||
return await this.$u.api.sendSmsCode({
|
||||
member_mobile: type == 0 ? this.oldMobile: this.newMobile,
|
||||
smslog_type: 4 // 类型[1:注册,2:登录,3:找回密码,4:绑定手机]
|
||||
})
|
||||
},
|
||||
getCode(type) {
|
||||
const refs = type == 0 ? this.$refs.uOldCode : this.$refs.uNewCode;
|
||||
if(refs.canGetCode) {
|
||||
// 模拟向后端请求验证码
|
||||
uni.showLoading({
|
||||
title: '正在获取验证码'
|
||||
})
|
||||
setTimeout(() => {
|
||||
this.getSmsCode(type).then(res => {
|
||||
uni.hideLoading();
|
||||
// 这里此提示会被this.start()方法中的提示覆盖
|
||||
this.$u.toast('验证码已发送');
|
||||
// 通知验证码组件内部开始倒计时
|
||||
refs.start();
|
||||
}, 2000);
|
||||
if(res.errCode == 0) {
|
||||
// 这里此提示会被this.start()方法中的提示覆盖
|
||||
this.$u.toast(res.message);
|
||||
// 通知验证码组件内部开始倒计时
|
||||
refs.start();
|
||||
} else {
|
||||
this.$refs.uToast.show({
|
||||
type: 'error',
|
||||
title: res.message,
|
||||
duration: 3000,
|
||||
})
|
||||
}
|
||||
}).catch(() => {
|
||||
uni.hideLoading();
|
||||
this.$u.toast('验证码发送错误');
|
||||
})
|
||||
} else {
|
||||
this.$u.toast('倒计时结束后再发送');
|
||||
}
|
||||
},
|
||||
changeMemberPhone() {
|
||||
if(!this.verifyChangeMobile) return false;
|
||||
this.$u.api.changeMemberPhone({
|
||||
old_mobile: this.oldNumber,
|
||||
old_mobile: this.oldMobile,
|
||||
old_code: this.oldCode,
|
||||
new_mobile: this.newNumber,
|
||||
new_mobile: this.newMobile,
|
||||
new_code: this.newCode,
|
||||
}).then(res => {
|
||||
|
||||
if(res.errCode == 0) {
|
||||
uni.navigateBack();
|
||||
} else {
|
||||
this.$refs.uToast.show({
|
||||
type: 'error',
|
||||
title: res.message
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
end() {
|
||||
this.$u.toast('倒计时结束');
|
||||
// this.$u.toast('倒计时结束');
|
||||
},
|
||||
start() {
|
||||
this.$u.toast('倒计时开始');
|
||||
}
|
||||
// this.$u.toast('倒计时开始');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
@ -1,19 +1,19 @@
|
||||
<template>
|
||||
<view class="complaints">
|
||||
<view class="complaints-box">
|
||||
<view class="complaints-box" v-for="item in feedbackList" :key="item.fb_id">
|
||||
<view class="suggestions">
|
||||
<view class="text">您的满意是对我们最大的支持,茫茫德铭阳光之中能够遇到亲也是我们的荣幸</view>
|
||||
<view class="text">{{ item.fb_content }}</view>
|
||||
<view class="image">
|
||||
<image v-for="(url, index) in imgList" :key="index" :src="url"></image>
|
||||
<image v-for="(url, index) in item.fb_images" :key="index" :src="url"></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="reply">
|
||||
<view class="reply-title">后台回复:</view>
|
||||
<view class="reply-content u-line-4">您的满意是对我们最大的支持,茫茫德铭阳光之中能够遇到亲也是我们的荣幸,您的评价是对我们付出最好的认可,我们会不断前行,不忘初衷,给亲们提供更好的服务和产品!我把对您的谢意写在纸上,被风吹走了;我把对您的谢意写在沙滩上,被海浪卷走了;我只好把对您的谢意写在解释里,这样才会永驻心间!感谢您对的支持!加油!加油!, 祝您生活愉快,工作顺利,期待我们下次合作愉快! ! !</view>
|
||||
<view class="reply-content u-line-4">{{ item.reply_content }}</view>
|
||||
</view>
|
||||
<view class="date">
|
||||
<image src="../static/mine/26.png"></image>
|
||||
<view>2020-05-14</view>
|
||||
<view>{{ reply_time }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@ -27,7 +27,9 @@ export default {
|
||||
require('../static/mine/23.png'),
|
||||
require('../static/mine/23.png'),
|
||||
require('../static/mine/23.png')
|
||||
]
|
||||
],
|
||||
feedbackList: [],
|
||||
page: 1, // 默认1
|
||||
}
|
||||
},
|
||||
onNavigationBarButtonTap() {
|
||||
@ -35,6 +37,18 @@ export default {
|
||||
url: '/pageE/more/WriteComments'
|
||||
});
|
||||
},
|
||||
onShow() {
|
||||
this.getFeedbackList();
|
||||
},
|
||||
methods: {
|
||||
getFeedbackList() {
|
||||
this.$u.api.getFeedbackList({ page: this.page }).then(res => {
|
||||
if(res.errCode == 0) {
|
||||
this.feedbackList = res.data.feedbackList;
|
||||
}
|
||||
})
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
|
@ -41,11 +41,14 @@ export default {
|
||||
address_id: this.address.address_id
|
||||
}).then((res)=>{
|
||||
if(res.errCode == 0) {
|
||||
this.$refs.uToast.show({
|
||||
title: res.message,
|
||||
type: 'success',
|
||||
uni.redirectTo({
|
||||
url: '/pageE/more/Address'
|
||||
})
|
||||
});
|
||||
// this.$refs.uToast.show({
|
||||
// title: res.message,
|
||||
// type: 'success',
|
||||
// url: '/pageE/more/Address'
|
||||
// })
|
||||
} else {
|
||||
this.$refs.uToast.show({
|
||||
title: res.message,
|
||||
|
@ -3,8 +3,7 @@
|
||||
<view class="main-container">
|
||||
<textarea auto-height placeholder="发表您的意见吧,我们会做得更好." maxlength="200" v-model="text" />
|
||||
<u-upload
|
||||
ref="uUpload"
|
||||
@on-uploaded="onUploaded"
|
||||
ref="uUpload"
|
||||
:custom-btn="true"
|
||||
:max-count="count"
|
||||
:auto-upload="false"
|
||||
@ -21,6 +20,7 @@
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
action: $u.http.baseUrl + 'Upload/uploadfile',
|
||||
count: 4, // 最大图片数量
|
||||
text: '',
|
||||
imageList: []
|
||||
@ -28,11 +28,33 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
submit() {
|
||||
this.$refs.uUpload.upload();
|
||||
console.log(this.action);
|
||||
console.log(this.imageList);
|
||||
|
||||
// this.$refs.uUpload.upload();
|
||||
let promise = [];
|
||||
this.imageList.forEach(url => {
|
||||
// this.uploadImage(url);
|
||||
})
|
||||
Promise.all(promise).then(() => {
|
||||
|
||||
})
|
||||
},
|
||||
async uploadImage(file) {
|
||||
this.$u.api.uploadfile({
|
||||
file: file,
|
||||
}).then(res => {
|
||||
if(res.errCode == 0) {}
|
||||
})
|
||||
},
|
||||
writeFeedback() {
|
||||
this.$u.api.writeFeedback({
|
||||
fb_content: this.text,
|
||||
fb_images: '',
|
||||
}).then(res => {
|
||||
if(res.errCode == 0) {}
|
||||
})
|
||||
},
|
||||
onUploaded(list) {
|
||||
console.log(this.text, list)
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
@ -3,75 +3,16 @@
|
||||
<view>
|
||||
<u-tabs-swiper ref="tabs" :list="list" :is-scroll="false" active-color="#FF780F" :current="current" font-size="26" @change="tabsChange" height="88" :gutter="30"></u-tabs-swiper>
|
||||
</view>
|
||||
<swiper :current="swiperCurrent" @animationfinish="animationfinish">
|
||||
<swiper-item class="swiper-item">
|
||||
<swiper :current="swiperCurrent" @animationfinish="animationfinish" :style="{ height: swiperHeight }">
|
||||
<swiper-item class="swiper-item" v-for="(item, index) in list" :key="index">
|
||||
<scroll-view scroll-y style="height: 100%;" @scrolltolower="reachBottom">
|
||||
<view>
|
||||
<view class="item-container" v-for="(item, index) in orderList" :key="index">
|
||||
<OrderItem :current="current"></OrderItem>
|
||||
<view class="item-container" v-for="order in orderList" :key="order.order_id">
|
||||
<OrderItem :order="order"></OrderItem>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus[5]" bgColor="#ECECEC" margin-bottom="20"></u-loadmore>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y style="height: 100%;">
|
||||
<view>
|
||||
<view class="item-container" v-for="(item, index) in orderList" :key="index">
|
||||
<OrderItem :current="current"></OrderItem>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus[5]" bgColor="#ECECEC" margin-bottom="20"></u-loadmore>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y style="height: 100%;">
|
||||
<view>
|
||||
<view class="item-container" v-for="(item, index) in orderList" :key="index">
|
||||
<OrderItem :current="current"></OrderItem>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus[5]" bgColor="#ECECEC" margin-bottom="20"></u-loadmore>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y style="height: 100%;">
|
||||
<view>
|
||||
<view class="item-container" v-for="(item, index) in orderList" :key="index">
|
||||
<OrderItem :current="current"></OrderItem>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus[5]" bgColor="#ECECEC" margin-bottom="20"></u-loadmore>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y style="height: 100%;">
|
||||
<view>
|
||||
<view class="item-container" v-for="(item, index) in orderList" :key="index">
|
||||
<OrderItem :current="current"></OrderItem>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus[5]" bgColor="#ECECEC" margin-bottom="20"></u-loadmore>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y style="height: 100%;" @scrolltolower="reachBottom">
|
||||
<view>
|
||||
<view class="item-container" v-for="(item, index) in orderList" :key="index">
|
||||
<OrderItem :current="current"></OrderItem>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus[5]" bgColor="#ECECEC" margin-bottom="20"></u-loadmore>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
<swiper-item class="swiper-item">
|
||||
<scroll-view scroll-y style="height: 100%;" @scrolltolower="reachBottom">
|
||||
<view>
|
||||
<view class="item-container" v-for="(item, index) in orderList" :key="index">
|
||||
<OrderItem :current="current"></OrderItem>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus[6]" bgColor="#ECECEC" margin-bottom="20"></u-loadmore>
|
||||
</view>
|
||||
<u-empty text="暂无订单" mode="order" color="#000000" v-if="!orderList.length"></u-empty>
|
||||
<u-loadmore :status="loadStatus[index]" bgColor="#ECECEC" margin-bottom="20" v-if="orderList.length >= 15"></u-loadmore>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
@ -97,44 +38,80 @@ export default {
|
||||
}, {
|
||||
name: '售后'
|
||||
}],
|
||||
orderList: 5,
|
||||
orderList: [],
|
||||
loadStatus: ['loadmore','loadmore','loadmore','loadmore','loadmore','loadmore','loadmore'],
|
||||
page: 0,
|
||||
current: 0,
|
||||
swiperCurrent: 0,
|
||||
swiperHeight: '',
|
||||
timer: true,
|
||||
}
|
||||
},
|
||||
components: {
|
||||
OrderItem
|
||||
},
|
||||
watch: {
|
||||
current() {
|
||||
this.page = 0;
|
||||
this.getOrderList('again');
|
||||
},
|
||||
},
|
||||
onLoad(option) {
|
||||
if(option.current) {
|
||||
this.current = Number(option.current);
|
||||
this.swiperCurrent = this.current;
|
||||
}
|
||||
this.getOrderList();
|
||||
const current = option.current ? Number(option.current) : 0;
|
||||
this.current = current;
|
||||
this.swiperCurrent = this.current;
|
||||
this.setViewHeight();
|
||||
},
|
||||
methods: {
|
||||
getOrderList() {
|
||||
this.$u.api.getOrderList({
|
||||
async getOrderList(reload = '') {
|
||||
let type;
|
||||
// state_type 订单状态:0:已取消 10:未付款 20:已付款 30:已发货 40:已收货
|
||||
switch (this.current) {
|
||||
case 1:
|
||||
type = 10; // 待支付
|
||||
break;
|
||||
case 2:
|
||||
type = 0; // 已取消
|
||||
break;
|
||||
case 3:
|
||||
type = 30; // 待收货
|
||||
break;
|
||||
case 4:
|
||||
type = -1; // 试穿试送
|
||||
break;
|
||||
case 5:
|
||||
type = 20; // 待评价
|
||||
break;
|
||||
case 6:
|
||||
type = 40; // 售后
|
||||
break;
|
||||
default:
|
||||
type = -1;
|
||||
break;
|
||||
}
|
||||
const res = await this.$u.api.getOrderList({
|
||||
page: this.page,
|
||||
}).then(res => {
|
||||
if(res.errCode == 0) {
|
||||
|
||||
}
|
||||
type: type,
|
||||
})
|
||||
this.timer = true;
|
||||
if(res.errCode == 0) {
|
||||
if(reload) this.orderList = res.data;
|
||||
else this.orderList.push(...res.data);
|
||||
}
|
||||
return res.data.length;
|
||||
},
|
||||
reachBottom() {
|
||||
// console.log(this.page);
|
||||
if(this.page >= 3) return;
|
||||
// 修改当前的 loadStatus
|
||||
console.log(this.loadStatus);
|
||||
if(!this.timer) return false;
|
||||
this.timer = false;
|
||||
this.loadStatus.splice(this.current, 1, "loading");
|
||||
this.page++;
|
||||
setTimeout(() => {
|
||||
this.orderList += 5;
|
||||
this.getOrderList.then(length => {
|
||||
this.loadStatus.splice(this.current, 1, "nomore");
|
||||
}, 1200);
|
||||
if(length == 0) this.page--;
|
||||
}).catch(() => {
|
||||
this.loadStatus.splice(this.current, 1, "nomore");
|
||||
this.page--;
|
||||
})
|
||||
},
|
||||
tabsChange(index) {
|
||||
this.current = Number(index);
|
||||
@ -144,7 +121,11 @@ export default {
|
||||
let current = Number(e.detail.current);
|
||||
this.swiperCurrent = current;
|
||||
this.current = current;
|
||||
}
|
||||
},
|
||||
setViewHeight() {
|
||||
const sys = uni.getSystemInfoSync();
|
||||
this.swiperHeight = sys.windowHeight - 88 / 2 + 'px';
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@ -154,9 +135,9 @@ export default {
|
||||
background-color: #ECECEC;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
> uni-swiper {
|
||||
flex: 1;
|
||||
}
|
||||
// > uni-swiper {
|
||||
// flex: 1;
|
||||
// }
|
||||
.swiper-item {
|
||||
.item-container {
|
||||
padding: 20rpx 30rpx;
|
||||
|
@ -74,6 +74,7 @@ export default {
|
||||
return res.data.list;
|
||||
}
|
||||
},
|
||||
// 加载更多
|
||||
reachBottom() {
|
||||
// 修改当前的 loadStatus
|
||||
this.loadStatus = "loading";
|
||||
|
@ -56,11 +56,14 @@ export default {
|
||||
time: new Date(this.time)
|
||||
}).then((res)=>{
|
||||
if(res.errCode == 0) {
|
||||
this.$refs.uToast.show({
|
||||
title: res.message,
|
||||
type: 'success',
|
||||
uni.redirectTo({
|
||||
url: '/pageE/tool/Manicure'
|
||||
})
|
||||
});
|
||||
// this.$refs.uToast.show({
|
||||
// title: res.message,
|
||||
// type: 'success',
|
||||
// url: '/pageE/tool/Manicure'
|
||||
// })
|
||||
} else {
|
||||
this.showToast(res.message, 'error');
|
||||
}
|
||||
|
105
pageE/tool/MineCoupon.vue
Normal file
@ -0,0 +1,105 @@
|
||||
<template>
|
||||
<view class="coupon">
|
||||
<u-tabs-swiper ref="tabs" :list="list" :is-scroll="false" active-color="#FF780F" :current="current" font-size="32" :show-bar="false" @change="tabsChange" height="88" ></u-tabs-swiper>
|
||||
<swiper :current="swiperCurrent" @animationfinish="animationfinish" :style="{ height: swiperHeight }">
|
||||
<swiper-item class="swiper-item" v-for="(_, index) in list" :key="index">
|
||||
<scroll-view scroll-y class="scroll-coupon">
|
||||
<view class="coupon-item" v-for="(coupon, c_index) in test" :key="c_index">
|
||||
<Coupon :couponInfo="coupon" :status='index' :type="1" @use="useCoupon($event)"></Coupon>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
</template>
|
||||
<script>
|
||||
import Coupon from "@/components/mine/coupon/index"
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
list: [{
|
||||
name: '未使用'
|
||||
}, {
|
||||
name: '已使用'
|
||||
}, {
|
||||
name: '已过期'
|
||||
}],
|
||||
current: 0,
|
||||
swiperCurrent: 0,
|
||||
swiperHeight: '',
|
||||
test: [
|
||||
{
|
||||
index: 0
|
||||
},
|
||||
{
|
||||
index: 1
|
||||
},
|
||||
{
|
||||
index: 2
|
||||
},
|
||||
{
|
||||
index: 3
|
||||
},
|
||||
{
|
||||
index: 4
|
||||
},
|
||||
{
|
||||
index: 5
|
||||
},
|
||||
{
|
||||
index: 6
|
||||
},
|
||||
{
|
||||
index: 7
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
components: {
|
||||
Coupon
|
||||
},
|
||||
onLoad() {
|
||||
this.setViewHeight();
|
||||
},
|
||||
methods: {
|
||||
useCoupon(id) {
|
||||
console.log(id);
|
||||
},
|
||||
setViewHeight() {
|
||||
const res = uni.getSystemInfoSync();
|
||||
this.swiperHeight = res.windowHeight - (88 / 2 + 11 / 2) + 'px';
|
||||
},
|
||||
tabsChange(index) {
|
||||
this.swiperCurrent = index;
|
||||
},
|
||||
animationfinish(e) {
|
||||
let current = e.detail.current;
|
||||
this.swiperCurrent = current;
|
||||
this.current = current;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.coupon {
|
||||
overflow: hidden;
|
||||
.u-tabs {
|
||||
border: {
|
||||
top: 1rpx #ECECEC solid;
|
||||
bottom: 10rpx #ECECEC solid;
|
||||
};
|
||||
}
|
||||
.swiper-item {
|
||||
box-sizing: border-box;
|
||||
padding: 20rpx 30rpx;
|
||||
.scroll-coupon {
|
||||
height: 100%;
|
||||
.coupon-item {
|
||||
margin-bottom: 20rpx;
|
||||
// position: relative;
|
||||
// z-index: 9;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
@ -1,21 +1,20 @@
|
||||
<template>
|
||||
<view class="mine-history">
|
||||
<view class="history-box">
|
||||
<view v-for="(item, index) in historyList" :key="index" class="history-item">
|
||||
<view class="item-title">
|
||||
<image src="../static/mine/23.png"></image>
|
||||
<view>小米店铺</view>
|
||||
</view>
|
||||
<!-- <view class="item-image">
|
||||
<img src="../static/mine/23.png" />
|
||||
</view> -->
|
||||
<image src="../static/mine/23.png" class="item-image"></image>
|
||||
<view class="item-info">
|
||||
<view class="info-name">{{ item }}</view>
|
||||
<image src="../static/mine/22.png"></image>
|
||||
<scroll-view scroll-y class="history-box" @scrolltolower="reachBottom">
|
||||
<view class="item-box">
|
||||
<view v-for="(item, index) in historyList.slice(0, 50)" :key="index" class="history-item">
|
||||
<view class="item-title">
|
||||
<image :src="item.store_avatar"></image>
|
||||
<view>{{ item.store_name }}</view>
|
||||
</view>
|
||||
<image :src="item.goods_image" class="item-image"></image>
|
||||
<view class="item-info">
|
||||
<view class="info-name u-line-1">{{ item.goods_name }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<u-loadmore :status="loadStatus" bgColor="#ECECEC" margin-bottom="20" v-if="historyList.length > 9"></u-loadmore>
|
||||
</scroll-view>
|
||||
<u-empty text="暂无足迹" mode="list" color="#000" margin-top="240" v-if="!historyList.length"></u-empty>
|
||||
</view>
|
||||
</template>
|
||||
@ -24,18 +23,138 @@
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
historyList: [1, 2, 3, 6]
|
||||
historyList: [
|
||||
{
|
||||
"goods_id": 13,
|
||||
"goodsbrowse_time": "2020-06-28 15:45:56",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092121142556524.jpg",//商品主图
|
||||
"goods_name": "变频风冷无霜 独立双循环 LED显示 对开门冰箱(白色)",//商品名称
|
||||
"store_id": 1,//店铺id
|
||||
"store_name": "官方自营店铺",//店铺名
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"//店铺头像
|
||||
},
|
||||
{
|
||||
"goods_id": 13,
|
||||
"goodsbrowse_time": "2020-06-28 15:45:56",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092121142556524.jpg",//商品主图
|
||||
"goods_name": "变频风冷无霜 独立双循环 LED显示 对开门冰箱(白色)",//商品名称
|
||||
"store_id": 1,//店铺id
|
||||
"store_name": "官方自营店铺",//店铺名
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"//店铺头像
|
||||
},
|
||||
{
|
||||
"goods_id": 13,
|
||||
"goodsbrowse_time": "2020-06-28 15:45:56",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092121142556524.jpg",//商品主图
|
||||
"goods_name": "变频风冷无霜 独立双循环 LED显示 对开门冰箱(白色)",//商品名称
|
||||
"store_id": 1,//店铺id
|
||||
"store_name": "官方自营店铺",//店铺名
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"//店铺头像
|
||||
},
|
||||
{
|
||||
"goods_id": 13,
|
||||
"goodsbrowse_time": "2020-06-28 15:45:56",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092121142556524.jpg",//商品主图
|
||||
"goods_name": "变频风冷无霜 独立双循环 LED显示 对开门冰箱(白色)",//商品名称
|
||||
"store_id": 1,//店铺id
|
||||
"store_name": "官方自营店铺",//店铺名
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"//店铺头像
|
||||
},
|
||||
{
|
||||
"goods_id": 13,
|
||||
"goodsbrowse_time": "2020-06-28 15:45:56",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092121142556524.jpg",//商品主图
|
||||
"goods_name": "变频风冷无霜 独立双循环 LED显示 对开门冰箱(白色)",//商品名称
|
||||
"store_id": 1,//店铺id
|
||||
"store_name": "官方自营店铺",//店铺名
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"//店铺头像
|
||||
},
|
||||
{
|
||||
"goods_id": 12,
|
||||
"goodsbrowse_time": "2020-06-28 15:44:41",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092121050988491.jpg",
|
||||
"goods_name": "扬子(YAIR) 小2匹 冷暖 自动清洗 定频空调柜机",
|
||||
"store_id": 1,
|
||||
"store_name": "官方自营店铺",
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"
|
||||
},
|
||||
{
|
||||
"goods_id": 11,
|
||||
"goodsbrowse_time": "2020-06-28 15:38:11",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092120564717575.jpg",
|
||||
"goods_name": "1.5匹 变频 智能 二级能效极速侠 空调挂机",
|
||||
"store_id": 1,
|
||||
"store_name": "官方自营店铺",
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"
|
||||
},
|
||||
{
|
||||
"goods_id": 9,
|
||||
"goodsbrowse_time": "2020-06-28 15:36:27",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092120480147477.jpg",
|
||||
"goods_name": "长虹(CHANGHONG)39M1 39英寸 窄边高清液晶电视(黑色)",
|
||||
"store_id": 1,
|
||||
"store_name": "官方自营店铺",
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"
|
||||
},
|
||||
{
|
||||
"goods_id": 8,
|
||||
"goodsbrowse_time": "2020-06-28 15:36:06",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092120445748551.jpg",
|
||||
"goods_name": "先锋(Pioneer)LED-39B700S 39英寸 高清 网络 智能 液晶电视",
|
||||
"store_id": 1,
|
||||
"store_name": "官方自营店铺",
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"
|
||||
},
|
||||
{
|
||||
"goods_id": 10,
|
||||
"goodsbrowse_time": "2020-06-24 16:14:29",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092120493430154.jpg",
|
||||
"goods_name": "39英寸64位24核安卓智能平板液晶电视(黑色)",
|
||||
"store_id": 1,
|
||||
"store_name": "官方自营店铺",
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"
|
||||
},
|
||||
{
|
||||
"goods_id": 28,
|
||||
"goodsbrowse_time": "2020-06-23 17:07:45",
|
||||
"goods_image": "http://deming.test/uploads/home/store/goods/1/1_2017092202022516767.jpg",
|
||||
"goods_name": "南极人(NanJiren)纯棉床单四件套全棉床上用品婚庆被套4件套",
|
||||
"store_id": 1,
|
||||
"store_name": "官方自营店铺",
|
||||
"store_avatar": "http://deming.test/uploads/home/store/1/1_2020062410413137159.png"
|
||||
}
|
||||
],
|
||||
page: 1, // 默认1
|
||||
loadStatus: 'loadmore',
|
||||
timer: true,
|
||||
};
|
||||
},
|
||||
onLoad() {
|
||||
this.getBrowseList();
|
||||
},
|
||||
methods: {
|
||||
getBrowseList () {
|
||||
this.$u.api.getBrowseList().then(res => {
|
||||
if(res.errCode == 0) {
|
||||
this.historyList = res.data.storeInfo;
|
||||
async getBrowseList () {
|
||||
const res = await this.$u.api.getBrowseList({ page: this.page });
|
||||
this.timer = false;
|
||||
if(res.errCode == 0) {
|
||||
this.historyList = res.data.storeInfo;
|
||||
}
|
||||
return res.data.storeInfo.length;
|
||||
},
|
||||
reachBottom() {
|
||||
if(!this.timer) return false;
|
||||
this.loadStatus = "loading";
|
||||
this.page++;
|
||||
this.getBrowseList({page: this.page}).then(length => {
|
||||
if(length == 0) {
|
||||
this.page--;
|
||||
this.status = 'nomore';
|
||||
} else {
|
||||
this.status = 'loading';
|
||||
}
|
||||
}).catch(() => {
|
||||
this.loadStatus = "nomore";
|
||||
this.page--;
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -46,50 +165,56 @@ export default {
|
||||
min-height: calc(100vh - var(--window-top));
|
||||
background: #ECECEC;
|
||||
.history-box {
|
||||
height: calc(100vh - var(--window-top));
|
||||
padding: 20rpx 30rpx 0;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
.history-item {
|
||||
width: 220rpx;
|
||||
height: 290rpx;
|
||||
background: rgba(255,255,255,1);
|
||||
border-radius: 10rpx;
|
||||
padding: 20rpx 20rpx 22rpx;
|
||||
margin: 0 10rpx 20rpx 0;
|
||||
.item-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
> image {
|
||||
width: 50rpx;
|
||||
height: 50rpx;
|
||||
border-radius: 50%;
|
||||
margin-right: 19rpx;
|
||||
}
|
||||
> view {
|
||||
font-size: 24rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
}
|
||||
}
|
||||
.item-image {
|
||||
margin: 20rpx 0 17rpx;
|
||||
width: 180rpx;
|
||||
height: 140rpx;
|
||||
.item-box {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
.history-item {
|
||||
width: 220rpx;
|
||||
height: 290rpx;
|
||||
background: rgba(255,255,255,1);
|
||||
border-radius: 10rpx;
|
||||
}
|
||||
.item-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.info-name {
|
||||
font-size: 22rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
padding: 20rpx 20rpx 22rpx;
|
||||
margin: 0 10rpx 20rpx 0;
|
||||
.item-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
> image {
|
||||
width: 50rpx;
|
||||
height: 50rpx;
|
||||
border-radius: 50%;
|
||||
margin-right: 19rpx;
|
||||
}
|
||||
> view {
|
||||
font-size: 24rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
}
|
||||
}
|
||||
> image {
|
||||
width: 37rpx;
|
||||
height: 8rpx;
|
||||
.item-image {
|
||||
margin: 20rpx 0 17rpx;
|
||||
width: 180rpx;
|
||||
height: 140rpx;
|
||||
border-radius: 10rpx;
|
||||
}
|
||||
.item-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.info-name {
|
||||
margin-right: 10rpx;
|
||||
flex: 1;
|
||||
font-size: 22rpx;
|
||||
color: rgba(51,51,51,1);
|
||||
}
|
||||
> image {
|
||||
width: 37rpx;
|
||||
height: 8rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
40
pages.json
@ -329,6 +329,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "tool/MineCoupon",
|
||||
"style": {
|
||||
"navigationBarTitleText": "优惠券",
|
||||
"app-plus": {
|
||||
"titleSize": "36px",
|
||||
"titleNView": {
|
||||
"titleColor": "#333333",
|
||||
"backgroundColor": "#FFFFFF"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "more/MineHelp",
|
||||
"style": {
|
||||
@ -474,6 +487,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "mine/MineProgress",
|
||||
"style": {
|
||||
"navigationBarTitleText": "预计进度",
|
||||
"app-plus": {
|
||||
"titleSize": "36px",
|
||||
"titleNView": {
|
||||
"titleColor": "#333333",
|
||||
"backgroundColor": "#FFFFFF"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "tool/Manicure",
|
||||
"style": {
|
||||
@ -619,9 +645,16 @@
|
||||
"app-plus": {
|
||||
"titleSize": "36px",
|
||||
"titleNView": {
|
||||
"autoBackButton": false,
|
||||
"backgroundColor": "#FFFFFF",
|
||||
"titleColor": "#333333",
|
||||
"buttons": [
|
||||
{
|
||||
"type":"none",
|
||||
"text":"取消",
|
||||
"float":"left",
|
||||
"fontSize":"14"
|
||||
},
|
||||
{
|
||||
"type":"none",
|
||||
"text":"\ue62d",
|
||||
@ -629,11 +662,7 @@
|
||||
"fontSrc": "/static/fonts/customer.ttf",
|
||||
"fontSize":"20"
|
||||
}
|
||||
],
|
||||
"autoBackButton": true,
|
||||
"backButton": {
|
||||
"badgeText": "取消"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -645,6 +674,7 @@
|
||||
"app-plus": {
|
||||
"titleSize": "36px",
|
||||
"titleNView": {
|
||||
"autoBackButton": false,
|
||||
"backgroundColor": "#FFFFFF",
|
||||
"titleColor": "#333333",
|
||||
"buttons": [
|
||||
|
@ -2,7 +2,7 @@
|
||||
<view class="mine">
|
||||
<view class="mine-top">
|
||||
<view class="top">
|
||||
<image src="/static/image/mine/23.png" class="avatar" @click="toOtherPage('/mine/MineInfo')" />
|
||||
<u-avatar :src="userInfo.member_avatar" :size="110"></u-avatar>
|
||||
<view class="user-info">
|
||||
<view class="info-left">
|
||||
<view class="user-nickname" @click="toOtherPage('/mine/MineInfo')">{{ userInfo.member_nickname }}</view>
|
||||
@ -13,14 +13,14 @@
|
||||
</view>
|
||||
<view class="info-right">
|
||||
<view class="info-phone">{{ userInfo.member_mobile | phoneFormat }}</view>
|
||||
<view class="user-rank">等级:{{ userInfo.level }}级</view>
|
||||
<view class="user-rank">等级:{{ userInfo.member_level }}级</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="member-service" @click="toOtherPage('/mine/MemberServe')">会员服务</view>
|
||||
</view>
|
||||
<view class="bottom">
|
||||
<view @click="toOtherPage('/mine/GoodsCollection')">
|
||||
<view>{{ userInfo.member_fav_goods_num }}</view>
|
||||
<view>{{ userInfo.member_fav_goods_num || 0 }}</view>
|
||||
<view>商品收藏</view>
|
||||
</view>
|
||||
<view @click="toOtherPage('/mine/StoreCollection')">
|
||||
@ -32,7 +32,7 @@
|
||||
<view>图文收藏</view>
|
||||
</view>
|
||||
<view @click="toOtherPage('/mine/Integral')">
|
||||
<view>{{ userInfo.member_points }}</view>
|
||||
<view>{{ userInfo ? userInfo.member_points : 0 }}</view>
|
||||
<view>积分数</view>
|
||||
</view>
|
||||
<view @click="toOtherPage('/mine/MineConcerns')">
|
||||
@ -92,6 +92,10 @@
|
||||
<img src="/static/image/mine/18.png" />
|
||||
<view>足迹</view>
|
||||
</view>
|
||||
<view @click="toOtherPage('/tool/MineCoupon')">
|
||||
<img src="/static/image/mine/25.png" />
|
||||
<view>优惠券</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="more-tool">
|
||||
@ -131,7 +135,7 @@ export default {
|
||||
return value ? value.replace(/^(\d{3})\d*(\d{4})$/, '$1****$2') : '';
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
onShow() {
|
||||
this.getUserInfo();
|
||||
},
|
||||
onNavigationBarButtonTap() {
|
||||
@ -166,15 +170,8 @@ export default {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 40rpx;
|
||||
.avatar {
|
||||
width: 110rpx;
|
||||
height: 110rpx;
|
||||
border-radius: 50%;
|
||||
border: 2rpx solid rgba(251,251,251,1);
|
||||
margin-right: 30rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.user-info {
|
||||
margin-left: 30rpx;
|
||||
display: flex;
|
||||
.info-left {
|
||||
margin-right: 15rpx;
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 779 B |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 830 B |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 822 B |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 843 B |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 817 B |
Before Width: | Height: | Size: 844 B |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 822 B |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 650 B |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 815 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 719 B |