会员列表,详情,充值,订单列表

This commit is contained in:
wwz 2025-03-01 14:38:02 +08:00
parent 0ab9235f6c
commit 04a84aa17f
33 changed files with 5665 additions and 982 deletions

View File

@ -19,12 +19,3 @@ export const APIhome = (data) => {
})
}
///商户登录后 shopId和autokey
export const APIshopExtend = (data) => {
return request({
url: url + '/common/shopExtend',
method: 'post',
data: data,
toast: false
})
}

71
common/api/member.js Normal file
View File

@ -0,0 +1,71 @@
// 引入 request 文件
import request from '@/common/api/request.js'
const urlAccount = '/account'
const urlProduct = '/product'
const urlOrder = '/order'
//桌码换取详细店铺信息
export const APIproductqueryShop = (data) => {
return request({
url: urlAccount + '/user/shopInfo',
method: 'get',
data: data
})
}
// 获取登录用户店铺会员信息
export const APIshopUserInfo = (data) => {
return request({
url: urlAccount + '/user/shopUser',
method: 'get',
data: data,
toast: false
})
}
// 获取动态会员码 3分钟内可用
export const APIusershopUsercode = (data) => {
return request({
url: urlAccount + '/user/shopUser/code',
method: 'get',
data: data
})
}
// 获取当前用户所有店铺会员信息 列表
export const APIusershopUservipCard = (data) => {
return request({
url: urlAccount + '/user/shopUser/vipCard',
method: 'get',
data: data
})
}
// 获取店铺详细信息
export const APIusershopInfodetail = (data) => {
return request({
url: urlAccount + '/user/shopInfo/detail',
method: 'get',
data: data
})
}
//桌码换取详细店铺信息
export const APIcouponfindByUserId = (data) => {
return request({
url: urlAccount + '/user/coupon/findByUserId',
method: 'get',
data: data
})
}
//桌码换取详细店铺信息
export const APIuseractivate = (data) => {
return request({
url: urlAccount + '/user/activate',
method: 'get',
data: data
})
}

View File

@ -5,7 +5,7 @@ const url = '/order'
export const APIuserorder = (data) => {
return request({
url: url + '/user/order',
method: 'post',
method: 'get',
data: data
})
}

23
common/api/pay.js Normal file
View File

@ -0,0 +1,23 @@
// 引入 request 文件
import request from '@/common/api/request.js'
const urlAccount = '/account'
const urlProduct = '/product'
const urlOrder = '/order'
// 小程序会员充值支付
export const APIpayltPayVip = (data) => {
return request({
url: urlOrder + '/pay/ltPayVip',
method: 'post',
data: data
})
}
// 小程序支付
export const APIpayltPayOrder = (data) => {
return request({
url: urlOrder + '/pay/ltPayOrder',
method: 'post',
data: data
})
}

View File

@ -3,24 +3,6 @@ import request from '@/common/api/request.js'
const urlAccount = '/account'
const urlProduct = '/product'
const urlOrder = '/order'
//桌码换取详细店铺信息
export const APIproductqueryShop = (data) => {
return request({
url: urlAccount + '/user/shopInfo',
method: 'get',
data: data
})
}
// 获取登录用户店铺会员信息
export const APIshopUserInfo = (data) => {
return request({
url: urlAccount + '/user/shopUser',
method: 'get',
data: data,
toast: false
})
}
//获取商品列表数据
export const APIproductqueryProduct = (data) => {

View File

@ -8,16 +8,16 @@ export default (params) => {
version: uni.conf.version,
type: uni.getSystemInfoSync().platform,
// #ifdef APP-PLUS
environment: 'app',
platformType: 'APP',
// #endif
// #ifdef H5
environment: 'H5',
platformType: 'H5',
// #endif
// #ifdef MP-WEIXIN
environment: 'wx',
platformType: 'WX',
// #endif
// #ifdef MP-ALIPAY
environment: 'alipay',
platformType: 'ALI',
// #endif
token: uni.cache.get('token') || '',
id: uni.cache.get('userInfo').id || '',

View File

@ -41,6 +41,12 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/product/choosetable",
"style": {
"navigationBarTitleText": "选择人数"
}
},
{
"path": "pages/order/index",
"style": {
@ -59,6 +65,48 @@
"allowsBounceVertical": "NO"
}
}
},
{
"path": "pages/user/member/index",
"style": {
"navigationBarTitleText": "会员充值"
}
},
{
"path": "pages/user/member/list",
"style": {
"navigationBarTitleText": "会员列表"
}
},
{
"path": "pages/user/member/memberdetails",
"style": {
"navigationBarTitleText": "会员卡"
}
},
{
"path": "pages/user/member/billDetails",
"style": {
"navigationBarTitleText": "账单明细"
}
},
{
"path": "pages/user/member/qrcode",
"style": {
"navigationBarTitleText": "会员支付码"
}
},
{
"path": "pages/user/myself",
"style": {
"navigationBarTitleText": "个人资料"
}
},
{
"path": "pages/user/coupon",
"style": {
"navigationBarTitleText": "优惠卷"
}
}
],
"uniIdRouter": {},

View File

@ -165,7 +165,7 @@
} from "@/common/api/index/index.js"
import {
APIshopUserInfo
} from "@/common/api/product/product.js"
} from "@/common/api/member.js"
import {
useNavbarStore
} from '@/stores/navbarStore';
@ -344,10 +344,7 @@
await proxy.$onLaunched;
if (uni.cache.get('shopId') && uni.cache.get('token')) {
showindex.value = 'shopIndex'
let res = await APIshopUserInfo({
"shopId": uni.cache.get('shopId'),
"userId": uni.getStorageSync('userInfo').id,
})
let res = await APIshopUserInfo()
if (res) {
//
uni.cache.set('ShopUser', res)

View File

@ -10,7 +10,7 @@
<text class="contentboxitemlefttexttow">在线点不排队</text>
</view>
<view class="contentboxitemright">
<view class="contentboxitemright_item flex-between" @click="memberindex('member/memberdetails')">
<view class="contentboxitemright_item flex-between" @click="memberindex('user/member/memberdetails')">
<image src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/indexs/Xvip.png" mode="aspectFill">
</image>
<view class="contentboxitemright_itembox flex-colum">
@ -18,7 +18,7 @@
<text>入会享权益</text>
</view>
</view>
<view class="contentboxitemright_item flex-between" @click="memberindex('member/index')">
<view class="contentboxitemright_item flex-between" @click="memberindex('user/member/index')">
<image src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/indexs/Xchong.png"
mode="aspectFill"></image>
<view class="contentboxitemright_itembox flex-colum">
@ -38,26 +38,10 @@
onMounted,
reactive,
} from "vue";
import {
APIshopExtend
} from "@/common/api/index/index.js";
import {
productStore
} from '@/stores/user.js';
const shopExtend = reactive({
autokey: "index_bg",
createTime: "2024-08-27T06:59:35.000+00:00",
id: 17,
name: "首页",
shopId: 29,
type: "img",
updateTime: null,
value: ""
})
const userInfo = uni.cache.get('userInfo')
const shopUserInfo = uni.cache.get('ShopUser')
const shopExtend = uni.cache.get('shopTable').shopExtendMap.index_bg
const scanCodehandle = async (i) => {
const store = productStore();
await store.scanCodeactions()
@ -76,13 +60,6 @@
}
return null;
}
onMounted(async () => {
let res = await APIshopExtend({
shopId: uni.cache.get('shopId'),
autokey: "index_bg" //index_bg my_bg member_bg shopInfo_bg
})
Object.assign(shopExtend, res)
})
</script>
<style scoped lang="scss">

View File

@ -13,13 +13,13 @@
</view> -->
<up-sticky>
<view class="tab-wrap">
<view class="item" :class="{'active':active == index}" v-for="(item, index) in tabs" :key="index"
@click="orderswitch(item,index)">
<view class="item" :class="{'active':orderForm.active == index}" v-for="(item, index) in tabs"
:key="index" @click="orderswitch(item,index)">
<text>{{ item.name }}</text>
</view>
</view>
</up-sticky>
<view class="list-wrap" v-if="!is_end">
<view class="list-wrap" v-if="!orderForm.is_end">
<view class="item" v-for="(item,index) in orderForm.list" :key="index" @click="orderinfo(item)">
<view class="header-wrap">
<view class="header-wrap-left">
@ -110,13 +110,15 @@
<button v-if="item.status=='unpaid'" type="primary" class="buttonStyle">去付款</button>
</view>
</view>
<image style="width: 402rpx;height: 442rpx;margin:240rpx auto 32rpx;"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/nomore.png" v-if="list.length <= 0 "
mode="aspectFill"></image>
<u-modal width="450rpx" :show="removeOrderShow" @confirm="$u.debounce(removeOrder(),1000)"
@cancel="removeOrderShow = false" @close="removeOrderShow = false" :showCancelButton="true"
:closeOnClickOverlay="true" :title="'是否删除当前订单'"></u-modal>-->
<u-loadmore :status="form.status" fontSize="14" color="#999" iconSize="14" />
<view v-if="orderForm.list.length <= 0" style="text-align: center;">
<image style="width: 402rpx;height: 442rpx;margin:240rpx auto 32rpx;"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/nomore.png" mode="aspectFill"></image>
</view>
<up-loadmore :status="orderForm.form.status" fontSize="14" color="#999" iconSize="14" />
</view>
</view>
</template>
@ -146,29 +148,19 @@
//
const tabs = [{
name: '全部',
type: 1,
status: ''
},
{
name: '待支付',
type: 2,
status: 'unpaid'
status: 'in-production'
},
{
name: '待发货',
type: 3,
status: 'unsend'
},
{
name: '已完成',
type: 4,
status: 'closed'
name: '订单完成',
status: 'refunding'
},
{
name: '退款/售后',
type: 5,
status: 'refund'
name: '取消订单',
status: 'cancelled'
},
]
@ -178,32 +170,22 @@
const orderForm = reactive({
list: [],
groupList: [],
is_end: [],
is_end: false,
status: '',
active: 0,
form: {
page: 1,
size: 10,
status: 'loadmore',
}
})
const form = reactive({
page: 1,
size: 10,
status: 'loadmore',
})
//
// const getorderList = async () => {
// await API()
// }
//
const userorderList = async () => {
let res = await APIuserorder({
page: orderForm.form.page,
size: orderForm.form.size,
// status: orderForm.status
status: orderForm.status
})
console.log(res)
if (res.totalPage == 1 && res.totalRow <= 10) {
@ -224,30 +206,12 @@
orderForm.form.status = 'loading';
}
}
}
// if (res.totalPage < orderForm.form.page) {
// orderForm.form.status = 'nomore'
// if (orderForm.form.page == 1 && res.records.length == 0) {
// orderForm.records = []
// orderForm.is_end = true
// }
// return false;
// } else {
// orderForm.form.status = 'loading';
// if (orderForm.form.page == 1) {
// orderForm.list = res.list
// } else {
// orderForm.list = [...orderForm.records, ...res.records];
// }
// orderForm.form.page = ++orderForm.form.page;
// if (orderForm.form.page > res.pages) {
// orderForm.form.status = 'nomore';
// } else {
// orderForm.form.status = 'loading';
// }
// }
const orderswitch = (item, index) => {
orderForm.active = index
orderForm.status = item.status
init_fn()
}
//

View File

@ -0,0 +1,223 @@
<template>
<view class="container">
<image class="top_bg" src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/order/orderAMeal.png"
mode="aspectFill"></image>
<view class="content_box">
<view class="content">
<view class="title">
<view class="title_text">请选择就餐人数</view>
<view class="title_tabNum">桌号{{tableCode}}</view>
</view>
<view class="num" :class="{'active':numIndex==-1}">
<view class="item" @click="tabCut(index)" v-for="(item,index) in 9" :key="index">
<view class="num_item" :class="{'active':numIndex==index }">{{index+1}}</view>
</view>
<view class="item">
<up--input class="num_item" v-model="otherNum" :class="{'active':numIndex==-1 }"
@input="isOtherNum" @focus="tabCut(-1)" @blur="blur()" border="none" type="nubmer"
maxlength="3"></up--input>
</view>
<!-- <view class="num_item" v-else :class="{'active':numIndex==-1 }"></view> -->
</view>
<view class="startBtn" @click="start">
开始点餐
</view>
</view>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
const otherNum = ref('其他')
const numIndex = ref(0)
const dinersNum = ref(1)
const isOtherNum = (e) => {
otherNum.value = otherNum.value.replace(/\D/g, '')
}
const tableCode = uni.cache.get('tableCode')
//
const tabCut = (index) => {
numIndex.value = index;
if (index != -1) {
dinersNum.value = index + 1;
} else {
otherNum.value = otherNum.value == "其他" ? "" : otherNum.value
}
}
const blur = (index) => {
otherNum.value = otherNum.value == "" ? "其他" : otherNum.value
}
const shopTable = uni.cache.get('shopTable')
const start = async () => {
if (numIndex.value == -1 && (otherNum.value == "其他" || otherNum.value <= 0)) {
uni.showToast({
title: '请选择就餐人数',
icon: 'none',
})
return;
}
if (numIndex.value == -1 && otherNum.value != "其他") {
dinersNum.value = otherNum.value
}
if (shopTable.useNum < dinersNum.value) {
uni.showToast({
title: `最多${shopTable.useNum}`,
icon: 'none'
});
return false;
}
uni.pro.redirectTo('product/index', dinersNum.value)
}
uni.cache.get('tableCode')
uni.cache.get('shopId')
</script>
<style scoped lang="scss">
page {
// background: #f6f6f6;
}
.top_bg {
width: 100%;
height: 100%;
position: absolute;
z-index: 1;
top: 0;
}
.content_box {
width: 100%;
padding: 0 28rpx;
position: absolute;
bottom: 148rpx;
}
.content {
width: 100%;
position: relative;
z-index: 2;
display: flex;
flex-direction: column;
padding: 48rpx 0 32rpx 32rpx;
background: #FFFFFF;
border-radius: 44rpx 44rpx 44rpx 44rpx;
.title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 48rpx;
padding-right: 32rpx;
.title_text {
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.title_tabNum {
font-weight: 400;
font-size: 28rpx;
color: #666666;
}
}
.num {
display: flex;
flex-wrap: wrap;
.item {
width: 20%;
padding-right: 32rpx;
}
.num_item {
width: 100%;
height: 56rpx;
line-height: 56rpx;
text-align: center;
margin-right: 28rpx;
margin-bottom: 32rpx;
background-color: #FEF4EB;
border-radius: 12rpx;
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
.num_item:nth-child(5n) {
margin-right: 0;
}
::v-deep .u-input {
width: 100%;
height: 56rpx;
line-height: 56rpx;
text-align: center;
margin-bottom: 32rpx;
background-color: #FEF4EB;
border-radius: 12rpx;
}
::v-deep input {
font-weight: 400;
border-radius: 12rpx;
font-size: 28rpx !important;
color: #333333 !important;
text-align: center !important;
background-color: #FEF4EB !important;
}
.active {
color: #fff;
background-color: #E8AD7B;
}
}
::v-deep .num.active .u-input {
width: 100%;
height: 56rpx;
line-height: 56rpx;
text-align: center;
margin-bottom: 32rpx;
background-color: #E8AD7B !important;
border-radius: 12rpx;
}
::v-deep .num.active input {
color: #fff !important;
border-radius: 12rpx;
background-color: #E8AD7B !important;
}
}
.startBtn {
width: 100%;
height: 96rpx;
line-height: 96rpx;
text-align: center;
background-color: #E8AD7B;
border-radius: 48rpx;
font-weight: bold;
font-size: 32rpx;
color: #FFFFFF;
}
</style>

View File

@ -0,0 +1,232 @@
<template>
<view class="container">
<image class="top_bg" src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/order/orderAMeal.png" mode="aspectFill"></image>
<view class="content_box">
<view class="content">
<view class="title">
<view class="title_text">请选择就餐人数</view>
<view class="title_tabNum">桌号A2</view>
</view>
<view class="num" :class="{'active':numIndex==-1}">
<view class="item" @click="tabCut(index)" v-for="(item,index) in 9" :key="index">
<view class="num_item" :class="{'active':numIndex==index }">{{index+1}}</view>
</view>
<view class="item">
<u--input class="num_item" v-model="otherNum" :class="{'active':numIndex==-1 }" @input="isOtherNum" @focus="tabCut(-1)" @blur="blur()" border="none" type="nubmer" maxlength="3"></u--input>
</view>
<!-- <view class="num_item" v-else :class="{'active':numIndex==-1 }"></view> -->
</view>
<view class="startBtn" @click="start">
开始点餐
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
tableCode: null,
shopId: null,
numIndex: 0,
otherNum: '其他',
dinersNum: 1,
type: ""
};
},
onLoad(options) {
this.tableCode = options.tableCode;
this.shopId = options.shopId;
if ( options.type ) { this.type = options.type}
},
onShow() {
},
methods: {
isOtherNum (e) {
this.$nextTick(() => {
this.otherNum = this.otherNum.replace(/\D/g, '')
})
},
/**
* 切换桌型
*/
tabCut(index) {
this.numIndex = index;
if ( index != -1) {
this.dinersNum = index+1;
} else {
this.otherNum = this.otherNum == "其他" ? "" : this.otherNum;
}
},
blur ( index ) {
this.otherNum = this.otherNum == "" ? "其他" : this.otherNum;
},
/**
* 开始点餐
*/
async start () {
if ( this.numIndex == -1 && (this.otherNum == "其他"||this.otherNum <= 0)) {
uni.showToast({
title: '请选择就餐人数',
icon: 'none',
})
return;
}
if ( this.numIndex == -1 && this.otherNum != "其他") {
this.dinersNum = this.otherNum
}
let res = await this.api.productChoseCount({
tableId: this.tableCode,
num: this.dinersNum,
shopId: this.shopId,
}) //
if ( res.code == 0) {
if( this.type == 'confirm') {
uni.pro,navigateBack()
} else {
uni.pro.redirectTo('order_food/order_food', {
// uni.pro.navigateTo('order_food/order_food', {
tableCode: this.tableCode,
})
}
}
}
}
};
</script>
<style scoped lang="scss">
page {
// background: #f6f6f6;
}
.top_bg{
width: 100%;
height: 100%;
position: absolute;
z-index: 1;
top: 0;
}
.content_box{
width: 100%;
padding: 0 28rpx;
position: absolute;
bottom: 148rpx;
}
.content{
width: 100%;
position: relative;
z-index: 2;
display: flex;
flex-direction: column;
padding: 48rpx 0 32rpx 32rpx;
background: #FFFFFF;
border-radius: 44rpx 44rpx 44rpx 44rpx;
.title{
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 48rpx;
padding-right: 32rpx;
.title_text{
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.title_tabNum{
font-weight: 400;
font-size: 28rpx;
color: #666666;
}
}
.num{
display: flex;
flex-wrap: wrap;
.item{
width: 20%;
padding-right: 32rpx;
}
.num_item{
width: 100%;
height: 56rpx;
line-height: 56rpx;
text-align: center;
margin-right: 28rpx;
margin-bottom: 32rpx;
background-color: #FEF4EB;
border-radius: 12rpx;
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
.num_item:nth-child(5n){
margin-right: 0;
}
::v-deep .u-input{
width: 100%;
height: 56rpx;
line-height: 56rpx;
text-align: center;
margin-bottom: 32rpx;
background-color: #FEF4EB;
border-radius: 12rpx;
}
::v-deep input{
font-weight: 400;
border-radius: 12rpx;
font-size: 28rpx!important;
color: #333333!important;
text-align: center!important;
background-color: #FEF4EB!important;
}
.active{
color: #fff;
background-color: #E8AD7B;
}
}
::v-deep .num.active .u-input{
width: 100%;
height: 56rpx;
line-height: 56rpx;
text-align: center;
margin-bottom: 32rpx;
background-color: #E8AD7B!important;
border-radius: 12rpx;
}
::v-deep .num.active input{
color: #fff!important;
border-radius: 12rpx;
background-color: #E8AD7B!important;
}
}
.startBtn{
width: 100%;
height: 96rpx;
line-height: 96rpx;
text-align: center;
background-color: #E8AD7B;
border-radius: 48rpx;
font-weight: bold;
font-size: 32rpx;
color: #FFFFFF;
}
</style>

View File

@ -29,7 +29,7 @@
<text class="i"></text>
<!-- 会员价与价格 -->
<text
class="price">{{shopInfo.isVip ==1?item.memberPrice:item.salePrice}}</text>
class="price">{{shopInfo.isVip ==1 && shopInfo.isMemberPrice==1?item.memberPrice:item.salePrice}}</text>
<!-- <text class="originalprice"
v-if="item.originPrice">¥{{item.originPrice}}</text>
<text class="unit" v-if="item.unitName">/{{item.unitName}}</text> -->
@ -44,7 +44,7 @@
<text class="num">{{ ifcartNumber(item) }}</text>
<view class="btn">
<!-- <up-icon name="plus-circle-fill"
:color="shopInfo.isVip == 1 ? '#CECECE' : '#E9AB7A'"
:color="{shopInfo.isVip ==1 && shopInfo.isMemberPrice==1? '#CECECE' : '#E9AB7A'"
size="25"></up-icon> -->
<up-icon name="plus-circle-fill" color="#E9AB7A" size="25"></up-icon>
<view class="btnClick" @click="cartListadd(item,'+')"></view>

View File

@ -51,10 +51,11 @@
style="margin-top: 32rpx;margin-bottom: 48rpx;">
<view class="panelfiveitemsex flex-between">
<view class="panelfiveitemsex_oen">
<text class="tips" :class="shopInfo.isVip ==0?'lineThrough':''">¥</text>
<text class="tips"
:class="shopInfo.isVip ==0 || shopInfo.isMemberPrice==0?'lineThrough':''">¥</text>
<!-- 会员价与价格 -->
<text
class="price">{{shopInfo.isVip ==1?item.memberPrice:item.salePrice}}</text>
class="price">{{shopInfo.isVip ==1 && shopInfo.isMemberPrice==1?item.memberPrice:item.salePrice}}</text>
<!-- 原价 -->
<text class="originalprice" v-if="item.originPrice">¥{{item.originPrice}}</text>
<!-- 单位 -->
@ -72,10 +73,11 @@
<view v-else class="flex-between" style="margin-top: 32rpx;margin-bottom: 48rpx;">
<view class="panelfiveitemsex flex-between">
<view class="panelfiveitemsex_oen">
<text class="tips" :class="shopInfo.isVip ==0?'lineThrough':''">¥</text>
<text class="tips"
:class="shopInfo.isVip ==0 || shopInfo.isMemberPrice==0?'lineThrough':''">¥</text>
<!-- 会员价与价格 -->
<text
class="price">{{shopInfo.isVip ==1?item.memberPrice:item.salePrice}}</text>
class="price">{{shopInfo.isVip ==1 && shopInfo.isMemberPrice==1?item.memberPrice:item.salePrice}}</text>
<!-- 原价 -->
<text class="originalprice" v-if="item.originPrice">¥{{item.originPrice}}</text>
<!-- 单位 -->
@ -159,12 +161,15 @@
<view v-if="item1.isSoldStock == 1 || item1.isSaleTime == 0" class="flex-between">
<view class="money">
<view></view>
<text class="money_num" v-if="shopInfo.isVip == 1"
<text class="money_num"
v-if="shopInfo.isVip ==1 && shopInfo.isMemberPrice==1"
style="margin-right: 10rpx;">{{ item1.memberPrice }}</text>
<view v-if="shopInfo.isVip ==1" :class="{lineThrough: shopInfo.isVip ==1}">
<view v-if="shopInfo.isVip ==1 && shopInfo.isMemberPrice==1"
:class="{lineThrough: shopInfo.isVip ==1 && shopInfo.isMemberPrice==1}">
</view>
<text class="money_num"
:class="{lineThrough: shopInfo.isVip ==1}">{{ item1.salePrice }}</text>
:class="{lineThrough: shopInfo.isVip ==1 && shopInfo.isMemberPrice==1}">{{ item1.salePrice }}</text>
<text v-if="item1.unitName">/{{item1.unitName}}</text>
</view>
<view class="flex-end">
@ -177,12 +182,15 @@
<view v-else class="flex-between">
<view class="money">
<view></view>
<text class="money_num" v-if="shopInfo.isVip ==1"
<text class="money_num"
v-if="shopInfo.isVip ==1 && shopInfo.isMemberPrice==1"
style="margin-right: 10rpx;">{{ item1.memberPrice }}</text>
<view v-if="shopInfo.isVip ==1" :class="{lineThrough: shopInfo.isVip ==1}">
<view v-if="shopInfo.isVip ==1 && shopInfo.isMemberPrice==1"
:class="{lineThrough: shopInfo.isVip ==1 && shopInfo.isMemberPrice==1}">
</view>
<text class="money_num"
:class="{lineThrough: shopInfo.isVip ==1}">{{ item1.salePrice }}</text>
:class="{lineThrough: shopInfo.isVip ==1 && shopInfo.isMemberPrice==1}">{{ item1.salePrice }}</text>
<text v-if="item1.unitName">/{{item1.unitName}}</text>
</view>
@ -308,7 +316,7 @@
<view class="price">
<text class="i"></text>
<text
class="num">{{shopInfo.isVip ==1?specifications.item.memberPrice:specifications.item.salePrice}}</text>
class="num">{{shopInfo.isVip ==1 && shopInfo.isMemberPrice==1?specifications.item.memberPrice:specifications.item.salePrice}}</text>
<text class="i">/{{specifications.item.unitName}}</text>
</view>
<view class="operation-wrap">
@ -423,17 +431,7 @@
}
}
const shopExtend = reactive({
autokey: "index_bg",
createTime: "2024-08-27T06:59:35.000+00:00",
id: 17,
name: "首页",
shopId: 29,
type: "img",
updateTime: null,
value: "https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/20240827/4e58171d813a45269997085b145b8bfe.png"
})
const shopExtend = uni.cache.get('shopTable').shopExtendMap.index_bg
//
const navScroll = ref(null)
@ -875,6 +873,10 @@
showCart.value = false
}
if (Message.type == 'bc') {
console.log(Message)
}
//
if (Message.operate_type == "shopping_init") {
cartList.value = Message.data
@ -886,7 +888,7 @@
}
//
if (Message.operate_type == 'shopping_add' || Message.operate_type == 'sopping_edit') {
if (Message.operate_type == 'shopping_add' || Message.operate_type == 'sopping_edit' || Message.type == 'bc') {
[Message.data].forEach((objA) => {
const index = cartList.value.findIndex((objB) => objB.id == objA.id);
if (index !== -1) {

View File

@ -2,25 +2,24 @@
<view class="container">
<view class="towcontent">
<view class="towcontentlistxitem flex-start">
<view class="towcontentlistxitembox flex-colum"
:class="tabIndex == item.type?'towcontentlistxitemboxopacity':''" v-for="(item,index) in tabList"
:key="index" @click="towcontentclick(item)">
<view class="towcontentlistxitembox flex-colum" v-for="(item,index) in tabList" :key="index"
@click="towcontentclick(item)"
:class="fromInfo.tabIndex == item.status?'towcontentlistxitemboxopacity':''">
<text class="title">{{item.name}}</text>
<image v-if="tabIndex == item.type"
<image v-if="fromInfo.tabIndex == item.status"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/index/today/dg.png" mode="widthFix">
</image>
</view>
</view>
</view>
<view class="containertop"
:class="{select: type == 'confirm_order_coupon' || type == 'confirm_order_product' || type == 'orderInfo_coupon' || type == 'orderInfo_product'}">
<view class="containertop">
<view class="containertopbox">
<view class="containertopboxitem flex-start" v-for="(item,index) in list" :key="index">
<view class="containertopboxitem flex-start" v-for="(item,index) in fromInfo.list" :key="index">
<view class="containertopboxitemleft flex-colum"
:class="{'containertopboxitemleft_vip': item.type == 2,'containertopboxitemlefts': status != 1,}">
:class="{'containertopboxitemleft_vip': item.type == 2,'containertopboxitemlefts': fromInfo.status != 1,}">
<view class="containertopboxitemleft_one"
:class="status == 1?'':'containertopboxitemleft_ones'">
:class="fromInfo.status == 1?'':'containertopboxitemleft_ones'">
<block v-if="item.type == 2">
<text>{{item.num || 0}}</text>
<text style="font-size: 28rpx;margin-left: 6rpx;"></text>
@ -32,7 +31,7 @@
</view>
<view class="containertopboxitemleft_tow" :class="{
'containertopboxitemleft_tows': status != 1,
'containertopboxitemleft_tows': fromInfo.status != 1,
'containertopboxitemleft_nameVip': item.type == 2,
}">
{{ item.type == 2 ? item.name : '优惠券(元)'}}
@ -44,16 +43,16 @@
<view class="flex-start">
<image class="icon"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/user/coupon_icon.png"
mode="aspectFill">
<text class="title">{{ item.shopName }}</text>
mode="aspectFill"></image>
<text class="title">{{ item.shopName }}</text>
</view>
<text>无门槛使用</text>
</view>
<view class="containertopboxitemright_tow">
<view> {{ item.type == 2 ? '会员商品券' : item.name}}</view>
<view @click="navigatorGo(item)"
:class="status == 1?'containertopboxitemright_four containertopboxitemright_btn':'containertopboxitemright_fours containertopboxitemright_btn'">
{{status == 1 ? '去使用':'已使用'}}
:class="fromInfo.status == 1?'containertopboxitemright_four containertopboxitemright_btn':'containertopboxitemright_fours containertopboxitemright_btn'">
{{fromInfo.status == 1 ? '去使用':'已使用'}}
</view>
</view>
<view class="containertopboxitemright_there" v-if="item.type == 1 ">
@ -63,333 +62,136 @@
</view>
</view>
<image style="width: 402rpx;height: 442rpx;margin:240rpx auto 32rpx;"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/nomore.png" v-if="list.length <= 0"
mode="aspectFill"></image>
<u-loadmore :status="form.status" iconSize='24' fontSize='24' height='40' />
<view v-if="fromInfo.list.length <= 0" style="text-align: center;">
<image style="width: 402rpx;height: 442rpx;margin:240rpx auto 32rpx;"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/nomore.png" mode="aspectFill"></image>
</view>
<up-loadmore :status="form.status" iconSize='12' fontSize='12' height='20' />
</view>
</view>
<view class="btnBox"
v-if="type == 'confirm_order_coupon' || type == 'confirm_order_product' || type == 'orderInfo_coupon' || type == 'orderInfo_product'">
<!-- <view class="btnBox" >
<view class="btn" @click="cancelCoupon">暂不使用券</view>
</view>
</view> -->
</view>
</template>
<script>
export default {
data() {
return {
tabList: [
<script setup>
import {
ref,
reactive,
onMounted
} from 'vue';
import {
APIcouponfindByUserId
} from '@/common/api/member.js'
{
name: '未使用',
type: '1'
},
{
name: '已使用',
type: '2'
},
{
name: '已过期',
type: '-1'
}
],
tabIndex: 1,
list: [],
status: 1,
type: "",
payAmount: 0,
shopId: null,
orderId: null,
couopnInfo: null,
shoppingCart: [],
productList: [],
};
const tabList = [{
name: '未使用',
status: '0'
},
onLoad(options) {
console.log(options)
if (options.type) {
this.type = options.type
}
if (options.payAmount) {
this.payAmount = options.payAmount
}
if (options.shopId) {
this.shopId = options.shopId
}
if (options.orderId) {
this.orderId = options.orderId
}
if (options.couopnInfo) {
this.couopnInfo = JSON.parse(decodeURIComponent(options.couopnInfo))
}
if (options.shoppingCart) {
this.shoppingCart = JSON.parse(decodeURIComponent(options.shoppingCart))
}
if (options.productList) {
this.productList = JSON.parse(decodeURIComponent(options.productList))
}
{
name: '已使用',
status: '1'
},
onShow() {
this.list = [];
this.getCouponList()
},
methods: {
/**
* 切换类型
* @param {Object} item
*/
towcontentclick(item) {
this.tabIndex = item.type;
this.status = item.type;
this.list = [];
this.getCouponList()
},
/**
* 获取优惠券数据
*/
async getCouponList() {
try {
let params = {
userId: uni.getStorageSync('userInfo').id,
status: this.status
}
if (this.type == 'confirm_order_coupon' || this.type == 'confirm_order_product' || this.type ==
'orderInfo_coupon' || this.type == 'orderInfo_product') {
params.orderId = -1;
}
if (this.shopId) {
params.shopId = this.shopId;
}
let res = await this.api.conponList(params)
if (res) {
console.log(res)
let list = [];
if (this.type == 'confirm_order_coupon' || this.type == 'orderInfo_coupon') {
list = res.data.filter(v => v.type == 1);
} else if (this.type == 'confirm_order_product' || this.type == 'orderInfo_product') {
list = res.data.filter(v => v.type == 2);
} else {
list = res.data;
}
this.list = list;
}
} catch (e) {
//TODO handle the exception
}
},
/**
* 去使用优惠券
*/
navigatorGo(item) {
uni.cache.set('shopId', item.shopId)
if (this.type == 'confirm_order_coupon' || this.type == 'confirm_order_product' || this.type ==
'orderInfo_coupon' || this.type == 'orderInfo_product') {
if (item.type == 1) {
if (this.payAmount < item.fullAmount) {
uni.showToast({
title: "当前订单金额不足使用金额",
icon: "none",
})
return;
}
if (this.payAmount < item.discountAmount) {
uni.showToast({
title: "当前订单金额不足抵扣金额",
icon: "none",
})
return;
}
uni.$emit('couponItem', JSON.stringify(item))
let selectCouponData = uni.cache.get('selectCouponData') || [];
let couponList = selectCouponData.filter(v => v.type == 1);
if (couponList.length > 0) {
couponList.map(items => {
if (item.type == 1) {
for (var v in items) {
items[v] = item[v]
}
}
})
} else {
selectCouponData.push(item)
}
uni.cache.set('selectCouponData', selectCouponData)
uni.navigateBack();
} else {
let productNum = 0; //
let productTicketNum = 0; //使
let product = this.shoppingCart.filter(v => v.productId == item.proId);
let productTicket = this.productList.filter(v => v.productId == item.proId);
if (product.length <= 0) {
uni.showToast({
title: "购物车没有" + item.name,
icon: "none",
})
return;
}
if (this.productList.filter(v => v.userCouponId == item.id).length > 0) {
uni.showToast({
title: `当前优惠券已选择`,
icon: "none",
})
return;
}
//
product.forEach(item => {
productNum += item.number;
})
// 使
productTicket.forEach(item => {
productTicketNum += item.num;
})
if ((productNum - productTicketNum) == 0) {
uni.showToast({
title: `当前商品已经全部抵扣`,
icon: "none",
})
return;
}
let isNum = 0;
let isProductItem;
//
if (this.type == 'confirm_order_product') {
product.forEach(item => {
for (let i = 0; i < item.number; i++) {
isNum++
if (isNum == productTicketNum + 1) {
isProductItem = item;
}
}
})
if (this.payAmount < (isProductItem.memberPrice > 0 ? isProductItem.memberPrice : isProductItem
.salePrice)) {
uni.showToast({
title: `当前金额不足商品抵扣`,
icon: "none",
})
return;
}
}
//
if (this.type == 'orderInfo_product') {
product.forEach(item => {
for (let i = 0; i < item.num; i++) {
isNum++
if (isNum == productTicketNum + 1) {
isProductItem = item;
}
}
})
if (this.payAmount < (isProductItem.memberPrice > 0 ? isProductItem.memberPrice : isProductItem
.price)) {
uni.showToast({
title: `当前金额不足商品抵扣`,
icon: "none",
})
return;
}
}
if (!isProductItem) {
uni.showToast({
title: `当前订单无可抵扣商品`,
icon: "none",
})
return;
}
// let productNum = 0;
// product.map(item => {
// productNum += item.number
// })
// if ( productNum < item.num) {
// uni.showToast({
// title: `${item.name}`,
// icon: "none",
// })
// return;
// }
// if (product[0].number item.num) {
// }
uni.$emit('couponItem', JSON.stringify(item))
let selectCouponData = uni.cache.get('selectCouponData') || [];
selectCouponData.push(item)
uni.cache.set('selectCouponData', selectCouponData)
uni.navigateBack();
}
} else {
uni.pro.navigateTo('/pages/product/index', {
shopId: item.shopId
})
}
},
/**
* 取消使用优惠券/商品券
*/
async cancelCoupon() {
let selectCouponData = uni.cache.get('selectCouponData')
if (this.type == 'confirm_order_coupon' || this.type == 'orderInfo_coupon') {
let couponList = selectCouponData.filter(v => v.type == 1);
let productList = selectCouponData.filter(v => v.type == 2);
if (couponList.length > 0) {
uni.cache.set('selectCouponData', productList)
if (this.couopnInfo && this.orderId) {
let params = {
shopId: this.shopId,
orderId: this.orderId,
}
if (this.couopnInfo.userCouponInfos.filter(v => v.type == 2).length > 0) {
params.userCouponInfos = this.couopnInfo.userCouponInfos.filter(v => v.type == 2)
}
if (this.couopnInfo.isPointsChecked && this.couopnInfo.calcUsablePointsData.pointsNum &&
this.couopnInfo.calcUsablePointsData.pointsNum > 0) {
params.pointsNum = this.couopnInfo.calcUsablePointsData.pointsNum;
}
let res = await this.api.useCoupon(params)
}
}
} else if (this.type == 'confirm_order_product' || this.type == 'orderInfo_product') {
let couponList = selectCouponData.filter(v => v.type == 1);
let productList = selectCouponData.filter(v => v.type == 2);
if (productList.length > 0) {
uni.cache.set('selectCouponData', couponList)
if (this.couopnInfo && this.orderId) {
let params = {
shopId: this.shopId,
orderId: this.orderId,
}
if (this.couopnInfo.userCouponInfos.filter(v => v.type == 1).length > 0) {
params.userCouponInfos = this.couopnInfo.userCouponInfos.filter(v => v.type == 1)
}
if (this.couopnInfo.isPointsChecked && this.couopnInfo.calcUsablePointsData.pointsNum &&
this.couopnInfo.calcUsablePointsData.pointsNum > 0) {
params.pointsNum = this.couopnInfo.calcUsablePointsData.pointsNum;
}
let res = await this.api.useCoupon(params)
}
}
}
uni.navigateBack();
},
{
name: '已过期',
status: '2'
}
};
]
const fromInfo = reactive({
tabIndex: 0,
list: [],
status: 1,
payAmount: 0,
shopId: null,
orderId: null,
couopnInfo: null,
shoppingCart: [],
productList: [],
})
const form = reactive({
page: 1,
size: 10,
status: 'loadmore',
})
const towcontentclick = (item) => {
fromInfo.tabIndex = item.status;
fromInfo.status = item.status;
fromInfo.list = [];
getCouponList()
}
// 使
const navigatorGo = (item) => {
}
const getCouponList = async () => {
let res = await APIcouponfindByUserId({
userId: uni.cache.get('userInfo').id,
status: fromInfo.status,
shopId: fromInfo.shopId ? fromInfo.shopId : uni.cache.get('shopId'),
page: form.page,
size: form.size,
})
if (!res) {
form.status = 'nomore'
fromInfo.list = []
return false
}
if (res.totalPage == 1 && res.totalRow <= 10) {
form.status = 'nomore'
fromInfo.list = res.records
if (form.page == 1 && res.records.length == 0) {
fromInfo.list = []
}
return false;
} else {
form.status = 'loading';
fromInfo.list = [...fromInfo.list, ...res.records];
form.page = ++form.page;
if (form.page > res.totalPage) {
form.status = 'nomore';
} else {
form.status = 'loading';
}
}
console.log(fromInfo.list)
}
const cancelCoupon = () => {
}
onMounted(async () => {
//
const pages = getCurrentPages();
//
const currentPage = pages[pages.length - 1];
//
const options = currentPage.options;
if (options.shopId) {
fromInfo.shopId = options.shopId
}
// if (options.payAmount) {
// this.payAmount = options.payAmount
// }
// if (options.orderId) {
// fromInfo.orderId = options.orderId
// }
// if (options.couopnInfo) {
// this.couopnInfo = JSON.parse(decodeURIComponent(options.couopnInfo))
// }
// if (options.shoppingCart) {
// this.shoppingCart = JSON.parse(decodeURIComponent(options.shoppingCart))
// }
// if (options.productList) {
// this.productList = JSON.parse(decodeURIComponent(options.productList))
// }
getCouponList()
})
</script>
<style lang="scss">
@ -412,6 +214,8 @@
font-weight: 500;
font-size: 28rpx;
color: #333333;
justify-content: flex-start;
height: 50rpx;
image {
margin-top: 6rpx;
@ -428,6 +232,7 @@
}
image {
margin-top: 6rpx;
width: 38.83rpx;
height: 8.62rpx;
}

View File

@ -0,0 +1,80 @@
<template>
<view>
<image src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/wkthuiyuanbg.png" class="imgstyle" mode=""></image>
<button class="btnclass" open-type="getPhoneNumber" @getphonenumber="sumbit">立即开通 </button>
</view>
</template>
<script>
export default {
data() {
return {
shopId: "",
switchdata: true, //
}
},
onLoad(e) {
this.shopId = e.shopId
},
onUnload() {
if (this.switchdata) {
uni.navigateBack()
}
},
methods: {
sumbit(d) {
if (d.detail.iv) {
uni.login({
provider: 'weixin',
success: async (data) => {
let res = await this.api.userwxlogins({
code: data.code,
encryptedData: d.detail.encryptedData,
iv: d.detail.iv,
shopId: this.shopId
})
if (res.code == 0) {
let resdata = await this.api.loginwxuserInfo({
userId: uni.cache.get('userInfo').id
})
if (resdata.code == 0) {
this.switchdata = false
uni.cache.set('userInfo', resdata.data);
uni.pro.redirectTo('/pages/member/index', {
shopId: this.shopId,
type: 'index'
})
}
}
}
})
}
}
}
}
</script>
<style scoped lang="less">
.imgstyle {
width: 694rpx;
height: 414rpx;
margin: 70rpx auto;
}
.btnclass {
width: 694rpx;
height: 90rpx;
line-height: 90rpx;
background: #6D89A4;
border-radius: 12rpx 12rpx 12rpx 12rpx;
text-align: center;
margin: auto;
font-family: PingFang SC, PingFang SC;
font-weight: bold;
font-size: 36rpx;
color: #FFFFFF;
}
</style>

View File

@ -0,0 +1,229 @@
<template>
<!-- 账单明细 -->
<view>
<view class="bild">
<view class="bildLeft">
<text>我的余额</text>
<view>{{info.amount||0}}</view>
</view>
<view class="bildRight">
<text>我的积分</text>
<view>{{info.accountPoints||0}}</view>
</view>
</view>
<view class="navTop">
<view @click="clickEvent(1)" :class="[active==1?'fonts':'']">
余额明细
<view :class="[active==1?'xian':'']" style="left: 36rpx;"> </view>
</view>
<view @click="clickEvent(2)" :class="[active==2?'fonts':'']">
积分明细
<view :class="[active==2?'xian':'']" style="left: 36rpx;"> </view>
</view>
</view>
<view class="listStyle " v-for="(item,i) in list" :key="i">
<!-- <image class="head_img" :src="item.head_img?item.head_img:'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/head_default.png'" style="width: 76rpx;height: 76rpx;float: left;" mode=""></image> -->
<view class="flex-start">
<view class="listStyle_left">
<view class="listrigth">
<view>{{active == 1 ? item.biz_name : item.content}}</view>
<view
:class="{colorStyle: (active==1&&item.type == '+') || (active==2&&item.floatType=='add')}">
{{ active == 1 ? item.type : (item.floatType == 'add'?'+':'')}}
{{active == 1 ? item.amount : item.floatPoints}}
</view>
</view>
</view>
<view class="listrigth2">
<view>{{$u.timeFormat(active == 1 ? item.create_time : item.createTime, 'yyyy-mm-dd hh:MM:ss')}}
</view>
<view v-if="active == 1">余额:{{item.balance}}</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import {
ref,
reactive
} from 'vue'
import {
onReachBottom
} from '@dcloudio/uni-app'
const formData = reactive({
active: 1,
list: [],
form: {
page: 1,
pageSize: 10,
},
info: null,
shopId: null
})
const getlist = () => {
return false;
// if (this.active == 1) {
// let res = await this.api.queryMemberAccount({
// ...this.form
// })
// if (res.code == 0 && res.data.list.length > 0) {
// this.list = this.list.concat(res.data.list)
// this.form.page++
// }
// } else {
// let res = await this.api.queryMemberPointsLog({
// shopId: formData.info.shopId,
// ...this.form
// })
// if (res.code == 0 && res.data.list.length > 0) {
// this.list = this.list.concat(res.data.list)
// this.form.page++
// }
// }
}
// In
const checkIn = (str) => {
let reg = RegExp(/In/)
return str.match(reg)
}
const clickEvent = (i) => {
formData.active = i;
formData.form.page = 1;
formData.list = []
getlist()
}
onReachBottom(() => {
getlist()
})
onMounted(() => {
//
const pages = getCurrentPages();
//
const currentPage = pages[pages.length - 1];
//
const options = currentPage.options;
formData.info = JSON.parse(options.shopUserInfo)
console.log(formData.info)
getlist()
})
</script>
<style scoped lang="less">
.bild {
height: 320rpx;
background-image: url('https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/billingDetails.png');
background-size: 750rpx 320rpx;
display: flex;
justify-content: space-around;
align-items: center;
.bildLeft,
.bildRight {
font-weight: 400;
font-size: 32rpx;
>view,
>text {
text-align: center;
color: #333;
}
>view {
margin-top: 34rpx;
font-weight: bold;
}
}
}
.navTop {
display: flex;
justify-content: space-around;
align-items: center;
color: #333;
margin-top: -60rpx;
padding: 0 120rpx;
font-size: 28rpx;
.fonts {
font-weight: bold;
font-size: 32rpx;
}
>view {
position: relative;
.xian {
width: 58rpx;
height: 6rpx;
background: #333;
border-radius: 2rpx 2rpx 2rpx 2rpx;
position: absolute;
bottom: -16rpx;
}
}
}
.listStyle {
padding: 28rpx;
padding-top: 50rpx;
width: 100%;
.listrigth,
.listrigth2 {
width: 100%;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
// padding-left: 32rpx;
}
.listrigth {
.colorStyle {
color: #FF7127;
}
>view {
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
}
.listStyle_left {
width: 100%;
display: flex;
align-items: center;
}
.head_img {
border-radius: 50%;
margin-right: 32rpx;
}
.listrigth2 {
margin-top: 16rpx;
>view {
font-weight: 500;
font-size: 24rpx;
color: #666666;
}
}
}
</style>

View File

@ -0,0 +1,470 @@
<template>
<!-- 店铺详情 -->
<u-popup :show="memberOpen" :round="20" overlayOpacity="0.8" mode="bottom" @close="showClose" height="500">
<view class="register-member-wrap">
<view class="register-title">欢迎加入{{shopUserInfo.shopName?shopUserInfo.shopName:'本店'}}</view>
<view class="register-tip">请完善个人信息完成会员注册</view>
<view class="register-content">
<view class="reg-head">
<view class="reg-head-img">
<!-- #ifdef MP-WEIXIN || H5 -->
<button class="reg-head-img" type="default" open-type="chooseAvatar"
@chooseavatar="onChooseAvatar">
<image class="reg-head-img"
:src="userHeadImg || 'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/head_default.png'"
mode="aspectFill"></image>
</button>
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<button class="reg-head-img" @click="onChooseAvatar">
<image class="reg-head-img"
:src="userHeadImg || 'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/head_default.png'"
mode="aspectFill"></image>
</button>
<!-- #endif -->
</view>
</view>
<view class="reg-cell">
<view class="lable">昵称<text style="color: #CD1A1A;">*</text></view>
<u-input class="value" v-model="formInfo.nickName" fontSize="14px" type="text" input-align="left"
placeholder="请输入昵称" :custom-style="{border:'none'}"
placeholderStyle="color:#999;font-size: 28rpx" />
</view>
<view class="reg-cell" @click="calendarShow = true">
<view class="lable">生日</view>
<view class="value" :style="{color: formInfo.birthDay ? '#333' : '#999'}">
{{ formInfo.birthDay || '请选择日期'}}
</view>
<!-- <u-calendar @close="calendarShow = false" monthNum="99" minDate="1945-01-01" maxDate="2055-12-12" :show="calendarShow" mode="single" @confirm="confirmCalendar"></u-calendar> -->
<!-- <u-picker :show="calendarShow" ref="uPicker" :columns="columns" @confirm="confirm" @change="changeHandler"></u-picker> -->
<!-- <picker :show="calendarShow" mode="date"></picker> -->
<up-datetime-picker mode="date" @cancel="calendarShow = false" :show="calendarShow"
minDate="-2208988800000" v-model="value1" itemHeight="66" visibleItemCount="5"
@confirm="confirmTime"></up-datetime-picker>
<u-icon name="arrow-down-fill" color="#000" size="23"></u-icon>
</view>
<view class="reg-cell">
<view class="lable">手机号</view>
<u-input class="value" v-model="formInfo.telephone" fontSize="14px" type="text" input-align="left"
readonly placeholder="获取手机号" :custom-style="{border:'none'}"
placeholder-style="color:#999;font-size: 28rpx" />
<!-- #ifdef MP-WEIXIN || H5 -->
<button class="getPhone" open-type="getPhoneNumber" @getphonenumber="getPhone">
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<button class="getPhone" open-type="getAuthorize" scope='phoneNumber' @getAuthorize="getPhone">
<!-- #endif -->
<view class="text">{{'获取手机号'}}</view>
</button>
</view>
<view class="agreement">
<view class="agreement_tip">我已阅读并同意以下内容</view>
<view class="agreement_item" @click="isProtocol = !isProtocol">
<up-checkbox-group>
<up-checkbox :checked="isProtocol" shape="circle" activeColor="#E3AD7F"
@change="radioChange" size="35" iconSize="20"></up-checkbox>
</up-checkbox-group>
<text @click.stop="viewProtocol(1)" class="agreement_item_text">用户协议/隐私条款</text>
</view>
<!-- <view class="agreement_item">
<u-checkbox-group>
<u-checkbox shape="circle" activeColor="#E3AD7F" @change="radioChange" size="30"></u-checkbox>
</u-checkbox-group>
<text class="agreement_item_text">隐私条款</text>
</view> -->
</view>
<view class="register_btn" @tap="$u.debounce(registerMember, 500)">快速注册</view>
</view>
</view>
</u-popup>
</template>
<script setup>
import {
defineProps,
reactive,
ref
} from 'vue';
const props = defineProps({
shopUserInfo: {
type: Object,
default: () => ({})
},
});
const formInfo = reactive({
nickName: "",
telephone: "",
birthDay: "",
})
const value1 = Number(new Date())
const calendarShow = ref(false)
//
const userHeadImg = ref('')
//
const memberOpen = ref(false)
//
const isProtocol = ref(false)
const init = async () => {
// if (uni.cache.get('shopUserInfo') && uni.cache.get('shopId') == uni.cache.get('shopUserInfo').id) {
// shopUserInfo = uni.cache.get('shopUserInfo');
// } else {
// let res = await this.api.shopUserInfo({
// "shopId": uni.cache.get('shopId'),
// "userId": uni.cache.get('userInfo').id,
// })
// if (res.code == 0) {
// shopUserInfo = res.data;
// }
// }
// memberOpen.value = shopUserInfo.isVip == 0 ? true : false;
// userHeadImg.value = shopUserInfo.headImg;
// formInfo.nickName = shopUserInfo.nickName && shopUserInfo.nickName != '' ? shopUserInfo
// .nickName : '';
// formInfo.telephone = shopUserInfo.telephone;
// formInfo.birthDay = shopUserInfo.birthDay
}
//
const showClose = () => {
uni.navigateBack()
}
//
const radioChange = (n) => {
isProtocol.value = n;
}
//
const viewProtocol = () => {
wx.openPrivacyContract({
success: () => {}, //
fail: () => {}, //
complete: () => {}
})
}
//
const onChooseAvatar = (e) => {
//#ifdef MP-WEIXIN
let avatarUrl = e.detail.avatarUrl
uni.uploadFile({
url: uni.conf.baseUrl + '/common/upload',
// url: uni.conf.baseUrl + '/common/upload',
filePath: avatarUrl,
header: {
environment: 'app',
type: 'android',
version: '1.7.3',
'content-type': 'multipart/form-data'
},
fileType: 'image',
name: "file",
formData: {
file: avatarUrl,
},
success: (uploadFileRes) => {
let {
data
} = JSON.parse(uploadFileRes.data)
userHeadImg.value = data
},
fail: (res) => {
console.log(res)
}
});
// #endif
//#ifdef MP-ALIPAY
uni.chooseImage({
count: 1, // 9
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: function(res) {
//
let avatarUrl = res.tempFilePaths[0]; //
my.uploadFile({
url: uni.conf.baseUrl + '/common/upload',
filePath: avatarUrl,
header: {
environment: 'app',
type: 'android',
version: '1.7.3',
'content-type': 'multipart/form-data'
},
fileType: 'image',
name: "file",
formData: {
file: avatarUrl,
},
success: (uploadFileRes) => {
let {
data
} = JSON.parse(uploadFileRes.data)
userHeadImg.value = data
},
fail: (res) => {
console.log(res)
}
});
},
fail: (res) => {
console.log(res)
}
});
// #endif
}
//
const confirmTime = (e) => {
this.calendarShow = false;
this.birthDay = this.getDate(e.value);
}
//
const getPhone = (d) => {
// #ifdef MP-WEIXIN
if (d.detail.iv) {
uni.login({
provider: 'weixin',
success: async (data) => {
let res = await this.api.userwxlogins({
code: data.code,
encryptedData: d.detail.encryptedData,
iv: d.detail.iv,
source: "wechar"
})
this.telephone = res.data
}
})
}
// #endif
// #ifdef MP-ALIPAY
//
my.getAuthCode({
scopes: 'auth_user',
success: (res) => {
console.log(res)
my.getPhoneNumber({
success: async (data) => {
let res = await this.api.userwxlogins({
encryptedData: JSON.parse(data.response).response,
source: "alipay"
})
this.telephone = res.data
// console.log(this.phonetitle)
}
});
}
});
// #endif
}
//
const getDate = (time) => {
const date = new Date(time);
// const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
}
const registerMember = async() => {
// if ( userHeadImg.value == "" || userHeadImg.value == null ) {
// uni.showToast({
// title: '',
// icon: 'none'
// });
// return;
// }
if (formInfo.nickName == "" || formInfo.nickName == null) {
uni.showToast({
title: '请输入会员昵称',
icon: 'none'
});
return;
}
// if ( this.birthDay == "" || this.birthDay == null ) {
// uni.showToast({
// title: '',
// icon: 'none'
// });
// return;
// }
if (formInfo.telephone == "" || formInfo.telephone == null) {
uni.showToast({
title: '请获取手机号',
icon: 'none'
});
return;
}
if (!isProtocol.value) {
uni.showToast({
title: '请勾选协议',
icon: 'none'
});
return;
}
let res = await this.api.openMember({
id: uni.cache.get('userInfo').id,
shopId: uni.cache.get('shopId'),
nickName: formInfo.nickName,
headImg: userHeadImg.value,
telephone: formInfo.telephone,
birthDay: formInfo.birthDay
})
if (res.code == 0) {
}
}
</script>
<style lang="scss" scoped>
.u-datetime-picker {
height: 300px !important;
}
.register-member-wrap {
padding: 64rpx 24rpx;
display: flex;
flex-direction: column;
.register-title {
font-weight: bold;
font-size: 36rpx;
color: #333333;
margin-bottom: 16rpx;
}
.register-tip {
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
.register-content {
display: flex;
flex-direction: column;
.reg-head {
display: flex;
align-items: center;
justify-content: center;
margin-top: 64rpx;
.reg-head-img {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
padding: 0;
position: relative;
}
.reg-head-edit {
width: 24rpx;
height: 24rpx;
position: absolute;
bottom: 0;
right: 14rpx;
}
}
.reg-cell {
display: flex;
align-items: center;
padding: 20rpx 0;
border-bottom: 2rpx solid #E5E5E5;
.lable {
width: 120rpx;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
.value {
font-weight: 400;
font-size: 28rpx;
color: #333;
padding: 12rpx 0 12rpx 18rpx;
}
.u-input {
input {
font-size: 28rpx !important;
}
}
.getPhone {
background-color: none;
border: 2rpx solid #E3AD7F;
color: #E3AD7F;
font-size: 28rpx;
padding: 5rpx 10rpx;
// #ifdef MP-ALIPAY
padding-top: 0;
display: initial;
height: 70rpx;
line-height: 70rpx;
box-sizing: border-box;
border-radius: 5rpx;
// #endif
}
}
.agreement {
display: flex;
flex-direction: column;
margin-top: 48rpx;
.agreement_tip {
font-weight: 400;
font-size: 24rpx;
color: #666666;
}
.agreement_item {
display: flex;
padding-top: 32rpx;
padding-bottom: 16rpx;
.agreement_item_text {
font-weight: 500;
font-size: 24rpx;
color: #E3AD7F;
}
}
}
.register_btn {
width: 572rpx;
height: 90rpx;
line-height: 90rpx;
text-align: center;
background: #E3AD7F;
border-radius: 48rpx 48rpx 48rpx 48rpx;
font-weight: 500;
font-size: 36rpx;
color: #FFFFFF;
margin: 30rpx auto 0 auto;
}
}
}
</style>

715
pages/user/member/index.vue Normal file
View File

@ -0,0 +1,715 @@
<template>
<view class="content">
<view class="location" @click="openLocation">
<image class="location_icon" src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/location.png"
mode="aspectFill"></image>
<view>{{ infoForn.shopUserInfo.shopName }}</view>
<up-icon name="arrow-right" color="#575B66" size="16"></up-icon>
</view>
<view class="card_info flex-colum">
<view class="title">账户余额()</view>
<view class="card_info_con flex-between">
<view class="balance">{{infoForn.userInfo.amount || '0.00'}}</view>
<view class="card_info_con_right flex-end">
<view class="card_info_con_right_item flex-colum" @click="handleClick(item)"
v-for="(item,index) in cardManageList" :key="index">
<image class="card_info_con_right_item_icon" :src="item.icon" mode="aspectFill"></image>
<text class="card_info_con_right_item_text">{{item.name}}</text>
</view>
</view>
</view>
</view>
<view class="customAmount" v-if="infoForn.shopUserInfo.isCustomAmount == 1">
<view class="customAmount_left">
<text class="customAmount_left_tip"></text>
<input type="number" v-model="infoForn.amount" inputAlign="left"
:placeholder="`充${infoForn.amount}送${infoForn.giftAmount}`" :customStyle="{border: '0'}"
controlled="true" @input="amountChange"></input>
</view>
<text class="customAmount_right">自定义金额</text>
</view>
<view class="rechargeList">
<view class="rechargeList_f" @click="clickinput(item,index)" v-for="(item,index) in infoForn.listdata"
:key="index">
<view class="rechargeList_item flex-colum " :class="index === infoForn.inputshow?'active':''">
<view class="rechargeList_item_title">充值</view>
<view class="flex-colum-start">
<view class="rechargeList_item_amount"><text>{{item.amount}}</text></view>
<view class="rechargeList_item_gift" v-show="index === infoForn.inputshow">
<image class="rechargeList_item_gift_bg"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/gift_icon.png"
mode="aspectFill"></image>
<view class="rechargeList_item_gift_text">
<text></text>
<text>{{ item.giftAmount }}</text>
</view>
</view>
<view class="rechargeList_item_handsel" v-show="index !== infoForn.inputshow">
赠送{{item.giftAmount}}
</view>
</view>
</view>
</view>
</view>
<view class="gift" v-if="infoForn.giftList && infoForn.giftList.length > 0">
<view class="gift_title">您将获得</view>
<view class="gift_list">
<view class="gift_list_item" v-for="(item,index) in infoForn.giftList" :key="index">
<text class="icon"></text>
<text class="text"> {{ item }} </text>
</view>
</view>
</view>
<view class="explain">
<view class="explain-top flex-between">
<text class="explain-top_title">适用门店</text>
<text class="shopName">{{ infoForn.shopUserInfo.shopName }}</text>
</view>
<view class="explain_content">
<text class="explain_content_title">充值说明</text>
<text class="explain_content_text">1.充值金额1家门店可用</text>
<text class="explain_content_text">2.储值完成后不支持自助退款可联系商家处理</text>
<text class="explain_content_text">3.钱包余额不支持转赠不可提现长期有效</text>
</view>
</view>
<view class="rechargeBox">
<view class="agreement" @click="infoForn.isProtocol = !infoForn.isProtocol">
<up-checkbox-group>
<up-checkbox :checked="infoForn.isProtocol" shape="circle" activeColor="#E3AD7F"
@change="radioChange" size="18" iconSize="10">
</up-checkbox>
</up-checkbox-group>
<text>已同意</text>
<text class="agreement_text" @click.stop="viewProtocol">用户隐私协议</text>
</view>
<view class="recharge" @tap="$u.debounce(userbalancerechangesub, 500)">立即充值</view>
</view>
<!-- <registermember :show="memberOpen" :shopId="shopId" @getRegisterMember="getRegisterMember"></registermember> -->
</view>
</template>
<script setup>
import {
ref,
reactive,
onMounted
} from 'vue';
// import registermember from './components/registermember.vue'
import {
APIuseractivate,
APIusershopInfodetail,
APIshopUserInfo
} from '@/common/api/member.js'
//
import {
Memberpay
} from '@/stores/pay.js';
const store = Memberpay();
const cardManageList = [{
name: "明细",
url: "member/billDetails",
icon: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/detail.png"
},
{
name: "管理",
url: "member/storedManage",
icon: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/manage.png"
}
]
const infoForn = reactive({
inputshow: 0,
memberOpen: false,
isProtocol: false,
listdata: [],
amount: 0,
giftAmount: 0,
shopUserInfo: {},
shopId: '',
giftList: [],
type: "",
userInfo: ''
})
// *
const paygetActive = async () => {
let res = await APIuseractivate({
shopId: infoForn.shopId,
page: 1,
pageSize: 99
})
try {
infoForn.listdata = res;
infoForn.giftList = infoForn.listdata[0].gives;
infoForn.giftAmount = infoForn.listdata[0].giftAmount
if (infoForn.type == 'topUpActivity') {
infoForn.amountChange()
} else {
infoForn.amount = infoForn.listdata[0].amount;
}
} catch (e) {
//TODO handle the exception
}
}
// *
const openLocation = () => {
uni.openLocation({
latitude: Number(infoForn.shopUserInfo.lat), // -90~90
longitude: Number(infoForn.shopUserInfo.lng), // -180~180
scale: 18, // 5~18
name: infoForn.shopUserInfo.shopName, //
address: infoForn.shopUserInfo.address, //
success() {
console.log('导航启动成功');
},
fail(error) {
console.log('导航启动失败', error);
if (error.errMsg == "openLocation:fail invalid_coordinate") {
uni.showToast({
title: "门店经纬度无效",
icon: 'none'
});
}
}
});
}
//
const amountChange = () => {
let item = infoForn.listdata.filter(item => infoForn.amount == item.amount)
if (item.length > 0) {
infoForn.listdata.forEach((v, e) => {
if (infoForn.amount == v.amount) {
infoForn.inputshow = e;
infoForn.clickinput(v, e)
}
})
} else {
infoForn.inputshow = '';
infoForn.giftList = [];
infoForn.giftAmount = '';
}
}
const shopInfo = async () => {
let res = await this.api.shopUserInfo({
shopId: this.shopId,
userId: uni.cache.get('userInfo').id,
})
if (res.code == 0) {
infoForn.shopUserInfo = res.data;
uni.cache.remove('memberOpen', this.memberOpen)
if (infoForn.shopUserInfo.isVip == 0) {
this.memberOpen = true;
uni.cache.set('memberOpen', this.memberOpen)
}
} else {
let pages = getCurrentPages()
if (pages.length > 1) {
uni.navigateBack()
} else {
setTimeout(res => {
uni.exitMiniProgram({
success: function() {
console.log('退出小程序成功');
},
fail: function(err) {
console.log('退出小程序失败', err);
}
})
}, 500)
}
}
}
// * \
const handleClick = (item) => {
uni.navigateTo({
url: `/pages/${item.url}?shopUserInfo=${JSON.stringify(infoForn.shopUserInfo)}`
})
}
// *
const radioChange = (n) => {
infoForn.isProtocol = n;
}
//
const viewProtocol = () => {
wx.openPrivacyContract({
success: () => {}, //
fail: () => {}, //
complete: () => {}
})
}
//
const getRegisterMember = (e) => {
infoForn.memberOpen = e;
this.shopInfo();
this.paygetActive()
}
//
const getQueryString = (url, name) => {
var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
var r = url.substr(1).match(reg)
if (r != null) {
return r[2]
}
return null;
}
//
const clickinput = (a, b) => {
infoForn.inputshow = b;
infoForn.giftList = a.gives;
infoForn.amount = a.amount;
infoForn.giftAmount = a.giftAmount;
}
//
const userbalancerechangesub = async () => {
if (!infoForn.isProtocol) {
uni.showToast({
title: '请勾选协议',
icon: 'none'
});
return false;
}
console.log(infoForn.amount)
if (infoForn.amount == null || infoForn.amount == '') {
uni.showToast({
title: '金额不能为空',
icon: 'none'
});
return false;
}
if (infoForn.amount <= 0) {
uni.showToast({
title: '金额必须大于0',
icon: 'none'
});
return false;
}
let res = await store.actionspayltPayVip({
shopId: infoForn.shopId,
shopUserId: infoForn.userInfo.id,
amount: infoForn.amount, //
returnUrl: '', //
buyerRemark: ''
})
console.log(res)
}
onMounted(async () => {
//
const pages = getCurrentPages();
//
const currentPage = pages[pages.length - 1];
//
const options = currentPage.options;
// // #ifdef MP-WEIXIN
// if (options.q) {
// infoForn.shopId = this.getQueryString(decodeURIComponent(options.q), 'shopId')
// uni.cache.set('shopId', infoForn.shopId)
// this.tokenShow = false;
// }
// // #endif
// // #ifdef MP-ALIPAY
// if (getApp().globalData.shopId) {
// infoForn.shopId = getApp().globalData.shopId
// }
// uni.cache.set('shopId', infoForn.shopId)
// // #endif
if (options.shopId) {
infoForn.shopId = options.shopId ? options.shopId : uni.cache.get('shopId')
let resone = await APIusershopInfodetail({
shopId: options.shopId
})
infoForn.shopUserInfo = resone.shopInfo
// shopInfo
infoForn.userInfo = await APIshopUserInfo({
shopId: options.shopId
})
// shopUserInfo.shopExtend = res.shopExtend.member_bg
}
if (options.type) {
infoForn.type = options.type
}
if (options.amount) {
infoForn.amount = options.amount;
}
paygetActive()
})
</script>
<style lang="scss">
page {
background: #F9F9F9;
}
.content {
padding: 16rpx 20rpx 245rpx 20rpx;
.location {
display: flex;
align-items: center;
background-color: #fff;
padding: 16rpx 28rpx 18rpx 28rpx;
margin-bottom: 32rpx;
border-radius: 12rpx;
font-weight: 400;
font-size: 28rpx;
color: #333333;
.location_icon {
width: 20rpx;
height: 26rpx;
margin-right: 20rpx;
}
}
.card_info {
width: 100%;
height: 182rpx;
background: linear-gradient(132deg, #D6B68D 0%, #E6D6BC 100%);
border-radius: 12rpx;
padding: 32rpx 28rpx;
align-items: initial;
margin-bottom: 26rpx;
.title {
font-weight: 500;
font-size: 32rpx;
color: #333333;
}
.card_info_con {
align-items: flex-end;
.balance {
font-weight: 400;
font-size: 48rpx;
color: #333333;
}
.card_info_con_right {
.card_info_con_right_item {
margin-left: 64rpx;
.card_info_con_right_item_icon {
width: 40rpx;
height: 36rpx;
margin-bottom: 5rpx;
}
.card_info_con_right_item_text {
font-weight: 400;
font-size: 24rpx;
color: #333333;
}
}
}
}
}
.customAmount {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 32rpx;
padding: 22rpx 16rpx 22rpx 32rpx;
background-color: #fff;
border-radius: 8rpx;
.customAmount_left {
width: 100%;
display: flex;
align-items: center;
.customAmount_left_tip {
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
input {
width: 100%;
font-weight: 500;
font-size: 24rpx;
color: #333;
padding-left: 16rpx;
}
}
.customAmount_right {
font-weight: 500;
font-size: 28rpx;
color: #666666;
flex-shrink: 0;
}
}
.rechargeList {
width: 100%;
display: flex;
flex-wrap: wrap;
.rechargeList_f {
width: 33.333%;
margin-bottom: 30rpx;
padding-right: 20rpx;
padding-left: 0;
.rechargeList_item {
border-radius: 0rpx 48rpx 0rpx 0rpx;
border: 4rpx solid #E5E5E5;
align-items: initial;
padding: 26rpx 22rpx;
justify-content: space-between;
position: relative;
.rechargeList_item_title {
margin-bottom: 20rpx;
}
.rechargeList_item_title,
.rechargeList_item_handsel {
font-weight: 400;
font-size: 20rpx;
color: #999999;
}
.rechargeList_item_amount {
font-weight: bold;
font-size: 28rpx;
color: #666666;
text {
font-size: 44rpx;
font-weight: bold;
color: #666666;
}
}
.rechargeList_item_handsel {}
.rechargeList_item_gift {
width: 92.52rpx;
height: 88.74rpx;
position: absolute;
top: 12rpx;
right: 12rpx;
.rechargeList_item_gift_bg {
width: 92.52rpx;
height: 88.74rpx;
position: absolute;
}
.rechargeList_item_gift_text {
width: 92.52rpx;
height: 88.74rpx;
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text:nth-child(1) {
font-weight: bold;
font-size: 20rpx;
color: #fff;
}
text:nth-child(2) {
font-weight: 400;
font-size: 24rpx;
color: #fff;
}
}
}
}
.rechargeList_item.active {
border: 4rpx solid #DCC19E;
background: linear-gradient(133deg, #F9F6ED 0%, #FFFFFF 100%);
.rechargeList_item_title {
color: #F7664E;
margin-bottom: 47rpx;
}
.rechargeList_item_amount {
font-weight: bold;
font-size: 28rpx;
color: #FB604A;
text {
font-size: 44rpx;
font-weight: bold;
color: #FB604A;
}
}
}
}
.rechargeList_f:nth-child(3n-1) {
padding-right: 10rpx;
padding-left: 10rpx;
}
.rechargeList_f:nth-child(3n) {
padding-right: 0;
padding-left: 20rpx;
}
}
.gift {
display: flex;
flex-direction: column;
padding: 0 22rpx;
margin-bottom: 48rpx;
.gift_title {
font-weight: bold;
font-size: 32rpx;
color: #333333;
margin-bottom: 16rpx;
}
.gift_list {
display: flex;
flex-direction: column;
.gift_list_item {
display: flex;
align-items: center;
.icon {
width: 24rpx;
height: 24rpx;
border-radius: 50%;
background-color: #F7853D;
margin-right: 8rpx;
flex-shrink: 0;
}
.text {
font-weight: 400;
font-size: 28rpx;
color: #333333;
}
}
}
}
.explain {
background-color: #fff;
border-radius: 12rpx;
display: flex;
flex-direction: column;
padding: 22rpx 24rpx;
margin-bottom: 30rpx;
.explain-top {
// align-items: center;
margin-bottom: 18rpx;
.explain-top_title {
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.shopName {
font-weight: 400;
font-size: 24rpx;
color: #333333;
}
}
.explain_content {
display: flex;
flex-direction: column;
.explain_content_title {
font-weight: bold;
font-size: 32rpx;
color: #333333;
margin-bottom: 20rpx;
}
.explain_content_text {
font-weight: 400;
font-size: 24rpx;
color: #666666;
margin-bottom: 14rpx;
}
}
}
.rechargeBox {
width: 100%;
padding: 0 28rpx 84rpx 28rpx;
background-color: #fff;
position: fixed;
left: 0;
bottom: 0;
.agreement {
display: flex;
align-items: center;
justify-content: center;
padding-top: 16rpx;
padding-bottom: 20rpx;
text {
font-size: 24rpx;
}
.agreement_text {
color: #E3AD7F;
}
}
.recharge {
width: 100%;
height: 90rpx;
line-height: 90rpx;
text-align: center;
font-weight: bold;
font-size: 36rpx;
color: #FFFFFF;
border-radius: 12rpx;
background: #E3AD7F;
}
}
}
</style>

View File

@ -0,0 +1,136 @@
<template>
<view class="container">
<view class="list">
<view class="list_item" @click="handleClick(item)" v-for="(item,index) in list" :key="index">
<view class="list_item_title">{{ item.title }}</view>
<view class="list-cell">
<view class="list-cell-item" v-for="(item1,index1) in item.list" :key="index1">
<view class="list-cell-item-title"> {{ item1.title }}</view>
<view class="list-cell-item-content">
<view class="list-cell-item-content-text" v-for="(item2,index2) in item1.list" :key="index2">{{item2}}</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
userInfo: null,
list: [
{
title: "充值规则",
list: [
{
title: "满赠规则",
list: [
"充300元送15元0积分+0元券",
"充500元送40元0积分+0元券",
"充1000元送100元0积分+0元券",
]
},
{
title: "适用门店",
list: [
"适用于1家门店",
]
},
],
},
{
title: "使用规则",
list: [
{
title: "使用须知",
list: [
"按比例",
]
},
{
title: "免密支付",
list: [
"免密支付已开通",
]
},
{
title: "适用商品",
list: [
"全部商品可用",
]
},
],
},
]
}
},
onLoad(e) {
this.userInfo = e
},
methods: {
/**
* 跳转
*/
handleClick ( item ) {
uni.pro.navigateTo(item.url, this.userInfo)
}
}
}
</script>
<style lang="less">
page{
background-color: #fff;
}
.container{
padding: 48rpx 20rpx;
.list{
display: flex;
flex-direction: column;
.list_item{
display: flex;
flex-direction: column;
margin-bottom: 32rpx;
.list_item_title{
font-weight: bold;
font-size: 32rpx;
color: #333333;
margin-bottom: 32rpx;
}
.list-cell{
display: flex;
flex-direction: column;
.list-cell-item{
display: flex;
flex-direction: column;
border-bottom: 2rpx solid #E5E5E5;
padding-bottom: 32rpx;
margin-bottom: 32rpx;
.list-cell-item-title{
font-weight: bold;
font-size: 28rpx;
color: #333333;
margin-bottom: 16rpx;
}
.list-cell-item-content{
display: flex;
flex-direction: column;
.list-cell-item-content-text{
font-weight: 400;
font-size: 24rpx;
color: #999999;
}
}
}
}
}
.list_item:last-child .list-cell-item:last-child{
border-bottom: none;
}
}
}
</style>

207
pages/user/member/list.vue Normal file
View File

@ -0,0 +1,207 @@
<template>
<view class="content">
<view class="onecontentone">
我的会员卡<text v-if="orderForm.list.length!=0">({{orderForm.list.length}})</text>
</view>
<view class="flex-colum">
<view class="towcontentitem" v-if="orderForm.list.length>0" v-for="(item,index) in orderForm.list"
:key="index" @click="eeInfo(item)">
<image class="towcontentitemimage"
src="https://ointmentweapp.oss-cn-beijing.aliyuncs.com/my/recharge.png" mode="aspectFill"></image>
<view class="towcontentitemone flex-start">
<image class="towcontentitemoneimage" :src="item.logo" mode="aspectFill"></image>
<text class="towcontentitemonetext" style="color: #333333;">{{item.chainName}}</text>
<!-- 余额<text class="towcontentitemtheretext">{{userInfo.amount || '0.00'}}</text> -->
</view>
<view class="towcontentitemtow flex-between">
<text class="towcontentitemtowetext" style="color:#333333;">余额:{{item.amount}}</text>
<text>{{item.shopName}}</text>
</view>
</view>
</view>
<view v-if="orderForm.list.length <= 0 && orderForm.is_end" class="flex-colum">
<image style="width: 402rpx;height: 442rpx;margin:240rpx auto 32rpx;"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/nomore.png" mode="aspectFill"></image>
</view>
<up-loadmore :status="orderForm.form.status" iconSize='12' fontSize='12' height='20' />
</view>
</template>
<script setup>
import {
ref,
reactive,
onMounted
} from 'vue';
import {
onReachBottom
} from '@dcloudio/uni-app'
import {
APIusershopUservipCard
} from '@/common/api/member.js'
const orderForm = reactive({
type: '', //
list: [],
is_end: false,
form: {
page: 1, //
size: 10, //
status: 'loadmore',
}
})
const paygetShopByMember = async () => {
let res = await APIusershopUservipCard({
page: orderForm.form.page,
pageSize: orderForm.form.size,
})
if (res.totalPage == 1 && res.totalRow <= 10) {
orderForm.form.status = 'nomore'
orderForm.list = res.records
if (orderForm.form.page == 1 && res.records.length == 0) {
orderForm.records = []
orderForm.is_end = true
}
return false;
} else {
orderForm.form.status = 'loading';
orderForm.list = [...orderForm.list, ...res.records];
orderForm.form.page = ++orderForm.form.page;
if (orderForm.form.page > res.totalPage) {
orderForm.form.status = 'nomore';
} else {
orderForm.form.status = 'loading';
}
}
}
const eeInfo = async (item) => {
// if (res.code == 0) {
// uni.cache.set('shopUserInfo', res)
// uni.cache.set('shopId', item.shopId)
if (orderForm.type && orderForm.type == 'user_payCode') {
uni.navigateTo({
url: '/pages/pay_code/pay_code?shopInfo=' + JSON.stringify(item)
})
} else if (orderForm.type && orderForm.type == 'user_recharge') {
uni.pro.navigateTo('member/index', {
shopId: item.shopId,
type: 'index',
})
} else if (orderForm.type && orderForm.type == 'user_points') {
uni.pro.navigateTo('/pagesPoints/index/index', {
shopId: item.shopId,
type: 'member_list',
})
} else {
uni.pro.navigateTo('user/member/memberdetails', {
shopId: item.shopId
})
}
}
onReachBottom(() => {
paygetShopByMember()
})
onMounted((e) => {
paygetShopByMember()
})
</script>
<style lang="scss">
page {
background: #FFFFFF;
}
.content {
border-top: 16rpx solid #f7f7f7;
padding: 28rpx;
padding-bottom: 40rpx;
.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;
}
}
.onecontentone {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.flex-colum {
.towcontentitem {
margin-top: 22rpx;
width: 96%;
position: relative;
height: 224rpx;
padding: 32rpx;
border-radius: 12rpx;
.towcontentitemimage {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
border-radius: 12rpx;
z-index: 9;
}
.towcontentitemone {
position: relative;
z-index: 10;
.towcontentitemoneimage {
width: 76rpx;
height: 76rpx;
border-radius: 50%;
}
.towcontentitemonetext {
width: 60%;
margin-left: 16rpx;
font-size: 32rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #422A07;
}
}
.towcontentitemtow {
z-index: 10;
position: absolute;
width: 100%;
left: 0;
bottom: 18rpx;
padding: 0 32rpx;
// margin-top: 52rpx;
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
}
}
}
</style>

View File

@ -0,0 +1,646 @@
<template>
<!-- 会员详情 -->
<view class="content">
<view class="card_info">
<image class="card_info_bg"
:src="shopUserInfo.shopExtend?shopUserInfo.shopExtend.value:'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_bg.png'"
mode="aspectFill"></image>
<view class="card_info_bg_box"></view>
<view class="card_content">
<view class="card_head">
<view class="card_head_left">
<image class="card_head_left_head"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_head.png"
mode="aspectFill"></image>
<text class="card_head_left_name">{{shopUserInfo.shopInfo.shopName||''}}会员卡</text>
<view class="card_head_left_icon_box" v-if="shopUserInfo.shopInfo.isVip != 0">
<image class="card_head_left_icon1"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_icon1.png"
mode="aspectFill"></image>
<text class="card_head_left_iconText">VL1</text>
</view>
</view>
<view class="card_head_right" @click="clickEvent" v-if="shopUserInfo.shopInfo.isVip != 0">
<image class="card_head_left_qrCode"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_qrCode.png"
mode="aspectFill"></image>
</view>
</view>
<view class="card_cen">
<view class="card_cen_left">{{ shopUserInfo.shopInfo.isVip == 0 ? '尚未开通会员暂无法享受会员权益' : '欢迎加入本店会员~'}}
</view>
<view class="card_cen_right" v-if="shopUserInfo.shopInfo.isVip != 0">查看特权</view>
</view>
<view class="card_bom" v-if="shopUserInfo.shopInfo.isVip != 0">
<view class="card_bom_item" @click="itemClick(1)">
<text>{{shopUserInfo.shopInfo.amount || '0.00'}}</text><text>储值</text>
</view>
<view class="card_bom_item">
<text>{{shopUserInfo.shopInfo.accountPoints || '0'}}</text><text>积分</text>
</view>
<view class="card_bom_item" @click="itemClick(3)">
<text>{{shopUserInfo.shopInfo.couponNum || '0'}}</text><text>优惠券</text>
</view>
<view class="card_bom_item">
<text>0</text><text>权益卡</text>
</view>
</view>
</view>
</view>
<view class="card_bottom" :class="shopUserInfo.shopInfo.isVip == 0 ? 'n' : ''">
<view class="card_bottom_Box" v-if="shopUserInfo.shopInfo.isVip != 0">
<view class="card_bottom_left flex-start">
<image class="card_bottom_head"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_head2.png"
mode="aspectFill"></image>
<view class="">
<view class="card_bottom_title">感谢你 2 天陪伴</view>
<view class="flex-start">
<view class="card_bottom_text">您今天的幸运词<text class="luckyWord">林波微步</text></view>
</view>
</view>
</view>
<image class="card_bottom_right_img"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_img3.png" mode="aspectFill">
</image>
</view>
<view class="card_bottom_Box" v-else>
<view class="card_bottom_equity">
<view class="card_bottom_equity_title">专享2项权益</view>
<view class="card_bottom_equity_list">
<view class="card_bottom_equity_list_item">
<image class="list_item_icon"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_icon01.png"
mode="aspectFill"></image>
<text class="list_item_text">会员专属活动</text>
</view>
<view class="card_bottom_equity_list_item">
<image class="list_item_icon"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/menber/member_icon02.png"
mode="aspectFill"></image>
<text class="list_item_text">福利商品</text>
</view>
</view>
</view>
</view>
</view>
<registermember :show="memberOpen" :shopUserInfo="shopUserInfo.shopInfo" @getRegisterMember="getRegisterMember">
</registermember>
</view>
</template>
<script setup>
import {
reactive,
ref,
onMounted
} from 'vue'
import {
APIusershopInfodetail,
APIshopUserInfo
} from '@/common/api/member.js'
import registermember from './components/registermember.vue'
const shopUserInfo = reactive({
shopInfo: {},
shopExtend: {},
shopId: ""
})
const form = reactive({
memberOpen: '',
shopName: "",
amount: '',
lucky: {
list: ['鸿运当头', "财运亨通", "时来运转", "否极泰来", "花逢时发"],
index: 0,
text: ""
},
})
const itemClick = (type) => {
if (type == 1) {
uni.pro.navigateTo('user/member/index', {
shopId: shopUserInfo.shopId,
type: 'index',
})
} else if (type == 3) {
uni.pro.navigateTo('user/coupon', {
shopId: shopUserInfo.shopId,
})
}
}
// *
const clickEvent = () => {
uni.navigateTo({
url: '/pages/pay_code/pay_code?shopInfo=' + JSON.stringify(this.shopUserInfo)
})
}
// *
const getRegisterMember = () => {
this.memberOpen = e;
this.init()
}
onMounted(async () => {
try {
//
const pages = getCurrentPages();
//
if (pages.length === 0) {
console.error('未获取到页面栈');
return;
}
//
const currentPage = pages[pages.length - 1];
//
const pageParams = currentPage.options;
console.log(pageParams, 169)
let res = await APIusershopInfodetail({
shopId: pageParams.shopId
})
// shopInfo
shopUserInfo.shopInfo = await APIshopUserInfo({
shopId: pageParams.shopId
})
shopUserInfo.shopExtend = res.shopExtend.member_bg
shopUserInfo.shopId = pageParams.shopId
} catch (error) {
console.error('获取页面参数时出错:', error);
}
})
</script>
<style lang="scss">
page {
background: #F9F9F9;
}
.content {
padding: 0 28rpx;
font-size: 12rpx;
.card_info {
width: 630rpx;
height: 304rpx;
margin: auto;
position: relative;
z-index: 2;
padding-top: 20rpx;
.card_info_bg {
width: 630rpx;
height: 304rpx;
position: absolute;
z-index: 1;
}
.card_info_bg_box {
width: 630rpx;
height: 304rpx;
position: absolute;
z-index: 1;
border-radius: 24rpx;
background-color: rgba(51, 51, 51, 0.5);
}
.card_content {
position: relative;
left: 0;
top: 0;
z-index: 2;
color: #fff;
padding: 30rpx;
.card_head {
display: flex;
align-items: center;
justify-content: space-between;
.card_head_left {
display: flex;
align-items: center;
.card_head_left_head {
width: 40rpx;
height: 40rpx;
margin-right: 16rpx;
}
.card_head_left_name {
font-weight: 400;
font-size: 32rpx;
color: #FFFFFF;
margin-right: 12rpx;
}
.card_head_left_icon_box {
width: 64.23rpx;
height: 26.56rpx;
position: relative;
display: flex;
align-items: center;
justify-content: center;
.card_head_left_icon1 {
width: 64.23rpx;
height: 26.56rpx;
position: absolute;
left: 0;
top: 0;
}
.card_head_left_iconText {
font-weight: bold;
font-size: 18rpx;
color: #FFFFFF;
position: relative;
z-index: 1;
}
}
}
.card_head_right {
width: 56rpx;
height: 56rpx;
border-radius: 50%;
background: #000000;
box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(0, 0, 0, 0.16);
display: flex;
justify-content: center;
align-items: center;
.card_head_left_qrCode {
width: 24rpx;
height: 24rpx;
}
}
}
.card_cen {
display: flex;
justify-content: space-between;
font-weight: 400;
font-size: 20rpx;
color: #FFFFFF;
margin-top: 20rpx;
}
.card_bom {
display: flex;
justify-content: space-between;
margin-top: 60rpx;
.card_bom_item {
width: 25%;
display: flex;
flex-direction: column;
align-items: center;
font-weight: 400;
text:nth-child(1) {
font-size: 30rpx;
color: #FFFFFF;
}
text:nth-child(2) {
font-size: 24rpx;
color: #FFFFFF;
}
}
}
}
}
.card_bottom {
width: 100%;
height: 280rpx;
background-color: #fff;
border-radius: 24rpx;
position: relative;
z-index: 1;
margin-top: -120rpx;
display: flex;
align-items: flex-end;
padding: 16rpx 42rpx;
.card_bottom_Box {
width: 100%;
display: flex;
justify-content: space-between;
align-items: flex-end;
.card_bottom_left {
margin-bottom: 16rpx;
}
.card_bottom_head {
width: 80rpx;
height: 80rpx;
margin-right: 14rpx;
}
.card_bottom_title {
font-weight: 400;
font-size: 32rpx;
color: #333333;
}
.card_bottom_text {
font-weight: 400;
font-size: 24rpx;
color: #999999;
margin-right: 8rpx;
}
.card_bottom_icon {
width: 22.7rpx;
height: 22.18rpx;
}
.card_bottom_right_img {
width: 132rpx;
height: 132rpx;
}
.card_bottom_equity {
display: flex;
flex-direction: column;
.card_bottom_equity_title {
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
.card_bottom_equity_list {
display: flex;
flex-wrap: wrap;
margin-top: 32rpx;
.card_bottom_equity_list_item {
display: flex;
flex-direction: column;
align-items: center;
margin-right: 56rpx;
.list_item_icon {
width: 52rpx;
height: 46rpx;
margin-bottom: 6rpx;
}
.list_item_text {
font-weight: 500;
font-size: 22rpx;
color: #333333;
}
}
}
}
}
}
.card_bottom.n {
padding: 24rpx 42rpx;
margin-top: -80rpx;
}
.towcontentitem {
width: 100%;
position: relative;
padding: 32rpx;
border-radius: 12rpx;
background: linear-gradient(126deg, #FFFBF2 0%, #F2D093 100%);
border-radius: 12rpx 12rpx 12rpx 12rpx;
&::after {
position: absolute;
bottom: 0;
right: 68rpx;
content: '';
display: inline-block;
width: 240rpx;
height: 232rpx;
background: url(https://czg-qr-order.oss-cn-beijing.aliyuncs.com/member.png) no-repeat;
background-size: 100% 100%;
}
.towcontentitemimage {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
border-radius: 12rpx;
z-index: 5;
}
.towcontentitemone {
width: 100%;
position: relative;
z-index: 9;
.towcontentitemoneimage {
width: 76rpx;
height: 76rpx;
border-radius: 50%;
}
.towcontentitemonetext {
height: 76rpx;
margin-left: 16rpx;
.towcontentitemonetextone {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 36rpx;
color: #333333;
}
.towcontentitemonetexttow {
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
}
}
.towcontentitemprogressa {
padding: 8rpx 44rpx;
z-index: 10;
position: relative;
margin-top: 54rpx;
}
.towcontentitemtow {
margin-top: 84rpx;
z-index: 10;
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
.towcontentitevip {
position: absolute;
right: 0;
top: 0;
width: 92rpx;
height: 40rpx;
font-size: 20rpx;
background: #F4C380;
border-radius: 0rpx 12rpx 0rpx 12rpx;
text-align: center;
line-height: 40rpx;
color: #fff;
font-family: Source Han Sans CN-Medium;
font-weight: Medium;
}
.towcontentitemthere {
margin-left: 92rpx;
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: Medium;
font-size: 24rpx;
color: #333333;
.towcontentitemtheretext {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
font-size: 36rpx;
color: #333333;
}
}
}
.therecontent {
margin-top: 32rpx;
position: relative;
padding: 22rpx 32rpx;
width: 100%;
background: #FFFFFF;
border-radius: 8rpx;
input {
padding-left: 30rpx;
text-align: right;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #666666;
}
}
.therecontent::after {
position: absolute;
top: 50%;
left: 32rpx;
transform: translateY(-50%);
content: '¥';
display: inline-block;
width: 28rpx;
height: 40rpx;
font-size: 28rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.fourcontent {
.fourcontentlnage {
width: 33.33%;
.fourcontentitem {
margin: 24rpx 10rpx;
padding: 16rpx 0;
text-align: center;
background: #FFFFFF;
border-radius: 8rpx;
border: 1rpx solid #333333;
font-size: 28rpx;
font-family: Roboto-Medium, Roboto;
font-weight: 500;
color: #333333;
}
.fourcontentitems {
margin: 24rpx 10rpx;
padding: 16rpx 0;
text-align: center;
border-radius: 8rpx;
background: #F1CB66;
border-radius: 8rpx 8rpx 8rpx 8rpx;
border: 2rpx solid #F1CB66;
font-size: 28rpx;
font-family: Roboto-Medium, Roboto;
font-weight: 500;
color: #FFFFFF;
}
}
}
.fivecontent {
position: relative;
bottom: 44rpx;
margin-top: 62rpx;
padding: 20rpx 0;
text-align: center;
width: 100%;
font-size: 36rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
border-radius: 8rpx;
background: #F1CB66;
}
//
.memberdetailsStyle {
margin-top: 32rpx;
border-radius: 24rpx 24rpx 24rpx 24rpx;
background-color: #fff;
padding: 32rpx;
height: 252rpx;
display: flex;
justify-content: space-between;
flex-direction: column;
>text {
font-weight: bold;
font-size: 32rpx;
color: #333333;
}
>view {
font-weight: 400;
font-size: 28rpx;
color: #333333;
display: flex;
justify-content: space-between;
align-items: center;
}
}
}
</style>

View File

@ -0,0 +1,399 @@
<template>
<view class="content">
<view class="towcontentitem">
<image class="towcontentitemimage" :src="data.img" mode="aspectFill"></image>
<view class="fourcontentitemabsolute">
<!-- 年卡会员 -->
</view>
<view class="towcontentitemone flex-start">
<image class="towcontentitemoneimage" :src="data.store_avatar" mode="aspectFill"></image>
<view class="towcontentitemonetext flex-colum-start">
<text class="towcontentitemonetextone">{{data.title}}</text>
<text class="towcontentitemonetexttow">{{data.show}}</text>
</view>
<view class="towcontentitemoneabsolute" @click="overlayshow = true">
加购
</view>
</view>
<view class="towcontentitemprogress">
{{Number(data.user_sec_y_frequ)}}/{{Number(data.user_sec_z_frequ)}}
</view>
<view class="towcontentitemtow flex-between">
<text class="towcontentitemtowetext">{{data.vip_number || ''}}</text>
<text class="towcontentitemtowetext">{{data.end_time}}</text>
</view>
</view>
<view class="therecontentitem">
<view class="therecontentitemtext">
会员详情
</view>
<view class="therecontentitemone">
<!-- <view class="therecontentitemoneiten flex-between" @click="order">
<text class="therecontentitemoneitentetxt">账单明细</text>
<u-icon name="arrow-right" color="#808080" size="18"></u-icon>
</view> -->
<view class="therecontentitemoneiten flex-between" @click="overlayshow = true">
<text class="therecontentitemoneitentetxt">订单明细</text>
<u-icon name="arrow-right" color="#808080" size="18"></u-icon>
</view>
</view>
</view>
<u-overlay :show="overlayshow" @click="overlayshow = false">
<view class="warp">
<view class="rect" @tap.stop>
<view class="onerect flex-center">
<view>{{data.store_title}}</view>
<u-icon @click="overlayshow = false" class="onerecticon" name="backspace" color="#000000"
size="28"></u-icon>
</view>
<view class="towrect">
商品
</view>
<view class="thererect flex-between">
<view class="thererectone">
{{data.title}}
</view>
<view class="thererecttow">
<text></text>{{data.price}}
</view>
</view>
<view class="fourrect flex-between">
<view class="fourrectone">
<text>共计:</text>{{data.price}}
</view>
<view class="fourrecttow" @tap="$u.debounce(showpopupclick,1000)">
立即购买
</view>
</view>
</view>
</view>
</u-overlay>
</view>
</template>
<script>
export default {
data() {
return {
overlayshow: false,
numberbox: "",
data: {}
}
},
async onLoad(e) {
console.log(e)
let res = await this.api.reservationvipdetail({
id: e.id
})
this.data = res
console.log(this.data)
},
methods: {
async showpopupclick() {
try {
let res = await this.api.useropenuserseccrd({
id: this.data.id
}) //
if (res) {
// #ifdef MP-WEIXIN
uni.requestPayment({
provider: 'wxpay', //-
partnerid: res.payAppId, //
timeStamp: res.payTimeStamp, //
nonceStr: res.paynonceStr, //
package: res.payPackage, //
signType: res.paySignType, //
paySign: res.paySign, //
success: (res) => {
uni.showToast({
title: "支付成功"
})
uni.redirectTo({
url: "/my/member/index?e=" + 1,
});
},
fail: (err) => {
setTimeout(res => {
uni.showToast({
icon: 'none',
title: '支付失败'
})
uni.hideLoading()
}, 2000)
uni.redirectTo({
url: "/my/member/index?e=" + 1,
});
}
});
// #endif
}
} catch (e) {
//TODO handle the exception
}
},
order(e) {
uni.pro.navigateTo('my/order/index', {
e: 0
})
}
}
}
</script>
<style lang="scss">
page {
background: #F9F9F9;
}
.content {
padding: 32rpx 28rpx;
.towcontentitem {
margin-top: 22rpx;
width: 100%;
position: relative;
padding: 32rpx;
border-radius: 12rpx;
.fourcontentitemabsolute {
z-index: 9;
position: absolute;
right: 0;
top: 0;
padding: 6rpx 28rpx;
font-size: 20rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
text-shadow: 0px 6rpx 12rpx rgba(255, 255, 255, 0.19);
background: linear-gradient(NaNdeg, #4A4A4A 0%, #919191 100%);
border-radius: 0px 12rpx 0px 12rpx;
opacity: 1;
}
.towcontentitemimage {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
border-radius: 12rpx;
z-index: 0;
}
.towcontentitemone {
width: 100%;
position: relative;
z-index: 9;
.towcontentitemoneimage {
width: 76rpx;
height: 76rpx;
border-radius: 50%;
}
.towcontentitemoneabsolute {
position: absolute;
padding: 8rpx 44rpx;
right: 0;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
background: linear-gradient(130deg, #F4AE46 0%, #EE9437 100%);
box-shadow: 0px 4rpx 8rpx 2rpx rgba(243, 169, 67, 0.37);
border-radius: 28rpx;
}
.towcontentitemonetext {
width: 80%;
height: 76rpx;
margin-left: 16rpx;
.towcontentitemonetextone {
width: 80%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 32rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #422A07;
}
.towcontentitemonetexttow {
width: 80%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width:400rpx;
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
}
}
.towcontentitemprogressa {
padding: 8rpx 44rpx;
width: 50%;
z-index: 10;
position: relative;
margin-top: 54rpx;
}
.towcontentitemprogress {
position: relative;
z-index: 99;
margin-top: 24rpx;
border-radius: 28rpx;
font-size: 28rpx;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #000;
}
.towcontentitemtow {
z-index: 10;
position: relative;
margin-top: 68rpx;
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
}
.therecontentitem {
margin-top: 32rpx;
width: 100%;
padding: 32rpx 32rpx 0 32rpx;
background: #FFFFFF;
border-radius: 24rpx;
.therecontentitemtext {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.therecontentitemone {
.therecontentitemoneiten:nth-child(1) {
border-top: none !important;
}
.therecontentitemoneiten {
padding: 32rpx 0;
border-top: 1px solid #F7F7F7;
.therecontentitemoneitentetxt {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
}
}
}
}
.warp {
position: relative;
height: 100%;
.rect {
position: absolute;
bottom: 0;
width: 100%;
background: #FFFFFF;
border-radius: 60rpx 60rpx 0px 0px;
padding: 48rpx 32rpx 32rpx 32rpx;
.onerect {
position: relative;
padding-bottom: 48rpx;
image {
width: 124rpx;
height: 124rpx;
}
view {
margin-left: 16rpx;
font-size: 32rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #1A1A1A;
}
.onerecticon {
position: absolute;
top: 0;
right: 0;
}
}
.towrect {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.thererect {
margin-top: 16rpx;
.thererectone {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
}
.thererecttow {
text {
font-size: 16rpx;
}
font-size: 32rpx;
font-family: PingFang SC-Heavy,
PingFang SC;
font-weight: 800;
color: #333333;
}
}
.fourrect {
margin-top: 44rpx;
.fourrectone {
text {
font-size: 24rpx;
color: #333333;
}
font-size: 40rpx;
font-family: PingFang SC-Bold,
PingFang SC;
font-weight: bold;
color: #FC5F69;
}
.fourrecttow {
background: linear-gradient(143deg, #8689AF 0%, #494A5F 100%);
border-radius: 34rpx;
padding: 10rpx 44rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
}
}
}
}
}
</style>

View File

@ -0,0 +1,600 @@
<template>
<view class="content" :style="[theme]">
<view class="towcontentitem">
<image class="towcontentitemimage" :src="data.img" mode="aspectFill"></image>
<view class="towcontentitemone flex-start">
<view class="towcontentitemonetext flex-colum-start">
<text class="towcontentitemonetextone" style="color: #fff;">{{data.title}}</text>
<text class="towcontentitemonetexttow" style="color: #fff;">{{data.show}}</text>
</view>
</view>
<view class="towcontentitemtow flex-between">
<text class="towcontentitemtowetext" style="color: #fff;">{{data.price}}<text
class="towcontentitemtowetexts" style="color: #fff;">/{{data.frequ}}</text></text>
<text class="towcontentitemtowetext_s" style="color: #fff;">{{data.end_time}}</text>
</view>
</view>
<view class="therecontentitem">
<view class="therecontentitemtext">
商品
</view>
<view class="therecontentitemtextitem flex-between">
<view class="therecontentitemtextitem_left">
{{data.title}}
</view>
<view class="therecontentitemtextitem_right">
{{data.price}}
</view>
</view>
<view class="therecontentitemtextitemt_one">
{{data.show}}
</view>
<view class="therecontentitemtext" style="margin-top: 14rpx;">
权益
</view>
<view class="therecontentitemtextitemt_one">
<text style="color: #333333;">{{data.frequ}}</text>{{data.show}}
</view>
</view>
<view class="therecontentitem">
<view class="therecontentitem_tow flex-start">
手机号码<text>{{data.mobile}}</text>
</view>
<view class="therecontentitem_tows">
该号码不会提供给商家仅用于接收平台通知信息
</view>
</view>
<view class="therecontentitem">
<view class="therecontentitemtext">
使用说明
</view>
<view class="therecontentitemtextthere" style="margin-top: 14rpx;margin-bottom: 30rpx;"
v-html="data.notice">
</view>
</view>
<view class="fixedview flex-between">
<view class="fixedview_one flex-start">
<view class="fixedview_oneone">
应付金额
</view>
<view class="fixedview_onetow flex-colum-start">
<text>{{data.price}}</text>
</view>
</view>
<view v-if="mobile" class="fixedview_tow" @tap="$u.debounce(showpopupclick,1000)">
立即付款
</view>
<view v-else class="fixedview_tow">
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
立即付款
</button>
</view>
</view>
<u-overlay :show="overlayshow" @click="overlayshow = false">
<view class="warp">
<view class="rect" @tap.stop>
<view class="onerect flex-center">
<view>洗剪吹新娘造型</view>
<u-icon @click="overlayshow = false" class="onerecticon" name="backspace" color="#000000"
size="28"></u-icon>
</view>
<view class="towrect">
商品
</view>
<view class="thererect flex-between">
<view class="thererectone">
年卡会员
</view>
<view class="thererecttow">
<text></text>300
</view>
</view>
<view class="fourrect flex-between">
<view class="fourrectone">
<text>共计:</text>300
</view>
<view class="fourrecttow">
立即购买
</view>
</view>
</view>
</view>
</u-overlay>
</view>
</template>
<script>
export default {
data() {
return {
mobile: uni.cache.get('loginuser').userinfo.mobile,
overlayshow: false,
numberbox: "",
data: {
mobile: ''
}
}
},
computed: {
theme() {
return this.$store.getters.theme
},
},
async onLoad(e) {
console.log(e)
let res = await this.api.reservationvipdetail({
id: e.id
})
try {
this.data = res
this.data.notice = res.notice.replace(/\<img/g, '<img style="max-width:100%;height:auto" ');
this.data.mobile = uni.cache.get('loginuser').userinfo.mobile
} catch (e) {
//TODO handle the exception
}
},
async onShow() {
this.$store.dispatch('storeuseruserinfo')
},
mounted() {
var query = uni.createSelectorQuery().in(this).select('.fixedview')
query.boundingClientRect(ele => {
var that = this;
uni.getSystemInfo({
success(res) {
that.height = (ele.height) + "px";
that = null;
}
})
}).exec();
},
methods: {
async getPhoneNumber(res) { //
var resdataa = res
// #ifdef MP-WEIXIN
uni.login({
provider: 'weixin',
success: async (data) => {
let resdata = await this.api.usergetwechatphone({
code: data.code,
iv: resdataa.detail.iv,
encryptedData: resdataa.detail.encryptedData
})
try {
this.mobile = resdata.mobile
} catch (e) {
uni.showToast({
title: '获取失败'
})
}
}
});
// #endif
},
async showpopupclick() {
try {
let res = await this.api.useropenuserseccrd({
id: this.data.id
}) //
if (res) {
// #ifdef MP-WEIXIN
uni.requestPayment({
provider: 'wxpay', //-
partnerid: res.payAppId, //
timeStamp: res.payTimeStamp, //
nonceStr: res.paynonceStr, //
package: res.payPackage, //
signType: res.paySignType, //
paySign: res.paySign, //
success: (res) => {
uni.showToast({
title: "支付成功"
})
uni.redirectTo({
url: "/my/member/index?e=" + 1,
});
},
fail: (err) => {
setTimeout(res => {
uni.showToast({
icon: 'none',
title: '支付失败'
})
uni.hideLoading()
}, 2000)
uni.redirectTo({
url: "/my/member/index?e=" + 1,
});
}
});
// #endif
}
} catch (e) {
//TODO handle the exception
}
},
order(e) {
uni.pro.navigateTo('my/order/index', {
e: 0
})
}
}
}
</script>
<style lang="scss">
page {
background: #F9F9F9;
}
.content {
padding: 32rpx 28rpx;
.towcontentitem {
margin-top: 22rpx;
width: 100%;
position: relative;
padding: 32rpx;
border-radius: 12rpx;
.fourcontentitemabsolute {
z-index: 9;
position: absolute;
right: 0;
top: 0;
padding: 6rpx 28rpx;
font-size: 20rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
text-shadow: 0px 6rpx 12rpx rgba(255, 255, 255, 0.19);
background: linear-gradient(NaNdeg, #4A4A4A 0%, #919191 100%);
border-radius: 0px 12rpx 0px 12rpx;
opacity: 1;
}
.towcontentitemimage {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
border-radius: 12rpx;
z-index: 5;
}
.towcontentitemone {
width: 100%;
position: relative;
z-index: 9;
.towcontentitemoneimage {
width: 76rpx;
height: 76rpx;
}
.towcontentitemoneabsolute {
position: absolute;
padding: 8rpx 44rpx;
right: 0;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
background: linear-gradient(130deg, #F4AE46 0%, #EE9437 100%);
box-shadow: 0px 4rpx 8rpx 2rpx rgba(243, 169, 67, 0.37);
border-radius: 28rpx;
}
.towcontentitemonetext {
margin-left: 16rpx;
.towcontentitemonetextone {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 32rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #422A07;
}
.towcontentitemonetexttow {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-top: 16rpx;
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
}
}
.towcontentitemprogressa {
padding: 8rpx 44rpx;
width: 50%;
z-index: 10;
position: relative;
margin-top: 54rpx;
}
.towcontentitemprogress {
margin-top: 24rpx;
background: linear-gradient(318deg, #6E6E6E 0%, #404040 100%);
box-shadow: 0px 4rpx 8rpx 2rpx #8D8D8D;
border-radius: 28rpx;
font-size: 28rpx;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #FFFFFF;
}
.towcontentitemtow {
z-index: 10;
position: relative;
margin-top: 68rpx;
font-size: 24rpx;
.towcontentitemtowetext {
font-size: 30rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: bold;
color: #333333;
.towcontentitemtowetexts {
font-size: 20rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #333333;
}
}
.towcontentitemtowetext_s {
font-size: 24rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #333333;
}
}
}
.therecontentitem {
margin-top: 32rpx;
width: 100%;
padding: 32rpx 32rpx 0 32rpx;
background: #FFFFFF;
border-radius: 12rpx;
.therecontentitem_tow {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #999999;
text {
margin-left: 20rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
}
.therecontentitem_tows {
margin-top: 16rpx;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #999999;
padding-bottom: 30rpx;
}
.therecontentitemtext {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.therecontentitemtextthere {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
}
.therecontentitemtextitem {
margin-top: 24rpx;
.therecontentitemtextitem_left {
font-size: 28rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.therecontentitemtextitem_right {
font-size: 32rpx;
font-family: Roboto-Bold, Roboto;
font-weight: bold;
color: #333333;
}
}
.therecontentitemtextitemt_one {
margin-top: 6rpx;
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
padding-bottom: 16rpx;
border-bottom: 1rpx dashed #F7F7F7;
}
}
.fixedview {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
padding: 24rpx 28rpx;
background: #FFFFFF;
.fixedview_one {
.fixedview_oneone {
font-size: 28rpx;
font-family: SourceHanSansCN-Bold-, SourceHanSansCN-Bold;
font-weight: normal;
color: #333333;
}
.fixedview_onetow {
font-size: 44rpx;
font-family: SourceHanSansCN-Bold-, SourceHanSansCN-Bold;
font-weight: normal;
color: #F45C4C;
font-weight: bold;
text {
font-size: 28rpx;
}
}
}
.fixedview_tow {
background: var(--bg-color-button);
border-radius: 34rpx;
padding: 10rpx 44rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
button::after {
border-radius: 34rpx;
padding: 0 !important;
margin: 0 !important;
}
button {
background-color: var(--bg-color-button) !important;
padding: 0 !important;
line-height: inherit !important;
margin: 0 !important;
width: auto !important;
font-weight: 500 !important;
border-radius: none !important;
color: #FFFFFF;
}
}
}
.warp {
position: relative;
height: 100%;
.rect {
position: absolute;
bottom: 0;
width: 100%;
background: #FFFFFF;
border-radius: 60rpx 60rpx 0px 0px;
padding: 48rpx 32rpx 32rpx 32rpx;
.onerect {
position: relative;
padding-bottom: 48rpx;
image {
width: 124rpx;
height: 124rpx;
}
view {
margin-left: 16rpx;
font-size: 32rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #1A1A1A;
}
.onerecticon {
position: absolute;
top: 0;
right: 0;
}
}
.towrect {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #333333;
}
.thererect {
margin-top: 16rpx;
.thererectone {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
}
.thererecttow {
text {
font-size: 16rpx;
}
font-size: 32rpx;
font-family: PingFang SC-Heavy,
PingFang SC;
font-weight: 800;
color: #333333;
}
}
.fourrect {
margin-top: 44rpx;
.fourrectone {
text {
font-size: 24rpx;
color: #333333;
}
font-size: 40rpx;
font-family: PingFang SC-Bold,
PingFang SC;
font-weight: bold;
color: #FC5F69;
}
.fourrecttow {
background: linear-gradient(143deg, #8689AF 0%, #494A5F 100%);
border-radius: 34rpx;
padding: 10rpx 44rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
}
}
}
}
}
</style>

View File

@ -0,0 +1,339 @@
<template>
<view class="content" :style="[theme]">
<view class="towcontentitem">
<image class="towcontentitemimage" src="https://ointmentweapp.oss-cn-beijing.aliyuncs.com/my/recharges.png"
mode="widthFix"></image>
<!-- <view class="fourcontentitemabsolute">
{{memberlist.store_title}}
</view> -->
<view class="towcontentitemone flex-start">
<image class="towcontentitemoneimage" :src="memberlist.store_avatar" mode="aspectFill"></image>
<view class="towcontentitemonetext flex-colum-start">
<text class="towcontentitemonetextone">{{nickname || '暂无昵称'}}</text>
</view>
</view>
<view class="towcontentitemprogress">
可用余额:{{memberlist.money || '0.00'}}
<!-- <text style="font-size: 16rpx; color:#000 ; margin-left: 10rpx;">冻结金额:{{memberlist.freeze_money}}</text> -->
<!-- <view class="towcontentitemoneabsolute">
加购
</view> -->
</view>
<view class="towcontentitemtow flex-between">
<text class="towcontentitemtowetext">{{memberlist.vip_number}}</text>
<!-- <text class="towcontentitemtowetext" style="color: #fff;">保洁清洗卡</text> -->
</view>
</view>
<view class="therecontent">
<input type="number" v-model="amount" placeholder="自定义金额">
</view>
<view class="fourcontent flex-start">
<view class="fourcontentlnage" v-for="(item,index) in listdata" :key="index">
<view class="flex-colum" :class="index == inputshow?'fourcontentitems':'fourcontentitem'"
@click="clickinput(item,index)">
<text>{{item.amount}}</text>
<text style="margin-top: 10rpx;">{{item.deliver}}</text>
</view>
</view>
</view>
<view class="fivecontent" @click="userbalancerechangesub">
立即充值
</view>
</view>
</template>
<script>
export default {
data() {
return {
nickname: uni.cache.get('loginuser').userinfo.nickname,
inputshow: 0,
memberlist: {},
listdata: [],
amount: '',
}
},
onLoad(e) {
// console.log(e)
// this.memberlist = e
this.useruserbalance()
},
onShow() {
this.userbalancerechange()
},
computed: {
theme() {
return this.$store.getters.theme
},
},
methods: {
async useruserbalance(){
let res = await this.api.useruserbalance({
store_id: uni.cache.get('store_id') // ,
})
this.memberlist = res
},
async userbalancerechange() {
let res = await this.api.userbalancerechange({
store_id: uni.cache.get('store_id') // ,
})
this.listdata = res
this.amount = res[0].amount
},
async userbalancerechangesub() {
if (this.amount == null || this.amount == '') {
uni.showToast({
title: '金额不能为空',
icon: 'none'
});
return false;
}
let res = await this.api.userbalancerechangesub({
amount: this.amount,
store_id: this.memberlist.store_id
})
if (res) {
// #ifdef MP-WEIXIN
uni.requestPayment({
provider: 'wxpay', //-
partnerid: res.payAppId, //
timeStamp: res.payTimeStamp, //
nonceStr: res.paynonceStr, //
package: res.payPackage, //
signType: res.paySignType, //
paySign: res.paySign, //
success: (res) => {
uni.showToast({
title: "支付成功"
})
uni.navigateBack()
},
fail: (err) => {
setTimeout(res => {
uni.showToast({
icon: 'none',
title: '支付失败'
})
uni.hideLoading()
}, 2000)
}
});
// #endif
}
},
clickinput(a, b) {
console.log(a, b)
this.inputshow = b
this.amount = a.amount
},
eeInfo(e) {
uni.pro.navigateTo('my/member/memberinfo', {
id: e,
})
},
}
}
</script>
<style lang="scss">
page {
background: #F9F9F9;
}
.content {
padding: 0 28rpx;
.towcontentitem {
width: 100%;
position: relative;
padding: 32rpx;
border-radius: 12rpx;
.fourcontentitemabsolute {
z-index: 9;
position: absolute;
right: 0;
top: 0;
padding: 6rpx 28rpx;
font-size: 20rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
text-shadow: 0px 6rpx 12rpx rgba(255, 255, 255, 0.19);
background: linear-gradient(NaNdeg, #4A4A4A 0%, #919191 100%);
border-radius: 0px 12rpx 0px 12rpx;
opacity: 1;
}
.towcontentitemimage {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
border-radius: 12rpx;
z-index: 5;
}
.towcontentitemone {
margin-top: 42rpx;
width: 100%;
position: relative;
z-index: 9;
.towcontentitemoneimage {
width: 76rpx;
height: 76rpx;
border-radius: 50%;
}
.towcontentitemonetext {
height: 76rpx;
margin-left: 16rpx;
.towcontentitemonetextone {
font-size: 32rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #422A07;
}
.towcontentitemonetexttow {
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
}
}
.towcontentitemprogressa {
padding: 8rpx 44rpx;
z-index: 10;
position: relative;
margin-top: 54rpx;
}
.towcontentitemprogress {
z-index: 10;
position: relative;
margin-top: 24rpx;
border-radius: 28rpx;
font-size: 32rpx;
height: 56rpx;
line-height: 56rpx;
font-family: Source Han Sans CN-Bold, Source Han Sans CN;
font-weight: bold;
color: #333;
.towcontentitemoneabsolute {
position: absolute;
padding: 0 44rpx;
height: 56rpx;
line-height: 56rpx;
top: 0;
right: 0;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
background: linear-gradient(130deg, #F4AE46 0%, #EE9437 100%);
box-shadow: 0px 4rpx 8rpx 2rpx rgba(243, 169, 67, 0.37);
border-radius: 28rpx;
}
}
.towcontentitemtow {
z-index: 10;
position: relative;
margin-top: 42rpx;
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #422A07;
}
}
.therecontent {
margin-top: 32rpx;
position: relative;
padding: 22rpx 32rpx;
width: 100%;
background: #FFFFFF;
border-radius: 8rpx;
input {
padding-left: 30rpx;
text-align: right;
font-size: 28rpx;
font-family: Source Han Sans CN-Medium, Source Han Sans CN;
font-weight: 500;
color: #666666;
}
}
.therecontent::after {
position: absolute;
top: 50%;
left: 32rpx;
transform: translateY(-50%);
content: '¥';
display: inline-block;
width: 28rpx;
height: 40rpx;
font-size: 28rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.fourcontent {
.fourcontentlnage {
width: 33.33%;
.fourcontentitem {
margin: 24rpx 10rpx;
padding: 16rpx 0;
text-align: center;
background: #FFFFFF;
border-radius: 8rpx;
border: 1rpx solid #333333;
font-size: 28rpx;
font-family: Roboto-Medium, Roboto;
font-weight: 500;
color: #333333;
}
.fourcontentitems {
margin: 24rpx 10rpx;
padding: 16rpx 0;
text-align: center;
border-radius: 8rpx;
background: var(--bg-color-button);
font-size: 28rpx;
font-family: Roboto-Medium, Roboto;
font-weight: 500;
color: #FFFFFF;
}
}
}
.fivecontent {
margin-top: 62rpx;
padding: 20rpx 0;
text-align: center;
width: 100%;
font-size: 36rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
border-radius: 8rpx;
background: var(--bg-color-button);
}
}
</style>

View File

@ -0,0 +1,38 @@
<template>
<view class="container">
<!-- 条形码 -->
<view class="barcode-container">
<text>条形码:</text>
</view>
<!-- 二维码 -->
<view class="qrcode-container">
<text>二维码:</text>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue';
//
const barcodeValue = ref('1234567890');
const qrcodeValue = ref('https://www.example.com');
</script>
<style scoped>
.container {
padding: 20px;
display: flex;
flex-direction: column;
align-items: center;
}
.barcode-container,
.qrcode-container {
margin-bottom: 20px;
text-align: center;
}
</style>

View File

@ -0,0 +1,308 @@
<template>
<view class="Box">
<view class="box_box">
<view class="box_item flex-between">
<text class="top_box_one_text">当前账号</text>
<input type="number" v-model="mobile" placeholder="请输入手机号" maxlength="11" disabled="disabled" />
<button v-if="!mobile" class="getPhone" open-type="getPhoneNumber" @getphonenumber="getPhone">
<view class="text">获取手机号</view>
</button>
</view>
<view class="box_item flex-between" style="position:relative;">
<text class="top_box_one_text"></text>
<input type="number" v-model="form.checkCode" placeholder="请输入验证码" style="padding-right: 140rpx;color: #333" />
<view class="top_box_one_texts">
<view v-if="showText == true" class="yzm" @click="CodeRegister">{{ Recapture }}</view>
<view v-else style="color: #ccc; background-color: #f9f9f9; border-radius:16px; padding: 10rpx;">
{{ second }}s重新发送
</view>
</view>
</view>
<view class="box_item flex-between">
<text class="top_box_one_text">新密码</text>
<input type="number" v-model="form.password" placeholder="请输入6位数字交易密码" maxlength="6"
:password="!passwords" />
</view>
<view class="box_item flex-between">
<text class="top_box_one_text">确认密码</text>
<input type="number" v-model="form.payPassword" placeholder="请再次输入密码" maxlength="6"
:password="!payPasswords" />
</view>
</view>
<view class="flex-colum">
<view class="Box_bottom" :class="(form.checkCode!=''&&form.password!=''&&form.payPassword!='')?'active':''" @click="userInfosavePayPassword">确定</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
isPwd: "",
mobile: "",
form: {
mobile: '',
password: '',
payPassword: '',
checkCode: ''
},
passwords: false,
payPasswords: false,
//
second: 60,
showText: true,
Recapture: '获取验证码',
shopUserInfo: null,
};
},
onLoad(e) {
console.log(e)
if ( e.shopUserInfo ) {
this.shopUserInfo = JSON.parse(e.shopUserInfo);
console.log(this.shopUserInfo)
this.isPwd = this.shopUserInfo.isPwd;
this.mobile = this.shopUserInfo.telephone ? ( this.shopUserInfo.telephone.slice(0, 3)+'****'+this.shopUserInfo.telephone.slice(7) ) : '';
this.form.mobile = this.shopUserInfo.telephone;
}
},
methods: {
async CodeRegister() {
const res = await this.api.phoneValidateCode({
// post
phone: this.form.mobile
});
if (res.code == 0) {
uni.showToast({
title: '验证码获取成功',
icon: 'none'
});
//
this.showText = false;
this.Recapture = '重新获取';
var interval = setInterval(() => {
let times = --this.second;
this.second = times < 10 ? '0' + times : times; //10 0
}, 1000);
setTimeout(() => {
clearInterval(interval);
this.second = 60;
this.showText = true;
}, 60000);
}
},
/**
* 获取手机号
* @param {Object} d
*/
async getPhone(d) {
if (d.detail.iv) {
uni.login({
provider: 'weixin',
success: async (data) => {
console.log(data)
let res = await this.api.userwxlogins({
code: data.code,
encryptedData: d.detail.encryptedData,
iv: d.detail.iv,
})
this.form.mobile = res.data;
this.mobile = this.form.mobile ? ( this.form.mobile.slice(0, 3)+'****'+this.form.mobile.slice(7) ) : '';
let res2 = await this.api.upVipPhont({
id: this.shopUserInfo.id,
telephone: res.data,
})
}
})
}
},
async loginwxuserInfo() {
let res = await this.api.loginwxuserInfo({
userId: uni.cache.get('userInfo').id
})
if (res.code == 0) {
uni.cache.set('userInfo', res.data);
}
},
async userInfosavePayPassword() {
if (this.form.mobile.length != 11 && this.isPwd == 0) {
uni.showToast({
title: '手机号必须是11位',
icon: 'none'
});
return false;
}
if (this.form.password == null || this.form.password == '') {
uni.showToast({
title: '请输入密码',
icon: 'none'
});
return false;
}
if (this.form.payPassword == null || this.form.payPassword == '') {
uni.showToast({
title: '请输入确认密码',
icon: 'none'
});
return false;
}
if (this.form.password.length != 6 || this.form.payPassword.length != 6) {
uni.showToast({
title: '密码必须是6位',
icon: 'none'
});
return false;
}
if (this.form.payPassword != this.form.password) {
uni.showToast({
title: '密码和确认密码不一致',
icon: 'none'
});
return false;
}
if (this.form.checkCode == null || this.form.checkCode == '') {
uni.showToast({
title: '请输入验证码',
icon: 'none'
});
return false;
}
let res = await this.api.loginresetPwd({
vipId: this.shopUserInfo.id,
pwd: this.form.password,
code: this.form.checkCode
})
if (res.code == 0) {
if (uni.cache.get('userInfo').isPwd != 0) {
uni.showToast({
title: '修改成功',
icon: 'none'
});
} else {
uni.showToast({
title: '设置成功',
icon: 'none'
});
}
setTimeout(() => {
//
this.loginwxuserInfo()
uni.navigateBack();
}, 1000);
}
}
}
};
</script>
<style lang="scss">
page {
background: #f9f9f9;
}
.Box {
padding: 0 28rpx;
.box_one {
margin-top: 26rpx;
font-size: 24rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #999999;
}
.box_box {
background: #fff;
padding: 0 32rpx;
.box_item {
border-bottom: 1rpx solid #E5E5E5;
position: relative;
.top_box_one_text {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
input {
padding: 26rpx 0;
width: 75%;
font-size: 28rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #333;
}
.top_box_one_texts {
position: absolute;
right: 0;
margin: auto;
font-size: 28rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #5082fd;
.yzm {
padding: 8rpx 20rpx;
background: #E5E5E5;
border-radius: 24rpx;
font-weight: 500;
font-size: 24rpx;
color: #333333;
}
}
}
.box_item:nth-child(1){
border-bottom: none;
border-top: 1rpx solid #E5E5E5;
input{
border-bottom: 1rpx solid #E5E5E5;
color: #333;
}
}
}
.flex-colum {
width: 100%;
margin-top: 56rpx;
.Box_bottom {
width: 100%;
height: 96rpx;
line-height: 96rpx;
background-color: #999;
border-radius: 48rpx;
font-size: 32rpx;
font-family: Source Han Sans CN-Regular, Source Han Sans CN;
font-weight: 400;
color: #ffffff;
text-align: center;
}
.Box_bottom.active{
background-color: #E3AD7F;
}
}
.getPhone{
line-height: initial;
background-color: none;
border: 2rpx solid #E3AD7F;
color: #E3AD7F;
font-size: 28rpx;
padding: 5rpx 10rpx;
position: absolute;
right: 10rpx;
z-index: 2;
}
}
</style>

View File

@ -0,0 +1,70 @@
<template>
<view class="container">
<view class="list">
<view class="list_item" @click="handleClick(item)" v-for="(item,index) in list" :key="index">
<view>{{ item.name }}</view>
<u-icon name="arrow-right" color="#575B66" size="28"></u-icon>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
shopUserInfo: null,
list: [
{name: "余额明细", url: "member/billDetails"},
{name: "密码设置", url: "member/setPassword"},
{name: "使用须知", url: "member/instructions"},
]
}
},
onLoad(e) {
this.shopUserInfo = JSON.parse(e.shopUserInfo)
},
methods: {
/**
* 跳转
*/
handleClick ( item ) {
uni.navigateTo({
url: `/pages/${item.url}?shopUserInfo=${JSON.stringify(this.shopUserInfo)}`
})
}
}
}
</script>
<style scoped lang="less">
page{
}
.container{
padding: 48rpx 20rpx;
.list{
display: flex;
flex-direction: column;
background-color: #fff;
border-radius: 24rpx;
padding: 16rpx 24rpx;
.list_item{
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 2rpx solid #E5E5E5;;
padding: 24rpx 0;
view{
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
}
.list_item:last-child{
border-bottom: none;
}
}
}
</style>

View File

@ -1,453 +0,0 @@
<template>
<view class="container">
<view class="info_list">
<view class="list_item">
<view class="list_item_left">头像</view>
<view class="list_item_right flex-center">
<!-- #ifdef MP-WEIXIN -->
<button class="list_item_right_head" type="default" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
<image class="list_item_right_head" :src="userHeadImg" mode="aspectFill"></image>
</button>
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<button class="list_item_right_head" @click="onChooseAvatar">
<image class="list_item_right_head" :src="userHeadImg" mode="aspectFill"></image>
</button>
<!-- #endif -->
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
<view class="list_item">
<view class="list_item_left">昵称</view>
<view class="list_item_right" style="width: 100%;">
<u-input v-model="nickName" type="text" input-align="right" placeholder="请输入不支持特殊字符10个字以内" :custom-style="{color:'#333',fontSize: '28rpx',border:'none'}" placeholder-style="color:#999;font-size: 28rpx"/>
</view>
</view>
<view class="list_item">
<view class="list_item_left">账号</view>
<view class="list_item_right ">
<!-- #ifdef MP-WEIXIN -->
<button class="phone" v-if="!mobile" open-type="getPhoneNumber" @getphonenumber="getPhone">
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<button class="phone" v-if="!mobile" open-type="getAuthorize" scope='phoneNumber' @getAuthorize="getPhone" @error="getPhoneError">
<!-- #endif -->
<view class="flex-colum-end">
<view class="text">请授权手机号</view>
</view>
</button>
<view v-else >
<view class="flex-colum-end">
<view class="text">{{phonetitle }}</view>
<view class="place">绑定的手机号不能修改</view>
</view>
</view>
</view>
</view>
<view class="list_item">
<view class="list_item_left">性别</view>
<view class="list_item_right flex-center">
<view class="place r" @click="sexShow = true">{{sexText}}</view>
<u-picker @cancel="sexShow = false" itemHeight="66" :show="sexShow" :columns="sexList" keyName="label" @confirm="confirmSex"></u-picker>
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
<view class="list_item">
<view class="list_item_left">生日</view>
<view class="list_item_right flex-center">
<view class="place r" @click="calendarShow = (birthDay ? false : true)"> {{ birthDay || '生日一旦填写不能修改'}}</view>
<!-- <u-calendar @close="calendarShow = false" monthNum="99" minDate="1945-01-01" maxDate="2055-12-12" :show="calendarShow" mode="single" @confirm="confirmCalendar"></u-calendar> -->
<!-- <u-picker :show="calendarShow" ref="uPicker" :columns="columns" @confirm="confirm" @change="changeHandler"></u-picker> -->
<!-- <picker :show="calendarShow" mode="date"></picker> -->
<u-datetime-picker
mode="date"
itemHeight="90"
visibleItemCount="5"
@cancel="calendarShow = false"
:show="calendarShow"
:minDate="-2208988800000"
v-model="value1"
@confirm="confirmTime"
></u-datetime-picker>
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
<view class="list_item" @click="boxClick">
<view class="list_item_left">绑定微信</view>
<view class="list_item_right flex-center">
<view class="text r">已绑定</view>
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
</view>
<view class="save active" @click="$u.debounce(sumbit, 500)">保存</view>
</view>
</template>
<script>
export default {
components: {
},
data() {
return {
sexShow: false,
calendarShow: false,
sexText: '请选择',
value1: Number(new Date()),
form: {
sex: 1,
address: '', //
type: '', //
orderBy: '', //1. 2. 3.
other: '', //1KM 1 0
page: 1, //
size: 10, //
status: 'loadmore',
},
sexList: [
[{
value: 1,
label: '男'
},
{
value: 0,
label: '女'
},]
],
userInfo: uni.cache.get('userInfo'),
userHeadImg: "",
nickName: '',
birthDay: "",
mobile: "",
phonetitle: ""
};
},
computed:{
},
onLoad() {
this.userInfo = uni.cache.get('userInfo')
this.userHeadImg = this.userInfo.headImg;
this.nickName = this.userInfo.nickName;
this.sex = this.userInfo.sex;
if ( this.userInfo.sex != null ) {
this.sexText = this.userInfo.sex == 1 ? '男' : '女';
}
this.birthDay = this.userInfo.birthDay;
this.phonetitle = this.userInfo.telephone ? (this.userInfo.telephone.substr(0, 3) + "****" + this.userInfo.telephone.substr(7)) : ""
this.mobile = this.userInfo.telephone;
this.date = this.getDate({ format: true})
},
methods: {
/**
* 确定生日
* @param {Object} e
*/
confirmTime(e) {
this.calendarShow = false;
this.birthDay = this.getDate(e.value);
},
/**
* 确定性别
* @param {Object} e
*/
confirmSex(e) {
this.sexShow = false;
this.sex = e.value[0].value;
this.sexText = e.value[0].label;
console.log(e)
},
getDate(time) { //
const date = new Date(time);
// const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
},
/**
* 获取手机号
* @param {Object} d
*/
async getPhone(d) {
console.log(d)
// #ifdef MP-WEIXIN
if (d.detail.iv) {
uni.login({
provider: 'weixin',
success: async (data) => {
//
console.log(data)
let res = await this.api.userwxlogins({
code: data.code,
encryptedData: d.detail.encryptedData,
iv: d.detail.iv,
source: "wechar"
})
this.phonetitle = res.data.substr(0, 3) + "****" + res.data.substr(7)
this.mobile = res.data;
}
});
}
// #endif
// #ifdef MP-ALIPAY
//
my.getAuthCode({
scopes: 'auth_user',
success: (res) => {
console.log(res)
let authCode = res.authCode;
my.getPhoneNumber({
success: async (data) => {
let res = await this.api.userwxlogins({
// code: authCode,
encryptedData: JSON.parse(data.response).response,
source: "alipay"
})
this.phonetitle = res.data.substr(0, 3) + "****" + res.data.substr(7)
this.mobile = res.data;
}
});
}
});
// #endif
},
getPhoneError (e) {
console.log(e)
},
/**
* 取消绑定/退出登录
*/
boxClick() {
uni.showModal({
title: '注意',
content: '确定要取消绑定吗?',
success: async (res) => {
if (res.confirm) {
try {
await this.api.loginOut();
} catch (e) {
//TODO handle the exception
}
uni.cache.clear();
uni.reLaunch({
url: '/pages/login/login'
});
}
}
});
},
/**
* 上传头像
* @param {Object} e
*/
onChooseAvatar(e) {
let _this = this;
//#ifdef MP-WEIXIN
let avatarUrl = e.detail.avatarUrl
uni.uploadFile({
url: uni.conf.baseUrl + '/common/upload',
// url: uni.conf.baseUrl + '/common/upload',
filePath: avatarUrl,
header: {
environment: 'app',
type: 'android',
version: '1.7.3',
'content-type': 'multipart/form-data'
},
fileType:'image',
name: "file",
formData: {
file: avatarUrl,
},
success: (uploadFileRes) => {
let { data } = JSON.parse(uploadFileRes.data)
this.userHeadImg = data
},
fail: (res) => {
console.log(res)
}
});
// #endif
//#ifdef MP-ALIPAY
uni.chooseImage({
count: 1, // 9
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: function (res) {
//
let avatarUrl = res.tempFilePaths[0]; //
my.uploadFile({
url: uni.conf.baseUrl + '/common/upload',
// url: uni.conf.baseUrl + '/common/upload',
filePath: avatarUrl,
header: {
environment: 'app',
type: 'android',
version: '1.7.3',
'content-type': 'multipart/form-data'
},
fileType:'image',
name: "file",
formData: {
file: avatarUrl,
},
success: (uploadFileRes) => {
let { data } = JSON.parse(uploadFileRes.data)
_this.userHeadImg = data
},
fail: (res) => {
console.log(res)
}
});
},
fail: (res) => {
console.log(res)
}
});
// #endif
},
/**
* 保存
*/
async sumbit() {
let res = await this.api.upUserInfo({
headImg: this.userHeadImg,
nickName: this.nickName,
sex: this.sex,
birthDay: this.birthDay,
telephone: this.mobile,
})
if (res.code == 0) {
uni.navigateBack()
}
}
},
computed: {
HeighT() { //
return this.$store.getters.is_BarHeight
},
},
};
</script>
<style scoped lang="scss">
page {
background: #fff;
}
.container{
::v-deep .u-input input{
background-color: transparent;
}
.info_list{
display: flex;
flex-direction: column;
padding: 0 20rpx;
.list_item{
display: flex;
justify-content: space-between;
align-items: center;
padding: 24rpx 0;
border-bottom: 1rpx solid #E5E5E5;
.list_item_left{
font-weight: bold;
font-size: 32rpx;
color: #333333;
flex-shrink: 0;
}
.list_item_right{
font-weight: 400;
font-size: 28rpx;
color: #333333;
.list_item_right_head{
width: 98rpx;
height: 98rpx;
border-radius: 50rpx;
margin-right: 16rpx;
padding: 0;
}
.phone{
border: none;
background-color: transparent;
// #ifdef MP-ALIPAY
display: initial;
// #endif
}
.place{
font-size: 28rpx;
color: #999;
line-height: initial;
}
.text{
font-size: 28rpx;
color: #333;
line-height: initial;
}
.r{
margin-right: 16rpx;
}
button{
outline: none;
text{
color: #fff!important;
}
}
button::after{
border: none;
}
button:active {
background-color: inherit;
}
}
}
}
.save{
width: 502rpx;
height: 96rpx;
line-height: 96rpx;
text-align: center;
background-color: #E0E0E0;
border-radius: 48rpx;
font-weight: 400;
font-size: 32rpx;
color: #999999;
position: fixed;
bottom: 100rpx;
left: 0;
right: 0;
margin: auto;
}
.save.active{
background-color: #E3AD7F;
color: #fff;
}
}
</style>

427
pages/user/myself.vue Normal file
View File

@ -0,0 +1,427 @@
<template>
<view class="container">
<view class="info_list">
<view class="list_item">
<view class="list_item_left">头像</view>
<view class="list_item_right flex-center">
<!-- #ifdef MP-WEIXIN -->
<button class="list_item_right_head" type="default" open-type="chooseAvatar"
@chooseavatar="onChooseAvatar">
<image class="list_item_right_head" :src="userHeadImg" mode="aspectFill"></image>
</button>
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<button class="list_item_right_head" @click="onChooseAvatar">
<image class="list_item_right_head" :src="userHeadImg" mode="aspectFill"></image>
</button>
<!-- #endif -->
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
<view class="list_item">
<view class="list_item_left">昵称</view>
<view class="list_item_right" style="width: 100%;">
<u-input v-model="nickName" type="text" input-align="right" placeholder="请输入不支持特殊字符10个字以内"
:custom-style="{color:'#333',fontSize: '28rpx',border:'none'}"
placeholder-style="color:#999;font-size: 28rpx" />
</view>
</view>
<view class="list_item">
<view class="list_item_left">账号</view>
<view class="list_item_right ">
<!-- #ifdef H5 -->
<button class="phone" v-if="!mobile" open-type="getAuthorize" scope='phoneNumber'
@getAuthorize="getPhone" @error="getPhoneError">
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<button class="phone" v-if="!mobile" open-type="getPhoneNumber" @getphonenumber="getPhone">
<!-- #endif -->
<!-- #ifdef MP-ALIPAY -->
<button class="phone" v-if="!mobile" open-type="getAuthorize" scope='phoneNumber'
@getAuthorize="getPhone" @error="getPhoneError">
<!-- #endif -->
<view class="flex-colum-end">
<view class="text">请授权手机号</view>
</view>
</button>
<view v-else>
<view class="flex-colum-end">
<view class="text">{{phonetitle }}</view>
<view class="place">绑定的手机号不能修改</view>
</view>
</view>
</view>
</view>
<view class="list_item">
<view class="list_item_left">性别</view>
<view class="list_item_right flex-center">
<view class="place r" @click="sexShow = true">{{sexText}}</view>
<u-picker @cancel="sexShow = false" itemHeight="66" :show="sexShow" :columns="sexList"
keyName="label" @confirm="confirmSex"></u-picker>
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
<view class="list_item">
<view class="list_item_left">生日</view>
<view class="list_item_right flex-center">
<view class="place r" @click="calendarShow = (birthDay ? false : true)">
{{ birthDay || '生日一旦填写不能修改'}}
</view>
<!-- <u-calendar @close="calendarShow = false" monthNum="99" minDate="1945-01-01" maxDate="2055-12-12" :show="calendarShow" mode="single" @confirm="confirmCalendar"></u-calendar> -->
<!-- <u-picker :show="calendarShow" ref="uPicker" :columns="columns" @confirm="confirm" @change="changeHandler"></u-picker> -->
<!-- <picker :show="calendarShow" mode="date"></picker> -->
<u-datetime-picker mode="date" itemHeight="90" visibleItemCount="5" @cancel="calendarShow = false"
:show="calendarShow" :minDate="-2208988800000" v-model="value1"
@confirm="confirmTime"></u-datetime-picker>
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
<view class="list_item" @click="boxClick">
<view class="list_item_left">绑定微信</view>
<view class="list_item_right flex-center">
<view class="text r">已绑定</view>
<u-icon name="arrow-right" color="#999999" size="16"></u-icon>
</view>
</view>
</view>
<view class="save active" @click="$u.debounce(sumbit, 500)">保存</view>
</view>
</template>
<script setup>
import {
reactive,
ref
} from 'vue';
const sexShow = ref(false)
const calendarShow = ref(false)
const sexText = ref('请选择')
const value1 = ref(Number(new Date()))
const listinfo = reactive({
form: {
sex: 1,
address: '', //
type: '', //
orderBy: '', //1. 2. 3.
other: '', //1KM 1 0
page: 1, //
size: 10, //
status: 'loadmore',
},
sexList: [
[{
value: 1,
label: '男'
},
{
value: 0,
label: '女'
},
]
],
})
const userInfo = uni.cache.get('userInfo')
// this.userInfo = uni.cache.get('userInfo')
// this.userHeadImg = this.userInfo.headImg;
// this.nickName = this.userInfo.nickName;
// this.sex = this.userInfo.sex;
// if (this.userInfo.sex != null) {
// this.sexText = this.userInfo.sex == 1 ? '' : '';
// }
// this.birthDay = this.userInfo.birthDay;
// this.phonetitle = this.userInfo.telephone ? (this.userInfo.telephone.substr(0, 3) + "****" + this.userInfo
// .telephone.substr(7)) : ""
// this.mobile = this.userInfo.telephone;
// this.date = this.getDate({
// format: true
// })
const confirmTime = (e) => {
this.calendarShow = false;
this.birthDay = this.getDate(e.value);
}
const confirmSex = (e) => {
this.sexShow = false;
this.sex = e.value[0].value;
this.sexText = e.value[0].label;
}
const getDate = (time) => { //
const date = new Date(time);
// const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
month = month > 9 ? month : '0' + month;
day = day > 9 ? day : '0' + day;
return `${year}-${month}-${day}`;
}
//
const getPhone = (d) => {
console.log(d)
// #ifdef MP-WEIXIN
if (d.detail.iv) {
uni.login({
provider: 'weixin',
success: async (data) => {
//
console.log(data)
let res = await this.api.userwxlogins({
code: data.code,
encryptedData: d.detail.encryptedData,
iv: d.detail.iv,
source: "wechar"
})
this.phonetitle = res.data.substr(0, 3) + "****" + res.data.substr(7)
this.mobile = res.data;
}
});
}
// #endif
// #ifdef MP-ALIPAY
//
my.getAuthCode({
scopes: 'auth_user',
success: (res) => {
console.log(res)
let authCode = res.authCode;
my.getPhoneNumber({
success: async (data) => {
let res = await this.api.userwxlogins({
// code: authCode,
encryptedData: JSON.parse(data.response).response,
source: "alipay"
})
this.phonetitle = res.data.substr(0, 3) + "****" + res.data
.substr(7)
this.mobile = res.data;
}
});
}
});
// #endif
}
const boxClick = () => {
uni.showModal({
title: '注意',
content: '确定要取消绑定吗?',
success: async (res) => {
if (res.confirm) {
try {
await this.api.loginOut();
} catch (e) {
//TODO handle the exception
}
uni.cache.clear();
uni.reLaunch({
url: '/pages/login/login'
});
}
}
});
}
//
const onChooseAvatar = (e) => {
let _this = this;
//#ifdef MP-WEIXIN
let avatarUrl = e.detail.avatarUrl
uni.uploadFile({
url: uni.conf.baseUrl + '/common/upload',
// url: uni.conf.baseUrl + '/common/upload',
filePath: avatarUrl,
header: {
environment: 'app',
type: 'android',
version: '1.7.3',
'content-type': 'multipart/form-data'
},
fileType: 'image',
name: "file",
formData: {
file: avatarUrl,
},
success: (uploadFileRes) => {
let {
data
} = JSON.parse(uploadFileRes.data)
this.userHeadImg = data
},
fail: (res) => {
console.log(res)
}
});
// #endif
//#ifdef MP-ALIPAY
uni.chooseImage({
count: 1, // 9
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: function(res) {
//
let avatarUrl = res.tempFilePaths[0]; //
my.uploadFile({
url: uni.conf.baseUrl + '/common/upload',
// url: uni.conf.baseUrl + '/common/upload',
filePath: avatarUrl,
header: {
environment: 'app',
type: 'android',
version: '1.7.3',
'content-type': 'multipart/form-data'
},
fileType: 'image',
name: "file",
formData: {
file: avatarUrl,
},
success: (uploadFileRes) => {
let {
data
} = JSON.parse(uploadFileRes.data)
_this.userHeadImg = data
},
fail: (res) => {
console.log(res)
}
});
},
fail: (res) => {
console.log(res)
}
});
// #endif
}
const sumbit = async () => {
let res = await this.api.upUserInfo({
headImg: this.userHeadImg,
nickName: this.nickName,
sex: this.sex,
birthDay: this.birthDay,
telephone: this.mobile,
})
if (res.code == 0) {
uni.navigateBack()
}
}
</script>
<style scoped lang="scss">
page {
background: #fff;
}
.container {
::v-deep .u-input input {
background-color: transparent;
}
.info_list {
display: flex;
flex-direction: column;
padding: 0 20rpx;
.list_item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 24rpx 0;
border-bottom: 1rpx solid #E5E5E5;
.list_item_left {
font-weight: bold;
font-size: 32rpx;
color: #333333;
flex-shrink: 0;
}
.list_item_right {
font-weight: 400;
font-size: 28rpx;
color: #333333;
.list_item_right_head {
width: 98rpx;
height: 98rpx;
border-radius: 50rpx;
margin-right: 16rpx;
padding: 0;
}
.phone {
border: none;
background-color: transparent;
// #ifdef MP-ALIPAY
display: initial;
// #endif
}
.place {
font-size: 28rpx;
color: #999;
line-height: initial;
}
.text {
font-size: 28rpx;
color: #333;
line-height: initial;
}
.r {
margin-right: 16rpx;
}
button {
outline: none;
text {
color: #fff !important;
}
}
button::after {
border: none;
}
button:active {
background-color: inherit;
}
}
}
}
.save {
width: 502rpx;
height: 96rpx;
line-height: 96rpx;
text-align: center;
background-color: #E0E0E0;
border-radius: 48rpx;
font-weight: 400;
font-size: 32rpx;
color: #999999;
position: fixed;
bottom: 100rpx;
left: 0;
right: 0;
margin: auto;
}
.save.active {
background-color: #E3AD7F;
color: #fff;
}
}
</style>

View File

@ -9,10 +9,10 @@
<image class="my_info_left_head" :src="userInfo.headImg" mode="aspectFill"></image>
<view class="name">{{userInfo.nickName || '无'}}</view>
</view>
<image class="my_info_right_qr" @click="clickEvent" v-if="userInfo.isVip!=0"
<image class="my_info_right_qr" @click="clickEvent" v-if="userInfo.isVip == 1"
:src="'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/my/my_qRcode.png'" mode="aspectFill">
</image>
<view class="my_info_right" @click="clickEvent" v-else>
<view class="my_info_right" @click="clickEvent" v-if="userInfo.isVip == 0">
<text>免费入会</text>
</view>
</view>
@ -26,21 +26,21 @@
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/my/storedValue.png" mode="aspectFill">
</image>
<view class="my_list_item_name">储值</view>
<view class="my_list_item_num">{{userInfo.assetsSummary.amount || '0'}}</view>
<view class="my_list_item_num">{{userInfo.amount || '0'}}</view>
</view>
<view class="my_list_item">
<image class="my_list_item_icon"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/my/points.png">
</image>
<view class="my_list_item_name">积分</view>
<view class="my_list_item_num">{{userInfo.assetsSummary.couponNum ||'0'}}</view>
<view class="my_list_item_num">{{userInfo.couponNum ||'0'}}</view>
</view>
<view class="my_list_item">
<image class="my_list_item_icon"
src="https://czg-qr-order.oss-cn-beijing.aliyuncs.com/my/coupon.png">
</image>
<view class="my_list_item_name">优惠券</view>
<view class="my_list_item_num">{{userInfo.assetsSummary.points ||'0'}}</view>
<view class="my_list_item_num">{{userInfo.points ||'0'}}</view>
</view>
</view>
</view>
@ -95,7 +95,7 @@
// { name: "", type: "", icon: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/my/my_address.png"},
{
name: "个人资料",
type: "my_info",
type: "myself",
icon: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/my/personal.png"
},
{
@ -107,25 +107,16 @@
])
const teblist = ref([])
const shopExtend = ref(null)
const userInfo = ref({
headImg: '',
nickName: '',
isVip: '',
assetsSummary: {
amount: 0,
couponNum: 0,
points: 2
}
})
const userInfo = reactive({})
const clickEvent = () => {
if (uni.cache.get('shopId') && uni.cache.get('token')) {
if (this.userInfo.isVip == 0) {
uni.pro.navigateTo('member/memberdetails', {
if (userInfo.isVip == 0) {
uni.pro.navigateTo('user/member/memberdetails', {
shopId: uni.cache.get('shopId')
})
} else {
uni.navigateTo({
url: '/pages/pay_code/pay_code?userInfo=' + JSON.stringify(this.userInfo)
url: '/pages/user/member/qrcode?userInfo=' + JSON.stringify(userInfo)
})
}
} else {
@ -134,10 +125,72 @@
})
}
}
const clickTo = (item, index) => {
console.log(item, index)
let shopId = null;
switch (item.type) {
case 'my_order':
uni.pro.switchTab('order/index')
break
case 'my_member':
uni.pro.navigateTo('user/member/list')
break
case 'recharge':
if (uni.cache.get('shopId') && uni.cache.get('token')) {
uni.pro.navigateTo('member/index', {
shopId: uni.cache.get('shopId'),
type: 'index',
})
} else {
uni.pro.navigateTo('member/list', {
type: 'user_recharge'
})
}
break
case 'points': //
if (uni.cache.get('shopId') && uni.cache.get('token')) {
uni.pro.navigateTo('/pagesPoints/index/index', {
shopId: uni.cache.get('shopId'),
type: 'user',
})
} else {
uni.pro.navigateTo('member/list', {
type: 'user_points'
})
}
break;
case 'my_coupon': //
uni.pro.navigateTo('user/coupon', {
shopId: uni.cache.get('shopId') || ''
})
break;
case 'myself': //
uni.pro.navigateTo('user/myself')
break;
case 'scan_applet':
uni.navigateToMiniProgram(JSON.parse(item.value))
break
case 'absolute': //url
uni.navigateTo({
url: `/pages/webview/webview?url=${item.menuUrl}`
});
break;
}
}
onShow(async () => {
await store.actionsAPIuser()
userInfo.value = uni.cache.get('userInfo')
console.log(userInfo.value, 11)
let res = uni.cache.get('userInfo')
if (uni.cache.get('shopId')) {
Object.assign(userInfo, res)
} else {
Object.assign(userInfo, {
...res,
...res.assetsSummary
})
}
console.log(userInfo, 11)
})
</script>

109
stores/pay.js Normal file
View File

@ -0,0 +1,109 @@
import {
defineStore
} from 'pinia';
import {
ref
} from 'vue';
import {
APIpayltPayOrder,
APIpayltPayVip
} from '@/common/api/pay.js'
export const Memberpay = defineStore('memberpay', {
actions: {
actionspayltPayVip(data) {
return new Promise(async (resolve, reject) => {
try {
let res = await APIpayltPayVip({
shopId: data.shopId,
shopUserId: data.shopUserId,
amount: data.amount,
// #ifdef MP-WEIXIN
payType: 'wechatPay',
openId: uni.cache.get('userInfo').wechatOpenId,
// #endif
// #ifdef MP-ALIPAY
payType: 'aliPay',
openId: uni.cache.get('userInfo').wechatOpenId,
// #endif
returnUrl: data.returnUrl ? data.returnUrl : '',
buyerRemark: data.buyerRemark ? data.buyerRemark : ''
})
if (res) {
uni.showLoading({
title: '加载中',
mask: true
})
uni.requestPayment({
// #ifdef MP-WEIXIN
provider: 'wxpay', //支付类型-固定值
partnerid: res.appId, // 微信支付商户号
timeStamp: res.timeStamp, // 时间戳(单位:秒)
nonceStr: res.nonceStr, // 随机字符串
package: res.package, // 固定值
signType: res.signType, //固定值
paySign: res.paySign, //签名
// #endif
// #ifdef MP-ALIPAY
provider: 'alipay', //支付类型-固定值
orderInfo: res.tradeNo, // 微信支付商户号
// #endif
success: (res) => {
console.log(res)
uni.hideLoading()
let pages = getCurrentPages()
// #ifdef MP-WEIXIN
uni.showToast({
title: "支付成功"
})
resolve(res)
// #endif
// #ifdef MP-ALIPAY
if (res.resultCode == '9000') {
uni.showToast({
title: "支付成功"
})
resolve(res)
} else {
uni.showToast({
title: "支付失败"
})
}
// #endif
},
fail: (res) => {
uni.hideLoading()
reject(false)
}
});
}
} catch (e) {
uni.hideLoading()
reject(false)
}
})
},
actionsltPayOrder() {
return new Promise(async (resolve, reject) => {
let res = await APIpayltPayOrder({
shopId: uni.cache.get('shopId'),
checkOrderPay: {},
// #ifdef MP-WEIXIN
payType: 'wechatPay',
openId: uni.cache.get('userInfo').wechatOpenId,
// #endif
// #ifdef MP-ALIPAY
payType: 'aliPay',
openId: uni.cache.get('alipayOpenId').wechatOpenId,
// #endif
returnUrl: '',
buyerRemark: '',
})
})
}
}
});

View File

@ -11,7 +11,7 @@ import {
import {
APIproductqueryShop,
APIshopUserInfo
} from '@/common/api/product/product.js'
} from '@/common/api/member.js'
export const Storelogin = defineStore('login', {
state: () => ({
token: '',
@ -40,11 +40,7 @@ export const Storelogin = defineStore('login', {
.miniAppOpenId
this.userInfo = res.userInfo
uni.cache.set('token', res.token);
uni.cache.set('openId', res
.userInfo
.wechatOpenId)
uni.cache.set('userInfo', res
.userInfo);
uni.cache.set('userInfo', res.userInfo);
}
resolve(true);
},
@ -120,17 +116,8 @@ export const productStore = defineStore('product', {
await this.actionsproductqueryShop()
}
}
if (uni.cache.get('productInfo')
.shopTableInfo && !uni
.cache.get('productInfo')
.shopTableInfo
.choseCount) {
uni.pro.navigateTo(
'/pagesOrder/orderAMeal/index', {
tableCode: tableCode,
shopId: uni.cache.get(
'shopId'),
})
if (uni.cache.get('shopInfo').isTableFee == 0) {
uni.pro.navigateTo('product/choosetable')
} else {
uni.pro.navigateTo(
'product/index', {
@ -141,7 +128,6 @@ export const productStore = defineStore('product', {
}
},
fail: (res) => {
console.log(111)
console.log(res)
}
});
@ -157,12 +143,16 @@ export const productStore = defineStore('product', {
await this.actionsproductqueryShop()
}
}
if (uni.cache.get('productInfo').shopTableInfo && !uni
.cache.get('productInfo').shopTableInfo.choseCount) {
uni.pro.navigateTo('/pagesOrder/orderAMeal/index', {
tableCode: uni.cache.get('tableCode'),
shopId: uni.cache.get('shopId'),
if (uni.cache.get('shopTable').status != 'idle') {
uni.showToast({
title: '此台桌暂不可用...',
icon: 'none'
})
return false
}
if (uni.cache.get('shopInfo').isTableFee == 0) {
uni.pro.navigateTo('product/choosetable')
} else {
uni.pro.navigateTo('product/index', {
tableCode: uni.cache.get('tableCode'),
@ -181,13 +171,16 @@ export const productStore = defineStore('product', {
let res = await APIproductqueryShop({
tableCode: uni.cache.get('tableCode'),
})
res.shopInfo.isVip = res.vip ? '1' : '0'
res.shopTable.shopExtendMap = res.shopExtendMap
// 店铺信息
uni.cache.set('shopTable', res.shopTable)
// 台桌信息
uni.cache.set('shopInfo', res.shopInfo)
uni.cache.set('shopId', res.shopTable.shopId)
// 当前用户距离店铺的米数
uni.cache.set('distance', res.distance)
uni.cache.set('distance', res.distance,5000)
resolve(res)
} catch (e) {
reject(false)
@ -200,11 +193,9 @@ export const productStore = defineStore('product', {
actionsproductqueryProduct() {
return new Promise(async (resolve, reject) => {
try {
let res = await APIshopUserInfo({
"shopId": uni.cache.get('shopId'),
"userId": uni.cache.get('userInfo').id
})
uni.cache.set('ShopUser', res)
let res = await APIshopUserInfo()
// uni.cache.set('ShopUser', res)
uni.cache.set('userInfo', res);
resolve(true)
} catch (e) {
reject(false)
@ -217,8 +208,12 @@ export const productStore = defineStore('product', {
actionsAPIuser() {
return new Promise(async (resolve, reject) => {
try {
let res = await APIuser()
uni.cache.set('userInfo', res);
if (uni.cache.get('shopId')) {
this.actionsproductqueryProduct()
} else {
let res = await APIuser()
uni.cache.set('userInfo', res);
}
resolve(true)
} catch (e) {
reject(false)