diff --git a/gym-manage-uniapp/App.vue b/gym-manage-uniapp/App.vue
index b72acaf..cc80391 100644
--- a/gym-manage-uniapp/App.vue
+++ b/gym-manage-uniapp/App.vue
@@ -4,80 +4,82 @@
-
\ No newline at end of file
+
+// 强制 CSS 覆盖(最终保险)
+const forceCSSHide = () => {
+ // #ifdef APP-PLUS
+ const style = document.createElement('style')
+ style.innerHTML = `
+ uni-tabbar,
+ uni-tabbar .uni-tabbar,
+ .uni-tabbar,
+ uni-tabbar > .uni-tabbar,
+ [class*="uni-tabbar"] {
+ display: none !important;
+ height: 0 !important;
+ opacity: 0 !important;
+ visibility: hidden !important;
+ pointer-events: none !important;
+ }
+ `
+ document.head.appendChild(style)
+ console.log('✅ CSS 强制覆盖已注入')
+ // #endif
+}
+
+// 预加载所有 Tab 页面的核心数据
+const preloadTabData = () => {
+ // 延迟执行,不阻塞首屏
+ setTimeout(() => {
+ // 预加载课程数据等...
+ }, 1000)
+}
+
+onLaunch(() => {
+ console.log('App Launch')
+ preloadTabData()
+})
+
+onShow(() => {
+ console.log('App Show')
+ // #ifdef APP-PLUS
+ hideNativeTabBar()
+ // #endif
+})
+
+onHide(() => {
+ console.log('App Hide')
+})
+
+
+
\ No newline at end of file
diff --git a/gym-manage-uniapp/api/main.js b/gym-manage-uniapp/api/main.js
index eb59c09..0a38907 100644
--- a/gym-manage-uniapp/api/main.js
+++ b/gym-manage-uniapp/api/main.js
@@ -4,6 +4,14 @@ export function login(params) {
return request.post('/member/auth/miniapp/login', params)
}
+export function sendCode(params) {
+ return request.post('/member/auth/send-code', params)
+}
+
+export function loginWithPhone(params) {
+ return request.post('/member/auth/phone-login', params)
+}
+
export function logout() {
return request.post('/member/auth/logout')
}
@@ -16,14 +24,156 @@ export function checkIn(params) {
return request.post('/checkIn/scan', params)
}
+export function getCheckInRecords(params = {}, options = {}) {
+ const { page = 0, size = 5 } = params
+ return request.post('/checkIn/page', { page, size }, options)
+}
+
+export function getUnreadMessageCount(userId, options = {}) {
+ return request.get(`/messages/user/${userId}/unread`, {}, options)
+}
+
+// ========== 消息相关API ==========
+
+/**
+ * 获取用户消息列表(支持分页)
+ * @param {number} userId - 用户ID
+ * @param {object} params - 查询参数
+ * @param {number} params.page - 页码(从0开始)
+ * @param {number} params.size - 每页条数
+ * @param {object} options - 请求选项
+ * @returns {Promise} 消息列表
+ */
+export function getUserMessages(userId, params = {}, options = {}) {
+ const { page = 0, size = 10 } = params
+ return request.get(`/messages/user/${userId}/page`, { page, size }, options)
+}
+
+/**
+ * 获取未读消息列表(支持分页)
+ * @param {number} userId - 用户ID
+ * @param {object} params - 查询参数
+ * @param {number} params.page - 页码(从0开始)
+ * @param {number} params.size - 每页条数
+ * @param {object} options - 请求选项
+ * @returns {Promise} 未读消息列表
+ */
+export function getUnreadMessages(userId, params = {}, options = {}) {
+ const { page = 0, size = 10 } = params
+ return request.get(`/messages/user/${userId}/unread/page`, { page, size }, options)
+}
+
+/**
+ * 标记消息为已读
+ * @param {number|string} id - 消息ID
+ * @param {object} options - 请求选项
+ * @returns {Promise} 操作结果
+ */
+export function markMessageAsRead(id, options = {}) {
+ return request.put(`/messages/${id}/read`, {}, options)
+}
+
+/**
+ * 标记所有消息为已读
+ * @param {number} userId - 用户ID
+ * @param {object} options - 请求选项
+ * @returns {Promise} 操作结果
+ */
+export function markAllMessagesAsRead(userId, options = {}) {
+ return request.put(`/messages/user/${userId}/read`, {}, options)
+}
+
+/**
+ * 删除消息
+ * @param {number|string} id - 消息ID
+ * @param {object} options - 请求选项
+ * @returns {Promise} 操作结果
+ */
+export function deleteMessage(id, options = {}) {
+ return request.delete(`/messages/${id}`, {}, options)
+}
+
export function getUserInfo(options = { cache: true, cacheTime: 30 * 60 * 1000 }) {
return request.get('/member/info', {}, options)
}
+/**
+ * 获取会员详细信息(包含会员卡、积分等)
+ */
+export function getMemberDetail(options = { cache: false }) {
+ return request.get('/member/info', {}, options)
+}
+
+/**
+ * 获取签到统计
+ * @param {object} params - 查询参数
+ * @param {string} params.startDate - 开始日期(yyyy-MM-dd)
+ * @param {string} params.endDate - 结束日期(yyyy-MM-dd)
+ */
+export function getCheckInStats(params = {}, options = { cache: false }) {
+ return request.get('/checkIn/statistics', params, options)
+}
+
export function updateUserInfo(params) {
return request.put('/member/info', params)
}
+/**
+ * 购买会员卡
+ * @param {object} params - 购买参数
+ * @param {number} params.memberId - 会员ID
+ * @param {number} params.memberCardId - 会员卡类型ID
+ * @param {number} [params.sourceOrderId] - 来源订单ID
+ */
+export function purchaseMemberCard(params) {
+ return request.post('/member-card-records/purchase', params)
+}
+
+export function getMyMemberCards(memberId, options = { cache: false }) {
+ return request.get(`/member-card-records/my-cards/${memberId}`, {}, options)
+}
+
+// ========== 支付相关API ==========
+
+/**
+ * 创建支付订单
+ * @param {object} params - 支付参数
+ * @param {number} params.memberId - 会员ID
+ * @param {string} params.orderType - 订单类型 (MEMBER_CARD-会员卡, GROUP_COURSE-团课, GOODS-商品)
+ * @param {string} params.goodsDesc - 商品描述
+ * @param {string} params.transAmt - 交易金额(单位:分)
+ * @param {string} params.tradeType - 交易类型 (WECHAT-微信, ALIPAY-支付宝)
+ * @param {string} [params.remark] - 备注
+ * @param {string} [params.acctId] - 账户号
+ * @param {string} [params.timeExpire] - 过期时间 (yyyyMMddHHmmss)
+ * @param {string} [params.delayAcctFlag] - 延迟入账标识
+ * @param {number} [params.feeFlag] - 手续费标识
+ * @param {string} [params.limitPayType] - 禁用支付方式
+ * @param {string} [params.channelNo] - 渠道号
+ * @param {string} [params.payScene] - 支付场景
+ * @param {string} [params.notifyUrl] - 回调通知URL
+ */
+export function createPayment(params) {
+ return request.post('/payment/create', params)
+}
+
+/**
+ * 查询支付状态
+ * @param {string} orderId - 订单ID
+ */
+export function getPaymentStatus(orderId) {
+ return request.get(`/payment/${orderId}`, {})
+}
+
+/**
+ * 申请退款
+ * @param {string} orderId - 订单ID
+ * @param {string} refundAmt - 退款金额(单位:分)
+ */
+export function refundPayment(orderId, refundAmt) {
+ return request.post(`/payment/${orderId}/refund`, { refundAmt })
+}
+
export function getRecommendCourses(options = { cache: true, cacheTime: 10 * 60 * 1000 }) {
return request.get('/course/recommend', {}, options)
}
@@ -37,14 +187,81 @@ export function getGroupCoursePage(params = {}, options = { cache: true, cacheTi
return request.post('/groupCourse/page', { page, size, sort, order, keyword }, options)
}
+// ========== 团课预约相关API ==========
+
+/**
+ * 预约团课
+ * @param {object} params - 预约参数
+ * @param {number} params.courseId - 团课ID
+ * @param {number} params.memberId - 会员ID
+ * @param {number} params.memberCardRecordId - 会员卡记录ID
+ */
+export function bookGroupCourse(params) {
+ return request.post('/groupCourse/book', params)
+}
+
+/**
+ * 取消预约
+ * @param {number} bookingId - 预约ID
+ */
+export function cancelBooking(bookingId) {
+ return request.delete(`/groupCourse/book/${bookingId}`, {})
+}
+
+/**
+ * 团课签到
+ * @param {number} memberId - 会员ID
+ * @param {number} courseId - 团课ID
+ */
+export function signinGroupCourse(memberId, courseId) {
+ return request.post(`/groupCourse/signin/${memberId}`, { courseId })
+}
+
+/**
+ * 查询会员预约记录
+ * @param {number} memberId - 会员ID
+ */
+export function getMemberBookings(memberId, options = { cache: false }) {
+ return request.get(`/groupCourse/bookings/member/${memberId}`, {}, options)
+}
+
+/**
+ * 查询课程预约记录
+ * @param {number} courseId - 团课ID
+ */
+export function getCourseBookings(courseId, options = { cache: false }) {
+ return request.get(`/groupCourse/bookings/course/${courseId}`, {}, options)
+}
+
export default {
login,
+ sendCode,
+ loginWithPhone,
logout,
getQRCode,
checkIn,
+ getCheckInRecords,
+ getCheckInStats,
+ getUnreadMessageCount,
+ getUserMessages,
+ getUnreadMessages,
+ markMessageAsRead,
+ markAllMessagesAsRead,
+ deleteMessage,
getUserInfo,
+ getMemberDetail,
updateUserInfo,
+ purchaseMemberCard,
+ getMyMemberCards,
+ createPayment,
+ getPaymentStatus,
+ refundPayment,
getRecommendCourses,
getCourseDetail,
- getGroupCoursePage
+ getGroupCoursePage,
+ bookGroupCourse,
+ cancelBooking,
+ signinGroupCourse,
+ getMemberBookings,
+ getCourseBookings
}
diff --git a/gym-manage-uniapp/common/constants/routes.js b/gym-manage-uniapp/common/constants/routes.js
index 50300f5..dbb5494 100644
--- a/gym-manage-uniapp/common/constants/routes.js
+++ b/gym-manage-uniapp/common/constants/routes.js
@@ -32,7 +32,8 @@ export const PAGE = {
POINTS: '/pages/memberInfo/points',
REFERRAL: '/pages/memberInfo/referral',
MY_COURSES: '/pages/memberInfo/myCourses',
- CHECK_IN_HISTORY: '/pages/memberInfo/checkInHistory'
+ CHECK_IN_HISTORY: '/pages/memberInfo/checkInHistory',
+ PURCHASE_CARD: '/pages/memberInfo/purchaseCard'
}
/** 底部 TabBar 页面路径,顺序与 TabBar.vue 一致 */
diff --git a/gym-manage-uniapp/common/memberInfo/bodyTestStore.js b/gym-manage-uniapp/common/memberInfo/bodyTestStore.js
index 4347af5..86845ad 100644
--- a/gym-manage-uniapp/common/memberInfo/bodyTestStore.js
+++ b/gym-manage-uniapp/common/memberInfo/bodyTestStore.js
@@ -1,9 +1,3 @@
-import { bodyTestMock } from './mockData.js'
-
-function clone(value) {
- return JSON.parse(JSON.stringify(value))
-}
-
function formatRecordTime(date) {
const y = date.getFullYear()
const m = String(date.getMonth() + 1).padStart(2, '0')
@@ -28,9 +22,9 @@ function formatTime(date) {
export function getDefaultBodyTestState() {
return {
- settings: { ...bodyTestMock.settings },
- device: { ...bodyTestMock.device },
- records: clone(bodyTestMock.records)
+ settings: {},
+ device: { connected: false, battery: 80 },
+ records: []
}
}
@@ -167,14 +161,26 @@ export function getBodyTestTrendData(store, metricKey, limit = 6) {
}))
}
+function getMetricDefs() {
+ return [
+ { key: 'weight', label: '体重' },
+ { key: 'bmi', label: 'BMI' },
+ { key: 'bodyFat', label: '体脂率' },
+ { key: 'muscleMass', label: '肌肉量' },
+ { key: 'visceralFat', label: '内脏脂肪' },
+ { key: 'bmr', label: '基础代谢' }
+ ]
+}
+
export function getCompareData(store, idA, idB) {
const a = getBodyTestRecordById(store, idA)
const b = getBodyTestRecordById(store, idB)
if (!a || !b) return null
+ const metricDefs = getMetricDefs()
const keys = ['weight', 'bmi', 'bodyFat', 'muscleMass', 'visceralFat', 'bmr']
const metrics = keys.map((key) => ({
key,
- label: bodyTestMock.metricDefs.find((m) => m.key === key)?.label || key,
+ label: metricDefs.find((m) => m.key === key)?.label || key,
valueA: a.metrics[key],
valueB: b.metrics[key],
diff: Math.round((a.metrics[key] - b.metrics[key]) * 10) / 10
@@ -183,8 +189,7 @@ export function getCompareData(store, idA, idB) {
}
export function getRecommendedCourses(record) {
- const ids = record?.recommendedCourseIds || []
- return bodyTestMock.recommendedCourses.filter((c) => ids.includes(c.id))
+ return []
}
export function updateBodyTestSettings(store, patch) {
@@ -243,9 +248,9 @@ export function saveSimulatedBodyTestRecord(store, finalMetrics) {
status,
metrics,
radar,
- bodySegments: clone(bodyTestMock.records[0].bodySegments),
- advice: clone(bodyTestMock.records[0].advice),
- recommendedCourseIds: [1, 2]
+ bodySegments: [],
+ advice: [],
+ recommendedCourseIds: []
}
if (previous) {
@@ -279,5 +284,3 @@ export function interpolateMeasuringMetrics(progress, profile) {
bodyWater: Math.round((51 + (target.bodyWater - 51) * ratio) * 10) / 10
}
}
-
-export { bodyTestMock }
diff --git a/gym-manage-uniapp/common/memberInfo/bookingStore.js b/gym-manage-uniapp/common/memberInfo/bookingStore.js
index 9b9b41e..7d07cbd 100644
--- a/gym-manage-uniapp/common/memberInfo/bookingStore.js
+++ b/gym-manage-uniapp/common/memberInfo/bookingStore.js
@@ -57,6 +57,14 @@ export function canCancelBooking(item) {
return diff >= 2 * 3600000
}
+export function canSigninCourse(item) {
+ if (!item?.courseDate || !item?.startTime) return false
+ if (item.status !== 'booked' && item.status !== 0) return false
+ const start = new Date(`${item.courseDate} ${item.startTime}`.replace(/-/g, '/'))
+ const diff = start - Date.now()
+ return diff <= 2 * 3600000 && diff >= -2 * 3600000
+}
+
export function bookCourse(store, courseId) {
const course = store.courseCatalog.find((c) => c.id === Number(courseId))
if (!course) return { ok: false, message: '课程不存在' }
diff --git a/gym-manage-uniapp/common/memberInfo/index.js b/gym-manage-uniapp/common/memberInfo/index.js
index 580a06a..a3700d5 100644
--- a/gym-manage-uniapp/common/memberInfo/index.js
+++ b/gym-manage-uniapp/common/memberInfo/index.js
@@ -1,4 +1,3 @@
-export { memberCenterMock, userInfoMock, fitnessGoalOptions, bookingMock, memberCardMock, bodyTestMock, moduleMock, courseCatalogMock } from './mockData.js'
export { statusBarTimeMixin, subPageMixin } from './mixins.js'
export {
loadMemberStore,
@@ -31,8 +30,7 @@ export {
connectBodyTestDevice,
disconnectBodyTestDevice,
saveSimulatedBodyTestRecord,
- interpolateMeasuringMetrics,
- bodyTestMock
+ interpolateMeasuringMetrics
} from './bodyTestStore.js'
export {
getTrainingReportData,
@@ -52,8 +50,7 @@ export {
getMyCoursesByTab,
getOnlineCourseById,
updateOnlineProgress,
- getCheckInHistory,
- moduleMock
+ getCheckInHistory
} from './moduleStore.js'
export {
filterCourses,
@@ -61,8 +58,7 @@ export {
bookCourse,
canCancelBooking,
enrichCourseForDisplay,
- getWeekDates,
- courseCatalogMock
+ getWeekDates
} from './bookingStore.js'
export { previewImage, persistChosenImage, isLocalFilePath } from './media.js'
export { maskPhone, formatMemberCenterPhone, normalizePhoneForStore } from './format.js'
diff --git a/gym-manage-uniapp/common/memberInfo/mockData.js b/gym-manage-uniapp/common/memberInfo/mockData.js
index e88bacc..16ea95c 100644
--- a/gym-manage-uniapp/common/memberInfo/mockData.js
+++ b/gym-manage-uniapp/common/memberInfo/mockData.js
@@ -1,6 +1,9 @@
/** 个人中心模块 mock 数据(后续可替换为 API) */
-export const memberCenterMock = {
+// Mock 数据开关 - 设为 false 可关闭所有 mock 数据
+export const MOCK_ENABLED = false
+
+export const memberCenterMock = MOCK_ENABLED ? {
userInfo: {
name: '张小芳',
phone: '13812345678 已绑定微信',
@@ -65,7 +68,7 @@ export const memberCenterMock = {
registered: 3,
purchased: 2
}
-}
+} : null
export const userInfoMock = {
name: '张小芳',
diff --git a/gym-manage-uniapp/common/memberInfo/store.js b/gym-manage-uniapp/common/memberInfo/store.js
index 3d79750..68bb547 100644
--- a/gym-manage-uniapp/common/memberInfo/store.js
+++ b/gym-manage-uniapp/common/memberInfo/store.js
@@ -1,9 +1,3 @@
-import {
- memberCenterMock,
- userInfoMock,
- memberCardMock,
- bookingMock
-} from './mockData.js'
import { formatMemberCenterPhone, normalizePhoneForStore } from './format.js'
import {
getDefaultBodyTestState,
@@ -24,10 +18,6 @@ import {
const STORAGE_KEY = 'gym_member_info_v1'
-function clone(value) {
- return JSON.parse(JSON.stringify(value))
-}
-
export function buildCardTip(remainingDays) {
return `距离下次到期还有${remainingDays}天,请及时续费`
}
@@ -70,24 +60,26 @@ function finalizeStore(store) {
function getDefaultStore() {
return finalizeStore({
- profile: { ...userInfoMock, avatar: memberCenterMock.userInfo.avatar },
- memberProfile: { ...memberCenterMock.userInfo },
- stats: { ...memberCenterMock.stats },
- cardInfo: { ...memberCenterMock.cardInfo },
- card: { ...memberCardMock.card },
- records: clone(memberCardMock.records),
- ongoingBookings: clone(bookingMock.ongoing),
- historyBookings: clone(bookingMock.history),
- checkIns: clone(memberCenterMock.checkIns),
- bodyReport: { ...memberCenterMock.bodyReport },
+ profile: {},
+ memberProfile: {},
+ stats: {},
+ cardInfo: {},
+ card: {},
+ records: [],
+ ongoingBookings: [],
+ historyBookings: [],
+ checkIns: [],
+ bodyReport: {},
bodyTest: getDefaultBodyTestState(),
modules: getDefaultModuleState(),
courseCatalog: getDefaultCourseCatalog(),
- couponPoints: { ...memberCenterMock.couponPoints },
- referral: { ...memberCenterMock.referral }
+ couponPoints: {},
+ referral: {}
})
}
+export { getDefaultStore }
+
function mergeDefaults(saved) {
const defaults = getDefaultStore()
return finalizeStore({
@@ -204,7 +196,11 @@ export function getBookingPreview(store, limit = 2) {
export function getCenterPageData(store) {
return {
userInfo: { ...store.memberProfile },
- stats: { ...store.stats },
+ stats: {
+ checkInCount: store.stats?.checkInCount ?? 0,
+ trainingHours: store.stats?.trainingHours ?? 0,
+ pointsBalance: store.stats?.pointsBalance ?? 0
+ },
cardInfo: { ...store.cardInfo },
bookingPreview: getBookingPreview(store),
checkIns: store.checkIns.map((item) => ({ ...item })),
@@ -234,6 +230,15 @@ export function cancelOngoingBooking(store, id) {
const course = store.courseCatalog.find((c) => c.id === removed.courseId)
if (course && course.enrolled > 0) course.enrolled -= 1
}
+
+ // 同步从 myCourses.group.ongoing 中移除
+ if (store.modules?.myCourses?.group?.ongoing) {
+ const myCoursesIndex = store.modules.myCourses.group.ongoing.findIndex((c) => c.id === id)
+ if (myCoursesIndex >= 0) {
+ store.modules.myCourses.group.ongoing.splice(myCoursesIndex, 1)
+ }
+ }
+
store.historyBookings.unshift({
...removed,
status: 'cancelled',
diff --git a/gym-manage-uniapp/common/style/memberInfo/member-info-header.css b/gym-manage-uniapp/common/style/memberInfo/member-info-header.css
index 22b25ed..cb769f2 100644
--- a/gym-manage-uniapp/common/style/memberInfo/member-info-header.css
+++ b/gym-manage-uniapp/common/style/memberInfo/member-info-header.css
@@ -269,3 +269,63 @@
flex-shrink: 0;
background-color: rgba(255, 255, 255, 0.31);
}
+
+.profile-header__user-inner--guest {
+ display: flex;
+ flex-direction: row;
+ gap: 16px;
+ align-items: center;
+ width: 100%;
+}
+
+.profile-header__avatar-wrap--guest {
+ width: 72px;
+ height: 72px;
+ flex-shrink: 0;
+ border-radius: 50%;
+ border: 2px solid rgba(255, 255, 255, 0.5);
+ overflow: hidden;
+ background-color: rgba(255, 255, 255, 0.9);
+}
+
+.profile-header__avatar--guest {
+ width: 100%;
+ height: 100%;
+ display: block;
+}
+
+.profile-header__user-meta--guest {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.profile-header__name--guest {
+ font-size: 18px;
+ font-weight: 600;
+ color: black;
+ white-space: nowrap;
+}
+
+.profile-header__phone--guest {
+ font-size: 14px;
+ font-weight: 400;
+ color: #999999;
+ white-space: nowrap;
+}
+
+.profile-header__user-inner--guest {
+ display: flex;
+ flex-direction: row;
+ gap: 16px;
+ align-items: center;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+ background: none;
+ border: none;
+ outline: none;
+ box-shadow: none;
+ line-height: inherit;
+}
diff --git a/gym-manage-uniapp/common/style/memberInfo/pages/booking-page.css b/gym-manage-uniapp/common/style/memberInfo/pages/booking-page.css
index 774d479..4b4c409 100644
--- a/gym-manage-uniapp/common/style/memberInfo/pages/booking-page.css
+++ b/gym-manage-uniapp/common/style/memberInfo/pages/booking-page.css
@@ -239,6 +239,29 @@
text-overflow: ellipsis;
}
+.bk-card__actions {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+}
+
+.bk-card__signin {
+ flex-shrink: 0;
+ padding: 6px 14px;
+ border-radius: 8px;
+ background-color: var(--accent-orange, #FF6B35);
+ box-sizing: border-box;
+}
+
+.bk-card__signin-text {
+ font-size: var(--font-size-base, 14px);
+ font-family: var(--font-family);
+ font-weight: 500;
+ color: var(--text-inverse, #ffffff);
+ white-space: nowrap;
+}
+
.bk-card__cancel {
flex-shrink: 0;
padding: 6px 14px;
diff --git a/gym-manage-uniapp/components/Skeleton/MessageSkeleton.vue b/gym-manage-uniapp/components/Skeleton/MessageSkeleton.vue
new file mode 100644
index 0000000..e36852a
--- /dev/null
+++ b/gym-manage-uniapp/components/Skeleton/MessageSkeleton.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gym-manage-uniapp/components/index/PageHeader.vue b/gym-manage-uniapp/components/index/PageHeader.vue
index 8fe980f..a85f91c 100644
--- a/gym-manage-uniapp/components/index/PageHeader.vue
+++ b/gym-manage-uniapp/components/index/PageHeader.vue
@@ -1,5 +1,5 @@
-
\ No newline at end of file
diff --git a/gym-manage-uniapp/components/index/TodayRecommend.vue b/gym-manage-uniapp/components/index/TodayRecommend.vue
index 286c387..cee8f5c 100644
--- a/gym-manage-uniapp/components/index/TodayRecommend.vue
+++ b/gym-manage-uniapp/components/index/TodayRecommend.vue
@@ -6,7 +6,7 @@
今日推荐
-
+
查看更多
@@ -50,6 +50,10 @@
-
diff --git a/gym-manage-uniapp/components/memberInfo/MemberInfoMemberCard.vue b/gym-manage-uniapp/components/memberInfo/MemberInfoMemberCard.vue
index c9964cb..8a18cfe 100644
--- a/gym-manage-uniapp/components/memberInfo/MemberInfoMemberCard.vue
+++ b/gym-manage-uniapp/components/memberInfo/MemberInfoMemberCard.vue
@@ -35,7 +35,7 @@
>
+ >
@@ -94,6 +94,18 @@
续费
+
+
+ 购买新卡
+
+
@@ -115,20 +127,15 @@
-
-
diff --git a/gym-manage-uniapp/components/memberInfo/MemberInfoStatusBar.vue b/gym-manage-uniapp/components/memberInfo/MemberInfoStatusBar.vue
index d14ef34..f754eaa 100644
--- a/gym-manage-uniapp/components/memberInfo/MemberInfoStatusBar.vue
+++ b/gym-manage-uniapp/components/memberInfo/MemberInfoStatusBar.vue
@@ -7,14 +7,8 @@
-
diff --git a/gym-manage-uniapp/components/memberInfo/MemberInfoSubNav.vue b/gym-manage-uniapp/components/memberInfo/MemberInfoSubNav.vue
index dd0f9c6..cb43d7d 100644
--- a/gym-manage-uniapp/components/memberInfo/MemberInfoSubNav.vue
+++ b/gym-manage-uniapp/components/memberInfo/MemberInfoSubNav.vue
@@ -27,80 +27,75 @@
-
-
diff --git a/gym-manage-uniapp/manifest.json b/gym-manage-uniapp/manifest.json
index ecc7130..e592805 100644
--- a/gym-manage-uniapp/manifest.json
+++ b/gym-manage-uniapp/manifest.json
@@ -17,7 +17,9 @@
"delay" : 0
},
/* 模块配置 */
- "modules" : {},
+ "modules" : {
+ "OAuth" : {}
+ },
/* 应用发布信息 */
"distribute" : {
/* android打包配置 */
@@ -45,7 +47,14 @@
"dSYMs" : false
},
/* SDK配置 */
- "sdkConfigs" : {},
+ "sdkConfigs" : {
+ "oauth" : {
+ "weixin" : {
+ "appid" : "wx8f0d644d1d8985f6",
+ "UniversalLinks" : ""
+ }
+ }
+ },
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
diff --git a/gym-manage-uniapp/pages.json b/gym-manage-uniapp/pages.json
index 152613b..8e3833b 100644
--- a/gym-manage-uniapp/pages.json
+++ b/gym-manage-uniapp/pages.json
@@ -53,6 +53,13 @@
}
}
},
+ {
+ "path": "pages/memberInfo/login",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "登录"
+ }
+ },
{
"path": "pages/memberInfo/memberCard",
"style": {
@@ -207,6 +214,13 @@
"navigationBarTitleText": "签到记录"
}
},
+ {
+ "path": "pages/memberInfo/purchaseCard",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "购买会员卡"
+ }
+ },
{
"path": "pages/memberInfo/courseList",
"style": {
@@ -280,6 +294,25 @@
"style": {
"navigationBarTitleText": ""
}
+ },
+ {
+ "path": "pages/message/index",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/message/detail",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "消息详情"
+ }
+ },
+ {
+ "path": "pages/webview/webview",
+ "style": {
+ "navigationBarTitleText": ""
+ }
}
],
"globalStyle": {
diff --git a/gym-manage-uniapp/pages/checkIn/checkIn.vue b/gym-manage-uniapp/pages/checkIn/checkIn.vue
index 74ce4f5..049b89e 100644
--- a/gym-manage-uniapp/pages/checkIn/checkIn.vue
+++ b/gym-manage-uniapp/pages/checkIn/checkIn.vue
@@ -36,7 +36,7 @@
-
+
@@ -47,7 +47,7 @@
-
+
@@ -57,7 +57,7 @@
@@ -82,7 +82,7 @@
-
+
-
-
diff --git a/gym-manage-uniapp/pages/memberInfo/memberInfo.vue b/gym-manage-uniapp/pages/memberInfo/memberInfo.vue
index 74abe62..d4b0cf0 100644
--- a/gym-manage-uniapp/pages/memberInfo/memberInfo.vue
+++ b/gym-manage-uniapp/pages/memberInfo/memberInfo.vue
@@ -5,7 +5,9 @@
@@ -13,35 +15,41 @@
:card-info="cardInfo"
@view-all="goMemberCard"
@renew="onRenewCard"
+ @purchase="goPurchaseCard"
/>
-
-
+
+
@@ -53,13 +61,19 @@
-
-
\ No newline at end of file
diff --git a/gym-manage-uniapp/pages/memberInfo/referral.vue b/gym-manage-uniapp/pages/memberInfo/referral.vue
index 0c65979..a2b5248 100644
--- a/gym-manage-uniapp/pages/memberInfo/referral.vue
+++ b/gym-manage-uniapp/pages/memberInfo/referral.vue
@@ -104,45 +104,37 @@
-
-
diff --git a/gym-manage-uniapp/pages/memberInfo/trainReport.vue b/gym-manage-uniapp/pages/memberInfo/trainReport.vue
index 0f2f870..ba2ad60 100644
--- a/gym-manage-uniapp/pages/memberInfo/trainReport.vue
+++ b/gym-manage-uniapp/pages/memberInfo/trainReport.vue
@@ -69,64 +69,57 @@
-
-
diff --git a/gym-manage-uniapp/pages/message/index.vue b/gym-manage-uniapp/pages/message/index.vue
new file mode 100644
index 0000000..43e774d
--- /dev/null
+++ b/gym-manage-uniapp/pages/message/index.vue
@@ -0,0 +1,1594 @@
+
+
+
+
+
+
+
+
+
+
+ {{ tab.label }}
+
+ {{ unreadCount > 99 ? '99+' : unreadCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ group.date }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ message.content }}
+
+
+
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 加载更多...
+
+
+
+
+
+
+
+ {{ emptyText }}
+ {{ emptyDesc }}
+
+ 查看全部消息 →
+
+
+
+
+
+ 已经到底啦~
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gym-manage-uniapp/pages/searchCourse/searchCourse.vue b/gym-manage-uniapp/pages/searchCourse/searchCourse.vue
index 6f3a534..4dcc4c9 100644
--- a/gym-manage-uniapp/pages/searchCourse/searchCourse.vue
+++ b/gym-manage-uniapp/pages/searchCourse/searchCourse.vue
@@ -231,11 +231,7 @@
+
+
\ No newline at end of file
diff --git a/gym-manage-uniapp/scripts/convert-pixso-pages.js b/gym-manage-uniapp/scripts/convert-pixso-pages.js
index 2730a12..0b4519b 100644
--- a/gym-manage-uniapp/scripts/convert-pixso-pages.js
+++ b/gym-manage-uniapp/scripts/convert-pixso-pages.js
@@ -191,16 +191,14 @@ function convertPage(pageName, config) {
const extraMethods = (config.extraMethods || '').replace(/^\s*,\s*/, '');
const extraDataBlock = (config.extraData || '').replace(/^\s*,\s*/, '');
- const dataBody = pageName === 'userInfo'
- ? '...userInfoMock'
- : extraDataBlock;
+ const dataBody = extraDataBlock;
const vueOutput = `
${template}