- 修复BCryptPasswordEncoder密码验证问题 - 实现密码设置提示弹窗功能(仅对无密码用户显示一次) - 优化修改密码逻辑和验证流程 - 更新Welcome页面背景样式 - 清理临时SQL文件和测试代码 - 移动数据库备份文件到database/backups目录 - 删除不必要的MD文档和临时文件
2 lines
9.3 KiB
JavaScript
2 lines
9.3 KiB
JavaScript
import{_ as W}from"./logo-admin-5be797ff.js";import{_ as X}from"./avatar-default-20a1956c.js";import{aA as Z,r as _,m as ee,n as S,U as se,al as g,ar as ae,z as O,A as P,B as e,R as a,J as l,u as d,P as t,O as T,K as te,D as M}from"./vue-vendor-164775a6.js";import{E as I,g as oe,u as C,s as ne,f as B,h as le,k as re,n as ie}from"./element-plus-83a396df.js";import{e as x,_ as de,L as ce}from"./index-69868281.js";import"./utils-edfcd65b.js";const ue=()=>x.get("/dashboard/overview"),he=(y=null)=>{const c=y?{year:y}:{};return x.get("/dashboard/conversion-rate",{params:c})},ve=(y="2024",c="monthly")=>x.get("/analytics/daily-active-users",{params:{year:y,granularity:c}});const me={class:"admin-dashboard"},pe={class:"sidebar"},_e={class:"nav-menu"},ge={class:"nav-item active"},ye={class:"sidebar-footer"},fe={class:"online-users"},be={class:"highlight"},we={class:"system-uptime"},Ce={class:"highlight"},Ue={class:"main-content"},$e={class:"top-header"},Ae={class:"search-bar"},De=["placeholder"],Le={class:"header-actions"},Re={class:"user-avatar"},ke={class:"stats-cards"},Se={class:"stat-card"},Te={class:"stat-icon users"},Me={class:"stat-content"},xe={class:"stat-title"},Ve={class:"stat-number"},ze={class:"stat-card"},Ee={class:"stat-icon paid-users"},Ne={class:"stat-content"},Oe={class:"stat-title"},Pe={class:"stat-number"},Ie={class:"stat-card"},Be={class:"stat-icon revenue"},Fe={class:"stat-content"},je={class:"stat-title"},Ye={class:"stat-number"},Ge={class:"charts-section"},He={class:"chart-card"},Je={class:"chart-header"},Ke={class:"chart-content"},qe={class:"chart-card"},Qe={class:"chart-header"},We={class:"chart-content"},Xe={__name:"AdminDashboard",setup(y){const c=Z(),U=_("2025"),$=_("2025"),r=_({totalUsers:0,paidUsers:0,todayRevenue:0,totalUsersChange:0,paidUsersChange:0,todayRevenueChange:0}),A=_(!1),D=_("0/500"),L=_("加载中..."),R=_(null),k=_(null);let v=null,m=null;const V=()=>new Promise((s,o)=>{if(window.echarts){s(window.echarts);return}const n=document.createElement("script");n.src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js",n.onload=()=>s(window.echarts),n.onerror=o,document.head.appendChild(n)}),F=()=>{c.push("/member-management")},j=()=>{c.push("/admin/orders")},Y=()=>{c.push("/api-management")},G=()=>{c.push("/generate-task-record")},H=()=>{c.push("/system-settings")},J=s=>{s==="exitAdmin"&&c.push("/profile")},z=s=>s>=1e4?(s/1e4).toFixed(1)+"万":s.toLocaleString("zh-CN"),K=s=>s>=1e4?"¥"+(s/1e4).toFixed(1)+"万":"¥"+s.toLocaleString("zh-CN",{minimumFractionDigits:2,maximumFractionDigits:2}),q=async()=>{A.value=!0;try{const s=await ue();console.log("仪表盘概览数据响应:",s);const o=(s==null?void 0:s.data)||s||{};console.log("解析后的数据:",o),o&&!o.error?(r.value={totalUsers:o.totalUsers||0,paidUsers:o.paidUsers||0,todayRevenue:o.todayRevenue||0,totalUsersChange:0,paidUsersChange:0,todayRevenueChange:0},console.log("设置后的统计数据:",r.value)):(console.error("获取仪表盘数据失败:",o.error||o.message),I.error("获取仪表盘数据失败: "+(o.message||"未知错误")))}catch(s){console.error("加载仪表盘数据失败:",s),I.error("加载仪表盘数据失败: "+(s.message||"未知错误"))}finally{A.value=!1}},E=async()=>{try{const o=(await ve(U.value,"monthly")).data||{};if(!R.value)return;const n=await V();await S(),v&&v.dispose(),v=n.init(R.value);const p=o.monthlyData||[],f=p.map(i=>`${i.month}月`),b=p.map(i=>i.avgDailyActive||i.dailyActiveUsers||0),u={tooltip:{trigger:"axis",axisPointer:{type:"cross"}},grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0},xAxis:{type:"category",boundaryGap:!1,data:f,axisLabel:{color:"#6b7280"}},yAxis:{type:"value",axisLabel:{color:"#6b7280",formatter:"{value}"}},series:[{name:"日活用户",type:"line",smooth:!0,data:b,itemStyle:{color:"#3b82f6"},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:"rgba(59, 130, 246, 0.3)"},{offset:1,color:"rgba(59, 130, 246, 0.1)"}]}}}]};v.setOption(u),window.addEventListener("resize",()=>{v&&v.resize()})}catch(s){console.error("加载日活用户趋势图失败:",s)}},N=async()=>{try{const o=(await he($.value)).data||{};if(!k.value)return;const n=await V();await S(),m&&m.dispose(),m=n.init(k.value);const p=o.monthlyData||[],f=p.map(i=>`${i.month}月`),b=p.map(i=>i.conversionRate||0),u={tooltip:{trigger:"axis",axisPointer:{type:"shadow"},formatter:i=>{const w=i[0],h=p[w.dataIndex];return`${w.name}<br/>转化率: ${w.value}%<br/>总用户: ${(h==null?void 0:h.totalUsers)||0}<br/>付费用户: ${(h==null?void 0:h.paidUsers)||0}`}},grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0},xAxis:{type:"category",data:f,axisLabel:{color:"#6b7280"}},yAxis:{type:"value",axisLabel:{color:"#6b7280",formatter:"{value}%"}},series:[{name:"转化率",type:"bar",data:b,itemStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:"#8b5cf6"},{offset:1,color:"#3b82f6"}]}}}]};m.setOption(u),window.addEventListener("resize",()=>{m&&m.resize()})}catch(s){console.error("加载用户转化率图失败:",s)}};ee(async()=>{console.log("后台管理页面加载完成"),Q(),await q(),await S(),await E(),await N()});const Q=async()=>{try{const s=Math.floor(Math.random()*50)+10;D.value=`${s}/500`;const o=new Date().getHours(),n=new Date().getMinutes();L.value=`${o}小时${n}分`}catch(s){console.error("获取系统统计失败:",s),D.value="0/500",L.value="未知"}};return se(()=>{v&&(v.dispose(),v=null),m&&(m.dispose(),m=null)}),(s,o)=>{const n=g("el-icon"),p=g("el-dropdown-item"),f=g("el-dropdown-menu"),b=g("el-dropdown"),u=g("el-option"),i=g("el-select"),w=ae("loading");return O(),P("div",me,[e("aside",pe,[o[2]||(o[2]=e("div",{class:"logo"},[e("img",{src:W,alt:"Logo"})],-1)),e("nav",_e,[e("div",ge,[a(n,null,{default:l(()=>[a(d(oe))]),_:1}),e("span",null,t(s.$t("nav.dashboard")),1)]),e("div",{class:"nav-item",onClick:F},[a(n,null,{default:l(()=>[a(d(C))]),_:1}),e("span",null,t(s.$t("nav.members")),1)]),e("div",{class:"nav-item",onClick:j},[a(n,null,{default:l(()=>[a(d(ne))]),_:1}),e("span",null,t(s.$t("nav.orders")),1)]),e("div",{class:"nav-item",onClick:Y},[a(n,null,{default:l(()=>[a(d(B))]),_:1}),e("span",null,t(s.$t("nav.apiManagement")),1)]),e("div",{class:"nav-item",onClick:G},[a(n,null,{default:l(()=>[a(d(B))]),_:1}),e("span",null,t(s.$t("nav.tasks")),1)]),e("div",{class:"nav-item",onClick:H},[a(n,null,{default:l(()=>[a(d(le))]),_:1}),e("span",null,t(s.$t("nav.systemSettings")),1)])]),e("div",ye,[e("div",fe,[T(t(s.$t("nav.onlineUsers"))+": ",1),e("span",be,t(D.value),1)]),e("div",we,[T(t(s.$t("nav.systemUptime"))+": ",1),e("span",Ce,t(L.value),1)])])]),e("main",Ue,[e("header",$e,[e("div",Ae,[a(n,{class:"search-icon"},{default:l(()=>[a(d(C))]),_:1}),e("input",{type:"text",placeholder:s.$t("common.searchPlaceholder"),class:"search-input"},null,8,De)]),e("div",Le,[a(ce),a(b,{onCommand:J},{dropdown:l(()=>[a(f,null,{default:l(()=>[a(p,{command:"exitAdmin"},{default:l(()=>[T(t(s.$t("admin.exitAdmin")),1)]),_:1})]),_:1})]),default:l(()=>[e("div",Re,[o[3]||(o[3]=e("img",{src:X,alt:"用户头像"},null,-1)),a(n,{class:"arrow-down"},{default:l(()=>[a(d(re))]),_:1})])]),_:1})])]),te((O(),P("div",ke,[e("div",Se,[e("div",Te,[a(n,null,{default:l(()=>[a(d(C))]),_:1})]),e("div",Me,[e("div",xe,t(s.$t("dashboard.totalUsers")),1),e("div",Ve,t(z(r.value.totalUsers)),1),e("div",{class:M(["stat-change",r.value.totalUsersChange>=0?"positive":"negative"])},t(r.value.totalUsersChange>=0?"+":"")+t(r.value.totalUsersChange)+"% "+t(s.$t("dashboard.comparedToLastMonth")),3)])]),e("div",ze,[e("div",Ee,[a(n,null,{default:l(()=>[a(d(C))]),_:1})]),e("div",Ne,[e("div",Oe,t(s.$t("dashboard.paidUsers")),1),e("div",Pe,t(z(r.value.paidUsers)),1),e("div",{class:M(["stat-change",r.value.paidUsersChange>=0?"positive":"negative"])},t(r.value.paidUsersChange>=0?"+":"")+t(r.value.paidUsersChange)+"% "+t(s.$t("dashboard.comparedToLastMonth")),3)])]),e("div",Ie,[e("div",Be,[a(n,null,{default:l(()=>[a(d(ie))]),_:1})]),e("div",Fe,[e("div",je,t(s.$t("dashboard.todayRevenue")),1),e("div",Ye,t(K(r.value.todayRevenue)),1),e("div",{class:M(["stat-change",r.value.todayRevenueChange>=0?"positive":"negative"])},t(r.value.todayRevenueChange>=0?"+":"")+t(r.value.todayRevenueChange)+"% "+t(s.$t("dashboard.comparedToLastMonth")),3)])])])),[[w,A.value]]),e("div",Ge,[e("div",He,[e("div",Je,[e("h3",null,t(s.$t("dashboard.dailyActive")),1),a(i,{modelValue:U.value,"onUpdate:modelValue":o[0]||(o[0]=h=>U.value=h),onChange:E,class:"year-select"},{default:l(()=>[a(u,{label:s.$t("dashboard.year2025"),value:"2025"},null,8,["label"]),a(u,{label:s.$t("dashboard.year2024"),value:"2024"},null,8,["label"]),a(u,{label:s.$t("dashboard.year2023"),value:"2023"},null,8,["label"])]),_:1},8,["modelValue"])]),e("div",Ke,[e("div",{ref_key:"dailyActiveChart",ref:R,style:{width:"100%",height:"100%"}},null,512)])]),e("div",qe,[e("div",Qe,[e("h3",null,t(s.$t("dashboard.conversionRate")),1),a(i,{modelValue:$.value,"onUpdate:modelValue":o[1]||(o[1]=h=>$.value=h),onChange:N,class:"year-select"},{default:l(()=>[a(u,{label:s.$t("dashboard.year2025"),value:"2025"},null,8,["label"]),a(u,{label:s.$t("dashboard.year2024"),value:"2024"},null,8,["label"]),a(u,{label:s.$t("dashboard.year2023"),value:"2023"},null,8,["label"])]),_:1},8,["modelValue"])]),e("div",We,[e("div",{ref_key:"conversionChart",ref:k,style:{width:"100%",height:"100%"}},null,512)])])])])])}}},ns=de(Xe,[["__scopeId","data-v-352dcf3d"]]);export{ns as default};
|