53 Commits

Author SHA1 Message Date
gyq
93d3f9196c 去除清除绑定分销关系的方法 2026-01-23 10:52:15 +08:00
gyq
ee34d94ca0 修复分销中心绑定成功后不刷新的问题 2026-01-22 18:24:08 +08:00
gyq
cb139acf13 优化分销中心分享进来后的返回 2026-01-22 15:32:30 +08:00
4eb9eb27e3 Merge branch 'test' of https://newgitea.sxczgkj.cn/czg_team/cashier_wx into test 2026-01-22 15:02:09 +08:00
8810c218b3 点餐页问题修复 2026-01-22 15:02:06 +08:00
gyq
dc3174ef13 增加分销二维码邀请 2026-01-22 14:50:28 +08:00
gyq
94be2739af 优化充值中心返回 2026-01-22 13:40:43 +08:00
9037e205a0 修复分享问题 2026-01-22 11:36:49 +08:00
2afc2f9fab 修改点餐页分享 2026-01-21 17:19:04 +08:00
46105da573 Merge branch 'test' of https://newgitea.sxczgkj.cn/czg_team/cashier_wx into test 2026-01-21 16:42:23 +08:00
20a54c3bd9 增加积分商城分享 2026-01-21 16:42:18 +08:00
gyq
a0cc43e118 优化套餐、拼团、分销、积分分享功能 2026-01-21 16:41:49 +08:00
8f1b21bf00 调整分享部分方法,修改点餐页分享 2026-01-21 15:11:01 +08:00
654ed39854 增加公共分享组件 2026-01-21 10:26:20 +08:00
67ae138033 Merge branch 'test' of https://newgitea.sxczgkj.cn/czg_team/cashier_wx into test 2026-01-21 09:40:41 +08:00
c60a2115ea 封装分享功能 2026-01-21 09:40:31 +08:00
gyq
1ed28e2913 更改为本地请求连接 2026-01-20 15:03:14 +08:00
a125995808 增加分销员中心-无感-绑定邀请人统一封装处理 2026-01-20 10:16:35 +08:00
0444b68cb2 Merge branch 'prod' of https://newgitea.sxczgkj.cn/czg_team/cashier_wx into test 2026-01-20 10:08:51 +08:00
32c60b4f83 修改payType值wechatPay改为WECHAT,aliPay改为ALIPAY 2026-01-20 10:07:58 +08:00
373be0527f 注释和地图相关接口 2026-01-13 16:51:55 +08:00
402f85d61f 修复招牌菜数量回显问题 2026-01-09 11:13:33 +08:00
575e6d22b0 修复商品弹窗价格回显问题 2026-01-08 10:09:19 +08:00
dfc67e12c5 修复可选套餐价格不显示问题 2026-01-08 10:02:38 +08:00
42fc09815b 修复单规格弹窗价格不显示问题,修复关联商品价格显示问题 2026-01-08 09:47:37 +08:00
3064007137 修复商品弹窗选择不同规格价格未变的回显问题 2026-01-05 16:07:28 +08:00
d8c2aef83e 正式先隐藏联系商家功能 2025-12-29 15:43:27 +08:00
7c143efe30 修复样式层级问题 2025-12-29 15:40:00 +08:00
362f3cee96 修复我的页面积分列表换行问题 2025-12-29 15:30:17 +08:00
gyq
ca53618004 Merge branch 'test' of https://newgitea.sxczgkj.cn/czg_team/cashier_wx into test 2025-12-29 13:54:55 +08:00
gyq
cbe27a43de 新增跳转企业微信客服功能 2025-12-29 13:54:53 +08:00
5fcbba0cb4 修复确认订单页面收起按钮消失问题,修复套餐商品添加第二次失效问题 2025-12-29 13:48:37 +08:00
0944635c69 Merge branch 'test' of https://newgitea.sxczgkj.cn/czg_team/cashier_wx into test 2025-12-29 10:11:47 +08:00
067025f532 修复订单列表页面签子问题 2025-12-29 10:11:42 +08:00
gyq
8d917d49ed Merge branch 'test' of https://newgitea.sxczgkj.cn/czg_team/cashier_wx into test 2025-12-26 17:23:21 +08:00
gyq
bcc44a0886 增加跳转企业微信客服示例 2025-12-26 17:23:19 +08:00
811abf935c 修复会员判断问题 2025-12-26 17:22:39 +08:00
bde30fa70c 修复临时菜和数签子显示问题,修复下单页面商品弹窗问题 2025-12-26 16:14:42 +08:00
ac7af51a92 代合合并 2025-12-26 09:48:12 +08:00
9b78ee0f48 修复样式问题,修复拼团进度显示问题 2025-12-25 19:40:13 +08:00
75ed724fbb 增加相关商品推荐功能 2025-12-25 19:03:17 +08:00
113193b142 修复余额显示问题,增加未开启智慧充值禁用余额支付,修复自动删除未找到对应购物车问题 2025-12-25 11:35:04 +08:00
b5ecab0a03 选择商品弹窗修改 2025-12-25 09:43:02 +08:00
f75f90d34f 商品弹窗代码修改 2025-12-25 09:29:09 +08:00
edd10edf9f 修复商品更新剔除下架商品问题 2025-12-24 18:47:41 +08:00
cf562b28b0 商品弹窗修改 2025-12-24 18:11:57 +08:00
e645aa5516 修复确认订单页面没有台桌信息温柔 2025-12-24 17:59:55 +08:00
33453ab961 商品弹窗吸怪 2025-12-24 17:52:33 +08:00
158a025ba1 修复加菜跳转问题 2025-12-24 17:31:09 +08:00
65554b043c 增加商品弹窗组件 2025-12-24 17:20:42 +08:00
4d7c388f74 修复分销明细详情总数显示问题 2025-12-24 15:56:03 +08:00
b3c1ab3b8b 部分代码调整 2025-12-24 15:27:27 +08:00
e1000c6b40 增加确认订单页面菜品折叠,修改商品购物车数量显示 2025-12-24 14:40:29 +08:00
55 changed files with 7850 additions and 7864 deletions

View File

@@ -3,12 +3,15 @@ import request from '@/common/api/request.js'
const url = '/account' const url = '/account'
//根据经纬度获取信息 //根据经纬度获取信息
export const APIgeocodelocation = (data) => { export const APIgeocodelocation = (data) => {
return request({ return new Promise((resove, reject) => {
url: url + '/user/geo/geocode', resove(null)
method: 'get',
data: data,
toast: false
}) })
// return request({
// url: url + '/user/geo/geocode',
// method: 'get',
// data: data,
// toast: false
// })
} }
//登录 //登录

3
common/api/apiPrve.js Normal file
View File

@@ -0,0 +1,3 @@
export const urlAccount = '/account'
export const urlProduct = '/product'
export const urlOrder = '/order'

View File

@@ -14,11 +14,11 @@ export const pay = (data) => {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
platformType = "WX"; platformType = "WX";
platformType = "wechat"; platformType = "wechat";
payType = "wechatPay"; payType = "WECHAT";
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
platformType = "alipay"; platformType = "alipay";
payType = "aliPay"; payType = "ALIPAY";
// #endif // #endif
@@ -136,6 +136,15 @@ export const getInviteCode = (data) => {
data: data, data: data,
}); });
}; };
export const autoGetInviteCode = (data) => {
return request({
url: prveUrl + "/user/distribution/autoGetInviteCode",
method: "get",
data: data,
});
};
// 获取配置 // 获取配置
export const getConfig = (data) => { export const getConfig = (data) => {
@@ -147,3 +156,11 @@ export const getConfig = (data) => {
}; };
// 分销员中心-无感-绑定邀请人
export const autoBindInviteUser = (data) => {
return request({
url: prveUrl + "/user/distribution/autoBindInviteUser",
method: "post",
data: data,
});
};

View File

@@ -1,6 +1,8 @@
// 引入 request 文件 // 引入 request 文件
import request from '@/common/api/request.js' import request from '@/common/api/request.js'
import {prveUrl} from './config.js' import {
prveUrl
} from './config.js'
export const consumeDiscount = (data) => { export const consumeDiscount = (data) => {
return request({ return request({
@@ -16,3 +18,11 @@ export const homeData = (data) => {
data: data data: data
}) })
} }
// 清除所有分销绑定关系
export const distributionClear = (data) => {
return request({
url: prveUrl + '/user/distribution/clean',
method: 'get'
})
}

View File

@@ -10,11 +10,11 @@ let platformType = '';
let payType = ''; let payType = '';
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
platformType = 'wechat' platformType = 'wechat'
payType = 'wechatPay' payType = 'WECHAT'
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
platformType = 'alipay' platformType = 'alipay'
payType = 'aliPay' payType = 'ALIPAY'
// #endif // #endif
export const getPackage = (data) => { export const getPackage = (data) => {

View File

@@ -6,11 +6,11 @@ let platformType = '';
let payType=''; let payType='';
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
platformType = 'wechat' platformType = 'wechat'
payType='wechatPay' payType='WECHAT'
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
platformType = 'alipay' platformType = 'alipay'
payType='aliPay' payType='ALIPAY'
// #endif // #endif
export const warePage = (data) => { export const warePage = (data) => {

View File

@@ -6,11 +6,11 @@ let platformType = '';
let payType=''; let payType='';
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
platformType = 'wechat' platformType = 'wechat'
payType='wechatPay' payType='WECHAT'
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
platformType = 'alipay' platformType = 'alipay'
payType='aliPay' payType='ALIPAY'
// #endif // #endif
//订单列表 //订单列表

View File

@@ -6,11 +6,11 @@ let platformType = '';
let payType=''; let payType='';
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
platformType = 'wechat' platformType = 'wechat'
payType='wechatPay' payType='WECHAT'
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
platformType = 'alipay' platformType = 'alipay'
payType='aliPay' payType='ALIPAY'
// #endif // #endif
export const pointGoodsPage = (data) => { export const pointGoodsPage = (data) => {
@@ -20,6 +20,12 @@ export const pointGoodsPage = (data) => {
data: data data: data
}) })
} }
export const pointsGoods = (data) => {
return request({
url: url + '/user/pointGoods/'+data.id,
method: 'get',
})
}
export const exchange = (data) => { export const exchange = (data) => {

View File

@@ -1,8 +1,7 @@
// 引入 request 文件 // 引入 request 文件
import request from '@/common/api/request.js' import request from '@/common/api/request.js'
const urlAccount = '/account'
const urlProduct = '/product' import {urlAccount,urlProduct,urlOrder} from '@/common/api/apiPrve.js'
const urlOrder = '/order'
//获取商品列表数据 //获取商品列表数据
export const APIproductqueryProduct = (data) => { export const APIproductqueryProduct = (data) => {
@@ -47,3 +46,12 @@ export const APIminiAppskuinfo = (data) => {
data: data data: data
}) })
} }
//获取相关推荐商品
export const productRelated = (data) => {
return request({
url: urlProduct + '/user/product/related/'+data.id,
method: 'get',
data: data
})
}

View File

@@ -7,33 +7,7 @@ export default async (params) => {
let token = uni.cache.get("token") || ""; let token = uni.cache.get("token") || "";
const shopId = uni.cache.get("shopId") * 1; const shopId = uni.cache.get("shopId") * 1;
const userInfo = uni.cache.get("userInfo") || {}; const userInfo = uni.cache.get("userInfo") || {};
// #ifdef H5
token = "1b5e8baf0cc1492a858a208f113d0971";
uni.cache.set('userInfo', {
"acQrcodeValidTime": "2026-01-13 13:35:59",
"alipayOpenId": "",
"birthDay": "",
"createTime": "2024-03-13 10:56:40",
"distributionAmount": 0,
"headImg": "https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132",
"id": "36689",
"idCard": "",
"isAc": 0,
"lastLoginTime": "2025-12-24 11:24:12",
"nickName": "微信用户",
"password": "",
"payPwd": "e10adc3949ba59abbe56e057f20f883e",
"phone": "",
"realName": "",
"sex": null,
"status": 1,
"updateTime": "2025-12-24 11:22:47",
"usePayPwd": 0,
"wechatAcOpenId": "",
"wechatAcQrcode": "http://weixin.qq.com/q/029s5JtP1xfmJ1g_HDxFco",
"wechatOpenId": "or1l86yipGvwyfPhrKIAcQuSfAV8"
})
// #endif
let header = { let header = {
version: uni.conf.version, version: uni.conf.version,
type: uni.getSystemInfoSync().platform, type: uni.getSystemInfoSync().platform,
@@ -60,7 +34,10 @@ export default async (params) => {
mask: true, mask: true,
}); });
} }
// #ifdef H5
uni.cache.set('token', '1b5e8baf0cc1492a858a208f113d0971')
uni.cache.set('userInfo',{"acQrcodeValidTime":"2026-01-13 13:35:59","alipayOpenId":"","birthDay":"2025-12-25","createTime":"2024-03-13 10:56:40","distributionAmount":0,"headImg":"https://thirdwx.qlogo.cn/mmopen/vi_32/POgEwh4mIHO4nibH0KlMECNjjGxQUq24ZEaGT4poC6icRiccVGKSyXwibcPq4BWmiaIGuG1icwxaQX6grC9VemZoJ8rg/132","id":"36689","idCard":"","isAc":0,"lastLoginTime":"2025-12-26 10:01:12","nickName":"微信用户","password":"","payPwd":"e10adc3949ba59abbe56e057f20f883e","phone":"18049104914","realName":"","sex":1,"status":1,"updateTime":"2025-12-26 09:59:31","usePayPwd":0,"wechatAcOpenId":"","wechatAcQrcode":"http://weixin.qq.com/q/029s5JtP1xfmJ1g_HDxFco","wechatOpenId":"or1l86yipGvwyfPhrKIAcQuSfAV8"})
// #endif
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const timeoutDuration = params.timeout || 10000; // 可以通过 params 传入超时时间,默认 10 秒 const timeoutDuration = params.timeout || 10000; // 可以通过 params 传入超时时间,默认 10 秒
uni.request({ uni.request({
@@ -75,7 +52,7 @@ export default async (params) => {
//获取成功 //获取成功
if (res.code == 200) { if (res.code == 200) {
uni.hideLoading(); uni.hideLoading();
uni.hideToast(); // uni.hideToast();
resolve(res.data ? res.data : true); resolve(res.data ? res.data : true);
} else { } else {
switch (res.code) { switch (res.code) {
@@ -158,7 +135,7 @@ export default async (params) => {
// 不管成功还是失败都会执行 // 不管成功还是失败都会执行
setTimeout((res) => { setTimeout((res) => {
uni.hideLoading(); uni.hideLoading();
uni.hideToast(); // uni.hideToast();
}, 10000); }, 10000);
}, },
}); });

View File

@@ -1,17 +1,16 @@
// const debug = process.env.NODE_ENV == 'development' ? true : false; // const debug = process.env.NODE_ENV == 'development' ? true : false;
const debug = false; // false线上 true本地 // const debug = false; // false线上 true本地
const debug = true; // false线上 true本地
let baseUrl = '' let baseUrl = ''
let baseUrlwws = '' let baseUrlwws = ''
const version = "100"; const version = "100";
const autoRemoveCache = { const autoRemoveCache = {
count: 100000, count: 100000,
size: 100000, size: 100000,
}; };
function init(){ function init() {
if (debug) { if (debug) {
baseUrl = 'http://192.168.1.42' baseUrl = 'http://192.168.1.42'
baseUrlwws = "ws://192.168.1.42:2348"; baseUrlwws = "ws://192.168.1.42:2348";
@@ -22,10 +21,10 @@ function init(){
// #ifdef H5 // #ifdef H5
if (debug) { if (debug) {
baseUrl = "/api"; baseUrl = "/testApi";
baseUrlwws = "http://192.168.1.42:2348"; baseUrlwws = "http://192.168.1.42:2348";
} else { } else {
baseUrl = "/prodApi"; baseUrl = "/prodApi";
baseUrlwws = "https://czgeatws.sxczgkj.com/wss"; baseUrlwws = "https://czgeatws.sxczgkj.com/wss";
} }
// #endif // #endif
@@ -47,7 +46,7 @@ export const changeEnv = (env) => {
let baseUrl = "http://192.168.1.42" let baseUrl = "http://192.168.1.42"
let baseUrlwws = "ws://192.168.1.42:2348" let baseUrlwws = "ws://192.168.1.42:2348"
// #ifdef H5 // #ifdef H5
baseUrl = "/api" baseUrl = "/testApi"
baseUrlwws = "http://192.168.1.42:2348" baseUrlwws = "http://192.168.1.42:2348"
// #endif // #endif
uni.conf = { uni.conf = {

View File

@@ -44,6 +44,9 @@ page,
image { image {
display: block; display: block;
} }
.relative{
position: relative;
}
.absolute{ .absolute{
position: absolute; position: absolute;
} }

View File

@@ -55,7 +55,7 @@
</template> </template>
</view> </view>
<!-- 优惠券名称与领取按钮 --> <!-- 优惠券名称与领取按钮 -->
<view class="u-flex u-row-between u-m-t-16"> <view class="u-flex u-row-between u-m-t-16 u-col-center">
<view> <view>
<text class="title">{{ item.couponInfo.title }}</text> <text class="title">{{ item.couponInfo.title }}</text>
<text class="num">x{{ item.num }}</text> <text class="num">x{{ item.num }}</text>
@@ -507,6 +507,7 @@ function close() {
outline: none; outline: none;
margin: 0; margin: 0;
cursor: pointer; cursor: pointer;
white-space: nowrap;
&:active { &:active {
background: #f07080; // 点击深色反馈 background: #f07080; // 点击深色反馈
} }

View File

@@ -1,6 +1,6 @@
<template> <template>
<block v-if="limitDiscount && limitDiscount.id" class="limit-price"> <block v-if="limitDiscount && limitDiscount.id" >
<text> <text class="limit-price">
{{ returnPrice() }} {{ returnPrice() }}
</text> </text>
</block> </block>
@@ -15,7 +15,6 @@
{{ cart.memberPrice }} {{ cart.memberPrice }}
</text> </text>
</block> </block>
<text v-else class="salePrice">{{ cart.salePrice }}</text> <text v-else class="salePrice">{{ cart.salePrice }}</text>
</text> </text>
</template> </template>

View File

@@ -1,260 +0,0 @@
<template>
<!-- 支付方式 -->
<view class="paymentMethod">
<view class="paymentMethod_content">
<view class="paymentMethod_title">支付方式</view>
<up-radio-group v-model="radiovalue" iconPlacement="right" @change="groupChanges" :size="28"
placement="column">
<block v-for="(item,index) in paymentMethodList" :key="index">
<view class="method_list" @click="groupChanges(item.type)" :class="{disabled:returnDisabled(item)}"
v-if="(index+1) == radiovalue?!changeFreeenable:true">
<view class="method_list_top">
<view class="method_list_top_left">
<image class="icon" :src="item.url" mode="aspectFill" />
<view class="method_list_top_cen">
<view class="name"> {{ item.name }} </view>
<view class="method_list_bom" v-if="item.type == 1">
<text class="balance">
当前余额{{orderVIP?(orderVIP.amount||0):0}}</text>
<text class="topUpNow" @click="goRecharge">去充值</text>
</view>
</view>
</view>
<up-radio :disabled="returnDisabled(item)" activeColor="#E8AD7B" icon-size="18" size="18" :name="item.type">
</up-radio>
</view>
</view>
</block>
</up-radio-group>
</view>
</view>
</template>
<script setup>
import {
ref,
reactive,
defineProps,
computed,
defineEmits,
watch,
watchEffect,
defineExpose
} from 'vue'
const props = defineProps({
rechargeFreeChecked: {
type: Boolean,
default: false
},
payAmount: {
type: Number,
default: 0
},
freeCheck: {
type: Boolean,
default: false
},
changeFreeenable: {
type: Boolean,
default: false
},
disablePayType: {
type: Array,
default: () => {
return []
}
}
});
function returnDisabled(item) {
if (props.disablePayType.includes(item.name)) {
return true
}else{
return false
}
}
const orderVIP = ref(null)
const emits = defineEmits(['customevent', 'groupChange']);
watchEffect(() => {
orderVIP.value = uni.cache.get('orderVIP')
})
const orderVIPfun = (data) => {
orderVIP.value = data
}
const paymentMethodList = ref([
// #ifdef MP-WEIXIN
{
name: "微信支付",
type: 2,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/weChat.png",
payType: 'wechatPay'
},
// #endif
// #ifdef MP-ALIPAY
{
name: "支付宝支付",
type: 3,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/alipay.png",
payType: 'aliPay'
},
// #endif
{
name: "余额支付",
type: 1,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/drder/wechat.png",
payType: 'accountPay'
}
])
const paymentMethodName = ref([{
name: "余额支付",
type: 1,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/drder/wechat.png",
payType: 'accountPay'
},
{
name: "微信支付",
type: 2,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/weChat.png",
payType: 'wechatPay'
},
{
name: "支付宝支付",
type: 3,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/alipay.png",
payType: 'aliPay'
},
])
const radiovalue = ref(2) // 支付方式
const ispws = ref(false) // 输入支付密码
const storeInfo = ref({})
// * 监听支付方式切换
const groupChanges = (type) => {
if (props.freeCheck && type == 1) {
return;
}
const item=paymentMethodList.value.find(v=>v.type==type)
if(item&&returnDisabled(item)){
uni.showToast({
title:"当前支付方式不可用",
icon:'none'
})
return
}
// if (props.payAmount <= 0 && type != 1) {
// return;
// }
radiovalue.value = type;
let name = paymentMethodName.value[type - 1].name;
emits("groupChange", paymentMethodName.value[type - 1])
}
// 去充值
const goRecharge = () => {
if (orderVIP.value.isVip) {
uni.navigateTo({
url: '/pages/user/member/czzx?shopId=' + orderVIP.value.shopId
})
return
}
uni.navigateTo({
url: '/user/vip/buy-vip?shopId=' + orderVIP.value.shopId
})
// uni.pro.navigateTo('user/member/index', {
// shopId: orderVIP.value.shopId
// })
}
// 将方法暴露给父组件
defineExpose({
groupChanges,
orderVIPfun
});
</script>
<style lang="scss">
.paymentMethod {
box-sizing: border-box;
margin-top: 30rpx;
border-radius: 18rpx;
.paymentMethod_content {
background-color: #fff;
border-radius: 22rpx;
padding: 30rpx 30rpx 0 30rpx;
box-sizing: border-box;
.paymentMethod_title {
font-weight: 500;
font-size: 32rpx;
color: #333333;
box-sizing: border-box;
}
.method_list {
padding: 40rpx 0;
box-sizing: border-box;
&.disabled{
opacity: .6;
}
.method_list_top {
display: flex;
justify-content: space-between;
.method_list_top_left {
display: flex;
align-items: center;
.icon {
width: 54.67rpx !important;
height: 48rpx !important;
margin-right: 22rpx;
}
.name {
font-size: 32rpx;
font-weight: 500;
color: #333;
}
.method_list_top_cen {
display: flex;
flex-direction: column;
}
}
}
.method_list_bom {
display: flex;
align-items: center;
.balance {
margin-right: 20rpx;
font-size: 24rpx;
}
.topUpNow {
color: #FF803D;
font-size: 28rpx;
}
}
}
.method_list:nth-child(odd) {
border-bottom: 2rpx solid #e5e5e5;
}
}
}
</style>

View File

@@ -15,7 +15,7 @@
<view class="name"> {{ item.name }} </view> <view class="name"> {{ item.name }} </view>
<view class="method_list_bom" v-if="item.name == '余额支付'"> <view class="method_list_bom" v-if="item.name == '余额支付'">
<text class="balance"> <text class="balance">
当前余额{{ orderVIP ? orderVIP.amount || 0 : 0 }}</text> 当前余额{{ shopUserInfo ? shopUserInfo.amount || 0 : 0 }}</text>
<text class="topUpNow" @click="goRecharge">去充值</text> <text class="topUpNow" @click="goRecharge">去充值</text>
</view> </view>
</view> </view>
@@ -66,6 +66,14 @@ const props = defineProps({
type: Array, type: Array,
default: () => [], default: () => [],
}, },
shopUserInfo:{
type: Object,
default: () => {
return{
amount:0
}
},
}
}); });
// 工具函数 - 深拷贝对象(切断引用) // 工具函数 - 深拷贝对象(切断引用)
@@ -77,15 +85,10 @@ function returnDisabled(item) {
return props.disablePayType.includes(item.name); return props.disablePayType.includes(item.name);
} }
const orderVIP = ref(null);
const emits = defineEmits(["customevent", "groupChange"]); const emits = defineEmits(["customevent", "groupChange"]);
watchEffect(() => {
orderVIP.value = uni.cache.get("orderVIP");
});
const orderVIPfun = (data) => {
orderVIP.value = data;
};
// 支付方式列表(保持不变) // 支付方式列表(保持不变)
const paymentMethodList = ref([ const paymentMethodList = ref([
@@ -94,7 +97,7 @@ const paymentMethodList = ref([
name: "微信支付", name: "微信支付",
type: 2, type: 2,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/weChat.png", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/weChat.png",
payType: "wechatPay", payType: "WECHAT",
}, },
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
@@ -207,13 +210,12 @@ const goRecharge = () => {
return; return;
} }
uni.navigateTo({ uni.navigateTo({
url: `/pages/user/member/czzx?shopId=${orderVIP.value?.shopId || ''}`, url: `/pages/user/member/czzx?shopId=${props.shopUserInfo?.shopId || ''}`,
}); });
}; };
defineExpose({ defineExpose({
groupChanges, groupChanges,
orderVIPfun,
}); });
</script> </script>

View File

@@ -0,0 +1,38 @@
<template>
<view class="relative">
<slot v-if="$slots.default" name="default"></slot>
<up-icon v-else name="share-square" bold :color="color" :size="size"></up-icon>
<view class="absolute share-box">
<button open-type="share" @click="shareClick">分享</button>
</view>
</view>
</template>
<script setup>
const emits = defineEmits(['shareClick'])
const props = defineProps({
size: {
type: String,
default: '36rpx'
},
color:{
type: String,
default: '#333'
}
})
function shareClick() {
emits('shareClick')
}
</script>
<style lang="scss">
.share-box {
left: 0;
right: 0;
bottom: 0;
top: 0;
opacity: 0;
overflow: hidden;
}
</style>

View File

@@ -45,17 +45,17 @@
</view> </view>
</view> </view>
<view> <view>
<view <!-- <view
class="u-p-t-16 u-p-b-20 u-flex u-p-l-28 u-p-r-28" class="u-p-t-16 u-p-b-20 u-flex u-p-l-28 u-p-r-28"
style="align-items: baseline; justify-content: flex-end" style="align-items: baseline; justify-content: flex-end"
> >
<text class="color-666 font-12"> 总计</text> <text class="color-666 font-12"> 总计</text>
<text class="font-16 color-333 font-700" v-if="centerUserInfo"> <text class="font-16 color-333 font-700" >
{{ centerUserInfo.totalIncome }}</text {{ totalIncome }}</text
> >
</view> </view> -->
<view class="list"> <view class="list u-m-t-32">
<view v-for="(item, index) in state.records" :key="index" class="item"> <view v-for="(item, index) in state.records" :key="index" class="item">
<view class="u-flex justify-between"> <view class="u-flex justify-between">
<view> <view>
@@ -113,6 +113,7 @@
<scroll-view <scroll-view
class="popup-list" class="popup-list"
direction="vertical" direction="vertical"
:scroll-y="true"
@scrollend="scrollBottom" @scrollend="scrollBottom"
> >
<view <view
@@ -301,6 +302,7 @@ async function centerUser() {
} }
onShow(() => {}); onShow(() => {});
onLoad(async (opt) => { onLoad(async (opt) => {
await getCouponShopsAjax(); await getCouponShopsAjax();
@@ -314,13 +316,24 @@ onLoad(async (opt) => {
} }
if (opt.shopId) { if (opt.shopId) {
querForm.value.shopId = opt.shopId; querForm.value.shopId = opt.shopId;
const findItem = couponShops.value.find((item) => item.id == opt.shopId); const findItem = shopList.value.find((item) => item.shopId == opt.shopId);
querForm.value.shopName = findItem.shopName || ""; querForm.value.shopName = findItem.shopName || "";
} }
centerUser(); centerUser();
getIncomeDetailsAjax(); getIncomeDetailsAjax();
}); });
const totalIncome=computed(()=>{
if(!querForm.value.shopId){
return centerUserInfo.value?(centerUserInfo.value.totalIncome||0):0;
}
const findItem = shopList.value.find((item) => item.shopId == querForm.value.shopId );
if(findItem){
return findItem.income||0
}
return 0
})
watch( watch(
() => querForm.value.status, () => querForm.value.status,
(newVal, oldVal) => { (newVal, oldVal) => {

View File

@@ -1,228 +1,260 @@
<template> <template>
<view class=""> <view class="">
<view class="w-qrcode"> <view class="w-qrcode">
<w-qrcode <w-qrcode :options="codeOptions" :opacity="0" ref="wQrcode" @generate="(e) => qrcodeResult(e)"></w-qrcode>
:options="codeOptions" </view>
:opacity="0" <up-popup :show="show" bgColor="transparent" :safeAreaInsetBottom="false" :closeOnClickOverlay="true" @close="close" mode="center">
ref="wQrcode" <view class="box">
@generate="(e) => qrcodeResult(e)" <view class="info">
></w-qrcode> <view class="u-flex justify-center">
</view> <up-avatar size="214rpx" :src="shopUserInfo.headImg"></up-avatar>
</view>
<up-popup <view class="u-m-t-48 font-14 font-700 color-333 text-center line-height-54">
:show="show" <view>{{ shopUserInfo.nickName }}</view>
bgColor="transparent" <view>{{ desensitizePhone(shopUserInfo.phone) }}</view>
:safeAreaInsetBottom="false" </view>
:closeOnClickOverlay="true" <view class="u-m-t-16 font-14 line-height-54 text-center">
@close="close" <text class="color-666">邀请码</text>
mode="center" <text class="u-m-l-16 u-m-r-16 color-333 font-16 font-700">{{ inviteCode }}</text>
> <text class="" style="color: #fe6d11" @click="copyCode">复制</text>
<view class="box"> </view>
<view class="info"> <view class="u-flex justify-center" style="margin-top: 90rpx">
<view class="u-flex justify-center"> <!-- <w-qrcode
<up-avatar size="214rpx" :src="shopUserInfo.headImg"></up-avatar>
</view>
<view
class="u-m-t-48 font-14 font-700 color-333 text-center line-height-54"
>
<view>{{ shopUserInfo.nickName }} </view>
<view>{{ desensitizePhone(shopUserInfo.phone) }}</view>
</view>
<view class="u-m-t-16 font-14 line-height-54 text-center">
<text class="color-666">邀请码</text>
<text class="u-m-l-16 u-m-r-16 color-333 font-16 font-700">{{
inviteCode
}}</text>
<text class="" style="color: #fe6d11" @click="copyCode">复制</text>
</view>
<view class="u-flex justify-center" style="margin-top: 90rpx">
<!-- <w-qrcode
:options="codeOptions" :options="codeOptions"
:opacity="1" :opacity="1"
ref="wQrcode" ref="wQrcode"
@generate="(e) => qrcodeResult(e)" @generate="(e) => qrcodeResult(e)"
></w-qrcode> --> ></w-qrcode> -->
<up-image width="322rpx" height="322rpx" :src="code"></up-image> <up-image width="322rpx" height="322rpx" :src="code"></up-image>
</view> </view>
</view>
<view class="u-m-t-60 u-flex u-col-center justify-center"> <view class="footer-wrap">
<view class="confirm" @click="save">保存图片</view> <view class="confirm line" @click="save">保存图片</view>
</view> <ymf-share><view class="confirm">微信分享</view></ymf-share>
</view> </view>
</view> </view>
</up-popup> </up-popup>
</view> </view>
</template> </template>
<script setup> <script setup>
import wQrcode from "@/uni_modules/wmf-code/components/w-qrcode/w-qrcode.vue"; import { shareMixin, handleMixinOnLoad, returnQuery } from '@/utils/share.js';
import {desensitizePhone} from "@/utils/util.js"; import ymfShare from '@/components/ymf-components/ymf-share.vue';
import { ref } from "vue"; import wQrcode from '@/uni_modules/wmf-code/components/w-qrcode/w-qrcode.vue';
const props = defineProps({ import { desensitizePhone } from '@/utils/util.js';
inviteCode: { import { ref, onMounted, nextTick } from 'vue';
type: String,
default: "", onMounted(async () => {
}, setTimeout(async () => {
shopUserInfo: { await nextTick();
type: Object, const query = await returnQuery();
default: () => {}, codeOptions.value.code = `https://cashier.sxczgkj.com/invite?${removeQAndAfter(query)}`;
}, console.log('codeOptions.value', codeOptions.value);
}, 500);
}); });
const codeOptions = ref({
size: 200, /**
code: props.inviteCode, * 截取字符串,移除 &q 及后面的所有内容
}); * @param {string} str - 原始字符串
function copyCode() { * @returns {string} 处理后的字符串
uni.setClipboardData({ */
data: props.inviteCode, function removeQAndAfter(str) {
success: function () { // 检查是否为空字符串
console.log("success"); if (!str || typeof str !== 'string') {
}, return str || '';
}); }
// 找到 &q 的起始位置
const qIndex = str.indexOf('&q');
// 如果找到 &q截取前面的部分否则返回原字符串
return qIndex !== -1 ? str.slice(0, qIndex) : str;
} }
const code = ref("");
const props = defineProps({
inviteCode: {
type: String,
default: ''
},
shopUserInfo: {
type: Object,
default: () => {}
}
});
const codeOptions = ref({
padding: 10,
size: 200,
code: ''
});
function copyCode() {
uni.setClipboardData({
data: props.inviteCode,
success: function () {
console.log('success');
}
});
}
const code = ref('');
function qrcodeResult(e) { function qrcodeResult(e) {
console.log("qrcodeResult", e); console.log('qrcodeResult', e);
code.value = e.img.tempFilePath; code.value = e.img.tempFilePath;
console.log("code", code.value); console.log('code', code.value);
} }
const show = defineModel({ const show = defineModel({
type: Boolean, type: Boolean,
default: false, default: false
}); });
const emits = defineEmits(["cancel", "confirm"]); const emits = defineEmits(['cancel', 'confirm']);
function close() { function close() {
show.value = false; show.value = false;
emits("cancel"); emits('cancel');
} }
function save() { function save() {
show.value = false; show.value = false;
// 保存图片到相册 // 保存图片到相册
uni.saveImageToPhotosAlbum({ uni.saveImageToPhotosAlbum({
filePath: code.value, filePath: code.value,
success: function () { success: function () {
uni.showToast({ uni.showToast({
title: "保存成功", title: '保存成功',
icon: 'none' icon: 'none'
}); });
}, },
fail: function (err) { fail: function (err) {
console.log('保存失败原因:', err); console.log('保存失败原因:', err);
// 判断是否为授权拒绝(微信小程序授权拒绝的特征) // 判断是否为授权拒绝(微信小程序授权拒绝的特征)
if (err.errMsg.includes('auth deny') || err.errMsg.includes('authorize fail')) { if (err.errMsg.includes('auth deny') || err.errMsg.includes('authorize fail')) {
// 弹出提示引导用户去设置页开启授权 // 弹出提示引导用户去设置页开启授权
uni.showModal({ uni.showModal({
title: '授权提示', title: '授权提示',
content: '保存图片需要授权访问相册,请前往设置开启授权', content: '保存图片需要授权访问相册,请前往设置开启授权',
showCancel: true, showCancel: true,
cancelText: '取消', cancelText: '取消',
confirmText: '去设置', confirmText: '去设置',
success: function (res) { success: function (res) {
if (res.confirm) { if (res.confirm) {
// 跳转到微信小程序的授权设置页 // 跳转到微信小程序的授权设置页
uni.openSetting({ uni.openSetting({
success: function (settingRes) { success: function (settingRes) {
// 检查用户是否开启了相册授权 // 检查用户是否开启了相册授权
if (settingRes.authSetting['scope.writePhotosAlbum']) { if (settingRes.authSetting['scope.writePhotosAlbum']) {
uni.showToast({ uni.showToast({
title: '授权成功,可重新保存', title: '授权成功,可重新保存',
icon: 'none' icon: 'none'
}); });
} else { } else {
uni.showToast({ uni.showToast({
title: '未开启授权,保存失败', title: '未开启授权,保存失败',
icon: 'none' icon: 'none'
}); });
} }
}, },
fail: function () { fail: function () {
uni.showToast({ uni.showToast({
title: '打开设置失败', title: '打开设置失败',
icon: 'none' icon: 'none'
}); });
} }
}); });
} }
} }
}); });
} else { } else {
// 非授权问题的保存失败(如文件路径错误、系统问题等) // 非授权问题的保存失败(如文件路径错误、系统问题等)
uni.showToast({ uni.showToast({
title: "保存失败", title: '保存失败',
icon: 'none' icon: 'none'
}); });
} }
}, }
}); });
emits("confirm", code.value); emits('confirm', code.value);
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.info .canvas) { :deep(.info .canvas) {
opacity: 1; opacity: 1;
} }
.border { .border {
border: 2rpx solid #d9d9d9; border: 2rpx solid #d9d9d9;
padding: 18rpx; padding: 18rpx;
border-radius: 4rpx; border-radius: 4rpx;
} }
.box { .box {
width: 638rpx; width: 638rpx;
background-color: #fff; background-color: #fff;
border-radius: 16rpx; border-radius: 16rpx;
overflow: hidden; // overflow: hidden;
.title { position: relative;
color: #000000; .title {
font-size: 32rpx; color: #000000;
font-weight: 700; font-size: 32rpx;
} font-weight: 700;
.top { }
border-bottom: 2rpx solid #ededed; .top {
} border-bottom: 2rpx solid #ededed;
.info { }
padding: 96rpx 40rpx 96rpx 40rpx; .info {
font-size: 28rpx; padding: 96rpx 40rpx 96rpx 40rpx;
} font-size: 28rpx;
.small-title { }
min-width: 84rpx; .small-title {
text-align: right; min-width: 84rpx;
} text-align: right;
}
.footer-wrap {
width: 100%;
position: absolute;
left: 0;
bottom: -100upx;
display: flex;
gap: 28upx;
}
} }
.cancel { .cancel {
padding: 14rpx 76rpx; padding: 14rpx 76rpx;
border-radius: 36rpx; border-radius: 36rpx;
border: 2rpx solid #e8ad7b; border: 2rpx solid #e8ad7b;
color: #e8ad7b; color: #e8ad7b;
font-size: 32rpx; font-size: 32rpx;
font-weight: 400; font-weight: 400;
white-space: nowrap; white-space: nowrap;
line-height: 48rpx; line-height: 48rpx;
} }
.confirm { .confirm {
padding: 14rpx 76rpx; $color: #e8ad7b;
border-radius: 16rpx; flex: 1;
background-color: #e8ad7b; padding: 14rpx 76rpx;
border: 2rpx solid #e8ad7b; border-radius: 16rpx;
color: #fff; background-color: $color;
font-size: 32rpx; border: 2rpx solid $color;
font-weight: 400; color: #fff;
line-height: 48rpx; font-size: 32rpx;
white-space: nowrap; font-weight: 400;
white-space: nowrap;
display: flex;
justify-content: center;
align-items: center;
&.line {
background-color: #fff;
color: $color;
}
} }
.line-height-54 { .line-height-54 {
line-height: 54rpx; line-height: 54rpx;
} }
.w-qrcode { .w-qrcode {
position: fixed; position: fixed;
left: -9999px; left: -9999px;
top: -9999px; top: -9999px;
z-index: -1; z-index: -1;
} }
</style> </style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -566,7 +566,7 @@ export function calcSingleGoodsRealPrice(
> >
) : number { ) : number {
const { isMember, memberDiscountRate, limitTimeDiscount: activity } = config; const { isMember, memberDiscountRate, limitTimeDiscount: activity } = config;
console.log('isMember',isMember);
//如果是增菜价格为0 //如果是增菜价格为0
if (goods.is_gift || goods.isGift) { if (goods.is_gift || goods.isGift) {
return 0; return 0;

View File

@@ -7,7 +7,7 @@
"lodash": "^4.17.21", "lodash": "^4.17.21",
"pinia": "^2.3.1", "pinia": "^2.3.1",
"pinia-plugin-unistorage": "^0.1.2", "pinia-plugin-unistorage": "^0.1.2",
"ysk-utils": "^1.0.81" "ysk-utils": "^1.0.83"
}, },
"devDependencies": { "devDependencies": {
"unplugin-auto-import": "^0.16.7" "unplugin-auto-import": "^0.16.7"

View File

@@ -2,6 +2,7 @@
"easycom": { "easycom": {
"autoscan": true, "autoscan": true,
"custom": { "custom": {
"^my-(.*)": "@/components/ymf-components/ymf-$1.vue",
"^u--(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue", "^u--(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
"^up-(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue", "^up-(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
"^u-([^-].*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue" "^u-([^-].*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue"

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,6 @@
<image :src="imgs.code" class="code"></image> <image :src="imgs.code" class="code"></image>
</view> </view>
</view> </view>
<view class="new-menus-box"> <view class="new-menus-box">
<view class="new-menus layout2" v-if="allConfig.takeout"> <view class="new-menus layout2" v-if="allConfig.takeout">
<view class="diner" @click="scanCodehandle(0)"> <view class="diner" @click="scanCodehandle(0)">
@@ -60,7 +59,6 @@
<view class="u-font-28 color-999">一键分享快速拼单</view> <view class="u-font-28 color-999">一键分享快速拼单</view>
</view> </view>
</view> </view>
<view class="points" @click="toIntegralMall"> <view class="points" @click="toIntegralMall">
@@ -167,7 +165,7 @@
function toGroupBuying() { function toGroupBuying() {
uni.navigateTo({ uni.navigateTo({
url: '/groupBuying/index/index' url: '/groupBuying/index/index'
}) });
} }
function toFenxiao() { function toFenxiao() {
@@ -215,7 +213,7 @@
function toTaocan() { function toTaocan() {
uni.navigateTo({ uni.navigateTo({
url: '/userPackage/index/index' url: '/userPackage/index/index'
}) });
} }
const memberindex = (url) => { const memberindex = (url) => {
@@ -301,7 +299,7 @@
function getHomeData() { function getHomeData() {
homeData().then((res) => { homeData().then((res) => {
Object.assign(allConfig, res); Object.assign(allConfig, res);
imgs.defaultAvatar = res.userAvatar ? res.userAvatar : imgs.defaultAvatar imgs.defaultAvatar = res.userAvatar ? res.userAvatar : imgs.defaultAvatar;
}); });
} }
onMounted(() => { onMounted(() => {
@@ -316,6 +314,9 @@
defineExpose({ defineExpose({
updateData updateData
}); });
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@@ -7,14 +7,21 @@
<view class="limitDiscount" v-if="showLimitDiscount(item)" <view class="limitDiscount" v-if="showLimitDiscount(item)"
>限时折扣</view >限时折扣</view
> >
<up-image <up-image
width="76" width="76"
height="76" height="76"
radius="6" radius="6"
:src="item.productImg" :src="item.productImg"
v-if="item.productId != -999" v-if="item.isTemporary != 1&&item.is_temporary!=1"
></up-image> ></up-image>
<up-image
v-else-if="(item.isTemporary||item.is_temporary) &&(item.product_name=='签子'||item.productName=='签子')"
width="76"
height="76"
radius="6"
src="https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/5/b97054debd83486ab7ad8e20ca6a360a.png"
mode="heightFix"
></up-image>
<up-image <up-image
width="76" width="76"
height="76" height="76"
@@ -25,7 +32,7 @@
></up-image> ></up-image>
</view> </view>
<view class="info"> <view class="info">
<text class="productName">{{ item.productName }}</text> <text class="productName">{{ item.productName||item.product_name }}</text>
<text class="productSkuName" v-if="item.skuName">{{ <text class="productSkuName" v-if="item.skuName">{{
item.skuName item.skuName
}}</text> }}</text>
@@ -55,18 +62,22 @@
<view class="price"> <view class="price">
<view class="priceAmount"> <view class="priceAmount">
¥ ¥
<goodsPrice <goodsPrice
v-if="!item.is_temporary&&!item.isTemporary"
:cart="item" :cart="item"
:limitDiscount="limitDiscount" :limitDiscount="limitDiscount"
:shopUserInfo="shopUserInfo" :shopUserInfo="shopUserInfo"
:shopInfo="shopInfo" :shopInfo="shopInfo"
idKey="product_id" idKey="product_id"
></goodsPrice> ></goodsPrice>
<text v-else>{{item.discount_sale_amount}}</text>
<view class="old-price" v-if="showLimitDiscount(item)" <view class="old-price" v-if="showLimitDiscount(item)"
>¥{{ item.salePrice }}</view >¥{{ item.salePrice }}</view
> >
</view> </view>
<view class="num">x{{ item.num }}</view> <view class="num" v-if="!item.is_temporary&&!item.isTemporary">x{{ item.num }}</view>
<view class="num" v-else>x{{ item.number }}</view>
</view> </view>
</view> </view>
</view> </view>

View File

@@ -40,10 +40,20 @@
:nowCarts="nowCarts" :nowCarts="nowCarts"
:limitDiscount="cartStore.limitTimeDiscount" :limitDiscount="cartStore.limitTimeDiscount"
></orderItemVue> --> ></orderItemVue> -->
<orderItemVue :useVipPrice="useVipPrice" v-if="cartStore.allGoods.length" :nowCarts="cartStore.allGoods" <orderItemVue :useVipPrice="useVipPrice" v-if="nowCarts" :nowCarts="nowCarts"
:shopInfo="cartStore.shopInfo" :shopUserInfo="cartStore.shopUserInfo" :shopInfo="cartStore.shopInfo" :shopUserInfo="cartStore.shopUserInfo"
:limitDiscount="cartStore.limitTimeDiscount"></orderItemVue> :limitDiscount="cartStore.limitTimeDiscount"></orderItemVue>
<view class="u-flex u-row-center u-m-t-16 u-font-28" v-if="cartStore.allGoods.length>4">
<view class="u-flex u-col-baseline" @click="showAllGoods=!showAllGoods">
<text>{{showAllGoods?'收起':'展开'}}</text>
<view class="guodu u-m-l-10 u-m-t-2" :class="{rotate:!showAllGoods}">
<up-icon name="arrow-down" size="14"></up-icon>
</view>
</view>
</view>
<template v-if="listinfo.id&&listinfo.status=='done'"> <template v-if="listinfo.id&&listinfo.status=='done'">
<view class="cell-item" v-if="is_type != 0"> <view class="cell-item" v-if="is_type != 0">
<view class="label">打包费</view> <view class="label">打包费</view>
@@ -329,6 +339,8 @@
BigNumber BigNumber
} from "bignumber.js"; } from "bignumber.js";
const showAllGoods=ref(false)
let hasCouponCanUse = ref(false); let hasCouponCanUse = ref(false);
const usePoints = ref(false); const usePoints = ref(false);
@@ -852,6 +864,16 @@
await getConsumeDiscount(); await getConsumeDiscount();
getDiscountActivity(); getDiscountActivity();
}); });
const nowCarts=computed(()=>{
if(cartStore.allGoods.length<=0){
return []
}
if(showAllGoods.value){
return cartStore.allGoods
}
return cartStore.allGoods.slice(0,4)
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -1587,4 +1609,11 @@
} }
} }
} }
.guodu{
transition:all .3s linear;
padding-top: 2rpx;
}
.rotate{
transform: rotate(-90deg);
}
</style> </style>

View File

@@ -70,7 +70,10 @@
<view class="item" v-for="item in value" :key="item.id"> <view class="item" v-for="item in value" :key="item.id">
<view class="cover"> <view class="cover">
<up-image width="76" height="76" radius="16" :src="item.productImg" <up-image width="76" height="76" radius="16" :src="item.productImg"
v-if="item.productId!=-999"></up-image> v-if="!item.isTemporary"></up-image>
<u-image width="56" height="56" radius="10"
v-else-if="item.isTemporary &&item.productName=='签子'"
src="https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/5/b97054debd83486ab7ad8e20ca6a360a.png"></u-image>
<up-image width="76" height="76" radius="16" <up-image width="76" height="76" radius="16"
:src="'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/table.png'" :src="'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/table.png'"
mode="heightFix" v-else></up-image> mode="heightFix" v-else></up-image>

File diff suppressed because it is too large Load Diff

View File

@@ -67,7 +67,7 @@
</rechargeFree> </rechargeFree>
<!-- 支付方式 --> <!-- 支付方式 -->
<paymentMethodes ref="paymentMethodref" :orderVIP="orderVIP" @groupChange="groupChange" <paymentMethodes ref="paymentMethodref" :shopUserInfo="orderVIP" @groupChange="groupChange"
:disablePayType="disablePayType" :changeFreeenable="isBwc" v-model="paymentmethod" :disablePayType="disablePayType" :changeFreeenable="isBwc" v-model="paymentmethod"
v-if="listinfo.status == 'unpaid' || !listinfo.id"> v-if="listinfo.status == 'unpaid' || !listinfo.id">
<template #bottom> <template #bottom>
@@ -203,6 +203,7 @@
useWebSocket useWebSocket
} from "@/stores/carts-websocket.js"; } from "@/stores/carts-websocket.js";
import * as chatApi from "@/http/php/chat"; import * as chatApi from "@/http/php/chat";
import * as rechargeApi from '@/common/api/market/recharge.js'
import MsgListItem from '@/components/msg-list-item/msg-list-item.vue' import MsgListItem from '@/components/msg-list-item/msg-list-item.vue'
@@ -576,7 +577,7 @@
name: "微信支付", name: "微信支付",
type: 2, type: 2,
url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/weChat.png", url: "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/weChat.png",
payType: "wechatPay", payType: "WECHAT",
}; };
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
@@ -858,8 +859,6 @@
icon: "none", icon: "none",
}); });
const shopUserInfo = uni.cache.get("shopUserInfo"); const shopUserInfo = uni.cache.get("shopUserInfo");
console.log("shopUserInfo", shopUserInfo);
console.log("listinfo", listinfo);
if (shopUserInfo) { if (shopUserInfo) {
if (shopUserInfo.userId == listinfo.userId) { if (shopUserInfo.userId == listinfo.userId) {
pay_unlock(); pay_unlock();
@@ -1011,7 +1010,6 @@
// 更新数据 // 更新数据
if (orderVIP.value) { if (orderVIP.value) {
orderVIP.value = uni.cache.get("orderVIP"); orderVIP.value = uni.cache.get("orderVIP");
paymentMethodref.value.orderVIPfun(uni.cache.get("orderVIP"));
if (listinfo.id && ordershopUserInfo.value.registerType != "before") { if (listinfo.id && ordershopUserInfo.value.registerType != "before") {
orderorderInfo(); orderorderInfo();
} }
@@ -1034,7 +1032,7 @@
console.log("跳转到加菜页面"); console.log("跳转到加菜页面");
const arr= getCurrentPages() const arr= getCurrentPages()
console.log(arr); console.log(arr);
if(arr[arr.length-1]&&arr[arr.length-1].route=='pages/product/index'){ if(arr.length>=2&&arr[arr.length-2]&&arr[arr.length-2].route=='pages/product/index'){
back(); back();
}else{ }else{
uni.cache.set('tableCode',listinfo.tableCode) uni.cache.set('tableCode',listinfo.tableCode)
@@ -1113,10 +1111,11 @@
} }
const limitTimeDiscountRes = ref(null) const limitTimeDiscountRes = ref(null)
const rechargeConfig=ref(null)
async function init(opt) { async function init(opt) {
await storeuser.actionsproductqueryProduct(); const res1= await storeuser.actionsproductqueryProduct();
orderVIP.value=res1
console.log("init"); console.log('orderVIP',orderVIP.value)
cartStore.clearOrderConfig(); cartStore.clearOrderConfig();
Object.assign(options, opt); Object.assign(options, opt);
listinfo.id = options.orderId; listinfo.id = options.orderId;
@@ -1146,10 +1145,23 @@
} }
} }
//获取台桌信息
let tableRes = await getTableInfo({
tableCode: options.tableCode || "",
});
console.log("tableRes", tableRes);
listinfo.tableName = tableRes?tableRes.name:'';
//获取店铺信息 //获取店铺信息
const shopInfoRes = await APIusershopInfodetail({ const shopInfoRes = await APIusershopInfodetail({
shopId: options.shopId, shopId: options.shopId,
}); });
//智慧充值
const rechargeConfigRes=await rechargeApi.config({shopId: options.shopId})
if(rechargeConfigRes&&typeof rechargeConfigRes ==='object'){
rechargeConfig.value=rechargeConfigRes
}
//获取积分配置 //获取积分配置
pointsApi.pointsConfig().then(res => { pointsApi.pointsConfig().then(res => {
cartStore.setPointDeductionRule(res); cartStore.setPointDeductionRule(res);
@@ -1274,6 +1286,9 @@
if (!isCanUseCharge.value) { if (!isCanUseCharge.value) {
arr.add("余额支付"); arr.add("余额支付");
} }
if(rechargeConfig.value&&!rechargeConfig.value.isEnable){
arr.add("余额支付");
}
return Array.from(arr); return Array.from(arr);
}); });

View File

@@ -316,7 +316,7 @@
const paymentmethod = reactive({ const paymentmethod = reactive({
radiovalue: 2, radiovalue: 2,
paymentBtnText: "微信支付", paymentBtnText: "微信支付",
payType: 'wechatPay' payType: 'WECHAT'
}) })
const groupChange = async (e) => { const groupChange = async (e) => {
@@ -583,7 +583,6 @@
console.log(uni.cache.get('orderVIP')) console.log(uni.cache.get('orderVIP'))
orderVIP.value = uni.cache.get('orderVIP') orderVIP.value = uni.cache.get('orderVIP')
ordershopUserInfo.value = orderVIP.value.shopInfo ordershopUserInfo.value = orderVIP.value.shopInfo
paymentMethodref.value.orderVIPfun(uni.cache.get('orderVIP'))
if (orderId.value) { if (orderId.value) {
orderorderInfo() orderorderInfo()
} }

View File

@@ -62,9 +62,15 @@
<view class="shop-info"> <view class="shop-info">
<view class="shop-item"> <view class="shop-item">
<view class="cover" v-for="(item1,index1) in item.goods" :key="index1"> <view class="cover" v-for="(item1,index1) in item.goods" :key="index1">
<u-image width="56" height="56" radius="10" :src='item1.productImg'
v-if="item1.productId!=-999"></u-image> <u-image width="56" height="56" radius="10" :src="item1.productImg"
<u-image width="112" height="112" radius="20" v-if="!item1.isTemporary"></u-image>
<u-image width="56" height="56" radius="10"
v-else-if="item1.isTemporary &&item1.productName=='签子'"
src="https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/5/b97054debd83486ab7ad8e20ca6a360a.png"
></u-image>
<u-image width="56" height="56" radius="10"
:src="'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/table.png'" :src="'https://czg-qr-order.oss-cn-beijing.aliyuncs.com/confirmOrder/table.png'"
mode="heightFix" v-else></u-image> mode="heightFix" v-else></u-image>
<text class="productName"> {{ item1.productName }} </text> <text class="productName"> {{ item1.productName }} </text>
@@ -130,32 +136,37 @@
import { import {
useNavbarStore useNavbarStore
} from '@/stores/navbarStore'; } from '@/stores/navbarStore';
import {APIshopUserInfo} from '@/common/api/member.js' import {
APIshopUserInfo
} from '@/common/api/member.js'
const store = useNavbarStore(); const store = useNavbarStore();
async function agignOrder(item){ async function agignOrder(item) {
await APIshopUserInfo({ await APIshopUserInfo({
shopId:item.shopId shopId: item.shopId
}).then(shopUserInfo=>{ }).then(shopUserInfo => {
if(shopUserInfo){ if (shopUserInfo) {
uni.cache.set("dinersNum", 1); uni.cache.set("dinersNum", 1);
uni.cache.set("tableCode", shopUserInfo.id); uni.cache.set("tableCode", shopUserInfo.id);
uni.cache.set("shopId", item.shopId); uni.cache.set("shopId", item.shopId);
uni.navigateTo({ uni.navigateTo({
url: "/pages/product/index?type=beforehand&order_id="+item.id+'&one_more_order=1', url: "/pages/product/index?type=beforehand&order_id=" + item.id +
'&one_more_order=1&shopId='+item.shopId,
}); });
} }
}) })
} }
function totalGoodsNum(arr){
if(!arr){ function totalGoodsNum(arr) {
if (!arr) {
return 0 return 0
} }
return arr.reduce((prve,cur)=>{ return arr.reduce((prve, cur) => {
return prve+cur.num return prve + cur.num
},0) }, 0)
} }
function isRemoveOrder(item) { function isRemoveOrder(item) {
uni.showModal({ uni.showModal({
title: '提示', title: '提示',
@@ -578,7 +589,8 @@
.ml-20 { .ml-20 {
margin-left: 20rpx; margin-left: 20rpx;
} }
.take_food_number{
.take_food_number {
padding: 20rpx; padding: 20rpx;
background-color: #F8F8F8; background-color: #F8F8F8;
margin-left: 36rpx; margin-left: 36rpx;

File diff suppressed because it is too large Load Diff

View File

@@ -26,17 +26,18 @@
<view class="limit-discount" v-if="showLimitDiscount(item)"> <view class="limit-discount" v-if="showLimitDiscount(item)">
限时折扣 限时折扣
</view> </view>
<up-image :src="item.coverImg" width="124rpx" height="124rpx" mode="aspectFill" <up-image v-if="!item.cartListinfo.is_temporary" :src="item.coverImg" width="124rpx" height="124rpx" mode="aspectFill"
radius="10"></up-image>
<up-image v-else-if="item.cartListinfo.is_temporary&&item.cartListinfo.product_name=='签子'" src="https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/5/b97054debd83486ab7ad8e20ca6a360a.png" width="124rpx" height="124rpx" mode="aspectFill"
radius="10"></up-image>
<up-image v-else width="124rpx" height="124rpx" mode="aspectFill"
radius="10"></up-image> radius="10"></up-image>
</view> </view>
<view class="info"> <view class="info">
<view class="name"> <view class="name" v-if=" item.cartListinfo.is_temporary == 1">
{{ {{item.cartListinfo.product_name||item.cartListinfo.name|| item.name}}
item.cartListinfo.is_temporary == 1
? "临时菜"
: item.name
}}
</view> </view>
<view class="name" v-else>{{item.name}}</view>
<view class="select-sku-wrap" v-if="item.type == 'sku'"> <view class="select-sku-wrap" v-if="item.type == 'sku'">
<text v-for="i in item.skuList" :key="i.id"> <text v-for="i in item.skuList" :key="i.id">
{{ item.cartListinfo.sku_id == i.id ? i.name : "" }} {{ item.cartListinfo.sku_id == i.id ? i.name : "" }}
@@ -206,9 +207,6 @@
limitDiscount: props.limitDiscount.id ? props.limitDiscount : null, limitDiscount: props.limitDiscount.id ? props.limitDiscount : null,
shopUserInfo: shopUserInfo, shopUserInfo: shopUserInfo,
}); });
if (goods.name == "纯生纯生纯生") {
console.log("returnRealPrice", price);
}
return price; return price;
} }

View File

@@ -52,8 +52,8 @@
<view class="relative"> <view class="relative">
<image @click.stop="getProductImgs(item)" class="panelfiveitemimage" :src="item.coverImg" <image @click.stop="getProductImgs(item)" class="panelfiveitemimage"
mode="aspectFill"></image> :src="item.coverImg" mode="aspectFill"></image>
<view class="limitDiscount" v-if="showLimitDiscount(item)"> <view class="limitDiscount" v-if="showLimitDiscount(item)">
限时折扣{{ limitDiscountCountdown }}</view> 限时折扣{{ limitDiscountCountdown }}</view>
<!-- <view class="limitDiscount" v-if="item.is_time_discount"> <!-- <view class="limitDiscount" v-if="item.is_time_discount">
@@ -105,7 +105,7 @@
:class="shopInfo.isVip == 0 || shopInfo.isMemberPrice == 0 ? 'lineThrough' : ''">¥</text> :class="shopInfo.isVip == 0 || shopInfo.isMemberPrice == 0 ? 'lineThrough' : ''">¥</text>
<!-- 会员价与价格 --> <!-- 会员价与价格 -->
<text class="price"> <text class="price">
{{ shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1 ? item.memberPrice || item.salePrice : item.salePrice }} {{ shopUserInfo.isVip == 1 && shopUserInfo.isMemberPrice == 1 ? item.memberPrice || item.salePrice : item.salePrice }}
</text> </text>
<!-- 单位 --> <!-- 单位 -->
<text class="unit" v-if="item.unitName">/{{ item.unitName }}</text> <text class="unit" v-if="item.unitName">/{{ item.unitName }}</text>
@@ -148,8 +148,10 @@
@click.stop="clickspecifications(item, index, index1)"> @click.stop="clickspecifications(item, index, index1)">
<text class="t no-wrap" v-if="item.groupType == '1'">选择套餐</text> <text class="t no-wrap" v-if="item.groupType == '1'">选择套餐</text>
<text class="t" v-else>选规格</text> <text class="t" v-else>选规格</text>
<!-- <text class="dot num"
v-if="item.cartNumber > 0">{{ ifcartNumber(item) < 99 ? ifcartNumber(item) : '99+' }}</text> -->
<text class="dot num" <text class="dot num"
v-if="item.cartNumber > 0">{{ ifcartNumber(item) < 99 ? ifcartNumber(item) : '99+' }}</text> v-if="returnGoodsImCartNum(item)">{{ returnGoodsImCartNum(item) < 99 ? returnGoodsImCartNum(item) : '99+' }}</text>
</view> </view>
<view class="Controls" v-else> <view class="Controls" v-else>
<view class="btn" v-if="item.cartNumber != '0'"> <view class="btn" v-if="item.cartNumber != '0'">
@@ -158,7 +160,9 @@
<!-- <view class="btnClick" <!-- <view class="btnClick"
@tap.stop="$u.throttle(() => singleclick(item, '-'), 500)"></view> --> @tap.stop="$u.throttle(() => singleclick(item, '-'), 500)"></view> -->
</view> </view>
<text class="num">{{ ifcartNumber(item) }}</text> <!-- <text class="num">{{ ifcartNumber(item) }}</text> -->
<text class="dot num"
v-if="returnGoodsImCartNum(item)">{{ returnGoodsImCartNum(item) < 99 ? returnGoodsImCartNum(item) : '99+' }}</text>
<view class="btn"> <view class="btn">
<up-icon name="plus-circle-fill" color="#E9AB7A" size="25"></up-icon> <up-icon name="plus-circle-fill" color="#E9AB7A" size="25"></up-icon>
<!-- <view class="btnClick" <!-- <view class="btnClick"
@@ -197,8 +201,8 @@
<view class="goods" @click="clickspecifications(item1, index, index1)" <view class="goods" @click="clickspecifications(item1, index, index1)"
v-for="(item1, index1) in item.productList" :key="item1.id"> v-for="(item1, index1) in item.productList" :key="item1.id">
<view class="relative"> <view class="relative">
<image class="goodsImg" @click.stop="getProductImgs(item1)" v-if="item1.coverImg != null" <image class="goodsImg" @click.stop="getProductImgs(item1)"
:lazy-load="true" v-if="item1.coverImg != null" :lazy-load="true"
:src="`${item1.coverImg}${!item1.imgLoad ? '?x-oss-process=image/resize,m_lfit,w_150,h_150' : ''}`" :src="`${item1.coverImg}${!item1.imgLoad ? '?x-oss-process=image/resize,m_lfit,w_150,h_150' : ''}`"
mode="aspectFill"></image> mode="aspectFill"></image>
<image class="goodsImg" <image class="goodsImg"
@@ -252,7 +256,7 @@
<view class="money"> <view class="money">
<view>¥</view> <view>¥</view>
<text class="money_num" style="margin-right: 10rpx"> <text class="money_num" style="margin-right: 10rpx">
{{ shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1 ? item1.memberPrice || item1.salePrice : item1.salePrice }} {{ shopUserInfo.isVip == 1 && shopUserInfo.isMemberPrice == 1 ? item1.memberPrice || item1.salePrice : item1.salePrice }}
</text> </text>
<text v-if="item1.unitName">/{{ item1.unitName }}</text> <text v-if="item1.unitName">/{{ item1.unitName }}</text>
</view> </view>
@@ -288,8 +292,11 @@
@click.stop="clickspecifications(item1, index, index1)"> @click.stop="clickspecifications(item1, index, index1)">
<text class="t no-wrap" v-if="item1.groupType == '1'">选择套餐</text> <text class="t no-wrap" v-if="item1.groupType == '1'">选择套餐</text>
<text class="t" v-else>选规格</text> <text class="t" v-else>选规格</text>
<!-- <text class="dot num"
v-if="item1.cartNumber > 0">{{ ifcartNumber(item1) < 99 ? ifcartNumber(item1) : '99+' }}</text> -->
<text class="dot num" <text class="dot num"
v-if="item1.cartNumber > 0">{{ ifcartNumber(item1) < 99 ? ifcartNumber(item1) : '99+' }}</text> v-if="returnGoodsImCartNum(item1)">{{ returnGoodsImCartNum(item1) < 99 ? returnGoodsImCartNum(item1) : '99+' }}</text>
</view> </view>
</view> </view>
<view class="Controls" v-else> <view class="Controls" v-else>
@@ -437,9 +444,39 @@
</view> </view>
</view> </view>
</view> </view>
<!-- 推荐搭配 -->
<view class="u-m-t-48 u-p-30">
<view class="font-bold u-font-32 ">推荐搭配</view>
<view class="u-flex recommand-goods">
<view class=" item" v-for="(item,index) in 6" :key="index">
<up-image width="210rpx" height="210rpx" radius="12rpx"></up-image>
<view class="info">
<view class="u-line-2 name u-m-t-10 u-font-32 font-500">
商品名
</view>
<view class="u-flex u-row-between">
<view class="font-bold">
<text class="u-font-24">¥</text>
<text class="u-font-32">40</text>
</view>
<view class="btn">
<up-icon name="plus-circle-fill" color="#E9AB7A" size="25"></up-icon>
</view>
</view>
</view>
</view>
</view>
</view>
</scroll-view> </scroll-view>
<!-- 占位 --> <!-- 占位 -->
<view style="height: 42rpx;"></view>
<view class="shop_bottom"> <view class="shop_bottom">
<view class="flex-between"> <view class="flex-between">
<view class="price price-sku" <view class="price price-sku"
@@ -453,7 +490,7 @@
<text class="num" v-if="false"> <text class="num" v-if="false">
{{ {{
shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1 shopUserInfo.isVip == 1 && shopUserInfo.isMemberPrice == 1
? specifications.item.result.memberPrice || specifications.item.result.salePrice ? specifications.item.result.memberPrice || specifications.item.result.salePrice
: specifications.item.result.salePrice : specifications.item.result.salePrice
}} }}
@@ -471,7 +508,7 @@
</view> </view>
<text class="num" v-if="false"> <text class="num" v-if="false">
{{ {{
shopInfo.isVip == 1 && shopInfo.isMemberPrice == 1 shopUserInfo.isVip == 1 && shopUserInfo.isMemberPrice == 1
? specifications.item.memberPrice || specifications.item.salePrice ? specifications.item.memberPrice || specifications.item.salePrice
: specifications.item.salePrice : specifications.item.salePrice
}} }}
@@ -536,7 +573,13 @@
<Loading :isLoading="!useSocket.isConnected" /> <Loading :isLoading="!useSocket.isConnected" />
<ModalList></ModalList> <ModalList></ModalList>
<recommendGoodsModal v-if="isDataLoaded" @onBuyClick="onBuyClick"></recommendGoodsModal> <recommendGoodsModal v-if="isDataLoaded" @onBuyClick="onBuyClick"></recommendGoodsModal>
<goodsModal></goodsModal>
<view v-for="(item,index) in goodsModalList" :key="index">
<goodsModal :key="index" v-model="item.show" :goods="item.goods" @prveImgs="prveImgs"
@shareClick="shareClick" @close="goodsModalClose(index)" @websocketsendMessage="websocketsendMessage"
@modalAdd="modalAdd" :GoodsIDInCartNumMap="GoodsIDInCartNumMap"></goodsModal>
</view>
<xbSwiperPreview :visable="showPrveImg" :imgs="prveImgsList" @update:visable="updateShowPrveImg"> <xbSwiperPreview :visable="showPrveImg" :imgs="prveImgsList" @update:visable="updateShowPrveImg">
</xbSwiperPreview> </xbSwiperPreview>
<!-- 显示选择人数popup --> <!-- 显示选择人数popup -->
@@ -594,7 +637,8 @@
productminiApphotsquery, productminiApphotsquery,
APIgroupquery, APIgroupquery,
APIminiAppinfo, APIminiAppinfo,
APIminiAppskuinfo APIminiAppskuinfo,
productRelated
} from '@/common/api/product/product.js'; } from '@/common/api/product/product.js';
import { import {
@@ -700,6 +744,11 @@
import { import {
useCartStore useCartStore
} from '@/stores/order.js'; } from '@/stores/order.js';
import {
computed,
provide,
reactive
} from 'vue';
const cartStore = useCartStore(); const cartStore = useCartStore();
/** /**
* store本地存储 end * store本地存储 end
@@ -710,7 +759,6 @@
proxy proxy
} = getCurrentInstance(); } = getCurrentInstance();
//点单智能推荐 //点单智能推荐
function onBuyClick(item) { function onBuyClick(item) {
let index = -1; let index = -1;
@@ -750,6 +798,7 @@
/** /**
* 通用数据合集 start * 通用数据合集 start
*/ */
// 门店信息 // 门店信息
const shopInfo = reactive({}); const shopInfo = reactive({});
Object.assign(shopInfo, uni.cache.get('shopInfo')); Object.assign(shopInfo, uni.cache.get('shopInfo'));
@@ -768,11 +817,7 @@
// 分步取值 + 每层兜底,避免某一环不存在导致 undefined const shopExtend = ref('');
const shopExtendShopTable = uni.cache.get('shopTable') || {}; // 兜底空对象
const shopExtendMap = shopExtendShopTable.shopExtendMap || {}; // 兜底空对象
// 最终声明:即使 shopinfo_bg 不存在,也兜底为空字符串/默认值
const shopExtend = ref(shopExtendMap.shopinfo_bg || '');
/** /**
* 通用数据合集 end * 通用数据合集 end
@@ -804,6 +849,35 @@
// 购物车对应的商品数
const GoodsIDInCartNumMap = computed(() => {
const map = {}
for (let cart of cartStore.carts) {
if (map[cart.product_id]) {
map[cart.product_id] += cart.number * 1
} else {
map[cart.product_id] = cart.number * 1
}
}
return map
})
/**
* 返回购物车对应的商品数量
*/
function returnGoodsImCartNum(goods) {
if (!goods) {
return 0
}
if (GoodsIDInCartNumMap.value.hasOwnProperty(goods.id)) {
return GoodsIDInCartNumMap.value[goods.id]
}
return 0
}
// 获取商品数据 // 获取商品数据
const shopProductList = reactive({ const shopProductList = reactive({
hots: [], hots: [],
@@ -1270,8 +1344,8 @@
const showPrveImg = ref(false); const showPrveImg = ref(false);
const prveImgsList = ref([]); const prveImgsList = ref([]);
function updateShowPrveImg(e){ function updateShowPrveImg(e) {
showPrveImg.value=e showPrveImg.value = e
} }
function prveImgs(images) { function prveImgs(images) {
@@ -1285,14 +1359,24 @@
} }
async function getProductImgs(item) { async function getProductImgs(item) {
console.log('getProductImgs',item) console.log('getProductImgs', item)
let res = await APIminiAppinfo(item.id); let res = await APIminiAppinfo(item.id);
prveImgs(res.images); prveImgs(res.images);
} }
const goodsModalList = ref([])
function goodsModalClose(index) {
goodsModalList.value.splice(index, 1)
}
function modalAdd(item) {
clickspecifications(item)
}
//获取多规格数据 //获取多规格数据
const clickspecifications = async (item, index, indexs, type) => { const clickspecifications = async (item, index, indexs, type) => {
console.log('clickspecifications',item); console.log('clickspecifications', item);
// 商品类型 single-单规格商品 sku-多规格商品 package-套餐商品 weight-称重商品 coupon-团购券 // 商品类型 single-单规格商品 sku-多规格商品 package-套餐商品 weight-称重商品 coupon-团购券
// if ( // if (
// item.isSoldStock == 1 || // item.isSoldStock == 1 ||
@@ -1305,7 +1389,10 @@
// } // }
if (item.isSoldStock == 1 || (item.isSaleTime == 0 && !item.isSaleTimeshow)) { if (item.isSoldStock == 1 || (item.isSaleTime == 0 && !item.isSaleTimeshow)) {
return false; return uni.showToast({
title: '商品已下架或不在可售时间内',
icon: 'none'
});
} }
shopCartNumber.value = 0; shopCartNumber.value = 0;
@@ -1350,7 +1437,16 @@
.filter(([_, value]) => value.length > 0)); .filter(([_, value]) => value.length > 0));
// 给默认数量 // 给默认数量
specifications.item.amountcartNumber = 0; specifications.item.amountcartNumber = 0;
showShopsku.value = true; // showShopsku.value = true;
goodsModalList.value.push({
show: true,
goods: {
...specifications.item,
/*过滤掉只有一个规格且下架的商品或者skuList为空的商品*/
relatedRecommendJson: (specifications.item.relatedRecommendJson || []).filter(v => v
.skuList && v.skuList.length)
}
})
}; };
// 判断商品是否在可售时间内 // 判断商品是否在可售时间内
const isProductAvailable = async (sellDaysStr, startTimeStr, endTimeStr) => { const isProductAvailable = async (sellDaysStr, startTimeStr, endTimeStr) => {
@@ -1585,20 +1681,27 @@
// 返回商品对应sku数据 // 返回商品对应sku数据
function cartInit(arr) { function cartInit(arr) {
const result = [] const result = []
console.log('cartInitArr',arr);
console.log('allGoodsArr',allGoodsArr);
cartStore.carts = arr.map(v => { cartStore.carts = arr.map(v => {
const goods = allGoodsArr.find(g => g.id == v.product_id) const goods = cartStore.allGoodsArr.find(g => g.id == v.product_id)
const goodsSkuList = goods?goods.skuList : [] const goodsSkuList = goods ? goods.skuList : []
const findSku = goodsSkuList.find(sku => sku.id == v.sku_id) const findSku = goodsSkuList.find(sku => sku.id == v.sku_id)
const memberPrice = findSku ? findSku.memberPrice : 0 const memberPrice = findSku ? findSku.memberPrice : 0
const is_temporary = v.is_temporary || v.isTemporary
const is_time_discount = limitUtils.canUseLimitTimeDiscount({ const is_time_discount = limitUtils.canUseLimitTimeDiscount({
...v, ...v,
memberPrice memberPrice
}, cartStore.limitTimeDiscount, shopInfo, }, cartStore.limitTimeDiscount, shopInfo,
shopUserInfo.value, 'product_id'); shopUserInfo.value, 'product_id');
if(!goods){ if (!goods && !is_temporary) {
console.log('删除未匹配到的商品', {
id: v.id,
operate_type: "del",
table_code: uni.cache.get('tableCode'),
shop_id: uni.cache.get('shopId'),
type: "shopping",
})
useSocket.sendMessage({ useSocket.sendMessage({
id: v.id, id: v.id,
operate_type: "del", operate_type: "del",
@@ -1613,7 +1716,7 @@
is_time_discount: is_time_discount ? 1 : 0, is_time_discount: is_time_discount ? 1 : 0,
memberPrice memberPrice
} }
}).filter(v=>v) }).filter(v => v)
for (let cart of arr) { for (let cart of arr) {
const findItem = cartStore.carts.find(v => v.id == cart.id) const findItem = cartStore.carts.find(v => v.id == cart.id)
@@ -1647,7 +1750,7 @@
isLoading.value = false; isLoading.value = false;
return false; return false;
} }
console.log('product index 收到消息', Message);
// 检查消息是否已经处理过 // 检查消息是否已经处理过
if (processedMessageIds.has(Message.msg_id)) { if (processedMessageIds.has(Message.msg_id)) {
return; return;
@@ -1658,8 +1761,11 @@
if (Message.operate_type == 'init') { if (Message.operate_type == 'init') {
// cartStore.limitTimeDiscount = Message.time_dis_info; // cartStore.limitTimeDiscount = Message.time_dis_info;
cartInit(Message.data) cartInit(Message.data)
try {
uni.hideLoading(); uni.hideLoading();
} catch (error) {
//TODO handle the exception
}
isLoading.value = false; isLoading.value = false;
if (!socketInitFinished) { if (!socketInitFinished) {
@@ -2084,11 +2190,11 @@
} }
return currentTime >= startTime && currentTime <= endTime; return currentTime >= startTime && currentTime <= endTime;
}); });
let allGoodsArr=[] const allGoodsArr = ref([])
// 列表请求 // 列表请求
const productqueryProduct = async () => { const productqueryProduct = async () => {
cartStore.goodsIsloading = false; cartStore.goodsIsloading = false;
allGoodsArr=[] allGoodsArr.value = []
try { try {
shopProductList.hots = await productminiApphotsquery(); shopProductList.hots = await productminiApphotsquery();
shopProductList.productInfo = await APIgroupquery(); shopProductList.productInfo = await APIgroupquery();
@@ -2100,40 +2206,46 @@
setTimeout(() => { setTimeout(() => {
uni.pro.switchTab('index/index'); uni.pro.switchTab('index/index');
}, 1000); }, 1000);
return; // 出错直接返回,避免后续逻辑
} }
if (shopProductList.productInfo.length > 0 || shopProductList.hots.length > 0) { if (shopProductList.productInfo.length > 0 || shopProductList.hots.length > 0) {
//TODO handle the exception // 第一步处理productInfo替换forEach为for...of支持await
//第一步:将所有商品的 cartNumber 初始化为 0 for (const group of shopProductList.productInfo) {
shopProductList.productInfo.forEach((group) => { for (const product of group.productList) {
group.productList.forEach(async (product) => {
product.cartNumber = 0; product.cartNumber = 0;
product.isSaleTimeshow = await isProductAvailable(product.days, product // 等待异步函数执行完成后再push
.startTime, product.endTime); product.isSaleTimeshow = await isProductAvailable(
product.days,
allGoodsArr.push(product) product.startTime,
product.endTime
);
allGoodsArr.value.push(product);
cartStore.setGoodsMap(product.id, product); cartStore.setGoodsMap(product.id, product);
}); }
}); }
shopProductList.hots.forEach(async (i) => {
// 第二步处理hots同理替换forEach为for...of
for (const i of shopProductList.hots) {
i.cartNumber = 0; i.cartNumber = 0;
i.isSaleTimeshow = await isProductAvailable(i.days, i.startTime, i.endTime); i.isSaleTimeshow = await isProductAvailable(i.days, i.startTime, i.endTime);
allGoodsArr.push(i) allGoodsArr.value.push(i);
cartStore.setGoodsMap(i.id, i); cartStore.setGoodsMap(i.id, i);
}); }
console.log('shopProductList', shopProductList);
if(cartStore.carts.length>0){ // 此时所有异步操作完成allGoodsArr已有数据
cartInit(cartStore.carts) // console.log('allGoodsArr', allGoodsArr);
// console.log('shopProductList', shopProductList);
console.log('cartStore.carts', cartStore.carts)
cartStore.allGoodsArr = allGoodsArr.value
if (cartStore.carts.length > 0) {
cartInit(cartStore.carts);
} }
cartStore.goodsIsloading = true; cartStore.goodsIsloading = true;
scrollTopSize.value = 0; scrollTopSize.value = 0;
topArr.value = []; topArr.value = [];
// userStore.actionsAPIuser()
// 数据可以更新
isDataLoaded.value = true; isDataLoaded.value = true;
// 历史订单
Historicalorders(); Historicalorders();
updateProductQuantities(); updateProductQuantities();
} else { } else {
@@ -2147,6 +2259,16 @@
}, 1000); }, 1000);
return false; return false;
} }
if (pageOptions.showGoodsId) {
const item = allGoodsArr.value.find(v => v.id == pageOptions.showGoodsId)
if (item) {
clickspecifications(item)
}
pageOptions.showGoodsId = null
}
}; };
provide('cartStore', cartStore); provide('cartStore', cartStore);
@@ -2328,28 +2450,90 @@
}); });
} }
import {
shareMixin,
handleMixinOnLoad,
returnQuery,
jsonToUrl,
wxShare,
returnCommonQuery
} from '@/utils/share.js'
// defineOptions({
// mixins: [shareMixin],
// });
let isGoodsShare = ref(false)
function shareClick() {
isGoodsShare.value = true
}
async function onShare() {
const queryJson = await returnCommonQuery()
let query = jsonToUrl(queryJson)
query += '&type=beforehand'
let json = {}
const shopName = uni.cache.get('shopInfo').shopName || ''
if (goodsModalList.value.length && isGoodsShare.value) {
const goods = goodsModalList.value[goodsModalList.value.length - 1].goods
query += '&showGoodsId=' + goods.id
json.title = goods.name + (shopName ? `-${shopName}` : '')
json.imageUrl = goods.coverImg
json.showGoodsId = goods.id
} else {
json.title = shopName
json.imageUrl = uni.cache.get('shopInfo').logo || ''
}
console.log('onShareAppMessage', {
query,
...json,
path: '/pages/product/index' + '?' + query
});
return wxShare({
query,
...json,
path: '/pages/product/index' + '?' + query
})
}
onShareAppMessage(onShare)
onShareTimeline(onShare)
const pageOptions = reactive({})
onLoad(async (e) => { onLoad(async (e) => {
Object.assign(pageOptions, e)
if (e.type) { if (e.type) {
orderType.value = e.type; orderType.value = e.type;
} }
//获取用户信息
const userInfo = await APIshopUserInfo({ await handleMixinOnLoad({
shopId: uni.cache.get('shopId') ...e,
shopId: e.shopId || uni.cache.get('shopId')
}) })
//获取店铺信息
const shopInfoRes = await APIusershopInfodetail({ if(userStore.shopUserInfo.shopExtendList){
shopId: uni.cache.get('shopId') shopExtend.value=userStore.shopUserInfo.shopExtendList.find(v=>v.autoKey=='shopinfo_bg')||''
});
if (shopInfoRes && shopInfoRes.shopInfo) {
Object.assign(shopInfo, shopInfoRes.shopInfo);
uni.cache.set('shopInfo', shopInfoRes.shopInfo)
} }
// //获取用户信息
if (userInfo && typeof userInfo === 'object') { // const userInfo = await APIshopUserInfo({
shopUserInfo.value = userInfo // shopId: uni.cache.get('shopId')
uni.cache.set('shopUserInfo', userInfo) // })
// //获取店铺信息
// const shopInfoRes = await APIusershopInfodetail({
// shopId: uni.cache.get('shopId')
// });
Object.assign(shopInfo, userStore.shopInfo);
if (e.type == 'beforehand') {
uni.cache.set("tableCode", userStore.shopUserInfo.id);
options.initMessage.table_code = userStore.shopUserInfo.id
} }
options.initMessage.shop_id = userStore.shopInfo.id
shopUserInfo.value = userStore.shopUserInfo
await productqueryProduct(); await productqueryProduct();
const extraInitPar = {} const extraInitPar = {}
@@ -2361,6 +2545,11 @@
const time_dis_info = await getLimitDiscount() const time_dis_info = await getLimitDiscount()
options.initMessage.time_dis_info = time_dis_info options.initMessage.time_dis_info = time_dis_info
console.log('options.initMessage', {
...options.initMessage,
...extraInitPar,
})
useSocket.connect({ useSocket.connect({
...options.initMessage, ...options.initMessage,
...extraInitPar, ...extraInitPar,
@@ -2381,7 +2570,7 @@
tableCode: uni.cache.get('tableCode') tableCode: uni.cache.get('tableCode')
}); });
oldOrder.value = res; oldOrder.value = res;
if (res && res.id && shopInfo.registerType == 'after'&&!e.noJump) { if (res && res.id && shopInfo.registerType == 'after' && !e.noJump) {
toHistory(); toHistory();
return; return;
} }
@@ -2442,7 +2631,7 @@
}); });
} }
function watchEmit(){ function watchEmit() {
uni.$off('updateProductIndex') uni.$off('updateProductIndex')
uni.$on('updateProductIndex', function(data) { uni.$on('updateProductIndex', function(data) {
getNewUserDiscount() getNewUserDiscount()
@@ -2481,6 +2670,7 @@
useSocket.setOnMessage(() => {}); useSocket.setOnMessage(() => {});
} }
onHide(() => { onHide(() => {
isGoodsShare.value = false
closeSocket(); closeSocket();
}); });
onUnload(() => { onUnload(() => {
@@ -2496,12 +2686,12 @@
}); });
if (res && typeof res == 'object') { if (res && typeof res == 'object') {
newUserDiscount.value = res; newUserDiscount.value = res;
cartStore.consumeDiscount=res cartStore.consumeDiscount = res
cartStore.newUserDiscount=res.amount cartStore.newUserDiscount = res.amount
}else{ } else {
newUserDiscount.value = null; newUserDiscount.value = null;
cartStore.consumeDiscount={} cartStore.consumeDiscount = {}
cartStore.newUserDiscount=0 cartStore.newUserDiscount = 0
} }
} }
@@ -3199,7 +3389,6 @@
border-radius: 20rpx; border-radius: 20rpx;
background: #fff; background: #fff;
box-sizing: border-box; box-sizing: border-box;
padding-bottom: 200rpx;
.positionabsolute { .positionabsolute {
position: absolute; position: absolute;
@@ -3234,9 +3423,7 @@
border-bottom: 2rpx solid #f0f0f0; border-bottom: 2rpx solid #f0f0f0;
} }
.shop_sku_box:last-child {
padding-bottom: 140rpx;
}
.shop_sku_box { .shop_sku_box {
padding: 20rpx; padding: 20rpx;
@@ -3322,9 +3509,6 @@
padding: 30rpx 28rpx; padding: 30rpx 28rpx;
background-color: #fff; background-color: #fff;
box-shadow: 0rpx -6rpx 14rpx 2rpx rgba(0, 0, 0, 0.1); box-shadow: 0rpx -6rpx 14rpx 2rpx rgba(0, 0, 0, 0.1);
position: fixed;
left: 0;
bottom: 0;
.price { .price {
display: flex; display: flex;
@@ -3700,4 +3884,31 @@
font-size: 12px; font-size: 12px;
margin-left: 20rpx; margin-left: 20rpx;
} }
.recommand-goods {
display: flex;
flex-wrap: wrap;
margin-top: 24rpx;
.item {
display: flex;
flex-direction: column;
align-items: center;
margin-right: 30rpx;
margin-bottom: 30rpx;
width: 210rpx;
&:nth-child(3n) {
margin-right: 0;
}
.name {
height: 84rpx;
}
.info {
width: 100%;
}
}
}
</style> </style>

View File

@@ -60,6 +60,9 @@
<text v-if="item.bizCode == 'cashback'"> <text v-if="item.bizCode == 'cashback'">
消费返现 消费返现
</text> </text>
<text v-if="item.bizCode == 'cashback_refund'">
消费返现扣减
</text>
<text v-if="item.bizCode == 'freeIn'"> <text v-if="item.bizCode == 'freeIn'">
霸王餐充值 霸王餐充值
</text> </text>

View File

@@ -1,461 +1,498 @@
<!-- 充值中心 --> <!-- 充值中心 -->
<template> <template>
<view class="container"> <view class="container">
<up-navbar <up-navbar bgColor="transparent" title="充值中心" @leftClick="back"></up-navbar>
bgColor="transparent" <view class="header-wrap">
title="充值中心" <image class="bg" src="/static/czzx_header_bg.png" mode="aspectFill"></image>
@leftClick="back" <view class="select-shop">
></up-navbar> <view class="select-btn">
<view class="header-wrap"> <up-icon name="map" color="#333"></up-icon>
<image <text class="t">{{ shopInfo.shopName }}</text>
class="bg" <up-icon name="arrow-right" color="#333"></up-icon>
src="/static/czzx_header_bg.png" </view>
mode="aspectFill" <ymf-share></ymf-share>
></image> </view>
<view class="select-shop"> <view class="balance-wrap">
<view class="select-btn"> <view class="left">
<up-icon name="map" color="#333"></up-icon> <text class="i t">余额</text>
<text class="t">{{ shopInfo.shopName }}</text> <text class="n t">{{ shopUserInfo.amount || 0 }}</text>
<up-icon name="arrow-right" color="#333"></up-icon> </view>
</view> <view class="right">
</view> <text class="t" @click="toduihuan">兑换码</text>
<view class="balance-wrap"> <text class="t" @click="toDetail">明细</text>
<view class="left"> <text class="t" @click="toPwd">密码设置</text>
<text class="i t">余额</text> </view>
<text class="n t">{{ shopUserInfo.amount || 0 }}</text> </view>
</view> <view class="btm-wrap">
<view class="right"> <view class=""></view>
<text class="t" @click="toduihuan">兑换码</text> </view>
<text class="t" @click="toDetail">明细</text> </view>
<text class="t" @click="toPwd">密码设置</text> <view class="bottom">
</view> <view class="u-flex u-flex-between">
</view> <view class="u-flex">
<view class="btm-wrap"> <image src="/static/vip/money.png" style="width: 44rpx; height: 44rpx" mode=""></image>
<view class=""> </view> <text class="u-m-l-24 color-333 font-16 font-700">立即充值</text>
</view> </view>
</view> <view class="font-12 color-999">
<view class="bottom"> <text>充值代表接受</text>
<view class="u-flex u-flex-between"> <text style="color: #ecb592">用户隐私协议</text>
<view class="u-flex"> </view>
<image </view>
src="/static/vip/money.png" <view class="list u-m-t-40">
style="width: 44rpx; height: 44rpx" <view class="item color1" @click="sel = index" v-for="(item, index) in list" :key="index" :class="{ active: sel == index }">
mode="" <view class="">
></image> <text></text>
<text class="u-m-l-24 color-333 font-16 font-700">立即充值</text> <text class="font-700" style="font-size: 48 u-flex-1rpx" :class="{ color2: sel == index }">{{ item.amount }}</text>
</view> </view>
<view class="font-12 color-999"> <view class="font-12" v-if="item.rewardAmount" :class="{ color2: sel == index }">
<text>充值代表接受</text> <text></text>
<text style="color: #ecb592">用户隐私协议</text> <text></text>
</view> <text class="font-14">{{ item.rewardAmount }}</text>
</view> </view>
<view class="list u-m-t-40"> <view class="font-12" v-if="item.rewardPoints" style="color: #5f2e0f">
<view <text></text>
class="item color1" <text class="font-14">{{ item.rewardPoints }}</text>
@click="sel = index" <text class="">积分</text>
v-for="(item, index) in list" </view>
:key="index" <view class="font-12 color-666" v-if="item.couponInfoList.length">
:class="{ active: sel == index }" <text></text>
> <text>{{ couponNum(item.couponInfoList) }}</text>
<view class=""> <text>张券</text>
<text></text> <text class="color2 u-m-l-8" v-if="sel == index" @click="lookCoupon(item)">查看</text>
<text </view>
class="font-700"
style="font-size: 48 u-flex-1rpx"
:class="{ color2: sel == index }"
>{{ item.amount }}</text
>
</view>
<view
class="font-12"
v-if="item.rewardAmount"
:class="{ color2: sel == index }"
>
<text></text>
<text></text>
<text class="font-14">{{ item.rewardAmount }}</text>
</view>
<view class="font-12" v-if="item.rewardPoints" style="color: #5f2e0f">
<text></text>
<text class="font-14">{{ item.rewardPoints }}</text>
<text class="">积分</text>
</view>
<view class="font-12 color-666" v-if="item.couponInfoList.length">
<text></text>
<text>{{ couponNum(item.couponInfoList) }}</text>
<text>张券</text>
<text
class="color2 u-m-l-8"
v-if="sel == index"
@click="lookCoupon(item)"
>查看</text
>
</view>
<view class="sel u-flex" v-if="sel == index"> <view class="sel u-flex" v-if="sel == index">
<image class="image" src="/static/vip/sel.png" mode=""></image> <image class="image" src="/static/vip/sel.png" mode=""></image>
</view> </view>
</view> </view>
</view> </view>
<template v-if="state.isCustom"> <template v-if="state.isCustom">
<view class="u-flex other flex-center"> <view class="u-flex other flex-center">
<text class="font-14 color-333 font-700 u-m-r-28">其他金额</text> <text class="font-14 color-333 font-700 u-m-r-28">其他金额</text>
<up-input <up-input v-model="money" type="number" placeholder="请输入充值金额" border="none" placeholder-style="font-size:14px;"></up-input>
v-model="money" </view>
type="number" <view class="color-999 font-12 u-m-t-4">自定义金额充值时不享受任何优惠赠送</view>
placeholder="请输入充值金额" </template>
border="none"
placeholder-style="font-size:14px;"
></up-input>
</view>
<view class="color-999 font-12 u-m-t-4"
>自定义金额充值时不享受任何优惠赠送</view
>
</template>
<button <button class="buy-btn" @click="buy" :class="{ disabled: !state.isEnable }">
class="buy-btn" <text class="font-16">{{ charge_money }}</text>
@click="buy" <text class="font-14 u-m-l-24">立即充值</text>
:class="{ disabled: !state.isEnable }" </button>
> <view class="u-m-t-36 color-999 font-12">
<text class="font-16">{{ charge_money }}</text> <view>充值说明</view>
<text class="font-14 u-m-l-24">立即充值</text> <view class="u-m-t-16">
</button> <text>适用门店</text>
<view class="u-m-t-36 color-999 font-12"> <text class="color2 u-m-l-28" @click="toShopList">全国门店通用 {{ '>' }}</text>
<view>充值说明</view> </view>
<view class="u-m-t-16"> <view class="u-m-t-16">
<text>适用门店</text> <text>有效期限</text>
<text class="color2 u-m-l-28" @click="toShopList" <text class="u-m-l-28">永久有效</text>
>全国门店通用 {{ ">" }} </view>
</text> <view class="u-m-t-16 u-flex u-flex-y-center">
</view> <text class="no-wrap">注意事项</text>
<view class="u-m-t-16"> <view class="u-m-l-28">
<text>有效期限</text> <view>1.储值完成后不支持自助退款,可联系商家处理</view>
<text class="u-m-l-28">永久有效 </text> <view>2.余额不支持转赠,不可提现,长期有效</view>
</view> </view>
<view class="u-m-t-16 u-flex u-flex-y-center"> </view>
<text class="no-wrap">注意事项</text> <view class="u-m-t-16 u-flex u-flex-y-center">
<view class="u-m-l-28"> <text class="no-wrap">充值说明</text>
<view>1.储值完成后不支持自助退款可联系商家处理</view> <text class="u-m-l-28" style="word-break: break-all">
<view> 2.余额不支持转赠不可提现长期有效</view> {{ state.remark || '' }}
</view> </text>
</view> </view>
<view class="u-m-t-16 u-flex u-flex-y-center"> </view>
<text class="no-wrap">充值说明</text> </view>
<text class="u-m-l-28" style="word-break: break-all"> <CouponList v-model="couponModel.show" :list="couponModel.couponInfoList"></CouponList>
{{ state.remark || "" }} </view>
</text>
</view>
</view>
</view>
<CouponList
v-model="couponModel.show"
:list="couponModel.couponInfoList"
></CouponList>
</view>
</template> </template>
<script setup> <script setup>
import { APIusershopInfodetail, APIshopUserInfo } from "@/common/api/member.js"; import ymfShare from '@/components/ymf-components/ymf-share.vue';
import CouponList from "@/components/coupon/list.vue"; import { shareMixin, handleMixinOnLoad, returnQuery } from '@/utils/share.js';
import * as rechargeApi from "@/common/api/market/recharge.js"; import { APIusershopInfodetail, APIshopUserInfo } from '@/common/api/member.js';
import { recharge } from "@/common/api/order/index.js"; import CouponList from '@/components/coupon/list.vue';
import { joinMember } from "@/common/api/order/index.js"; import * as rechargeApi from '@/common/api/market/recharge.js';
import { ref, onMounted, computed, reactive, watch } from "vue"; import { recharge } from '@/common/api/order/index.js';
import { onLoad, onShow } from "@dcloudio/uni-app"; import { joinMember } from '@/common/api/order/index.js';
import { pay } from "@/utils/pay.js"; import { ref, onMounted, computed, reactive, watch } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
import { pay } from '@/utils/pay.js';
function toShopList() { function toShopList() {
uni.navigateTo({ uni.navigateTo({
url: "/pages/user/member/czzx-shop-list?shopId=" + option.shopId, url: '/pages/user/member/czzx-shop-list?shopId=' + option.shopId
}); });
} }
function toduihuan() { function toduihuan() {
uni.navigateTo({ uni.navigateTo({
url: "/user/exchange/index", url: '/user/exchange/index'
}); });
} }
function couponNum(list) { function couponNum(list) {
return list.reduce((prve, cur) => { return list.reduce((prve, cur) => {
return prve + cur.num; return prve + cur.num;
}, 0); }, 0);
} }
const couponModel = reactive({ const couponModel = reactive({
show: false, show: false,
couponInfoList: [], couponInfoList: []
}); });
function lookCoupon(item) { function lookCoupon(item) {
couponModel.show = true; couponModel.show = true;
couponModel.couponInfoList = item.couponInfoList; couponModel.couponInfoList = item.couponInfoList;
} }
async function buy() { async function buy() {
if (!state.isEnable) { if (!state.isEnable) {
return uni.showToast({ return uni.showToast({
title: "充值未开启,暂不能充值", title: '充值未开启暂不能充值',
icon: "none", icon: 'none'
}); });
} }
if (!charge_money.value) { if (!charge_money.value) {
return uni.showToast({ return uni.showToast({
title: "请选择或者输入充值金额", title: '请选择或者输入充值金额',
icon: "none", icon: 'none'
}); });
} }
const json = { const json = {
shopId: option.shopId, shopId: option.shopId,
shopUserId: shopUserInfo.id, shopUserId: shopUserInfo.id
}; };
if (sel.value < 0) { if (sel.value < 0) {
json.amount = `${money.value}`.trim() * 1; json.amount = `${money.value}`.trim() * 1;
} else { } else {
json.rechargeDetailId = list.value[sel.value].id; json.rechargeDetailId = list.value[sel.value].id;
json.amount = list.value[sel.value].amount; json.amount = list.value[sel.value].amount;
} }
const res = await recharge(json); const res = await recharge(json);
if (!res) { if (!res) {
return uni.showToast({ return uni.showToast({
title: "充值失败", title: '充值失败',
icon: "error", icon: 'error'
}); });
} }
const payRes = await pay(res); const payRes = await pay(res);
console.log(payRes); console.log(payRes);
if (payRes) { if (payRes) {
uni.showToast({ uni.showToast({
title: "充值成功", title: '充值成功',
icon: "none", icon: 'none'
}); });
init(); init();
} }
} }
function toDetail() { function toDetail() {
uni.navigateTo({ uni.navigateTo({
url: "/pages/user/member/billDetails?type=1&shopId=" + option.shopId, url: '/pages/user/member/billDetails?type=1&shopId=' + option.shopId
}); });
} }
function toPwd() { function toPwd() {
uni.navigateTo({ uni.navigateTo({
url: "/pages/user/member/setPassword?type=1&shopId=" + option.shopId, url: '/pages/user/member/setPassword?type=1&shopId=' + option.shopId
}); });
} }
function back() { function back() {
uni.navigateBack(); safeNavigateBack();
} }
/**
* 修复版:安全的页面返回方法
* 彻底避免 "cannot navigate back at first page" 报错
* @param {Number} delta 返回的页面数默认1
* @param {Function} fallback 失败时的降级处理函数
*/
function safeNavigateBack(delta = 1, fallback) {
// 1. 立即获取页面栈,确保拿到最新状态(关键修复点)
const pages = getCurrentPages();
// 2. 严谨判断:页面栈长度必须大于 delta 才能返回
const canNavigateBack = pages.length > delta;
console.log('页面栈信息:', {
pagesLength: pages.length,
delta: delta,
canNavigateBack: canNavigateBack
});
// 3. 如果不能返回,直接执行降级逻辑
if (!canNavigateBack) {
console.warn('当前是首页/页面栈不足无法返回');
handleFallback(fallback);
return; // 终止后续执行,彻底避免调用 navigateBack
}
// 4. 能返回时才执行 navigateBack
try {
uni.navigateBack({
delta: delta,
success: () => {
console.log('页面返回成功');
},
fail: (err) => {
console.error('navigateBack 执行失败:', err);
handleFallback(fallback);
}
});
} catch (error) {
console.error('页面返回异常:', error);
handleFallback(fallback);
}
}
/**
* 统一处理降级逻辑
* @param {Function} fallback 自定义降级函数
*/
function handleFallback(fallback) {
if (typeof fallback === 'function') {
fallback(); // 执行自定义降级
} else {
// 默认降级:返回首页(请替换为你的首页路径)
uni.showToast({
title: '已到首页无法返回',
icon: 'none',
duration: 1500
});
// 如果需要强制跳首页,解开下面注释(根据你的业务选择)
uni.switchTab({
url: '/pages/index/index',
fail: () => {
uni.redirectTo({
url: '/pages/index/index'
});
}
});
}
}
const list = ref([]); const list = ref([]);
const sel = ref(0); const sel = ref(0);
const money = ref(null); const money = ref(null);
const option = reactive({ const option = reactive({
shopId: "", shopId: ''
}); });
const shopInfo = reactive({}); const shopInfo = reactive({});
const shopUserInfo = reactive({}); const shopUserInfo = reactive({});
const state = reactive({}); const state = reactive({});
async function init() { async function init() {
const shopInfoRes = await APIusershopInfodetail({ const shopInfoRes = await APIusershopInfodetail({
shopId: option.shopId, shopId: option.shopId
}); });
if (shopInfoRes) { if (shopInfoRes) {
Object.assign(shopInfo, shopInfoRes.shopInfo); Object.assign(shopInfo, shopInfoRes.shopInfo);
} }
const shopUserInfoRes = await APIshopUserInfo({ const shopUserInfoRes = await APIshopUserInfo({
shopId: option.shopId, shopId: option.shopId
}); });
if (shopUserInfoRes) { if (shopUserInfoRes) {
Object.assign(shopUserInfo, shopUserInfoRes); Object.assign(shopUserInfo, shopUserInfoRes);
} }
const res = await rechargeApi.config({ const res = await rechargeApi.config({
shopId: option.shopId, shopId: option.shopId
}); });
if (res) { if (res) {
Object.assign(state, res); Object.assign(state, res);
list.value = res.rechargeDetailList; list.value = res.rechargeDetailList;
} }
} }
const charge_money = computed(() => { const charge_money = computed(() => {
if (sel.value < 0) { if (sel.value < 0) {
if (money.value > 0) { if (money.value > 0) {
return money.value; return money.value;
} }
return ""; return '';
} }
const item = list.value[sel.value]; const item = list.value[sel.value];
if (item) { if (item) {
return item.amount; return item.amount;
} }
return ""; return '';
}); });
onLoad((opt) => {
Object.assign(option, opt); onShareAppMessage(async (res) => {
// init(); let query = await returnQuery();
return {
title: `充值-${shopInfo.shopName}`,
path: `/pages/user/member/czzx?${query}`,
imageUrl: shopInfo.logo,
query
};
});
onLoad(async (opt) => {
Object.assign(option, opt);
await handleMixinOnLoad(opt);
// init();
}); });
watch( watch(
() => money.value, () => money.value,
(newval) => { (newval) => {
if (newval && newval > 0) { if (newval && newval > 0) {
sel.value = -1; sel.value = -1;
} }
} }
); );
onShow(() => { onShow(() => {
init(); init();
}); });
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.color1 { .color1 {
color: #5f2e0f; color: #5f2e0f;
} }
.color2 { .color2 {
color: #ff6300; color: #ff6300;
} }
.buy-btn { .buy-btn {
margin-top: 28rpx; margin-top: 28rpx;
padding: 32rpx 32rpx; padding: 32rpx 32rpx;
color: #fff; color: #fff;
font-size: 16px; font-size: 16px;
font-weight: 700; font-weight: 700;
border-radius: 80rpx; border-radius: 80rpx;
line-height: 1; line-height: 1;
background: linear-gradient(98deg, #fe6d1100 40.64%, #ffd1b4 105.2%), background: linear-gradient(98deg, #fe6d1100 40.64%, #ffd1b4 105.2%), linear-gradient(259deg, #fe6d11 50.14%, #ffd1b4 114.93%);
linear-gradient(259deg, #fe6d11 50.14%, #ffd1b4 114.93%); box-shadow: 0 14rpx 30.4rpx 0 #fe8b435e;
box-shadow: 0 14rpx 30.4rpx 0 #fe8b435e; &.disabled {
&.disabled { background: #eee;
background: #eee; box-shadow: none;
box-shadow: none; border: none;
border: none; color: #999;
color: #999; }
}
} }
.other { .other {
background: #f6f6f6; background: #f6f6f6;
padding: 24rpx 16rpx; padding: 24rpx 16rpx;
margin-top: 40rpx; margin-top: 40rpx;
} }
.header-wrap { .header-wrap {
width: 100%; width: 100%;
height: 530rpx; height: 530rpx;
box-sizing: border-box; box-sizing: border-box;
padding: calc(var(--status-bar-height) + 140rpx) 28rpx 28rpx; padding: calc(var(--status-bar-height) + 140rpx) 28rpx 28rpx;
position: relative; position: relative;
.bg { .bg {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
} }
.select-shop { .select-shop {
display: flex; display: flex;
align-items: center; justify-content: space-between;
position: relative; align-items: center;
position: relative;
.select-btn { .select-btn {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 12upx; gap: 12upx;
.t { .t {
color: #333; color: #333;
} }
} }
} }
.balance-wrap { .balance-wrap {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
position: relative; position: relative;
padding-top: 20rpx; padding-top: 20rpx;
.left { .left {
display: flex; display: flex;
align-items: center; align-items: center;
.t { .t {
color: #5e3110; color: #5e3110;
&.i { &.i {
position: relative; position: relative;
top: 10upx; top: 10upx;
font-size: 28upx; font-size: 28upx;
} }
&.n { &.n {
font-size: 64upx; font-size: 64upx;
font-weight: bold; font-weight: bold;
} }
} }
} }
.right { .right {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12upx; gap: 12upx;
.t { .t {
color: #86491d; color: #86491d;
font-size: 28upx; font-size: 28upx;
} }
} }
} }
} }
.bottom { .bottom {
background-color: rgba(255, 255, 255, 0.3); background-color: rgba(255, 255, 255, 0.3);
padding: 40rpx 28rpx 0 28rpx; padding: 40rpx 28rpx 0 28rpx;
transform: translateY(-140rpx); transform: translateY(-140rpx);
border-radius: 74rpx 74rpx 0 0; border-radius: 74rpx 74rpx 0 0;
} }
.list { .list {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
column-gap: 20rpx; column-gap: 20rpx;
row-gap: 22rpx; row-gap: 22rpx;
.item { .item {
padding: 36rpx 22rpx; padding: 36rpx 22rpx;
border-radius: 42rpx; border-radius: 42rpx;
background: linear-gradient(180deg, #f5f5f5 58.54%, #fff 140.47%); background: linear-gradient(180deg, #f5f5f5 58.54%, #fff 140.47%);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
position: relative; position: relative;
box-sizing: border-box; box-sizing: border-box;
border: 6rpx solid transparent; border: 6rpx solid transparent;
transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out;
&.active { &.active {
background: linear-gradient(180deg, #ffc29a -26.17%, #fff 64.06%); background: linear-gradient(180deg, #ffc29a -26.17%, #fff 64.06%);
border: 6rpx solid #fe6c0e; border: 6rpx solid #fe6c0e;
box-shadow: 0 0 31rpx 2rpx #fe8b435e; box-shadow: 0 0 31rpx 2rpx #fe8b435e;
} }
.sel { .sel {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 50%; left: 50%;
transform: translateX(-50%) translateY(21rpx); transform: translateX(-50%) translateY(21rpx);
.image { .image {
width: 42rpx; width: 42rpx;
height: 42rpx; height: 42rpx;
} }
} }
} }
} }
</style> </style>

File diff suppressed because it is too large Load Diff

10
pnpm-lock.yaml generated
View File

@@ -30,8 +30,8 @@ importers:
specifier: ^0.1.2 specifier: ^0.1.2
version: 0.1.2 version: 0.1.2
ysk-utils: ysk-utils:
specifier: ^1.0.81 specifier: ^1.0.83
version: 1.0.81 version: 1.0.83
devDependencies: devDependencies:
unplugin-auto-import: unplugin-auto-import:
specifier: ^0.16.7 specifier: ^0.16.7
@@ -357,8 +357,8 @@ packages:
webpack-virtual-modules@0.6.2: webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
ysk-utils@1.0.81: ysk-utils@1.0.83:
resolution: {integrity: sha512-c6SOfOaw43aDDuyXgEv24Vo561EfFoa1gfGbY+p1EfXHoGPOE6tQLekbWW9bn37KAse0Gdef7VCbdv0Dr6ltaw==} resolution: {integrity: sha512-48KLQJXQtF8nLaaFHR1hAFx/QGS848fg7n37BpZEtwliD+D5ZHQFPOCZNaM68jiwDTWhNg41rHpZzhAUQXe+/Q==}
snapshots: snapshots:
@@ -684,7 +684,7 @@ snapshots:
webpack-virtual-modules@0.6.2: {} webpack-virtual-modules@0.6.2: {}
ysk-utils@1.0.81: ysk-utils@1.0.83:
dependencies: dependencies:
bignumber.js: 9.3.1 bignumber.js: 9.3.1
loadsh: 0.0.4 loadsh: 0.0.4

View File

@@ -8,7 +8,7 @@
</template> </template>
<template v-else> <template v-else>
<view @click="prveImg(item.goodsImageUrl)"> <view @click="prveImg(item.goodsImageUrl)">
<image class="top-img" :src="item.goodsImageUrl" mode="aspectFill" ></image> <image class="top-img" :src="item.goodsImageUrl" mode="aspectFill"></image>
</view> </view>
</template> </template>
<view class="sku"> <view class="sku">
@@ -27,7 +27,10 @@
</view> </view>
<text class="text">剩余{{item.quantity}}</text> <text class="text">剩余{{item.quantity}}</text>
</view> </view>
<view class="goods-name">{{item.goodsName}}</view> <view class="goods-name u-flex u-row-between">
<text class="u-m-r-30" style="word-break: break-all;">{{item.goodsName}}</text>
<ymfShare color="#333" />
</view>
<view class="bg-f7" style="height: 24rpx"></view> <view class="bg-f7" style="height: 24rpx"></view>
<view class="desc"> <view class="desc">
<view class="u-flex"> <view class="u-flex">
@@ -55,10 +58,10 @@
<view style="height: 140px"></view> <view style="height: 140px"></view>
<view class="fixed-bottom u-flex u-row-center"> <view class="fixed-bottom u-flex u-row-center">
<view v-if="isCanExchange" class="btn" @click="exchangeClick" > <view v-if="isCanExchange" class="btn" @click="exchangeClick">
{{returnBtmText}} {{returnBtmText}}
</view> </view>
<view class="btn gray" v-else > <view class="btn gray" v-else>
{{returnBtmText}} {{returnBtmText}}
</view> </view>
</view> </view>
@@ -116,6 +119,7 @@
</view> </view>
</template> </template>
<script setup> <script setup>
import ymfShare from '@/components/ymf-components/ymf-share.vue'
import { import {
computed, computed,
reactive reactive
@@ -125,6 +129,11 @@
} from '@/utils/uniapp.js' } from '@/utils/uniapp.js'
import modal from "@/scoreShop/components/modal.vue"; import modal from "@/scoreShop/components/modal.vue";
import * as pointGoodsApi from "@/common/api/order/pointGoods.js"; import * as pointGoodsApi from "@/common/api/order/pointGoods.js";
import {
userPoints
} from "@/common/api/market/points.js";
import couponIcon from "@/components/coupon-icon/index"; import couponIcon from "@/components/coupon-icon/index";
import { import {
pay pay
@@ -136,9 +145,9 @@
show: false, show: false,
}); });
function prveImg(url){ function prveImg(url) {
uni.previewImage({ uni.previewImage({
urls:[url] urls: [url]
}) })
} }
@@ -304,16 +313,64 @@
return `单人兑换已达上限` return `单人兑换已达上限`
} }
}) })
onLoad((opt) => { async function getGoods() {
const exchange_goods = uni.getStorageSync('exchange_goods') const res = await pointGoodsApi.pointsGoods({
if (exchange_goods.goodsDescription) { id: options.id
exchange_goods.goodsDescription = JSON.parse(exchange_goods.goodsDescription) })
if (res.goodsDescription) {
res.goodsDescription = JSON.parse(res.goodsDescription)
} else { } else {
exchange_goods.goodsDescription = [] res.goodsDescription = []
} }
const pointsUserData = uni.getStorageSync('pointsUser') res.couponInfo=res.couponInfo||{}
Object.assign(item, exchange_goods)
Object.assign(pointsUser, pointsUserData) Object.assign(item, res)
}
async function getPointUser() {
const res = await userPoints({
shopUserId: uni.cache.get('shopUserInfo').id || ''
})
Object.assign(pointsUser, res.pointsUser)
}
async function init() {
await getGoods()
await getPointUser()
}
import {
shareMixin,
handleMixinOnLoad,wxShare,returnQuery ,returnIndexBg,
} from '@/utils/share.js'
// defineOptions({
// mixins: [shareMixin],
// });
onShareAppMessage(async(res)=>{
const query=await returnQuery()
const shopInfo=uni.cache.get('shopInfo')
return wxShare({
...res,
title:item.goodsName +'-'+shopInfo.shopName,
path:'/scoreShop/detail/index'+'?'+query,
query,
imageUrl:item.goodsImageUrl||returnIndexBg()||''
})
})
const options = reactive({})
onLoad(async (opt) => {
Object.assign(options, opt)
await handleMixinOnLoad(opt)
await init()
// const exchange_goods = uni.getStorageSync('exchange_goods')
// if (exchange_goods.goodsDescription) {
// exchange_goods.goodsDescription = JSON.parse(exchange_goods.goodsDescription)
// } else {
// exchange_goods.goodsDescription = []
// }
// const pointsUserData = uni.getStorageSync('pointsUser')
// Object.assign(item, exchange_goods)
// Object.assign(pointsUser, pointsUserData)
}) })
</script> </script>
@@ -463,7 +520,8 @@
height: 184rpx; height: 184rpx;
border-radius: 16rpx; border-radius: 16rpx;
background: #d9d9d9; background: #d9d9d9;
&.bg-fff{
&.bg-fff {
background-color: #fff; background-color: #fff;
} }
} }
@@ -487,7 +545,8 @@
font-size: 700; font-size: 700;
} }
} }
.w-full{
.w-full {
width: 100%; width: 100%;
} }
</style> </style>

View File

@@ -74,7 +74,7 @@
function toDetail(item) { function toDetail(item) {
uni.setStorageSync('exchange_goods', item) uni.setStorageSync('exchange_goods', item)
uni.navigateTo({ uni.navigateTo({
url: '/scoreShop/detail/index?id=' + item.id, url: '/scoreShop/detail/index?id=' + item.id+'&shopId='+item.shopId,
}) })
} }

View File

@@ -31,9 +31,13 @@
<view class="tab-item" :class="tabActive === 0 ? 'active' : ''" @click="tabActive = 0">优惠券</view> <view class="tab-item" :class="tabActive === 0 ? 'active' : ''" @click="tabActive = 0">优惠券</view>
<view class="tab-item" :class="tabActive === 1 ? 'active' : ''" @click="tabActive = 1">其它商品</view> <view class="tab-item" :class="tabActive === 1 ? 'active' : ''" @click="tabActive = 1">其它商品</view>
</view> </view>
<view class="u-flex" @click="toggleLayout"> <view class="u-flex gap-20">
<image :src="layout === 'block' ? imgs.layout_block : imgs.layout" class="layout" /> <view @click="toggleLayout">
<image :src="layout === 'block' ? imgs.layout_block : imgs.layout" class="layout" />
</view>
<ymfShare size="40rpx" color="#9C571F"></ymfShare>
</view> </view>
</view> </view>
<goodsList :pointsUser="pointsUser" :layout="layout" :list="list" @exchange="exchange"></goodsList> <goodsList :pointsUser="pointsUser" :layout="layout" :list="list" @exchange="exchange"></goodsList>
@@ -44,6 +48,7 @@
</view> </view>
</template> </template>
<script setup> <script setup>
import ymfShare from '@/components/ymf-components/ymf-share.vue'
import * as pointGoodsApi from "@/common/api/order/pointGoods.js"; import * as pointGoodsApi from "@/common/api/order/pointGoods.js";
import goodsList from "./components/goods-list.vue"; import goodsList from "./components/goods-list.vue";
import { import {
@@ -70,9 +75,18 @@
} }
function back() { function back() {
uni.navigateBack({ const pages = getCurrentPages();
delta: 1, if (pages.length < 2) {
}); uni.switchTab({
url: '/pages/index/index'
})
} else {
uni.navigateBack({
delta: 1,
});
}
} }
// function exchange(item) { // function exchange(item) {
@@ -87,12 +101,13 @@
// } // }
function toDetail() { function toDetail() {
if(!pointsUser.value||!pointsUser.value.id){ if (!pointsUser.value || !pointsUser.value.id) {
return return
} }
uni.navigateTo({ uni.navigateTo({
url: '/pages/user/member/billDetails?type=2&shopId=' + query.shopId + '&id=' + (pointsUser.value?pointsUser.value.id : url: '/pages/user/member/billDetails?type=2&shopId=' + query.shopId + '&id=' + (pointsUser.value ?
pointsUser.value.id :
'') '')
}) })
} }
@@ -132,7 +147,41 @@
} }
}) })
} }
onLoad((opt) => {
import {
shareMixin,
handleMixinOnLoad,
returnQuery,
jsonToUrl,
wxShare,returnIndexBg ,
returnCommonQuery
} from '@/utils/share.js'
// defineOptions({
// mixins: [shareMixin],
// });
async function onShare() {
const queryJson = await returnCommonQuery()
let query = jsonToUrl(queryJson)
let json = {}
json.title = '积分乐园,好物兑换'
json.imageUrl = returnIndexBg()||uni.cache.get('shopInfo').logo || ''
return wxShare({
query,
...json,
path: '/scoreShop/index/index' + '?' + query
})
}
onShareAppMessage(onShare)
onShareTimeline(onShare)
const options = reactive({
})
onLoad(async (opt) => {
Object.assign(options, opt)
query.shopId = opt.shopId || '' query.shopId = opt.shopId || ''
}) })
watch(() => tabActive.value, (newval, oldval) => { watch(() => tabActive.value, (newval, oldval) => {
@@ -151,8 +200,23 @@
query.page++ query.page++
getList(); getList();
}) })
onShow(() => { import {
refresh() productStore
} from '@/stores/user.js';
import {
onShareAppMessage
} from '@dcloudio/uni-app';
import { onShareTimeline } from '@dcloudio/uni-app';
const storeuser = productStore();
onShow(async () => {
if (!storeuser.isHasLogin) {
await handleMixinOnLoad(options)
refresh()
} else {
refresh()
}
}); });
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@@ -164,6 +228,10 @@
justify-content: flex-end; justify-content: flex-end;
} }
.gap-20 {
gap: 20rpx;
}
.top { .top {
padding: 138rpx 26rpx 48rpx 42rpx; padding: 138rpx 26rpx 48rpx 42rpx;
display: flex; display: flex;

View File

@@ -1,124 +1,130 @@
<template> <template>
<view class="min-page bg-f7 u-font-28 color-333"> <view class="min-page bg-f7 u-font-28 color-333">
<up-navbar <up-navbar title="兑换成功" bgColor="transparent" leftIconColor="#333" @leftClick="back()"
title="兑换成功" titleStyle="color:#333"></up-navbar>
bgColor="transparent" <view class="content">
leftIconColor="#333" <view class="bg" :style="{ backgroundImage: `url(${imgs.bg})` }">
@leftClick="back()" <image :src="imgs.success" class="success"></image>
titleStyle="color:#333" <view class="u-font-40 font-700">兑换成功</view>
></up-navbar> <view class="u-font-32 font-700">{{item.pointsGoodsName}}</view>
<view class="content"> <view class="u-m-t-14" v-if="item.goodsCategory!='优惠券'">需前往店铺自行兑换领取</view>
<view class="bg" :style="{ backgroundImage: `url(${imgs.bg})` }"> <view class="u-m-t-14" v-else>优惠券直接到账您的账户中</view>
<image :src="imgs.success" class="success"></image> </view>
<view class="u-font-40 font-700">兑换成功</view> <view class="info u-flex u-flex-col">
<view class="u-font-32 font-700">{{item.pointsGoodsName}}</view> <view class="u-p-22">
<view class="u-m-t-14" v-if="item.goodsCategory!='优惠券'">需前往店铺自行兑换领取</view> <text class="color-666">兑换商品</text>
<view class="u-m-t-14" v-else>优惠券直接到账您的账户中</view> <text>{{item.pointsGoodsName}}</text>
</view> </view>
<view class="info u-flex u-flex-col"> <view class="u-p-22">
<view class="u-p-22"> <text class="color-666">兑换数量</text>
<text class="color-666">兑换商品</text> <text>{{item.number}}</text>
<text>{{item.pointsGoodsName}}</text> </view>
</view> <view class="u-p-22">
<view class="u-p-22"> <text class="color-666">消耗积分</text>
<text class="color-666">兑换数量</text> <text>{{item.spendPoints}}</text>
<text>{{item.number}}</text> </view>
</view> <view class="u-p-22" v-if="item.extraPaymentAmount">
<view class="u-p-22"> <text class="color-666">支付金额</text>
<text class="color-666">消耗积分</text> <text>{{item.extraPaymentAmount}}</text>
<text>{{item.spendPoints}}</text> </view>
</view> <view class="u-p-22">
<view class="u-p-22" v-if="item.extraPaymentAmount"> <text class="color-666">下单时间</text>
<text class="color-666">支付金额</text> <text>{{item.createTime}}</text>
<text>{{item.extraPaymentAmount}}</text> </view>
<view class="u-p-22">
<text class="color-666">订单号</text>
<text>{{item.orderNo}}</text>
</view>
</view>
<view class="u-flex bottom u-row-center">
<view class="back btn" @click="back">继续兑换</view>
<view class="look btn" @click="lookOrder">查看订单</view>
</view>
</view> </view>
<view class="u-p-22"> </view>
<text class="color-666">下单时间</text>
<text>{{item.createTime}}</text>
</view>
<view class="u-p-22">
<text class="color-666">订单号</text>
<text>{{item.orderNo}}</text>
</view>
</view>
<view class="u-flex bottom u-row-center">
<view class="back btn" @click="back">继续兑换</view>
<view class="look btn" @click="lookOrder">查看订单</view>
</view>
</view>
</view>
</template> </template>
<script setup> <script setup>
const imgs = {
bg: "https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/2/b625560a5b75418c9e643841f8674a0c.png",
success: "https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/2/c2f0865efb444de58ff0d8bb3a51d300.png",
};
function back() {
const pages = getCurrentPages();
if(pages.length<2){
uni.redirectTo({
url: '/scoreShop/index/index?shopId=' + item.shopId
})
}else{
uni.navigateBack();
}
}
const imgs = { function lookOrder() {
bg: "https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/2/b625560a5b75418c9e643841f8674a0c.png", uni.redirectTo({
success: url: '/scoreShop/order/index?shopId=' + item.shopId
"https://cashier-oss.oss-cn-beijing.aliyuncs.com/upload/2/c2f0865efb444de58ff0d8bb3a51d300.png", })
}; }
function back() { const item = reactive({
uni.navigateBack();
}
function lookOrder() {
uni.redirectTo({
url:'/scoreShop/order/index?shopId='+item.shopId
})
}
const item=reactive({
}) })
onLoad(opt=>{ onLoad(opt => {
const exchange_goods_success_data=uni.getStorageSync('exchange_goods_success') const exchange_goods_success_data = uni.getStorageSync('exchange_goods_success')
Object.assign(item,exchange_goods_success_data) Object.assign(item, exchange_goods_success_data)
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.content { .content {
background: linear-gradient(180deg, #f5cd82 0%, rgba(247, 219, 165, 0) 100%); background: linear-gradient(180deg, #f5cd82 0%, rgba(247, 219, 165, 0) 100%);
height: 670rpx; height: 670rpx;
$color: #9c571f; $color: #9c571f;
.bg {
width: 100%;
height: 586rpx;
background-size: cover;
display: flex;
flex-direction: column;
justify-content: flex-end;
align-items: center;
padding-bottom: 26rpx;
color: $color;
.success { .bg {
width: 310rpx; width: 100%;
height: 206rpx; height: 586rpx;
} background-size: cover;
} display: flex;
.info { flex-direction: column;
padding-left: 174rpx; justify-content: flex-end;
padding-right: 32rpx; align-items: center;
} padding-bottom: 26rpx;
} color: $color;
.bottom {
gap: 48rpx;
margin-top: 44rpx;
.btn { .success {
padding: 14rpx 76rpx; width: 310rpx;
border-radius: 100rpx; height: 206rpx;
font-size: 32rpx; }
border: 1px solid transparent; }
&.back {
border-color: $my-main-color; .info {
color: $my-main-color; padding-left: 174rpx;
} padding-right: 32rpx;
&.look { }
background-color: $my-main-color; }
border-color: $my-main-color;
color: #fff; .bottom {
} gap: 48rpx;
} margin-top: 44rpx;
}
.btn {
padding: 14rpx 76rpx;
border-radius: 100rpx;
font-size: 32rpx;
border: 1px solid transparent;
&.back {
border-color: $my-main-color;
color: $my-main-color;
}
&.look {
background-color: $my-main-color;
border-color: $my-main-color;
color: #fff;
}
}
}
</style> </style>

View File

@@ -39,6 +39,7 @@ declare global {
const onScopeDispose: typeof import('vue')['onScopeDispose'] const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch'] const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onShareAppMessage: typeof import('@dcloudio/uni-app')['onShareAppMessage'] const onShareAppMessage: typeof import('@dcloudio/uni-app')['onShareAppMessage']
const onShareTimeline: typeof import('@dcloudio/uni-app')['onShareTimeline']
const onShow: typeof import('@dcloudio/uni-app')['onShow'] const onShow: typeof import('@dcloudio/uni-app')['onShow']
const onUnload: typeof import('@dcloudio/uni-app')['onUnload'] const onUnload: typeof import('@dcloudio/uni-app')['onUnload']
const onUnmounted: typeof import('vue')['onUnmounted'] const onUnmounted: typeof import('vue')['onUnmounted']

View File

@@ -90,11 +90,13 @@ export const useWebSocket = defineStore('socketTask', () => {
let onMessage = () => { let onMessage = () => {
} }
function setOnMessage(onMessageBallBack){
onMessage=onMessageBallBack function setOnMessage(onMessageBallBack) {
onMessage = onMessageBallBack
} }
function chnageInitMessage(data){
initMessage=data function chnageInitMessage(data) {
initMessage = data
} }
// 连接 WebSocket // 连接 WebSocket
const connect = async (connectMsg, onMessageBallBack) => { const connect = async (connectMsg, onMessageBallBack) => {
@@ -127,6 +129,8 @@ export const useWebSocket = defineStore('socketTask', () => {
url: uni.conf.baseUrlwws + '?' + Date.now(), url: uni.conf.baseUrlwws + '?' + Date.now(),
success: (res) => { success: (res) => {
console.log('连接成功'); console.log('连接成功');
console.log('connectMsg', connectMsg);
console.log('initMessage', initMessage);
isConnected.value = true; isConnected.value = true;
// 监听初始化成功在开启心跳 // 监听初始化成功在开启心跳
startHeartbeat(); startHeartbeat();
@@ -233,7 +237,7 @@ export const useWebSocket = defineStore('socketTask', () => {
// 发送消息 // 发送消息
const sendMessage = (data) => { const sendMessage = (data) => {
if(!data){ if (!data) {
return return
} }
if (isConnected.value && data) { if (isConnected.value && data) {
@@ -369,6 +373,8 @@ export const useWebSocket = defineStore('socketTask', () => {
initNetworkListener, initNetworkListener,
connect, connect,
allowReconnect, allowReconnect,
socketTask,setOnMessage,chnageInitMessage socketTask,
setOnMessage,
chnageInitMessage
}; };
}) })

View File

@@ -40,6 +40,9 @@ export const useCartsStore = defineStore("cart", () => {
//用户信息 //用户信息
const shopUserInfo = ref(uni.cache.get("shopUserInfo") || {}); const shopUserInfo = ref(uni.cache.get("shopUserInfo") || {});
//全部的商品列表
const allGoodsArr=ref([])
const consumeDiscount = ref({}); const consumeDiscount = ref({});
// 适配工具库 BaseCartItem 接口的商品数据转换函数 // 适配工具库 BaseCartItem 接口的商品数据转换函数
@@ -326,7 +329,11 @@ export const useCartsStore = defineStore("cart", () => {
.map((v) => { .map((v) => {
const item = getProductDetails(v); const item = getProductDetails(v);
if (!item) { const is_temporary=v.is_temporary||v.isTemporary
if(is_temporary){
return v
}
if (!item&&!is_temporary) {
socketSendMsg({ socketSendMsg({
id: v.id, id: v.id,
operate_type: "del", operate_type: "del",
@@ -496,10 +503,10 @@ export const useCartsStore = defineStore("cart", () => {
return false; return false;
} }
const isUse = const isUse =
shopUserInfo.value.isVip && shopUserInfo.value.isMemberPrice && shopInfo.value shopUserInfo.value.isVip && shopUserInfo.value.isMemberPrice ?
.isMemberPrice == 1 ?
true : true :
false; false;
console.log('useVipPrice',isUse);
return isUse; return isUse;
}); });
@@ -754,6 +761,6 @@ export const useCartsStore = defineStore("cart", () => {
//限时折扣 //限时折扣
limitTimeDiscount, limitTimeDiscount,
shopUserInfo, shopUserInfo,
socketSendMsg, socketSendMsg,allGoodsArr
}; };
}); });

View File

@@ -25,7 +25,7 @@ export const Memberpay = defineStore('memberpay', {
let res = await APIpayltPayVip({ let res = await APIpayltPayVip({
...data, ...data,
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
payType: 'wechatPay', payType: 'WECHAT',
openId: uni.cache.get('userInfo').wechatOpenId, openId: uni.cache.get('userInfo').wechatOpenId,
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY
@@ -113,7 +113,7 @@ export const Memberpay = defineStore('memberpay', {
} }
}, },
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
payType: 'wechatPay', payType: 'WECHAT',
openId: uni.cache.get('userInfo').wechatOpenId, openId: uni.cache.get('userInfo').wechatOpenId,
// #endif // #endif
// #ifdef MP-ALIPAY // #ifdef MP-ALIPAY

View File

@@ -49,7 +49,7 @@ export const Storelogin = defineStore("login", {
rawData: infoRes.rawData, rawData: infoRes.rawData,
source: "wechat", source: "wechat",
}); });
console.log('APIuserlogin',res); console.log('APIuserlogin', res);
if (res) { if (res) {
this.token = res.token; this.token = res.token;
this.miniAppOpenId = res.userInfo this.miniAppOpenId = res.userInfo
@@ -110,12 +110,90 @@ export const productStore = defineStore("product", {
latitude: "", latitude: "",
longitude: "", longitude: "",
}, },
token: "",
miniAppOpenId: "",
userInfo: "",
shopId: uni.cache.get('shopId') || '',
shopInfo: { shopInfo: {
shopId: "", shopId: "",
isOrderFence: 0, isOrderFence: 0,
id: '',
}, },
shopUserInfo:{
},
isHasLogin:false
}), }),
actions: { actions: {
actionslogin() {
return new Promise(async (resolve, reject) => {
// #ifdef MP-WEIXIN
uni.login({
provider: "weixin",
success: (data) => {
// 微信小程序环境
uni.getUserInfo({
provider: "weixin",
success: async (infoRes) => {
let res = await APIuserlogin({
code: data.code, //临时登录凭证
rawData: infoRes.rawData,
source: "wechat",
});
console.log('APIuserlogin', res);
if (res) {
this.token = res.token;
this.isHasLogin=true
this.miniAppOpenId = res.userInfo
.miniAppOpenId;
this.userInfo = res.userInfo;
uni.cache.set("token", res.token);
uni.cache.set("userInfo", res.userInfo);
uni.cache.set("followIndex", res
.followIndex || "");
}
resolve(true);
},
fail: (err) => {
reject(false);
},
});
},
});
// #endif
// #ifdef MP-ALIPAY
my.getAuthCode({
scopes: "auth_base",
success: async (data) => {
// 支付宝小程序环境
// my.getAuthUserInfo({
// success: async (infoRes) => {
let res = await APIuserlogin({
code: data.authCode, //临时登录凭证
// rawData: JSON.stringify(infoRes),
source: "alipay",
});
if (res) {
this.isHasLogin=true
this.token = res.token;
this.miniAppOpenId = res.userInfo.miniAppOpenId;
this.userInfo = res.userInfo;
uni.cache.set("token", res.token);
uni.cache.set("openId", res.userInfo.alipayOpenId);
uni.cache.set("userInfo", res.userInfo);
resolve(true);
}
},
fail: () => {
reject(false);
},
});
// #endif
// #ifdef H5
resolve(true)
// #endif
});
},
getLocation() { getLocation() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
console.log("获取经纬度"); console.log("获取经纬度");
@@ -185,7 +263,7 @@ export const productStore = defineStore("product", {
console.log("扫码内容", q); console.log("扫码内容", q);
// #ifdef H5 // #ifdef H5
uni.navigateTo({ uni.navigateTo({
url:'/pages/product/index' url: '/pages/product/index'
}) })
return return
// #endif // #endif
@@ -448,19 +526,43 @@ export const productStore = defineStore("product", {
// 通过shopId 获取店铺会员信息 // 通过shopId 获取店铺会员信息
actionsproductqueryProduct() { actionsproductqueryProduct() {
console.log('actionsproductqueryProduct:token',uni.cache.get('token'));
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
let res = await APIshopUserInfo(); let res = await APIshopUserInfo();
uni.cache.set("shopUserInfo", res); if(res&& typeof res === 'object'){
uni.cache.set("orderVIP", res); this.shopUserInfo=res;
uni.cache.set("ordershopUserInfo", res.shopInfo); uni.cache.set("shopUserInfo", res);
resolve(res); uni.cache.set("orderVIP", res);
uni.cache.set("ordershopUserInfo", res.shopInfo);
resolve(res);
}else{
reject(false);
}
} catch (e) { } catch (e) {
reject(false); reject(false);
} }
}); });
}, },
async pageOnload() {
console.log('开始加载必须数据')
//登录
await this.actionslogin()
//获取会员信息
await this.actionsproductqueryProduct()
//获取店铺信息
await this.getShopInfo()
console.log('必须数据加载完毕')
},
async getShopInfo(shopId) {
const shopRes = await APIusershopInfodetail({
shopId: this.shopId || shopId,
});
this.shopInfo = shopRes.shopInfo;
uni.cache.set("shopInfo", shopRes.shopInfo);
},
// 用户信息获取 // 用户信息获取
actionsAPIuser() { actionsAPIuser() {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,15 @@
import {
autoBindInviteUser,
autoGetInviteCode
} from '@/common/api/market/distribution.js'
import {
APIshopUserInfo,
APIusershopInfodetail
} from '@/common/api/member.js'
import {
productStore
} from '@/stores/user.js';
const accountStore = productStore();
const accountInfo = wx.getAccountInfoSync(); const accountInfo = wx.getAccountInfoSync();
export const envVersion = accountInfo.miniProgram.envVersion; export const envVersion = accountInfo.miniProgram.envVersion;
let type = 3; let type = 3;
@@ -13,9 +25,306 @@ if (envVersion === 'trial') {
} }
/**
* 绑定用户邀请关系(核心函数)
* 功能说明:校验邀请码有效性,有效则调用自动绑定接口完成邀请关系绑定
* @param {Object} args - 绑定邀请关系的入参对象
* @param {number} [args.shopUserId] - 需要绑定邀请人的用户IDinteger <int64>,可选)
* @param {number} [args.shopId] - 店铺IDinteger <int64>,可选)
* @param {string} args.inviteCode - 邀请人的邀请码(必填,非空校验通过后才会执行绑定逻辑)
* @returns {void} 无返回值
*/
export async function bindInvite(args) {
// 解构入参对象,获取需要的核心参数
const {
shopUserId,
shopId,
inviteCode
} = args;
// 校验邀请码有效性若邀请码为空、null、undefined则直接返回不执行后续绑定逻辑
if (!inviteCode || inviteCode === null || inviteCode === undefined) {
return;
}
const shopUserInfo = uni.cache.get('shopUserInfo')
// 邀请码有效,调用自动绑定邀请人接口,传递绑定所需参数
return await autoBindInviteUser({
id: shopUserInfo.id,
shopId,
inviteCode
});
}
export function wxShare(par) { export function wxShare(par) {
return { return {
...par, ...par,
type type
} }
} }
export async function returnCommonQuery() {
const shopId = uni.cache.get('shopId')
const shopUserInfo = uni.cache.get('shopUserInfo')
const shopInfo = uni.cache.get('shopInfo')
const inviteCode = await autoGetInviteCode({
shopId: shopId,
shopUserId: shopUserInfo.id
})
const queryJson = {
inviteCode: (inviteCode && inviteCode !== true) ? inviteCode : null,
shopId,
shopUserId: shopUserInfo.id,
}
return Promise.resolve(queryJson)
}
export function jsonToUrl(json) {
let result = ''
for (let key in json) {
if (json[key]) {
if (result === '') {
result += `${key}=${json[key]}`
} else {
result += `&${key}=${json[key]}`
}
}
}
return result
}
/**
* @param {Object} query 参数对象
* @param {Array} showkeys 需要显示的key不包括公共参数
*/
export async function returnQuery(query, showkeys) {
const shopId = uni.cache.get('shopId')
const shopUserInfo = uni.cache.get('shopUserInfo')
const shopInfo = uni.cache.get('shopInfo')
const inviteCode = await autoGetInviteCode({
shopId: shopId,
shopUserId: shopUserInfo.id
})
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const currentPath = currentPage.route;
const currentOptions = currentPage.options;
let sharePath = `/${currentPath}`;
const queryJson = {
inviteCode: (inviteCode && inviteCode !== true) ? inviteCode : null,
shopId,
shopUserId: shopUserInfo.id,
...query
}
for (const key in currentOptions) {
if (currentOptions.hasOwnProperty(key)) {
if (showkeys && Array.isArray(showkeys) && showkeys.includes(key)) {
queryJson[key] = encodeURIComponent(currentOptions[key])
} else {
queryJson[key] = encodeURIComponent(currentOptions[key])
}
}
}
queryJson.shopId = shopId
queryJson.inviteCode = (inviteCode && inviteCode !== true) ? inviteCode : null
queryJson.shopUserId = shopUserInfo.id
let result = ''
for (let key in queryJson) {
if (queryJson[key]) {
if (result === '') {
result += `${key}=${queryJson[key]}`
} else {
result += `&${key}=${queryJson[key]}`
}
}
}
return Promise.resolve(result)
}
function parseQueryString(queryString) {
const queryParams = queryString.split("&").map((param) => param.split("="));
const params = {};
for (const [key, value] of queryParams) {
params[key] = value;
}
return params;
}
/**
* 混入的 onLoad 核心逻辑(抽成独立函数)
* @param {Object} opt - 页面 onLoad 接收的参数
* @param {Object} vm - 组件实例this
*/
export async function handleMixinOnLoad(opt, vm) {
console.log('onLoad');
const options = {}
if (opt.q) {
const q = decodeURIComponent(opt.q);
const params = parseQueryString(q.split("?")[1]);
Object.assign(options, params);
} else {
Object.assign(options, opt);
}
console.log('options', options);
if (options.shopId) {
uni.cache.set('shopId', options.shopId)
accountStore.shopId = options.shopId
await accountStore.pageOnload()
}
uni.setStorageSync('loadFinsh', true)
// const shopId = uni.cache.get('shopId')
// const shopUserInfo = uni.cache.get('shopUserInfo')
// const shopInfo = uni.cache.get('shopInfo')
// const inviteCode = await autoGetInviteCode({
// shopId: shopId,
// shopUserId: shopUserInfo.id
// })
if (options.inviteCode) {
return await bindInvite(options)
}
}
import {
isJsonArrayString
} from '@/utils/util.js';
/**
* 返回店铺首页图片
*/
export function returnIndexBg() {
try {
const orderVIP = uni.cache.get('orderVIP')
if (!orderVIP || !orderVIP.shopExtendList) {
return ''
}
if (!isJsonArrayString(orderVIP.shopExtendList[0].value)) {
return ''
}
return JSON.parse(orderVIP.shopExtendList[0].value)[0]
} catch (error) {
console.error('orderVIP.shopExtendList[0].value 格式不正确')
return ''
//TODO handle the exception
}
}
// utils/share.js
export const shareMixin = {
// async onLoad(opt) {
// console.log('onLoad');
// const options = {}
// if (opt.q) {
// const q = decodeURIComponent(opt.q);
// const params = parseQueryString(q.split("?")[1]);
// Object.assign(options, params);
// } else {
// Object.assign(options, opt);
// }
// console.log('options', options);
// if (options.shopId) {
// uni.cache.set('shopId', options.shopId)
// }
// const shopId = uni.cache.get('shopId')
// const shopUserInfo = uni.cache.get('shopUserInfo')
// const shopInfo = uni.cache.get('shopInfo')
// const inviteCode = await autoGetInviteCode({
// shopId: shopId,
// shopUserId: shopUserInfo.id
// })
// uni.setStorageSync('loadFinsh',true)
// if (options.inviteCode) {
// bindInvite(options)
// }
// },
async onShareAppMessage(res) {
const shopInfo = uni.cache.get('shopInfo')
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const currentPath = currentPage.route;
const currentOptions = currentPage.options;
let sharePath = `/${currentPath}`;
const query = await returnQuery()
const indexBg = returnIndexBg()
console.log('indexBg', indexBg);
const imageUrl = indexBg || shopInfo.logo
// 全局默认配置(可被页面覆盖)
const defaultShareConfig = {
title: shopInfo.shopName,
path: sharePath + '?' + query,
imageUrl: imageUrl,
query,
// desc: '描述',
success: (res) => {
console.log('分享好友成功', res);
// 可加埋点等统一逻辑
},
fail: (err) => {
console.error('分享好友失败', err);
}
};
// 页面自定义配置覆盖全局
const pageShareConfig = this.$options.shareConfig || {};
console.log('mixIn onShareAppMessage', {
...defaultShareConfig,
...pageShareConfig
})
return wxShare({
...defaultShareConfig,
...pageShareConfig
});
},
async onShareTimeline() {
const shopInfo = uni.cache.get('shopInfo')
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const currentPath = currentPage.route;
const currentOptions = currentPage.options;
let sharePath = `/${currentPath}`;
const query = await returnQuery()
const indexBg = returnIndexBg()
const imageUrl = indexBg || shopInfo.logo
const defaultTimelineConfig = {
title: shopInfo.shopName,
path: sharePath + '?' + query,
imageUrl: imageUrl,
query,
};
const pageTimelineConfig = this.$options.shareTimelineConfig || {};
return wxShare({
...defaultTimelineConfig,
...pageTimelineConfig
});
}
};

View File

@@ -15,6 +15,7 @@ module.exports = defineConfig({
{ {
"@dcloudio/uni-app": [ "@dcloudio/uni-app": [
"onShareAppMessage", "onShareAppMessage",
"onShareTimeline",
"onLoad", "onLoad",
"onShow", "onShow",
"onHide", "onHide",
@@ -33,11 +34,11 @@ module.exports = defineConfig({
], ],
server: { server: {
proxy: { proxy: {
'/api': { '/testApi': {
// target: 'https://cashier.sxczgkj.com', // 目标服务器地址 // target: 'https://cashier.sxczgkj.com', // 目标服务器地址
target: 'http://192.168.1.42/', // 目标服务器地址 target: 'http://192.168.1.42/', // 目标服务器地址
changeOrigin: true, // 是否更改请求源 changeOrigin: true, // 是否更改请求源
rewrite: path => path.replace(/^\/api/, '') rewrite: path => path.replace(/^\/testApi/, '')
}, },
'/prodApi': { '/prodApi': {
target: 'https://cashier.sxczgkj.com', // 目标服务器地址 target: 'https://cashier.sxczgkj.com', // 目标服务器地址