初始化

This commit is contained in:
魏啾
2024-03-21 15:38:10 +08:00
parent e2f200ae7a
commit 81321b648f
479 changed files with 60060 additions and 1 deletions

907
pages/order/index.vue Normal file
View File

@@ -0,0 +1,907 @@
<template>
<view class="content">
<view class="onecontent">
<view class="flex-start">
<view class="onecontent_oen flex-start">
<input class="onecontent_oen_input" type="text" v-model="like" placeholder="搜索订单/商家名/商品名">
<text class="onecontent_oen_text" @click="init_fn">搜索</text>
</view>
</view>
<view class="onecontent_tow flex-between">
<view ref="uTabs" class="onecontent_tow_item flex-colum" v-for="(item,index) in swipercurrentdata"
:key="index" @click="orderswitch(index)">
<view :class="swiperCurrent == index?'onecontent_tow_itemtexts':'onecontent_tow_itemtext'">
{{item.name}}
</view>
</view>
</view>
</view>
<view class="towcontent">
<swiper :current="swiperCurrent" @animationfinish="animationfinish" :style="{height:height}">
<swiper-item v-for="(item,index) in list_" :key="index">
<scroll-view scroll-y style="width: 100%;" :style="{height:height}" @scrolltolower="lower">
<view class="towcontentitem" v-for="(item1,index1) in list_[index].data" :key="index1"
@click="eeInfo(item1)">
<view class="towcontentitemone flex-between">
<text class="towcontentitemone_one">{{item1.store_title}}</text>
<view class="towcontentitemone_tow flex-start">
<!-- <image class="towcontentitemone_towimage"
:src="item.store_avatar"
mode="">
</image> -->
<text v-if="item1.status == 0">未支付</text>
<text v-if="item1.status == 1">已支付</text>
<text v-if="item1.status == 2">等待确认</text>
<text v-if="item1.status == 3">待服务</text>
<text v-if="item1.status == 4">已完成 </text>
<text v-if="item1.status == 5">已取消</text>
<text v-if="item1.status == 6">退款中</text>
<text v-if="item1.status == 7">已退款</text>
<text v-if="item1.deletetime" style="color: red;">(用户已删除)</text>
</view>
</view>
<view class="towcontentitemtow flex-start">
<image class="towcontentitemtow_imge" :src="item1.store_avatar" mode=""></image>
<view class="towcontentitemtow_one flex-colum-start">
<text class="towcontentitemtow_one_one">{{item1.title}}</text>
<text class="towcontentitemtow_one_tow"><text
style="font-size:28rpx;">¥</text>{{item1.total_price}}</text>
<text class="towcontentitemtow_one_there">{{item1.time}}</text>
</view>
<view class="towcontentitemtow_tow">
{{item1.number}}
</view>
</view>
<view class="towcontentitemthere">
<view v-if="item1.status == 2 || item1.status == 0"
class="towcontentitemthereitem towcontentitemthereitem_there"
@click.stop="orderokprebook(item1)">
确认预约
</view>
<view v-if="item1.status == 2 || item1.status == 0"
class="towcontentitemthereitem towcontentitemthereitem_tow"
@click.stop="orderrefuseprebook(item1)">
拒绝预约
</view>
<view v-if="item1.status == 3"
class="towcontentitemthereitem towcontentitemthereitem_tow"
@click.stop="orderordercancel(item1)">
取消订单/并退款
</view>
<view class="towcontentitemthereitem towcontentitemthereitem_there"
v-if="item1.status == 3" @click.stop="orderorderdelete(item1)">
完成服务
</view>
</view>
<u-overlay :show="overlayshow" @click.stop="overlayshow = false" opacity='0.1'>
<view class="warp">
<view class="rect flex-colum" @tap.stop>
<view class="rectone">
确定{{clickoverlayshowtext}}?
</view>
<view class="recttow flex-between">
<view class="recttow_one" @click="cancelOrder(item.status)">
确定
</view>
<view class="recttow_tow" @click="overlayshow = false">
取消
</view>
</view>
</view>
</view>
</u-overlay>
</view>
<view v-if="list_[index].data.length == 0 && list_[index].is_end == true" class="flex-colum">
<image class="" style="margin-top: 100rpx;"
src="https://ointmentweapp.oss-cn-beijing.aliyuncs.com/image/my/order/nothave.png"
mode="">
</image>
</view>
<u-loadmore :status="list_[index].status" />
</scroll-view>
</swiper-item>
</swiper>
</view>
<xc-privacyPopup ref="privacyComponent" position="center" @allowPrivacy="allowPrivacy"></xc-privacyPopup>
</view>
</template>
<script>
export default {
data() {
return {
height: "",
// 因为内部的滑动机制限制请将tabs组件和swiper组件的current用不同变量赋值
current: 0, // tabs组件的current值表示当前活动的tab选项
swiperCurrent: 0, // swiper组件的current值表示当前那个swiper-item是活动的
overlayshow: false,
list_: {
list0: { //待服务
data: [],
page: 1,
status: 'loadmore',
is_end: false,
},
list1: { //全部
data: [],
page: 1,
status: 'loadmore',
is_end: false,
},
list2: { //代付款
data: [],
page: 1,
status: 'loadmore',
is_end: false,
},
list3: { //待服务
data: [],
page: 1,
status: 'loadmore',
is_end: false,
}
},
like: '', //备注
clickoverlayshowtext: "",
swipercurrentdata: [{
name: '待确认'
}, {
name: '待服务'
}, {
name: '已完成'
}, {
name: '退款/售后'
}],
form: {
status: 'loadmore',
},
}
},
async onLoad(e) {
uni.hideTabBar()
if (e.type) {
// #ifdef MP-WEIXIN
uni.login({
provider: 'weixin',
success: async (data) => {
let res = await this.api.userautollogin({
code: data.code,
type: e.type,
syb_m_id: e.syb_m_id,
mobile: e.mobile,
sign: uni.utils.md5('wgpdZW1YEqNlUuvJfrB2nkjRVOHIeC' + e.type + e
.syb_m_id + e.mobile)
})
try {
if (res.code == 1) {
uni.cache.set('user', res.data.userinfo);
uni.cache.set("token", res.data.userinfo.token);
if (uni.cache.get('user').group_id == 2) {
uni.pro.switchTab('order/index')
uni.setNavigationBarTitle({
title: uni.cache.get('user').nickname
})
this.init_fn();
} else {
setTimeout(res => {
uni.reLaunch({
url: '/pages/stafflist/index'
})
}, 1500)
}
} else {
setTimeout(res => {
uni.reLaunch({
url: '/pages/stafflist/index'
})
}, 1500)
}
} catch (e) {
setTimeout(res => {
uni.reLaunch({
url: '/pages/stafflist/index'
})
}, 1500)
}
}
});
// #endif
} else {
if (uni.cache.get('user').group_id == 2) {
uni.pro.switchTab('order/index')
this.init_fn();
} else {
setTimeout(res => {
uni.reLaunch({
url: '/pages/stafflist/index'
})
}, 1500)
}
}
},
onShow() {
// #ifdef H5
uni.showTabBar()
// #endif
// #ifdef MP-WEIXIN
wx.getPrivacySetting({
success: res => {
if (!res.needAuthorization) {
this.$refs.privacyComponent.closePrivacy();
uni.showTabBar()
}
},
fail: () => {},
complete: () => {}
})
// #endif
if (uni.cache.get('token')) {
uni.setNavigationBarTitle({
title: uni.cache.get('user').nickname
})
this.init_fn();
// uni.setTabBarItem({
// index: 1,
// visible: false
// });
// uni.setTabBarItem({
// index:0,
// visible: true
// });
}
},
mounted() {
var query = uni.createSelectorQuery().in(this).select('.onecontent')
query.boundingClientRect(ele => {
var that = this;
uni.getSystemInfo({
success(res) {
that.height = (res.windowHeight - ele.height) + "px";
that = null;
}
})
}).exec();
},
methods: {
showpickersetTabBar(){
uni.switchTab({
url:'/pages/mall/index'
})
},
allowPrivacy() {
// 同意隐私协议触发事件,有些接口需要同意授权后才能执行,比如获取手机号授权接口,可以在同意隐私协议后,再执行授权获取手机号接口,如果不需要可以不添加该方法
uni.showTabBar()
console.log('同意隐私授权')
},
init_fn() {
this.list_ = {
list0: { //全部
data: [],
page: 1,
status: 'loading',
is_end: false,
},
list1: { //全部
data: [],
page: 1,
status: 'loading',
is_end: false,
},
list2: { //代付款
data: [],
page: 1,
status: 'loading',
is_end: false,
},
list3: { //待服务
data: [],
page: 1,
status: 'loadmore',
is_end: false,
}
}
for (let i = 0; i <= 3; i++) {
this.get_order_list(i);
}
},
async get_order_list(i) {
let page = null; //页数
let order_type = ''
switch (i) {
case 0:
order_type = 2;
page = this.list_.list0.page;
break;
case 1:
order_type = 3;
page = this.list_.list1.page;
break;
case 2:
order_type = 4;
page = this.list_.list2.page;
break;
case 3:
order_type = 5;
page = this.list_.list3.page;
break;
}
let resdata = await this.api.orderlist({
order_type: order_type,
page: page,
like: this.like
})
let res = resdata.data
// res.data.forEach(item=>{//计算待支付订单剩余时间
// if(item.order_type==0){
// item.timeDiff=(new Date(item.estimate_close_at).getTime() -new Date().getTime())/1000;
// }
// })
switch (order_type) {
case 2:
this.paging(res, this.list_.list0)
break;
case 3:
this.paging(res, this.list_.list1)
break;
case 4:
this.paging(res, this.list_.list2)
break;
case 5:
this.paging(res, this.list_.list3)
break;
}
uni.hideLoading();
},
paging(res, list) {
if (res.length == 0) {
list.status = 'nomore';
list.is_end = true;
return false;
} else {
list.status = 'loading';
list.page = list.page + 1;
setTimeout(() => {
list.data = [...list.data, ...res];
if (res.length != 10) {
list.is_end = true;
list.status = 'nomore';
} else {
list.status = 'loading';
}
}, 500)
}
this.$forceUpdate();
},
lower() {
switch (this.current) {
case 0:
this.onReachBottom_fn(this.list_.list0)
break;
case 1:
this.onReachBottom_fn(this.list_.list1)
break;
case 2:
this.onReachBottom_fn(this.list_.list2)
break;
case 3:
this.onReachBottom_fn(this.list_.list3)
break;
}
},
onReachBottom_fn(list) {
if (!list.is_end) {
this.get_order_list(this.current);
}
},
// tabs通知swiper切换
orderswitch(index) {
try {
switch (index) {
case 0:
if (this.list_list0.data.length < 10) {
this.form.status = 'nomore';
}
break;
case 1:
if (this.list_list1.data.length < 10) {
this.form.status = 'nomore';
}
break;
case 2:
if (this.list_.list2.data.length < 10) {
this.form.status = 'nomore';
}
break;
case 3:
if (this.list_.list3.data.length < 10) {
this.form.status = 'nomore';
}
break;
}
} catch (e) {
//TODO handle the exception
}
this.swiperCurrent = index;
},
// 由于swiper的内部机制问题快速切换swiper不会触发dx的连续变化需要在结束时重置状态 swiper滑动结束分别设置tabs和swiper的状态
animationfinish(e) {
let current = e.detail.current;
try {
switch (current) {
case 0:
if (this.list_list0.data.length < 10) {
this.form.status = 'nomore';
}
break;
case 1:
if (this.list_list1.data.length < 10) {
this.form.status = 'nomore';
}
break;
case 2:
if (this.list_.list2.data.length < 10) {
this.form.status = 'nomore';
}
break;
case 3:
if (this.list_.list3.data.length < 10) {
this.form.status = 'nomore';
}
break;
}
} catch (e) {
//TODO handle the exception
}
this.swiperCurrent = current;
this.current = current;
},
// clickoverlayshow(e) { //切换文字
// switch (e) {
// case 1:
// this.clickoverlayshowtext = '取消订单'
// break;
// case 2:
// this.clickoverlayshowtext = '删除订单'
// break;
// }
// this.overlayshow = true
// },
orderordercancel(item) { //取消订单
var this_ = this
uni.showModal({
content: '确定取消订单吗?',
confirmColor: '#f55850',
cancelColor: '#333333',
async success(resdata) {
if (resdata.confirm) {
let res = await this_.api.orderorderrefund({
order_id: item.order_id
})
if (res.code == 1) {
this_.init_fn()
}
}
}
})
},
async orderokprebook(item) {
let res = await this.api.orderokprebook({
order_id: item.order_id
})
if (res.code == 1) {
uni.showToast({
title: '确认成功',
icon: 'none'
});
setTimeout(() => {
this.init_fn()
}, 2000);
}
},
async orderrefuseprebook(e) {
let res = await this.api.orderrefuseprebook({
order_id: e.order_id,
refuse_str: ''
})
if (res.code == 1) {
uni.showToast({
title: '拒绝成功',
icon: 'none'
});
setTimeout(() => {
this.init_fn()
}, 2000);
}
},
orderordercancelrefund(item) { //取消订单去退款
uni.pro.navigateTo('my/order/refund', {
id: item.order_id
})
},
applylrefund(item) {
uni.pro.navigateTo('my/order/applylrefund', {
id: item.order_id
})
},
orderorderdelete(item) {
var this_ = this
if (item.pay_status == 0) {
uni.showModal({
content: '该笔订单还未付款,是否继续?',
confirmColor: '#f55850',
cancelColor: '#333333',
async success(resdata) {
if (resdata.confirm) {
let res = await this_.api.orderstartsercive({
order_id: item.order_id
})
if (res.code == 1) {
this_.init_fn()
}
}
}
})
} else {
uni.showModal({
content: '确定开始服务吗?',
confirmColor: '#f55850',
cancelColor: '#333333',
async success(resdata) {
if (resdata.confirm) {
let res = await this_.api.orderstartsercive({
order_id: item.order_id
})
if (res.code == 1) {
this_.init_fn()
}
}
}
})
}
},
async cancelOrder(item) { //取消订单
console.log(item)
// let res
// switch (this.clickoverlayshowtext) {
// case '取消订单':
// if (item.status == 0) {
// res = await this.api.orderordercancel({
// order_id: item.order_id
// })
// } else {
// uni.pro.navigateTo('my/order/orderInfo', {
// id: e,
// e: e
// })
// }
// break;
// case '删除订单':
// res = await this.api.orderorderdelete({
// order_id: item.order_id
// })
// break;
// }
// this.overlayshow = false
// this.init_fn()
},
eeInfo(e) { //查看订单详情
uni.pro.navigateTo('order/orderInfo', {
id: e.order_id
})
},
}
}
</script>
<style lang="scss">
page {
background: #F9F9F9;
}
.content {
.onecontent {
width: 100%;
background: #FFFFFF;
padding: 10rpx 28rpx;
.flex-start {
flex-wrap: nowrap;
.onecontent_oen {
margin: 0 auto;
flex: auto;
height: 70rpx;
border-radius: 14rpx;
border: 2rpx solid #6699FF;
padding-right: 8rpx;
.onecontent_oen_input {
padding-left: 32rpx;
flex: 1;
}
.onecontent_oen_text {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #FFFFFF;
text-align: center;
line-height: 56rpx;
width: 80rpx;
height: 56rpx;
background: #6699FF;
border-radius: 14rpx;
}
}
.onecontent_oen_right {
margin-left: 26rpx;
.onecontent_oen_rightimage {
width: 17.9rpx;
height: 19.34rpx;
}
.onecontent_oen_rightimageview {
text-align: center;
width: 140rpx;
margin-left: 10rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
}
}
}
.onecontent_tow {
padding: 32rpx 0 32rpx 0;
width: 100%;
.onecontent_tow_item {
position: relative;
.onecontent_tow_itemtexts {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.onecontent_tow_itemtext {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
}
.onecontent_tow_itemtexts::after {
content: '';
position: absolute;
bottom: -10rpx;
left: 50%;
transform: translateX(-50%);
width: 19.33rpx;
height: 6.66rpx;
background: url(https://ointmentweapp.oss-cn-beijing.aliyuncs.com/image/my/order/order1.png) no-repeat;
background-size: 100% 100%;
}
}
}
}
.towcontent {
padding: 0 28rpx;
.flex-colum_image {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
text {
margin-top: 30rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #666666;
}
}
.towcontentitem {
margin-top: 32rpx;
padding: 24rpx;
width: 100%;
background: #FFFFFF;
border-radius: 12rpx;
.towcontentitemone {
width: 100%;
padding-bottom: 16rpx;
border-bottom: 1px solid #F6F6F6;
.towcontentitemone_one {
font-size: 28rpx;
width: 60%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.towcontentitemone_tow {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
.towcontentitemone_towimage {
margin-right: 10rpx;
width: 24rpx;
height: 24rpx;
}
}
}
.towcontentitemtow {
position: relative;
padding: 22rpx 0;
border-bottom: 1px solid #F6F6F6;
.towcontentitemtow_imge {
width: 144rpx;
height: 144rpx;
background: #666666;
border-radius: 12rpx;
}
.towcontentitemtow_one {
margin-left: 32rpx;
width: 70%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
position: relative;
.towcontentitemtow_one_one {
width: 50%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
}
.towcontentitemtow_one_there {
position: absolute;
top: 0;
right: 0;
font-size: 20rpx;
font-family: Roboto-Bold, Roboto;
font-weight: 500;
color: #666;
}
.towcontentitemtow_one_tow {
margin-top: 24rpx;
font-size: 40rpx;
font-family: Roboto-Bold, Roboto;
font-weight: bold;
color: #FC5F69;
}
}
.towcontentitemtow_tow {
position: absolute;
bottom: 32rpx;
right: 0;
font-size: 28rpx;
font-family: Roboto-Regular, Roboto;
font-weight: 400;
color: #999999;
}
}
.towcontentitemthere {
width: 100%;
margin-top: 16rpx;
display: flex;
justify-content: flex-end;
align-items: center;
flex-wrap: wrap;
.towcontentitemthereitem {
margin-left: 24rpx;
padding: 8rpx 32rpx;
font-size: 28rpx;
border-radius: 28rpx;
}
.towcontentitemthereitem_one {
background: linear-gradient(101deg, #FA8E5D 0%, #F45E4D 100%);
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
}
.towcontentitemthereitem_tow {
background: #F6F6F6;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #999999;
}
.towcontentitemthereitem_there {
background: linear-gradient(303deg, #9FC9FF 0%, #6699FF 100%);
font-family: SourceHanSansCN-Regular, SourceHanSansCN;
font-weight: 400;
color: #FFFFFF;
}
}
}
}
.warp {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
.rect {
padding: 40rpx 68rpx;
width: 480rpx;
background: #FFFFFF;
border-radius: 42rpx;
.rectone {
font-size: 32rpx;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.recttow {
width: 100%;
margin-top: 32rpx;
.recttow_one {
padding: 8rpx 40rpx;
background: #FFFFFF;
border-radius: 26rpx;
border: 2rpx solid #999999;
font-size: 28rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.recttow_tow {
padding: 8rpx 40rpx;
background: #333333;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
border-radius: 26rpx;
}
}
}
}
}
</style>

610
pages/order/orderInfo.vue Normal file
View File

@@ -0,0 +1,610 @@
<template>
<view class="index">
<!-- <view class="onecontent">
<view class="onecontentone">
<text v-if="datalist.status == 0">待支付</text>
<text v-if="datalist.status == 1">已支付</text>
<text v-if="datalist.status == 2">等待确认</text>
<text v-if="datalist.status == 3">已确认</text>
<text v-if="datalist.status == 4">已完成 </text>
<text v-if="datalist.status == 5">已取消</text>
<text v-if="datalist.status == 6">退款中</text>
<text v-if="datalist.status == 7">已退款</text>
</view>
<view class="onecontenttow">
感谢您的支持欢迎再次光临
</view>
<view class="onecontentthere flex-between">
<view class="onecontentthere_one" v-if="datalist.status == 5 || datalist.status == 4 "
@click="orderorderdelete(datalist)">
删除订单
</view>
<view class="onecontentthere_tow"
v-if="datalist.status == 1 || datalist.status == 2 ||datalist.status == 3"
@click="orderordercancelrefund(datalist)">
申请退款
</view>
</view>
</view> -->
<view class="towcontent">
<view class="towcontentone flex-between">
<view class="towcontentone_one flex-start">
<u-icon name="home" color="#ffffff" size="20"></u-icon>
<text class="towcontentone_one_text">{{datalist.store_title}}</text>
</view>
<u-icon @click="phonefill(datalist.store_mobile)" name="phone-fill" color="#ffffff" size="20"></u-icon>
</view>
<view class="towcontenttow flex-start" @click="detailsInfo(datalist.store_service_id)">
<image class="towcontenttow_image" :src="datalist.store_avatar" mode=""></image>
<view class="towcontenttowone flex-colum-start">
<view class="towcontenttowone_one">
{{datalist.title}}
</view>
<view class="towcontenttowone_tow flex-start">
<view class="towcontenttowone_tow_one flex-start">
<u-icon name="checkmark-circle" color="#999999" size="14"></u-icon>
随时退
</view>
<view class="towcontenttowone_tow_one flex-start">
<u-icon name="checkmark-circle" color="#999999" size="14"></u-icon>
过期退
</view>
</view>
<view class="towcontenttowone_there">
¥{{datalist.total_price}}
</view>
</view>
</view>
<!--<view class="towcontentthere flex-between">
<text class="towcontentthere_text"></text>
</view>
<view class="qr-box flex-colum" @longpress="save()">
<canvas canvas-id="qrcode" style="width:288rpx;" />
</view>
<view class="towcontenttfour flex-colum">
123 2345 567
</view> -->
<!-- <view class="towcontenttfive flex-between">
<view class="towcontenttfive_one flex-start">
<view class="towcontenttfive_oneone">
退款:
</view>
<view class="towcontenttfive_onetow">
08-22 23:59:59到期
</view>
</view>
<view class="towcontenttfive_tow">
申请退款
</view>
</view> -->
</view>
<view class="therecontent">
<view class="therecontentone">
订单信息
</view>
<view class="therecontentow entowakst">
服务人员<text>{{datalist.people ||'无'}}</text>
</view>
<view class="therecontentow entowakst">
预约时间<text>{{datalist.time ||'无'}}</text>
</view>
<view class="therecontentow entowakst">
实付金额<text>{{datalist.money}}</text>
</view>
<view class="therecontentthere entowakst">
购买数量{{datalist.number}}
</view>
<view class="therecontenfour entowakst">
手机号码{{datalist.mobile.replace(/(\d{3})\d{4}(\d{4})/,'$1****$2') || '-'}}
</view>
<view class="therecontentfive flex-start entowakst">
订单编号{{datalist.out_trade_no}}
<text class="therecontentfive_box" @click="copy(datalist.out_trade_no)">复制</text>
</view>
<view class="therecontentsix entowakst">
下单时间{{datalist.createtime}}
</view>
</view>
<view class="fourcontent">
<view class="fourcontentone">
购买须知
</view>
<view v-html="datalist.details">
</view>
<!-- <view class="entowakst" v-html="datalist.details">
·预约须知请您提前1小时预约
</view> -->
</view>
<!-- <view class="fivecontent">
<view class="fivecontentone">
用户评价
</view>
<view class="fivecontenttow flex-between">
<view class="fivecontenttow_one flex-start">
<text class="fivecontenttow_text">综合评分</text>
<u-rate :count="5" value="4" active-color="#f1cb66" inactive-color="#F1CB66"></u-rate>
</view>
<view class="fivecontenttow_tow">
满意
</view>
</view>
</view> -->
</view>
</template>
<script>
// import uQRCode from '@/common/js/uqrCode.js'
export default {
data() {
return {
datalist: {},
imgCode: '', // 后续保存到手机相册所需要用到的字段}
form: {
phone: '18092171236'
}
}
},
async onLoad(e) {
try {
let res = await this.api.orderorderdetail({
order_id: e.id
})
if (res) {
this.datalist = res.data
this.datalist.details = res.data.details.replace(/\<img/g,
'<img style="max-width:100%;height:auto" ');
}
} catch (e) {}
// this.generate()
},
methods: {
orderorderdelete(item) { //删除订单
uni.showModal({
content: '确定删除订单吗?',
confirmColor: '#f55850',
cancelColor: '#333333',
async success(resdata) {
if (resdata.confirm) {
await this.api.orderorderdelete({
order_id: item.order_id
})
uni.navigateBack()
}
}
})
},
orderordercancelrefund(item) { //取消订单去退款
console.log(item)
uni.pro.navigateTo('my/order/refund', {
id: item.order_id
})
},
// 生成二维码事件
generate(e) {
uQRCode.make({
canvasId: 'qrcode',
componentInstance: this,
text: "https://ky.sxczgkj.cn/wap/merchant/authPay?userAppId=244", // 想生成二维码到内容
size: 150,
margin: 0,
backgroundColor: '#ffffff',
foregroundColor: '#000000',
fileType: 'jpg',
errorCorrectLevel: uQRCode.errorCorrectLevel.H,
success: res => {
this.imgCode = res // base64的图片格式
}
})
},
// 保存到手机
save() {
uni.getSetting({ //获取用户的当前设置
success: (res) => {
if (res.authSetting['scope.writePhotosAlbum']) { //验证用户是否授权可以访问相册
this.aveImageToPhotosAlbum();
} else {
uni.authorize({ //如果没有授权,向用户发起请求
scope: 'scope.writePhotosAlbum',
success: () => {
this.aveImageToPhotosAlbum();
},
fail: () => {
// 提示
uni.showToast({
title: "请打开保存相册权限,再点击保存到手机",
icon: "none",
duration: 3000
});
setTimeout(() => {
uni.openSetting({ //调起客户端小程序设置界面,让用户开启访问相册
success: (res2) => {
// console.log(res2.authSetting)
}
});
}, 3000);
}
})
}
}
})
},
copy(value) {
//提示模板
uni.setClipboardData({
data: value, //要被复制的内容
success: () => { //复制成功的回调函数
uni.showToast({
title: '复制成功'
})
}
});
},
detailsInfo(e) { //查看订单详情
uni.pro.navigateTo('my/order/cporderinfo', {
id: e,
})
},
phonefill(value) {
uni.makePhoneCall({
phoneNumber: value //仅为示例
});
},
aveImageToPhotosAlbum() {
let base64 = this.imgCode.replace(/^data:image\/\w+;base64,/, ""); //去掉data:image/png;base64,
let filePath = wx.env.USER_DATA_PATH + '/ph_fit_qrcode.png'; // 路径文件名
uni.showLoading({
title: '加载中',
mask: true
})
uni.getFileSystemManager().writeFile({ // 获取全局唯一的文件管理器
filePath: filePath, //创建一个临时文件名
data: base64, //写入的文本或二进制数据
encoding: 'base64', //写入当前文件的字符编码
success: res => {
uni.saveImageToPhotosAlbum({ // 保存图片到系统相册
filePath: filePath,
success: function(res2) {
uni.hideLoading();
uni.showToast({
title: '保存成功',
icon: "none",
duration: 5000
})
},
fail: function(err) {
uni.hideLoading();
// console.log(err.errMsg);
}
})
},
fail: err => {
uni.hideLoading();
//console.log(err)
}
})
},
}
}
</script>
<style lang="scss">
page {
background: #F6F6F6;
}
.index {
padding: 32rpx 28rpx;
.onecontent {
width: 100%;
padding: 32rpx;
background: #FFFFFF;
border-radius: 12rpx;
.onecontentone {
font-size: 32rpx;
font-family: SourceHanSansCN-Medium-, SourceHanSansCN-Medium;
font-weight: normal;
color: #333333;
}
.onecontenttow {
margin-top: 16rpx;
font-size: 24rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #666666;
}
.onecontentthere {
margin-top: 24rpx;
.onecontentthere_one {
background: #333333;
border-radius: 8rpx;
padding: 16rpx 94rpx;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
}
.onecontentthere_tow {
background: #F7F7F7;
border-radius: 8rpx;
padding: 16rpx 94rpx;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #333333;
}
}
}
.towcontent {
margin-top: 24rpx;
width: 100%;
background: #FFFFFF;
border-radius: 18rpx;
.towcontentone {
position: relative;
padding: 16rpx 32rpx;
border-radius: 18rpx 18rpx 0 0;
background: #9397c1;
.towcontentone_one {
width: 80%;
.towcontentone_one_image {
width: 33.04rpx;
height: 29.79rpx;
}
.towcontentone_one_text {
width: 80%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-left: 10rpx;
font-size: 28rpx;
font-family: SourceHanSansCN-Bold-, SourceHanSansCN-Bold;
font-weight: normal;
color: #FFFFFF;
}
}
.towcontentone_one::after {
z-index: 10;
position: absolute;
bottom: -22rpx;
content: '';
display: inline-block;
left: 50%;
transform: translateX(-50%);
width: 44rpx;
height: 44rpx;
border-radius: 0 0 22rpx 22rpx;
background: #9397c1;
}
}
.towcontenttow {
padding: 32rpx;
width: 100%;
background: #fff;
.towcontenttow_image {
width: 128rpx;
height: 128rpx;
}
.towcontenttowone {
height: 128rpx;
margin-left: 36rpx;
justify-content: space-around;
.towcontenttowone_one {
font-size: 28rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #333333;
}
.towcontenttowone_tow {
.towcontenttowone_tow_one {
font-size: 24rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #999999;
}
}
.towcontenttowone_there {
font-size: 32rpx;
font-family: SourceHanSansCN-Bold-, SourceHanSansCN-Bold;
font-weight: normal;
color: #333333;
}
}
}
.towcontentthere {
position: relative;
height: 44rpx;
width: 100%;
.towcontentthere_text {
width: 100%;
height: 0px;
border: 1rpx dashed #EAEAEA;
}
.towcontentthere_text::after {
z-index: 10;
position: absolute;
content: '';
display: inline-block;
left: 0;
top: 0;
width: 22rpx;
height: 44rpx;
border-radius: 0 44rpx 44rpx 0;
background: #f6f6f6;
}
.towcontentthere_text::before {
z-index: 10;
position: absolute;
content: '';
display: inline-block;
right: 0;
top: 0;
width: 22rpx;
height: 44rpx;
border-radius: 44rpx 0 0 44rpx;
background: #f6f6f6;
}
}
.towcontenttfour {
margin-top: 16rpx;
font-size: 32rpx;
font-family: SourceHanSansCN-Bold-, SourceHanSansCN-Bold;
font-weight: normal;
color: #333333;
}
.towcontenttfive {
padding: 32rpx;
width: 100%;
.towcontenttfive_one {
font-size: 32rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #333333;
}
.towcontenttfive_onetow {
margin-left: 16rpx;
font-size: 24rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #666666;
}
.towcontenttfive_tow {
padding: 10rpx 16rpx;
background: #FFFFFF;
border-radius: 8rpx;
border: 2rpx solid #D5D5D5;
}
}
}
.therecontent {
margin-top: 24rpx;
padding: 32rpx;
width: 100%;
background: #FFFFFF;
border-radius: 18rpx;
.therecontentone {
font-size: 28rpx;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.entowakst {
font-size: 28rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #333333;
}
.therecontentfive_box {
padding: 6rpx 10rpx;
font-size: 20rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #666666;
background: #FFFFFF;
margin-left: 6rpx;
border-radius: 8rpx;
border: 2rpx solid #D5D5D5;
}
}
.fourcontent {
margin-top: 24rpx;
padding: 32rpx;
width: 100%;
background: #FFFFFF;
border-radius: 18rpx;
.fourcontentone {
font-size: 28rpx;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.fourcontentone::after {
content: '';
display: inline-block;
width: 100%;
height: 1rpx;
border: 1px solid #F7F7F7;
}
.entowakst {
font-size: 24rpx;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #666666;
}
}
.fivecontent {
margin-top: 24rpx;
padding: 32rpx;
width: 100%;
background: #FFFFFF;
border-radius: 18rpx;
.fivecontentone {
font-size: 28rpx;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.fivecontenttow {
margin-top: 16rpx;
.fivecontenttow_one {
.fivecontenttow_text {
padding-right: 24rpx;
font-size: 28rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #333333;
}
}
.fivecontenttow_tow {
font-size: 24rpx;
font-family: SourceHanSansCN-Regular-, SourceHanSansCN-Regular;
font-weight: normal;
color: #666666;
}
}
}
}
</style>

520
pages/order/paybill.vue Normal file
View File

@@ -0,0 +1,520 @@
<template>
<view class="container">
<view class="card">
<view class="info-wrap">
<image class="cover" :src="shopInfo.portrait" mode="aspectFill"></image>
<text class="t">{{ shopInfo.userName }}</text>
</view>
<view class="input-wrap">
<view class="input-cont">
<text class="i"></text>
<text class="num">{{ num }}</text>
</view>
<view class="tips"><input class="input" type="text" :maxlength="10" placeholder="添加付款备注最多10个字"
v-model="remark" /></view>
</view>
</view>
<view class="card">
<view class="title"><text>支付方式</text></view>
<view class="pay-list">
<view class="item">
<view class="label">
<image class="icon" src="@/static/4.png" mode="aspectFit"></image>
<text class="t">微信支付</text>
</view>
<uni-icons type="checkbox-filled" size="18" color="#54A347"></uni-icons>
</view>
</view>
<view class="num-wrap">
<text>实付</text>
<text class="t b">{{ num || 0 }}</text>
</view>
</view>
<view class="number-key-wrap">
<view class="number-key">
<view class="left">
<view class="num-list">
<view class="item" v-for="item in 9" :key="item" hover-class="active" hover-stay-time="50"
@click="numHandle(`${item + 1}`)">
<text>{{ item + 1 }}</text>
</view>
</view>
<view class="num-foot">
<view class="item" hover-class="active" hover-stay-time="50" @click="numHandle('0')">
<text>0</text>
</view>
<view class="item" hover-class="active" hover-stay-time="50" @click="numHandle('.')">
<text>.</text>
</view>
</view>
</view>
<view class="right">
<view class="item" hover-class="active" hover-stay-time="50" @click="delHandle" @longpress="longDel"
@touchend="endLongDel">
x
<!-- <uni-icons type="arrow-left" size="24"></uni-icons> -->
</view>
<view class="item confirm" hover-class="active" hover-stay-time="50" @click="submitHandle">
<text>付款</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
userAppId: '', // 用户id
shopInfo: '', // 商户信息
num: '', // 输入金额
// maxNum: 200,
remark: '', // 备注
timer: null,
orderNumber: '',
type: 1,
appid:''
};
},
onLoad(e) {
console.log(e, '111')
uni.request({
url: `https://ky.sxczgkj.cn/api/payConfig/appconfig`,
method: 'get',
header: {
'content-type': 'application/json'
},
success: (res) => {
if (res.data.code == 200) {
this.appid = res.data.data.appid
} else {
uni.showToast({
icon: 'none',
title: res.data.message
});
}
},
fail: (err) => {
uni.showToast({
icon: 'none',
title: '失败'
});
}
});
// #ifdef MP-WEIXIN
uni.login({
provider: 'weixin',
success: async (data) => {
try {
let res = await this.api.usergetopenid({
code: data.code
})
if (res) {
uni.cache.set('openId',res.data.openid);
}
} catch (e) {
console.log(e)
}
}
});
// #endif
if (e.orderNumber) {
this.orderNumber = e.orderNumber;
}
if (e.q) {
let urlStr = decodeURIComponent(e.q);
if (this.getQueryString(urlStr, 'userAppId')) {
this.type = 1;
this.userAppId = this.getQueryString(urlStr, 'userAppId')
} else {
this.type = 2;
this.userAppId = urlStr.match('[^/]+(?!.*/)')[0]
}
console.log(this.userAppId, 'this.userAppId')
this.getShopInfo();
}
},
methods: {
// 付款
async submitHandle() {
try {
if (!this.num) {
uni.showToast({
title: '请输入支付金额',
icon: 'none'
});
} else {
uni.showLoading({
title: '支付中...',
mask: true
});
uni.login({
provider: 'weixin',
success: async (resdata) => {
let res = await this.requestHandle('/applet-pay/java-pay', {
store_id: this.shopInfo.store_id, // 商户id
pay_type: '1',
money: this.num, // 金额
remark: this.remark, // 备注
code: resdata.code,
appid:this.appid
});
uni.requestPayment({
provider: 'wxpay',
timeStamp: res.data.payTimeStamp,
nonceStr: res.data.paynonceStr,
package: res.data.payPackage,
signType: res.data.paySignType,
paySign: res.data.paySign,
success: (res) => {
uni.hideLoading();
uni.showModal({
title: '注意',
content: `成功支付${this.num}`,
showCancel: false,
success: (res) => {
if (res.confirm) {
// uni.reLaunch({
// url: '/pages/index/index'
// });
uni.exitMiniProgram({
success: () => {
console.log('退出小程序成功');
},
fail: function(
err) {
console.log('退出小程序失败',err);
}
})
}
}
});
},
fail: (err) => {
uni.hideLoading();
uni.showToast({
title: '支付失败',
icon: 'none'
});
}
});
}
});
}
} catch (e) {
uni.showToast({
title: '支付失败:' + JSON.stringify(e),
icon: 'none'
});
}
},
// 删除
delHandle() {
uni.vibrateShort();
this.num = this.num.slice(0, -1);
},
// 长按删除
longDel() {
this.timer = setInterval(() => {
this.delHandle();
}, 100);
},
// 结束长按删除
endLongDel() {
clearInterval(this.timer);
this.timer = null;
},
// 输入
numHandle(num) {
uni.vibrateShort();
this.num = this.clearNoNum({
value: (this.num += num)
});
},
// 封装请求
requestHandle(url = '', data = {}, method = 'post') {
return new Promise((resolve, reject) => {
uni.request({
url: `${'https://kysh.sxczgkj.cn'}/javaApi${url}`,
method: method,
header: {
uniacid: '1',
module: 'yb_o2ov2',
appType: 'mini'
// userId:uni.getStorageSync('userId')
},
data: data,
success: (res) => {
if (res.data.code == 1) {
resolve(res.data);
} else {
uni.showToast({
icon: 'none',
title: res.data.msg
});
reject(res.data.msg);
}
},
fail: (err) => {
reject(JSON.stringify(err));
}
});
});
},
// 获取商户信息
async getShopInfo() {
try {
const res = await this.requestHandle('/applet-pay/get-applet-store-info', {
code_id: this.userAppId,
type: this.type
});
this.shopInfo = res.data;
} catch (e) {}
},
// 获取url参数
getQueryString(url, name) {
var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i');
var r = url.substr(1).match(reg);
if (r != null) {
return r[2];
}
return null;
},
/**
* 去除字符串中除了数字和点以外的其他字符
* @param {Object} obj
*/
clearNoNum(obj) {
//如果用户第一位输入的是小数点,则重置输入框内容
if (obj.value != '' && obj.value.substr(0, 1) == '.') {
obj.value = '';
}
obj.value = obj.value.replace(/^0*(0\.|[1-9])/, '$1'); //粘贴不生效
obj.value = obj.value.replace(/[^\d.]/g, ''); //清除“数字”和“.”以外的字符
obj.value = obj.value.replace(/\.{2,}/g, '.'); //只保留第一个. 清除多余的
obj.value = obj.value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3'); //只能输入两个小数
if (obj.value.indexOf('.') < 0 && obj.value != '') {
//以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额
if (obj.value.substr(0, 1) == '0' && obj.value.length == 2) {
obj.value = obj.value.substr(1, obj.value.length);
}
}
return obj.value;
}
}
};
</script>
<style scoped lang="scss">
.container {
padding: 28upx;
padding-bottom: 640upx;
}
.card {
padding: 28upx;
border-radius: 28upx;
background-color: #fff;
margin-bottom: 28upx;
.title {
font-size: 32upx;
}
}
.info-wrap {
display: flex;
align-items: center;
.cover {
$size: 80upx;
width: $size;
height: $size;
border-radius: 50%;
margin-right: 20upx;
background-color: #efefef;
}
.t {
font-size: 32upx;
}
}
.input-wrap {
padding: 28upx 0 0;
.input-cont {
display: flex;
align-items: center;
border-bottom: 1upx solid #ececec;
.i {
font-size: 42upx;
font-weight: bold;
margin-right: 12upx;
position: relative;
top: -4upx;
}
.num {
font-size: 48upx;
height: 80upx;
font-weight: bold;
position: relative;
padding-right: 14upx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
&::after {
content: '';
width: 4upx;
height: 40upx;
background-color: #333;
position: absolute;
top: 50%;
margin-top: -24upx;
right: 0;
animation: ani 0.8s ease-in-out 1.4s infinite;
}
@keyframes ani {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
}
}
.tips {
display: flex;
padding-top: 24upx;
.input {
flex: 1;
}
}
}
.pay-list {
.item {
display: flex;
justify-content: space-between;
padding: 28upx 0;
.label {
display: flex;
align-items: center;
.icon {
$size: 60upx;
width: $size;
height: $size;
margin-right: 20upx;
}
.t {
font-size: 28upx;
}
}
}
}
.num-wrap {
display: flex;
align-items: center;
justify-content: flex-end;
.t {
font-size: 32upx;
}
.b {
font-weight: bold;
}
}
.number-key-wrap {
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background-color: #efefef;
z-index: 999;
padding: 28upx 28upx calc(env(safe-area-inset-bottom) + 28upx);
border-radius: 28upx 28upx 0 0;
$gap: 12upx;
$radius: 14upx;
$itemH: 120upx;
.number-key {
display: flex;
.item {
display: flex;
font-size: 48upx;
font-weight: bold;
align-items: center;
justify-content: center;
border-radius: $radius;
background-color: #fff;
&.active {
background-color: #d9d9d9;
}
}
.left {
flex: 1;
.num-list {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: $itemH $itemH $itemH;
grid-gap: $gap;
}
.num-foot {
padding-top: $gap;
display: grid;
grid-gap: $gap;
grid-template-columns: 2fr 1fr;
grid-template-rows: $itemH;
}
}
.right {
width: 160upx;
display: flex;
flex-direction: column;
margin-left: $gap;
.item {
flex: 1;
&:last-child {
margin-top: $gap;
font-size: 32upx;
}
&.confirm {
background-color: #ffcc17;
&.active {
background-color: #e1b516;
}
}
}
}
}
}
</style>