- 新增api目录下多个接口路径代理处理文件,支持动态拼接目标URL - 根据环境变量选择不同的后端服务地址(如dev和生产环境) - 统一添加TenantId和Authorization请求头传递租户及身份信息 - 实现请求参数及搜索参数的完整转发 - 引入better-sqlite3及node内建模块支持服务端功能 - 新增专家详情页面,实现文章、成果及预约咨询功能展示 - 页面实现加载骨架屏、标签页切换及空状态提示优化体验
2 lines
11 KiB
JavaScript
2 lines
11 KiB
JavaScript
import{p as R,u as Y,a as he,r as be}from"./B4jlz63s.js";import{u as Ce}from"./B1r3izuv.js";import{d as xe,H as Ue,i as c,s as Z,j as Ie,c as g,a as l,b as t,w as s,m as a,a2 as U,p,r as d,o as v,e as r,a9 as ze,R as Se,t as w,l as _,A as B,F as Ae,g as Te}from"./DPwbf7XO.js";import"./Cv7upGT6.js";import"./Dl1HJz7f.js";const Me={class:"announcements-page"},Ee={class:"page-header"},Ne={class:"stat-card blue"},Oe={class:"stat-info"},Pe={class:"stat-value"},Re={class:"stat-card green"},Be={class:"stat-info"},Fe={class:"stat-value"},Ve={class:"stat-card orange"},De={class:"stat-info"},$e={class:"stat-value"},je={class:"panel"},He={class:"panel-header"},qe={key:0,class:"ann-info-cell"},Le=["src"],Je={key:1,class:"ann-thumb-empty"},Ke={class:"ann-info-text"},Qe={class:"ann-title"},We={key:0,class:"pin-badge"},Ge={class:"ann-overview"},Xe={key:2,class:"text-sm text-gray"},Ye={key:4,class:"text-sm text-gray"},Ze={class:"cover-upload-wrap"},et={key:0,class:"cover-preview-card"},tt=["src"],at={class:"cover-preview-actions"},st={class:"preview-meta"},nt={class:"text-sm text-gray"},lt={key:0,class:"preview-cover-wrap"},ot=["src"],it={key:1,class:"preview-summary"},ut=["innerHTML"],dt=["src"],S="announcement",rt=xe({__name:"announcements",setup(ct){Ue({title:"公告管理 - 平台管理"});const A=c(!1),F=c(!1),H=c([]),T=c(void 0),M=c(""),q=c(0),L=c(0),J=c(0),y=Z({current:1,pageSize:20,total:0,showSizeChanger:!0,showQuickJumper:!0}),ee=[{title:"公告信息",key:"info",width:420},{title:"状态",key:"status",width:100},{title:"阅读量",key:"views",width:100},{title:"置顶",key:"recommend",width:80},{title:"发布时间",key:"createTime",width:120},{title:"操作",key:"action",width:170}],k=c(!1),V=c(!1),E=c(null),u=Z({title:"",overview:"",content:"",status:0,image:""}),b=c(!1),N=c(!1),f=c(null),O=c(!1),D=c("");async function h(){A.value=!0;try{const n=await R({page:y.current,limit:y.pageSize,model:S,status:T.value,keywords:M.value||void 0});H.value=n?.list||[],y.total=n?.count||0,te()}catch{p.error("加载公告列表失败")}finally{A.value=!1}}async function te(){try{const[n,e,i]=await Promise.allSettled([R({page:1,limit:1,model:S}),R({page:1,limit:1,model:S,status:0}),R({page:1,limit:1,model:S,recommend:1})]);q.value=n.status==="fulfilled"&&n.value?.count||0,L.value=e.status==="fulfilled"&&e.value?.count||0,J.value=i.status==="fulfilled"&&i.value?.count||0}catch{}}function K(){y.current=1,h()}function ae(n){y.current=n.current,y.pageSize=n.pageSize,h()}function se(){Object.assign(u,{articleId:void 0,title:"",overview:"",content:"",status:0,image:""}),b.value=!1}function ne(){E.value=null,se(),k.value=!0}function le(n){E.value=n,Object.assign(u,{articleId:n.articleId,title:n.title||"",overview:n.overview||"",content:n.content||"",status:n.status??0,image:n.image||""}),b.value=!!n.recommend,k.value=!0}function oe(n){f.value=n,N.value=!0}async function ie(){if(!u.title?.trim()){p.warning("请输入公告标题");return}if(!u.content?.trim()){p.warning("请输入公告内容");return}V.value=!0;try{const n={...u,model:S,recommend:b.value?1:0};E.value?.articleId?(await Y(n),p.success("公告已更新")):(await he(n),p.success("公告已发布")),k.value=!1,h()}catch(n){p.error(n?.message||"保存失败")}finally{V.value=!1}}async function ue(n){try{await be(n.articleId),p.success("公告已删除"),h()}catch(e){p.error(e?.message||"删除失败")}}async function de(n,e){try{await Y({articleId:n.articleId,recommend:e?1:0}),p.success(e?"已置顶":"已取消置顶"),h()}catch(i){p.error(i?.message||"操作失败")}}function re(n){return n.type.startsWith("image/")?n.size>5*1024*1024?(p.error("图片大小不能超过 5MB"),!1):!0:(p.error("只能上传图片文件"),!1)}async function ce(n){const e=n.file;if(e){F.value=!0;try{const i=await Ce(e),C=(i?.url||i?.downloadUrl||"").trim();if(!C)throw new Error("上传成功但未返回图片地址");u.image=C,n.onSuccess?.(i,e),p.success("封面上传成功")}catch(i){n.onError?.(i),p.error(i instanceof Error?i.message:"封面上传失败")}finally{F.value=!1}}}function ve(){u.image=""}function me(n){n&&(D.value=n,O.value=!0)}return Ie(()=>h()),(n,e)=>{const i=d("a-button"),C=d("a-space"),I=d("a-col"),Q=d("a-row"),z=d("a-select-option"),W=d("a-select"),pe=d("a-input-search"),$=d("a-tag"),G=d("a-switch"),fe=d("a-popconfirm"),_e=d("a-table"),ge=d("a-input"),x=d("a-form-item"),we=d("a-upload"),X=d("a-textarea"),ye=d("a-form"),j=d("a-modal"),ke=d("a-divider");return v(),g("div",Me,[l("div",Ee,[e[14]||(e[14]=l("div",null,[l("h2",{class:"page-title"},"📢 公告管理"),l("p",{class:"page-desc"},"发布和管理平台公告,支持草稿、置顶、封面和预览")],-1)),t(C,null,{default:s(()=>[t(i,{type:"primary",onClick:ne},{icon:s(()=>[t(a(ze))]),default:s(()=>[e[12]||(e[12]=r(" 发布公告 ",-1))]),_:1}),t(i,{onClick:h,loading:a(A)},{icon:s(()=>[t(a(Se))]),default:s(()=>[e[13]||(e[13]=r(" 刷新 ",-1))]),_:1},8,["loading"])]),_:1})]),t(Q,{gutter:[16,16],class:"mb-6"},{default:s(()=>[t(I,{xs:12,md:8},{default:s(()=>[l("div",Ne,[e[16]||(e[16]=l("div",{class:"stat-icon"},"📢",-1)),l("div",Oe,[l("div",Pe,w(a(q)),1),e[15]||(e[15]=l("div",{class:"stat-label"},"全部公告",-1))])])]),_:1}),t(I,{xs:12,md:8},{default:s(()=>[l("div",Re,[e[18]||(e[18]=l("div",{class:"stat-icon"},"✅",-1)),l("div",Be,[l("div",Fe,w(a(L)),1),e[17]||(e[17]=l("div",{class:"stat-label"},"已发布",-1))])])]),_:1}),t(I,{xs:12,md:8},{default:s(()=>[l("div",Ve,[e[20]||(e[20]=l("div",{class:"stat-icon"},"⭐",-1)),l("div",De,[l("div",$e,w(a(J)),1),e[19]||(e[19]=l("div",{class:"stat-label"},"置顶公告",-1))])])]),_:1})]),_:1}),l("div",je,[l("div",He,[e[24]||(e[24]=l("span",{class:"panel-title"},"📋 公告列表",-1)),t(C,{wrap:""},{default:s(()=>[t(W,{value:a(T),"onUpdate:value":e[0]||(e[0]=o=>U(T)?T.value=o:null),style:{width:"120px"},onChange:K},{default:s(()=>[t(z,{value:void 0},{default:s(()=>[...e[21]||(e[21]=[r("全部状态",-1)])]),_:1}),t(z,{value:0},{default:s(()=>[...e[22]||(e[22]=[r("已发布",-1)])]),_:1}),t(z,{value:1},{default:s(()=>[...e[23]||(e[23]=[r("草稿",-1)])]),_:1})]),_:1},8,["value"]),t(pe,{value:a(M),"onUpdate:value":e[1]||(e[1]=o=>U(M)?M.value=o:null),placeholder:"搜索公告标题",style:{width:"220px"},onSearch:K},null,8,["value"])]),_:1})]),t(_e,{columns:ee,"data-source":a(H),loading:a(A),pagination:a(y),"row-key":"articleId",onChange:ae,size:"middle"},{bodyCell:s(({column:o,record:m})=>[o.key==="info"?(v(),g("div",qe,[m.image?(v(),g("img",{key:0,src:m.image,class:"ann-thumb"},null,8,Le)):(v(),g("div",Je,"📢")),l("div",Ke,[l("div",Qe,[m.recommend?(v(),g("span",We,"📌 置顶")):_("",!0),r(" "+w(m.title),1)]),l("div",Ge,w(m.overview||"暂无摘要"),1)])])):_("",!0),o.key==="status"?(v(),B($,{key:1,color:m.status===0?"success":"default"},{default:s(()=>[r(w(m.status===0?"已发布":"草稿"),1)]),_:2},1032,["color"])):_("",!0),o.key==="views"?(v(),g("span",Xe,"👁 "+w(m.actualViews||0),1)):_("",!0),o.key==="recommend"?(v(),B(G,{key:3,checked:!!m.recommend,size:"small",onChange:P=>de(m,P)},null,8,["checked","onChange"])):_("",!0),o.key==="createTime"?(v(),g("span",Ye,w(m.createTime?.substring(0,10)||"-"),1)):_("",!0),o.key==="action"?(v(),B(C,{key:5},{default:s(()=>[t(i,{type:"link",size:"small",onClick:P=>oe(m)},{default:s(()=>[...e[25]||(e[25]=[r("预览",-1)])]),_:1},8,["onClick"]),t(i,{type:"link",size:"small",onClick:P=>le(m)},{default:s(()=>[...e[26]||(e[26]=[r("编辑",-1)])]),_:1},8,["onClick"]),t(fe,{title:"确认删除此公告?",onConfirm:P=>ue(m)},{default:s(()=>[t(i,{type:"link",size:"small",danger:""},{default:s(()=>[...e[27]||(e[27]=[r("删除",-1)])]),_:1})]),_:1},8,["onConfirm"])]),_:2},1024)):_("",!0)]),_:1},8,["data-source","loading","pagination"])]),t(j,{open:a(k),"onUpdate:open":e[8]||(e[8]=o=>U(k)?k.value=o:null),title:a(E)?.articleId?"编辑公告":"发布公告",width:"760px","confirm-loading":a(V),onOk:ie,onCancel:e[9]||(e[9]=o=>k.value=!1)},{default:s(()=>[t(ye,{model:a(u),layout:"vertical"},{default:s(()=>[t(x,{label:"公告标题",required:""},{default:s(()=>[t(ge,{value:a(u).title,"onUpdate:value":e[2]||(e[2]=o=>a(u).title=o),placeholder:"请输入公告标题",maxlength:200,"show-count":""},null,8,["value"])]),_:1}),t(x,{label:"封面图"},{default:s(()=>[l("div",Ze,[a(u).image?(v(),g("div",et,[l("img",{src:a(u).image,class:"cover-preview-image"},null,8,tt),l("div",at,[t(i,{size:"small",onClick:e[3]||(e[3]=o=>me(a(u).image))},{default:s(()=>[...e[28]||(e[28]=[r("预览",-1)])]),_:1}),t(i,{size:"small",danger:"",onClick:ve},{default:s(()=>[...e[29]||(e[29]=[r("移除",-1)])]),_:1})])])):_("",!0),t(we,{accept:"image/*","show-upload-list":!1,"before-upload":re,"custom-request":ce},{default:s(()=>[t(i,{loading:a(F)},{default:s(()=>[...e[30]||(e[30]=[r("上传封面",-1)])]),_:1},8,["loading"])]),_:1}),e[31]||(e[31]=l("div",{class:"field-hint"},"支持 jpg/png/webp,适合公告 banner 场景,单张不超过 5MB",-1))])]),_:1}),t(x,{label:"公告摘要"},{default:s(()=>[t(X,{value:a(u).overview,"onUpdate:value":e[4]||(e[4]=o=>a(u).overview=o),rows:2,placeholder:"简短描述公告内容",maxlength:300,"show-count":""},null,8,["value"])]),_:1}),t(x,{label:"公告内容",required:""},{default:s(()=>[t(X,{value:a(u).content,"onUpdate:value":e[5]||(e[5]=o=>a(u).content=o),rows:10,placeholder:"公告正文内容..."},null,8,["value"])]),_:1}),t(Q,{gutter:16},{default:s(()=>[t(I,{span:12},{default:s(()=>[t(x,{label:"状态"},{default:s(()=>[t(W,{value:a(u).status,"onUpdate:value":e[6]||(e[6]=o=>a(u).status=o)},{default:s(()=>[t(z,{value:0},{default:s(()=>[...e[32]||(e[32]=[r("立即发布",-1)])]),_:1}),t(z,{value:1},{default:s(()=>[...e[33]||(e[33]=[r("保存为草稿",-1)])]),_:1})]),_:1},8,["value"])]),_:1})]),_:1}),t(I,{span:12},{default:s(()=>[t(x,{label:"是否置顶"},{default:s(()=>[t(G,{checked:a(b),"onUpdate:checked":e[7]||(e[7]=o=>U(b)?b.value=o:null)},null,8,["checked"]),e[34]||(e[34]=l("span",{class:"switch-tip"},"置顶公告将优先展示在列表顶部",-1))]),_:1})]),_:1})]),_:1})]),_:1},8,["model"])]),_:1},8,["open","title","confirm-loading"]),t(j,{open:a(N),"onUpdate:open":e[10]||(e[10]=o=>U(N)?N.value=o:null),title:a(f)?.title||"公告预览",width:"760px",footer:null},{default:s(()=>[a(f)?(v(),g(Ae,{key:0},[l("div",st,[l("span",nt,"发布时间:"+w(a(f).createTime?.substring(0,16)||"-"),1),a(f).recommend?(v(),B($,{key:0,color:"orange"},{default:s(()=>[...e[35]||(e[35]=[r("置顶",-1)])]),_:1})):_("",!0),t($,{color:a(f).status===0?"success":"default"},{default:s(()=>[r(w(a(f).status===0?"已发布":"草稿"),1)]),_:1},8,["color"])]),a(f).image?(v(),g("div",lt,[l("img",{src:a(f).image,class:"preview-cover"},null,8,ot)])):_("",!0),a(f).overview?(v(),g("div",it,w(a(f).overview),1)):_("",!0),t(ke),l("div",{class:"preview-content",innerHTML:a(f).content||a(f).overview||"暂无内容"},null,8,ut)],64)):_("",!0)]),_:1},8,["open","title"]),t(j,{open:a(O),"onUpdate:open":e[11]||(e[11]=o=>U(O)?O.value=o:null),title:"封面预览",footer:null,width:"640px"},{default:s(()=>[a(D)?(v(),g("img",{key:0,src:a(D),class:"image-preview-modal"},null,8,dt)):_("",!0)]),_:1},8,["open"])])}}}),gt=Te(rt,[["__scopeId","data-v-6454b5e2"]]);export{gt as default};
|