门店端:完整登录体系、storesApi集成、Home.vue修复
This commit is contained in:
parent
cbc2f0f95b
commit
f1f290cd1d
|
|
@ -1 +0,0 @@
|
|||
.home-page[data-v-cf2eec66]{min-height:100vh;background:#f7f7f7}.home-header[data-v-cf2eec66]{position:sticky;top:0;z-index:10;background:#fff;padding:16px 16px 14px;display:flex;align-items:center;justify-content:space-between;border-bottom:.5px solid rgba(0,0,0,.06)}.header-left[data-v-cf2eec66]{display:flex;align-items:center;gap:10px}.store-avatar[data-v-cf2eec66]{width:44px;height:44px;background:#fff4e0;border-radius:22px;display:flex;align-items:center;justify-content:center;font-size:22px}.store-name[data-v-cf2eec66]{font-size:17px;font-weight:600;color:#1a1a1a}.store-sub[data-v-cf2eec66]{font-size:12px;color:#b2b2b2;margin-top:2px}.header-badge[data-v-cf2eec66]{background:#e8f8ee;color:#ff6b00;font-size:11px;font-weight:500;padding:3px 10px;border-radius:10px}.quick-nav[data-v-cf2eec66]{display:flex;gap:10px;padding:16px 16px 12px;background:#fff}.nav-card[data-v-cf2eec66]{flex:1;background:#f7f7f7;border-radius:16px;padding:14px 8px 12px;text-align:center;text-decoration:none;display:flex;flex-direction:column;align-items:center;gap:8px}.nav-icon-box[data-v-cf2eec66]{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center}.nav-label[data-v-cf2eec66]{font-size:12px;color:#666}.section[data-v-cf2eec66]{margin:0 12px 12px;background:#fff;border-radius:16px;overflow:hidden}.section-header[data-v-cf2eec66]{display:flex;justify-content:space-between;align-items:center;padding:16px 16px 12px}.section-title[data-v-cf2eec66]{font-size:16px;font-weight:600;color:#1a1a1a}.section-more[data-v-cf2eec66]{font-size:12px;color:#b2b2b2}.stat-grid[data-v-cf2eec66]{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;padding:0 16px 16px;gap:8px}.stat-card[data-v-cf2eec66]{background:#f7f7f7;border-radius:12px;padding:14px 4px 12px;text-align:center}.stat-num[data-v-cf2eec66]{font-size:24px;font-weight:700;line-height:1}.stat-label[data-v-cf2eec66]{font-size:10px;color:#b2b2b2;margin-top:6px}.order-list[data-v-cf2eec66]{padding:0 4px}.loading-tip[data-v-cf2eec66],.empty-tip[data-v-cf2eec66]{padding:24px;text-align:center;color:#b2b2b2;font-size:13px}.order-item[data-v-cf2eec66]{display:flex;justify-content:space-between;align-items:center;padding:14px 12px;border-top:.5px solid #F0F0F0}.order-customer[data-v-cf2eec66]{font-size:14px;color:#1a1a1a;font-weight:500}.order-vehicle[data-v-cf2eec66]{font-size:11px;color:#b2b2b2;margin-top:4px}.order-status[data-v-cf2eec66]{font-size:12px;padding:3px 10px;border-radius:12px;flex-shrink:0}.status-renting[data-v-cf2eec66]{background:#e8f8ee;color:#ff6b00}.status-ok[data-v-cf2eec66]{background:#f0f0f0;color:#999}.status-warning[data-v-cf2eec66]{background:#fff0e8;color:#ff6b35}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.home-page[data-v-efbd3ab6]{min-height:100vh;background:#f7f7f7}.home-header[data-v-efbd3ab6]{position:sticky;top:0;z-index:10;background:#fff;padding:16px 16px 14px;display:flex;align-items:center;justify-content:space-between;border-bottom:.5px solid rgba(0,0,0,.06)}.header-left[data-v-efbd3ab6]{display:flex;align-items:center;gap:10px}.store-avatar[data-v-efbd3ab6]{width:44px;height:44px;background:#fff4e0;border-radius:22px;display:flex;align-items:center;justify-content:center;font-size:22px}.store-name[data-v-efbd3ab6]{font-size:17px;font-weight:600;color:#1a1a1a}.store-sub[data-v-efbd3ab6]{font-size:12px;color:#b2b2b2;margin-top:2px}.header-badge[data-v-efbd3ab6]{background:#e8f8ee;color:#ff6b00;font-size:11px;font-weight:500;padding:3px 10px;border-radius:10px}.quick-nav[data-v-efbd3ab6]{display:flex;gap:10px;padding:16px 16px 12px;background:#fff}.nav-card[data-v-efbd3ab6]{flex:1;background:#f7f7f7;border-radius:16px;padding:14px 8px 12px;text-align:center;text-decoration:none;display:flex;flex-direction:column;align-items:center;gap:8px}.nav-icon-box[data-v-efbd3ab6]{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center}.nav-label[data-v-efbd3ab6]{font-size:12px;color:#666}.section[data-v-efbd3ab6]{margin:0 12px 12px;background:#fff;border-radius:16px;overflow:hidden}.section-header[data-v-efbd3ab6]{display:flex;justify-content:space-between;align-items:center;padding:16px 16px 12px}.section-title[data-v-efbd3ab6]{font-size:16px;font-weight:600;color:#1a1a1a}.section-more[data-v-efbd3ab6]{font-size:12px;color:#b2b2b2}.stat-grid[data-v-efbd3ab6]{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;padding:0 16px 16px;gap:8px}.stat-card[data-v-efbd3ab6]{background:#f7f7f7;border-radius:12px;padding:14px 4px 12px;text-align:center}.stat-num[data-v-efbd3ab6]{font-size:24px;font-weight:700;line-height:1}.stat-label[data-v-efbd3ab6]{font-size:10px;color:#b2b2b2;margin-top:6px}.order-list[data-v-efbd3ab6]{padding:0 4px}.loading-tip[data-v-efbd3ab6],.empty-tip[data-v-efbd3ab6]{padding:24px;text-align:center;color:#b2b2b2;font-size:13px}.order-item[data-v-efbd3ab6]{display:flex;justify-content:space-between;align-items:center;padding:14px 12px;border-top:.5px solid #F0F0F0}.order-customer[data-v-efbd3ab6]{font-size:14px;color:#1a1a1a;font-weight:500}.order-vehicle[data-v-efbd3ab6]{font-size:11px;color:#b2b2b2;margin-top:4px}.order-status[data-v-efbd3ab6]{font-size:12px;padding:3px 10px;border-radius:12px;flex-shrink:0}.status-renting[data-v-efbd3ab6]{background:#e8f8ee;color:#ff6b00}.status-ok[data-v-efbd3ab6]{background:#f0f0f0;color:#999}.status-warning[data-v-efbd3ab6]{background:#fff0e8;color:#ff6b35}
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{o as h,v as y}from"./api-CXZzdW5u.js";import{_ as F,e as b,o as i,c as r,a as t,t as l,b as c,w as v,f as k,F as x,g as O,h as u,r as w,i as S,n as B}from"./index-DH2ZjwZR.js";const V={class:"home-page"},E={class:"home-header"},C={class:"header-left"},I={class:"store-name"},N={class:"quick-nav"},$={class:"section"},z={class:"stat-grid"},T={class:"stat-card"},A={class:"stat-num",style:{color:"#FF6B00"}},D={class:"stat-card"},H={class:"stat-num",style:{color:"#576BFF"}},M={class:"stat-card"},j={class:"stat-num",style:{color:"#FF6B35"}},q={class:"stat-card"},L={class:"stat-num",style:{color:"#333"}},G={class:"section"},J={class:"section-header"},K={class:"order-list"},P={key:0,class:"loading-tip"},Q={key:1,class:"empty-tip"},R={class:"order-left"},U={class:"order-customer"},W={class:"order-vehicle"},X={__name:"Home",setup(Y){const m=u({}),d=u([]),_=u(!0),n=u({totalOrders:0,rentingOrders:0,warningOrders:0,totalVehicles:0}),g=e=>({renting:"status-renting",returned:"status-ok",overdue:"status-warning"})[e]||"",p=e=>({renting:"在租",returned:"已还",overdue:"逾期",pending:"待处理"})[e]||e,f=e=>{if(!e)return"-";const s=new Date(e);return`${s.getMonth()+1}/${s.getDate()} ${s.getHours().toString().padStart(2,"0")}:${s.getMinutes().toString().padStart(2,"0")}`};return b(async()=>{const e=localStorage.getItem("storeId")||"demo-store";if(m.value={name:"示例门店"},e!=="demo-store")try{const a=await(await fetch(`/api/stores/${e}`)).json();a.name&&(m.value=a)}catch{}try{const s=await h.list({storeId:e,limit:5});d.value=s.data.data||s.data||[];const a=s.data.data||s.data||[];n.value.totalOrders=a.length,n.value.rentingOrders=a.filter(o=>o.status==="renting").length,n.value.warningOrders=a.filter(o=>o.status==="overdue").length}catch{d.value=[]}_.value=!1;try{const s=await y.list({storeId:e,limit:100}),a=s.data.data||s.data||[];n.value.totalVehicles=a.length}catch{}}),(e,s)=>{const a=w("router-link");return i(),r("div",V,[t("div",E,[t("div",C,[s[1]||(s[1]=t("div",{class:"store-avatar"},"🚲",-1)),t("div",null,[t("div",I,l(m.value.name||"加载中..."),1),s[0]||(s[0]=t("div",{class:"store-sub"},"门店端",-1))])]),s[2]||(s[2]=t("div",{class:"header-badge"},"营业中",-1))]),t("div",N,[c(a,{to:"/vehicle-types",class:"nav-card"},{default:v(()=>[...s[3]||(s[3]=[t("div",{class:"nav-icon-box",style:{background:"#E8F8EE"}},[t("span",{style:{"font-size":"20px"}},"🚗")],-1),t("div",{class:"nav-label"},"车型管理",-1)])]),_:1}),c(a,{to:"/vehicles",class:"nav-card"},{default:v(()=>[...s[4]||(s[4]=[t("div",{class:"nav-icon-box",style:{background:"#FFF4E0"}},[t("span",{style:{"font-size":"20px"}},"🏍️")],-1),t("div",{class:"nav-label"},"车辆管理",-1)])]),_:1}),c(a,{to:"/orders",class:"nav-card"},{default:v(()=>[...s[5]||(s[5]=[t("div",{class:"nav-icon-box",style:{background:"#E8F0FF"}},[t("span",{style:{"font-size":"20px"}},"📋")],-1),t("div",{class:"nav-label"},"订单管理",-1)])]),_:1})]),t("div",$,[s[10]||(s[10]=t("div",{class:"section-header"},[t("div",{class:"section-title"},"今日概览"),t("div",{class:"section-more"},"实时数据")],-1)),t("div",z,[t("div",T,[t("div",A,l(n.value.totalOrders),1),s[6]||(s[6]=t("div",{class:"stat-label"},"总订单",-1))]),t("div",D,[t("div",H,l(n.value.rentingOrders),1),s[7]||(s[7]=t("div",{class:"stat-label"},"在租订单",-1))]),t("div",M,[t("div",j,l(n.value.warningOrders),1),s[8]||(s[8]=t("div",{class:"stat-label"},"预警订单",-1))]),t("div",q,[t("div",L,l(n.value.totalVehicles),1),s[9]||(s[9]=t("div",{class:"stat-label"},"车辆总数",-1))])])]),t("div",G,[t("div",J,[s[12]||(s[12]=t("div",{class:"section-title"},"最近订单",-1)),c(a,{to:"/orders",class:"section-more",style:{color:"#FF6B00"}},{default:v(()=>[...s[11]||(s[11]=[S("查看全部 ›",-1)])]),_:1})]),t("div",K,[_.value?(i(),r("div",P,"加载中...")):d.value.length===0?(i(),r("div",Q,"暂无订单")):k("",!0),(i(!0),r(x,null,O(d.value,o=>(i(),r("div",{key:o._id,class:"order-item"},[t("div",R,[t("div",U,l(o.customerName||"客户"),1),t("div",W,l(o.vehicleType||"车型")+" · "+l(f(o.createdAt)),1)]),t("div",{class:B(["order-status",g(o.status)])},l(p(o.status)),3)]))),128))])])])}}},ts=F(X,[["__scopeId","data-v-cf2eec66"]]);export{ts as default};
|
||||
|
|
@ -0,0 +1 @@
|
|||
import{s as f,o as y,v as b}from"./api-r_HoetOt.js";import{_ as F,h as k,o as i,c as r,a as t,t as l,b as c,d as v,i as x,F as O,j as w,r as u,g as S,k as B,n as V}from"./index-D6NGLDyM.js";import"./index-42ANG6Sg.js";const E={class:"home-page"},C={class:"home-header"},I={class:"header-left"},N={class:"store-name"},z={class:"quick-nav"},A={class:"section"},T={class:"stat-grid"},$={class:"stat-card"},D={class:"stat-num",style:{color:"#FF6B00"}},H={class:"stat-card"},M={class:"stat-num",style:{color:"#576BFF"}},j={class:"stat-card"},q={class:"stat-num",style:{color:"#FF6B35"}},L={class:"stat-card"},G={class:"stat-num",style:{color:"#333"}},J={class:"section"},K={class:"section-header"},P={class:"order-list"},Q={key:0,class:"loading-tip"},R={key:1,class:"empty-tip"},U={class:"order-left"},W={class:"order-customer"},X={class:"order-vehicle"},Y={__name:"Home",setup(Z){const m=u({}),d=u([]),_=u(!0),n=u({totalOrders:0,rentingOrders:0,warningOrders:0,totalVehicles:0}),g=e=>({renting:"status-renting",returned:"status-ok",overdue:"status-warning"})[e]||"",p=e=>({renting:"在租",returned:"已还",overdue:"逾期",pending:"待处理"})[e]||e,h=e=>{if(!e)return"-";const s=new Date(e);return`${s.getMonth()+1}/${s.getDate()} ${s.getHours().toString().padStart(2,"0")}:${s.getMinutes().toString().padStart(2,"0")}`};return k(async()=>{const e=localStorage.getItem("storeId")||"demo-store";if(m.value={name:"示例门店"},e!=="demo-store")try{const s=await f.getStore(e);s.data.success&&s.data.data&&(m.value=s.data.data)}catch{}try{const s=await y.list({storeId:e,limit:5}),a=s.data.data||s.data||[];d.value=a,n.value.totalOrders=a.length,n.value.rentingOrders=a.filter(o=>o.status==="进行中"||o.status==="在租").length,n.value.warningOrders=a.filter(o=>o.status==="逾期").length}catch{d.value=[]}_.value=!1;try{const s=await b.list({storeId:e,limit:100}),a=s.data.data||s.data||[];n.value.totalVehicles=a.length}catch{}}),(e,s)=>{const a=S("router-link");return i(),r("div",E,[t("div",C,[t("div",I,[s[1]||(s[1]=t("div",{class:"store-avatar"},"🚲",-1)),t("div",null,[t("div",N,l(m.value.name||"加载中..."),1),s[0]||(s[0]=t("div",{class:"store-sub"},"门店端",-1))])]),s[2]||(s[2]=t("div",{class:"header-badge"},"营业中",-1))]),t("div",z,[c(a,{to:"/vehicle-types",class:"nav-card"},{default:v(()=>[...s[3]||(s[3]=[t("div",{class:"nav-icon-box",style:{background:"#E8F8EE"}},[t("span",{style:{"font-size":"20px"}},"🚗")],-1),t("div",{class:"nav-label"},"车型管理",-1)])]),_:1}),c(a,{to:"/vehicles",class:"nav-card"},{default:v(()=>[...s[4]||(s[4]=[t("div",{class:"nav-icon-box",style:{background:"#FFF4E0"}},[t("span",{style:{"font-size":"20px"}},"🏍️")],-1),t("div",{class:"nav-label"},"车辆管理",-1)])]),_:1}),c(a,{to:"/orders",class:"nav-card"},{default:v(()=>[...s[5]||(s[5]=[t("div",{class:"nav-icon-box",style:{background:"#E8F0FF"}},[t("span",{style:{"font-size":"20px"}},"📋")],-1),t("div",{class:"nav-label"},"订单管理",-1)])]),_:1})]),t("div",A,[s[10]||(s[10]=t("div",{class:"section-header"},[t("div",{class:"section-title"},"今日概览"),t("div",{class:"section-more"},"实时数据")],-1)),t("div",T,[t("div",$,[t("div",D,l(n.value.totalOrders),1),s[6]||(s[6]=t("div",{class:"stat-label"},"总订单",-1))]),t("div",H,[t("div",M,l(n.value.rentingOrders),1),s[7]||(s[7]=t("div",{class:"stat-label"},"在租订单",-1))]),t("div",j,[t("div",q,l(n.value.warningOrders),1),s[8]||(s[8]=t("div",{class:"stat-label"},"预警订单",-1))]),t("div",L,[t("div",G,l(n.value.totalVehicles),1),s[9]||(s[9]=t("div",{class:"stat-label"},"车辆总数",-1))])])]),t("div",J,[t("div",K,[s[12]||(s[12]=t("div",{class:"section-title"},"最近订单",-1)),c(a,{to:"/orders",class:"section-more",style:{color:"#FF6B00"}},{default:v(()=>[...s[11]||(s[11]=[B("查看全部 ›",-1)])]),_:1})]),t("div",P,[_.value?(i(),r("div",Q,"加载中...")):d.value.length===0?(i(),r("div",R,"暂无订单")):x("",!0),(i(!0),r(O,null,w(d.value,o=>(i(),r("div",{key:o._id,class:"order-item"},[t("div",U,[t("div",W,l(o.customerName||"客户"),1),t("div",X,l(o.vehicleType||"车型")+" · "+l(h(o.createdAt)),1)]),t("div",{class:V(["order-status",g(o.status)])},l(p(o.status)),3)]))),128))])])])}}},as=F(Y,[["__scopeId","data-v-efbd3ab6"]]);export{as as default};
|
||||
|
|
@ -0,0 +1 @@
|
|||
.login-page[data-v-e2f0562e]{min-height:100vh;background:#f7f7f7;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px}.login-header[data-v-e2f0562e]{text-align:center;color:#1a1a1a;margin-bottom:40px}.logo[data-v-e2f0562e]{font-size:64px;margin-bottom:10px}.login-header h1[data-v-e2f0562e]{font-size:28px;margin-bottom:8px;font-weight:600;color:#1a1a1a}.login-header p[data-v-e2f0562e]{font-size:13px;color:#b2b2b2}.login-form[data-v-e2f0562e]{width:100%;max-width:360px;background:#fff;border-radius:16px;padding:30px;box-shadow:0 2px 12px #0000000f}.form-item[data-v-e2f0562e]{margin-bottom:16px}.form-item input[data-v-e2f0562e]{width:100%;padding:14px 16px;background:#f7f7f7;border:none;border-radius:12px;font-size:15px;color:#1a1a1a;outline:none;box-sizing:border-box}.form-item input[data-v-e2f0562e]::placeholder{color:#b2b2b2}.login-btn[data-v-e2f0562e]{width:100%;background:#ff6b00;border:none;font-size:18px;border-radius:12px;height:48px;color:#fff;cursor:pointer;margin-top:8px}.login-btn[data-v-e2f0562e]:active{opacity:.8}.demo-hint[data-v-e2f0562e]{text-align:center;color:#b2b2b2;font-size:12px;margin-top:20px}
|
||||
|
|
@ -0,0 +1 @@
|
|||
import{_ as m,o as p,c,a as e,w as n,v as r,r as d,u as v}from"./index-D6NGLDyM.js";import{a as g}from"./index-42ANG6Sg.js";const f={class:"login-page"},_={class:"login-form"},w={class:"form-item"},h={class:"form-item"},I=["loading"],k={__name:"Login",setup(x){const i=v(),t=d(!1),s=d({username:"",password:""}),u=async()=>{if(!s.value.username||!s.value.password){alert("请输入账号和密码");return}t.value=!0;try{const a=await g.post("/api/store-auth/login",{username:s.value.username,password:s.value.password});a.data.success&&a.data.data.token?(localStorage.setItem("token",a.data.data.token),localStorage.setItem("storeInfo",JSON.stringify(a.data.data)),localStorage.setItem("storeId",a.data.data.id||a.data.data.storeId||s.value.username),i.push("/")):alert(a.data.message||"登录失败")}catch(a){alert(a.response?.data?.message||"登录失败,请检查账号密码")}finally{t.value=!1}};return(a,o)=>(p(),c("div",f,[o[3]||(o[3]=e("div",{class:"login-header"},[e("div",{class:"logo"},"🏪"),e("h1",null,"门店管理"),e("p",null,"51租 · 商家端")],-1)),e("div",_,[e("div",w,[n(e("input",{"onUpdate:modelValue":o[0]||(o[0]=l=>s.value.username=l),placeholder:"请输入账号",size:"large"},null,512),[[r,s.value.username]])]),e("div",h,[n(e("input",{"onUpdate:modelValue":o[1]||(o[1]=l=>s.value.password=l),type:"password",placeholder:"请输入密码",size:"large"},null,512),[[r,s.value.password]])]),e("button",{class:"login-btn",loading:t.value,onClick:u}," 登录 ",8,I),o[2]||(o[2]=e("div",{class:"demo-hint"},[e("p",null,"演示账号:store_demo / demo123")],-1))])]))}},B=m(k,[["__scopeId","data-v-e2f0562e"]]);export{B as default};
|
||||
|
|
@ -0,0 +1 @@
|
|||
import{_ as w,h as y,o as u,c,a as s,t as m,e as S,l as x,w as d,v as i,i as _,r as v,u as C}from"./index-D6NGLDyM.js";import{s as p}from"./api-r_HoetOt.js";import"./index-42ANG6Sg.js";const V={class:"page"},D={class:"mine-header"},M={class:"header-info"},F={class:"info-text"},U={class:"store-name"},B={class:"store-id"},E={class:"dialog"},N={class:"dialog-body"},$={class:"form-item"},h={class:"form-item"},A={class:"form-item"},L={class:"form-item"},R={class:"dialog-footer"},T={__name:"Mine",setup(j){const r=localStorage.getItem("storeId")||"demo-store",t=v({}),a=v(!1),o=v({}),f=async()=>{try{const n=await p.getStore(r);t.value=n.data||{}}catch{t.value={name:"示例门店"}}},g=()=>{o.value={...t.value},a.value=!0},I=async()=>{try{await p.updateStore(r,o.value),t.value={...o.value},a.value=!1}catch{alert("保存失败")}},b=C(),k=()=>{confirm("确定退出登录?")&&(localStorage.removeItem("token"),localStorage.removeItem("storeInfo"),localStorage.removeItem("storeId"),b.push("/login"))};return y(f),(n,e)=>(u(),c("div",V,[s("div",D,[s("div",M,[e[6]||(e[6]=s("div",{class:"avatar-box"},"🏪",-1)),s("div",F,[s("div",U,m(t.value.name||"加载中..."),1),s("div",B,"ID: "+m(S(r)),1)])])]),s("div",{class:"card-section"},[s("div",{class:"card-row",onClick:g},[...e[7]||(e[7]=[s("div",{class:"card-left"},[s("span",{class:"card-icon"},"🏢"),s("span",{class:"card-text"},"门店信息")],-1),s("span",{class:"card-arrow"},"›",-1)])]),e[9]||(e[9]=s("div",{class:"card-divider"},null,-1)),s("div",{class:"card-row",onClick:k},[...e[8]||(e[8]=[s("div",{class:"card-left"},[s("span",{class:"card-icon"},"🚪"),s("span",{class:"card-text",style:{color:"#FF4D4F"}},"退出登录")],-1)])])]),a.value?(u(),c("div",{key:0,class:"dialog-overlay",onClick:e[5]||(e[5]=x(l=>a.value=!1,["self"]))},[s("div",E,[e[14]||(e[14]=s("div",{class:"dialog-handle"},null,-1)),e[15]||(e[15]=s("div",{class:"dialog-title"},"编辑门店信息",-1)),s("div",N,[s("div",$,[e[10]||(e[10]=s("label",null,"门店名称",-1)),d(s("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>o.value.name=l),placeholder:"请输入门店名称"},null,512),[[i,o.value.name]])]),s("div",h,[e[11]||(e[11]=s("label",null,"联系人",-1)),d(s("input",{"onUpdate:modelValue":e[1]||(e[1]=l=>o.value.contact=l),placeholder:"请输入联系人"},null,512),[[i,o.value.contact]])]),s("div",A,[e[12]||(e[12]=s("label",null,"联系电话",-1)),d(s("input",{"onUpdate:modelValue":e[2]||(e[2]=l=>o.value.phone=l),placeholder:"请输入联系电话"},null,512),[[i,o.value.phone]])]),s("div",L,[e[13]||(e[13]=s("label",null,"地址",-1)),d(s("input",{"onUpdate:modelValue":e[3]||(e[3]=l=>o.value.address=l),placeholder:"请输入地址"},null,512),[[i,o.value.address]])])]),s("div",R,[s("button",{class:"btn-cancel",onClick:e[4]||(e[4]=l=>a.value=!1)},"取消"),s("button",{class:"btn-confirm",onClick:I},"保存")])])])):_("",!0)]))}},H=w(T,[["__scopeId","data-v-9cd886ea"]]);export{H as default};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{_ as k,e as y,o as u,c,a as s,t as m,u as x,j as I,k as n,v as i,f as S,h as v}from"./index-DH2ZjwZR.js";import{s as p}from"./api-CXZzdW5u.js";const _={class:"page"},C={class:"mine-header"},V={class:"header-info"},D={class:"info-text"},M={class:"store-name"},F={class:"store-id"},U={class:"dialog"},B={class:"dialog-body"},E={class:"form-item"},N={class:"form-item"},$={class:"form-item"},j={class:"form-item"},A={class:"dialog-footer"},L={__name:"Mine",setup(T){const r=localStorage.getItem("storeId")||"demo-store",t=v({}),a=v(!1),o=v({}),f=async()=>{try{const d=await p.getStore(r);t.value=d.data||{}}catch{t.value={name:"示例门店"}}},g=()=>{o.value={...t.value},a.value=!0},b=async()=>{try{await p.updateStore(r,o.value),t.value={...o.value},a.value=!1}catch{alert("保存失败")}},w=()=>{confirm("确定退出登录?")&&(localStorage.removeItem("storeId"),window.location.reload())};return y(f),(d,l)=>(u(),c("div",_,[s("div",C,[s("div",V,[l[6]||(l[6]=s("div",{class:"avatar-box"},"🏪",-1)),s("div",D,[s("div",M,m(t.value.name||"加载中..."),1),s("div",F,"ID: "+m(x(r)),1)])])]),s("div",{class:"card-section"},[s("div",{class:"card-row",onClick:g},[...l[7]||(l[7]=[s("div",{class:"card-left"},[s("span",{class:"card-icon"},"🏢"),s("span",{class:"card-text"},"门店信息")],-1),s("span",{class:"card-arrow"},"›",-1)])]),l[9]||(l[9]=s("div",{class:"card-divider"},null,-1)),s("div",{class:"card-row",onClick:w},[...l[8]||(l[8]=[s("div",{class:"card-left"},[s("span",{class:"card-icon"},"🚪"),s("span",{class:"card-text",style:{color:"#FF4D4F"}},"退出登录")],-1)])])]),a.value?(u(),c("div",{key:0,class:"dialog-overlay",onClick:l[5]||(l[5]=I(e=>a.value=!1,["self"]))},[s("div",U,[l[14]||(l[14]=s("div",{class:"dialog-handle"},null,-1)),l[15]||(l[15]=s("div",{class:"dialog-title"},"编辑门店信息",-1)),s("div",B,[s("div",E,[l[10]||(l[10]=s("label",null,"门店名称",-1)),n(s("input",{"onUpdate:modelValue":l[0]||(l[0]=e=>o.value.name=e),placeholder:"请输入门店名称"},null,512),[[i,o.value.name]])]),s("div",N,[l[11]||(l[11]=s("label",null,"联系人",-1)),n(s("input",{"onUpdate:modelValue":l[1]||(l[1]=e=>o.value.contact=e),placeholder:"请输入联系人"},null,512),[[i,o.value.contact]])]),s("div",$,[l[12]||(l[12]=s("label",null,"联系电话",-1)),n(s("input",{"onUpdate:modelValue":l[2]||(l[2]=e=>o.value.phone=e),placeholder:"请输入联系电话"},null,512),[[i,o.value.phone]])]),s("div",j,[l[13]||(l[13]=s("label",null,"地址",-1)),n(s("input",{"onUpdate:modelValue":l[3]||(l[3]=e=>o.value.address=e),placeholder:"请输入地址"},null,512),[[i,o.value.address]])])]),s("div",A,[s("button",{class:"btn-cancel",onClick:l[4]||(l[4]=e=>a.value=!1)},"取消"),s("button",{class:"btn-confirm",onClick:b},"保存")])])])):S("",!0)]))}},z=k(L,[["__scopeId","data-v-999dd477"]]);export{z as default};
|
||||
|
|
@ -1 +0,0 @@
|
|||
.page[data-v-999dd477]{min-height:100vh;background:#f7f7f7;padding-bottom:20px}.mine-header[data-v-999dd477]{position:sticky;top:0;z-index:10;background:#fff;padding:28px 16px 24px;border-bottom:.5px solid rgba(0,0,0,.06)}.header-info[data-v-999dd477]{display:flex;align-items:center;gap:14px}.avatar-box[data-v-999dd477]{width:60px;height:60px;background:#fff4e0;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:30px}.info-text[data-v-999dd477]{flex:1}.store-name[data-v-999dd477]{font-size:20px;font-weight:600;color:#1a1a1a}.store-id[data-v-999dd477]{font-size:12px;color:#b2b2b2;margin-top:4px}.card-section[data-v-999dd477]{margin:12px;background:#fff;border-radius:16px;overflow:hidden}.card-row[data-v-999dd477]{display:flex;align-items:center;justify-content:space-between;padding:16px}.card-left[data-v-999dd477]{display:flex;align-items:center;gap:10px}.card-icon[data-v-999dd477]{font-size:18px}.card-text[data-v-999dd477]{font-size:15px;color:#1a1a1a}.card-arrow[data-v-999dd477]{font-size:20px;color:#d1d1d6}.card-divider[data-v-999dd477]{height:.5px;background:#f0f0f0;margin:0 16px}.dialog-overlay[data-v-999dd477]{position:fixed;inset:0;background:#0006;display:flex;align-items:flex-end;z-index:200}.dialog[data-v-999dd477]{background:#fff;width:100%;border-radius:20px 20px 0 0;padding-bottom:calc(16px + env(safe-area-inset-bottom))}.dialog-handle[data-v-999dd477]{width:36px;height:4px;background:#ddd;border-radius:2px;margin:10px auto 0}.dialog-title[data-v-999dd477]{text-align:center;font-size:17px;font-weight:600;color:#1a1a1a;padding:18px 16px 14px}.dialog-body[data-v-999dd477]{padding:0 16px 16px;max-height:60vh;overflow-y:auto}.form-item[data-v-999dd477]{margin-bottom:14px}.form-item label[data-v-999dd477]{display:block;font-size:13px;color:#8e8e93;margin-bottom:8px}.form-item input[data-v-999dd477]{width:100%;padding:12px 14px;background:#f7f7f7;border:none;border-radius:10px;font-size:15px;color:#1a1a1a;outline:none;box-sizing:border-box}.form-item input[data-v-999dd477]::placeholder{color:#b2b2b2}.dialog-footer[data-v-999dd477]{display:flex;gap:12px;padding:0 16px}.btn-cancel[data-v-999dd477],.btn-confirm[data-v-999dd477]{flex:1;padding:13px;border-radius:24px;font-size:16px;font-weight:500;cursor:pointer;border:none}.btn-cancel[data-v-999dd477]{background:#f0f0f0;color:#666}.btn-confirm[data-v-999dd477]{background:#ff6b00;color:#fff}
|
||||
|
|
@ -0,0 +1 @@
|
|||
.page[data-v-9cd886ea]{min-height:100vh;background:#f7f7f7;padding-bottom:20px}.mine-header[data-v-9cd886ea]{position:sticky;top:0;z-index:10;background:#fff;padding:28px 16px 24px;border-bottom:.5px solid rgba(0,0,0,.06)}.header-info[data-v-9cd886ea]{display:flex;align-items:center;gap:14px}.avatar-box[data-v-9cd886ea]{width:60px;height:60px;background:#fff4e0;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:30px}.info-text[data-v-9cd886ea]{flex:1}.store-name[data-v-9cd886ea]{font-size:20px;font-weight:600;color:#1a1a1a}.store-id[data-v-9cd886ea]{font-size:12px;color:#b2b2b2;margin-top:4px}.card-section[data-v-9cd886ea]{margin:12px;background:#fff;border-radius:16px;overflow:hidden}.card-row[data-v-9cd886ea]{display:flex;align-items:center;justify-content:space-between;padding:16px}.card-left[data-v-9cd886ea]{display:flex;align-items:center;gap:10px}.card-icon[data-v-9cd886ea]{font-size:18px}.card-text[data-v-9cd886ea]{font-size:15px;color:#1a1a1a}.card-arrow[data-v-9cd886ea]{font-size:20px;color:#d1d1d6}.card-divider[data-v-9cd886ea]{height:.5px;background:#f0f0f0;margin:0 16px}.dialog-overlay[data-v-9cd886ea]{position:fixed;inset:0;background:#0006;display:flex;align-items:flex-end;z-index:200}.dialog[data-v-9cd886ea]{background:#fff;width:100%;border-radius:20px 20px 0 0;padding-bottom:calc(16px + env(safe-area-inset-bottom))}.dialog-handle[data-v-9cd886ea]{width:36px;height:4px;background:#ddd;border-radius:2px;margin:10px auto 0}.dialog-title[data-v-9cd886ea]{text-align:center;font-size:17px;font-weight:600;color:#1a1a1a;padding:18px 16px 14px}.dialog-body[data-v-9cd886ea]{padding:0 16px 16px;max-height:60vh;overflow-y:auto}.form-item[data-v-9cd886ea]{margin-bottom:14px}.form-item label[data-v-9cd886ea]{display:block;font-size:13px;color:#8e8e93;margin-bottom:8px}.form-item input[data-v-9cd886ea]{width:100%;padding:12px 14px;background:#f7f7f7;border:none;border-radius:10px;font-size:15px;color:#1a1a1a;outline:none;box-sizing:border-box}.form-item input[data-v-9cd886ea]::placeholder{color:#b2b2b2}.dialog-footer[data-v-9cd886ea]{display:flex;gap:12px;padding:0 16px}.btn-cancel[data-v-9cd886ea],.btn-confirm[data-v-9cd886ea]{flex:1;padding:13px;border-radius:24px;font-size:16px;font-weight:500;cursor:pointer;border:none}.btn-cancel[data-v-9cd886ea]{background:#f0f0f0;color:#666}.btn-confirm[data-v-9cd886ea]{background:#ff6b00;color:#fff}
|
||||
|
|
@ -1 +0,0 @@
|
|||
.page[data-v-8ae6e53c]{min-height:100vh;background:#f7f7f7}.page-header[data-v-8ae6e53c]{position:sticky;top:0;z-index:10;background:#fff;padding:18px 16px 14px;border-bottom:.5px solid rgba(0,0,0,.06)}.page-title[data-v-8ae6e53c]{font-size:20px;font-weight:600;color:#1a1a1a}.filter-tabs[data-v-8ae6e53c]{display:flex;background:#fff;padding:0 16px;gap:24px;border-bottom:.5px solid #F0F0F0}.sticky-tabs[data-v-8ae6e53c]{position:sticky;top:calc(53px + env(safe-area-inset-top));z-index:9}.filter-tab[data-v-8ae6e53c]{padding:12px 0;font-size:15px;color:#999;cursor:pointer;position:relative;transition:color .2s}.filter-tab.active[data-v-8ae6e53c]{color:#ff6b00;font-weight:600}.filter-tab.active[data-v-8ae6e53c]:after{content:"";position:absolute;bottom:-.5px;left:0;right:0;height:2px;background:#ff6b00;border-radius:1px}.list-wrap[data-v-8ae6e53c]{padding:12px}.loading[data-v-8ae6e53c]{display:flex;flex-direction:column;align-items:center;gap:12px;padding:60px;color:#b2b2b2;font-size:14px}.loading-ring[data-v-8ae6e53c]{width:32px;height:32px;border:3px solid #E5E5E5;border-top-color:#ff6b00;border-radius:50%;animation:spin-8ae6e53c .8s linear infinite}@keyframes spin-8ae6e53c{to{transform:rotate(360deg)}}.empty[data-v-8ae6e53c]{text-align:center;padding:60px 40px}.empty-icon[data-v-8ae6e53c]{font-size:48px;margin-bottom:12px}.empty-text[data-v-8ae6e53c]{font-size:14px;color:#b2b2b2}.order-card[data-v-8ae6e53c]{background:#fff;border-radius:16px;padding:16px;margin-bottom:10px}.order-top[data-v-8ae6e53c]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding-bottom:12px;border-bottom:.5px solid #F0F0F0}.order-id[data-v-8ae6e53c]{font-size:13px;color:#8e8e93;font-weight:500;letter-spacing:.5px}.order-status[data-v-8ae6e53c]{font-size:12px;padding:3px 10px;border-radius:12px;font-weight:500}.status-renting[data-v-8ae6e53c]{background:#e8f8ee;color:#ff6b00}.status-ok[data-v-8ae6e53c]{background:#f0f0f0;color:#999}.status-warning[data-v-8ae6e53c]{background:#fff0e8;color:#ff6b35}.order-info .info-line[data-v-8ae6e53c]{display:flex;justify-content:space-between;padding:5px 0;font-size:14px}.info-label[data-v-8ae6e53c]{color:#8e8e93}.info-value[data-v-8ae6e53c]{color:#1a1a1a}.info-value.price[data-v-8ae6e53c]{color:#ff6b35;font-weight:600}
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{o as h}from"./api-CXZzdW5u.js";import{_ as k,e as C,o,c as n,a as s,F as v,g as p,f as D,h as c,m as x,n as _,t as l}from"./index-DH2ZjwZR.js";const S={class:"page"},w={class:"filter-tabs sticky-tabs"},I=["onClick"],N={class:"list-wrap"},A={key:0,class:"loading"},B={key:1,class:"empty"},L={class:"order-top"},z={class:"order-id"},F={class:"order-info"},O={class:"info-line"},T={class:"info-value"},V={class:"info-line"},E={class:"info-value"},M={class:"info-line"},U={class:"info-value price"},$={class:"info-line"},j={class:"info-value"},q={__name:"Orders",setup(G){const i=c([]),d=c(!0),r=c("all"),f=[{label:"全部",value:"all"},{label:"在租",value:"renting"},{label:"已还",value:"returned"},{label:"逾期",value:"overdue"}],g=localStorage.getItem("storeId")||"demo-store",u=x(()=>r.value==="all"?i.value:i.value.filter(t=>t.status===r.value)),m=t=>({renting:"status-renting",returned:"status-ok",overdue:"status-warning"})[t]||"",y=t=>({renting:"在租",returned:"已还",overdue:"逾期",pending:"待处理"})[t]||t,b=t=>t?new Date(t).toLocaleDateString("zh-CN"):"-";return C(async()=>{d.value=!0;try{const t=await h.list({storeId:g});i.value=t.data.data||t.data||[]}catch{i.value=[]}d.value=!1}),(t,e)=>(o(),n("div",S,[e[6]||(e[6]=s("div",{class:"page-header"},[s("div",{class:"page-title"},"订单管理")],-1)),s("div",w,[(o(),n(v,null,p(f,a=>s("div",{key:a.value,class:_(["filter-tab",{active:r.value===a.value}]),onClick:J=>r.value=a.value},l(a.label),11,I)),64))]),s("div",N,[d.value?(o(),n("div",A,[...e[0]||(e[0]=[s("div",{class:"loading-ring"},null,-1),s("div",null,"加载中...",-1)])])):u.value.length===0?(o(),n("div",B,[...e[1]||(e[1]=[s("div",{class:"empty-icon"},"📋",-1),s("div",{class:"empty-text"},"暂无订单",-1)])])):D("",!0),(o(!0),n(v,null,p(u.value,a=>(o(),n("div",{key:a._id,class:"order-card"},[s("div",L,[s("div",z,"订单 · "+l(a._id.slice(-6).toUpperCase()),1),s("div",{class:_(["order-status",m(a.status)])},l(y(a.status)),3)]),s("div",F,[s("div",O,[e[2]||(e[2]=s("span",{class:"info-label"},"客户",-1)),s("span",T,l(a.customerName||"-"),1)]),s("div",V,[e[3]||(e[3]=s("span",{class:"info-label"},"车型",-1)),s("span",E,l(a.vehicleType||"-"),1)]),s("div",M,[e[4]||(e[4]=s("span",{class:"info-label"},"金额",-1)),s("span",U,"¥"+l(a.totalAmount||0),1)]),s("div",$,[e[5]||(e[5]=s("span",{class:"info-label"},"时间",-1)),s("span",j,l(b(a.createdAt)),1)])])]))),128))])]))}},Q=k(q,[["__scopeId","data-v-8ae6e53c"]]);export{Q as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
|||
import{o as d,c as v,a as t,b as s,d as i,n as l,e as n,f as p,g as r}from"./index-D6NGLDyM.js";const u={class:"tab-layout"},b={class:"tab-content"},h={class:"tab-bar"},f={__name:"TabLayout",setup(_){const o=p();return(m,e)=>{const c=r("router-view"),a=r("router-link");return d(),v("div",u,[t("div",b,[s(c)]),t("div",h,[s(a,{to:"/",class:l(["tab-item",{active:n(o).path==="/"}])},{default:i(()=>[...e[0]||(e[0]=[t("div",{class:"tab-icon"},[t("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[t("path",{d:"M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"}),t("polyline",{points:"9,22 9,12 15,12 15,22"})])],-1),t("div",{class:"tab-label"},"首页",-1)])]),_:1},8,["class"]),s(a,{to:"/orders",class:l(["tab-item",{active:n(o).path==="/orders"}])},{default:i(()=>[...e[1]||(e[1]=[t("div",{class:"tab-icon"},[t("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[t("path",{d:"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"}),t("polyline",{points:"14,2 14,8 20,8"}),t("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),t("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),t("polyline",{points:"10,9 9,9 8,9"})])],-1),t("div",{class:"tab-label"},"订单",-1)])]),_:1},8,["class"]),s(a,{to:"/mine",class:l(["tab-item",{active:n(o).path==="/mine"}])},{default:i(()=>[...e[2]||(e[2]=[t("div",{class:"tab-icon"},[t("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[t("path",{d:"M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2"}),t("circle",{cx:"12",cy:"7",r:"4"})])],-1),t("div",{class:"tab-label"},"我的",-1)])]),_:1},8,["class"])])])}}};export{f as default};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{o as d,c as v,a as t,b as s,w as i,n as l,u as n,d as p,r}from"./index-DH2ZjwZR.js";const u={class:"tab-layout"},b={class:"tab-content"},h={class:"tab-bar"},x={__name:"TabLayout",setup(_){const o=p();return(m,e)=>{const c=r("router-view"),a=r("router-link");return d(),v("div",u,[t("div",b,[s(c)]),t("div",h,[s(a,{to:"/",class:l(["tab-item",{active:n(o).path==="/"}])},{default:i(()=>[...e[0]||(e[0]=[t("div",{class:"tab-icon"},[t("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[t("path",{d:"M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"}),t("polyline",{points:"9,22 9,12 15,12 15,22"})])],-1),t("div",{class:"tab-label"},"首页",-1)])]),_:1},8,["class"]),s(a,{to:"/orders",class:l(["tab-item",{active:n(o).path==="/orders"}])},{default:i(()=>[...e[1]||(e[1]=[t("div",{class:"tab-icon"},[t("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[t("path",{d:"M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"}),t("polyline",{points:"14,2 14,8 20,8"}),t("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),t("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),t("polyline",{points:"10,9 9,9 8,9"})])],-1),t("div",{class:"tab-label"},"订单",-1)])]),_:1},8,["class"]),s(a,{to:"/mine",class:l(["tab-item",{active:n(o).path==="/mine"}])},{default:i(()=>[...e[2]||(e[2]=[t("div",{class:"tab-icon"},[t("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8"},[t("path",{d:"M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2"}),t("circle",{cx:"12",cy:"7",r:"4"})])],-1),t("div",{class:"tab-label"},"我的",-1)])]),_:1},8,["class"])])])}}};export{x as default};
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{_ as N,e as U,o,c as n,a as e,f as b,F as A,g as B,j as F,t as v,k as f,v as g,b as k,w,h as r,r as D,i as M,u as S,p as E}from"./index-DH2ZjwZR.js";import{a as u}from"./api-CXZzdW5u.js";const L={class:"page"},R={class:"page-header"},j={class:"header-row"},q={class:"list-wrap"},z={key:0,class:"loading"},G={key:1,class:"empty"},H={class:"type-img"},J=["src"],K={key:1,class:"type-img-placeholder"},O={class:"type-info"},Q={class:"type-name"},W={class:"type-brand"},X={class:"type-price"},Y=["onClick"],Z=["onClick"],ee={class:"dialog"},se={class:"dialog-title"},ae={class:"dialog-body"},le={class:"form-item"},te={class:"form-item"},oe={class:"form-item"},ne={class:"cover-upload-wrap"},de={key:0,class:"cover-preview"},re=["src"],ie={key:1,class:"cover-placeholder"},ce={class:"form-item"},ve={__name:"VehicleTypes",setup(ue){const i=r([]),p=r(!0),c=r(!1),d=r(null),a=r({brand:"",name:"",cover:"",pricePerDay:""}),C=l=>{const s=new FileReader;s.onload=m=>{a.value.cover=m.target.result},s.readAsDataURL(l.raw)},h=localStorage.getItem("storeId")||"demo-store",y=async()=>{p.value=!0;try{const l=await u.list({storeId:h});i.value=l.data.data||l.data||[]}catch{i.value=[]}p.value=!1},V=()=>{d.value=null,a.value={brand:"",name:"",cover:"",pricePerDay:""},c.value=!0},P=l=>{d.value=l._id,a.value={brand:l.brand,name:l.name,cover:l.cover||"",pricePerDay:l.pricePerDay||""},c.value=!0},T=async()=>{if(!a.value.brand||!a.value.name){alert("请填写品牌和名称");return}try{d.value?await u.update(d.value,a.value):await u.create({...a.value,storeId:h}),_(),y()}catch{alert(d.value?"更新失败":"添加失败")}},_=()=>{c.value=!1,d.value=null,a.value={brand:"",name:"",cover:"",pricePerDay:""}},x=async l=>{if(confirm("确定删除该车型?"))try{await u.delete(l),y()}catch{alert("删除失败")}};return U(y),(l,s)=>{const m=D("el-icon"),I=D("el-upload");return o(),n("div",L,[e("div",R,[e("div",j,[e("button",{class:"btn-back",onClick:s[0]||(s[0]=t=>l.$router.back())},[...s[5]||(s[5]=[e("span",{class:"back-arrow"},"‹",-1)])]),s[6]||(s[6]=e("div",{class:"page-title"},"车型管理",-1)),e("button",{class:"btn-add-inline",onClick:V},"+ 新增")])]),e("div",q,[p.value?(o(),n("div",z,[...s[7]||(s[7]=[e("div",{class:"loading-ring"},null,-1)])])):i.value.length===0?(o(),n("div",G,[...s[8]||(s[8]=[e("div",{class:"empty-icon"},"🚗",-1),e("div",{class:"empty-text"},"暂无车型",-1),e("div",{class:"empty-sub"},"点击下方添加车型",-1)])])):b("",!0),(o(!0),n(A,null,B(i.value,t=>(o(),n("div",{key:t._id,class:"type-card"},[e("div",H,[t.cover?(o(),n("img",{key:0,src:t.cover,alt:"cover"},null,8,J)):(o(),n("div",K,"🚗"))]),e("div",O,[e("div",Q,v(t.name),1),e("div",W,v(t.brand),1),e("div",X,[M("¥"+v(t.pricePerDay||0),1),s[9]||(s[9]=e("span",{class:"per-day"},"/天",-1))])]),e("button",{class:"btn-edit",onClick:$=>P(t)},"编辑",8,Y),e("button",{class:"btn-del",onClick:$=>x(t._id)},"删除",8,Z)]))),128))]),c.value?(o(),n("div",{key:0,class:"dialog-overlay",onClick:F(_,["self"])},[e("div",ee,[s[16]||(s[16]=e("div",{class:"dialog-handle"},null,-1)),e("div",se,v(d.value?"编辑车型":"添加车型"),1),e("div",ae,[e("div",le,[s[10]||(s[10]=e("label",null,"品牌",-1)),f(e("input",{"onUpdate:modelValue":s[1]||(s[1]=t=>a.value.brand=t),placeholder:"如:雅迪"},null,512),[[g,a.value.brand]])]),e("div",te,[s[11]||(s[11]=e("label",null,"车型名称",-1)),f(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>a.value.name=t),placeholder:"如:TDT1234"},null,512),[[g,a.value.name]])]),e("div",oe,[s[14]||(s[14]=e("label",null,"封面图",-1)),e("div",ne,[k(I,{class:"cover-uploader","auto-upload":!1,"show-file-list":!1,"on-change":C,accept:"image/*"},{default:w(()=>[a.value.cover?(o(),n("div",de,[e("img",{src:a.value.cover,alt:"封面"},null,8,re),s[12]||(s[12]=e("div",{class:"cover-mask"},[e("span",null,"点击更换")],-1))])):(o(),n("div",ie,[k(m,{class:"cover-icon"},{default:w(()=>[k(S(E))]),_:1}),s[13]||(s[13]=e("span",null,"上传封面",-1))]))]),_:1}),a.value.cover?(o(),n("div",{key:0,class:"cover-remove",onClick:s[3]||(s[3]=t=>a.value.cover="")},"删除图片")):b("",!0)])]),e("div",ce,[s[15]||(s[15]=e("label",null,"日租金(元)",-1)),f(e("input",{"onUpdate:modelValue":s[4]||(s[4]=t=>a.value.pricePerDay=t),type:"number",placeholder:"如:50"},null,512),[[g,a.value.pricePerDay,void 0,{number:!0}]])])]),e("div",{class:"dialog-footer"},[e("button",{class:"btn-cancel",onClick:_},"取消"),e("button",{class:"btn-confirm",onClick:T},"确定")])])])):b("",!0)])}}},_e=N(ve,[["__scopeId","data-v-7acc3da1"]]);export{_e as default};
|
||||
|
|
@ -0,0 +1 @@
|
|||
import{_ as B,h as F,o,c as n,a as e,i as b,F as M,j as N,l as S,t as y,w as k,v as h,b as g,d as w,r as i,g as C,e as U,p as E}from"./index-D6NGLDyM.js";import{a as v}from"./api-r_HoetOt.js";import"./index-42ANG6Sg.js";const L={class:"page"},R={class:"page-header"},j={class:"header-row"},q={class:"list-wrap"},z={key:0,class:"loading"},G={key:1,class:"empty"},H={class:"type-img"},J=["src"],K={key:1,class:"type-img-placeholder"},O={class:"type-info"},P={class:"type-name"},Q={class:"type-brand"},W=["onClick"],X=["onClick"],Y={class:"dialog"},Z={class:"dialog-title"},ee={class:"dialog-body"},se={class:"form-item"},ae={class:"form-item"},le={class:"form-item"},te={class:"cover-upload-wrap"},oe={key:0,class:"cover-preview"},ne=["src"],de={key:1,class:"cover-placeholder"},ie={__name:"VehicleTypes",setup(re){const r=i([]),u=i(!0),c=i(!1),d=i(null),a=i({brand:"",name:"",cover:""}),D=l=>{const s=new FileReader;s.onload=m=>{a.value.cover=m.target.result},s.readAsDataURL(l.raw)},f=localStorage.getItem("storeId")||"demo-store",p=async()=>{u.value=!0;try{const l=await v.list({storeId:f});r.value=l.data.data||l.data||[]}catch{r.value=[]}u.value=!1},V=()=>{d.value=null,a.value={brand:"",name:"",cover:""},c.value=!0},T=l=>{d.value=l._id,a.value={brand:l.brand,name:l.name,cover:l.cover||""},c.value=!0},x=async()=>{if(!a.value.brand||!a.value.name){alert("请填写品牌和名称");return}try{d.value?await v.update(d.value,a.value):await v.create({...a.value,storeId:f}),_(),p()}catch{alert(d.value?"更新失败":"添加失败")}},_=()=>{c.value=!1,d.value=null,a.value={brand:"",name:"",cover:""}},I=async l=>{if(confirm("确定删除该车型?"))try{await v.delete(l),p()}catch{alert("删除失败")}};return F(p),(l,s)=>{const m=C("el-icon"),$=C("el-upload");return o(),n("div",L,[e("div",R,[e("div",j,[e("button",{class:"btn-back",onClick:s[0]||(s[0]=t=>l.$router.back())},[...s[4]||(s[4]=[e("span",{class:"back-arrow"},"‹",-1)])]),s[5]||(s[5]=e("div",{class:"page-title"},"车型管理",-1)),e("button",{class:"btn-add-inline",onClick:V},"+ 新增")])]),e("div",q,[u.value?(o(),n("div",z,[...s[6]||(s[6]=[e("div",{class:"loading-ring"},null,-1)])])):r.value.length===0?(o(),n("div",G,[...s[7]||(s[7]=[e("div",{class:"empty-icon"},"🚗",-1),e("div",{class:"empty-text"},"暂无车型",-1),e("div",{class:"empty-sub"},"点击下方添加车型",-1)])])):b("",!0),(o(!0),n(M,null,N(r.value,t=>(o(),n("div",{key:t._id,class:"type-card"},[e("div",H,[t.cover?(o(),n("img",{key:0,src:t.cover,alt:"cover"},null,8,J)):(o(),n("div",K,"🚗"))]),e("div",O,[e("div",P,y(t.name),1),e("div",Q,y(t.brand),1)]),e("button",{class:"btn-edit",onClick:A=>T(t)},"编辑",8,W),e("button",{class:"btn-del",onClick:A=>I(t._id)},"删除",8,X)]))),128))]),c.value?(o(),n("div",{key:0,class:"dialog-overlay",onClick:S(_,["self"])},[e("div",Y,[s[13]||(s[13]=e("div",{class:"dialog-handle"},null,-1)),e("div",Z,y(d.value?"编辑车型":"添加车型"),1),e("div",ee,[e("div",se,[s[8]||(s[8]=e("label",null,"品牌",-1)),k(e("input",{"onUpdate:modelValue":s[1]||(s[1]=t=>a.value.brand=t),placeholder:"如:雅迪"},null,512),[[h,a.value.brand]])]),e("div",ae,[s[9]||(s[9]=e("label",null,"车型名称",-1)),k(e("input",{"onUpdate:modelValue":s[2]||(s[2]=t=>a.value.name=t),placeholder:"如:TDT1234"},null,512),[[h,a.value.name]])]),e("div",le,[s[12]||(s[12]=e("label",null,"封面图",-1)),e("div",te,[g($,{class:"cover-uploader","auto-upload":!1,"show-file-list":!1,"on-change":D,accept:"image/*"},{default:w(()=>[a.value.cover?(o(),n("div",oe,[e("img",{src:a.value.cover,alt:"封面"},null,8,ne),s[10]||(s[10]=e("div",{class:"cover-mask"},[e("span",null,"点击更换")],-1))])):(o(),n("div",de,[g(m,{class:"cover-icon"},{default:w(()=>[g(U(E))]),_:1}),s[11]||(s[11]=e("span",null,"上传封面",-1))]))]),_:1}),a.value.cover?(o(),n("div",{key:0,class:"cover-remove",onClick:s[3]||(s[3]=t=>a.value.cover="")},"删除图片")):b("",!0)])])]),e("div",{class:"dialog-footer"},[e("button",{class:"btn-cancel",onClick:_},"取消"),e("button",{class:"btn-confirm",onClick:x},"确定")])])])):b("",!0)])}}},pe=B(ie,[["__scopeId","data-v-ade95950"]]);export{pe as default};
|
||||
|
|
@ -0,0 +1 @@
|
|||
.page[data-v-ade95950]{min-height:100vh;background:#f7f7f7}.page-header[data-v-ade95950]{position:sticky;top:0;z-index:10;background:#fff;padding:14px 16px 12px;border-bottom:.5px solid rgba(0,0,0,.06)}.header-row[data-v-ade95950]{display:flex;align-items:center;justify-content:space-between}.btn-back[data-v-ade95950]{width:34px;height:34px;border-radius:50%;background:#f7f7f7;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0}.back-arrow[data-v-ade95950]{font-size:22px;color:#1a1a1a;line-height:1;margin-top:-2px}.page-title[data-v-ade95950]{font-size:18px;font-weight:600;color:#1a1a1a;flex:1;text-align:center}.btn-add-inline[data-v-ade95950]{background:#ff6b00;color:#fff;border:none;border-radius:16px;padding:6px 14px;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0}.list-wrap[data-v-ade95950]{padding:12px}.loading[data-v-ade95950]{display:flex;justify-content:center;padding:60px}.loading-ring[data-v-ade95950]{width:32px;height:32px;border:3px solid #E5E5E5;border-top-color:#ff6b00;border-radius:50%;animation:spin-ade95950 .8s linear infinite}@keyframes spin-ade95950{to{transform:rotate(360deg)}}.empty[data-v-ade95950]{text-align:center;padding:60px 40px}.empty-icon[data-v-ade95950]{font-size:48px;margin-bottom:12px}.empty-text[data-v-ade95950]{font-size:15px;color:#1a1a1a;font-weight:500}.empty-sub[data-v-ade95950]{font-size:13px;color:#b2b2b2;margin-top:6px}.type-card[data-v-ade95950]{background:#fff;border-radius:16px;padding:14px;margin-bottom:10px;display:flex;align-items:center;gap:12px}.type-img[data-v-ade95950]{width:60px;height:60px;border-radius:12px;overflow:hidden;background:#f7f7f7;display:flex;align-items:center;justify-content:center;flex-shrink:0}.type-img img[data-v-ade95950]{width:100%;height:100%;object-fit:cover}.type-img-placeholder[data-v-ade95950]{font-size:28px}.type-info[data-v-ade95950]{flex:1;min-width:0}.type-name[data-v-ade95950]{font-size:15px;font-weight:600;color:#1a1a1a}.type-brand[data-v-ade95950]{font-size:12px;color:#8e8e93;margin-top:3px}.btn-edit[data-v-ade95950]{background:#fff7f0;color:#ff6b00;border:none;border-radius:16px;padding:6px 14px;font-size:12px;cursor:pointer;flex-shrink:0}.btn-del[data-v-ade95950]{background:#fff0f0;color:#ff4d4f;border:none;border-radius:16px;padding:6px 14px;font-size:12px;cursor:pointer;flex-shrink:0}.dialog-overlay[data-v-ade95950]{position:fixed;inset:0;background:#0006;display:flex;align-items:flex-end;z-index:200}.dialog[data-v-ade95950]{background:#fff;width:100%;border-radius:20px 20px 0 0;padding-bottom:calc(16px + env(safe-area-inset-bottom))}.dialog-handle[data-v-ade95950]{width:36px;height:4px;background:#ddd;border-radius:2px;margin:10px auto 0}.dialog-title[data-v-ade95950]{text-align:center;font-size:17px;font-weight:600;color:#1a1a1a;padding:18px 16px 14px}.dialog-body[data-v-ade95950]{padding:0 16px 16px}.form-item[data-v-ade95950]{margin-bottom:14px}.form-item label[data-v-ade95950]{display:block;font-size:13px;color:#8e8e93;margin-bottom:8px}.form-item input[data-v-ade95950]{width:100%;padding:12px 14px;background:#f7f7f7;border:none;border-radius:10px;font-size:15px;color:#1a1a1a;outline:none;box-sizing:border-box}.form-item input[data-v-ade95950]::placeholder{color:#b2b2b2}.dialog-footer[data-v-ade95950]{display:flex;gap:12px;padding:0 16px}.btn-cancel[data-v-ade95950],.btn-confirm[data-v-ade95950]{flex:1;padding:13px;border-radius:24px;font-size:16px;font-weight:500;cursor:pointer;border:none}.btn-cancel[data-v-ade95950]{background:#f0f0f0;color:#666}.btn-confirm[data-v-ade95950]{background:#ff6b00;color:#fff}.cover-upload-wrap[data-v-ade95950]{display:flex;align-items:center;gap:12px}.cover-uploader[data-v-ade95950]{width:80px;height:80px;flex-shrink:0}.cover-placeholder[data-v-ade95950]{width:80px;height:80px;border-radius:10px;border:1.5px dashed #DDD;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;cursor:pointer;background:#f7f7f7;transition:border-color .2s}.cover-placeholder[data-v-ade95950]:hover{border-color:#ff6b00}.cover-icon[data-v-ade95950]{font-size:22px;color:#b2b2b2}.cover-placeholder span[data-v-ade95950]{font-size:11px;color:#b2b2b2}.cover-preview[data-v-ade95950]{width:80px;height:80px;border-radius:10px;overflow:hidden;position:relative;cursor:pointer}.cover-preview img[data-v-ade95950]{width:100%;height:100%;object-fit:cover}.cover-mask[data-v-ade95950]{position:absolute;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s}.cover-preview:hover .cover-mask[data-v-ade95950]{opacity:1}.cover-mask span[data-v-ade95950]{color:#fff;font-size:11px}.cover-remove[data-v-ade95950]{font-size:12px;color:#ff4d4f;cursor:pointer;text-decoration:underline}
|
||||
|
|
@ -1 +0,0 @@
|
|||
.page[data-v-7acc3da1]{min-height:100vh;background:#f7f7f7}.page-header[data-v-7acc3da1]{position:sticky;top:0;z-index:10;background:#fff;padding:14px 16px 12px;border-bottom:.5px solid rgba(0,0,0,.06)}.header-row[data-v-7acc3da1]{display:flex;align-items:center;justify-content:space-between}.btn-back[data-v-7acc3da1]{width:34px;height:34px;border-radius:50%;background:#f7f7f7;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0}.back-arrow[data-v-7acc3da1]{font-size:22px;color:#1a1a1a;line-height:1;margin-top:-2px}.page-title[data-v-7acc3da1]{font-size:18px;font-weight:600;color:#1a1a1a;flex:1;text-align:center}.btn-add-inline[data-v-7acc3da1]{background:#ff6b00;color:#fff;border:none;border-radius:16px;padding:6px 14px;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0}.list-wrap[data-v-7acc3da1]{padding:12px}.loading[data-v-7acc3da1]{display:flex;justify-content:center;padding:60px}.loading-ring[data-v-7acc3da1]{width:32px;height:32px;border:3px solid #E5E5E5;border-top-color:#ff6b00;border-radius:50%;animation:spin-7acc3da1 .8s linear infinite}@keyframes spin-7acc3da1{to{transform:rotate(360deg)}}.empty[data-v-7acc3da1]{text-align:center;padding:60px 40px}.empty-icon[data-v-7acc3da1]{font-size:48px;margin-bottom:12px}.empty-text[data-v-7acc3da1]{font-size:15px;color:#1a1a1a;font-weight:500}.empty-sub[data-v-7acc3da1]{font-size:13px;color:#b2b2b2;margin-top:6px}.type-card[data-v-7acc3da1]{background:#fff;border-radius:16px;padding:14px;margin-bottom:10px;display:flex;align-items:center;gap:12px}.type-img[data-v-7acc3da1]{width:60px;height:60px;border-radius:12px;overflow:hidden;background:#f7f7f7;display:flex;align-items:center;justify-content:center;flex-shrink:0}.type-img img[data-v-7acc3da1]{width:100%;height:100%;object-fit:cover}.type-img-placeholder[data-v-7acc3da1]{font-size:28px}.type-info[data-v-7acc3da1]{flex:1;min-width:0}.type-name[data-v-7acc3da1]{font-size:15px;font-weight:600;color:#1a1a1a}.type-brand[data-v-7acc3da1]{font-size:12px;color:#8e8e93;margin-top:3px}.type-price[data-v-7acc3da1]{font-size:16px;color:#ff6b35;font-weight:600;margin-top:6px}.per-day[data-v-7acc3da1]{font-size:12px;font-weight:400;color:#8e8e93}.btn-edit[data-v-7acc3da1]{background:#fff7f0;color:#ff6b00;border:none;border-radius:16px;padding:6px 14px;font-size:12px;cursor:pointer;flex-shrink:0}.btn-del[data-v-7acc3da1]{background:#fff0f0;color:#ff4d4f;border:none;border-radius:16px;padding:6px 14px;font-size:12px;cursor:pointer;flex-shrink:0}.dialog-overlay[data-v-7acc3da1]{position:fixed;inset:0;background:#0006;display:flex;align-items:flex-end;z-index:200}.dialog[data-v-7acc3da1]{background:#fff;width:100%;border-radius:20px 20px 0 0;padding-bottom:calc(16px + env(safe-area-inset-bottom))}.dialog-handle[data-v-7acc3da1]{width:36px;height:4px;background:#ddd;border-radius:2px;margin:10px auto 0}.dialog-title[data-v-7acc3da1]{text-align:center;font-size:17px;font-weight:600;color:#1a1a1a;padding:18px 16px 14px}.dialog-body[data-v-7acc3da1]{padding:0 16px 16px}.form-item[data-v-7acc3da1]{margin-bottom:14px}.form-item label[data-v-7acc3da1]{display:block;font-size:13px;color:#8e8e93;margin-bottom:8px}.form-item input[data-v-7acc3da1]{width:100%;padding:12px 14px;background:#f7f7f7;border:none;border-radius:10px;font-size:15px;color:#1a1a1a;outline:none;box-sizing:border-box}.form-item input[data-v-7acc3da1]::placeholder{color:#b2b2b2}.dialog-footer[data-v-7acc3da1]{display:flex;gap:12px;padding:0 16px}.btn-cancel[data-v-7acc3da1],.btn-confirm[data-v-7acc3da1]{flex:1;padding:13px;border-radius:24px;font-size:16px;font-weight:500;cursor:pointer;border:none}.btn-cancel[data-v-7acc3da1]{background:#f0f0f0;color:#666}.btn-confirm[data-v-7acc3da1]{background:#ff6b00;color:#fff}.cover-upload-wrap[data-v-7acc3da1]{display:flex;align-items:center;gap:12px}.cover-uploader[data-v-7acc3da1]{width:80px;height:80px;flex-shrink:0}.cover-placeholder[data-v-7acc3da1]{width:80px;height:80px;border-radius:10px;border:1.5px dashed #DDD;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;cursor:pointer;background:#f7f7f7;transition:border-color .2s}.cover-placeholder[data-v-7acc3da1]:hover{border-color:#ff6b00}.cover-icon[data-v-7acc3da1]{font-size:22px;color:#b2b2b2}.cover-placeholder span[data-v-7acc3da1]{font-size:11px;color:#b2b2b2}.cover-preview[data-v-7acc3da1]{width:80px;height:80px;border-radius:10px;overflow:hidden;position:relative;cursor:pointer}.cover-preview img[data-v-7acc3da1]{width:100%;height:100%;object-fit:cover}.cover-mask[data-v-7acc3da1]{position:absolute;inset:0;background:#00000073;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s}.cover-preview:hover .cover-mask[data-v-7acc3da1]{opacity:1}.cover-mask span[data-v-7acc3da1]{color:#fff;font-size:11px}.cover-remove[data-v-7acc3da1]{font-size:12px;color:#ff4d4f;cursor:pointer;text-decoration:underline}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
.page[data-v-9bb5a6e7]{min-height:100vh;background:#f7f7f7}.page-header[data-v-9bb5a6e7]{position:sticky;top:0;z-index:10;background:#fff;padding:14px 16px 12px;border-bottom:.5px solid rgba(0,0,0,.06)}.header-row[data-v-9bb5a6e7]{display:flex;align-items:center;justify-content:space-between}.btn-back[data-v-9bb5a6e7]{width:34px;height:34px;border-radius:50%;background:#f7f7f7;border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0}.back-arrow[data-v-9bb5a6e7]{font-size:22px;color:#1a1a1a;line-height:1;margin-top:-2px}.page-title[data-v-9bb5a6e7]{font-size:18px;font-weight:600;color:#1a1a1a;flex:1;text-align:center}.btn-add-inline[data-v-9bb5a6e7]{background:#ff6b00;color:#fff;border:none;border-radius:16px;padding:6px 14px;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0}.list-wrap[data-v-9bb5a6e7]{padding:12px}.loading[data-v-9bb5a6e7]{display:flex;justify-content:center;padding:60px}.loading-ring[data-v-9bb5a6e7]{width:32px;height:32px;border:3px solid #E5E5E5;border-top-color:#ff6b00;border-radius:50%;animation:spin-9bb5a6e7 .8s linear infinite}@keyframes spin-9bb5a6e7{to{transform:rotate(360deg)}}.empty[data-v-9bb5a6e7]{text-align:center;padding:60px 40px}.empty-icon[data-v-9bb5a6e7]{font-size:48px;margin-bottom:12px}.empty-text[data-v-9bb5a6e7]{font-size:15px;color:#1a1a1a;font-weight:500}.empty-sub[data-v-9bb5a6e7]{font-size:13px;color:#b2b2b2;margin-top:6px}.vehicle-card[data-v-9bb5a6e7]{background:#fff;border-radius:16px;padding:16px;margin-bottom:10px;display:flex;align-items:center;justify-content:space-between}.vehicle-left[data-v-9bb5a6e7]{flex:1;min-width:0}.vehicle-plate[data-v-9bb5a6e7]{font-size:16px;font-weight:600;color:#1a1a1a}.vehicle-type[data-v-9bb5a6e7]{font-size:12px;color:#8e8e93;margin-top:4px}.vehicle-detail[data-v-9bb5a6e7]{font-size:12px;color:#b2b2b2;margin-top:3px}.vehicle-right[data-v-9bb5a6e7]{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex-shrink:0}.vehicle-status[data-v-9bb5a6e7]{font-size:12px;padding:4px 14px;border-radius:16px;font-weight:500}.status-renting[data-v-9bb5a6e7]{background:#e8f8ee;color:#ff6b00}.status-idle[data-v-9bb5a6e7]{background:#f0f0f0;color:#999}.btn-edit[data-v-9bb5a6e7]{background:#fff7f0;color:#ff6b00;border:none;border-radius:16px;padding:6px 14px;font-size:12px;cursor:pointer}.btn-del[data-v-9bb5a6e7]{background:#fff0f0;color:#ff4d4f;border:none;border-radius:16px;padding:6px 14px;font-size:12px;cursor:pointer}.dialog-overlay[data-v-9bb5a6e7]{position:fixed;inset:0;background:#0006;display:flex;align-items:flex-end;z-index:200}.dialog[data-v-9bb5a6e7]{background:#fff;width:100%;border-radius:20px 20px 0 0;padding-bottom:calc(16px + env(safe-area-inset-bottom))}.dialog-handle[data-v-9bb5a6e7]{width:36px;height:4px;background:#ddd;border-radius:2px;margin:10px auto 0}.dialog-title[data-v-9bb5a6e7]{text-align:center;font-size:17px;font-weight:600;color:#1a1a1a;padding:18px 16px 14px}.dialog-body[data-v-9bb5a6e7]{padding:0 16px 16px}.form-item[data-v-9bb5a6e7]{margin-bottom:14px}.form-item label[data-v-9bb5a6e7]{display:block;font-size:13px;color:#8e8e93;margin-bottom:8px}.form-item input[data-v-9bb5a6e7]{width:100%;padding:12px 14px;background:#f7f7f7;border:none;border-radius:10px;font-size:15px;color:#1a1a1a;outline:none;box-sizing:border-box}.form-item input[data-v-9bb5a6e7]::placeholder{color:#b2b2b2}.dialog-footer[data-v-9bb5a6e7]{display:flex;gap:12px;padding:0 16px}.btn-cancel[data-v-9bb5a6e7],.btn-confirm[data-v-9bb5a6e7]{flex:1;padding:13px;border-radius:24px;font-size:16px;font-weight:500;cursor:pointer;border:none}.btn-cancel[data-v-9bb5a6e7]{background:#f0f0f0;color:#666}.btn-confirm[data-v-9bb5a6e7]{background:#ff6b00;color:#fff}
|
||||
|
|
@ -1 +0,0 @@
|
|||
import{_ as U,e as $,o,c as n,a as e,f as p,F as T,g as w,j as M,t as d,k as g,v as k,b as S,w as E,h as r,r as C,n as F,l as R}from"./index-DH2ZjwZR.js";import{v as y,a as j}from"./api-CXZzdW5u.js";const z={class:"page"},L={class:"page-header"},q={class:"header-row"},G={class:"list-wrap"},H={key:0,class:"loading"},J={key:1,class:"empty"},K={class:"vehicle-left"},O={class:"vehicle-plate"},P={class:"vehicle-type"},Q={class:"vehicle-detail"},W={key:0},X={key:1},Y={class:"vehicle-right"},Z=["onClick"],ee=["onClick"],le={class:"dialog"},te={class:"dialog-title"},ae={class:"dialog-body"},se={class:"form-item"},oe={class:"form-item"},ne={class:"form-item"},ie={class:"form-item"},de={__name:"Vehicles",setup(re){const u=r([]),b=r(!0),v=r(!1),i=r(null),s=r({plateNumber:"",vehicleType:"",color:"",batteryType:""}),c=r([]),h=localStorage.getItem("storeId")||"demo-store",_=async()=>{b.value=!0;try{const a=await y.list({storeId:h});u.value=a.data.data||a.data||[]}catch{u.value=[]}b.value=!1},m=async()=>{try{const a=await j.list({storeId:h});c.value=a.data.data||a.data||[]}catch{c.value=[]}},N=()=>{i.value=null,s.value={plateNumber:"",vehicleType:"",color:"",batteryType:""},c.value.length===0&&m(),v.value=!0},V=a=>{i.value=a._id,s.value={plateNumber:a.plateNumber||"",vehicleType:a.vehicleType||"",color:a.color||"",batteryType:a.batteryType||""},c.value.length===0&&m(),v.value=!0},D=async()=>{if(!s.value.plateNumber){alert("请填写车牌号");return}try{i.value?await y.update(i.value,s.value):await y.create({...s.value,storeId:h}),f(),_()}catch{alert(i.value?"更新失败":"添加失败")}},f=()=>{v.value=!1,i.value=null,s.value={plateNumber:"",vehicleType:"",color:"",batteryType:""}},x=async a=>{if(confirm("确定删除该车辆?"))try{await y.delete(a),_()}catch{alert("删除失败")}};return $(()=>{_(),m()}),(a,l)=>{const I=C("el-option"),A=C("el-select");return o(),n("div",z,[e("div",L,[e("div",q,[e("button",{class:"btn-back",onClick:l[0]||(l[0]=t=>a.$router.back())},[...l[5]||(l[5]=[e("span",{class:"back-arrow"},"‹",-1)])]),l[6]||(l[6]=e("div",{class:"page-title"},"车辆管理",-1)),e("button",{class:"btn-add-inline",onClick:N},"+ 新增")])]),e("div",G,[b.value?(o(),n("div",H,[...l[7]||(l[7]=[e("div",{class:"loading-ring"},null,-1)])])):u.value.length===0?(o(),n("div",J,[...l[8]||(l[8]=[e("div",{class:"empty-icon"},"🏍️",-1),e("div",{class:"empty-text"},"暂无车辆",-1),e("div",{class:"empty-sub"},"点击上方添加车辆",-1)])])):p("",!0),(o(!0),n(T,null,w(u.value,t=>(o(),n("div",{key:t._id,class:"vehicle-card"},[e("div",K,[e("div",O,d(t.plateNumber),1),e("div",P,d(t.vehicleType||"车型"),1),e("div",Q,[t.color?(o(),n("span",W,"颜色:"+d(t.color),1)):p("",!0),t.batteryType?(o(),n("span",X," | 电池:"+d(t.batteryType),1)):p("",!0)])]),e("div",Y,[e("div",{class:F(["vehicle-status",t.isRented?"status-renting":"status-idle"])},d(t.isRented?"在租":"空闲"),3),e("button",{class:"btn-edit",onClick:B=>V(t)},"编辑",8,Z),e("button",{class:"btn-del",onClick:B=>x(t._id)},"删除",8,ee)])]))),128))]),v.value?(o(),n("div",{key:0,class:"dialog-overlay",onClick:M(f,["self"])},[e("div",le,[l[13]||(l[13]=e("div",{class:"dialog-handle"},null,-1)),e("div",te,d(i.value?"编辑车辆":"添加车辆"),1),e("div",ae,[e("div",se,[l[9]||(l[9]=e("label",null,"车牌号",-1)),g(e("input",{"onUpdate:modelValue":l[1]||(l[1]=t=>s.value.plateNumber=t),placeholder:"如:京A12345"},null,512),[[k,s.value.plateNumber]])]),e("div",oe,[l[10]||(l[10]=e("label",null,"车型",-1)),S(A,{modelValue:s.value.vehicleType,"onUpdate:modelValue":l[2]||(l[2]=t=>s.value.vehicleType=t),placeholder:"请选择车型",style:{width:"100%"}},{default:E(()=>[(o(!0),n(T,null,w(c.value,t=>(o(),R(I,{key:t._id,label:t.name,value:t.name},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),e("div",ne,[l[11]||(l[11]=e("label",null,"颜色",-1)),g(e("input",{"onUpdate:modelValue":l[3]||(l[3]=t=>s.value.color=t),placeholder:"如:黑色"},null,512),[[k,s.value.color]])]),e("div",ie,[l[12]||(l[12]=e("label",null,"电池类型",-1)),g(e("input",{"onUpdate:modelValue":l[4]||(l[4]=t=>s.value.batteryType=t),placeholder:"如:锂电池"},null,512),[[k,s.value.batteryType]])])]),e("div",{class:"dialog-footer"},[e("button",{class:"btn-cancel",onClick:f},"取消"),e("button",{class:"btn-confirm",onClick:D},"确定")])])])):p("",!0)])}}},ve=U(de,[["__scopeId","data-v-9bb5a6e7"]]);export{ve as default};
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
|||
import{a as o}from"./index-42ANG6Sg.js";const t=o.create({baseURL:"/api",timeout:1e4});t.interceptors.request.use(e=>{const s=localStorage.getItem("token");return s&&(e.headers.Authorization=`Bearer ${s}`),e});t.interceptors.response.use(e=>e,e=>(e.response?.status===401&&(localStorage.removeItem("token"),localStorage.removeItem("storeInfo"),localStorage.removeItem("storeId"),window.location.href="/store/login"),Promise.reject(e)));const a={getStore:e=>t.get(`/stores/${e}`),updateStore:(e,s)=>t.put(`/stores/${e}`,s),getMyStore:()=>t.get("/stores/me")},i={list:e=>t.get("/vehicle-types",{params:e}),create:e=>t.post("/vehicle-types",e),update:(e,s)=>t.put(`/vehicle-types/${e}`,s),delete:e=>t.delete(`/vehicle-types/${e}`)},l={list:e=>t.get("/vehicles",{params:e}),create:e=>t.post("/vehicles",e),update:(e,s)=>t.put(`/vehicles/${e}`,s),delete:e=>t.delete(`/vehicles/${e}`)},p={list:e=>t.get("/orders",{params:e}),detail:e=>t.get(`/orders/${e}`),create:e=>t.post("/orders",e),update:(e,s)=>t.put(`/orders/${e}`,s),delete:e=>t.delete(`/orders/${e}`)};export{i as a,p as o,a as s,l as v};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -2,11 +2,11 @@
|
|||
<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" />
|
||||
<meta name="theme-color" content="#FF6B00" />
|
||||
<title>门店端 - 租车系统</title>
|
||||
<script type="module" crossorigin src="/assets/index-DH2ZjwZR.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-D6NGLDyM.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-DYAfUsQo.css">
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||||
<text y="0.9em" font-size="90">🛵</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 113 B |
|
|
@ -2,7 +2,7 @@
|
|||
<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" />
|
||||
<meta name="theme-color" content="#FF6B00" />
|
||||
<title>门店端 - 租车系统</title>
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "^2.3.2",
|
||||
"@rollup/rollup-linux-x64-gnu": "^4.60.0",
|
||||
"axios": "^1.13.6",
|
||||
"element-plus": "^2.13.3",
|
||||
"vue": "^3.5.25",
|
||||
|
|
@ -830,15 +831,13 @@
|
|||
]
|
||||
},
|
||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||
"version": "4.59.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
|
||||
"integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
|
||||
"version": "4.60.0",
|
||||
"resolved": "http://mirrors.tencentyun.com/npm/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz",
|
||||
"integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
]
|
||||
|
|
@ -1802,6 +1801,20 @@
|
|||
"fsevents": "~2.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||
"version": "4.59.0",
|
||||
"resolved": "http://mirrors.tencentyun.com/npm/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
|
||||
"integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
]
|
||||
},
|
||||
"node_modules/scule": {
|
||||
"version": "1.3.0",
|
||||
"license": "MIT"
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "^2.3.2",
|
||||
"@rollup/rollup-linux-x64-gnu": "^4.60.0",
|
||||
"axios": "^1.13.6",
|
||||
"element-plus": "^2.13.3",
|
||||
"vue": "^3.5.25",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
|
||||
<text y="0.9em" font-size="90">🛵</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 113 B |
|
|
@ -1,22 +1,41 @@
|
|||
import { createRouter, createWebHistory } from 'vue-router'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const routes = [
|
||||
{
|
||||
path: '/login',
|
||||
name: 'Login',
|
||||
component: () => import('../views/Login.vue')
|
||||
},
|
||||
{
|
||||
path: '/',
|
||||
component: () => import('../views/TabLayout.vue'),
|
||||
meta: { requiresAuth: true },
|
||||
children: [
|
||||
{ path: '/', name: 'Home', component: () => import('../views/Home.vue') },
|
||||
{ path: '/vehicle-types', name: 'VehicleTypes', component: () => import('../views/VehicleTypes.vue') },
|
||||
{ path: '/vehicles', name: 'Vehicles', component: () => import('../views/Vehicles.vue') },
|
||||
{ path: '/orders', name: 'Orders', component: () => import('../views/Orders.vue') },
|
||||
{ path: '/mine', name: 'Mine', component: () => import('../views/Mine.vue') }
|
||||
{ path: '', name: 'Home', component: () => import('../views/Home.vue') },
|
||||
{ path: 'vehicle-types', name: 'VehicleTypes', component: () => import('../views/VehicleTypes.vue') },
|
||||
{ path: 'vehicles', name: 'Vehicles', component: () => import('../views/Vehicles.vue') },
|
||||
{ path: 'orders', name: 'Orders', component: () => import('../views/Orders.vue') },
|
||||
{ path: 'mine', name: 'Mine', component: () => import('../views/Mine.vue') }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
history: createWebHistory('/store/'),
|
||||
routes
|
||||
})
|
||||
|
||||
// 路由守卫
|
||||
router.beforeEach((to, from, next) => {
|
||||
const token = localStorage.getItem('token')
|
||||
if (to.meta.requiresAuth && !token) {
|
||||
next('/login')
|
||||
} else if (to.path === '/login' && token) {
|
||||
next('/')
|
||||
} else {
|
||||
next()
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
|
|
|
|||
|
|
@ -5,6 +5,29 @@ const api = axios.create({
|
|||
timeout: 10000
|
||||
})
|
||||
|
||||
// 请求拦截器:自动附加 token
|
||||
api.interceptors.request.use(config => {
|
||||
const token = localStorage.getItem('token')
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`
|
||||
}
|
||||
return config
|
||||
})
|
||||
|
||||
// 响应拦截器:token 过期跳转登录
|
||||
api.interceptors.response.use(
|
||||
response => response,
|
||||
error => {
|
||||
if (error.response?.status === 401) {
|
||||
localStorage.removeItem('token')
|
||||
localStorage.removeItem('storeInfo')
|
||||
localStorage.removeItem('storeId')
|
||||
window.location.href = '/store/login'
|
||||
}
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// 门店相关
|
||||
export const storesApi = {
|
||||
getStore: (id) => api.get(`/stores/${id}`),
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@
|
|||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { ordersApi, vehiclesApi } from '../utils/api.js'
|
||||
import { ordersApi, vehiclesApi, storesApi } from '../utils/api.js'
|
||||
|
||||
const storeInfo = ref({})
|
||||
const recentOrders = ref([])
|
||||
|
|
@ -113,19 +113,20 @@ onMounted(async () => {
|
|||
storeInfo.value = { name: '示例门店' }
|
||||
if (storeId !== 'demo-store') {
|
||||
try {
|
||||
const res = await fetch(`/api/stores/${storeId}`)
|
||||
const data = await res.json()
|
||||
if (data.name) storeInfo.value = data
|
||||
const res = await storesApi.getStore(storeId)
|
||||
if (res.data.success && res.data.data) {
|
||||
storeInfo.value = res.data.data
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await ordersApi.list({ storeId, limit: 5 })
|
||||
recentOrders.value = res.data.data || res.data || []
|
||||
const allOrders = res.data.data || res.data || []
|
||||
stats.value.totalOrders = allOrders.length
|
||||
stats.value.rentingOrders = allOrders.filter(o => o.status === 'renting').length
|
||||
stats.value.warningOrders = allOrders.filter(o => o.status === 'overdue').length
|
||||
const data = res.data.data || res.data || []
|
||||
recentOrders.value = data
|
||||
stats.value.totalOrders = data.length
|
||||
stats.value.rentingOrders = data.filter(o => o.status === '进行中' || o.status === '在租').length
|
||||
stats.value.warningOrders = data.filter(o => o.status === '逾期').length
|
||||
} catch (e) {
|
||||
recentOrders.value = []
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,164 @@
|
|||
<template>
|
||||
<div class="login-page">
|
||||
<div class="login-header">
|
||||
<div class="logo">🏪</div>
|
||||
<h1>门店管理</h1>
|
||||
<p>51租 · 商家端</p>
|
||||
</div>
|
||||
|
||||
<div class="login-form">
|
||||
<div class="form-item">
|
||||
<input
|
||||
v-model="loginForm.username"
|
||||
placeholder="请输入账号"
|
||||
size="large"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<input
|
||||
v-model="loginForm.password"
|
||||
type="password"
|
||||
placeholder="请输入密码"
|
||||
size="large"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<button class="login-btn" :loading="loading" @click="handleLogin">
|
||||
登录
|
||||
</button>
|
||||
|
||||
<div class="demo-hint">
|
||||
<p>演示账号:store_demo / demo123</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import axios from 'axios'
|
||||
|
||||
const router = useRouter()
|
||||
const loading = ref(false)
|
||||
|
||||
const loginForm = ref({
|
||||
username: '',
|
||||
password: ''
|
||||
})
|
||||
|
||||
const handleLogin = async () => {
|
||||
if (!loginForm.value.username || !loginForm.value.password) {
|
||||
alert('请输入账号和密码')
|
||||
return
|
||||
}
|
||||
|
||||
loading.value = true
|
||||
try {
|
||||
const res = await axios.post('/api/store-auth/login', {
|
||||
username: loginForm.value.username,
|
||||
password: loginForm.value.password
|
||||
})
|
||||
|
||||
if (res.data.success && res.data.data.token) {
|
||||
localStorage.setItem('token', res.data.data.token)
|
||||
localStorage.setItem('storeInfo', JSON.stringify(res.data.data))
|
||||
localStorage.setItem('storeId', res.data.data.id || res.data.data.storeId || loginForm.value.username)
|
||||
router.push('/')
|
||||
} else {
|
||||
alert(res.data.message || '登录失败')
|
||||
}
|
||||
} catch (e) {
|
||||
alert(e.response?.data?.message || '登录失败,请检查账号密码')
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.login-page {
|
||||
min-height: 100vh;
|
||||
background: #F7F7F7;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.login-header {
|
||||
text-align: center;
|
||||
color: #1A1A1A;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-size: 64px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.login-header h1 {
|
||||
font-size: 28px;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 600;
|
||||
color: #1A1A1A;
|
||||
}
|
||||
|
||||
.login-header p {
|
||||
font-size: 13px;
|
||||
color: #B2B2B2;
|
||||
}
|
||||
|
||||
.login-form {
|
||||
width: 100%;
|
||||
max-width: 360px;
|
||||
background: #fff;
|
||||
border-radius: 16px;
|
||||
padding: 30px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,0.06);
|
||||
}
|
||||
|
||||
.form-item {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.form-item input {
|
||||
width: 100%;
|
||||
padding: 14px 16px;
|
||||
background: #F7F7F7;
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
font-size: 15px;
|
||||
color: #1A1A1A;
|
||||
outline: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.form-item input::placeholder {
|
||||
color: #B2B2B2;
|
||||
}
|
||||
|
||||
.login-btn {
|
||||
width: 100%;
|
||||
background: #FF6B00;
|
||||
border: none;
|
||||
font-size: 18px;
|
||||
border-radius: 12px;
|
||||
height: 48px;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.login-btn:active {
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.demo-hint {
|
||||
text-align: center;
|
||||
color: #B2B2B2;
|
||||
font-size: 12px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -94,10 +94,16 @@ const handleSave = async () => {
|
|||
}
|
||||
}
|
||||
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
const handleLogout = () => {
|
||||
if (confirm('确定退出登录?')) {
|
||||
localStorage.removeItem('token')
|
||||
localStorage.removeItem('storeInfo')
|
||||
localStorage.removeItem('storeId')
|
||||
window.location.reload()
|
||||
router.push('/login')
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@ import vue from '@vitejs/plugin-vue'
|
|||
export default defineConfig({
|
||||
plugins: [vue()],
|
||||
server: {
|
||||
port: 5174,
|
||||
port: 5175,
|
||||
host: '0.0.0.0',
|
||||
allowedHosts: ['51bike.online', 'store.51bike.online'],
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://localhost:3000',
|
||||
|
|
|
|||
Loading…
Reference in New Issue