From 64753a359654788f9342656171a9e8eda033b531 Mon Sep 17 00:00:00 2001
From: "@xiao-xiao0105" <1097449274@qq.com>
Date: Fri, 6 Nov 2026 16:17:06 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A2=84=E7=BA=A6=E7=9B=B8?=
=?UTF-8?q?=E5=85=B3=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pages/book/book.vue | 193 ++++++++++++++----------
pages/book/bookinfo.vue | 11 +-
pages/book/booklist.vue | 21 +--
pages/book/bookteacher.vue | 3 +
pages/chatbox/im-user-info.vue | 50 +-----
pages/components/member-card-scroll.vue | 34 ++++-
pages/components/member-card.vue | 16 +-
pages/user/cardDetail.vue | 2 +-
pages/user/courselist.vue | 7 +-
pages/user/user.vue | 116 ++++----------
10 files changed, 205 insertions(+), 248 deletions(-)
diff --git a/pages/book/book.vue b/pages/book/book.vue
index a9d4771..8f14758 100644
--- a/pages/book/book.vue
+++ b/pages/book/book.vue
@@ -10,7 +10,7 @@
-
+
@@ -51,8 +51,8 @@
-
-
+
+
@@ -73,46 +73,53 @@
-
-
- {{ currentCourse.courseName }}
-
- 需扣 {{ currentCourse.deductType === 'count'
- ? currentCourse.deductCount + '次'
- : '¥' + currentCourse.deductAmount }}
-
+
+
+ 无对应会员卡可使用
+
+
+
+
+ {{ item.courseName}}
+
+ 需扣 {{ selectedCard.memberChargeType === 'total_fee'
+ ? '¥' + selectedCard.chargeFee
+ : selectedCard.chargeCnt + '次'}}
+
+
+
+
+ 本次使用卡片:
+
+ {{ effectiveCardName }}
+
+ 默认
+
-
-
- 本次使用卡片:
-
- {{ effectiveCardName }}
-
- 默认
+
+
+
+
+
-
-
-
-
+
+
@@ -135,31 +142,27 @@ export default {
userid: "",
id: "",
item: {
- courseTimeId: 1935590320322428931,
- claName: "普拉提A班",
- courseName: "普拉提",
- storeName: "慢瑜伽-三台子店",
+ courseTimeId: null,
+ claName: "",
+ courseName: "",
+ storeName: "",
pic: null,
- claDate: "2025-10-01",
- weekDay: "星期二",
- startTime: "08:00",
- endTime: "09:30",
- staffName: "冉洪涛老师",
- studentCount: 1,
+ claDate: "",
+ weekDay: "",
+ startTime: "",
+ endTime: "",
+ staffName: "",
+ studentCount: null,
roomName: null,
- claColor: "#409EFF",
- claTimeStatus: "1",
- bookAttendCnt: "1",
- atClassCnt: "5",
- lessCnt: "3"
+ claColor: "",
+ claTimeStatus: "",
+ bookAttendCnt: "",
+ atClassCnt: "",
+ lessCnt: ""
},
remark: null,
memberCards: [],
currentCourse: {
- courseName: '普拉提A班',
- deductType: 'COUNT',
- deductCount: 1,
- deductAmount: 0
},
defaultCardId: null,
// ✅ 用户手动选中的卡(父组件持有)
@@ -210,9 +213,9 @@ export default {
isCardUsable(card) {
if (!card) return false;
if (card.status && card.status !== 'ACTIVE') return false;
- if (card.expireDate) {
+ if (card.expiryDate) {
const now = new Date();
- const expire = new Date(card.expireDate.replace(/-/g, '/'));
+ const expire = new Date(card.expiryDate.replace(/-/g, '/'));
if (now > expire) return false;
}
const type = this.currentCourse.deductType;
@@ -235,15 +238,19 @@ export default {
// ✅ 打开弹窗:重置手动选择,用默认卡
async openCardSelect(item) {
var user = myCache('userInfo');
+ item.visitStore=user.visitStore;
+ console.log('item',item)
const { data: memberCards } =
await uni.$http.post("/api/memberCard/getMemberCardListByCourseTimeId",
- {visitStore:user.visitStore,
- courseId:item.courseId
- });
- console.log("memberCards",memberCards)
+ item);
//如果为空 则没有适合的卡片
this.memberCards = memberCards.data
- this.selectedCard = null;
+ console.log('this.memberCards',this.memberCards)
+ if(this.memberCards&&this.memberCards.length > 0){
+ this.selectedCard = this.memberCards[0];
+ }else{
+ this.selectedCard = null;
+ }
this.$refs.cardPopup.open();
},
@@ -252,37 +259,53 @@ export default {
},
async confirmSelect() {
- // ✅ 直接从父组件 computed 拿有效卡
const card = this.effectiveCard;
if (!card) {
uni.showToast({ title: '无可用会员卡', icon: 'none' });
return;
}
- const { data: res } = await uni.$http.post('/api/course/bookCourse', {
- courseTimeId: this.item.courseTimeId,
- cardId: card.id
+ // 开启loading
+ uni.showLoading({
+ title: '预约中...',
+ mask: true // 遮罩,防止重复点击
});
- if (res && res.success) {
- myCache('courserefresh', 1);
- uni.showModal({
- title: '提示',
- content: '课程已预约!',
- cancelText: '返回',
- confirmText: '确定',
- success: ress => {
- uni.navigateBack({ delta: 1 });
- }
+ try {
+ const { data: res } = await uni.$http.post('/api/course/bookCourse', {
+ courseTimeId: this.item.courseTimeId,
+ memberCardId: card.memberCardId,
+ memberChargeType: this.selectedCard.memberChargeType,
+ chargeCnt: this.selectedCard.chargeCnt,
+ chargeFee: this.selectedCard.chargeFee
});
- } else {
- uni.showModal({
- title: '提示',
- content: res.message ? res.message : '课程预约失败!',
- cancelText: '取消',
- confirmText: '确定'
+ if (res && res.success) {
+ myCache('courserefresh', 1);
+ this.closeCardSelect();
+ this.$refs.uToast.show({
+ title: '课程预约成功,请到 我的预约-预约中 查看',
+ type: 'success',
+ duration: 2000
+ });
+ } else {
+ this.$refs.uToast.show({
+ title: res.message ? res.message : '课程预约失败!',
+ type: 'error',
+ duration: 2000
+ });
+ }
+ } catch (err) {
+ // 网络异常捕获
+ this.$refs.uToast.show({
+ title: '预约请求异常,请稍后重试',
+ type: 'error',
+ duration: 2000
});
+ } finally {
+ // 不管成功失败、报错,都关闭loading
+ uni.hideLoading();
}
},
+
formatTime(timeStr) {
return timeStr.slice(0, 5);
},
@@ -819,5 +842,11 @@ export default {
border: none;
&::after { border: none; }
}
+ .empty-tip {
+ padding: 60rpx 20rpx;
+ text-align: center;
+ font-size: 28rpx;
+ color: #999;
+ }
diff --git a/pages/book/bookinfo.vue b/pages/book/bookinfo.vue
index ada0ea6..b865925 100644
--- a/pages/book/bookinfo.vue
+++ b/pages/book/bookinfo.vue
@@ -23,19 +23,24 @@
预约状态:
- 教练确认
+ 预约中
预约中
- 待上课
+ 预约成功,待上课
已完成
已取消
+
+ 签到状态:
+ 已签到
+ 未签到
+
授课教练:
{{info.teacherName }}
上课教室:
- {{info.roomName }}
+ {{info.roomName?info.roomName:'待定'}}
上课时间:
diff --git a/pages/book/booklist.vue b/pages/book/booklist.vue
index 59090d4..9747bac 100644
--- a/pages/book/booklist.vue
+++ b/pages/book/booklist.vue
@@ -19,11 +19,13 @@
- 教练确认
+
+ 预约中
预约中
- 待上课
+ 预约成功,待上课
已完成
已取消
+ 预约失败
@@ -35,7 +37,8 @@
{{item.courseName}} {{item.claName}}
教练:{{item.teacherName || '-'}}
上课时间:{{ item.claDate+' '+item.startTime+'-'+item.endTime}}
- 教室:{{item.roomName}}
+ 教室:{{item.roomName?item.roomName:'待定'}}
+ 使用会员卡号:{{item.cardNo}}
@@ -49,7 +52,7 @@
-
+
@@ -677,7 +680,7 @@ import { mapState, mapGetters, mapActions } from 'vuex';
// 取消预约
cancelyydo(e){
console.log(e);
- var id= e.currentTarget.dataset.id;
+ // var id= e.currentTarget.dataset.id;
var that = this;
//取消预约
uni.showModal({
@@ -687,16 +690,14 @@ import { mapState, mapGetters, mapActions } from 'vuex';
confirmText: '确定',
success: ress => {
if (ress.confirm) {
- that.delyydo(id);
+ that.delyydo(e);
}
}
});
},
// 取消预约
- async delyydo(id){
- var param={
- "courseTimeId":id
- };
+ async delyydo(e){
+ var param=e;
uni.showToast({
title: '取消中...',
icon: 'success',
diff --git a/pages/book/bookteacher.vue b/pages/book/bookteacher.vue
index 13aa2f3..73d1244 100644
--- a/pages/book/bookteacher.vue
+++ b/pages/book/bookteacher.vue
@@ -12,10 +12,12 @@
性别:{{item.sex==2?'男':(item.sex==1?'女':'未知')}}
电话:{{item.phone?item.phone:'-'}}
+ 会员卡号:{{item.cardNo?item.cardNo:'-'}}
+
教练确认
预约中
待上课
@@ -139,6 +141,7 @@
// 全部
this.loadStatus="noMore";
this.list=res.data;
+ console.log('this.list',this.list)
this.$forceUpdate();
}
else{
diff --git a/pages/chatbox/im-user-info.vue b/pages/chatbox/im-user-info.vue
index 91f9ebb..a3ed2e1 100644
--- a/pages/chatbox/im-user-info.vue
+++ b/pages/chatbox/im-user-info.vue
@@ -8,16 +8,6 @@
ID:{{ userInfo.id || userInfo.userId || '-' }}
-
-
-
-
-
-
-
-
-
-
加入黑名单
@@ -84,45 +74,7 @@ export default {
console.error('查询黑名单状态失败', e)
}
},
- /**
- * switch点击,不直接改状态,弹出确认弹窗
- */
- onBlackSwitchChange(e) {
- // e.detail.value 是用户想要切换到的目标状态
- const targetStatus = e.detail.value
- const title = targetStatus ? '加入黑名单' : '取消黑名单'
- const content = targetStatus
- ? '加入黑名单后,对方将无法给你发送消息,确定?'
- : '确定将该用户移出黑名单?'
-
- uni.showModal({
- title,
- content,
- success: async (res) => {
- if (!res.confirm) {
- // 用户点取消,不做任何操作,switch会自动回弹回旧状态,无需手动赋值
- return
- }
- try {
- const url = targetStatus ? '/api/blacklist/add?targetUid=' : '/api/blacklist/cancel?targetUid='
- await uni.$http.post(`${url}${this.userId}`)
- // 接口成功才更新本地状态
- this.isBlacked = targetStatus
- uni.showToast({
- title: this.isBlacked ? '已加入黑名单' : '已取消黑名单',
- icon: 'none'
- })
- } catch (err) {
- uni.showToast({ title: '操作失败', icon: 'none' })
- }
- }
- })
- },
onSendMessage() {
- // if (this.isBlacked) {
- // uni.showToast({ title: '你已将对方加入黑名单', icon: 'none' })
- // return
- // }
let chat = {
type: 'PRIVATE',
targetId: this.userId,
@@ -190,7 +142,7 @@ export default {
onBackPress(e) {
// 来源是左上角返回 / 安卓返回键
if(e.from === 'backbutton'){
- if(this.isBlacked){
+ if(this.isBlacked && this.chatIndex){
// 拉黑成功,自定义跳转chat
this.goBackChat()
return true // return true 阻止原生默认返回
diff --git a/pages/components/member-card-scroll.vue b/pages/components/member-card-scroll.vue
index a467312..61a5d35 100644
--- a/pages/components/member-card-scroll.vue
+++ b/pages/components/member-card-scroll.vue
@@ -1,7 +1,7 @@
- 正常
+ 正常
{{ getUnusableReason(card) }}
@@ -99,15 +99,20 @@ export default {
},
// 动态计算首尾 padding
innerStyle() {
- if (!this.center) {
+ // ✅ 只要卡片总数=1,不管外部center参数传啥,自动触发居中计算
+ const isSingleCard = this.cards && this.cards.length === 1;
+ if (!this.center && !isSingleCard) {
+ // 多卡正常:保留原来的20rpx边距
return { paddingLeft: '20rpx', paddingRight: '20rpx' };
}
+ // 居中计算:左右padding = (屏幕宽度750rpx - 卡片宽度) / 2,刚好把卡片推到正中间
const padding = Math.max(0, (this.screenWidthRpx - this.cardWidthRpx) / 2);
return {
- paddingLeft: padding + 'rpx',
+ paddingLeft: padding-30 + 'rpx',
paddingRight: padding + 'rpx'
};
}
+
},
watch: {
cards: {
@@ -183,9 +188,9 @@ export default {
if (!card) return false;
// ✅ 只有 ACTIVE 才可用
if (card.status && card.status !== 'ACTIVE') return false;
- if (card.expireDate) {
+ if (card.expiryDate) {
const now = new Date();
- const expire = new Date(card.expireDate.replace(/-/g, '/'));
+ const expire = new Date(card.expiryDate.replace(/-/g, '/'));
if (now > expire) return false;
}
if (card.type === 'count') {
@@ -214,9 +219,9 @@ export default {
if (card.status && card.status == 'DEPLETED') {
return '卡片额度已用完';
}
- if (card.expireDate) {
+ if (card.expiryDate) {
const now = new Date();
- const expire = new Date(card.expireDate.replace(/-/g, '/'));
+ const expire = new Date(card.expiryDate.replace(/-/g, '/'));
if (now > expire) return '卡片已过期';
}
if (card.type === 'count') {
@@ -299,4 +304,17 @@ export default {
background: #00a89b;
}
}
+.card-scroll-wrap {
+ width: 100%;
+ overflow-x: auto;
+ padding: 20rpx 0;
+ /* 多卡时默认左对齐横向滚动 */
+ display: flex;
+ gap: 20rpx;
+}
+
+
+
+
+
diff --git a/pages/components/member-card.vue b/pages/components/member-card.vue
index 027fa19..182eadb 100644
--- a/pages/components/member-card.vue
+++ b/pages/components/member-card.vue
@@ -21,22 +21,28 @@
- {{ card.chargeType === 'count' ? '剩余次数' : card.chargeType ==='days'?'剩余天数':'卡内余额' }}
+ {{ card.chargeType === 'count' ? '剩余次数' : card.chargeType ==='days'?'剩余天数':'可用余额' }}
¥
- {{ card.chargeType === 'count' ? (card.remainingCount || 0) : card.chargeType ==='days'?card.remainingDays: formatAmount(card.remainingTotalFee) }}
+ {{
+ card.chargeType === 'count'
+ ? Math.max((card.remainingCount || 0) - (card.freezeCount || 0), 0)
+ : card.chargeType === 'days'
+ ? (card.remainingDays || 0)
+ : formatAmount( Math.max( (Number(card.remainingTotalFee)||0) - (Number(card.freezeAmount)||0), 0 ) )
+ }}
次
天
-
+
预约占用
- {{ card.type === 'count' ? card.frozenCount + '次' : '¥' + formatAmount(card.frozenAmount) }}
+ {{ card.type === 'count' ? card.freezeCount + '次' : '¥' + formatAmount(card.freezeAmount) }}
@@ -45,7 +51,7 @@
NO. {{ card.cardNo || '--' }}
- {{ card.expireDate ? '有效期至 ' + card.expireDate : '长期有效' }}
+ {{ card.expiryDate ? '有效期至 ' + card.expiryDate : '长期有效' }}
diff --git a/pages/user/cardDetail.vue b/pages/user/cardDetail.vue
index e9111f4..7eef243 100644
--- a/pages/user/cardDetail.vue
+++ b/pages/user/cardDetail.vue
@@ -74,7 +74,7 @@
有效期至
- {{ card.expireDate || '长期有效' }}
+ {{ card.expiryDate || '长期有效' }}
状态
diff --git a/pages/user/courselist.vue b/pages/user/courselist.vue
index 333e8f5..8509509 100644
--- a/pages/user/courselist.vue
+++ b/pages/user/courselist.vue
@@ -56,11 +56,12 @@
-
+
- {{item.courseName}}
+ {{item.courseName}}
+
@@ -74,7 +75,7 @@
- {{item.roomName}}
+ {{item.roomName?item.roomName:'教室待定'}}
diff --git a/pages/user/user.vue b/pages/user/user.vue
index 2716f30..481a2b5 100644
--- a/pages/user/user.vue
+++ b/pages/user/user.vue
@@ -13,20 +13,27 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ 暂无会员卡
+
+
+
+
+
+
+
-
+
@@ -219,77 +226,7 @@
avatar:"../../static/image/logo.png",
roleId:[],
memberCards: [
- // 1. 次卡:正常,余额充足
- {
- id: 1001,
- cardNo: '88880001',
-
- chargeType: 'count',//收费模式 count:课时 days:时间 total_fee:储值
- cardName: '次卡',
- remainingCount: 8,
- frozenCount: 1,
- remainingTotalFee: 0,
- frozenAmount: 0,
- expireDate: '2027-12-31',
- status: 'ACTIVE'
- },
- // 2. 次卡:剩余次数不足(只剩1次)
- {
- id: 1002,
- type: 'COUNT',
- cardName: '次卡',
- name: '体验次卡',
- cardNo: '88880002',
- remainingCount: 1,
- frozenCount: 0,
- remainAmount: 0,
- frozenAmount: 0,
- expireDate: '2026-12-31',
- status: 'NORMAL'
- },
- // 3. 储值卡:余额充足
- {
- id: 1003,
- type: 'AMOUNT',
- cardName: '储值卡',
- name: '瑜伽储值卡',
- cardNo: '88880003',
- remainingCount: 0,
- frozenCount: 0,
- remainAmount: 1280.50,
- frozenAmount: 200.00,
- expireDate: '2028-06-30',
- status: 'NORMAL'
- },
- // 4. 储值卡:余额不足(只剩50元)
- {
- id: 1004,
- type: 'AMOUNT',
- cardName: '储值卡',
- name: '小额储值卡',
- cardNo: '88880004',
- remainingCount: 0,
- frozenCount: 0,
- remainAmount: 50.00,
- frozenAmount: 0,
- expireDate: '2027-01-01',
- status: 'NORMAL'
- },
- // 5. 已过期的次卡
- {
- id: 1005,
- type: 'COUNT',
- cardName: '次卡',
- name: '过期次卡',
- cardNo: '88880005',
- remainingCount: 5,
- frozenCount: 0,
- remainAmount: 0,
- frozenAmount: 0,
- expireDate: '2025-01-01', // 已过期
- status: 'NORMAL'
- }
],
favoritesnum:0,//我的收藏数量
menus: [
@@ -425,7 +362,7 @@
this.signature = user.signature?user.signature:this.signature;
this.roleId=user.roleId?user.roleId:[];
this.getmember();
-
+ this.getMemberCards();
// if(myCache("ifuserEdit"))
// {
// myCache("ifuserEdit",false)
@@ -1238,5 +1175,10 @@
align-items: center;
}
}
-
+ .empty-tip {
+ padding: 60rpx 20rpx;
+ text-align: center;
+ font-size: 28rpx;
+ color: #999;
+ }