修改商城
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
# 生产环境配置
|
# 生产环境配置
|
||||||
VITE_API_BASE_URL=http://114.55.111.44:3000/api
|
VITE_API_BASE_URL=https://www.zrbjr.com/api
|
||||||
VITE_UPLOAD_BASE_URL=http://114.55.111.44:3000/api/upload
|
VITE_UPLOAD_BASE_URL=https://www.zrbjr.com/api/upload
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
/node_modules
|
/node_modules
|
||||||
|
/dist
|
||||||
|
|||||||
1
dist/assets/About-BgjZeGWd.css
vendored
1
dist/assets/About-BgjZeGWd.css
vendored
@@ -1 +0,0 @@
|
|||||||
.about-page[data-v-2c0b820f]{min-height:100vh;background-color:#f5f5f5}.navbar[data-v-2c0b820f]{display:flex;align-items:center;justify-content:space-between;padding:0 16px;height:56px;background:#fff;border-bottom:1px solid #eee;position:sticky;top:0;z-index:100}.nav-left[data-v-2c0b820f],.nav-right[data-v-2c0b820f]{flex:1}.back-btn[data-v-2c0b820f]{color:#409eff;font-size:14px}.nav-title[data-v-2c0b820f]{margin:0;font-size:18px;font-weight:500;color:#333}.about-content[data-v-2c0b820f]{padding:20px 16px;max-width:800px;margin:0 auto}.intro-section[data-v-2c0b820f]{background:#fff;border-radius:12px;padding:40px 30px;margin-bottom:24px;text-align:center;box-shadow:0 2px 8px #0000001a}.intro-header[data-v-2c0b820f]{margin-bottom:30px}.logo[data-v-2c0b820f]{color:#409eff;margin-bottom:16px}.intro-header h2[data-v-2c0b820f]{margin:0 0 8px;font-size:28px;color:#333;font-weight:600}.tagline[data-v-2c0b820f]{margin:0;font-size:16px;color:#666}.intro-content p[data-v-2c0b820f]{font-size:16px;line-height:1.8;color:#555;text-align:left;margin:0}.features-section[data-v-2c0b820f],.tech-section[data-v-2c0b820f],.contact-section[data-v-2c0b820f]{background:#fff;border-radius:12px;padding:30px;margin-bottom:24px;box-shadow:0 2px 8px #0000001a}.features-section h3[data-v-2c0b820f],.tech-section h3[data-v-2c0b820f],.contact-section h3[data-v-2c0b820f]{margin:0 0 24px;font-size:20px;color:#333;font-weight:600}.features-grid[data-v-2c0b820f]{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:24px}.feature-item[data-v-2c0b820f]{text-align:center;padding:20px;border-radius:8px;background:#f8f9fa;transition:all .3s}.feature-item[data-v-2c0b820f]:hover{transform:translateY(-4px);box-shadow:0 8px 16px #0000001a}.feature-icon[data-v-2c0b820f]{color:#409eff;font-size:32px;margin-bottom:12px}.feature-item h4[data-v-2c0b820f]{margin:0 0 8px;font-size:16px;color:#333;font-weight:500}.feature-item p[data-v-2c0b820f]{margin:0;font-size:14px;color:#666;line-height:1.6}.tech-grid[data-v-2c0b820f]{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:24px}.tech-category h4[data-v-2c0b820f]{margin:0 0 16px;font-size:16px;color:#333;font-weight:500;padding-bottom:8px;border-bottom:2px solid #409eff}.tech-category ul[data-v-2c0b820f]{margin:0;padding:0;list-style:none}.tech-category li[data-v-2c0b820f]{color:#555;font-size:14px;position:relative;padding:8px 0 8px 16px}.tech-category li[data-v-2c0b820f]:before{content:"•";color:#409eff;position:absolute;left:0;font-weight:700}.contact-info[data-v-2c0b820f]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:24px}.contact-item[data-v-2c0b820f]{display:flex;align-items:center;gap:12px;padding:16px;background:#f8f9fa;border-radius:8px}.contact-item .el-icon[data-v-2c0b820f]{color:#409eff;font-size:24px}.contact-item h4[data-v-2c0b820f]{margin:0 0 4px;font-size:14px;color:#333;font-weight:500}.contact-item p[data-v-2c0b820f]{margin:0;font-size:14px;color:#666}.version-section[data-v-2c0b820f]{background:#fff;border-radius:12px;padding:20px 30px;margin-bottom:24px;box-shadow:0 2px 8px #0000001a}.version-info p[data-v-2c0b820f]{margin:8px 0;font-size:14px;color:#666}.about-footer[data-v-2c0b820f]{text-align:center;padding:20px;color:#999;font-size:14px}@media (max-width: 768px){.about-content[data-v-2c0b820f]{padding:15px 10px}.intro-section[data-v-2c0b820f],.features-section[data-v-2c0b820f],.tech-section[data-v-2c0b820f],.contact-section[data-v-2c0b820f]{padding:20px 15px}.intro-header h2[data-v-2c0b820f]{font-size:24px}.features-grid[data-v-2c0b820f],.tech-grid[data-v-2c0b820f],.contact-info[data-v-2c0b820f]{grid-template-columns:1fr}}@media (max-width: 480px){.intro-section[data-v-2c0b820f],.features-section[data-v-2c0b820f],.tech-section[data-v-2c0b820f],.contact-section[data-v-2c0b820f],.version-section[data-v-2c0b820f]{padding:15px}.intro-header h2[data-v-2c0b820f]{font-size:20px}.features-section h3[data-v-2c0b820f],.tech-section h3[data-v-2c0b820f],.contact-section h3[data-v-2c0b820f]{font-size:18px}}
|
|
||||||
1
dist/assets/About-CcTakbms.js
vendored
1
dist/assets/About-CcTakbms.js
vendored
@@ -1 +0,0 @@
|
|||||||
import{n as v,N as r,z as c,d as _,O as p,u as b,q as m,P as g,Q as x}from"./elementPlus-DFx51bSH.js";import{_ as V}from"./index-BlP3rxMf.js";import{r as y,y as A,A as t,Q as l,I as o,al as e,aD as N,M as a,O as I,z as P,u as i}from"./vendor-C3mpOp0n.js";const k={class:"about-page"},C={class:"navbar"},E={class:"nav-left"},S={class:"about-content"},T={class:"intro-section"},h={class:"intro-header"},z={class:"logo"},B={class:"features-section"},Q={class:"features-grid"},w={class:"feature-item"},D={class:"feature-icon"},M={class:"feature-item"},O={class:"feature-icon"},R={class:"feature-item"},$={class:"feature-icon"},j={class:"feature-item"},q={class:"feature-icon"},J={class:"contact-section"},L={class:"contact-info"},U={class:"contact-item"},W={class:"contact-item"},F={class:"contact-item"},G={class:"version-section"},H={class:"version-info"},K={__name:"About",setup(X){const d=y("2024-01-15");return(u,s)=>{const n=e("el-icon"),f=e("el-button");return P(),A("div",k,[t("nav",C,[t("div",E,[l(f,{type:"text",onClick:s[0]||(s[0]=Y=>u.$router.go(-1)),class:"back-btn"},{default:o(()=>[l(n,null,{default:o(()=>[l(i(v))]),_:1}),s[1]||(s[1]=a(" 返回 "))]),_:1,__:[1]})]),s[2]||(s[2]=t("div",{class:"nav-center"},[t("h1",{class:"nav-title"},"关于我们")],-1)),s[3]||(s[3]=t("div",{class:"nav-right"},null,-1))]),t("div",S,[t("section",T,[t("div",h,[t("div",z,[l(n,{size:"60"},{default:o(()=>[l(i(r))]),_:1})]),s[4]||(s[4]=t("h2",null,"融互通",-1)),s[5]||(s[5]=t("p",{class:"tagline"},"专业的积分兑换与商品管理平台",-1))]),s[6]||(s[6]=t("div",{class:"intro-content"},[t("p",null," 积分商城系统是一个现代化的积分兑换与商品管理平台,致力于为用户提供丰富的商品选择和便捷的积分兑换体验。 我们相信积分的价值在于为用户带来实际的收益和满足感,通过技术的力量让积分兑换变得更加简单高效。 ")],-1))]),t("section",B,[s[15]||(s[15]=t("h3",null,"功能特色",-1)),t("div",Q,[t("div",w,[t("div",D,[l(n,null,{default:o(()=>[l(i(c))]),_:1})]),s[7]||(s[7]=t("h4",null,"丰富商品",-1)),s[8]||(s[8]=t("p",null,"精选优质商品,涵盖生活用品、数码产品、虚拟服务等多个品类",-1))]),t("div",M,[t("div",O,[l(n,null,{default:o(()=>[l(i(_))]),_:1})]),s[9]||(s[9]=t("h4",null,"积分兑换",-1)),s[10]||(s[10]=t("p",null,"灵活的积分兑换机制,让您的积分发挥最大价值,享受购物乐趣",-1))]),t("div",R,[t("div",$,[l(n,null,{default:o(()=>[l(i(p))]),_:1})]),s[11]||(s[11]=t("h4",null,"积分管理",-1)),s[12]||(s[12]=t("p",null,"完整的积分获取和消费记录,让您清楚了解每一分积分的来源和去向",-1))]),t("div",j,[t("div",q,[l(n,null,{default:o(()=>[l(i(b))]),_:1})]),s[13]||(s[13]=t("h4",null,"个人中心",-1)),s[14]||(s[14]=t("p",null,"完善的个人资料管理,记录您的兑换历程和积分成长轨迹",-1))])])]),s[23]||(s[23]=N('<section class="tech-section" data-v-2c0b820f><h3 data-v-2c0b820f>技术栈</h3><div class="tech-grid" data-v-2c0b820f><div class="tech-category" data-v-2c0b820f><h4 data-v-2c0b820f>前端技术</h4><ul data-v-2c0b820f><li data-v-2c0b820f>Vue 3 + Composition API</li><li data-v-2c0b820f>Element Plus UI 组件库</li><li data-v-2c0b820f>Vue Router 路由管理</li><li data-v-2c0b820f>Pinia 状态管理</li><li data-v-2c0b820f>Vite 构建工具</li><li data-v-2c0b820f>响应式设计</li></ul></div><div class="tech-category" data-v-2c0b820f><h4 data-v-2c0b820f>后端技术</h4><ul data-v-2c0b820f><li data-v-2c0b820f>Node.js + Express</li><li data-v-2c0b820f>MySQL 数据库</li><li data-v-2c0b820f>JWT 身份认证</li><li data-v-2c0b820f>RESTful API 设计</li><li data-v-2c0b820f>积分系统管理</li><li data-v-2c0b820f>订单处理系统</li></ul></div></div></section>',1)),t("section",J,[s[19]||(s[19]=t("h3",null,"联系我们",-1)),t("div",L,[t("div",U,[l(n,null,{default:o(()=>[l(i(m))]),_:1}),s[16]||(s[16]=t("div",null,[t("h4",null,"邮箱"),t("p",null,"contact@example.com")],-1))]),t("div",W,[l(n,null,{default:o(()=>[l(i(g))]),_:1}),s[17]||(s[17]=t("div",null,[t("h4",null,"电话"),t("p",null,"400-123-4567")],-1))]),t("div",F,[l(n,null,{default:o(()=>[l(i(x))]),_:1}),s[18]||(s[18]=t("div",null,[t("h4",null,"地址"),t("p",null,"北京市朝阳区科技园区")],-1))])])]),t("section",G,[t("div",H,[s[21]||(s[21]=t("p",null,[t("strong",null,"版本:"),a("v1.0.0")],-1)),t("p",null,[s[20]||(s[20]=t("strong",null,"更新时间:",-1)),a(I(d.value),1)]),s[22]||(s[22]=t("p",null,[t("strong",null,"开发团队:"),a("积分商城系统开发团队")],-1))])])]),s[24]||(s[24]=t("footer",{class:"about-footer"},[t("p",null,"© 2024 积分商城系统. All rights reserved.")],-1))])}}},lt=V(K,[["__scopeId","data-v-2c0b820f"]]);export{lt as default};
|
|
||||||
1
dist/assets/Captcha-BFJ1zi5J.js
vendored
1
dist/assets/Captcha-BFJ1zi5J.js
vendored
@@ -1 +0,0 @@
|
|||||||
import{r as n,j as S,h as E,al as v,y as _,z as g,A as o,Q as t,a4 as K,I as u,u as y,M as R}from"./vendor-C3mpOp0n.js";import{v as T,w as C,a as r}from"./elementPlus-DFx51bSH.js";import{_ as $,a as w}from"./index-BlP3rxMf.js";const j={class:"captcha-container"},A={class:"captcha-input-group"},Q=["src"],U={key:1,class:"captcha-loading"},q={class:"captcha-refresh-hint"},D={class:"captcha-actions"},F={__name:"Captcha",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:"请输入验证码"},size:{type:String,default:"large"},autoRefresh:{type:Boolean,default:!0}},emits:["update:modelValue","verify","refresh"],setup(i,{expose:x,emit:k}){const d=i,p=k,s=n(d.modelValue),f=n(""),l=n(""),h=n(!1),I=async()=>{try{h.value=!0;const e=await w.get("/captcha/generate");e.data.success?(f.value=e.data.data.image,l.value=e.data.data.captchaId,p("refresh",{captchaId:l.value})):r.error(e.data.message||"获取验证码失败")}catch(e){console.error("获取验证码失败:",e),r.error("获取验证码失败,请检查网络连接")}finally{h.value=!1}},c=async()=>{s.value="",p("update:modelValue",""),await I()},z=e=>{p("update:modelValue",e)},b=async e=>{if(!l.value)return r.error("请先获取验证码"),!1;if(!e||e.trim()==="")return r.error("请输入验证码"),!1;try{const a=await w.post("/captcha/verify",{captchaId:l.value,captchaText:e.trim()});return a.data.success?!0:(r.error(a.data.message||"验证码错误"),await c(),!1)}catch(a){return console.error("验证验证码失败:",a),r.error("验证验证码失败,请重试"),await c(),!1}},B=()=>({captchaId:l.value,captchaText:s.value});return S(()=>d.modelValue,e=>{s.value=e}),E(()=>{d.autoRefresh&&I()}),x({refreshCaptcha:c,verifyCaptcha:b,getCaptchaInfo:B}),(e,a)=>{const M=v("el-input"),m=v("el-icon"),N=v("el-button");return g(),_("div",j,[o("div",A,[t(M,{modelValue:s.value,"onUpdate:modelValue":a[0]||(a[0]=V=>s.value=V),placeholder:i.placeholder,size:i.size,clearable:"",onKeyup:a[1]||(a[1]=K(V=>e.$emit("verify",{captchaId:l.value,captchaText:s.value}),["enter"])),onInput:z},null,8,["modelValue","placeholder","size"]),o("div",{class:"captcha-image-wrapper",onClick:c},[f.value?(g(),_("img",{key:0,src:f.value,alt:"验证码",class:"captcha-image"},null,8,Q)):(g(),_("div",U,[t(m,{class:"is-loading"},{default:u(()=>[t(y(T))]),_:1}),a[2]||(a[2]=o("span",null,"加载中...",-1))])),o("div",q,[t(m,null,{default:u(()=>[t(y(C))]),_:1}),a[3]||(a[3]=o("span",null,"点击刷新",-1))])])]),o("div",D,[t(N,{type:"text",size:"small",onClick:c,loading:h.value},{default:u(()=>[t(m,null,{default:u(()=>[t(y(C))]),_:1}),a[4]||(a[4]=R(" 刷新验证码 "))]),_:1,__:[4]},8,["loading"])])])}}},L=$(F,[["__scopeId","data-v-cf29bfcb"]]);export{L as C};
|
|
||||||
1
dist/assets/Captcha-BsLfDNOw.css
vendored
1
dist/assets/Captcha-BsLfDNOw.css
vendored
@@ -1 +0,0 @@
|
|||||||
.captcha-container[data-v-cf29bfcb]{width:100%}.captcha-input-group[data-v-cf29bfcb]{display:flex;gap:10px;align-items:center}.captcha-input-group .el-input[data-v-cf29bfcb]{flex:1}.captcha-image-wrapper[data-v-cf29bfcb]{position:relative;width:120px;height:40px;border:1px solid #dcdfe6;border-radius:4px;cursor:pointer;overflow:hidden;transition:all .3s;background:#f5f7fa}.captcha-image-wrapper[data-v-cf29bfcb]:hover{border-color:#409eff;box-shadow:0 0 0 1px #409eff}.captcha-image[data-v-cf29bfcb]{width:100%;height:100%;object-fit:cover;display:block}.captcha-loading[data-v-cf29bfcb]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:#909399;font-size:12px}.captcha-loading .el-icon[data-v-cf29bfcb]{font-size:16px;margin-bottom:2px}.captcha-refresh-hint[data-v-cf29bfcb]{position:absolute;top:0;left:0;right:0;bottom:0;background:#000000b3;color:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center;opacity:0;transition:opacity .3s;font-size:12px}.captcha-image-wrapper:hover .captcha-refresh-hint[data-v-cf29bfcb]{opacity:1}.captcha-refresh-hint .el-icon[data-v-cf29bfcb]{font-size:16px;margin-bottom:2px}.captcha-actions[data-v-cf29bfcb]{margin-top:8px;text-align:right}.captcha-actions .el-button[data-v-cf29bfcb]{padding:0;font-size:12px;color:#909399}.captcha-actions .el-button[data-v-cf29bfcb]:hover{color:#409eff}.captcha-actions .el-icon[data-v-cf29bfcb]{margin-right:4px}@media (max-width: 480px){.captcha-input-group[data-v-cf29bfcb]{flex-direction:column;gap:8px}.captcha-image-wrapper[data-v-cf29bfcb]{width:100%;max-width:200px;height:50px}}
|
|
||||||
1
dist/assets/Home-Bj4aCm4S.js
vendored
1
dist/assets/Home-Bj4aCm4S.js
vendored
@@ -1 +0,0 @@
|
|||||||
import{r as C,h as L,y as m,Q as t,I as o,al as n,aA as E,z as c,A as s,M as a,H as v,u as _,O as p,P as g,K as F,a6 as K,L as O}from"./vendor-C3mpOp0n.js";import{_ as P,u as Q}from"./index-BlP3rxMf.js";import{f as R}from"./elementPlus-DFx51bSH.js";const T={class:"home"},j={class:"header-content"},q={class:"nav-menu"},G={class:"user-actions"},J={class:"user-info"},W={class:"user-avatar"},X={class:"username"},Y={key:0,class:"stats-section"},Z={class:"container"},$={class:"stat-card"},ee={class:"stat-icon"},se={class:"stat-content"},oe={class:"stat-value"},te={class:"stat-label"},ne={__name:"Home",setup(ae){const l=E(),i=Q(),h=C("home"),k=C([{key:"users",label:"用户数量",value:0,icon:"User"},{key:"orders",label:"订单总数",value:0,icon:"Document"},{key:"products",label:"商品数量",value:0,icon:"Star"},{key:"transfers",label:"转账记录",value:0,icon:"Clock"}]),S=r=>{switch(h.value=r,r){case"home":l.push("/transfers");break;case"shop":l.push("/shop");break;case"about":l.push("/about");break}},A=r=>{switch(r){case"profile":l.push("/profile");break;case"orders":l.push("/orders");break;case"points-history":l.push("/points-history");break;case"transfers":l.push("/transfers");break;case"logout":i.logout();break}},H=async()=>{try{k.value=[{key:"users",label:"用户数量",value:156,icon:"User"},{key:"orders",label:"订单总数",value:89,icon:"Document"},{key:"products",label:"商品数量",value:45,icon:"Star"},{key:"transfers",label:"转账记录",value:23,icon:"Clock"}]}catch(r){console.error("获取统计数据失败:",r)}};return L(()=>{i.isAuthenticated&&H()}),(r,e)=>{const f=n("el-menu-item"),U=n("el-menu"),b=n("el-icon"),u=n("el-dropdown-item"),B=n("el-dropdown-menu"),D=n("el-dropdown"),N=n("el-header"),V=n("el-col"),z=n("el-row"),I=n("el-main"),M=n("el-footer");return c(),m("div",T,[t(N,{class:"header"},{default:o(()=>[s("div",j,[e[8]||(e[8]=s("div",{class:"logo"},[s("h2",null,"前端H5系统")],-1)),s("div",q,[t(U,{mode:"horizontal","default-active":h.value,class:"nav-menu-items",onSelect:S},{default:o(()=>[t(f,{index:"home"},{default:o(()=>e[0]||(e[0]=[a("首页")])),_:1,__:[0]}),t(f,{index:"shop"},{default:o(()=>e[1]||(e[1]=[a("积分商城")])),_:1,__:[1]}),t(f,{index:"about"},{default:o(()=>e[2]||(e[2]=[a("关于")])),_:1,__:[2]})]),_:1},8,["default-active"])]),s("div",G,[_(i).isAuthenticated?(c(),v(D,{key:0,onCommand:A},{dropdown:o(()=>[t(B,null,{default:o(()=>[t(u,{command:"profile"},{default:o(()=>e[3]||(e[3]=[a("个人中心")])),_:1,__:[3]}),t(u,{command:"orders"},{default:o(()=>e[4]||(e[4]=[a("我的订单")])),_:1,__:[4]}),t(u,{command:"points-history"},{default:o(()=>e[5]||(e[5]=[a("积分记录")])),_:1,__:[5]}),t(u,{command:"transfers"},{default:o(()=>e[6]||(e[6]=[a("转账管理")])),_:1,__:[6]}),t(u,{divided:"",command:"logout"},{default:o(()=>e[7]||(e[7]=[a("退出登录")])),_:1,__:[7]})]),_:1})]),default:o(()=>{var d,y,w,x;return[s("span",J,[s("div",W,p((w=(y=(d=_(i).user)==null?void 0:d.username)==null?void 0:y.charAt(0))==null?void 0:w.toUpperCase()),1),s("span",X,p((x=_(i).user)==null?void 0:x.username),1),t(b,null,{default:o(()=>[t(_(R))]),_:1})])]}),_:1})):(c(),m(g,{key:1},[],64))])])]),_:1}),t(I,{class:"main-content"},{default:o(()=>[e[10]||(e[10]=s("div",{class:"main-section"},[s("div",{class:"container"},[s("div",{class:"welcome-content"},[s("h2",{class:"welcome-title"},"欢迎使用前端H5系统"),s("p",{class:"welcome-description"},"您的智能管理助手")])])],-1)),_(i).isAuthenticated?(c(),m("div",Y,[s("div",Z,[e[9]||(e[9]=s("h2",{class:"section-title"},"系统概览",-1)),t(z,{gutter:20},{default:o(()=>[(c(!0),m(g,null,K(k.value,d=>(c(),v(V,{xs:12,sm:6,key:d.key},{default:o(()=>[s("div",$,[s("div",ee,[t(b,{size:32},{default:o(()=>[(c(),v(O(d.icon)))]),_:2},1024)]),s("div",se,[s("div",oe,p(d.value),1),s("div",te,p(d.label),1)])])]),_:2},1024))),128))]),_:1})])])):F("",!0)]),_:1,__:[10]}),t(M,{class:"footer"},{default:o(()=>e[11]||(e[11]=[s("div",{class:"container"},[s("p",null,"© 2024 前端H5系统. All rights reserved.")],-1)])),_:1,__:[11]})])}}},ce=P(ne,[["__scopeId","data-v-9eed1601"]]);export{ce as default};
|
|
||||||
1
dist/assets/Home-DK4JVWxA.css
vendored
1
dist/assets/Home-DK4JVWxA.css
vendored
@@ -1 +0,0 @@
|
|||||||
.home[data-v-9eed1601]{min-height:100vh;display:flex;flex-direction:column}.header[data-v-9eed1601]{background:linear-gradient(135deg,#409eff,#66b1ff);box-shadow:0 2px 12px #0000001a}.header-content[data-v-9eed1601]{display:flex;align-items:center;justify-content:space-between;max-width:1200px;margin:0 auto;padding:0 20px}.logo h2[data-v-9eed1601]{color:#fff;margin:0}.nav-menu-items[data-v-9eed1601]{background:transparent;border:none}.nav-menu-items .el-menu-item[data-v-9eed1601]{color:#fff;border:none}.nav-menu-items .el-menu-item[data-v-9eed1601]:hover,.nav-menu-items .el-menu-item.is-active[data-v-9eed1601]{background-color:#ffffff1a;color:#fff}.user-actions[data-v-9eed1601]{display:flex;align-items:center;gap:10px}.user-info[data-v-9eed1601]{display:flex;align-items:center;gap:8px;color:#fff;cursor:pointer}.user-avatar[data-v-9eed1601]{width:32px;height:32px;border-radius:50%;background-color:#fff3;display:flex;align-items:center;justify-content:center;font-weight:600}.main-content[data-v-9eed1601]{flex:1;padding:0 0 80px}.container[data-v-9eed1601]{max-width:1200px;margin:0 auto;padding:0 20px}.main-section[data-v-9eed1601],.stats-section[data-v-9eed1601]{padding:60px 0}.main-section[data-v-9eed1601]{background-color:#f8f9fa;min-height:50vh}.section-title[data-v-9eed1601]{text-align:center;font-size:32px;margin-bottom:40px;color:#303133}.section-header[data-v-9eed1601]{display:flex;justify-content:space-between;align-items:center;margin-bottom:40px}.welcome-content[data-v-9eed1601]{text-align:center;max-width:600px;margin:0 auto;padding:40px 20px}.welcome-title[data-v-9eed1601]{font-size:32px;margin-bottom:16px;color:#303133;font-weight:600}.welcome-description[data-v-9eed1601]{font-size:16px;color:#606266;line-height:1.6}.stat-card[data-v-9eed1601]{background:#fff;border-radius:8px;padding:20px;box-shadow:0 2px 12px #0000001a;display:flex;align-items:center;gap:15px;margin-bottom:20px}.stat-icon[data-v-9eed1601]{color:#409eff}.stat-value[data-v-9eed1601]{font-size:24px;font-weight:600;color:#303133}.stat-label[data-v-9eed1601]{font-size:14px;color:#909399}.footer[data-v-9eed1601]{background-color:#303133;color:#fff;text-align:center}.footer .container[data-v-9eed1601]{padding:20px}@media (max-width: 768px){.header-content[data-v-9eed1601]{flex-direction:column;gap:15px;padding:15px 20px}.nav-menu[data-v-9eed1601]{order:3;width:100%}.user-actions[data-v-9eed1601]{order:2}.section-title[data-v-9eed1601]{font-size:24px}.section-header[data-v-9eed1601]{flex-direction:column;gap:20px;text-align:center}.welcome-title[data-v-9eed1601]{font-size:24px}.main-content[data-v-9eed1601]{padding-bottom:80px}}
|
|
||||||
1
dist/assets/Login-CuS3HgBi.js
vendored
1
dist/assets/Login-CuS3HgBi.js
vendored
@@ -1 +0,0 @@
|
|||||||
import{r as w,X as I,h as R,aB as U,aA as B,y as M,A as s,Q as o,I as t,V as S,al as u,M as n,z as F,u as f,a4 as L,O as T}from"./vendor-C3mpOp0n.js";import{_ as $,u as A}from"./index-BlP3rxMf.js";import{a as E,u as N,p as P,l as D}from"./elementPlus-DFx51bSH.js";import{C as K}from"./Captcha-BFJ1zi5J.js";const H={class:"login-page"},O={class:"login-container"},Q={class:"login-card"},X={class:"form-options"},j={class:"login-footer"},G={class:"quick-login"},J={class:"demo-accounts"},W={__name:"Login",setup(Y){const h=B(),b=U(),p=A(),g=w(),d=w(),a=I({username:"",password:"",captcha:""}),_=w(!1),x={username:[{required:!0,message:"请输入用户名或邮箱",trigger:"blur"},{min:3,message:"用户名至少3个字符",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"},{min:6,message:"密码至少6个字符",trigger:"blur"}],captcha:[{required:!0,message:"请输入验证码",trigger:"blur"},{min:4,max:4,message:"验证码为4位字符",trigger:"blur"}]},v=async()=>{if(!(!g.value||!d.value))try{if(!await g.value.validate())return;if(!await d.value.verifyCaptcha(a.captcha)){a.captcha="";return}const c=d.value.getCaptchaInfo(),i={username:a.username,password:a.password,captchaId:c.captchaId,captchaText:c.captchaText};if((await p.login(i)).success){const m=b.query.redirect||"/transfers";h.push(m)}}catch(l){console.error("登录失败:",l),d.value&&await d.value.refreshCaptcha(),a.captcha=""}},V=async l=>{l==="admin"?(a.username="admin",a.password="admin123"):(a.username="user",a.password="user123"),a.captcha="",E.info("请输入验证码后登录")},C=()=>{D.alert("请联系管理员重置密码,或使用演示账号进行体验。","忘记密码",{confirmButtonText:"确定",type:"info"})};return R(()=>{if(p.isAuthenticated){const e=b.query.redirect||"/transfers";h.push(e)}const l=localStorage.getItem("rememberedUsername");l&&(a.username=l,_.value=!0)}),(l,e)=>{const c=u("el-input"),i=u("el-form-item"),k=u("el-checkbox"),m=u("el-link"),y=u("el-button"),q=u("el-form"),z=u("el-divider");return F(),M("div",H,[s("div",O,[s("div",Q,[e[14]||(e[14]=s("div",{class:"login-header"},[s("h2",null,"用户登录"),s("p",null,"欢迎回到前端H5系统")],-1)),o(q,{ref_key:"loginFormRef",ref:g,model:a,rules:x,class:"login-form",onSubmit:S(v,["prevent"])},{default:t(()=>[o(i,{prop:"username"},{default:t(()=>[o(c,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=r=>a.username=r),placeholder:"请输入用户名或邮箱",size:"large","prefix-icon":f(N),clearable:""},null,8,["modelValue","prefix-icon"])]),_:1}),o(i,{prop:"password"},{default:t(()=>[o(c,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=r=>a.password=r),type:"password",placeholder:"请输入密码",size:"large","prefix-icon":f(P),"show-password":"",clearable:"",onKeyup:L(v,["enter"])},null,8,["modelValue","prefix-icon"])]),_:1}),o(i,{prop:"captcha"},{default:t(()=>[o(K,{ref_key:"captchaRef",ref:d,modelValue:a.captcha,"onUpdate:modelValue":e[2]||(e[2]=r=>a.captcha=r),placeholder:"请输入验证码",size:"large"},null,8,["modelValue"])]),_:1}),o(i,null,{default:t(()=>[s("div",X,[o(k,{modelValue:_.value,"onUpdate:modelValue":e[3]||(e[3]=r=>_.value=r)},{default:t(()=>e[7]||(e[7]=[n("记住我")])),_:1,__:[7]},8,["modelValue"]),o(m,{type:"primary",onClick:C},{default:t(()=>e[8]||(e[8]=[n(" 忘记密码? ")])),_:1,__:[8]})])]),_:1}),o(i,null,{default:t(()=>[o(y,{type:"primary",size:"large",class:"login-button",loading:f(p).loading,onClick:v},{default:t(()=>[n(T(f(p).loading?"登录中...":"登录"),1)]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),s("div",j,[s("p",null,[e[10]||(e[10]=n(" 还没有账号? ")),o(m,{type:"primary",onClick:e[4]||(e[4]=r=>l.$router.push("/register"))},{default:t(()=>e[9]||(e[9]=[n(" 立即注册 ")])),_:1,__:[9]})])]),s("div",G,[o(z,null,{default:t(()=>e[11]||(e[11]=[n("快速登录")])),_:1,__:[11]}),s("div",J,[o(y,{type:"info",plain:"",size:"small",onClick:e[5]||(e[5]=r=>V("admin"))},{default:t(()=>e[12]||(e[12]=[n(" 管理员账号 ")])),_:1,__:[12]}),o(y,{type:"success",plain:"",size:"small",onClick:e[6]||(e[6]=r=>V("user"))},{default:t(()=>e[13]||(e[13]=[n(" 普通用户 ")])),_:1,__:[13]})])])])]),e[15]||(e[15]=s("div",{class:"background-decoration"},[s("div",{class:"decoration-circle circle-1"}),s("div",{class:"decoration-circle circle-2"}),s("div",{class:"decoration-circle circle-3"})],-1))])}}},se=$(W,[["__scopeId","data-v-736bd32a"]]);export{se as default};
|
|
||||||
1
dist/assets/Login-DV1_4Ght.css
vendored
1
dist/assets/Login-DV1_4Ght.css
vendored
@@ -1 +0,0 @@
|
|||||||
.login-page[data-v-736bd32a]{min-height:100vh;background:linear-gradient(135deg,#667eea,#764ba2);display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden}.login-container[data-v-736bd32a]{width:100%;max-width:400px;padding:20px;position:relative;z-index:10}.login-card[data-v-736bd32a]{background:#fffffff2;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:16px;padding:40px 30px;box-shadow:0 20px 40px #0000001a;border:1px solid rgba(255,255,255,.2)}.login-header[data-v-736bd32a]{text-align:center;margin-bottom:30px}.login-header h2[data-v-736bd32a]{color:#303133;margin-bottom:8px;font-weight:600}.login-header p[data-v-736bd32a]{color:#909399;font-size:14px}.login-form[data-v-736bd32a]{margin-bottom:20px}.form-options[data-v-736bd32a]{display:flex;justify-content:space-between;align-items:center;width:100%}.login-button[data-v-736bd32a]{width:100%;height:44px;font-size:16px;font-weight:600}.login-footer[data-v-736bd32a]{text-align:center;margin-bottom:20px}.login-footer p[data-v-736bd32a]{color:#606266;font-size:14px}.quick-login[data-v-736bd32a]{margin-top:20px}.demo-accounts[data-v-736bd32a]{display:flex;gap:10px;justify-content:center;margin-top:15px}.background-decoration[data-v-736bd32a]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.decoration-circle[data-v-736bd32a]{position:absolute;border-radius:50%;background:#ffffff1a;animation:float-736bd32a 6s ease-in-out infinite}.circle-1[data-v-736bd32a]{width:200px;height:200px;top:10%;left:10%;animation-delay:0s}.circle-2[data-v-736bd32a]{width:150px;height:150px;top:60%;right:10%;animation-delay:2s}.circle-3[data-v-736bd32a]{width:100px;height:100px;bottom:20%;left:20%;animation-delay:4s}@keyframes float-736bd32a{0%,to{transform:translateY(0) rotate(0)}50%{transform:translateY(-20px) rotate(180deg)}}@media (max-width: 480px){.login-container[data-v-736bd32a]{padding:15px}.login-card[data-v-736bd32a]{padding:30px 20px}.demo-accounts[data-v-736bd32a]{flex-direction:column}.form-options[data-v-736bd32a]{flex-direction:column;gap:10px;align-items:flex-start}}[data-v-736bd32a] .el-input__wrapper,[data-v-736bd32a] .el-button{border-radius:8px}[data-v-736bd32a] .el-divider__text{background-color:#fffffff2;color:#909399}[data-v-736bd32a] .el-input__wrapper:hover,[data-v-736bd32a] .el-input__wrapper.is-focus{box-shadow:0 0 0 1px #409eff inset}.login-button.is-loading[data-v-736bd32a]{pointer-events:none}.login-card[data-v-736bd32a]{animation:slideInUp-736bd32a .6s ease-out}@keyframes slideInUp-736bd32a{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}[data-v-736bd32a] .el-form-item.is-error .el-input__wrapper{box-shadow:0 0 0 1px #f56c6c inset}[data-v-736bd32a] .el-form-item.is-success .el-input__wrapper{box-shadow:0 0 0 1px #67c23a inset}
|
|
||||||
1
dist/assets/Matching-CC28Z3KN.js
vendored
1
dist/assets/Matching-CC28Z3KN.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/Matching-Coe-22gR.css
vendored
1
dist/assets/Matching-Coe-22gR.css
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/NotFound-BgFHUPQF.css
vendored
1
dist/assets/NotFound-BgFHUPQF.css
vendored
@@ -1 +0,0 @@
|
|||||||
.not-found-page[data-v-dda1b05b]{min-height:100vh;background:linear-gradient(135deg,#667eea,#764ba2);display:flex;align-items:center;justify-content:center;padding:20px}.not-found-container[data-v-dda1b05b]{background:#fff;border-radius:16px;padding:40px;max-width:600px;width:100%;text-align:center;box-shadow:0 20px 40px #0000001a}.error-illustration[data-v-dda1b05b]{margin-bottom:30px}.error-code[data-v-dda1b05b]{font-size:120px;font-weight:700;color:#667eea;line-height:1;margin-bottom:10px;text-shadow:2px 2px 4px rgba(0,0,0,.1)}.error-message[data-v-dda1b05b]{font-size:24px;color:#333;font-weight:500;margin-bottom:20px}.error-description[data-v-dda1b05b]{margin-bottom:30px}.error-description p[data-v-dda1b05b]{color:#666;font-size:16px;line-height:1.6;margin:8px 0}.error-actions[data-v-dda1b05b]{display:flex;gap:16px;justify-content:center;margin-bottom:40px}@media (max-width: 768px){.not-found-page[data-v-dda1b05b]{padding:10px}.not-found-container[data-v-dda1b05b]{padding:30px 20px}.error-code[data-v-dda1b05b]{font-size:80px}.error-message[data-v-dda1b05b]{font-size:20px}.error-actions[data-v-dda1b05b]{flex-direction:column;align-items:center}.error-actions .el-button[data-v-dda1b05b]{width:200px}}@media (max-width: 480px){.error-code[data-v-dda1b05b]{font-size:60px}.error-message[data-v-dda1b05b]{font-size:18px}.error-description p[data-v-dda1b05b]{font-size:14px}}
|
|
||||||
1
dist/assets/NotFound-CC-kjdAg.js
vendored
1
dist/assets/NotFound-CC-kjdAg.js
vendored
@@ -1 +0,0 @@
|
|||||||
import{y as c,A as s,Q as t,I as e,al as l,aA as p,z as f,M as d,u as i}from"./vendor-C3mpOp0n.js";import{R as m,n as v}from"./elementPlus-DFx51bSH.js";import{_ as g}from"./index-BlP3rxMf.js";const k={class:"not-found-page"},x={class:"not-found-container"},N={class:"error-actions"},b={__name:"NotFound",setup(w){const n=p(),u=()=>{n.push("/transfers")},_=()=>{window.history.length>1?n.go(-1):n.push("/transfers")};return(y,o)=>{const r=l("el-icon"),a=l("el-button");return f(),c("div",k,[s("div",x,[o[2]||(o[2]=s("div",{class:"error-illustration"},[s("div",{class:"error-code"},"404"),s("div",{class:"error-message"},"页面不存在")],-1)),o[3]||(o[3]=s("div",{class:"error-description"},[s("p",null,"抱歉,您访问的页面不存在或已被删除。"),s("p",null,"请检查网址是否正确,或返回首页继续浏览。")],-1)),s("div",N,[t(a,{type:"primary",onClick:u},{default:e(()=>[t(r,null,{default:e(()=>[t(i(m))]),_:1}),o[0]||(o[0]=d(" 返回首页 "))]),_:1,__:[0]}),t(a,{onClick:_},{default:e(()=>[t(r,null,{default:e(()=>[t(i(v))]),_:1}),o[1]||(o[1]=d(" 返回上页 "))]),_:1,__:[1]})])])])}}},h=g(b,[["__scopeId","data-v-dda1b05b"]]);export{h as default};
|
|
||||||
1
dist/assets/Orders-Dy3nUi2C.css
vendored
1
dist/assets/Orders-Dy3nUi2C.css
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/Orders-FHO6V64s.js
vendored
1
dist/assets/Orders-FHO6V64s.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/PointsHistory-2mZ7lX5s.js
vendored
1
dist/assets/PointsHistory-2mZ7lX5s.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/PointsHistory-DvsR8WvP.css
vendored
1
dist/assets/PointsHistory-DvsR8WvP.css
vendored
@@ -1 +0,0 @@
|
|||||||
.points-history-page[data-v-7135f2f7]{min-height:100vh;background-color:#f5f5f5}.navbar[data-v-7135f2f7]{display:flex;align-items:center;justify-content:space-between;padding:0 16px;height:56px;background:#fff;border-bottom:1px solid #eee;position:sticky;top:0;z-index:100}.nav-left[data-v-7135f2f7],.nav-right[data-v-7135f2f7]{flex:1}.nav-right[data-v-7135f2f7]{display:flex;justify-content:flex-end}.back-btn[data-v-7135f2f7],.shop-btn[data-v-7135f2f7]{color:#409eff;font-size:14px}.nav-title[data-v-7135f2f7]{margin:0;font-size:18px;font-weight:500;color:#333}.points-overview[data-v-7135f2f7]{padding:16px}.overview-card[data-v-7135f2f7]{background:linear-gradient(135deg,#667eea,#764ba2);border-radius:16px;padding:24px;color:#fff;box-shadow:0 8px 24px #667eea4d}.current-points[data-v-7135f2f7]{display:flex;align-items:center;gap:16px;margin-bottom:24px}.points-icon[data-v-7135f2f7]{width:48px;height:48px;background:#fff3;border-radius:50%;display:flex;align-items:center;justify-content:center}.points-value[data-v-7135f2f7]{font-size:32px;font-weight:700;line-height:1}.points-label[data-v-7135f2f7]{font-size:14px;opacity:.8;margin-top:4px}.points-stats[data-v-7135f2f7]{display:flex;gap:32px}.stat-item[data-v-7135f2f7]{text-align:center}.stat-value[data-v-7135f2f7]{font-size:20px;font-weight:600;line-height:1}.stat-label[data-v-7135f2f7]{font-size:12px;opacity:.8;margin-top:4px}.filter-section[data-v-7135f2f7]{background:#fff;border-bottom:1px solid #eee;padding:16px}.filter-tabs[data-v-7135f2f7]{display:flex;gap:8px;margin-bottom:16px;overflow-x:auto}.tab-item[data-v-7135f2f7]{padding:8px 16px;border-radius:20px;background:#f5f5f5;color:#666;font-size:14px;cursor:pointer;white-space:nowrap;transition:all .3s}.tab-item.active[data-v-7135f2f7]{background:#409eff;color:#fff}.date-filter[data-v-7135f2f7]{display:flex;justify-content:center}.history-content[data-v-7135f2f7]{padding:16px}.empty-state[data-v-7135f2f7]{text-align:center;padding:60px 20px;color:#999}.history-list[data-v-7135f2f7]{display:flex;flex-direction:column;gap:12px}.history-item[data-v-7135f2f7]{display:flex;align-items:flex-start;gap:12px;background:#fff;border-radius:12px;padding:16px;box-shadow:0 2px 8px #0000001a;transition:all .3s}.history-item[data-v-7135f2f7]:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000026}.item-icon[data-v-7135f2f7]{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.icon-earn[data-v-7135f2f7]{background:#e8f5e8;color:#52c41a}.icon-spend[data-v-7135f2f7]{background:#fff2e8;color:#fa8c16}.icon-task[data-v-7135f2f7]{background:#f6ffed;color:#52c41a}.icon-exchange[data-v-7135f2f7]{background:#fff0f6;color:#eb2f96}.icon-present[data-v-7135f2f7]{background:#f9f0ff;color:#722ed1}.icon-review[data-v-7135f2f7]{background:#fff7e6;color:#fa8c16}.icon-share[data-v-7135f2f7]{background:#e6fffb;color:#13c2c2}.icon-default[data-v-7135f2f7]{background:#f5f5f5;color:#999}.item-content[data-v-7135f2f7]{flex:1}.item-header[data-v-7135f2f7]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px}.item-title[data-v-7135f2f7]{margin:0;font-size:16px;color:#333;font-weight:500;line-height:1.4}.item-points[data-v-7135f2f7]{font-size:16px;font-weight:600;white-space:nowrap}.points-positive[data-v-7135f2f7]{color:#52c41a}.points-negative[data-v-7135f2f7]{color:#ff4d4f}.item-details[data-v-7135f2f7]{display:flex;flex-direction:column;gap:8px}.item-description[data-v-7135f2f7]{margin:0;font-size:14px;color:#666;line-height:1.4}.item-meta[data-v-7135f2f7]{display:flex;justify-content:space-between;align-items:center;font-size:12px;color:#999}.item-date[data-v-7135f2f7]{flex:1}.item-order[data-v-7135f2f7]{color:#409eff}.item-action[data-v-7135f2f7]{display:flex;align-items:center}.load-more[data-v-7135f2f7]{text-align:center;padding:20px}.points-rules[data-v-7135f2f7]{margin:16px;background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 2px 8px #0000001a}.rules-content[data-v-7135f2f7]{padding:16px}.rule-item[data-v-7135f2f7]{display:flex;align-items:center;gap:8px;padding:8px 0;font-size:14px;color:#666}.rule-item .el-icon[data-v-7135f2f7]{color:#409eff}@media (max-width: 480px){.points-stats[data-v-7135f2f7]{gap:16px}.item-header[data-v-7135f2f7],.item-meta[data-v-7135f2f7]{flex-direction:column;align-items:flex-start;gap:4px}.current-points[data-v-7135f2f7]{flex-direction:column;text-align:center;gap:8px}}
|
|
||||||
1
dist/assets/ProductDetail-C9NaqNoj.js
vendored
1
dist/assets/ProductDetail-C9NaqNoj.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/ProductDetail-DtFrdNij.css
vendored
1
dist/assets/ProductDetail-DtFrdNij.css
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/Profile-CE52AKg0.js
vendored
1
dist/assets/Profile-CE52AKg0.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/Profile-hPqRnATi.css
vendored
1
dist/assets/Profile-hPqRnATi.css
vendored
@@ -1 +0,0 @@
|
|||||||
@charset "UTF-8";.profile-page[data-v-162b7df4]{min-height:100vh;background-color:#f5f5f5}.navbar[data-v-162b7df4]{display:flex;align-items:center;justify-content:space-between;padding:0 16px;height:56px;background:#fff;border-bottom:1px solid #eee;position:sticky;top:0;z-index:100}.nav-left[data-v-162b7df4],.nav-right[data-v-162b7df4]{flex:1}.nav-right[data-v-162b7df4]{text-align:right}.back-btn[data-v-162b7df4]{color:#409eff;font-size:14px}.nav-title[data-v-162b7df4]{margin:0;font-size:18px;font-weight:500;color:#333}.el-dropdown-link[data-v-162b7df4]{cursor:pointer;color:#409eff;font-size:18px}.profile-content[data-v-162b7df4]{padding:20px 16px}.profile-header[data-v-162b7df4]{background:linear-gradient(135deg,#667eea,#764ba2);border-radius:12px;padding:25px;margin-bottom:20px;box-shadow:0 4px 12px #00000026;color:#fff}.avatar-section[data-v-162b7df4]{text-align:center;margin-bottom:20px}.user-avatar[data-v-162b7df4]{margin-bottom:10px}.upload-btn[data-v-162b7df4]{font-size:12px}.user-info[data-v-162b7df4]{text-align:center}.username[data-v-162b7df4]{margin:0 0 5px;font-size:22px;color:#fff;font-weight:600}.user-email[data-v-162b7df4]{margin:0 0 10px;color:#fffc;font-size:14px}.audit-status[data-v-162b7df4]{margin-bottom:20px;display:flex;align-items:center;gap:10px}.audit-tag[data-v-162b7df4]{font-weight:500}.audit-tip[data-v-162b7df4]{font-size:12px;color:#ffffffb3;background:#ffffff1a;padding:2px 8px;border-radius:4px;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.user-stats[data-v-162b7df4]{display:flex;justify-content:center;gap:30px}.stat-item[data-v-162b7df4]{text-align:center}.stat-number[data-v-162b7df4]{display:block;font-size:20px;font-weight:700;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.1)}.stat-label[data-v-162b7df4]{font-size:12px;color:#fffc}.profile-form[data-v-162b7df4],.password-section[data-v-162b7df4]{background:#fff;border-radius:12px;padding:25px;margin-bottom:20px;box-shadow:0 4px 12px #00000014;border:1px solid rgba(0,0,0,.05)}.password-section h3[data-v-162b7df4]{margin:0 0 20px;font-size:16px;color:#333}.form-actions[data-v-162b7df4]{text-align:center;margin-top:30px;display:flex;gap:15px;justify-content:center}.form-actions .el-button[data-v-162b7df4]{min-width:100px;border-radius:8px;font-weight:500}.avatar-uploader[data-v-162b7df4]{text-align:center}.avatar-uploader[data-v-162b7df4] .el-upload{border:1px dashed #d9d9d9;border-radius:6px;cursor:pointer;position:relative;overflow:hidden;transition:.2s;width:178px;height:178px;display:flex;align-items:center;justify-content:center}.avatar-uploader[data-v-162b7df4] .el-upload:hover{border-color:#409eff}.avatar-uploader-icon[data-v-162b7df4]{font-size:28px;color:#8c939d}.avatar-preview[data-v-162b7df4]{width:178px;height:178px;object-fit:cover}.qr-upload-container[data-v-162b7df4]{display:flex;flex-direction:column;align-items:flex-start;gap:10px}.qr-uploader[data-v-162b7df4]{width:120px}.qr-uploader[data-v-162b7df4] .el-upload{border:2px dashed #d9d9d9;border-radius:8px;cursor:pointer;position:relative;overflow:hidden;transition:.3s;width:120px;height:120px;display:flex;flex-direction:column;align-items:center;justify-content:center;background-color:#fafafa}.qr-uploader[data-v-162b7df4] .el-upload:hover{border-color:#409eff;background-color:#f0f9ff}.qr-upload-placeholder[data-v-162b7df4]{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%;text-align:center}.qr-upload-icon[data-v-162b7df4]{font-size:24px;color:#8c939d;margin-bottom:8px}.qr-upload-text[data-v-162b7df4]{font-size:12px;color:#8c939d;line-height:1.2}.qr-preview[data-v-162b7df4]{width:120px;height:120px;object-fit:cover;border-radius:6px}.remove-btn[data-v-162b7df4]{align-self:flex-start}@media (max-width: 768px){.profile-content[data-v-162b7df4]{padding:10px}.profile-header[data-v-162b7df4],.profile-form[data-v-162b7df4],.password-section[data-v-162b7df4]{padding:20px;border-radius:8px}.user-stats[data-v-162b7df4]{gap:15px}.stat-number[data-v-162b7df4]{font-size:18px}.username[data-v-162b7df4]{font-size:20px}.qr-uploader[data-v-162b7df4]{width:100px}.qr-uploader[data-v-162b7df4] .el-upload,.qr-preview[data-v-162b7df4]{width:100px;height:100px}.form-actions[data-v-162b7df4]{flex-direction:column;align-items:center}.form-actions .el-button[data-v-162b7df4]{width:100%;max-width:200px}.el-form[data-v-162b7df4] .el-form-item__label{width:80px!important;font-size:14px}}
|
|
||||||
15
dist/assets/Register-CV6SJMyQ.js
vendored
15
dist/assets/Register-CV6SJMyQ.js
vendored
@@ -1,15 +0,0 @@
|
|||||||
import{r as w,X as B,h as M,aB as S,aA as T,y as I,A as o,aD as q,Q as t,I as s,V as k,al as p,M as u,z as F,u as d,O as N}from"./vendor-C3mpOp0n.js";import{_ as $,u as D}from"./index-BlP3rxMf.js";import{u as V,q as H,t as L,p as x,r as Z,o as O,l as y,a as Q}from"./elementPlus-DFx51bSH.js";import{C as X}from"./Captcha-BFJ1zi5J.js";const j={class:"register-page"},G={class:"register-container"},J={class:"register-card"},K={class:"register-footer"},W={class:"features-preview"},Y={class:"features-list"},ee={class:"feature-item"},re={class:"feature-item"},te={class:"feature-item"},ae={__name:"Register",setup(se){const _=T(),b=S(),m=D(),g=w(),f=w(),a=B({username:"",phone:"",registrationCode:"",password:"",confirmPassword:"",captcha:"",agreement:!1}),C={username:[{validator:(n,e,r)=>{e?e.length<3?r(new Error("用户名至少3个字符")):e.length>20?r(new Error("用户名不能超过20个字符")):/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(e)?r():r(new Error("用户名只能包含字母、数字、下划线和中文")):r(new Error("请输入用户名"))},trigger:"blur"}],phone:[{required:!0,message:"请输入手机号",trigger:"blur"},{pattern:/^1[3-9]\d{9}$/,message:"请输入正确的手机号",trigger:"blur"}],registrationCode:[{required:!0,message:"请输入激活码",trigger:"blur"},{min:6,message:"激活码长度不能少于6位",trigger:"blur"}],password:[{validator:(n,e,r)=>{var i;e?e.length<6?r(new Error("密码至少6个字符")):e.length>20?r(new Error("密码不能超过20个字符")):/(?=.*[a-zA-Z])(?=.*\d)/.test(e)?(a.confirmPassword&&((i=g.value)==null||i.validateField("confirmPassword")),r()):r(new Error("密码必须包含字母和数字")):r(new Error("请输入密码"))},trigger:"blur"}],confirmPassword:[{validator:(n,e,r)=>{e?e!==a.password?r(new Error("两次输入的密码不一致")):r():r(new Error("请确认密码"))},trigger:"blur"}],captcha:[{required:!0,message:"请输入验证码",trigger:"blur"},{min:4,max:4,message:"验证码长度为4位",trigger:"blur"}],agreement:[{validator:(n,e,r)=>{e?r():r(new Error("请阅读并同意用户协议和隐私政策"))},trigger:"change"}]},h=async()=>{if(!(!g.value||!f.value))try{if(!await g.value.validate())return;if(!await f.value.verifyCaptcha(a.captcha)){a.captcha="";return}const r=f.value.getCaptchaInfo(),i={username:a.username,phone:a.phone,registrationCode:a.registrationCode,password:a.password,captchaId:r.captchaId,captchaText:r.captchaText};(await m.register(i)).success&&(Q.success("注册成功!请登录"),_.push("/login"))}catch(n){console.error("注册失败:",n),f.value&&await f.value.refreshCaptcha(),a.captcha=""}},E=()=>{y.alert(`<div style="text-align: left; line-height: 1.6;">
|
|
||||||
<h3>用户协议</h3>
|
|
||||||
<p>1. 用户应当遵守法律法规,不得发布违法违规内容。</p>
|
|
||||||
<p>2. 用户对自己发布的内容承担全部责任。</p>
|
|
||||||
<p>3. 平台有权对违规内容进行删除或限制。</p>
|
|
||||||
<p>4. 用户应当保护好自己的账号安全。</p>
|
|
||||||
<p>5. 平台保留修改本协议的权利。</p>
|
|
||||||
</div>`,"用户协议",{confirmButtonText:"我已了解",dangerouslyUseHTMLString:!0,customClass:"agreement-dialog"})},P=()=>{y.alert(`<div style="text-align: left; line-height: 1.6;">
|
|
||||||
<h3>隐私政策</h3>
|
|
||||||
<p>1. 我们重视用户隐私保护。</p>
|
|
||||||
<p>2. 我们只收集必要的用户信息。</p>
|
|
||||||
<p>3. 用户信息仅用于提供服务。</p>
|
|
||||||
<p>4. 我们不会向第三方泄露用户信息。</p>
|
|
||||||
<p>5. 用户有权查看、修改或删除个人信息。</p>
|
|
||||||
</div>`,"隐私政策",{confirmButtonText:"我已了解",dangerouslyUseHTMLString:!0,customClass:"privacy-dialog"})};return M(()=>{if(m.isAuthenticated){const n=b.query.redirect||"/";_.push(n)}}),(n,e)=>{const r=p("el-input"),i=p("el-form-item"),c=p("el-link"),U=p("el-checkbox"),z=p("el-button"),R=p("el-form"),A=p("el-divider"),v=p("el-icon");return F(),I("div",j,[o("div",G,[o("div",J,[e[18]||(e[18]=o("div",{class:"register-header"},[o("h2",null,"用户注册"),o("p",null,"创建你的账号,开始使用前端H5系统")],-1)),t(R,{ref_key:"registerFormRef",ref:g,model:a,rules:C,class:"register-form",onSubmit:k(h,["prevent"])},{default:s(()=>[t(i,{prop:"username"},{default:s(()=>[t(r,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=l=>a.username=l),placeholder:"请输入用户名",size:"large","prefix-icon":d(V),clearable:""},null,8,["modelValue","prefix-icon"])]),_:1}),t(i,{prop:"phone"},{default:s(()=>[t(r,{modelValue:a.phone,"onUpdate:modelValue":e[1]||(e[1]=l=>a.phone=l),placeholder:"请输入手机号",size:"large","prefix-icon":d(H),clearable:""},null,8,["modelValue","prefix-icon"])]),_:1}),t(i,{prop:"registrationCode"},{default:s(()=>[t(r,{modelValue:a.registrationCode,"onUpdate:modelValue":e[2]||(e[2]=l=>a.registrationCode=l),placeholder:"请输入激活码",size:"large","prefix-icon":d(L),clearable:""},null,8,["modelValue","prefix-icon"])]),_:1}),t(i,{prop:"password"},{default:s(()=>[t(r,{modelValue:a.password,"onUpdate:modelValue":e[3]||(e[3]=l=>a.password=l),type:"password",placeholder:"请输入密码",size:"large","prefix-icon":d(x),"show-password":"",clearable:""},null,8,["modelValue","prefix-icon"])]),_:1}),t(i,{prop:"confirmPassword"},{default:s(()=>[t(r,{modelValue:a.confirmPassword,"onUpdate:modelValue":e[4]||(e[4]=l=>a.confirmPassword=l),type:"password",placeholder:"请确认密码",size:"large","prefix-icon":d(x),"show-password":"",clearable:""},null,8,["modelValue","prefix-icon"])]),_:1}),t(i,{prop:"captcha"},{default:s(()=>[t(X,{ref_key:"captchaRef",ref:f,modelValue:a.captcha,"onUpdate:modelValue":e[5]||(e[5]=l=>a.captcha=l),placeholder:"请输入验证码",size:"large"},null,8,["modelValue"])]),_:1}),t(i,{prop:"agreement"},{default:s(()=>[t(U,{modelValue:a.agreement,"onUpdate:modelValue":e[6]||(e[6]=l=>a.agreement=l)},{default:s(()=>[e[10]||(e[10]=u(" 我已阅读并同意 ")),t(c,{type:"primary",onClick:E},{default:s(()=>e[8]||(e[8]=[u(" 《用户协议》 ")])),_:1,__:[8]}),e[11]||(e[11]=u(" 和 ")),t(c,{type:"primary",onClick:P},{default:s(()=>e[9]||(e[9]=[u(" 《隐私政策》 ")])),_:1,__:[9]})]),_:1,__:[10,11]},8,["modelValue"])]),_:1}),t(i,null,{default:s(()=>[t(z,{type:"primary",size:"large",class:"register-button",loading:d(m).loading,onClick:h},{default:s(()=>[u(N(d(m).loading?"注册中...":"立即注册"),1)]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),o("div",K,[o("p",null,[e[13]||(e[13]=u(" 已有账号? ")),t(c,{type:"primary",onClick:e[7]||(e[7]=l=>n.$router.push("/login"))},{default:s(()=>e[12]||(e[12]=[u(" 立即登录 ")])),_:1,__:[12]})])]),o("div",W,[t(A,null,{default:s(()=>e[14]||(e[14]=[u("注册后你可以")])),_:1,__:[14]}),o("div",Y,[o("div",ee,[t(v,null,{default:s(()=>[t(d(V))]),_:1}),e[15]||(e[15]=o("span",null,"个性化用户中心",-1))]),o("div",re,[t(v,null,{default:s(()=>[t(d(Z))]),_:1}),e[16]||(e[16]=o("span",null,"积分商城购物",-1))]),o("div",te,[t(v,null,{default:s(()=>[t(d(O))]),_:1}),e[17]||(e[17]=o("span",null,"积分转账功能",-1))])])])])]),e[19]||(e[19]=q('<div class="background-decoration" data-v-fa9bb9c3><div class="decoration-shape shape-1" data-v-fa9bb9c3></div><div class="decoration-shape shape-2" data-v-fa9bb9c3></div><div class="decoration-shape shape-3" data-v-fa9bb9c3></div><div class="decoration-shape shape-4" data-v-fa9bb9c3></div></div>',1))])}}},me=$(ae,[["__scopeId","data-v-fa9bb9c3"]]);export{me as default};
|
|
||||||
1
dist/assets/Register-Cq2fSWm7.css
vendored
1
dist/assets/Register-Cq2fSWm7.css
vendored
@@ -1 +0,0 @@
|
|||||||
@charset "UTF-8";.register-page[data-v-fa9bb9c3]{min-height:100vh;background:linear-gradient(135deg,#667eea,#764ba2);display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden}.register-container[data-v-fa9bb9c3]{width:100%;max-width:450px;padding:20px;position:relative;z-index:10}.register-card[data-v-fa9bb9c3]{background:#fffffff2;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:16px;padding:40px 30px;box-shadow:0 20px 40px #0000001a;border:1px solid rgba(255,255,255,.2)}.register-header[data-v-fa9bb9c3]{text-align:center;margin-bottom:30px}.register-header h2[data-v-fa9bb9c3]{color:#303133;margin-bottom:8px;font-weight:600}.register-header p[data-v-fa9bb9c3]{color:#909399;font-size:14px}.register-form[data-v-fa9bb9c3]{margin-bottom:20px}.register-button[data-v-fa9bb9c3]{width:100%;height:44px;font-size:16px;font-weight:600}.register-footer[data-v-fa9bb9c3]{text-align:center;margin-bottom:20px}.register-footer p[data-v-fa9bb9c3]{color:#606266;font-size:14px}.document-upload-section[data-v-fa9bb9c3],.document-upload-section .el-divider[data-v-fa9bb9c3]{margin:20px 0}.document-upload-section .el-form-item[data-v-fa9bb9c3]{margin-bottom:20px}.document-upload-section .el-form-item .el-form-item__label[data-v-fa9bb9c3]{font-weight:500;color:#606266}.features-preview[data-v-fa9bb9c3]{margin-top:20px}.features-list[data-v-fa9bb9c3]{display:flex;flex-direction:column;gap:12px;margin-top:15px}.feature-item[data-v-fa9bb9c3]{display:flex;align-items:center;gap:8px;color:#606266;font-size:14px}.feature-item .el-icon[data-v-fa9bb9c3]{color:#409eff;font-size:16px}.upload-preview[data-v-fa9bb9c3]{margin-top:10px}.upload-preview img[data-v-fa9bb9c3]{width:100px;height:100px;object-fit:cover;border-radius:8px;border:1px solid #dcdfe6}.upload-demo[data-v-fa9bb9c3]{margin-bottom:10px}.background-decoration[data-v-fa9bb9c3]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.decoration-shape[data-v-fa9bb9c3]{position:absolute;background:#ffffff1a;animation:float-fa9bb9c3 8s ease-in-out infinite}.shape-1[data-v-fa9bb9c3]{width:100px;height:100px;border-radius:50%;top:15%;left:15%;animation-delay:0s}.shape-2[data-v-fa9bb9c3]{width:80px;height:80px;border-radius:20px;top:70%;right:20%;animation-delay:2s}.shape-3[data-v-fa9bb9c3]{width:60px;height:60px;border-radius:50%;bottom:25%;left:25%;animation-delay:4s}.shape-4[data-v-fa9bb9c3]{width:120px;height:40px;border-radius:20px;top:40%;right:10%;animation-delay:6s}@keyframes float-fa9bb9c3{0%,to{transform:translateY(0) rotate(0);opacity:.7}50%{transform:translateY(-15px) rotate(180deg);opacity:1}}@media (max-width: 480px){.register-container[data-v-fa9bb9c3]{padding:15px}.register-card[data-v-fa9bb9c3]{padding:30px 20px}.features-list[data-v-fa9bb9c3]{gap:8px}}[data-v-fa9bb9c3] .el-input__wrapper,[data-v-fa9bb9c3] .el-button{border-radius:8px}[data-v-fa9bb9c3] .el-divider__text{background-color:#fffffff2;color:#909399}[data-v-fa9bb9c3] .el-checkbox__label{font-size:14px;color:#606266}[data-v-fa9bb9c3] .el-input__wrapper:hover,[data-v-fa9bb9c3] .el-input__wrapper.is-focus{box-shadow:0 0 0 1px #409eff inset}.register-button.is-loading[data-v-fa9bb9c3]{pointer-events:none}.register-card[data-v-fa9bb9c3]{animation:slideInUp-fa9bb9c3 .6s ease-out}@keyframes slideInUp-fa9bb9c3{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}[data-v-fa9bb9c3] .el-form-item.is-error .el-input__wrapper{box-shadow:0 0 0 1px #f56c6c inset}[data-v-fa9bb9c3] .el-form-item.is-success .el-input__wrapper{box-shadow:0 0 0 1px #67c23a inset}[data-v-fa9bb9c3] .agreement-dialog .el-message-box__content,[data-v-fa9bb9c3] .privacy-dialog .el-message-box__content{max-height:400px;overflow-y:auto}.password-strength[data-v-fa9bb9c3]{margin-top:5px;font-size:12px}.strength-weak[data-v-fa9bb9c3]{color:#f56c6c}.strength-medium[data-v-fa9bb9c3]{color:#e6a23c}.strength-strong[data-v-fa9bb9c3]{color:#67c23a}
|
|
||||||
1
dist/assets/Shop-BdOVEivk.js
vendored
1
dist/assets/Shop-BdOVEivk.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/Shop-DSyA6-Or.css
vendored
1
dist/assets/Shop-DSyA6-Or.css
vendored
@@ -1 +0,0 @@
|
|||||||
.shop-page[data-v-2008b8d0]{min-height:100vh;background-color:#f5f5f5}.navbar[data-v-2008b8d0]{display:flex;align-items:center;justify-content:space-between;padding:0 16px;height:56px;background:#fff;border-bottom:1px solid #eee;position:sticky;top:0;z-index:100}.nav-left[data-v-2008b8d0],.nav-right[data-v-2008b8d0]{flex:1}.nav-right[data-v-2008b8d0]{display:flex;justify-content:flex-end}.back-btn[data-v-2008b8d0],.points-btn[data-v-2008b8d0]{color:#409eff;font-size:14px}.nav-title[data-v-2008b8d0]{margin:0;font-size:18px;font-weight:500;color:#333}.search-section[data-v-2008b8d0]{padding:16px;background:#fff;border-bottom:1px solid #eee}.search-input[data-v-2008b8d0]{width:100%}.category-section[data-v-2008b8d0]{background:#fff;padding:16px 0;border-bottom:1px solid #eee}.category-list[data-v-2008b8d0]{display:flex;gap:16px;padding:0 16px;white-space:nowrap}.category-item[data-v-2008b8d0]{display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 12px;border-radius:8px;cursor:pointer;transition:all .3s;min-width:60px}.category-item[data-v-2008b8d0]:hover{background:#f0f9ff}.category-item.active[data-v-2008b8d0]{background:#409eff;color:#fff}.category-item span[data-v-2008b8d0]{font-size:12px}.products-section[data-v-2008b8d0]{padding:16px}.section-header[data-v-2008b8d0]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.section-header h3[data-v-2008b8d0]{margin:0;font-size:16px;color:#333}.sort-btn[data-v-2008b8d0]{display:flex;align-items:center;gap:4px;color:#666;font-size:14px;cursor:pointer}.products-grid[data-v-2008b8d0]{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin-bottom:20px}.product-card[data-v-2008b8d0]{background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 2px 8px #0000001a;cursor:pointer;transition:all .3s}.product-card[data-v-2008b8d0]:hover{transform:translateY(-4px);box-shadow:0 8px 16px #00000026}.product-image[data-v-2008b8d0]{position:relative;width:100%;height:120px;overflow:hidden}.product-image img[data-v-2008b8d0]{width:100%;height:100%;object-fit:cover}.discount-badge[data-v-2008b8d0]{position:absolute;top:8px;right:8px;background:#ff4757;color:#fff;padding:2px 6px;border-radius:4px;font-size:12px}.product-info[data-v-2008b8d0]{padding:12px}.product-name[data-v-2008b8d0]{margin:0 0 4px;font-size:14px;font-weight:500;color:#333;line-height:1.4}.product-desc[data-v-2008b8d0]{margin:0 0 8px;font-size:12px;color:#666;line-height:1.4}.product-price[data-v-2008b8d0]{display:flex;align-items:center;gap:8px;margin-bottom:8px}.current-price[data-v-2008b8d0]{display:flex;align-items:center;gap:2px;color:#ff6b35;font-weight:600;font-size:16px}.original-price[data-v-2008b8d0]{color:#999;font-size:12px;text-decoration:line-through}.product-stats[data-v-2008b8d0]{display:flex;justify-content:space-between;font-size:12px;color:#999;margin-bottom:8px}.product-actions[data-v-2008b8d0]{padding:0 12px 12px}.product-actions .el-button[data-v-2008b8d0]{width:100%}.empty-state[data-v-2008b8d0]{text-align:center;padding:60px 20px;color:#999}.load-more[data-v-2008b8d0]{text-align:center;padding:20px}.cart-fab[data-v-2008b8d0]{position:fixed;bottom:80px;right:20px;width:56px;height:56px;background:#409eff;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;cursor:pointer;box-shadow:0 4px 12px #409eff66;z-index:1000}.cart-content[data-v-2008b8d0]{height:100%;display:flex;flex-direction:column}.empty-cart[data-v-2008b8d0]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#999}.cart-item[data-v-2008b8d0]{display:flex;align-items:center;gap:12px;padding:16px 0;border-bottom:1px solid #eee}.item-image[data-v-2008b8d0]{width:60px;height:60px;border-radius:8px;object-fit:cover}.item-info[data-v-2008b8d0]{flex:1}.item-info h4[data-v-2008b8d0]{margin:0 0 4px;font-size:14px;color:#333}.item-price[data-v-2008b8d0]{display:flex;align-items:center;gap:2px;color:#ff6b35;font-weight:600;margin:0}.item-actions[data-v-2008b8d0]{display:flex;flex-direction:column;gap:8px;align-items:flex-end}.cart-footer[data-v-2008b8d0]{margin-top:auto;padding:20px 0;border-top:1px solid #eee}.total-points[data-v-2008b8d0]{display:flex;align-items:center;gap:4px;font-size:18px;font-weight:600;color:#ff6b35;margin-bottom:16px}@media (max-width: 480px){.products-grid[data-v-2008b8d0]{grid-template-columns:1fr}.product-card[data-v-2008b8d0]{display:flex}.product-image[data-v-2008b8d0]{width:120px;height:120px;flex-shrink:0}.product-info[data-v-2008b8d0]{flex:1}}
|
|
||||||
1
dist/assets/TaskCenter-BOIbsjh-.js
vendored
1
dist/assets/TaskCenter-BOIbsjh-.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/TaskCenter-_aLIEz6D.css
vendored
1
dist/assets/TaskCenter-_aLIEz6D.css
vendored
@@ -1 +0,0 @@
|
|||||||
.task-center[data-v-9f05f885]{min-height:100vh;background:#f5f7fa}.navbar[data-v-9f05f885]{display:flex;align-items:center;justify-content:space-between;padding:0 16px;height:56px;background:#fff;box-shadow:0 2px 4px #0000001a}.nav-left[data-v-9f05f885],.nav-right[data-v-9f05f885]{flex:1}.nav-right[data-v-9f05f885]{display:flex;justify-content:flex-end}.back-btn[data-v-9f05f885],.points-btn[data-v-9f05f885]{color:#333;font-size:14px}.points-btn[data-v-9f05f885]{color:#ff6b35;font-weight:700}.nav-title[data-v-9f05f885]{margin:0;font-size:18px;font-weight:500;text-align:center}.task-stats[data-v-9f05f885]{padding:16px}.stats-card[data-v-9f05f885]{background:#fff;border-radius:12px;padding:20px;display:flex;justify-content:space-around;box-shadow:0 2px 8px #0000001a}.stat-item[data-v-9f05f885]{display:flex;flex-direction:column;align-items:center;text-align:center}.stat-icon[data-v-9f05f885]{width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,#667eea,#764ba2);display:flex;align-items:center;justify-content:center;color:#fff;margin-bottom:8px}.stat-value[data-v-9f05f885]{font-size:20px;font-weight:700;color:#333;margin-bottom:4px}.stat-label[data-v-9f05f885]{font-size:12px;color:#666}.task-categories[data-v-9f05f885]{padding:0 16px 16px}.category-tabs[data-v-9f05f885]{display:flex;background:#fff;border-radius:12px;padding:4px;box-shadow:0 2px 8px #0000001a}.category-tab[data-v-9f05f885]{flex:1;display:flex;flex-direction:column;align-items:center;padding:12px 8px;border-radius:8px;cursor:pointer;transition:all .3s;font-size:12px;color:#666}.category-tab.active[data-v-9f05f885]{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.category-tab .el-icon[data-v-9f05f885]{margin-bottom:4px}.task-list[data-v-9f05f885]{padding:0 16px}.task-item[data-v-9f05f885]{background:#fff;border-radius:12px;padding:16px;margin-bottom:12px;display:flex;align-items:center;box-shadow:0 2px 8px #0000001a;transition:all .3s}.task-item.completed[data-v-9f05f885]{border-left:4px solid #67c23a}.task-item.claimed[data-v-9f05f885]{opacity:.6;border-left:4px solid #909399}.task-icon[data-v-9f05f885]{width:48px;height:48px;border-radius:50%;background:linear-gradient(135deg,#667eea,#764ba2);display:flex;align-items:center;justify-content:center;color:#fff;margin-right:16px}.task-content[data-v-9f05f885]{flex:1}.task-title[data-v-9f05f885]{font-size:16px;font-weight:500;color:#333;margin-bottom:4px}.task-desc[data-v-9f05f885]{font-size:14px;color:#666;margin-bottom:8px}.task-progress[data-v-9f05f885]{display:flex;align-items:center;gap:8px}.task-progress .el-progress[data-v-9f05f885]{flex:1}.progress-text[data-v-9f05f885]{font-size:12px;color:#666;white-space:nowrap}.task-reward[data-v-9f05f885]{display:flex;flex-direction:column;align-items:center;gap:8px}.reward-points[data-v-9f05f885]{font-size:14px;font-weight:700;color:#ff6b35}.empty-state[data-v-9f05f885]{text-align:center;padding:60px 20px;color:#666}.empty-state p[data-v-9f05f885]{margin-top:16px;font-size:14px}
|
|
||||||
1
dist/assets/Transfers-9iymu-FU.css
vendored
1
dist/assets/Transfers-9iymu-FU.css
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/Transfers-D3Wb5NEb.js
vendored
1
dist/assets/Transfers-D3Wb5NEb.js
vendored
File diff suppressed because one or more lines are too long
37
dist/assets/elementPlus-DFx51bSH.js
vendored
37
dist/assets/elementPlus-DFx51bSH.js
vendored
File diff suppressed because one or more lines are too long
8
dist/assets/index-BlP3rxMf.js
vendored
8
dist/assets/index-BlP3rxMf.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/index-BqycflTi.js
vendored
1
dist/assets/index-BqycflTi.js
vendored
@@ -1 +0,0 @@
|
|||||||
const e={development:{baseURL:"http://localhost:3000",uploadURL:"http://114.55.111.44:3000/api/upload"},production:{baseURL:window.location.origin,uploadURL:"http://114.55.111.44:3000/api/upload"}},a="production",{baseURL:r,uploadURL:s}=e[a],c=t=>{if(!t)return"";if(t.startsWith("http"))return t;const o=r.replace(/\/$/,""),n=t.startsWith("/")?t:`/${t}`;return`${o}${n}`},p=()=>({action:s,headers:{Authorization:`Bearer ${localStorage.getItem("token")}`}});export{c as a,p as g,s as u};
|
|
||||||
1
dist/assets/index-Cji6jJXl.css
vendored
1
dist/assets/index-Cji6jJXl.css
vendored
File diff suppressed because one or more lines are too long
25
dist/assets/vendor-C3mpOp0n.js
vendored
25
dist/assets/vendor-C3mpOp0n.js
vendored
File diff suppressed because one or more lines are too long
63
dist/index.html
vendored
63
dist/index.html
vendored
@@ -1,63 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="zh-CN">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
|
||||||
<title>前端H5系统</title>
|
|
||||||
<style>
|
|
||||||
* {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
|
||||||
background-color: #f5f5f5;
|
|
||||||
}
|
|
||||||
|
|
||||||
#app {
|
|
||||||
min-height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading {
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: #fff;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
z-index: 9999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.loading-spinner {
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
border: 4px solid #f3f3f3;
|
|
||||||
border-top: 4px solid #409eff;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: spin 1s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes spin {
|
|
||||||
0% { transform: rotate(0deg); }
|
|
||||||
100% { transform: rotate(360deg); }
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script type="module" crossorigin src="/assets/index-BlP3rxMf.js"></script>
|
|
||||||
<link rel="modulepreload" crossorigin href="/assets/vendor-C3mpOp0n.js">
|
|
||||||
<link rel="modulepreload" crossorigin href="/assets/elementPlus-DFx51bSH.js">
|
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-Cji6jJXl.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="app">
|
|
||||||
<div class="loading">
|
|
||||||
<div class="loading-spinner"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
||||||
<title>前端H5系统</title>
|
<title>易融宝</title>
|
||||||
<style>
|
<style>
|
||||||
* {
|
* {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ router.beforeEach(async (to, from, next) => {
|
|||||||
|
|
||||||
// 设置页面标题
|
// 设置页面标题
|
||||||
if (to.meta.title) {
|
if (to.meta.title) {
|
||||||
document.title = `${to.meta.title} - 融互通`
|
document.title = `${to.meta.title} - 易融宝`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否需要认证
|
// 检查是否需要认证
|
||||||
|
|||||||
@@ -76,28 +76,7 @@
|
|||||||
</el-link>
|
</el-link>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="quick-login">
|
|
||||||
<el-divider>快速登录</el-divider>
|
|
||||||
<div class="demo-accounts">
|
|
||||||
<el-button
|
|
||||||
type="info"
|
|
||||||
plain
|
|
||||||
size="small"
|
|
||||||
@click="quickLogin('admin')"
|
|
||||||
>
|
|
||||||
管理员账号
|
|
||||||
</el-button>
|
|
||||||
<el-button
|
|
||||||
type="success"
|
|
||||||
plain
|
|
||||||
size="small"
|
|
||||||
@click="quickLogin('user')"
|
|
||||||
>
|
|
||||||
普通用户
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -196,20 +175,6 @@ const handleLogin = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 快速登录(演示用)
|
|
||||||
const quickLogin = async (type) => {
|
|
||||||
if (type === 'admin') {
|
|
||||||
loginForm.username = 'admin'
|
|
||||||
loginForm.password = 'admin123'
|
|
||||||
} else {
|
|
||||||
loginForm.username = 'user'
|
|
||||||
loginForm.password = 'user123'
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清空验证码,让用户手动输入
|
|
||||||
loginForm.captcha = ''
|
|
||||||
ElMessage.info('请输入验证码后登录')
|
|
||||||
}
|
|
||||||
|
|
||||||
// 忘记密码
|
// 忘记密码
|
||||||
const showForgotPassword = () => {
|
const showForgotPassword = () => {
|
||||||
|
|||||||
@@ -43,7 +43,6 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="user-info">
|
<div class="user-info">
|
||||||
<h2 class="username">{{ userInfo?.username }}</h2>
|
<h2 class="username">{{ userInfo?.username }}</h2>
|
||||||
<p class="user-email">{{ userInfo?.email }}</p>
|
|
||||||
|
|
||||||
<!-- 审核状态显示 -->
|
<!-- 审核状态显示 -->
|
||||||
<div class="audit-status">
|
<div class="audit-status">
|
||||||
@@ -92,9 +91,7 @@
|
|||||||
<el-input v-model="form.nickname" placeholder="请输入昵称" />
|
<el-input v-model="form.nickname" placeholder="请输入昵称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="邮箱" prop="email">
|
|
||||||
<el-input v-model="form.email" placeholder="请输入邮箱" />
|
|
||||||
</el-form-item>
|
|
||||||
|
|
||||||
<el-form-item label="真实姓名" prop="realName">
|
<el-form-item label="真实姓名" prop="realName">
|
||||||
<el-input v-model="form.realName" placeholder="请输入真实姓名" />
|
<el-input v-model="form.realName" placeholder="请输入真实姓名" />
|
||||||
@@ -361,7 +358,7 @@ const userInfo = ref({
|
|||||||
id: '',
|
id: '',
|
||||||
username: '',
|
username: '',
|
||||||
nickname: '',
|
nickname: '',
|
||||||
email: '',
|
|
||||||
phone: '',
|
phone: '',
|
||||||
realName: '',
|
realName: '',
|
||||||
idCard: '',
|
idCard: '',
|
||||||
@@ -381,7 +378,7 @@ const userStats = ref({
|
|||||||
const form = reactive({
|
const form = reactive({
|
||||||
username: '',
|
username: '',
|
||||||
nickname: '',
|
nickname: '',
|
||||||
email: '',
|
|
||||||
phone: '',
|
phone: '',
|
||||||
realName: '',
|
realName: '',
|
||||||
idCard: '',
|
idCard: '',
|
||||||
@@ -417,10 +414,7 @@ const rules = {
|
|||||||
{ required: true, message: '请输入用户名', trigger: 'blur' },
|
{ required: true, message: '请输入用户名', trigger: 'blur' },
|
||||||
{ min: 3, max: 20, message: '用户名长度在 3 到 20 个字符', trigger: 'blur' }
|
{ min: 3, max: 20, message: '用户名长度在 3 到 20 个字符', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
email: [
|
|
||||||
{ required: true, message: '请输入邮箱', trigger: 'blur' },
|
|
||||||
{ type: 'email', message: '请输入正确的邮箱格式', trigger: 'blur' }
|
|
||||||
],
|
|
||||||
realName: [
|
realName: [
|
||||||
{ required: true, message: '请输入真实姓名', trigger: 'blur' },
|
{ required: true, message: '请输入真实姓名', trigger: 'blur' },
|
||||||
{ min: 2, max: 10, message: '真实姓名长度在 2 到 10 个字符', trigger: 'blur' }
|
{ min: 2, max: 10, message: '真实姓名长度在 2 到 10 个字符', trigger: 'blur' }
|
||||||
@@ -943,11 +937,7 @@ onMounted(() => {
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-email {
|
|
||||||
margin: 0 0 10px 0;
|
|
||||||
color: rgba(255, 255, 255, 0.8);
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.audit-status {
|
.audit-status {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
|
|||||||
@@ -34,7 +34,8 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item prop="smsCode">
|
<!-- 短信验证码组件 - 已注释 -->
|
||||||
|
<!-- <el-form-item prop="smsCode">
|
||||||
<div class="sms-code-group">
|
<div class="sms-code-group">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="registerForm.smsCode"
|
v-model="registerForm.smsCode"
|
||||||
@@ -55,7 +56,7 @@
|
|||||||
{{ smsCountdown > 0 ? `${smsCountdown}s后重发` : '发送验证码' }}
|
{{ smsCountdown > 0 ? `${smsCountdown}s后重发` : '发送验证码' }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item> -->
|
||||||
|
|
||||||
<el-form-item prop="registrationCode">
|
<el-form-item prop="registrationCode">
|
||||||
<el-input
|
<el-input
|
||||||
@@ -191,17 +192,17 @@ const registerForm = reactive({
|
|||||||
password: '',
|
password: '',
|
||||||
confirmPassword: '',
|
confirmPassword: '',
|
||||||
captcha: '',
|
captcha: '',
|
||||||
smsCode: '',
|
// smsCode: '', // 短信验证码字段 - 已注释
|
||||||
agreement: false
|
agreement: false
|
||||||
})
|
})
|
||||||
|
|
||||||
// 短信验证码相关状态
|
// 短信验证码相关状态 - 已注释
|
||||||
const sendingSMS = ref(false)
|
// const sendingSMS = ref(false)
|
||||||
const smsCountdown = ref(0)
|
// const smsCountdown = ref(0)
|
||||||
const canSendSMS = computed(() => {
|
// const canSendSMS = computed(() => {
|
||||||
const phoneRegex = /^1[3-9]\d{9}$/
|
// const phoneRegex = /^1[3-9]\d{9}$/
|
||||||
return phoneRegex.test(registerForm.phone)
|
// return phoneRegex.test(registerForm.phone)
|
||||||
})
|
// })
|
||||||
|
|
||||||
// 自定义验证函数
|
// 自定义验证函数
|
||||||
const validateUsername = (rule, value, callback) => {
|
const validateUsername = (rule, value, callback) => {
|
||||||
@@ -263,12 +264,14 @@ const registerRules = {
|
|||||||
],
|
],
|
||||||
registrationCode: [
|
registrationCode: [
|
||||||
{ required: true, message: '请输入激活码', trigger: 'blur' },
|
{ required: true, message: '请输入激活码', trigger: 'blur' },
|
||||||
{ min: 6, message: '激活码长度不能少于6位', trigger: 'blur' }
|
{ len: 6, message: '激活码长度为6位', trigger: 'blur' },
|
||||||
],
|
{ pattern: /^[A-Z0-9]{6}$/, message: '激活码只能包含大写字母和数字', trigger: 'blur' }
|
||||||
smsCode: [
|
|
||||||
{ required: true, message: '请输入短信验证码', trigger: 'blur' },
|
|
||||||
{ pattern: /^\d{6}$/, message: '短信验证码为6位数字', trigger: 'blur' }
|
|
||||||
],
|
],
|
||||||
|
// 短信验证码验证规则 - 已注释
|
||||||
|
// smsCode: [
|
||||||
|
// { required: true, message: '请输入短信验证码', trigger: 'blur' },
|
||||||
|
// { pattern: /^\d{6}$/, message: '短信验证码为6位数字', trigger: 'blur' }
|
||||||
|
// ],
|
||||||
|
|
||||||
password: [{ validator: validatePassword, trigger: 'blur' }],
|
password: [{ validator: validatePassword, trigger: 'blur' }],
|
||||||
confirmPassword: [{ validator: validateConfirmPassword, trigger: 'blur' }],
|
confirmPassword: [{ validator: validateConfirmPassword, trigger: 'blur' }],
|
||||||
@@ -279,52 +282,52 @@ const registerRules = {
|
|||||||
agreement: [{ validator: validateAgreement, trigger: 'change' }]
|
agreement: [{ validator: validateAgreement, trigger: 'change' }]
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送短信验证码
|
// 发送短信验证码 - 已注释
|
||||||
const sendSMSCode = async () => {
|
// const sendSMSCode = async () => {
|
||||||
if (!canSendSMS.value || sendingSMS.value || smsCountdown.value > 0) {
|
// if (!canSendSMS.value || sendingSMS.value || smsCountdown.value > 0) {
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
try {
|
// try {
|
||||||
sendingSMS.value = true
|
// sendingSMS.value = true
|
||||||
|
//
|
||||||
const response = await fetch('/api/sms/send', {
|
// const response = await fetch('/api/sms/send', {
|
||||||
method: 'POST',
|
// method: 'POST',
|
||||||
headers: {
|
// headers: {
|
||||||
'Content-Type': 'application/json'
|
// 'Content-Type': 'application/json'
|
||||||
},
|
// },
|
||||||
body: JSON.stringify({
|
// body: JSON.stringify({
|
||||||
phone: registerForm.phone
|
// phone: registerForm.phone
|
||||||
})
|
// })
|
||||||
})
|
// })
|
||||||
|
//
|
||||||
const result = await response.json()
|
// const result = await response.json()
|
||||||
|
//
|
||||||
if (result.success) {
|
// if (result.success) {
|
||||||
ElMessage.success('验证码发送成功,请查收短信')
|
// ElMessage.success('验证码发送成功,请查收短信')
|
||||||
// 开始倒计时
|
// // 开始倒计时
|
||||||
startCountdown()
|
// startCountdown()
|
||||||
} else {
|
// } else {
|
||||||
ElMessage.error(result.message || '发送失败,请重试')
|
// ElMessage.error(result.message || '发送失败,请重试')
|
||||||
}
|
// }
|
||||||
} catch (error) {
|
// } catch (error) {
|
||||||
console.error('发送短信验证码失败:', error)
|
// console.error('发送短信验证码失败:', error)
|
||||||
ElMessage.error('发送失败,请检查网络连接')
|
// ElMessage.error('发送失败,请检查网络连接')
|
||||||
} finally {
|
// } finally {
|
||||||
sendingSMS.value = false
|
// sendingSMS.value = false
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 开始倒计时
|
// 开始倒计时 - 已注释
|
||||||
const startCountdown = () => {
|
// const startCountdown = () => {
|
||||||
smsCountdown.value = 60
|
// smsCountdown.value = 60
|
||||||
const timer = setInterval(() => {
|
// const timer = setInterval(() => {
|
||||||
smsCountdown.value--
|
// smsCountdown.value--
|
||||||
if (smsCountdown.value <= 0) {
|
// if (smsCountdown.value <= 0) {
|
||||||
clearInterval(timer)
|
// clearInterval(timer)
|
||||||
}
|
// }
|
||||||
}, 1000)
|
// }, 1000)
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 处理注册
|
// 处理注册
|
||||||
const handleRegister = async () => {
|
const handleRegister = async () => {
|
||||||
@@ -351,7 +354,7 @@ const handleRegister = async () => {
|
|||||||
phone: registerForm.phone,
|
phone: registerForm.phone,
|
||||||
registrationCode: registerForm.registrationCode,
|
registrationCode: registerForm.registrationCode,
|
||||||
password: registerForm.password,
|
password: registerForm.password,
|
||||||
smsCode: registerForm.smsCode,
|
// smsCode: registerForm.smsCode, // 短信验证码 - 已注释
|
||||||
captchaId: captchaInfo.captchaId,
|
captchaId: captchaInfo.captchaId,
|
||||||
captchaText: captchaInfo.captchaText
|
captchaText: captchaInfo.captchaText
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
@click="goToProduct(product.id)"
|
@click="goToProduct(product.id)"
|
||||||
>
|
>
|
||||||
<div class="product-image">
|
<div class="product-image">
|
||||||
<img :src="product.image" :alt="product.name" />
|
<img :src="getImageUrl(product.image)" :alt="product.name" />
|
||||||
<div v-if="product.discount" class="discount-badge">
|
<div v-if="product.discount" class="discount-badge">
|
||||||
{{ product.discount }}折
|
{{ product.discount }}折
|
||||||
</div>
|
</div>
|
||||||
@@ -138,6 +138,9 @@
|
|||||||
title="购物车"
|
title="购物车"
|
||||||
direction="rtl"
|
direction="rtl"
|
||||||
size="80%"
|
size="80%"
|
||||||
|
:z-index="10000"
|
||||||
|
:modal="true"
|
||||||
|
:append-to-body="true"
|
||||||
>
|
>
|
||||||
<div class="cart-content">
|
<div class="cart-content">
|
||||||
<div v-if="cartItems.length === 0" class="empty-cart">
|
<div v-if="cartItems.length === 0" class="empty-cart">
|
||||||
@@ -146,7 +149,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div v-for="item in cartItems" :key="item.id" class="cart-item">
|
<div v-for="item in cartItems" :key="item.id" class="cart-item">
|
||||||
<img :src="item.image" :alt="item.name" class="item-image" />
|
<img :src="getImageUrl(item.image)" :alt="item.name" class="item-image" />
|
||||||
<div class="item-info">
|
<div class="item-info">
|
||||||
<h4>{{ item.name }}</h4>
|
<h4>{{ item.name }}</h4>
|
||||||
<p class="item-price">
|
<p class="item-price">
|
||||||
@@ -205,6 +208,7 @@ import {
|
|||||||
} from '@element-plus/icons-vue'
|
} from '@element-plus/icons-vue'
|
||||||
import api from '@/utils/api'
|
import api from '@/utils/api'
|
||||||
import { debounce } from 'lodash-es'
|
import { debounce } from 'lodash-es'
|
||||||
|
import { getImageUrl } from '@/config'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
@@ -237,6 +241,11 @@ const categories = ref([
|
|||||||
|
|
||||||
// 计算属性
|
// 计算属性
|
||||||
const filteredProducts = computed(() => {
|
const filteredProducts = computed(() => {
|
||||||
|
// 安全检查:确保products.value是数组
|
||||||
|
if (!products.value || !Array.isArray(products.value)) {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
let result = products.value
|
let result = products.value
|
||||||
|
|
||||||
// 分类筛选
|
// 分类筛选
|
||||||
@@ -247,21 +256,21 @@ const filteredProducts = computed(() => {
|
|||||||
// 搜索筛选
|
// 搜索筛选
|
||||||
if (searchKeyword.value) {
|
if (searchKeyword.value) {
|
||||||
result = result.filter(p =>
|
result = result.filter(p =>
|
||||||
p.name.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
|
p.name && p.name.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
|
||||||
p.description.toLowerCase().includes(searchKeyword.value.toLowerCase())
|
p.description && p.description.toLowerCase().includes(searchKeyword.value.toLowerCase())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 排序
|
// 排序
|
||||||
switch (sortBy.value) {
|
switch (sortBy.value) {
|
||||||
case 'price_asc':
|
case 'price_asc':
|
||||||
result.sort((a, b) => a.points - b.points)
|
result.sort((a, b) => (a.points || 0) - (b.points || 0))
|
||||||
break
|
break
|
||||||
case 'price_desc':
|
case 'price_desc':
|
||||||
result.sort((a, b) => b.points - a.points)
|
result.sort((a, b) => (b.points || 0) - (a.points || 0))
|
||||||
break
|
break
|
||||||
case 'sales':
|
case 'sales':
|
||||||
result.sort((a, b) => b.sales - a.sales)
|
result.sort((a, b) => (b.sales || 0) - (a.sales || 0))
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,11 +288,19 @@ const sortText = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const cartCount = computed(() => {
|
const cartCount = computed(() => {
|
||||||
return cartItems.value.reduce((sum, item) => sum + item.quantity, 0)
|
// 安全检查:确保cartItems.value是数组
|
||||||
|
if (!cartItems.value || !Array.isArray(cartItems.value)) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return cartItems.value.reduce((sum, item) => sum + (item.quantity || 0), 0)
|
||||||
})
|
})
|
||||||
|
|
||||||
const totalPoints = computed(() => {
|
const totalPoints = computed(() => {
|
||||||
return cartItems.value.reduce((sum, item) => sum + (item.points * item.quantity), 0)
|
// 安全检查:确保cartItems.value是数组
|
||||||
|
if (!cartItems.value || !Array.isArray(cartItems.value)) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return cartItems.value.reduce((sum, item) => sum + ((item.points || 0) * (item.quantity || 0)), 0)
|
||||||
})
|
})
|
||||||
|
|
||||||
// 方法
|
// 方法
|
||||||
@@ -382,7 +399,7 @@ const getProducts = async (isLoadMore = false) => {
|
|||||||
loadingMore.value = true
|
loadingMore.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await api.get('/products', {
|
const {data} = await api.get('/products', {
|
||||||
params: {
|
params: {
|
||||||
page: page.value,
|
page: page.value,
|
||||||
limit: 20,
|
limit: 20,
|
||||||
@@ -392,16 +409,28 @@ const getProducts = async (isLoadMore = false) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 确保响应数据是有效的数组
|
||||||
|
const responseProducts = data.data?.products || []
|
||||||
|
|
||||||
if (isLoadMore) {
|
if (isLoadMore) {
|
||||||
products.value.push(...response.data.products)
|
// 确保products.value是数组
|
||||||
|
if (!Array.isArray(products.value)) {
|
||||||
|
products.value = []
|
||||||
|
}
|
||||||
|
products.value.push(...responseProducts)
|
||||||
} else {
|
} else {
|
||||||
products.value = response.data.products
|
products.value = responseProducts
|
||||||
}
|
}
|
||||||
|
|
||||||
hasMore.value = response.data.hasMore
|
hasMore.value = data.data?.hasMore || false
|
||||||
page.value++
|
page.value++
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
console.error('获取商品列表失败:', error)
|
||||||
ElMessage.error('获取商品列表失败')
|
ElMessage.error('获取商品列表失败')
|
||||||
|
// 确保products.value始终是数组
|
||||||
|
if (!isLoadMore && (!products.value || !Array.isArray(products.value))) {
|
||||||
|
products.value = []
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
loadingMore.value = false
|
loadingMore.value = false
|
||||||
@@ -415,13 +444,18 @@ const loadMore = () => {
|
|||||||
const getUserPoints = async () => {
|
const getUserPoints = async () => {
|
||||||
try {
|
try {
|
||||||
const response = await api.get('/user/points')
|
const response = await api.get('/user/points')
|
||||||
userPoints.value = response.data.points
|
userPoints.value = response.data.points || 0
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取用户积分失败:', error)
|
console.error('获取用户积分失败:', error)
|
||||||
|
userPoints.value = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const truncateText = (text, maxLength) => {
|
const truncateText = (text, maxLength) => {
|
||||||
|
// 安全检查:确保text是字符串
|
||||||
|
if (!text || typeof text !== 'string') {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
if (text.length <= maxLength) return text
|
if (text.length <= maxLength) return text
|
||||||
return text.substring(0, maxLength) + '...'
|
return text.substring(0, maxLength) + '...'
|
||||||
}
|
}
|
||||||
@@ -436,7 +470,33 @@ onMounted(() => {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.shop-page {
|
.shop-page {
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background-color: #f5f5f5;
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||||
|
background-attachment: fixed;
|
||||||
|
padding-bottom: 80px;
|
||||||
|
position: relative;
|
||||||
|
/* 移动端优化 */
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-page::before {
|
||||||
|
content: '';
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background:
|
||||||
|
radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.3) 0%, transparent 50%),
|
||||||
|
radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%),
|
||||||
|
radial-gradient(circle at 40% 40%, rgba(120, 119, 198, 0.2) 0%, transparent 50%);
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shop-page > * {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
@@ -445,11 +505,13 @@ onMounted(() => {
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
height: 56px;
|
height: 56px;
|
||||||
background: white;
|
background: rgba(255, 255, 255, 0.95);
|
||||||
border-bottom: 1px solid #eee;
|
backdrop-filter: blur(20px);
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-left,
|
.nav-left,
|
||||||
@@ -471,14 +533,21 @@ onMounted(() => {
|
|||||||
.nav-title {
|
.nav-title {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: 500;
|
font-weight: 800;
|
||||||
color: #333;
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-section {
|
.search-section {
|
||||||
padding: 16px;
|
padding: 20px;
|
||||||
background: white;
|
background: rgba(255, 255, 255, 0.9);
|
||||||
border-bottom: 1px solid #eee;
|
backdrop-filter: blur(10px);
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
margin: 20px 16px 0 16px;
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-input {
|
.search-input {
|
||||||
@@ -486,9 +555,14 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.category-section {
|
.category-section {
|
||||||
background: white;
|
background: rgba(255, 255, 255, 0.9);
|
||||||
padding: 16px 0;
|
backdrop-filter: blur(10px);
|
||||||
border-bottom: 1px solid #eee;
|
padding: 20px 0;
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
margin: 0 16px;
|
||||||
|
border-radius: 16px;
|
||||||
|
margin-top: 16px;
|
||||||
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.category-list {
|
.category-list {
|
||||||
@@ -502,21 +576,33 @@ onMounted(() => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 4px;
|
gap: 6px;
|
||||||
padding: 8px 12px;
|
padding: 12px 16px;
|
||||||
border-radius: 8px;
|
border-radius: 16px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
min-width: 60px;
|
min-width: 70px;
|
||||||
|
background: rgba(248, 250, 252, 0.8);
|
||||||
|
border: 2px solid transparent;
|
||||||
|
/* 移动端触摸优化 */
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
touch-action: manipulation;
|
||||||
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.category-item:hover {
|
.category-item:hover {
|
||||||
background: #f0f9ff;
|
background: rgba(139, 92, 246, 0.1);
|
||||||
|
border-color: rgba(139, 92, 246, 0.3);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 15px rgba(139, 92, 246, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.category-item.active {
|
.category-item.active {
|
||||||
background: #409eff;
|
background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
|
||||||
color: white;
|
color: white;
|
||||||
|
border-color: rgba(255, 255, 255, 0.3);
|
||||||
|
box-shadow: 0 6px 20px rgba(139, 92, 246, 0.4);
|
||||||
|
transform: translateY(-3px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.category-item span {
|
.category-item span {
|
||||||
@@ -524,7 +610,12 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.products-section {
|
.products-section {
|
||||||
padding: 16px;
|
padding: 20px;
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
margin: 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-header {
|
.section-header {
|
||||||
@@ -557,98 +648,183 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.product-card {
|
.product-card {
|
||||||
background: white;
|
background: linear-gradient(135deg, rgba(255, 255, 255, 0.95) 0%, rgba(248, 250, 252, 0.9) 100%);
|
||||||
border-radius: 12px;
|
backdrop-filter: blur(20px);
|
||||||
|
border-radius: 16px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
box-shadow: 0 8px 32px rgba(139, 92, 246, 0.15);
|
||||||
|
border: 1px solid rgba(139, 92, 246, 0.2);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transition: all 0.3s;
|
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
position: relative;
|
||||||
|
/* 移动端触摸优化 */
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
touch-action: manipulation;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: linear-gradient(135deg, rgba(139, 92, 246, 0.08) 0%, rgba(124, 58, 237, 0.06) 100%);
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-card:hover {
|
.product-card:hover {
|
||||||
transform: translateY(-4px);
|
transform: translateY(-8px) scale(1.02);
|
||||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
|
box-shadow: 0 16px 48px rgba(139, 92, 246, 0.25);
|
||||||
|
border-color: rgba(139, 92, 246, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card:hover::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card:active {
|
||||||
|
transform: translateY(-4px) scale(1.01);
|
||||||
|
transition: all 0.1s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-image {
|
.product-image {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 120px;
|
height: 140px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
background: linear-gradient(45deg, #f1f5f9 0%, #e2e8f0 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-image img {
|
.product-image img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
|
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card:hover .product-image img {
|
||||||
|
transform: scale(1.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.discount-badge {
|
.discount-badge {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 8px;
|
top: 12px;
|
||||||
right: 8px;
|
right: 12px;
|
||||||
background: #ff4757;
|
background: linear-gradient(135deg, #ff6b6b 0%, #ff5252 100%);
|
||||||
color: white;
|
color: white;
|
||||||
padding: 2px 6px;
|
padding: 4px 8px;
|
||||||
border-radius: 4px;
|
border-radius: 12px;
|
||||||
font-size: 12px;
|
font-size: 11px;
|
||||||
|
font-weight: 600;
|
||||||
|
box-shadow: 0 2px 8px rgba(255, 107, 107, 0.3);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-info {
|
.product-info {
|
||||||
padding: 12px;
|
padding: 16px;
|
||||||
|
background: rgba(255, 255, 255, 0.9);
|
||||||
|
backdrop-filter: blur(15px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-name {
|
.product-name {
|
||||||
margin: 0 0 4px 0;
|
margin: 0 0 6px 0;
|
||||||
font-size: 14px;
|
font-size: 15px;
|
||||||
font-weight: 500;
|
font-weight: 600;
|
||||||
color: #333;
|
color: #1e293b;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-desc {
|
.product-desc {
|
||||||
margin: 0 0 8px 0;
|
margin: 0 0 12px 0;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #666;
|
color: #64748b;
|
||||||
line-height: 1.4;
|
line-height: 1.5;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-price {
|
.product-price {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.current-price {
|
.current-price {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 2px;
|
gap: 4px;
|
||||||
color: #ff6b35;
|
color: #f59e0b;
|
||||||
font-weight: 600;
|
font-weight: 700;
|
||||||
font-size: 16px;
|
font-size: 17px;
|
||||||
|
background: linear-gradient(135deg, #f59e0b 0%, #f97316 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
}
|
}
|
||||||
|
|
||||||
.original-price {
|
.original-price {
|
||||||
color: #999;
|
color: #94a3b8;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-stats {
|
.product-stats {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
font-size: 12px;
|
font-size: 11px;
|
||||||
color: #999;
|
color: #64748b;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
|
background: rgba(139, 92, 246, 0.08);
|
||||||
|
padding: 6px 10px;
|
||||||
|
border-radius: 8px;
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
border: 1px solid rgba(139, 92, 246, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-actions {
|
.product-actions {
|
||||||
padding: 0 12px 12px;
|
padding: 0 16px 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-actions .el-button {
|
.product-actions .el-button {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
|
||||||
|
border: none;
|
||||||
|
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
|
||||||
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-actions .el-button:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 6px 20px rgba(59, 130, 246, 0.4);
|
||||||
|
background: linear-gradient(135deg, #2563eb 0%, #1e40af 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-actions .el-button:active {
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-actions .el-button:disabled {
|
||||||
|
background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e1 100%);
|
||||||
|
color: #64748b;
|
||||||
|
box-shadow: none;
|
||||||
|
transform: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.empty-state {
|
.empty-state {
|
||||||
@@ -665,18 +841,67 @@ onMounted(() => {
|
|||||||
.cart-fab {
|
.cart-fab {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 80px;
|
bottom: 80px;
|
||||||
right: 20px;
|
right: 40px;
|
||||||
width: 56px;
|
width: 64px;
|
||||||
height: 56px;
|
height: 64px;
|
||||||
background: #409eff;
|
background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
color: white;
|
color: white;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
box-shadow: 0 4px 12px rgba(64, 158, 255, 0.4);
|
box-shadow: 0 8px 25px rgba(139, 92, 246, 0.4);
|
||||||
z-index: 1000;
|
z-index: 9999;
|
||||||
|
/* 移动端触摸优化 */
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
touch-action: manipulation;
|
||||||
|
user-select: none;
|
||||||
|
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border: 2px solid rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-badge {
|
||||||
|
position: absolute;
|
||||||
|
top: -6px;
|
||||||
|
right: -6px;
|
||||||
|
background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
|
||||||
|
color: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 700;
|
||||||
|
box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4);
|
||||||
|
border: 2px solid white;
|
||||||
|
animation: pulse 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes pulse {
|
||||||
|
0% {
|
||||||
|
box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4), 0 0 0 0 rgba(239, 68, 68, 0.7);
|
||||||
|
}
|
||||||
|
70% {
|
||||||
|
box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4), 0 0 0 10px rgba(239, 68, 68, 0);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4), 0 0 0 0 rgba(239, 68, 68, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-fab:hover {
|
||||||
|
transform: scale(1.1);
|
||||||
|
box-shadow: 0 12px 35px rgba(139, 92, 246, 0.5);
|
||||||
|
background: linear-gradient(135deg, #7c3aed 0%, #6d28d9 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-fab:active {
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 6px 20px rgba(139, 92, 246, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
.cart-content {
|
.cart-content {
|
||||||
@@ -752,23 +977,276 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 响应式设计 */
|
/* 响应式设计 */
|
||||||
@media (max-width: 480px) {
|
@media (max-width: 768px) {
|
||||||
|
.navbar {
|
||||||
|
padding: 0 12px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-title {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-btn,
|
||||||
|
.points-btn {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-section {
|
||||||
|
padding: 16px;
|
||||||
|
margin: 16px 12px 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-section {
|
||||||
|
padding: 12px 0;
|
||||||
|
margin: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-list {
|
||||||
|
padding: 0 12px;
|
||||||
|
gap: 12px;
|
||||||
|
overflow-x: auto;
|
||||||
|
scrollbar-width: none;
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-list::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-item {
|
||||||
|
min-width: 60px;
|
||||||
|
padding: 8px 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-item span {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.products-section {
|
||||||
|
padding: 16px;
|
||||||
|
margin: 16px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-header h3 {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sort-btn {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
.products-grid {
|
.products-grid {
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-card {
|
.product-card {
|
||||||
display: flex;
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card:hover {
|
||||||
|
transform: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-image {
|
.product-image {
|
||||||
width: 120px;
|
|
||||||
height: 120px;
|
height: 120px;
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.product-info {
|
.product-info {
|
||||||
flex: 1;
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-name {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-desc {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.current-price {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-fab {
|
||||||
|
bottom: 70px;
|
||||||
|
right: 16px;
|
||||||
|
width: 56px;
|
||||||
|
height: 56px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.navbar {
|
||||||
|
padding: 0 10px;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-title {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-section {
|
||||||
|
margin: 12px 8px 0 8px;
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-section {
|
||||||
|
margin: 8px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.products-section {
|
||||||
|
margin: 12px 8px;
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.products-grid {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card {
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-image {
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-info {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-name {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-desc {
|
||||||
|
font-size: 10px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.current-price {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-stats {
|
||||||
|
font-size: 10px;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-actions {
|
||||||
|
padding: 0 10px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-actions .el-button {
|
||||||
|
font-size: 12px;
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-fab {
|
||||||
|
bottom: 60px;
|
||||||
|
right: 12px;
|
||||||
|
width: 52px;
|
||||||
|
height: 52px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-item {
|
||||||
|
padding: 12px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-image {
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-info h4 {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-price {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.total-points {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 360px) {
|
||||||
|
.navbar {
|
||||||
|
padding: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-section {
|
||||||
|
margin: 8px 6px 0 6px;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-section {
|
||||||
|
margin: 6px;
|
||||||
|
padding: 6px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.products-section {
|
||||||
|
margin: 8px 6px;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-list {
|
||||||
|
padding: 0 8px;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.category-item {
|
||||||
|
min-width: 50px;
|
||||||
|
padding: 6px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.products-grid {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card {
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-image {
|
||||||
|
height: 85px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-info {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-name {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.current-price {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-actions {
|
||||||
|
padding: 0 8px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-actions .el-button {
|
||||||
|
height: 32px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cart-fab {
|
||||||
|
right: 8px;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
Reference in New Issue
Block a user