- 新增api目录下多个接口路径代理处理文件,支持动态拼接目标URL - 根据环境变量选择不同的后端服务地址(如dev和生产环境) - 统一添加TenantId和Authorization请求头传递租户及身份信息 - 实现请求参数及搜索参数的完整转发 - 引入better-sqlite3及node内建模块支持服务端功能 - 新增专家详情页面,实现文章、成果及预约咨询功能展示 - 页面实现加载骨架屏、标签页切换及空状态提示优化体验
2 lines
11 KiB
JavaScript
2 lines
11 KiB
JavaScript
import{d as vt,H as gt,i as _,s as F,v as A,N as ct,j as mt,c as k,a as n,b as e,w as a,m as o,a2 as T,p as h,r,o as p,G as yt,e as d,R as _t,a9 as kt,t as c,l as f,A as I,g as wt}from"./DPwbf7XO.js";import{l as bt,u as Ct,a as ht,r as It}from"./D34CAB9Q.js";import"./Cv7upGT6.js";import"./Dl1HJz7f.js";const xt={class:"article-categories-page"},St={class:"page-header"},Nt={class:"stat-card blue"},zt={class:"stat-info"},Ut={class:"stat-value"},At={class:"stat-card green"},Tt={class:"stat-info"},Ot={class:"stat-value"},$t={class:"stat-card orange"},Pt={class:"stat-info"},Rt={class:"stat-value"},Bt={class:"panel"},Dt={class:"panel-header"},Mt={key:0,class:"category-info-cell"},Vt={class:"category-title-row"},jt={class:"category-title"},Ht={class:"category-meta"},Jt={key:0},Qt={key:1,class:"meta-item"},Et={key:2},Ft={key:3},Lt={key:5,class:"flag-list"},qt={key:3,class:"text-gray"},Gt={key:6,class:"text-sm text-gray"},Kt=vt({__name:"article-categories",setup(Wt){gt({title:"文章分类 - 平台管理"});const R=_(!1),j=_(!1),b=_([]),O=_(void 0),B=_(""),v=F({current:1,pageSize:20,showSizeChanger:!0,showQuickJumper:!0}),L=[{title:"分类信息",key:"info",width:360},{title:"类型",key:"type",width:100},{title:"排序",key:"sortNumber",width:90},{title:"文章数",key:"count",width:90},{title:"状态",key:"status",width:90},{title:"标记",key:"flags",width:180},{title:"创建时间",key:"createTime",width:120},{title:"操作",key:"action",width:140}],D=A(()=>{const l=B.value.trim().toLowerCase();return[...b.value].filter(t=>O.value===void 0||t.status===O.value).filter(t=>l?[t.title,t.categoryCode,t.path].some(m=>String(m||"").toLowerCase().includes(l)):!0).sort((t,m)=>{const z=(t.sortNumber||0)-(m.sortNumber||0);return z!==0?z:(m.categoryId||0)-(t.categoryId||0)})}),q=A(()=>{const l=(v.current-1)*v.pageSize;return D.value.slice(l,l+v.pageSize)}),G=A(()=>({current:v.current,pageSize:v.pageSize,total:D.value.length,showSizeChanger:v.showSizeChanger,showQuickJumper:v.showQuickJumper})),K=A(()=>b.value.filter(l=>l.status===0).length),W=A(()=>b.value.filter(l=>!!l.recommend).length),C=_(!1),$=_(null),i=F({title:"",categoryCode:"",parentId:void 0,type:0,path:"",sortNumber:0,status:0}),x=_(!1),S=_(!1),N=_(!1),X=A(()=>b.value.filter(l=>l.categoryId&&l.categoryId!==$.value?.categoryId).map(l=>({value:l.categoryId,label:l.title||`分类 ${l.categoryId}`})));async function M(){R.value=!0;try{const l=await bt();b.value=l||[],H()}catch(l){h.error(l?.message||"加载分类列表失败")}finally{R.value=!1}}function H(){const l=D.value.length,t=Math.max(1,Math.ceil(l/v.pageSize));v.current>t&&(v.current=t)}function E(){v.current=1}function Y(l){v.current=l.current,v.pageSize=l.pageSize,H()}function Z(){Object.assign(i,{categoryId:void 0,title:"",categoryCode:"",parentId:void 0,type:0,path:"",sortNumber:0,status:0}),x.value=!1,S.value=!1,N.value=!1}function tt(){$.value=null,Z(),C.value=!0}function et(l){$.value=l,Object.assign(i,{categoryId:l.categoryId,title:l.title||"",categoryCode:l.categoryCode||"",parentId:l.parentId,type:l.type??0,path:l.path||"",sortNumber:l.sortNumber??0,status:l.status??0}),x.value=!!l.recommend,S.value=!!l.showIndex,N.value=!!l.hide,C.value=!0}async function at(){if(!i.title?.trim()){h.warning("请输入分类名称");return}j.value=!0;try{const l={...i,recommend:x.value?1:0,showIndex:S.value?1:0,hide:N.value?1:0};$.value?.categoryId?(await Ct(l),h.success("分类已更新")):(await ht(l),h.success("分类已创建")),C.value=!1,await M()}catch(l){h.error(l?.message||"保存失败")}finally{j.value=!1}}async function lt(l){try{await It(l.categoryId),h.success("分类已删除"),await M()}catch(t){h.error(t?.message||"删除失败")}}function st(l){return l?b.value.find(t=>t.categoryId===l)?.title||`分类 ${l}`:"-"}function ot(l){return{0:"列表",1:"单页",2:"外链"}[l??0]||"列表"}return ct([D,()=>v.pageSize],()=>{H()}),mt(()=>M()),(l,t)=>{const m=r("a-button"),z=r("a-space"),g=r("a-col"),P=r("a-row"),w=r("a-select-option"),V=r("a-select"),nt=r("a-input-search"),U=r("a-tag"),ut=r("a-popconfirm"),it=r("a-table"),J=r("a-input"),y=r("a-form-item"),dt=r("a-input-number"),Q=r("a-switch"),rt=r("a-form"),pt=r("a-modal");return p(),k("div",xt,[n("div",St,[t[18]||(t[18]=n("div",null,[n("h2",{class:"page-title"},"🗂️ 文章分类"),n("p",{class:"page-desc"},"统一维护文章分类、层级、排序与展示状态")],-1)),e(z,null,{default:a(()=>[e(m,{onClick:t[0]||(t[0]=s=>("navigateTo"in l?l.navigateTo:o(yt))("/admin/articles"))},{default:a(()=>[...t[15]||(t[15]=[d("返回文章管理",-1)])]),_:1}),e(m,{onClick:M,loading:o(R)},{icon:a(()=>[e(o(_t))]),default:a(()=>[t[16]||(t[16]=d(" 刷新 ",-1))]),_:1},8,["loading"]),e(m,{type:"primary",onClick:tt},{icon:a(()=>[e(o(kt))]),default:a(()=>[t[17]||(t[17]=d(" 新增分类 ",-1))]),_:1})]),_:1})]),e(P,{gutter:[16,16],class:"mb-6"},{default:a(()=>[e(g,{xs:12,md:8},{default:a(()=>[n("div",Nt,[t[20]||(t[20]=n("div",{class:"stat-icon"},"🗂️",-1)),n("div",zt,[n("div",Ut,c(o(b).length),1),t[19]||(t[19]=n("div",{class:"stat-label"},"全部分类",-1))])])]),_:1}),e(g,{xs:12,md:8},{default:a(()=>[n("div",At,[t[22]||(t[22]=n("div",{class:"stat-icon"},"✅",-1)),n("div",Tt,[n("div",Ot,c(o(K)),1),t[21]||(t[21]=n("div",{class:"stat-label"},"启用中",-1))])])]),_:1}),e(g,{xs:12,md:8},{default:a(()=>[n("div",$t,[t[24]||(t[24]=n("div",{class:"stat-icon"},"⭐",-1)),n("div",Pt,[n("div",Rt,c(o(W)),1),t[23]||(t[23]=n("div",{class:"stat-label"},"推荐分类",-1))])])]),_:1})]),_:1}),n("div",Bt,[n("div",Dt,[t[28]||(t[28]=n("span",{class:"panel-title"},"📋 分类列表",-1)),e(z,{wrap:""},{default:a(()=>[e(V,{value:o(O),"onUpdate:value":t[1]||(t[1]=s=>T(O)?O.value=s:null),style:{width:"140px"},onChange:E},{default:a(()=>[e(w,{value:void 0},{default:a(()=>[...t[25]||(t[25]=[d("全部状态",-1)])]),_:1}),e(w,{value:0},{default:a(()=>[...t[26]||(t[26]=[d("正常",-1)])]),_:1}),e(w,{value:1},{default:a(()=>[...t[27]||(t[27]=[d("禁用",-1)])]),_:1})]),_:1},8,["value"]),e(nt,{value:o(B),"onUpdate:value":t[2]||(t[2]=s=>T(B)?B.value=s:null),style:{width:"240px"},placeholder:"搜索分类名称 / 标识 / 路径",onSearch:E},null,8,["value"])]),_:1})]),e(it,{columns:L,"data-source":o(q),loading:o(R),pagination:o(G),"row-key":"categoryId",onChange:Y,size:"middle"},{bodyCell:a(({column:s,record:u})=>[s.key==="info"?(p(),k("div",Mt,[n("div",Vt,[n("span",jt,c(u.title||"-"),1),u.parentId?(p(),I(U,{key:0,color:"blue"},{default:a(()=>[d("上级:"+c(st(u.parentId)),1)]),_:2},1024)):f("",!0)]),n("div",Ht,[u.categoryCode?(p(),k("span",Jt,"标识:"+c(u.categoryCode),1)):f("",!0),u.path?(p(),k("span",Qt,"路径:"+c(u.path),1)):f("",!0)])])):f("",!0),s.key==="type"?(p(),I(U,{key:1},{default:a(()=>[d(c(ot(u.type)),1)]),_:2},1024)):f("",!0),s.key==="sortNumber"?(p(),k("span",Et,c(u.sortNumber??0),1)):f("",!0),s.key==="count"?(p(),k("span",Ft,c(u.count??0),1)):f("",!0),s.key==="status"?(p(),I(U,{key:4,color:u.status===0?"success":"default"},{default:a(()=>[d(c(u.status===0?"正常":"禁用"),1)]),_:2},1032,["color"])):f("",!0),s.key==="flags"?(p(),k("div",Lt,[u.recommend?(p(),I(U,{key:0,color:"gold"},{default:a(()=>[...t[29]||(t[29]=[d("推荐",-1)])]),_:1})):f("",!0),u.showIndex?(p(),I(U,{key:1,color:"green"},{default:a(()=>[...t[30]||(t[30]=[d("首页",-1)])]),_:1})):f("",!0),u.hide?(p(),I(U,{key:2,color:"default"},{default:a(()=>[...t[31]||(t[31]=[d("隐藏",-1)])]),_:1})):f("",!0),!u.recommend&&!u.showIndex&&!u.hide?(p(),k("span",qt,"-")):f("",!0)])):f("",!0),s.key==="createTime"?(p(),k("span",Gt,c(u.createTime?.substring(0,10)||"-"),1)):f("",!0),s.key==="action"?(p(),I(z,{key:7},{default:a(()=>[e(m,{type:"link",size:"small",onClick:ft=>et(u)},{default:a(()=>[...t[32]||(t[32]=[d("编辑",-1)])]),_:1},8,["onClick"]),e(ut,{title:"确认删除此分类?",onConfirm:ft=>lt(u)},{default:a(()=>[e(m,{type:"link",size:"small",danger:""},{default:a(()=>[...t[33]||(t[33]=[d("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):f("",!0)]),_:1},8,["data-source","loading","pagination"])]),e(pt,{open:o(C),"onUpdate:open":t[13]||(t[13]=s=>T(C)?C.value=s:null),title:o($)?.categoryId?"编辑分类":"新增分类",width:"720px","confirm-loading":o(j),onOk:at,onCancel:t[14]||(t[14]=s=>C.value=!1)},{default:a(()=>[e(rt,{model:o(i),layout:"vertical"},{default:a(()=>[e(P,{gutter:16},{default:a(()=>[e(g,{span:12},{default:a(()=>[e(y,{label:"分类名称",required:""},{default:a(()=>[e(J,{value:o(i).title,"onUpdate:value":t[3]||(t[3]=s=>o(i).title=s),placeholder:"请输入分类名称",maxlength:80,"show-count":""},null,8,["value"])]),_:1})]),_:1}),e(g,{span:12},{default:a(()=>[e(y,{label:"分类标识"},{default:a(()=>[e(J,{value:o(i).categoryCode,"onUpdate:value":t[4]||(t[4]=s=>o(i).categoryCode=s),placeholder:"例如 news / tutorial",maxlength:60,"show-count":""},null,8,["value"])]),_:1})]),_:1})]),_:1}),e(P,{gutter:16},{default:a(()=>[e(g,{span:12},{default:a(()=>[e(y,{label:"上级分类"},{default:a(()=>[e(V,{value:o(i).parentId,"onUpdate:value":t[5]||(t[5]=s=>o(i).parentId=s),"allow-clear":"","show-search":"","option-filter-prop":"label",placeholder:"无上级则留空",options:o(X)},null,8,["value","options"])]),_:1})]),_:1}),e(g,{span:12},{default:a(()=>[e(y,{label:"分类类型"},{default:a(()=>[e(V,{value:o(i).type,"onUpdate:value":t[6]||(t[6]=s=>o(i).type=s)},{default:a(()=>[e(w,{value:0},{default:a(()=>[...t[34]||(t[34]=[d("列表",-1)])]),_:1}),e(w,{value:1},{default:a(()=>[...t[35]||(t[35]=[d("单页",-1)])]),_:1}),e(w,{value:2},{default:a(()=>[...t[36]||(t[36]=[d("外链",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1})]),_:1}),e(P,{gutter:16},{default:a(()=>[e(g,{span:12},{default:a(()=>[e(y,{label:"访问路径"},{default:a(()=>[e(J,{value:o(i).path,"onUpdate:value":t[7]||(t[7]=s=>o(i).path=s),placeholder:"例如 /news 或 https://example.com"},null,8,["value"])]),_:1})]),_:1}),e(g,{span:12},{default:a(()=>[e(y,{label:"排序值"},{default:a(()=>[e(dt,{value:o(i).sortNumber,"onUpdate:value":t[8]||(t[8]=s=>o(i).sortNumber=s),min:0,precision:0,class:"w-full"},null,8,["value"])]),_:1})]),_:1})]),_:1}),e(y,{label:"状态"},{default:a(()=>[e(V,{value:o(i).status,"onUpdate:value":t[9]||(t[9]=s=>o(i).status=s)},{default:a(()=>[e(w,{value:0},{default:a(()=>[...t[37]||(t[37]=[d("正常",-1)])]),_:1}),e(w,{value:1},{default:a(()=>[...t[38]||(t[38]=[d("禁用",-1)])]),_:1})]),_:1},8,["value"])]),_:1}),e(P,{gutter:16},{default:a(()=>[e(g,{span:8},{default:a(()=>[e(y,{label:"推荐分类"},{default:a(()=>[e(Q,{checked:o(x),"onUpdate:checked":t[10]||(t[10]=s=>T(x)?x.value=s:null)},null,8,["checked"]),t[39]||(t[39]=n("span",{class:"switch-tip"},"用于前台推荐位",-1))]),_:1})]),_:1}),e(g,{span:8},{default:a(()=>[e(y,{label:"首页显示"},{default:a(()=>[e(Q,{checked:o(S),"onUpdate:checked":t[11]||(t[11]=s=>T(S)?S.value=s:null)},null,8,["checked"]),t[40]||(t[40]=n("span",{class:"switch-tip"},"首页导航可见",-1))]),_:1})]),_:1}),e(g,{span:8},{default:a(()=>[e(y,{label:"是否隐藏"},{default:a(()=>[e(Q,{checked:o(N),"onUpdate:checked":t[12]||(t[12]=s=>T(N)?N.value=s:null)},null,8,["checked"]),t[41]||(t[41]=n("span",{class:"switch-tip"},"仅注册不展示",-1))]),_:1})]),_:1})]),_:1})]),_:1},8,["model"])]),_:1},8,["open","title","confirm-loading"])])}}}),ee=wt(Kt,[["__scopeId","data-v-cf29e7bf"]]);export{ee as default};
|