You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 line
8.3 KiB
1 line
8.3 KiB
import{$ as e,A as t,C as n,Dt as r,J as i,O as a,Q as o,S as s,T as c,X as l,_ as u,an as d,ct as f,en as p,k as m,lt as h,ot as g,vt as _,w as v,x as y}from"./vue.runtime.esm-bundler-Dt_AyShc.js";import{C as b,h as x,m as S}from"./index-DDrON-pi.js";import{t as C}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{o as w}from"./competitions-BARz4gh0.js";import{t as T}from"./adminCompetition-BASh_Kak.js";import{a as E,c as D,i as O,n as k,o as ee,s as te,t as ne}from"./reviewerScopes-Cj9Crer7.js";var re={class:`proto-reviewer-page admin-desktop-page`},ie={key:1,class:`reviewer-manage-shell`},ae={class:`reviewer-track-panel`},oe={class:`reviewer-track-tabs`},se=[`onClick`],ce={class:`reviewer-track-tab-name`},le={class:`reviewer-track-tab-count`},ue={class:`reviewer-editor-panel`},de={class:`reviewer-editor-head`},A={class:`reviewer-track-title`},j={class:`reviewer-track-meta mb-0`},M={class:`reviewer-editor-actions`},N=[`disabled`],P={class:`table-responsive`},F={key:0,class:`table table-sm align-middle mb-0 reviewer-manage-table`},I={class:`text-end reviewer-row-actions`},L=[`onClick`],R=[`onClick`],z={key:1,class:`empty-hint`},B=C(t({__name:`ReviewerManageView`,setup(t){let{selectedCompetitionId:C}=b(T()),B=_([]),V=_({}),H=_(null),U=_([]),W=_(!1),G=_(!1),K=_(!1),q=_(`create`),J=_(!1),Y=_(null),X=_(),Z=_({name:``,mobile:``,username:``,password:``}),fe={name:[{required:!0,message:`请填写姓名`,trigger:`blur`}],username:[{required:!0,message:`请填写账户`,trigger:`blur`},{pattern:/^[A-Za-z0-9._-]+$/,message:`仅字母、数字、点、横线或下划线`,trigger:`blur`}],password:[{validator:(e,t,n)=>{if(q.value===`create`&&(!t||String(t).trim()===``)){n(Error(`请填写密码`));return}if(t&&String(t).trim().length>0&&String(t).length<6){n(Error(`密码不少于 6 位`));return}n()},trigger:`blur`}]},pe=y(()=>B.value.find(e=>e.track_code===H.value)?.title??``),me=y(()=>`已配置 ${H.value?V.value[H.value]??0:0} 名评审员`);async function he(){let e=C.value;if(W.value=!0,!e){B.value=[],V.value={},H.value=null,W.value=!1;return}try{if(B.value=(await w(e)).filter(e=>e.is_enabled).sort((e,t)=>e.sort-t.sort),!B.value.length){H.value=null,V.value={};return}(!H.value||!B.value.some(e=>e.track_code===H.value))&&(H.value=B.value[0]?.track_code??null),V.value=await O(e)}catch(e){B.value=[],x.warning(e instanceof Error?e.message:`赛道加载失败`)}finally{W.value=!1}}async function Q(){let e=C.value,t=H.value;if(!e||!t){U.value=[];return}G.value=!0;try{U.value=(await E({competition_id:e,track_code:t,page:1,per_page:500})).data,V.value=await O(e)}catch(e){U.value=[],x.error(e instanceof Error?e.message:`加载失败`)}finally{G.value=!1}}function ge(e){H.value=e}g(C,()=>{H.value=null,he().then(()=>Q())},{immediate:!0}),g(H,()=>{Q()});function $(e){return e.reviewer?.password_display??`—`}function _e(e){let t=e.reviewer?.mobile;return t&&String(t).trim()!==``?String(t):`—`}function ve(){q.value=`create`,Y.value=null,Z.value={name:``,mobile:``,username:``,password:``},K.value=!0}function ye(e){q.value=`edit`,Y.value=e.reviewer_id;let t=e.reviewer;Z.value={name:t?.name??``,mobile:t?.mobile??``,username:t?.username??``,password:``},K.value=!0}async function be(){if(!X.value)return;let e=C.value,t=H.value;!e||!t||await X.value.validate(async n=>{if(n){J.value=!0;try{if(q.value===`create`){let n=0;try{n=(await ee({name:Z.value.name.trim(),username:Z.value.username.trim(),password:Z.value.password,mobile:Z.value.mobile.trim()||null})).id}catch(e){x.error(e instanceof Error?e.message:`创建评审员失败`),J.value=!1;return}try{await ne({reviewer_id:n,competition_id:e,track_code:t})}catch(e){try{await te(n)}catch{}x.error(e instanceof Error?e.message:`绑定赛道失败`),J.value=!1;return}x.success(`评审员信息已保存`)}else{let e=Y.value;await D(e,{name:Z.value.name.trim(),username:Z.value.username.trim(),mobile:Z.value.mobile.trim()||null,...Z.value.password.trim()?{password:Z.value.password.trim()}:{}}),x.success(`评审员信息已更新`)}K.value=!1,await Q(),e&&(V.value=await O(e))}catch(e){x.error(e instanceof Error?e.message:`保存失败`)}finally{J.value=!1}}})}async function xe(e){let t=e.reviewer?.name??`该评审员`;try{await S.confirm(`确定移除「${t}」对本赛道的评审权限吗?(不删除全局账号)`,`确认删除`,{type:`warning`,confirmButtonText:`确定删除`,cancelButtonText:`取消`})}catch{return}try{await k(e.id),x.success(`已移除`),await Q();let t=C.value;t&&(V.value=await O(t))}catch(e){x.error(e instanceof Error?e.message:`删除失败`)}}return(t,g)=>{let _=o(`el-alert`),y=o(`el-input`),b=o(`el-form-item`),x=o(`el-col`),S=o(`el-row`),w=o(`el-form`),T=o(`el-button`),E=o(`el-dialog`),D=e(`loading`);return i(),c(`div`,re,[g[11]||=s(`div`,{class:`rev-head`},[s(`h5`,{class:`section-title mb-0`},`评审员管理`)],-1),r(C)?h((i(),c(`div`,ie,[s(`aside`,ae,[g[6]||=s(`div`,{class:`reviewer-track-panel-title`},`赛道配置`,-1),s(`div`,oe,[(i(!0),c(u,null,l(B.value,e=>(i(),c(`button`,{key:e.id,type:`button`,class:p([`reviewer-track-tab`,{active:H.value===e.track_code}]),onClick:t=>ge(e.track_code)},[s(`span`,ce,d(e.title),1),s(`span`,le,d(V.value[e.track_code]??0)+` 人`,1)],10,se))),128))])]),s(`section`,ue,[s(`div`,de,[s(`div`,null,[s(`h6`,A,d(pe.value||`—`),1),s(`p`,j,d(me.value),1)]),s(`div`,M,[s(`button`,{type:`button`,class:`prm-btn-outline`,disabled:!H.value,onClick:ve},` 新增评审员 `,8,N)])]),h((i(),c(`div`,P,[H.value?(i(),c(`table`,F,[g[7]||=s(`thead`,null,[s(`tr`,null,[s(`th`,{style:{width:`18%`}},`姓名`),s(`th`,{style:{width:`22%`}},`电话`),s(`th`,{style:{width:`24%`}},`账户`),s(`th`,{style:{width:`24%`}},`密码`),s(`th`,{class:`text-end`,style:{width:`12%`}},`操作`)])],-1),s(`tbody`,null,[(i(!0),c(u,null,l(U.value,e=>(i(),c(`tr`,{key:e.id},[s(`td`,null,d(e.reviewer?.name??`—`),1),s(`td`,null,d(_e(e)),1),s(`td`,null,d(e.reviewer?.username??`—`),1),s(`td`,null,d($(e)),1),s(`td`,I,[s(`button`,{type:`button`,class:`prm-btn-outline sm`,onClick:t=>ye(e)},`修改`,8,L),s(`button`,{type:`button`,class:`prm-btn-light sm`,onClick:t=>xe(e)},`删除`,8,R)])]))),128))])])):v(``,!0),H.value?v(``,!0):(i(),c(`div`,z,d(B.value.length===0?`本场暂无启用中的赛道,请先在「赛事中心」配置赛道后再维护评审员。`:``),1))])),[[D,G.value]]),g[8]||=s(`p`,{class:`footnote`},` 正式环境仅存密码摘要;列表中为占位符而非明文密码。 `,-1)])])),[[D,W.value]]):(i(),n(_,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`rev-alert`,title:`请先在顶栏「赛事切换」中选择一场赛事,再按赛道维护评审员。`})),m(E,{modelValue:K.value,"onUpdate:modelValue":g[5]||=e=>K.value=e,title:q.value===`create`?`新增评审员`:`修改评审员`,width:`520px`,"destroy-on-close":``,class:`rev-dialog`},{footer:f(()=>[m(T,{onClick:g[4]||=e=>K.value=!1},{default:f(()=>[...g[9]||=[a(`取消`,-1)]]),_:1}),m(T,{type:`primary`,loading:J.value,onClick:be},{default:f(()=>[...g[10]||=[a(`确定`,-1)]]),_:1},8,[`loading`])]),default:f(()=>[m(w,{ref_key:`formRef`,ref:X,model:Z.value,rules:fe,"label-position":`top`,class:`rev-form`},{default:f(()=>[m(S,{gutter:12},{default:f(()=>[m(x,{span:12},{default:f(()=>[m(b,{label:`姓名`,prop:`name`,required:``},{default:f(()=>[m(y,{modelValue:Z.value.name,"onUpdate:modelValue":g[0]||=e=>Z.value.name=e,maxlength:`64`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),m(x,{span:12},{default:f(()=>[m(b,{label:`电话`,prop:`mobile`},{default:f(()=>[m(y,{modelValue:Z.value.mobile,"onUpdate:modelValue":g[1]||=e=>Z.value.mobile=e,maxlength:`20`,placeholder:`可选`},null,8,[`modelValue`])]),_:1})]),_:1}),m(x,{span:12},{default:f(()=>[m(b,{label:`账户`,prop:`username`,required:``},{default:f(()=>[m(y,{modelValue:Z.value.username,"onUpdate:modelValue":g[2]||=e=>Z.value.username=e,maxlength:`64`,autocomplete:`off`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),m(x,{span:12},{default:f(()=>[m(b,{label:q.value===`create`?`密码`:`密码(不修改请留空)`,prop:`password`},{default:f(()=>[m(y,{modelValue:Z.value.password,"onUpdate:modelValue":g[3]||=e=>Z.value.password=e,type:`password`,"show-password":``,maxlength:`255`,autocomplete:`new-password`,placeholder:q.value===`create`?`必填`:`留空表示不修改`},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1})]),_:1},8,[`model`])]),_:1},8,[`modelValue`,`title`])])}}}),[[`__scopeId`,`data-v-8b97a568`]]);export{B as default}; |