From 2635edda7b7809d744e209f78837c2d116ea6ea2 Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Sat, 11 Apr 2026 16:31:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/VendingMachine.Api/Program.cs | 8 +- mobile/i18n/en.js | 1 + mobile/i18n/zh-CN.js | 1 + mobile/i18n/zh-TW.js | 1 + mobile/pages.json | 8 +- mobile/pages/index/index.vue | 295 +++++++++++++++++----- mobile/static/ic_qrcode.png | Bin 0 -> 1898 bytes mobile/static/ic_stamp.png | Bin 0 -> 2248 bytes mobile/static/ic_vip.png | Bin 0 -> 2964 bytes mobile/static/tab/ic_home.png | Bin 0 -> 1704 bytes mobile/static/tab/ic_home_s.png | Bin 0 -> 2671 bytes mobile/static/tab/ic_me.png | Bin 0 -> 1884 bytes mobile/static/tab/ic_me_s.png | Bin 0 -> 2950 bytes 13 files changed, 241 insertions(+), 73 deletions(-) create mode 100644 mobile/static/ic_qrcode.png create mode 100644 mobile/static/ic_stamp.png create mode 100644 mobile/static/ic_vip.png create mode 100644 mobile/static/tab/ic_home.png create mode 100644 mobile/static/tab/ic_home_s.png create mode 100644 mobile/static/tab/ic_me.png create mode 100644 mobile/static/tab/ic_me_s.png diff --git a/backend/src/VendingMachine.Api/Program.cs b/backend/src/VendingMachine.Api/Program.cs index 14da4690..ce4cfa15 100644 --- a/backend/src/VendingMachine.Api/Program.cs +++ b/backend/src/VendingMachine.Api/Program.cs @@ -41,7 +41,13 @@ builder.Services.AddAuthentication(options => builder.Services.AddAuthorization(); // Controllers -builder.Services.AddControllers(); +builder.Services.AddControllers() + .AddJsonOptions(options => + { + // 支持枚举字符串序列化/反序列化 + options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter()); + options.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; + }); // CORS 配置(支持移动端和管理后台跨域请求) builder.Services.AddCors(options => diff --git a/mobile/i18n/en.js b/mobile/i18n/en.js index 0443dbc9..56b9330d 100644 --- a/mobile/i18n/en.js +++ b/mobile/i18n/en.js @@ -37,6 +37,7 @@ export default { stamps: 'Stamps', qrcode: 'QR Code', guide: 'Guide', + redeemableCoupons: 'Redeemable Coupons', redeemBtn: 'Redeem', redeemSuccess: 'Redeemed successfully', redeemFail: 'Insufficient points', diff --git a/mobile/i18n/zh-CN.js b/mobile/i18n/zh-CN.js index 90e0da4e..15d04495 100644 --- a/mobile/i18n/zh-CN.js +++ b/mobile/i18n/zh-CN.js @@ -37,6 +37,7 @@ export default { stamps: '节日印花', qrcode: '会员二维码', guide: '使用说明', + redeemableCoupons: '可兑换优惠券', redeemBtn: '兑换', redeemSuccess: '兑换成功', redeemFail: '积分不足,无法兑换', diff --git a/mobile/i18n/zh-TW.js b/mobile/i18n/zh-TW.js index e2859a27..76fa2573 100644 --- a/mobile/i18n/zh-TW.js +++ b/mobile/i18n/zh-TW.js @@ -37,6 +37,7 @@ export default { stamps: '節日印花', qrcode: '會員二維碼', guide: '使用說明', + redeemableCoupons: '可兌換優惠券', redeemBtn: '兌換', redeemSuccess: '兌換成功', redeemFail: '積分不足,無法兌換', diff --git a/mobile/pages.json b/mobile/pages.json index 4843f7b3..63936a87 100644 --- a/mobile/pages.json +++ b/mobile/pages.json @@ -76,14 +76,14 @@ { "pagePath": "pages/index/index", "text": "首页", - "iconPath": "static/tab-home.png", - "selectedIconPath": "static/tab-home-active.png" + "iconPath": "static/tab/ic_home.png", + "selectedIconPath": "static/tab/ic_home_s.png" }, { "pagePath": "pages/mine/mine", "text": "我的", - "iconPath": "static/tab-mine.png", - "selectedIconPath": "static/tab-mine-active.png" + "iconPath": "static/tab/ic_me.png", + "selectedIconPath": "static/tab/ic_me_s.png" } ] } diff --git a/mobile/pages/index/index.vue b/mobile/pages/index/index.vue index 2e76de2d..c353788d 100644 --- a/mobile/pages/index/index.vue +++ b/mobile/pages/index/index.vue @@ -1,33 +1,70 @@ @@ -58,7 +92,6 @@ import { getRedeemableCoupons, redeemCoupon } from '../../api/coupon.js' import { useUserStore } from '../../stores/user.js' import { navigateBanner } from '../../utils/navigation.js' import { resolveImageUrl } from '../../utils/image.js' -import CouponCard from '../../components/CouponCard.vue' import RedeemPopup from '../../components/RedeemPopup.vue' import CouponGuidePopup from '../../components/CouponGuidePopup.vue' @@ -77,17 +110,6 @@ const showRedeem = ref(false) const selectedCoupon = ref(null) const showQrcode = ref(false) -// 入口标签映射 -function getEntryLabel(key) { - const map = { - membership: t('home.membership'), - stamps: t('home.stamps'), - qrcode: t('home.qrcode'), - guide: t('home.guide') - } - return map[key] || key -} - // Banner点击导航 function onBannerClick(banner) { navigateBanner(banner) @@ -124,9 +146,7 @@ async function handleQrcodeEntry() { } else { uni.navigateTo({ url: '/pages/membership/membership' }) } - } catch (e) { - // 错误已由请求模块统一处理 - } + } catch (e) {} } // 使用说明入口 @@ -135,9 +155,14 @@ async function handleGuideEntry() { const res = await getCouponGuide() guideContent.value = res.data?.content || res.data || '' showGuide.value = true - } catch (e) { - // 错误已由请求模块统一处理 - } + } catch (e) {} +} + +// 格式化到期时间 +function formatExpire(dateStr) { + if (!dateStr) return '无限制' + const d = new Date(dateStr) + return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日` } // 点击兑换按钮 @@ -154,11 +179,9 @@ async function onRedeemConfirm() { showRedeem.value = false selectedCoupon.value = null uni.showToast({ title: t('home.redeemSuccess'), icon: 'none' }) - // 刷新优惠券列表 await loadCoupons() } catch (e) { showRedeem.value = false - // 错误提示已由请求模块统一处理(积分不足、已下架等由后端message返回) } } @@ -167,21 +190,21 @@ async function loadBanners() { try { const res = await getBanners() banners.value = res.data || [] - } catch (e) { /* 错误已统一处理 */ } + } catch (e) {} } async function loadEntries() { try { const res = await getEntries() entries.value = res.data || [] - } catch (e) { /* 错误已统一处理 */ } + } catch (e) {} } async function loadCoupons() { try { const res = await getRedeemableCoupons() coupons.value = res.data || [] - } catch (e) { /* 错误已统一处理 */ } + } catch (e) {} } onMounted(() => { @@ -194,47 +217,183 @@ onMounted(() => { diff --git a/mobile/static/ic_qrcode.png b/mobile/static/ic_qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e9bb9448672a9ce1bca1fbb695b193d322f04b GIT binary patch literal 1898 zcmV-w2bK7VP)?SaOT~`rn!_xuvBV(H9#X_|XtE{T|;qOFutnu1mff{KZWm%BHe-FJ8Int0c*kd=r{gr2X9A%oIw*SA>=2@*KF3;A2qEf4PxOG0vU)pr z6cM-(LbNt9-8($qNrn>Rc8rPM=m#&n*!H-K9h3pF4IM8L(g*-<0mNsyYz+j2E+Ats zM3#IPXhbCa1|Vz$DT`=tth+r5nk2f~TcDxg4Abofz)pq|<6=7y?8;_B6S1!7laNb> z=y`52W$`O+hZ(BLUC{8vPCWxIcH;>`&F*%g9ts^`LT z1a5~iGPmmbF$?>7wyxTJbOB~AAF=DsQ^?r|=yEXC)NnaQGOHwq0f5WForrd023xg2 zS-Fg}1#+H^b?csv6xz8;@>uG3xP5&YW?&^uFL=f@Cmo&~4Tg*rxvE_dOkmKsjAx=D zhC(Kbl-_JW0cTebCzHoV&S@breu`Jiql{(Msim};ou_I3HkCY{`qebejDvO62z-2W zDH${_44iQzM$+rKQj=`(f#dlsa(kPIM?cmA`!}pb6N8-zGMUUH({{u4B=DWY zxX9IOSBY-emE04tT{~t@7a$TjN>w1yl&nYtOj#)aLOa*{wIKZ)?r`Oa!0)_^NLQtq znRAR+N^mK&G+I9{KtCWlE(cE>0!#oW17_;J1)vLDuP#d=WbLYs$)PsQv%CVd$H7!n zvkna>M*o%^hMYlzpqIDKxI|P4H<*4?a&YWKh4gx|=>;Eh$43nM)0#VqGSOkUedYB$ zUcJQ98Z(hvgI1PZTG$GN{XxKcuP=OOw#6JweVrF_x22psb0GC5WV6cvVN=kU3J-n24-=%`qn6?putR<3l!0>E)IfD_SVD3sA2R(hEr2&`|Ivp6@TcY^c;@{x|7 z_BKhxTL|S5F6#BJDp5p#%gBXcWouT&*agObK&%?8s8o1;4K6o zU$SJW2trPlG&ac*f*{bHlsVSG!Yy-nc@D|KPt_OjLM{fxk zY2e61kRE~qw@h=9L+~?PmW@gXjx-DVR2~yO(V3vJ6+W`WBU2e5e>mW8_kI9e3guHH z0B!^fos{7d(4}zbRVW0Fv1C+2t~f;Iegc5Qz!!U{C{pgoG-AD-tN4JZ{%$KBHVnN7 z6(!PM8F}XGdBuNZ5uS(xw=2lDOui1&Mh`W?EVuc>4LWc~5daYTK$ooaK1R!E#}rS_ z!Q{Z$ac&pq#tg3%=#hOnj|er~{a;TL=JdBbwH(UHvHIJlRZ~ zzRLVDhDZ1Wf6deBZdg{oyUE5585S*NKJEAgd?HnlsonvPkP;2k_EEIkp#+<@E4CrJ z0^~N#_wvez!kJCOgQI`uQI(Wc8BmG9ifODO4|gQcb1fls{tO_j_v%INt?BJ5(V9O4 zN+?xLSIrC%8&)rhb+36|_)gAhl&gfcCI-afovXpB|BDR6~{wY z@V&5J@=99r)Mh{Ffbd06479AHJ^}n=1hxWbA@{2b*onyVr$5;>ynX)7{=yf_5u!l*9ogV6IH6`~S~czVIhT*^4TS12O` zvWXdJ54r=hJFu5ugnT&Bq}%@t_~rPb5;u4!us7_da@rhFaQ=Tma5n${i~j%s0RR8y kiYrn8000I_L_t&o0G7kCkg##_vH$=807*qoM6N<$f@K$fzW@LL literal 0 HcmV?d00001 diff --git a/mobile/static/ic_stamp.png b/mobile/static/ic_stamp.png new file mode 100644 index 0000000000000000000000000000000000000000..58b6bc291b6e12b36d5af4dc811ed652480df4e9 GIT binary patch literal 2248 zcmV;(2sihMP)iYPEjUm}LS3AYnj|z(o7Tj} zEp>@Y6;P>)DK+H5Eu=JUtd$xp_6F<6Nn>!EQXKM-JOrEs2Rp>F6t8qozBBjU-MiNA zY9+0t40Gn^%-ost%{g;sX4k_S1e;AiW&1O;q~EQ<@MS};2>`(C2hak+PnfT1Y$$+e z(VQpu-?d|GF^j&tbu>eGdDC~Th6auXu zE90?ZcYXC1v~79~snnZxp!+ehRumfwz|Tz`_H&cXlthJQ256mhz*Q27nQy)WFtSmamc+&7JpT)1PAjNO|9Ld6@WN7NsJ`xEMtT;JD6< zk?$&tlT`zVhg9{WtuRZoIH^3}|Gx@q_#F3eANLMo=^-R$==yy7DFA19=YDZu+sd-AE$B1CbufV7R9@ zb4RkhVE}yp{FTUd=b1lW_|(m`d2^SWOfV<2ADnY#CKZLBz3G13{9(Jz?%2!rQLgqy zJCOM`yK@~P@FH)g=I7pVyeMfH039!~-Dc+Bl?5bxw~R$zNmpL42jwfT!f(F*6oQtE zFy1hLUi$u9x%2lsOXLw&qH7#sEefr!7Y%j)D1F-gso1+z*wb|}RizCNwlMEw) zyNz1D)L0ESEDKPxq3}Ea=OIS<;YQasC6QCQC$v33I{ni4KVN=V*-2Uz02Lmaw~TT? zU9lE=mLZyeyBZtu_CqiR2_Dano}F~U8*_+#!zpk1`S~uaBCZZ2CI{_*2yo^Pk(^%mY2UGGEfJ_0X~bR1{w1 z5ajxoo%-WhlOV*S8^k4=#xQ8}ruCzY?az$rrWIp&8k=LGhRiRK!U+lRKLUEwW_LUq z52v|}-wD}F=$**)NOi|*!c+ZxiT(Q>NTCOi3&jB=5Pojr_wMk@O+JE6g(Kp5dTRHw zU-_mbqZp0pphp_&>FdfAdGR{|&<*d{o=fXUY6%~I?&qq5i2J~xv}bhFioD8=J`B|& zpjY!T0PfVL#^xZYOVP?NekWwpN9qDlkMNw-#ic-)1y4N@H4qGWkge3-*Zkb{Bfh?; zM<$=}bCZ3Tx%^o^M|T^q(3KyXd>xfsEI{p0q`LALV#+ENVNw!Rue!i;kB)&Z^t(* zT_ouw=?z|q3(TL@DVEZN_Ce`)q;A^#U?ASx+`PwKTOy%$%HIhTo|@7V|6o-BDxf>0 zl760c%E1n+P4Z29IoynfzbF_!4b9eYPV++>y^X7bh)(QEza!o7whqUP()gVK;hZ6_ zB7mC0Tib-ds26bN5)P9{Mc(4kUwj*vK%jI^Q1$wSE=KC3!mTXtf#5W04nZ)a-%}I% z195?-^#``Q$o{H{R?QuQ$sz!?glB)4w)t%^Xwfq1D!s=E(kYh1Xz*%SNT$tuS-XW4 zML8W6ppP2vi9gXKzC~*FN2m9>w%ELk_pqy1Ny-2?)$84+g4x91i!5}-Wq`NL+|)zx zOzDanlmpO}MDiK|OyJs;`%7a~DTU@mjX)1UR10MQc*s0JHFhUD4^mx+6LoO26(1?A zv~$z`ncu`OFy80nJfcuh_?gRn>SdxXRWqG8)W~GbXJr`x1EZ6NuPPl{2S5ue0---n-FQgV z>F0IMMo{bcrcU!V4ZjQ>H5t{KL}}pkC4&{8}imAT?9a9U6v*` zXysK-rHTNwVM!1$UAzN5yiqH!GAdOCpp8{POjz65o*$Vw#{=z;^<2z!thJ(=0Cds{ zAhw#;)@|DMNuVVGsE{ED=)>YF>k~42vHX8sGB+xI3;+QC|BB8x6aWAK21!IgR09BP W1*)^h*;i`-0000blFw$rKATB#GT6qH9WXh2Zj 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

`wuH+}< zNyD>|H8nn{6;0)q1TYoJ4DKykSe0})e}Iv@H%Vb$!f4Ou^O)tYIY@p1x9M*B=e&9i z;R}Qy=ycG^lcRkaXeu`?fK+?}(qNu?{0rYru#K;Am}Mo-B2!ZtD=%q)XRGy0kS=hO zDXk$=WFTpVR%tCNmDGYpvNV;pOG4j=i_GcAC*1M!!ci!+uT1#Z2lI5V(@ z6pjK7gyMARa87_$K~B60q-g;d_aTovGuP{5q#*?#IS%jI5K1byVr^)&*FPH#K3qWx=;VN3A4>?J`yI%MbfdmP9hMXd8 zh{BSLb*SNt`C_nX0We|j+8}3YiVgQ6mIP4fFGtaujLSPjj!}y211k(I)OVQZvpcM{Dc!JL z15M|a1i+&P$W`T>6R!e}@LICZnNW^2L1FV@GL^NeB8oK>Q-nz?o6Ri?z)OsjR6eAS zKQYpSfz~T}*$#jeU+-rPy5q%1a7Eo=J4nN_0GNx4t&hP~RKlQ|M!Q=m_WzMBQJcxp zFuJavhjHmw)IA0_d4}p>7GJgqKyemOl=o?@b!yTLi#dxF`g+kwamINNyrFqTU2`H-Ctwx~+W14|O)HH$>{5r?3sv=Tu(1 z59J1(!#JzSHUTgrEQH!epQoTjEf@6^8|tEv_WNkNc$T(CJvf{dq5HuJa%K6(XuQ7- zgYAvrn;^a(yVrg->t2C^B{*-A#9fVN!6zolO+;C*R)i#hD%_Utj}@EE+saXI_$s@d_B4S78Ccx4xa% z{sul0Es)9T8lkW|>l2PaW>r`&$bJO^ov`VN4t8RIZhc|+iXIA;mDAp>+;#*N4?m7l z@&wr{bWu=)l_sAa9x|x>>$lMU-bWWH)Q*lgK3WxnTg>{To37k!wK0U~Q2^Ou$NX7q z_uaavlVWFyueWLrd>y=Z*95nsw5kpjbcC^2xS8$;w;Vo6_kk~>=D-P5?KqZc7urT% z<58-6i7rn!>NMlgA-aIMsh6z-vPBU>T((XKU`1v;uK0`d^_CUdPL~H&JDT%D6!`Sn;HJ*yW8Ibm zDt$K{pQTmX=2quf7QYq3uPPE%0NgvBOuu1e6_k^WUU&36;3JL|7t^#e6_;0o>GR)f ztld7-*B6erG~RRpurd@7Z)z2*H5b5J!nb}vo1ZQKMz|Vp{eto)N~`oIo5Dj$o})g$ zECGn)$EV#=p0u(Rbjr&PprtQyvZkgcOW9`$fO!`Fs#`*FkPx`Eic(s6f#)`NM)L%~ z4cy*}b9AhoW_VR3kv{DysXU)+E;$9j4L!cfcUFZEc=Eo`J3Oac>45^^#;On$@!ZPP z2{JCE{Dx(oc@`A__h;qNHvEYIzAl#v$>0x5K@~T^#&5 zALqp5l734TfJV)?uBP8p9Q?6c7Kd0#vRkRu{l9b7jThpy+gDiO@dv-p?rpw2RYTp=NFidMyMsJ?+>f^GCg?29&2^p@yx?6QH!;IVkjLVxf8^B~09 waT?du?|%RQ0RR6J(g$?_000I_L_t&o0En|kc3;W3H~;_u07*qoM6N<$g87%CBLDyZ literal 0 HcmV?d00001