From a711c6e59424cf0f0889a2768763698106b60802 Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Wed, 11 Mar 2026 22:20:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miniapp/pages/merchant/index.vue | 14 +++++++ miniapp/pages/mine/index.vue | 6 +-- miniapp/pages/points/index.vue | 37 +++++++++++------- miniapp/static/ic_switch.png | Bin 0 -> 1921 bytes .../Controllers/CouponController.cs | 1 + 5 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 miniapp/static/ic_switch.png diff --git a/miniapp/pages/merchant/index.vue b/miniapp/pages/merchant/index.vue index 2930623..a732635 100644 --- a/miniapp/pages/merchant/index.vue +++ b/miniapp/pages/merchant/index.vue @@ -28,6 +28,15 @@ + + + + + 切换身份 + + + + @@ -237,6 +246,11 @@ uni.navigateTo({ url: '/pages/merchant/records' }) }, + /** 切换身份 */ + goRoleSelect() { + uni.navigateTo({ url: '/pages/login/role-select' }) + }, + /** 退出登录 */ handleLogout() { uni.showModal({ diff --git a/miniapp/pages/mine/index.vue b/miniapp/pages/mine/index.vue index 59027cf..42ed035 100644 --- a/miniapp/pages/mine/index.vue +++ b/miniapp/pages/mine/index.vue @@ -49,7 +49,7 @@ - + 切换身份 @@ -158,9 +158,7 @@ // 即使接口失败也清除本地状态 } clearAuth() - this.isLogin = false - this.userInfo = {} - uni.showToast({ title: '已退出登录', icon: 'none' }) + uni.reLaunch({ url: '/pages/index/index' }) } } } diff --git a/miniapp/pages/points/index.vue b/miniapp/pages/points/index.vue index c8a5ee0..9fe8944 100644 --- a/miniapp/pages/points/index.vue +++ b/miniapp/pages/points/index.vue @@ -46,6 +46,7 @@ {{ item.name }} + 适用门店:{{ item.stores.map(s => s.name).join('、') }} 有效期:{{ isPermanent(item) ? '永久有效' : formatDate(item.validStart) + '至' + formatDate(item.validEnd) }} 剩余数量:{{ item.remainingCount }} 张 @@ -92,6 +93,7 @@ import { getPopup } from '@/api/config' + import { isLoggedIn, checkLogin } from '@/utils/auth' import RichContentPopup from '@/components/RichContentPopup.vue' import ConfirmDialog from '@/components/ConfirmDialog.vue' import NavBar from '@/components/NavBar.vue' @@ -150,21 +152,25 @@ async loadData() { this.loading = true try { - const [balanceRes, availableRes, storesRes] = await Promise.all([ - getBalance(), getAvailable(), getStores() - ]) - this.balance = balanceRes.balance ?? balanceRes.data?.balance ?? 0 - this.availableList = availableRes.data || availableRes || [] - const stores = storesRes.data || storesRes || [] - this.storeOptions = [{ - label: '全部', - value: '' - }, - ...stores.map(s => ({ - label: s.name, - value: s.id - })) - ] + // 未登录时跳过积分余额请求 + const requests = [getAvailable(), getStores()] + if (isLoggedIn()) { + requests.unshift(getBalance()) + } + const results = await Promise.all(requests) + + if (isLoggedIn()) { + const balanceRes = results[0] + this.balance = balanceRes.balance ?? balanceRes.data?.balance ?? 0 + this.availableList = results[1].data || results[1] || [] + const stores = results[2].data || results[2] || [] + this.storeOptions = [{ label: '全部', value: '' }, ...stores.map(s => ({ label: s.name, value: s.id }))] + } else { + this.balance = 0 + this.availableList = results[0].data || results[0] || [] + const stores = results[1].data || results[1] || [] + this.storeOptions = [{ label: '全部', value: '' }, ...stores.map(s => ({ label: s.name, value: s.id }))] + } // 加载积分页背景图配置 try { const bgRes = await getPopup('points-bg') @@ -199,6 +205,7 @@ }) }, onExchange(item) { + if (!checkLogin()) return if (item.remainingCount <= 0) return if (item.pointsCost > 0 && this.balance < item.pointsCost) { uni.showToast({ diff --git a/miniapp/static/ic_switch.png b/miniapp/static/ic_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4adda54dc589a49b8c282aa42bcdda056c12b4 GIT binary patch literal 1921 zcmV-{2Y&d8P)qPQ^jDTPYR2HM(J;3^1+U-7p z%i!t;NQvdN=q!P_`#8>-1dwA|?p6OOF9>r5C^o4tZ43)bF9A^(K!R&Q-u)7gd1b&9 zTbZ8?*Bgyny}Y!Vo21|gZtz9`-qV1tf$CXAj?#9D+Ks!TqHHOrR(1q87~R@~{kEuDkcl`(psxXj6Qn(UeY;=#olf!}?&mX%Y66HR z=Pd{(`TbjPj+x5AuJH3UM$(FI++ZS*kQOw$AJxdFYW2hbIlC<|@@B};5e9J@k;EZ|KQfUJxX)hcsj`(PMM5m_`0i^US zu$fVJrk#6<`!6a|CkeR|s1Q0jk0YIAJJMEDIHuz*l5hu%nTNAPq zhet}7OGP9Ds7@j5MX@EMvn0f9jo5Jtqf9C)AwUU^1>2P)yKItqQ0$F(YSdp;SQnKH zAQ0RuZ5N6YHpx0j0Y@U9GB~2sQAq)&>*WfzP72T}fnb<|%w{)W7{t`nEdga?J!a!9 zLNb7&2g1&bjtS{3iKfyEw**(X4EQGmXo_K9_FWfdG9-*MCE}(#B03$F4B%;O4-aBK zUUerPPS%+c`TXMAuOY0|^cnyp$5__Z--`3Bp zyk#PQev<~XwB%A;(4zCYU!F43BJM4_#H-14@)84-u{cK3`LMpA68MB#8m~y`3?Om<9?!kb}`qK5t%NSbyO(L+U>jzbvaQIw6S&?$4v9zhsf5|1kiR( zkUWIVL!_gl1EBH9-KRzObKU7a8!SE681MloJf_9m`)G6yL8YA&lMg=YF}P;3+=s7% ze714T0B!gFy|K@mNTu_E&HKSh6POBv^$?eaUdI}IPbv+-Xmn3fVtj?@T!h*ZTnN|- zW5yC3k0ItSfv*doKaRZn6w|;yL*hIi7<`*y4N8?CReyncGia=ORPM*`rJuET#UMS@ z(Og=VhOQalfF=7I2-bqH@AA&=z|AI#rsQQ{YpA`;a?dG`0Bz@2IRbE-0J0- zzgY_2LrfQNdH*obuq@Huj``f1oHXQNm%B=Ivni`tTP86;Epka3bh7i{ZRnfjbsqZ6 zC`x2er3RFV=;zsaN=6|x03*g}@9K8|E8VcdF&J4E=28%e0P4=%BT%~}5&VC!d#J&T zp+w%ZKw|o@TCCgJbK1MAgB2Gt1YXetbsm(Kwr*tLssf~nr#;jJODE{Ch_hxKrE@UI z))!Neq4sukBo4<{Ka3bx6(AbjC9qa!Sf@u|yr(I(xW7iWQnD}z z^8uNRO6Ob7m7r?~icZA1ivk?@>l1BuF)vrD^%%a@ixpP0A{(a%;`m$?Ak^i-e6FeK zq!l`qss0=%KmFKAcgpa+_IA7)j7BEW@&mqRe zOE6S0Y?;GZ#+iG$dDdPT(zZQG;Ja}ykCjQ`Ak-hzG-~2EtVRyYD~Nc2is%PtLkV5M z;BsX3$cMw(&lHBh+xx1+`|8lPss^fffTBxz4pMTuR_?~>fb*4!W%wL!5nWFS+VN}x zyn+mwdBJB_p3pRMy5~7usMGu9YZX@qztb1de;G7 z?GmaszN<%q)ka$9_iG;De*gdg|Nk*+hTH%E00v1!K~w_(T{hW|f*!@x00000NkvXX Hu0mjfq)m(- literal 0 HcmV?d00001 diff --git a/server/src/HuangyanParking.Api/Controllers/CouponController.cs b/server/src/HuangyanParking.Api/Controllers/CouponController.cs index dc6727b..2793290 100644 --- a/server/src/HuangyanParking.Api/Controllers/CouponController.cs +++ b/server/src/HuangyanParking.Api/Controllers/CouponController.cs @@ -26,6 +26,7 @@ public class CouponController : ControllerBase /// GET /api/coupons/available /// [HttpGet("available")] + [AllowAnonymous] public async Task>>> GetAvailable() { var templates = await _couponService.GetAvailableTemplatesAsync();