Merge branch 'master' of http://git.luyuan.tk/luyuan/deming into xbx

This commit is contained in:
luyuan 2020-07-10 15:57:28 +08:00
commit 73ffe92169
Signed by: theluyuan
GPG Key ID: A7972FD973317FF3
38 changed files with 822 additions and 1354 deletions

View File

@ -44,9 +44,9 @@ unescapeHTML(temp){}
/**
* 上传文件(只能单文件上传)
* @param { String } url 服务器 url
* @param { String } name 上传类型 goods-商品图片 avatar-用户头像 video-视频 store_logo-店铺logo store_banner-店铺banner store_avatar-店铺头像
* @param { String } filePath 要上传文件资源的路径
* @param { String } type 上传文件验证类型 默认: img 可选: video
* @return { object } promise 对象 resolve 为文件服务器地址 reject 为错误信息
* @return { object } promise 对象 resolve 返回文件服务器地址 reject 返回错误信息
*/
uploadFile({ url, filePath, type = 'img' } = {}) {}
uploadFile({ url, name, filePath }) {}
```

View File

@ -216,15 +216,15 @@ export default {
page: page,
});
},
// 意见反馈列表
// 意见反馈列表
getFeedbackList({ page }) {
return vm.$u.post('Feedback/feedbackList', {
return vm.$u.post('Member/feedbackList', {
page: page,
});
},
// 意见反馈-写意见
writeFeedback({ fb_content, fb_images }) {
return vm.$u.post('Feedback/writeFeedback', {
return vm.$u.post('Member/writeFeedback', {
fb_content: fb_content,
fb_images: fb_images,
});
@ -254,15 +254,6 @@ export default {
file: file,
});
},
// 上传图片视频
uploadfile({ file }) {
const params = {
file: file
}
console.log(params);
return vm.$u.post('Upload/uploadfile', params);
},
}
}
}

View 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>

View File

@ -17,7 +17,7 @@
<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>{{ order.add_time | date }}</view>
</view>
</view>
</view>
@ -25,6 +25,7 @@
<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="calcel" v-if="order.order_state == 10">取消支付</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>
@ -70,7 +71,7 @@ export default {
methods: {
toDetailsPage() {
uni.navigateTo({
url: '/pageE/order/Details?order.order_state=' + this.order.order_state
url: '/pageE/order/Details?id=' + this.order.order_id
});
},
toLogistics() {
@ -184,6 +185,9 @@ export default {
.logistics, .comment, .payment {
@include btn-class($width: 160rpx, $color: rgba(255,119,15,1));
}
.calcel {
@include btn-class($width: 160rpx, $color: rgba(155,153,153,1));
}
.service {
@include btn-class($width: 216rpx, $color: rgba(155,153,153,1));
}

View File

@ -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()
}
})
}
}
}
}

View File

@ -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
}

View File

@ -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();
}
}
}

View File

@ -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
}
}
}

View File

@ -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()
}
}
}

View File

@ -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>

View File

@ -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>

View File

@ -66,6 +66,9 @@ export default {
onLoad() {
this.getUserInfo();
},
onNavigationBarButtonTap(e) {
if( e.index == 0 ) uni.navigateBack();
},
methods: {
changeAvatar() {
const url = this.$u.http.config.baseUrl + '/Upload/uploadfile';
@ -77,7 +80,8 @@ export default {
this.avatar = res.tempFilePaths[0];
common.uploadFile({
url: url,
filePath: res.tempFilePaths[0]
name: 'avatar',
filePath: res.tempFilePaths[0]
}).then(result => {
this.avatar = result;
}, error => {

View File

@ -9,9 +9,12 @@
<view class="title">经验值</view>
<view class="value">{{ memberInfo.member_exppoints }}</view>
</view>
<view>
<view @click="viewProgress">
<view class="title">预计进度</view>
<view class="value">{{ memberInfo.next_grade_exppoints_diff }}</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" :style="{ height: integralHeight }">
@ -47,6 +50,11 @@ export default {
}
})
},
viewProgress() {
this.$u.route({
url: '/pageE/mine/MineProgress'
})
},
},
};
</script>
@ -74,6 +82,10 @@ export default {
font-size: 48rpx;
font-weight: 500;
color: rgba(255,255,255,1);
> image {
width: 52rpx;
height: 35rpx;
}
}
}
}

View File

@ -1,8 +1,8 @@
<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>
<!-- </view> -->
<swiper :current="swiperCurrent" @animationfinish="animationfinish" :style="{ height: swiperHeight }">
<swiper-item class="swiper-item">
<view class="integral">
@ -15,9 +15,12 @@
<view class="title">经验值</view>
<view class="value">{{ memberInfo.member_exppoints }}</view>
</view>
<view>
<view @click="viewProgress">
<view class="title">预计进度</view>
<view class="value">{{ memberInfo.next_grade_exppoints_diff }}</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" :style="{ height: richHeight }">
@ -26,21 +29,9 @@
</view>
</swiper-item>
<swiper-item class="swiper-item">
<scroll-view scroll-y class="coupon">
<view v-for="(item, 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>
</view>
<u-empty text="暂无优惠券" mode="coupon" color="#000" v-if="!couponList.length"></u-empty>
</scroll-view>
<view class="coupon">
<CouponView></CouponView>
</view>
</swiper-item>
<swiper-item class="swiper-item">
<scroll-view scroll-y class="details">
@ -61,6 +52,7 @@
</template>
<script>
import common from '@/static/js/common.js';
import CouponView from "./MemberServeCoupon";
export default {
data() {
return {
@ -76,11 +68,13 @@ export default {
current: 0,
swiperCurrent: 0,
pointslogList: [],
couponList: [],
memberInfo: {},
nodes: '',
}
},
components: {
CouponView
},
onShow() {
this.getMemberPointsStat();
this.getPointslogList();
@ -117,6 +111,11 @@ export default {
// console.log(this.richHeight);
this.swiperHeight = res.windowHeight - 88 / 2 + 'px';
},
viewProgress() {
this.$u.route({
url: '/pageE/mine/MineProgress'
})
},
},
}
</script>
@ -155,6 +154,10 @@ export default {
font-size: 48rpx;
font-weight: 500;
color: rgba(255,255,255,1);
> image {
width: 52rpx;
height: 35rpx;
}
}
}
}
@ -171,55 +174,6 @@ export default {
}
.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%;

View 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>

View File

@ -41,7 +41,7 @@ export default {
userInfo: {}
}
},
onLoad() {
onShow() {
this.getUserInfo();
},
onNavigationBarButtonTap() {

172
pageE/mine/MineProgress.vue Normal file
View 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>

View File

@ -1,33 +1,30 @@
<template>
<view class="complaints">
<view class="complaints-box" v-for="item in feedbackList" :key="item.fb_id">
<view class="suggestions">
<view class="text">{{ item.fb_content }}</view>
<view class="image">
<image v-for="(url, index) in item.fb_images" :key="index" :src="url"></image>
<scroll-view scroll-y @scrolltolower="reachBottom">
<view class="complaints-box" v-for="item in feedbackList" :key="item.fb_id">
<view class="suggestions">
<view class="text">{{ item.fb_content }}</view>
<view class="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">{{ item.reply_content }}</view>
</view>
<view class="date">
<image src="../static/mine/26.png"></image>
<view>{{ reply_time }}</view>
</view>
</view>
<view class="reply">
<view class="reply-title">后台回复</view>
<view class="reply-content u-line-4">{{ item.reply_content }}</view>
</view>
<view class="date">
<image src="../static/mine/26.png"></image>
<view>{{ reply_time }}</view>
</view>
</view>
<u-empty text="暂无意见" mode="list" color="#000000" icon-size="90" margin-top="300" v-if="!feedbackList.length"></u-empty>
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
imgList: [
require('../static/mine/23.png'),
require('../static/mine/23.png'),
require('../static/mine/23.png'),
require('../static/mine/23.png')
],
feedbackList: [],
page: 1, // 1
}

View File

@ -7,6 +7,9 @@
:custom-btn="true"
:max-count="count"
:auto-upload="false"
:action="action"
:header="header"
:form-data="formData"
>
<view slot="addBtn" class="slot-btn" hover-class="slot-btn__hover" hover-stay-time="150">
<img src="../static/mine/27.png" />
@ -20,32 +23,36 @@
export default {
data() {
return {
action: $u.http.baseUrl + 'Upload/uploadfile',
action: this.$u.http.config.baseUrl + '/Upload/uploadfile',
count: 4, //
text: '',
imageList: []
imageList: [],
header: {
"authorization": 'Bearer' + " " + uni.getStorageSync('token')
},
formData: {
name: '',
}
}
},
methods: {
submit() {
console.log(this.action);
console.log(this.imageList);
// this.$refs.uUpload.upload();
this.$refs.uUpload.upload();
let promise = [];
this.imageList.forEach(url => {
// this.uploadImage(url);
})
Promise.all(promise).then(() => {
// Promise.all(promise).then(() => {
})
// })
},
async uploadImage(file) {
this.$u.api.uploadfile({
file: file,
}).then(res => {
if(res.errCode == 0) {}
})
async beforeUpload(index, list) {
console.log(index, list);
// let data = await this.$u.post('url');
// return true; // false
},
writeFeedback() {
this.$u.api.writeFeedback({

View File

@ -21,17 +21,19 @@
<view class="info-goods">
<view class="goods-store">
<view class="stoer-title">
<image src="../static/mine/23.png" class="store-image"></image>
<view class="store-name">胖胖的店</view>
<image :src="orderInfo.extend_store.store_avatar" class="store-image"></image>
<view class="store-name">{{ orderInfo.extend_store.store_name }}</view>
<image src="../static/mine/21.png" class="right-icon"></image>
</view>
<view class="store-goods">
<image src="../static/mine/23.png"></image>
<view class="goods-info">
<view class="goods-name u-line-2">木糖少女小紫薯西装领连衣裙夏季新款女装夏收腰格子格纹裙子木糖少女小紫薯西装领连衣裙夏季新款女装夏收腰格子格纹裙子</view>
<view class="goods-order">
<view class="price">99</view>
<view class="num">x2</view>
<view v-for="goods in orderInfo.extend_order_goods" :key="goods.goods_id">
<view class="store-goods">
<image :src="goods.goods_image"></image>
<view class="goods-info">
<view class="goods-name u-line-2">{{ goods.goods_name }}</view>
<view class="goods-order">
<view class="price">{{ goods.goods_pay_price }}</view>
<view class="num">x{{ goods.goods_num }}</view>
</view>
</view>
</view>
</view>
@ -55,7 +57,7 @@
</view>
<view>
<view class="title">支付方式</view>
<view class="price">0.00</view>
<view class="price">{{ orderInfo.payment_name }}</view>
</view>
</view>
</view>
@ -83,9 +85,8 @@ export default {
}
},
onLoad(option) {
this.current = option.current;
console.log(option.current);
this.setTitle();
this.getOrderInfo(option.id);
},
methods: {
getOrderInfo(id) {
@ -98,11 +99,9 @@ export default {
})
},
setTitle(){
let title = ''
let title = '';
switch (this.current) {
case '1':
console.log(title);
title = "支付成功"
break;
default:

View File

@ -41,7 +41,7 @@ export default {
orderList: [],
loadStatus: ['loadmore','loadmore','loadmore','loadmore','loadmore','loadmore','loadmore'],
page: 0,
current: 0,
current: Number,
swiperCurrent: 0,
swiperHeight: '',
timer: true,
@ -51,7 +51,7 @@ export default {
OrderItem
},
watch: {
current() {
current(value) {
this.page = 0;
this.getOrderList('again');
},
@ -98,16 +98,16 @@ export default {
if(reload) this.orderList = res.data;
else this.orderList.push(...res.data);
}
return res.data.length;
return res;
},
reachBottom() {
if(!this.timer) return false;
this.timer = false;
this.loadStatus.splice(this.current, 1, "loading");
this.page++;
this.getOrderList.then(length => {
this.getOrderList.then(res => {
this.loadStatus.splice(this.current, 1, "nomore");
if(length == 0) this.page--;
if(res.data.length == 0) this.page--;
}).catch(() => {
this.loadStatus.splice(this.current, 1, "nomore");
this.page--;

View File

@ -59,6 +59,10 @@ export default {
title: '证件中心',
link: '../mine/ArticleDetails?type=1'
},
{
title: '屏蔽用户',
link: './ShieldUsers'
},
{
title: '关于我们',
link: '../mine/ArticleDetails?type=2'
@ -66,7 +70,7 @@ export default {
{
title: '帮助与反馈',
link: './feedback'
}
},
]
}
},

View File

@ -0,0 +1,59 @@
<template>
<view class="shield">
<view class="shield-list" v-for="(item, index) in 5" :key="index">
<view class="infomation">
<u-avatar :src="src" size="80"></u-avatar>
<view class="nickname u-line-1">神的温柔</view>
</view>
<view class="btn">取消屏蔽</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
src: 'https://dmmall.sdbairui.com/uploads/home/avatar/avatar_19.jpg'
}
}
};
</script>
<style lang="scss" scoped>
.shield {
min-height: calc(100vh - var(--window-top));
background-color: #ECECEC;
padding-top: 1rpx;
.shield-list {
background-color: #FFF;;
display: flex;
align-items: center;
justify-content: space-between;
padding: 10rpx 30rpx;
color:rgba(51,51,51,1);
margin-bottom: 2rpx;
.infomation {
display: flex;
align-items: center;
.nickname {
width: 300rpx;
font-size: 28rpx;
margin-left: 20rpx;
}
}
.btn {
font-size: 24rpx;
position: relative;
&::before {
position: absolute;
left: -30rpx;
top: 50%;
transform: translate(0, -50%);
content: '';
width: 1rpx;
height: 38rpx;
background: rgba(236,236,236,1);
}
}
}
}
</style>

View File

@ -1,14 +1,18 @@
<template>
<view class="manicure-order">
<view class="order-form">
<view class="order-name">
<!-- <view class="order-name">
<view>美甲人</view>
<input type="text" v-model="name" />
</view>
</view> -->
<view class="order-date" @click="show=true">
<view>美甲时间</view>
<img src="../static/mine/21.png" v-if="!time" />
<view v-else>{{ time }}</view>
<view class="title">美甲时间</view>
<image src="../static/mine/21.png" v-if="!time"></image>
<view v-else class="time">{{ time }}</view>
</view>
<view class="order-address">
<view class="title">美甲地址</view>
<input type="text" v-model="address" disabled />
</view>
</view>
<view class="order-btn" @click="addManicureOrder">确认订单</view>
@ -22,6 +26,7 @@ export default {
return {
name: '',
time: '',
address: '四川省攀枝花市银江镇',
params: {
year: true,
month: true,
@ -96,8 +101,11 @@ export default {
&:not(:last-child) {
margin-bottom: 2rpx;
}
.title {
font-size: 30rpx;
}
}
.order-name {
.order-address {
display: flex;
align-items: center;
> view {
@ -105,18 +113,24 @@ export default {
color: rgba(51,51,51,1);
}
> input {
padding-left: 20rpx;
flex: 1;
text-align: right;
font-size: 28rpx;
}
}
.order-date {
display: flex;
align-items: center;
justify-content: space-between;
> img {
> image {
width: 14rpx;
height :24rpx;
}
.time {
padding-left: 20rpx;
flex: 1;
text-align: left;
}
}
}
.order-btn {

105
pageE/tool/MineCoupon.vue Normal file
View 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>

View File

@ -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": {
@ -689,6 +715,19 @@
}
}
},
{
"path": "setting/ShieldUsers",
"style": {
"navigationBarTitleText": "屏蔽用户",
"app-plus": {
"titleSize": "36px",
"titleNView": {
"titleColor": "#333333",
"backgroundColor": "#FFFFFF"
}
}
}
},
{
"path": "order/Index",
"style": {

View File

@ -2,10 +2,10 @@
<view class="mine">
<view class="mine-top">
<view class="top">
<u-avatar :src="userInfo.member_avatar" :size="110"></u-avatar>
<u-avatar @click="toOtherPage('/mine/MineInfo')" :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>
<view class="user-nickname">{{ userInfo.member_nickname }}</view>
<view class="user-medal" @click="toOtherPage('/mine/MedalIntroduction')">
<img src="/static/image/mine/13.png" />
<view class="rank-title">勋章</view>
@ -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() {

BIN
static/image/mine/25.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

BIN
static/image/mine/26.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/image/mine/27.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
static/image/mine/28.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
static/image/mine/29.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
static/image/mine/30.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
static/image/mine/31.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
static/image/mine/32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
static/image/mine/33.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

BIN
static/image/mine/34.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -12,25 +12,28 @@ const common = {
/**
* 上传文件(只能单文件上传)
* @param { String } url 服务器 url
* @param { String } name 上传类型 goods-商品图片 avatar-用户头像 video-视频 store_logo-店铺logo store_banner-店铺banner store_avatar-店铺头像
* @param { String } filePath 要上传文件资源的路径
* @param { String } type 上传文件验证类型 默认: img 可选: video
* @return { object } promise 对象 resolve 为文件服务器地址 reject 为错误信息
* @return { object } promise 对象 resolve 返回文件服务器地址 reject 返回错误信息
*/
uploadFile({ url, filePath, type = 'img' } = {}) {
uploadFile({ url, name, filePath }) {
const token = uni.getStorageSync('token');
const promise = new Promise((resolve, reject) => {
uni.uploadFile({
url: url,
header: { "authorization": 'Bearer' + " " + token },
filePath: filePath,
name: 'file',
formData: { type: type },
name: name,
formData: {
name: name,
},
success: uploadFileRes => {
const data = JSON.parse(uploadFileRes.data);
if(data.errCode.code == 0) {
resolve(data.errCode.url);
// console.log(data);
if(data.errCode == 0) {
resolve(data.data);
} else {
reject(data.errCode.msg);
reject(data.message);
}
},
fail(){