From e9f804b373a5be8c1bee9436e40327f276a35d3b Mon Sep 17 00:00:00 2001 From: wangxiaowei <1121133807@qq.com> Date: Tue, 16 Sep 2025 17:09:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bundle/order/after-sales/after-sales.vue | 240 ++++++++++++++---- .../order/tea-specialist/order-detail.vue | 154 +++++++---- src/bundle/profile/profile.vue | 173 +++++++++++++ src/bundle/reserve-room/room.vue | 4 +- src/bundle/vip-benefits/vip-benefits.vue | 151 +++++++++++ src/components/navbar.vue | 10 +- src/pages.json | 16 ++ src/pages/login/mobile.vue | 64 ++++- src/pages/my/my.vue | 125 +++++++-- src/pages/reserve/reserve.vue | 6 +- src/router/interceptor.ts | 100 ++++---- 11 files changed, 874 insertions(+), 169 deletions(-) create mode 100644 src/bundle/profile/profile.vue create mode 100644 src/bundle/vip-benefits/vip-benefits.vue diff --git a/src/bundle/order/after-sales/after-sales.vue b/src/bundle/order/after-sales/after-sales.vue index feb34aa..47b0084 100644 --- a/src/bundle/order/after-sales/after-sales.vue +++ b/src/bundle/order/after-sales/after-sales.vue @@ -17,7 +17,15 @@ 请耐心等待,我们会尽快处理您的请求 - 退款成功¥128.00 + + + 退款成功¥128.00 + + + 退款成功¥128.00 + + + 谢谢您的信任,我们一定会做的更好 2025年4月13日 18:22 @@ -31,14 +39,25 @@ - + + 这是团购套餐的可以点击进 + + + 这是茶艺师名称 + ¥324.22 + 3小时 x1 + + + 车马费(¥3.00元/公里) + ¥30.90 + 实付 ¥29.32 @@ -74,36 +93,11 @@ 售后订单 - + 售后原因 买多了/买错了 - - 退款金额 - ¥159.22 - - - 申请时间 - 2019-05-16 13:20:26 - - - 退款编号 - - 7327328627526903 - - 复制 - - - - - - - 售后订单 - - 售后原因 - 买多了/买错了 - - + 退款金额 ¥159.22 @@ -122,19 +116,23 @@ - - - - - 联系商家 - 联系平台 - + + + + + 联系商家 + 联系平台 + - - - 提交 + + + 提交 + - @@ -165,11 +163,142 @@ 确定 + + + + + + + + 费用明细 + + + + + + + + + + + 服务费 + ¥640.00 + + + 服务费(¥160元/小时) + x4 + + + + + 车马费 + ¥640.00 + + + 车马费(¥160元/公里) + 10.3公里 + + + + + 茶艺服务 + ¥640.00 + + + 红茶/绿茶/福鼎白茶/铁观音 + ¥158 + + + 茶具使用 + ¥20 + + + + + 优惠 + -¥20.00 + + + 优惠券 + -¥20.00 + + + + + + + + + + + + + 50%服务费 + ¥640.00 + + + + + 车马费 + ¥640.00 + + + + + 优惠券 + -¥20.00 + + + + + + + + 扣款规则说明 + + 1)茶艺师未出发,100%退款; + 2)茶艺师已出发未到达目的地,不退车马费; + 3)茶艺师出发并到达目的地,不退车马费,并且支付茶艺师50%服务费。 + + + + + + + + + 实际退款 + ¥698.90 + + + @@ -243,4 +383,18 @@ background-repeat: no-repeat; background-size: 100% 100%; } + + .collapse { + :deep() { + .wd-collapse-item::after, + .wd-collapse-item__header.is-expanded::after { + background: none !important; + } + + .wd-collapse-item__body { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + } + } diff --git a/src/bundle/order/tea-specialist/order-detail.vue b/src/bundle/order/tea-specialist/order-detail.vue index a7e48df..a5e14b1 100644 --- a/src/bundle/order/tea-specialist/order-detail.vue +++ b/src/bundle/order/tea-specialist/order-detail.vue @@ -19,8 +19,7 @@ 使用过程中有任何问题,请联系客服 - - + @@ -62,6 +61,7 @@ + 地图显示 @@ -77,7 +77,7 @@ - + 服务方式 @@ -87,12 +87,12 @@ 服务方式 到店服务 - + 服务门店 茶馆名称茶馆名称茶馆名称茶馆名称茶馆名称茶馆名称茶馆名称 - 门店地址 + {{ orderStatus === ReserveCategoryOrderStatus.Serving ? '门店地址' : '服务地址' }} 青浦区仓桥路478号 @@ -100,7 +100,7 @@ - + @@ -133,19 +133,17 @@ - - - + 确认订单 再次预定 + + + 申请退款 + 联系客服 + @@ -155,40 +153,58 @@ + 续订包间 - - 续订时间 - - - {{ item.time }} + + + 续订时间 + + + {{ item.time }} + - - - 支付方式 - - - - - - {{ item.name }} - - - - 可用202.22 - - + + 续订茶叶 + 支持多选 + + + + {{item.title}} + {{item.price}} - + - - + + 支付方式 + + + + + + {{ item.name }} + + + + 可用202.22 + + + + + + + + + @@ -218,11 +234,29 @@ - 包间续订成功 + 茶艺师续订成功 可以刷新页面查看预约时间 好的 + + + + + 确定申请退款吗? + 退款按照如下规则,请谨慎操作。 + + 1)茶艺师未出发,100%退款; + 2)茶艺师已出发未到达目的地,不退车马费; + 3)茶艺师出发并到达目的地,不退车马费,并且支付茶艺师50%服务费。 + + + + 取消 + 确定退款 + + + @@ -234,8 +268,11 @@ const title = ref('') const orderStatus = ref('') // 订单状态:待使用、退款等 + const showRefundRule = ref(false) // 退款规则弹窗 - /** 续订包间 **/ + + + /** 续订 **/ const showRenewPopup = ref(false) const timeList = [ {id: 1, time: '1小时'}, @@ -264,6 +301,16 @@ } ]) + const teaList = [ + {id: 1, title: '红茶(3泡)', price: '¥128.00'}, + {id: 2, title: '铁观音(3泡)', price: '¥128.00'}, + {id: 3, title: '红茶(3泡)', price: '¥128.00'}, + {id: 4, title: '红茶(3泡)', price: '¥128.00'}, + {id: 5, title: '红茶(3泡)', price: '¥128.00'}, + ] + const selectedRenewTea = ref>([]) // 选择的续订时间 + + const showRenewSuccessPopup = ref(false) /** 结束 **/ @@ -273,16 +320,35 @@ }) const orderDetail = { - // 确认订单 handleConfirmOrder: () => { }, + // 续订茶艺师 + handleToggleRenewTea: (id: number) => { + const idx = selectedRenewTea.value.indexOf(id) + if (idx > -1) { + selectedRenewTea.value.splice(idx, 1) // 已选中则移除 + } else { + selectedRenewTea.value.push(id) // 未选中则添加 + } + }, + // 再次预定 handleAgainReeserve: () => { showRenewSuccessPopup.value = true showRenewPopup.value = false - } + }, + + // 申请退款 + handleConfirmRefund: () => { + }, + + + // 联系客服 + handleService: () => { + + }, } diff --git a/src/bundle/profile/profile.vue b/src/bundle/profile/profile.vue new file mode 100644 index 0000000..1b7b117 --- /dev/null +++ b/src/bundle/profile/profile.vue @@ -0,0 +1,173 @@ + +{ + "layout": "default", + "style": { + "navigationStyle": "custom" + } +} + + + + + + + + diff --git a/src/bundle/reserve-room/room.vue b/src/bundle/reserve-room/room.vue index 80fe60b..7ac6242 100644 --- a/src/bundle/reserve-room/room.vue +++ b/src/bundle/reserve-room/room.vue @@ -23,7 +23,7 @@ - + + @@ -104,6 +105,7 @@ 点击二维码添加客服 + diff --git a/src/bundle/vip-benefits/vip-benefits.vue b/src/bundle/vip-benefits/vip-benefits.vue new file mode 100644 index 0000000..a9b4ad5 --- /dev/null +++ b/src/bundle/vip-benefits/vip-benefits.vue @@ -0,0 +1,151 @@ + +{ + // "needLogin": true, + "layout": "default", + "style": { + "navigationStyle": "custom" + } +} + + + + + + + + diff --git a/src/components/navbar.vue b/src/components/navbar.vue index 5dc6b31..a1e6e4f 100644 --- a/src/components/navbar.vue +++ b/src/components/navbar.vue @@ -3,7 +3,9 @@ @@ -75,15 +89,24 @@ import {mobile as testMobile} from '@/utils/test' import { useToast } from 'wot-design-uni' + const OSS = inject('OSS') const toast = useToast() const disabled = ref(true) - // 验证码倒计时 + /** 页面 **/ + let pageType = 'login' // 页面类型 login:登录 edit:修改手机号 + const page = ref<{title: string, desc: string}>({title: '其他手机号登录', desc: '请输入你要登录的手机号'}) + const showEditSuccessPopup = ref(false) // 显示手机号修改成功弹窗 + const userId = ref(0) // 用户ID,修改手机号时需要传 + /** 结束 **/ + + /** 验证码倒计时 **/ const countDownTime = ref(1 * 60 * 1000) // 60s倒计时 const startCountDown = ref(false) // 是否开始倒计时 const countDown = ref(null) // 倒计时组件 + /** 结束 **/ - // 表单相关 + /** 表单相关 **/ const model = reactive<{ mobile: string code: string @@ -91,9 +114,22 @@ mobile: '', code: '' }) + /** 结束 **/ - // 服务协议和隐私政策 + /** 服务协议和隐私政策 **/ const agree = ref(false) + /** 结束 **/ + + onLoad((args) => { + // 从个人登录页面进入 + if (args.type === 'edit') { + userId.value = Number(args.userId) || 0 // userId仅做测试使用,实际请传真实用户ID + + page.value.title = '修改手机号' + page.value.desc = '手机号一年内可修改2次' + pageType = 'edit' + } + }) const mobile = { // 验证手机号 @@ -128,6 +164,17 @@ // 登录 handleToLogin: () => { + // TODO 如果是edit的话就是修改手机号 + + if (pageType === 'login' && !agree.value) { + toast.show({ + iconClass: 'info-circle', + msg: '请同意服务协议和隐私政策', + direction: 'vertical' + }) + return + } + if (!testMobile(model.mobile)) { toast.show({ iconClass: 'info-circle', @@ -166,6 +213,11 @@ handleToPrivacy: () => { }, + + // 修改手机成功后返回 + handleToBack: () => { + uni.navigateBack() + } } diff --git a/src/pages/my/my.vue b/src/pages/my/my.vue index 1ce83f0..811af80 100644 --- a/src/pages/my/my.vue +++ b/src/pages/my/my.vue @@ -1,16 +1,18 @@ -{ - "layout": "tabbar", - "style": { - "navigationStyle": "custom" + + { + "layout": "tabbar", + "style": { + "navigationStyle": "custom" + } } -} + diff --git a/src/pages/reserve/reserve.vue b/src/pages/reserve/reserve.vue index f5cbeec..dca75ec 100644 --- a/src/pages/reserve/reserve.vue +++ b/src/pages/reserve/reserve.vue @@ -166,9 +166,11 @@ .home-bg { background-color: $cz-page-background; background-image: url(#{$OSS}images/home/home_bg.png); - background-size: 100% 280rpx; + // background-size: 100% 300rpx; + background-size: cover; background-repeat: no-repeat; - background-position: top center; + padding-bottom: 20rpx; + // background-position: top center; } .search-box { diff --git a/src/router/interceptor.ts b/src/router/interceptor.ts index dc6ca40..3842f8a 100644 --- a/src/router/interceptor.ts +++ b/src/router/interceptor.ts @@ -12,66 +12,66 @@ import { needLoginPages as _needLoginPages, getLastPage, getNeedLoginPages } fro const loginRoute = import.meta.env.VITE_LOGIN_URL function isLogined() { - const userStore = useUserStore() - return !!userStore.userInfo.username + const userStore = useUserStore() + return !!userStore.userInfo.username } const isDev = import.meta.env.DEV // 黑名单登录拦截器 - (适用于大部分页面不需要登录,少部分页面需要登录) export const navigateToInterceptor = { - // 注意,这里的url是 '/' 开头的,如 '/pages/index/index',跟 'pages.json' 里面的 path 不同 - // 增加对相对路径的处理,BY 网友 @ideal - invoke({ url }: { url: string }) { - // console.log(url) // /pages/route-interceptor/index?name=feige&age=30 - let path = url.split('?')[0] + // 注意,这里的url是 '/' 开头的,如 '/pages/index/index',跟 'pages.json' 里面的 path 不同 + // 增加对相对路径的处理,BY 网友 @ideal + invoke({ url }: { url: string }) { + // console.log(url) // /pages/route-interceptor/index?name=feige&age=30 + let path = url.split('?')[0] - // 处理相对路径 - if (!path.startsWith('/')) { - const currentPath = getLastPage().route - const normalizedCurrentPath = currentPath.startsWith('/') ? currentPath : `/${currentPath}` - const baseDir = normalizedCurrentPath.substring(0, normalizedCurrentPath.lastIndexOf('/')) - path = `${baseDir}/${path}` - } + // 处理相对路径 + if (!path.startsWith('/')) { + const currentPath = getLastPage().route + const normalizedCurrentPath = currentPath.startsWith('/') ? currentPath : `/${currentPath}` + const baseDir = normalizedCurrentPath.substring(0, normalizedCurrentPath.lastIndexOf('/')) + path = `${baseDir}/${path}` + } - let needLoginPages: string[] = [] - // 为了防止开发时出现BUG,这里每次都获取一下。生产环境可以移到函数外,性能更好 - if (isDev) { - needLoginPages = getNeedLoginPages() - } - else { - needLoginPages = _needLoginPages - } - const isNeedLogin = needLoginPages.includes(path) - if (!isNeedLogin) { - return true - } - const hasLogin = isLogined() - if (hasLogin) { - return true - } - tabbarStore.restorePrevIdx() - const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}` - uni.navigateTo({ url: redirectRoute }) - return false - }, + let needLoginPages: string[] = [] + // 为了防止开发时出现BUG,这里每次都获取一下。生产环境可以移到函数外,性能更好 + if (isDev) { + needLoginPages = getNeedLoginPages() + } + else { + needLoginPages = _needLoginPages + } + const isNeedLogin = needLoginPages.includes(path) + if (!isNeedLogin) { + return true + } + const hasLogin = isLogined() + if (hasLogin) { + return true + } + tabbarStore.restorePrevIdx() + const redirectRoute = `${loginRoute}?redirect=${encodeURIComponent(url)}` + uni.navigateTo({ url: redirectRoute }) + return false + }, } export const routeInterceptor = { - install() { - uni.addInterceptor('navigateTo', navigateToInterceptor) - uni.addInterceptor('reLaunch', navigateToInterceptor) - uni.addInterceptor('redirectTo', navigateToInterceptor) - uni.addInterceptor('switchTab', navigateToInterceptor) + install() { + uni.addInterceptor('navigateTo', navigateToInterceptor) + uni.addInterceptor('reLaunch', navigateToInterceptor) + uni.addInterceptor('redirectTo', navigateToInterceptor) + uni.addInterceptor('switchTab', navigateToInterceptor) - // // #ifdef H5 - // // 一个粗糙的实现方式,不满意可以自行修改:https://github.com/unibest-tech/unibest/issues/192 - // // H5环境路由拦截,监听hashchange事件 - // window.addEventListener('hashchange', () => { - // // 获取当前路径 - // const currentPath = `/${window.location.hash.split('#/')[1]?.split('?')[0]}` - // navigateToInterceptor.invoke({ url: currentPath }) - // }) - // // #endif - }, + // // #ifdef H5 + // // 一个粗糙的实现方式,不满意可以自行修改:https://github.com/unibest-tech/unibest/issues/192 + // // H5环境路由拦截,监听hashchange事件 + // window.addEventListener('hashchange', () => { + // // 获取当前路径 + // const currentPath = `/${window.location.hash.split('#/')[1]?.split('?')[0]}` + // navigateToInterceptor.invoke({ url: currentPath }) + // }) + // // #endif + }, }