Files
jczxw-pc/.output/public/_nuxt/8vh_5kA7.js
赵忠林 528fe28ffc feat(api): 添加多路由代理处理实现
- 新增api目录下多个接口路径代理处理文件,支持动态拼接目标URL
- 根据环境变量选择不同的后端服务地址(如dev和生产环境)
- 统一添加TenantId和Authorization请求头传递租户及身份信息
- 实现请求参数及搜索参数的完整转发
- 引入better-sqlite3及node内建模块支持服务端功能
- 新增专家详情页面,实现文章、成果及预约咨询功能展示
- 页面实现加载骨架屏、标签页切换及空状态提示优化体验
2026-04-28 13:50:27 +08:00

2 lines
7.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{p as x,u as te,a as ae}from"./DYLUgmZy.js";import{d as se,H as le,i as k,s as P,j as ne,c as m,a as i,b as a,w as s,m as e,a2 as T,p as z,r as _,o as r,e as c,R as oe,F as j,f as ie,A as b,z as ue,t as o,l as p,g as de}from"./DPwbf7XO.js";import{U as H}from"./Ce_WBGpl.js";import"./Cv7upGT6.js";import"./Dl1HJz7f.js";const re={class:"users-page"},ce={class:"page-header"},_e={class:"stat-icon"},pe={class:"stat-info"},me={class:"stat-value"},fe={class:"stat-label"},ve={class:"panel"},ye={class:"panel-header"},ge={key:0,class:"user-info-cell"},ke={class:"user-info-text"},be={class:"user-name"},he={class:"user-sub"},we={key:1,style:{"font-size":"13px"}},xe={key:0},ze={key:1,style:{color:"rgba(0,0,0,0.45)","font-size":"12px"}},Ce={key:2,class:"text-gray-400"},Se={key:3,style:{"font-size":"13px"}},Ue={key:0,style:{color:"#059669"}},Ie={key:1,style:{color:"rgba(0,0,0,0.45)","font-size":"12px"}},Re={key:4,class:"text-sm text-gray"},Te={class:"user-detail-header"},Be={class:"detail-name"},Ve={class:"detail-sub"},$e={style:{color:"#059669"}},Ae=se({__name:"users",setup(Fe){le({title:"用户管理 - 平台管理"});const C=k(!1),B=k([]),S=k(void 0),U=k(""),y=P({current:1,pageSize:20,total:0,showSizeChanger:!0,showQuickJumper:!0}),h=P([{icon:"👥",label:"总用户数",value:0,color:"blue"},{icon:"✅",label:"正常用户",value:0,color:"green"},{icon:"🔒",label:"冻结用户",value:0,color:"red"},{icon:"🛡️",label:"管理员",value:0,color:"orange"}]),M=[{title:"用户信息",key:"userInfo",width:220},{title:"联系方式",key:"contact",width:180},{title:"账号状态",key:"status",width:110},{title:"余额/积分",key:"balance",width:140},{title:"注册时间",key:"createTime",width:110},{title:"操作",key:"action",width:220}],I=k(!1),n=k(null);async function w(){C.value=!0;try{const u=await x({page:y.current,limit:y.pageSize,status:S.value,keywords:U.value||void 0});B.value=u?.list||[],y.total=u?.count||0,O()}catch{z.error("加载用户列表失败")}finally{C.value=!1}}async function O(){try{const[u,t,f,g]=await Promise.allSettled([x({page:1,limit:1}),x({page:1,limit:1,status:0}),x({page:1,limit:1,status:1}),x({page:1,limit:1,isAdmin:1})]);u.status==="fulfilled"&&(h[0].value=u.value?.count||0),t.status==="fulfilled"&&(h[1].value=t.value?.count||0),f.status==="fulfilled"&&(h[2].value=f.value?.count||0),g.status==="fulfilled"&&(h[3].value=g.value?.count||0)}catch{}}function V(){y.current=1,w()}function E(u){y.current=u.current,y.pageSize=u.pageSize,w()}function J(u){n.value=u,I.value=!0}async function K(u){const t=u.status===0?1:0;try{await te(u.userId,t),z.success(t===1?"用户已冻结":"用户已解冻"),w()}catch(f){z.error(f?.message||"操作失败")}}async function L(u){try{await ae(u.userId,"123456"),z.success(`已重置「${u.nickname||u.username}」的密码为 123456`)}catch(t){z.error(t?.message||"重置失败")}}return ne(()=>w()),(u,t)=>{const f=_("a-button"),g=_("a-space"),Q=_("a-col"),q=_("a-row"),R=_("a-select-option"),G=_("a-select"),W=_("a-input-search"),$=_("a-avatar"),A=_("a-tag"),F=_("a-badge"),N=_("a-popconfirm"),X=_("a-table"),Y=_("a-divider"),v=_("a-descriptions-item"),Z=_("a-descriptions"),ee=_("a-modal");return r(),m("div",re,[i("div",ce,[t[4]||(t[4]=i("div",null,[i("h2",{class:"page-title"},"👥 用户管理"),i("p",{class:"page-desc"},"管理平台所有注册用户,可查看用户信息、调整状态")],-1)),a(g,null,{default:s(()=>[a(f,{onClick:w,loading:e(C)},{icon:s(()=>[a(e(oe))]),default:s(()=>[t[3]||(t[3]=c(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),a(q,{gutter:[16,16],class:"mb-6"},{default:s(()=>[(r(!0),m(j,null,ie(e(h),d=>(r(),b(Q,{xs:12,md:6,key:d.label},{default:s(()=>[i("div",{class:ue(["stat-card",d.color])},[i("div",_e,o(d.icon),1),i("div",pe,[i("div",me,o(d.value),1),i("div",fe,o(d.label),1)])],2)]),_:2},1024))),128))]),_:1}),i("div",ve,[i("div",ye,[t[8]||(t[8]=i("span",{class:"panel-title"},"📋 用户列表",-1)),a(g,{wrap:""},{default:s(()=>[a(G,{value:e(S),"onUpdate:value":t[0]||(t[0]=d=>T(S)?S.value=d:null),style:{width:"120px"},onChange:V},{default:s(()=>[a(R,{value:void 0},{default:s(()=>[...t[5]||(t[5]=[c("全部状态",-1)])]),_:1}),a(R,{value:0},{default:s(()=>[...t[6]||(t[6]=[c("正常",-1)])]),_:1}),a(R,{value:1},{default:s(()=>[...t[7]||(t[7]=[c("已冻结",-1)])]),_:1})]),_:1},8,["value"]),a(W,{value:e(U),"onUpdate:value":t[1]||(t[1]=d=>T(U)?U.value=d:null),placeholder:"搜索用户名/手机/邮箱",style:{width:"220px"},onSearch:V},null,8,["value"])]),_:1})]),a(X,{columns:M,"data-source":e(B),loading:e(C),pagination:e(y),"row-key":"userId",onChange:E,size:"middle"},{bodyCell:s(({column:d,record:l})=>[d.key==="userInfo"?(r(),m("div",ge,[a($,{size:38,src:l.avatar||l.avatarUrl},{icon:s(()=>[a(e(H))]),_:1},8,["src"]),i("div",ke,[i("div",be,[c(o(l.nickname||l.username)+" ",1),l.isAdmin?(r(),b(A,{key:0,color:"red",style:{"margin-left":"6px","font-size":"10px"}},{default:s(()=>[...t[9]||(t[9]=[c("管理员",-1)])]),_:1})):p("",!0)]),i("div",he,"@"+o(l.username),1)])])):p("",!0),d.key==="contact"?(r(),m("div",we,[l.phone||l.mobile?(r(),m("div",xe,"📱 "+o(l.phone||l.mobile),1)):p("",!0),l.email?(r(),m("div",ze,o(l.email),1)):p("",!0),!l.phone&&!l.mobile&&!l.email?(r(),m("span",Ce,"-")):p("",!0)])):p("",!0),d.key==="status"?(r(),b(F,{key:2,status:l.status===0?"success":"error",text:l.status===0?"正常":"已冻结"},null,8,["status","text"])):p("",!0),d.key==="balance"?(r(),m("div",Se,[l.balance!==void 0?(r(),m("div",Ue,"💰 ¥"+o((l.balance/100).toFixed(2)),1)):p("",!0),l.points!==void 0?(r(),m("div",Ie,"🏆 "+o(l.points)+" 积分",1)):p("",!0)])):p("",!0),d.key==="createTime"?(r(),m("span",Re,o(l.createTime?.substring(0,10)||"-"),1)):p("",!0),d.key==="action"?(r(),b(g,{key:5},{default:s(()=>[a(f,{type:"link",size:"small",onClick:D=>J(l)},{default:s(()=>[...t[10]||(t[10]=[c("详情",-1)])]),_:1},8,["onClick"]),a(N,{title:l.status===0?"确认冻结此用户账号?":"确认解冻此用户账号?",onConfirm:D=>K(l)},{default:s(()=>[a(f,{type:"link",size:"small",danger:l.status===0},{default:s(()=>[c(o(l.status===0?"冻结":"解冻"),1)]),_:2},1032,["danger"])]),_:2},1032,["title","onConfirm"]),a(N,{title:"确认重置密码为 123456",onConfirm:D=>L(l)},{default:s(()=>[a(f,{type:"link",size:"small"},{default:s(()=>[...t[11]||(t[11]=[c("重置密码",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):p("",!0)]),_:1},8,["data-source","loading","pagination"])]),a(ee,{open:e(I),"onUpdate:open":t[2]||(t[2]=d=>T(I)?I.value=d:null),title:`用户详情:${e(n)?.nickname||e(n)?.username||""}`,width:"680px",footer:null},{default:s(()=>[e(n)?(r(),m(j,{key:0},[i("div",Te,[a($,{size:64,src:e(n).avatar||e(n).avatarUrl},{icon:s(()=>[a(e(H))]),_:1},8,["src"]),i("div",null,[i("div",Be,o(e(n).nickname||e(n).username),1),i("div",Ve,"@"+o(e(n).username),1),a(g,{style:{"margin-top":"8px"}},{default:s(()=>[e(n).isAdmin?(r(),b(A,{key:0,color:"red"},{default:s(()=>[...t[12]||(t[12]=[c("管理员",-1)])]),_:1})):p("",!0),a(F,{status:e(n).status===0?"success":"error",text:e(n).status===0?"账号正常":"已冻结"},null,8,["status","text"])]),_:1})])]),a(Y),a(Z,{column:2,size:"small"},{default:s(()=>[a(v,{label:"用户ID"},{default:s(()=>[c(o(e(n).userId),1)]),_:1}),a(v,{label:"手机号"},{default:s(()=>[c(o(e(n).phone||e(n).mobile||"-"),1)]),_:1}),a(v,{label:"邮箱"},{default:s(()=>[c(o(e(n).email||"-"),1)]),_:1}),a(v,{label:"性别"},{default:s(()=>[c(o(e(n).sex==="1"?"男":e(n).sex==="2"?"女":"-"),1)]),_:1}),a(v,{label:"余额"},{default:s(()=>[i("span",$e,"¥"+o(((e(n).balance||0)/100).toFixed(2)),1)]),_:1}),a(v,{label:"积分"},{default:s(()=>[c(o(e(n).points??"-"),1)]),_:1}),a(v,{label:"注册时间",span:2},{default:s(()=>[c(o(e(n).createTime||"-"),1)]),_:1}),e(n).address?(r(),b(v,{key:0,label:"地址",span:2},{default:s(()=>[c(o([e(n).province,e(n).city,e(n).region,e(n).address].filter(Boolean).join(" ")),1)]),_:1})):p("",!0)]),_:1})],64)):p("",!0)]),_:1},8,["open","title"])])}}}),Me=de(Ae,[["__scopeId","data-v-0c7d49a8"]]);export{Me as default};