38 changed files with 2774 additions and 885 deletions
@ -0,0 +1,64 @@ |
|||||||
|
import request from '@/utils/request' |
||||||
|
|
||||||
|
// 提交售后
|
||||||
|
/** |
||||||
|
*
|
||||||
|
订单号 orderCode; |
||||||
|
服务类型 0仅退款1退货退款 serviceType; |
||||||
|
申请原因 reasonForApplication; |
||||||
|
申请说明 applicationInstructions; |
||||||
|
申请说明图片 applicationDescriptionPicture; |
||||||
|
商品数据 productParamList; |
||||||
|
*/ |
||||||
|
export function submitAfterSealsOrder(data) { |
||||||
|
return request.post(`/applyForAfterSales`, data, { |
||||||
|
login: true |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// 售后订单列表
|
||||||
|
export function getAfterSealsList (params) { |
||||||
|
return request.get('/storeAfterSales/list', params, { |
||||||
|
login: true, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
// 售后详情
|
||||||
|
export function getAfterSalesDeatail(key) { |
||||||
|
return request.get(`/applyForAfterSales/${key}`); |
||||||
|
} |
||||||
|
|
||||||
|
// 查询订单
|
||||||
|
export function getAfterSealsDetail (key, id) { |
||||||
|
return request.get(`/store/detail/${key}/${id}`) |
||||||
|
} |
||||||
|
|
||||||
|
// 搜索
|
||||||
|
export function searchAfterSealsDetail (key) { |
||||||
|
return request.get(`/store/detail/${key}`) |
||||||
|
} |
||||||
|
|
||||||
|
// 撤销售后订单
|
||||||
|
export function rebackAfterSeals (key, id) { |
||||||
|
return request.get(`/revoke/${key}/${id}`) |
||||||
|
} |
||||||
|
|
||||||
|
// 获取物流信息
|
||||||
|
export function getExpressData () { |
||||||
|
return request.get('/yxExpress') |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// 添加快递单号
|
||||||
|
export function addExpressData (params) { |
||||||
|
return request.post('/addLogisticsInformation?' + `code=${params.code}&name=${params.name}&postalCode=${params.postalCode}&orderCode=${params.orderCode}&`, '', { |
||||||
|
login: true |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
// 删除售后订单
|
||||||
|
export function deleteAfterSeals (params) { |
||||||
|
return request.delete('/deleteAfterSalesOrder', params, { |
||||||
|
login: true |
||||||
|
}) |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
<template> |
||||||
|
<view class="productList"> |
||||||
|
<view class="goodsStyle acea-row row-between" |
||||||
|
v-for="cart in list" |
||||||
|
:key="cart.id" |
||||||
|
> |
||||||
|
<view class="pictrue"> |
||||||
|
<image :src="cart.productInfo.image" class="image" /> |
||||||
|
</view> |
||||||
|
<view class="text acea-row row-between"> |
||||||
|
<view class="name line2">{{ cart.productInfo.storeName }}</view> |
||||||
|
<view class="money"> |
||||||
|
<view> |
||||||
|
¥{{ |
||||||
|
cart.productInfo.attrInfo |
||||||
|
? cart.productInfo.attrInfo.price |
||||||
|
: cart.productInfo.price |
||||||
|
}} |
||||||
|
</view> |
||||||
|
<view class="num">x{{ cart.cartNum }}</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
export default { |
||||||
|
props: { |
||||||
|
list: { |
||||||
|
type: Array, |
||||||
|
default: () => [] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped lang="less"> |
||||||
|
</style> |
@ -0,0 +1,334 @@ |
|||||||
|
<template> |
||||||
|
<view class="returnList"> |
||||||
|
<view class="data bgRed"> |
||||||
|
<view v-if="orderDetail.salesState === 0"> |
||||||
|
<view class="state" v-if="orderDetail.state === 0"> |
||||||
|
已提交申请,请耐心等待卖家处理 |
||||||
|
</view> |
||||||
|
<view class="state" v-if="orderDetail.state === 1"> |
||||||
|
<view class="state" v-if="orderDetail.serviceType === 0"> |
||||||
|
已通过平台审核,正在退款 |
||||||
|
</view> |
||||||
|
<view class="state" v-if="orderDetail.serviceType === 1"> |
||||||
|
已通过平台审核 ,请填写退货物流 |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="state" v-if="orderDetail.state === 2"> |
||||||
|
已发货,等待商家审核 |
||||||
|
</view> |
||||||
|
<view class="state" v-if="orderDetail.state === 3"> |
||||||
|
售后订单已完成 |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view v-if="orderDetail.salesState === 1"> |
||||||
|
已撤销售后订单 |
||||||
|
</view> |
||||||
|
<view v-if="orderDetail.salesState === 2"> |
||||||
|
商家已拒绝售后申请 |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 退款总金额 --> |
||||||
|
<view class="money"> |
||||||
|
<view class="top"> |
||||||
|
<text>退款总金额</text> |
||||||
|
<text class="colorRed">¥{{ orderDetail.refundAmount || 0}}</text> |
||||||
|
</view> |
||||||
|
<view class="express" v-if="orderDetail.serviceType === 1"> |
||||||
|
<view class="title">商家已同意退货申请,请尽快发货。</view> |
||||||
|
<view class="info people"> |
||||||
|
收货人: {{ orderDetail.consignee || '' }} |
||||||
|
</view> |
||||||
|
<view class="info address"> |
||||||
|
收货地址: {{ orderDetail.address || '' }} |
||||||
|
</view> |
||||||
|
<view class="info phone"> |
||||||
|
收货电话: {{ orderDetail.phoneNumber || '' }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 退款信息 --> |
||||||
|
<view class="tips" v-if="orderDetail.state === 0"> |
||||||
|
<text class="title">您已成功发起退款申请,请耐心等待商家处理</text> |
||||||
|
<view class="content"> |
||||||
|
<view>· 卖家同意或超时未处理,系统将退款给您</view> |
||||||
|
<view>· 如果卖家拒绝,您可以修改退款申请后再次发起,卖家会重新处理</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 撤销 --> |
||||||
|
<!-- <view class="tips" v-if="orderDetail.serviceType === 1 && orderDetail.state >= 2"> |
||||||
|
<text class="title">您已撤销售后申请</text> |
||||||
|
<view class="content"> |
||||||
|
<view>· </view> |
||||||
|
<view>· </view> |
||||||
|
</view> |
||||||
|
</view> --> |
||||||
|
<!-- 商家拒接 --> |
||||||
|
<!-- <view class="tips" v-if="orderDetail.serviceType === 2 && orderDetail.state >= 2"> |
||||||
|
<text class="title">卖家已拒绝</text> |
||||||
|
<view class="content"> |
||||||
|
<view>· </view> |
||||||
|
<view>· </view> |
||||||
|
</view> |
||||||
|
</view> --> |
||||||
|
<view class="bottom"> |
||||||
|
<view class="btns redBtn" |
||||||
|
v-if="orderDetail.salesState === 0 |
||||||
|
&& orderDetail.serviceType === 1 |
||||||
|
&& orderDetail.state === 1" |
||||||
|
@click="toExpress" |
||||||
|
>填写物流</view> |
||||||
|
<view class="btns def" |
||||||
|
v-if="orderDetail.salesState === 0" |
||||||
|
@click="cancelReq" |
||||||
|
>撤销申请</view> |
||||||
|
<!-- <view class="btns redBtn" @click="editReq">修改申请</view>--> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 退款信息 --> |
||||||
|
<view class="rebackInfo"> |
||||||
|
<view class="top"> |
||||||
|
退款信息 |
||||||
|
</view> |
||||||
|
<view class="rebackItem" |
||||||
|
v-for="item in orderDetail.cartInfo" |
||||||
|
:key="item.id" |
||||||
|
> |
||||||
|
<image class="img" :src="item.productInfo.image" mode=""></image> |
||||||
|
<view class="info"> |
||||||
|
<view class="productName"> |
||||||
|
{{ item.productInfo.storeName }} |
||||||
|
</view> |
||||||
|
<view class="sku"> |
||||||
|
{{ item.productInfo.attrInfo.sku }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="bottom"> |
||||||
|
<view class="reason"> |
||||||
|
<view class="left"> |
||||||
|
退款原因: |
||||||
|
</view> |
||||||
|
<view class="right"> |
||||||
|
{{ orderDetail.reasons || '' }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="reason"> |
||||||
|
<view class="left"> |
||||||
|
退款金额: |
||||||
|
</view> |
||||||
|
<view class="right"> |
||||||
|
¥{{ orderDetail.refundAmount || 0 }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="reason"> |
||||||
|
<view class="left"> |
||||||
|
退款编号: |
||||||
|
</view> |
||||||
|
<view class="right"> |
||||||
|
{{ orderDetail.id || '' }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="reason"> |
||||||
|
<view class="left"> |
||||||
|
申请时间: |
||||||
|
</view> |
||||||
|
<view class="right"> |
||||||
|
{{ orderDetail.createTime || '' }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import{ |
||||||
|
getAfterSealsDetail, |
||||||
|
rebackAfterSeals |
||||||
|
} from '@/api/aftersales.js'; |
||||||
|
export default { |
||||||
|
data() { |
||||||
|
return { |
||||||
|
orderId: '', |
||||||
|
id: '', |
||||||
|
orderInfo: {}, |
||||||
|
orderDetail: {} |
||||||
|
} |
||||||
|
}, |
||||||
|
mounted() { |
||||||
|
this.orderId = this.$yroute.query.key |
||||||
|
this.id = this.$yroute.query.id |
||||||
|
this.getReturnDetail() |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
/** state售后状态 0已提交等待平台审核 1平台已审核 等待用户发货/退款 2 用户已发货 3已完成 */ |
||||||
|
async getReturnDetail() { |
||||||
|
const res = await getAfterSealsDetail(this.orderId, this.id) |
||||||
|
if (res.status === 200) { |
||||||
|
this.orderDetail = res.data |
||||||
|
} else { |
||||||
|
uni.showToast({ |
||||||
|
title: "订单异常", |
||||||
|
icon: "none", |
||||||
|
duration: 2000, |
||||||
|
}); |
||||||
|
} |
||||||
|
}, |
||||||
|
toExpress () { |
||||||
|
this.$yrouter.push({ |
||||||
|
path: '/pages/order/submitExpress/index', |
||||||
|
query: { |
||||||
|
orderCode: this.orderId |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
// 撤销申请 |
||||||
|
async cancelReq() { |
||||||
|
const res = await rebackAfterSeals(this.orderId, this.id) |
||||||
|
if (res.status === 200) { |
||||||
|
uni.showToast({ |
||||||
|
title: "已撤销", |
||||||
|
icon: "none", |
||||||
|
duration: 2000, |
||||||
|
}); |
||||||
|
setTimeout(() => { |
||||||
|
this.$yrouter.back(); |
||||||
|
}, 1500) |
||||||
|
} else { |
||||||
|
uni.showToast({ |
||||||
|
title: "撤销失败", |
||||||
|
icon: "none", |
||||||
|
duration: 2000, |
||||||
|
}); |
||||||
|
} |
||||||
|
}, |
||||||
|
// 修改申请 |
||||||
|
editReq() {} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped lang='scss'> |
||||||
|
$red: #EB3729; |
||||||
|
.returnList{ |
||||||
|
.colorRed{ |
||||||
|
color: $red; |
||||||
|
} |
||||||
|
.bgRed{ |
||||||
|
background-color: $red; |
||||||
|
} |
||||||
|
.data{ |
||||||
|
width: 100%; |
||||||
|
height: 150rpx; |
||||||
|
line-height: 150rpx; |
||||||
|
padding-left: 30rpx; |
||||||
|
color: #FFF; |
||||||
|
} |
||||||
|
.money{ |
||||||
|
background-color: #FFF; |
||||||
|
.top{ |
||||||
|
padding: 20rpx 30rpx; |
||||||
|
font-size: 30rpx; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
border-bottom: 2rpx solid #F3F4F5; |
||||||
|
} |
||||||
|
.express{ |
||||||
|
padding: 20rpx 30rpx; |
||||||
|
font-size: 26rpx; |
||||||
|
.title{ |
||||||
|
color: #333333; |
||||||
|
} |
||||||
|
.info{ |
||||||
|
color: #999999; |
||||||
|
} |
||||||
|
} |
||||||
|
.tips{ |
||||||
|
height: 160rpx; |
||||||
|
padding: 20rpx 30rpx; |
||||||
|
color: #999999; |
||||||
|
border-bottom: 2rpx solid #F3F4F5; |
||||||
|
font-size: 26rpx; |
||||||
|
.title{ |
||||||
|
overflow: hidden; |
||||||
|
white-space: nowrap; |
||||||
|
text-overflow: ellipsis; |
||||||
|
} |
||||||
|
.content{ |
||||||
|
font-size: 20rpx; |
||||||
|
} |
||||||
|
} |
||||||
|
.bottom{ |
||||||
|
padding: 20rpx 30rpx; |
||||||
|
display: flex; |
||||||
|
justify-content: flex-end; |
||||||
|
.btns{ |
||||||
|
width: 160rpx; |
||||||
|
height: 58rpx; |
||||||
|
margin: 0 10rpx; |
||||||
|
font-size: 24rpx; |
||||||
|
text-align: center; |
||||||
|
line-height: 58rpx; |
||||||
|
border-radius: 180rpx; |
||||||
|
} |
||||||
|
.def{ |
||||||
|
color: #DDDDDD; |
||||||
|
border: 2rpx solid #DDDDDD; |
||||||
|
} |
||||||
|
.redBtn{ |
||||||
|
color: #FFF; |
||||||
|
background-color: $red; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.rebackInfo{ |
||||||
|
padding: 0 30rpx; |
||||||
|
background-color: #FFF; |
||||||
|
.top{ |
||||||
|
height: 80rpx; |
||||||
|
margin: 20rpx 0; |
||||||
|
line-height: 80rpx; |
||||||
|
font-size: 30rpx; |
||||||
|
font-weight: bold; |
||||||
|
color: #333333; |
||||||
|
border-bottom: 2rpx solid #F3F4F5; |
||||||
|
} |
||||||
|
.rebackItem{ |
||||||
|
padding: 20rpx 0; |
||||||
|
font-size: 28rpx; |
||||||
|
display: flex; |
||||||
|
border-bottom: 2rpx solid #F3F4F5; |
||||||
|
.img{ |
||||||
|
width: 120rpx; |
||||||
|
height: 120rpx; |
||||||
|
} |
||||||
|
.info{ |
||||||
|
margin-left: 16rpx; |
||||||
|
flex: 1; |
||||||
|
.productName{ |
||||||
|
width: 100%; |
||||||
|
height: 80rpx; |
||||||
|
overflow: hidden; |
||||||
|
text-overflow: ellipsis; |
||||||
|
color: #333333; |
||||||
|
} |
||||||
|
.sku{ |
||||||
|
font-size: 24rpx; |
||||||
|
color: #CCCCCC; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.bottom{ |
||||||
|
padding: 20rpx 0; |
||||||
|
.reason{ |
||||||
|
font-size: 28rpx; |
||||||
|
color: #333333; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
.right{ |
||||||
|
color: #AAAAAA; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,184 @@ |
|||||||
|
<!-- 售后列表内容 --> |
||||||
|
<template> |
||||||
|
<view class="productItem"> |
||||||
|
<view class="title"> |
||||||
|
<view class="shopName"> |
||||||
|
订单号:{{ item.orderCode }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="content" v-for="(i, index) in item.cartInfo"> |
||||||
|
<image class="img" |
||||||
|
:src="i.productInfo.image" |
||||||
|
mode="" |
||||||
|
@click.stop="goGoodsCon(i)" |
||||||
|
></image> |
||||||
|
<view class="info"> |
||||||
|
<view class="infoTitle"> |
||||||
|
{{ i.productInfo.storeName }} |
||||||
|
</view> |
||||||
|
<view class="infoSku"> |
||||||
|
<view class="sku"> |
||||||
|
{{ i.productInfo.attrInfo.sku || '' }} |
||||||
|
</view> |
||||||
|
<view class="num"> |
||||||
|
x {{ 1 }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="infoMoney"> |
||||||
|
退款:<view class="red"> |
||||||
|
¥{{ i.productInfo.price }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="money"> |
||||||
|
<view class="status"> |
||||||
|
<view v-if="item.salesState === 0"> |
||||||
|
<view v-if="item.state === 0">商家处理中</view> |
||||||
|
<view v-if="item.state === 1">售后中</view> |
||||||
|
<view v-if="item.state === 2">等待商家收货</view> |
||||||
|
<view v-if="item.state === 3">已完成</view> |
||||||
|
</view> |
||||||
|
<view v-if="item.salesState === 1"> |
||||||
|
已撤销 |
||||||
|
</view> |
||||||
|
<view v-if="item.salesState === 2"> |
||||||
|
商家拒绝 |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="refundMoney"> |
||||||
|
退款:<view class="red"> |
||||||
|
¥{{ item.refundAmount }} |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="btns"> |
||||||
|
<view class="button def" |
||||||
|
@click="toDetail" |
||||||
|
v-if="item.state === 2" |
||||||
|
>删除记录</view> |
||||||
|
<view class="button redBtn" @click="toDetail(item)">查看详情</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
deleteAfterSeals |
||||||
|
} from '@/api/aftersales.js' |
||||||
|
export default { |
||||||
|
props: { |
||||||
|
item: { |
||||||
|
type: Object, |
||||||
|
default: () => ({}) |
||||||
|
} |
||||||
|
}, |
||||||
|
methods:{ |
||||||
|
// 跳转商品 |
||||||
|
goGoodsCon(item) { |
||||||
|
this.$yrouter.push({ |
||||||
|
path: "/pages/shop/GoodsCon/index", |
||||||
|
query: { id: item.productInfo.id } |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 跳转售后详情 |
||||||
|
toDetail (item) { |
||||||
|
console.log(item) |
||||||
|
this.$yrouter.push({ |
||||||
|
path: "/pages/order/OrderReturnDetail/index", |
||||||
|
query: { |
||||||
|
key: item.orderCode, |
||||||
|
id: item.id |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.productItem{ |
||||||
|
margin: 10rpx 0; |
||||||
|
background-color: #FFF; |
||||||
|
.title{ |
||||||
|
height: 80rpx; |
||||||
|
padding: 0 30rpx; |
||||||
|
color: #333; |
||||||
|
font-size: 28rpx; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
.content{ |
||||||
|
padding: 20rpx 30rpx; |
||||||
|
border: 2rpx solid #F3F4F5; |
||||||
|
display: flex; |
||||||
|
.img{ |
||||||
|
width: 180rpx; |
||||||
|
height: 180rpx; |
||||||
|
} |
||||||
|
.info{ |
||||||
|
flex: 1; |
||||||
|
margin-left: 16rpx; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
justify-content: space-around; |
||||||
|
.infoTitle{ |
||||||
|
width: 100%; |
||||||
|
height: 80rpx; |
||||||
|
font-size: 28rpx; |
||||||
|
color: #333333; |
||||||
|
overflow: hidden; |
||||||
|
text-overflow: ellipsis; |
||||||
|
} |
||||||
|
.infoSku{ |
||||||
|
font-size: 24rpx; |
||||||
|
color: #999999; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
} |
||||||
|
.infoMoney{ |
||||||
|
font-size: 24rpx; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.money{ |
||||||
|
height: 80rpx; |
||||||
|
padding: 0 30rpx; |
||||||
|
font-size: 28rpx; |
||||||
|
font-family: PingFang SC; |
||||||
|
color: #333333; |
||||||
|
border: 2rpx solid #F3F4F5; |
||||||
|
display: flex; |
||||||
|
justify-content: space-between; |
||||||
|
align-items: center; |
||||||
|
} |
||||||
|
.btns{ |
||||||
|
padding: 20rpx 30rpx; |
||||||
|
display: flex; |
||||||
|
justify-content: flex-end; |
||||||
|
.button{ |
||||||
|
width: 160rpx; |
||||||
|
height: 58rpx; |
||||||
|
margin: 0 10rpx; |
||||||
|
border-radius: 180rpx; |
||||||
|
font-size: 24rpx; |
||||||
|
line-height: 54rpx; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
.def{ |
||||||
|
color: #DDD; |
||||||
|
border: 2rpx solid #DDDDDD; |
||||||
|
} |
||||||
|
.redBtn{ |
||||||
|
color: #FFF; |
||||||
|
background-color: #EB3729; |
||||||
|
border: 2rpx solid #EB3729; |
||||||
|
} |
||||||
|
} |
||||||
|
.red{ |
||||||
|
display: inline-block; |
||||||
|
color: #EB3729; |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,174 @@ |
|||||||
|
<!-- 提交物流 --> |
||||||
|
<template> |
||||||
|
<view class="submitExpress"> |
||||||
|
<!-- 填写物流 --> |
||||||
|
<view class="form"> |
||||||
|
<picker class="picker" |
||||||
|
:value="express" |
||||||
|
:range="expressPicker" |
||||||
|
@change="changeExpress" |
||||||
|
> |
||||||
|
<view class="item acea-row row-between-wrapper"> |
||||||
|
<view class="title"> |
||||||
|
<view class="point"> |
||||||
|
* |
||||||
|
</view> |
||||||
|
物流公司 |
||||||
|
</view> |
||||||
|
<view class="num">{{ express }}</view> |
||||||
|
<text class="iconfont icon-jiantou"></text> |
||||||
|
</view> |
||||||
|
</picker> |
||||||
|
<view class="item"> |
||||||
|
<view class="title"> |
||||||
|
<view class="point"> |
||||||
|
* |
||||||
|
</view> |
||||||
|
物流单号: |
||||||
|
</view> |
||||||
|
<input class="input" v-model="expressQuery.postalCode" placeholder="请输入物流单号" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 提交按钮 --> |
||||||
|
<view class="btnContainer"> |
||||||
|
<view class="addBtn" @click="addExpress"> |
||||||
|
提交 |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import { |
||||||
|
getExpressData, |
||||||
|
addExpressData |
||||||
|
} from '@/api/aftersales.js' |
||||||
|
export default { |
||||||
|
data () { |
||||||
|
return { |
||||||
|
expressQuery: { |
||||||
|
code: '', // 快递公司编码 |
||||||
|
name: '', // 快递公司名称 |
||||||
|
postalCode: 'SF1213132132', // 快递编号 |
||||||
|
orderCode: '' // 订单编号 |
||||||
|
}, |
||||||
|
expressList: [], |
||||||
|
expressPicker: [], |
||||||
|
express: '' |
||||||
|
} |
||||||
|
}, |
||||||
|
mounted () { |
||||||
|
this.expressQuery.orderCode = this.$yroute.query.orderCode |
||||||
|
this.getExpress() |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
async getExpress () { |
||||||
|
const res = await getExpressData() |
||||||
|
console.log(res) |
||||||
|
this.expressList = res.data.map(item => { |
||||||
|
return { |
||||||
|
id: item.id, |
||||||
|
name: item.name, |
||||||
|
code: item.code |
||||||
|
} |
||||||
|
}) |
||||||
|
this.expressPicker = res.data.map(item => { |
||||||
|
return item.name |
||||||
|
}) |
||||||
|
}, |
||||||
|
changeExpress(e) { |
||||||
|
this.express = this.expressPicker[e.mp.detail.value]; |
||||||
|
this.expressQuery.code = this.expressList[e.mp.detail.value].code |
||||||
|
this.expressQuery.name = this.expressList[e.mp.detail.value].name |
||||||
|
}, |
||||||
|
async addExpress () { |
||||||
|
let errMsg = '请选择' |
||||||
|
if (!this.expressQuery.code || !this.expressQuery.code) { |
||||||
|
errMsg += ' 快递公司 ' |
||||||
|
} |
||||||
|
if (!this.expressQuery.postalCode) { |
||||||
|
errMsg += ' 快递单号 ' |
||||||
|
} |
||||||
|
if (errMsg.length > 3) { |
||||||
|
uni.showToast({ |
||||||
|
title: errMsg, |
||||||
|
icon: 'none', |
||||||
|
duration: 2000, |
||||||
|
}) |
||||||
|
} |
||||||
|
console.log(this.expressQuery) |
||||||
|
const res = await addExpressData(this.expressQuery) |
||||||
|
if (res.status === 200) { |
||||||
|
uni.showToast({ |
||||||
|
title: '物流填写成功!', |
||||||
|
icon: 'none', |
||||||
|
duration: 2000, |
||||||
|
}) |
||||||
|
this.$yrouter.push({ |
||||||
|
path: '/pages/order/ReturnList/index' |
||||||
|
}) |
||||||
|
} else { |
||||||
|
uni.showToast({ |
||||||
|
title: '提交物流信息失败!', |
||||||
|
icon: 'none', |
||||||
|
duration: 2000, |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" scoped> |
||||||
|
.submitExpress{ |
||||||
|
.form{ |
||||||
|
margin-bottom: 170rpx; |
||||||
|
.picker{ |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
font-size: 28rpx; |
||||||
|
color: #999999; |
||||||
|
} |
||||||
|
.item{ |
||||||
|
width: 100%; |
||||||
|
height: 80rpx; |
||||||
|
padding: 0 32rpx; |
||||||
|
line-height: 80rpx; |
||||||
|
background-color: #FFF; |
||||||
|
display: flex; |
||||||
|
.title{ |
||||||
|
font-size: 28rpx; |
||||||
|
color: #333333; |
||||||
|
display: flex; |
||||||
|
.point{ |
||||||
|
color: #EA3729; |
||||||
|
} |
||||||
|
} |
||||||
|
.input{ |
||||||
|
height: 80rpx; |
||||||
|
line-height: 80rpx; |
||||||
|
font-size: 28rpx; |
||||||
|
color: #999999; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.btnContainer{ |
||||||
|
width: 100%; |
||||||
|
height: 170rpx; |
||||||
|
background-color: #FFF; |
||||||
|
box-shadow: 0px 0px 0px rgba(197, 202, 207, 0.5); |
||||||
|
position: fixed; |
||||||
|
bottom: 0; |
||||||
|
.addBtn{ |
||||||
|
height: 90rpx; |
||||||
|
margin: 40rpx 30rpx; |
||||||
|
line-height: 90rpx; |
||||||
|
text-align: center; |
||||||
|
border-radius: 50rpx; |
||||||
|
font-size: 28rpx; |
||||||
|
color: #FFF; |
||||||
|
background: linear-gradient(90deg, #E93526 0%, #FF8E3C 100%); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</style> |
@ -0,0 +1,340 @@ |
|||||||
|
<template> |
||||||
|
<view class="register absolute"> |
||||||
|
<view class="whiteBg" v-if="formItem === 1"> |
||||||
|
<view class="title acea-row"> |
||||||
|
<view class="item" :class="current === index ? 'on' : ''" v-for="(item, index) in navList" |
||||||
|
@click="navTap(index)" :key="index">{{ item }}</view> |
||||||
|
</view> |
||||||
|
<view class="list" :hidden="current !== 0"> |
||||||
|
<form @submit.prevent="submit"> |
||||||
|
<view class="item"> |
||||||
|
<view class="acea-row row-between-wrapper"> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-phone_" /> |
||||||
|
</svg>--> |
||||||
|
<input type="text" placeholder="输入手机号码" v-model="account" required /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="item"> |
||||||
|
<view class="acea-row row-between-wrapper"> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-code_" /> |
||||||
|
</svg>--> |
||||||
|
<input type="password" placeholder="填写登录密码" v-model="password" required /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</form> |
||||||
|
</view> |
||||||
|
<view class="list" :hidden="current !== 1"> |
||||||
|
<view class="item"> |
||||||
|
<view class="acea-row row-between-wrapper"> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-phone_" /> |
||||||
|
</svg>--> |
||||||
|
<input type="text" placeholder="输入手机号码" v-model="account" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="item"> |
||||||
|
<view class="align-left"> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-code_1" /> |
||||||
|
</svg>--> |
||||||
|
<input type="text" placeholder="填写验证码" class="codeIput" v-model="captcha" /> |
||||||
|
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" |
||||||
|
@click="code">{{ text }}</button> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="logon" @click="loginMobile" :hidden="current !== 1">登录</view> |
||||||
|
<view class="logon" @click="submit" :hidden="current === 1">登录</view> |
||||||
|
<view class="tip"> |
||||||
|
没有账号? |
||||||
|
<text @click="formItem = 2" class="font-color-red">立即注册</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- 注册 --> |
||||||
|
<view class="whiteBg" v-else> |
||||||
|
<view class="title acea-row row-between-wrapper"> |
||||||
|
<view class="item on">注册账号</view> |
||||||
|
</view> |
||||||
|
<view class="list"> |
||||||
|
<view class="item"> |
||||||
|
<view> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-phone_" /> |
||||||
|
</svg>--> |
||||||
|
<input name="account" type="text" placeholder="输入手机号码" v-model="account" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="item"> |
||||||
|
<view class="align-left"> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-code_1" /> |
||||||
|
</svg>--> |
||||||
|
<input name="verifyCode" type="text" placeholder="填写验证码" class="codeIput" v-model="captcha" /> |
||||||
|
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" |
||||||
|
@click="code">{{ text }}</button> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<view class="item"> |
||||||
|
<view> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-code_" /> |
||||||
|
</svg>--> |
||||||
|
<input name="password" type="password" placeholder="填写您的登录密码" v-model="password" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- #ifndef H5 --> |
||||||
|
<view class="item"> |
||||||
|
<view> |
||||||
|
<!-- <svg class="icon" aria-hidden="true"> |
||||||
|
<use xlink:href="#icon-phone_" /> |
||||||
|
</svg>--> |
||||||
|
<input name="inviteCode" type="text" placeholder="输入邀请码" v-model="inviteCode" /> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
<!-- #endif --> |
||||||
|
|
||||||
|
</view> |
||||||
|
<view class="logon" @click="register">注册</view> |
||||||
|
<view class="tip"> |
||||||
|
已有账号? |
||||||
|
<text @click="formItem = 1" class="font-color-red">立即登录</text> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</view> |
||||||
|
</template> |
||||||
|
<script> |
||||||
|
import sendVerifyCode from "@/mixins/SendVerifyCode"; |
||||||
|
import { |
||||||
|
login, |
||||||
|
loginMobile, |
||||||
|
registerVerify, |
||||||
|
register |
||||||
|
} from "@/api/user"; |
||||||
|
import attrs, { |
||||||
|
required, |
||||||
|
alpha_num, |
||||||
|
chs_phone |
||||||
|
} from "@/utils/validate"; |
||||||
|
import { |
||||||
|
validatorDefaultCatch |
||||||
|
} from "@/utils/dialog"; |
||||||
|
import dayjs from "dayjs"; |
||||||
|
import cookie from "@/utils/store/cookie"; |
||||||
|
|
||||||
|
import { |
||||||
|
handleGetUserInfo |
||||||
|
} from "@/utils"; |
||||||
|
|
||||||
|
const BACK_URL = "login_back_url"; |
||||||
|
|
||||||
|
export default { |
||||||
|
name: "Login", |
||||||
|
mixins: [sendVerifyCode], |
||||||
|
data: function () { |
||||||
|
return { |
||||||
|
navList: ["账号登录", "修改密码"], |
||||||
|
current: 0, |
||||||
|
account: "", |
||||||
|
password: "", |
||||||
|
captcha: "", |
||||||
|
inviteCode: "", |
||||||
|
formItem: 1, |
||||||
|
type: "login" |
||||||
|
}; |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
async loginMobile() { |
||||||
|
var that = this; |
||||||
|
const { |
||||||
|
account, |
||||||
|
captcha |
||||||
|
} = that; |
||||||
|
try { |
||||||
|
await that |
||||||
|
.$validator({ |
||||||
|
account: [ |
||||||
|
required(required.message("手机号码")), |
||||||
|
chs_phone(chs_phone.message()) |
||||||
|
], |
||||||
|
captcha: [ |
||||||
|
required(required.message("验证码")), |
||||||
|
alpha_num(alpha_num.message("验证码")) |
||||||
|
] |
||||||
|
}) |
||||||
|
.validate({ |
||||||
|
account, |
||||||
|
captcha |
||||||
|
}); |
||||||
|
} catch (e) { |
||||||
|
return validatorDefaultCatch(e); |
||||||
|
} |
||||||
|
loginMobile({ |
||||||
|
phone: that.account, |
||||||
|
captcha: that.captcha, |
||||||
|
spread: cookie.get("spread") |
||||||
|
}) |
||||||
|
.then(res => { |
||||||
|
var data = res.data; |
||||||
|
that.$store.commit("login", data.token, dayjs(data.expires_time)); |
||||||
|
handleGetUserInfo(); |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
uni.showToast({ |
||||||
|
title: err.msg || err.response.data.msg || err.response.data.message, |
||||||
|
icon: "none", |
||||||
|
duration: 2000 |
||||||
|
}); |
||||||
|
}); |
||||||
|
}, |
||||||
|
async register() { |
||||||
|
var that = this; |
||||||
|
const { |
||||||
|
account, |
||||||
|
captcha, |
||||||
|
password |
||||||
|
} = that; |
||||||
|
try { |
||||||
|
await that |
||||||
|
.$validator({ |
||||||
|
account: [ |
||||||
|
required(required.message("手机号码")), |
||||||
|
chs_phone(chs_phone.message()) |
||||||
|
], |
||||||
|
captcha: [ |
||||||
|
required(required.message("验证码")), |
||||||
|
alpha_num(alpha_num.message("验证码")) |
||||||
|
], |
||||||
|
password: [ |
||||||
|
required(required.message("密码")), |
||||||
|
attrs.range([6, 16], attrs.range.message("密码")), |
||||||
|
alpha_num(alpha_num.message("密码")) |
||||||
|
] |
||||||
|
}) |
||||||
|
.validate({ |
||||||
|
account, |
||||||
|
captcha, |
||||||
|
password |
||||||
|
}); |
||||||
|
} catch (e) { |
||||||
|
return validatorDefaultCatch(e); |
||||||
|
} |
||||||
|
register({ |
||||||
|
account: that.account, |
||||||
|
captcha: that.captcha, |
||||||
|
password: that.password, |
||||||
|
inviteCode: that.inviteCode, |
||||||
|
spread: cookie.get("spread") |
||||||
|
}) |
||||||
|
.then(res => { |
||||||
|
uni.showToast({ |
||||||
|
title: res.msg, |
||||||
|
icon: "success", |
||||||
|
duration: 2000 |
||||||
|
}); |
||||||
|
that.formItem = 1; |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
uni.showToast({ |
||||||
|
title: err.msg || err.response.data.msg || err.response.data.message, |
||||||
|
icon: "none", |
||||||
|
duration: 2000 |
||||||
|
}); |
||||||
|
}); |
||||||
|
}, |
||||||
|
async code() { |
||||||
|
var that = this; |
||||||
|
const { |
||||||
|
account |
||||||
|
} = that; |
||||||
|
try { |
||||||
|
await that |
||||||
|
.$validator({ |
||||||
|
account: [ |
||||||
|
required(required.message("手机号码")), |
||||||
|
chs_phone(chs_phone.message()) |
||||||
|
] |
||||||
|
}) |
||||||
|
.validate({ |
||||||
|
account |
||||||
|
}); |
||||||
|
} catch (e) { |
||||||
|
return validatorDefaultCatch(e); |
||||||
|
} |
||||||
|
if (that.formItem == 2) that.type = "register"; |
||||||
|
await registerVerify({ |
||||||
|
phone: that.account, |
||||||
|
type: that.type |
||||||
|
}) |
||||||
|
.then(res => { |
||||||
|
uni.showToast({ |
||||||
|
title: res.msg, |
||||||
|
icon: "success", |
||||||
|
duration: 2000 |
||||||
|
}); |
||||||
|
that.sendCode(); |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
uni.showToast({ |
||||||
|
title: err.msg || err.response.data.msg || err.response.data.message, |
||||||
|
icon: "none", |
||||||
|
duration: 2000 |
||||||
|
}); |
||||||
|
}); |
||||||
|
}, |
||||||
|
navTap: function (index) { |
||||||
|
this.current = index; |
||||||
|
}, |
||||||
|
async submit() { |
||||||
|
const { |
||||||
|
account, |
||||||
|
password |
||||||
|
} = this; |
||||||
|
try { |
||||||
|
await this.$validator({ |
||||||
|
account: [ |
||||||
|
required(required.message("账号")), |
||||||
|
attrs.range([5, 16], attrs.range.message("账号")), |
||||||
|
alpha_num(alpha_num.message("账号")) |
||||||
|
], |
||||||
|
password: [ |
||||||
|
required(required.message("密码")), |
||||||
|
attrs.range([6, 16], attrs.range.message("密码")), |
||||||
|
alpha_num(alpha_num.message("密码")) |
||||||
|
] |
||||||
|
}).validate({ |
||||||
|
account, |
||||||
|
password |
||||||
|
}); |
||||||
|
} catch (e) { |
||||||
|
return validatorDefaultCatch(e); |
||||||
|
} |
||||||
|
login({ |
||||||
|
username: account, |
||||||
|
password, |
||||||
|
spread: cookie.get("spread") |
||||||
|
}) |
||||||
|
.then(({ data }) => { |
||||||
|
this.$store.commit("login", data.token, dayjs(data.expires_time)); |
||||||
|
handleGetUserInfo(); |
||||||
|
// let replace=this.$yroute.query.replace |
||||||
|
// if(replace){ |
||||||
|
|
||||||
|
// } |
||||||
|
// this.$yrouter.replace({ |
||||||
|
// path: this.$yroute.query.replace || '/pages/home/index' |
||||||
|
// }); |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
console.log(err); |
||||||
|
uni.showToast({ |
||||||
|
title: err.msg || err.response.data.msg || err.response.data.message, |
||||||
|
icon: "none", |
||||||
|
duration: 2000 |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
</script> |
Loading…
Reference in new issue