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

import{$t as e,C as t,D as n,Et as r,O as i,Q as a,S as o,T as s,Y as c,Z as l,_ as u,_t as d,at as f,ct as p,in as m,k as h,q as g,st as _,w as v,x as y}from"./vue.runtime.esm-bundler-CACvpnko.js";import{C as b,h as x,m as S}from"./index-D5exsJys.js";import{t as C}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{s as w}from"./competitions-Cv_Vb4Fy.js";import{t as T}from"./adminCompetition-D_kJwSx5.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-CAv40o5e.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(h({__name:`ReviewerManageView`,setup(h){let{selectedCompetitionId:C}=b(T()),B=d([]),V=d({}),H=d(null),U=d([]),W=d(!1),G=d(!1),K=d(!1),q=d(`create`),J=d(!1),Y=d(null),X=d(),Z=d({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}f(C,()=>{H.value=null,he().then(()=>Q())},{immediate:!0}),f(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(d,f)=>{let h=l(`el-alert`),y=l(`el-input`),b=l(`el-form-item`),x=l(`el-col`),S=l(`el-row`),w=l(`el-form`),T=l(`el-button`),E=l(`el-dialog`),D=a(`loading`);return g(),s(`div`,re,[f[11]||=o(`div`,{class:`rev-head`},[o(`h5`,{class:`section-title mb-0`},`评审员管理`)],-1),r(C)?p((g(),s(`div`,ie,[o(`aside`,ae,[f[6]||=o(`div`,{class:`reviewer-track-panel-title`},`赛道配置`,-1),o(`div`,oe,[(g(!0),s(u,null,c(B.value,t=>(g(),s(`button`,{key:t.id,type:`button`,class:e([`reviewer-track-tab`,{active:H.value===t.track_code}]),onClick:e=>ge(t.track_code)},[o(`span`,ce,m(t.title),1),o(`span`,le,m(V.value[t.track_code]??0)+` 人`,1)],10,se))),128))])]),o(`section`,ue,[o(`div`,de,[o(`div`,null,[o(`h6`,A,m(pe.value||`—`),1),o(`p`,j,m(me.value),1)]),o(`div`,M,[o(`button`,{type:`button`,class:`prm-btn-outline`,disabled:!H.value,onClick:ve},` 新增评审员 `,8,N)])]),p((g(),s(`div`,P,[H.value?(g(),s(`table`,F,[f[7]||=o(`thead`,null,[o(`tr`,null,[o(`th`,{style:{width:`18%`}},`姓名`),o(`th`,{style:{width:`22%`}},`电话`),o(`th`,{style:{width:`24%`}},`账户`),o(`th`,{style:{width:`24%`}},`密码`),o(`th`,{class:`text-end`,style:{width:`12%`}},`操作`)])],-1),o(`tbody`,null,[(g(!0),s(u,null,c(U.value,e=>(g(),s(`tr`,{key:e.id},[o(`td`,null,m(e.reviewer?.name??`—`),1),o(`td`,null,m(_e(e)),1),o(`td`,null,m(e.reviewer?.username??`—`),1),o(`td`,null,m($(e)),1),o(`td`,I,[o(`button`,{type:`button`,class:`prm-btn-outline sm`,onClick:t=>ye(e)},`修改`,8,L),o(`button`,{type:`button`,class:`prm-btn-light sm`,onClick:t=>xe(e)},`删除`,8,R)])]))),128))])])):v(``,!0),H.value?v(``,!0):(g(),s(`div`,z,m(B.value.length===0?`本场暂无启用中的赛道,请先在「赛事中心」配置赛道后再维护评审员。`:``),1))])),[[D,G.value]]),f[8]||=o(`p`,{class:`footnote`},` 正式环境仅存密码摘要;列表中为占位符而非明文密码。 `,-1)])])),[[D,W.value]]):(g(),t(h,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`rev-alert`,title:`请先在顶栏「赛事切换」中选择一场赛事,再按赛道维护评审员。`})),i(E,{modelValue:K.value,"onUpdate:modelValue":f[5]||=e=>K.value=e,title:q.value===`create`?`新增评审员`:`修改评审员`,width:`520px`,"destroy-on-close":``,class:`rev-dialog`},{footer:_(()=>[i(T,{onClick:f[4]||=e=>K.value=!1},{default:_(()=>[...f[9]||=[n(`取消`,-1)]]),_:1}),i(T,{type:`primary`,loading:J.value,onClick:be},{default:_(()=>[...f[10]||=[n(`确定`,-1)]]),_:1},8,[`loading`])]),default:_(()=>[i(w,{ref_key:`formRef`,ref:X,model:Z.value,rules:fe,"label-position":`top`,class:`rev-form`},{default:_(()=>[i(S,{gutter:12},{default:_(()=>[i(x,{span:12},{default:_(()=>[i(b,{label:`姓名`,prop:`name`,required:``},{default:_(()=>[i(y,{modelValue:Z.value.name,"onUpdate:modelValue":f[0]||=e=>Z.value.name=e,maxlength:`64`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),i(x,{span:12},{default:_(()=>[i(b,{label:`电话`,prop:`mobile`},{default:_(()=>[i(y,{modelValue:Z.value.mobile,"onUpdate:modelValue":f[1]||=e=>Z.value.mobile=e,maxlength:`20`,placeholder:`可选`},null,8,[`modelValue`])]),_:1})]),_:1}),i(x,{span:12},{default:_(()=>[i(b,{label:`账户`,prop:`username`,required:``},{default:_(()=>[i(y,{modelValue:Z.value.username,"onUpdate:modelValue":f[2]||=e=>Z.value.username=e,maxlength:`64`,autocomplete:`off`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),i(x,{span:12},{default:_(()=>[i(b,{label:q.value===`create`?`密码`:`密码(不修改请留空)`,prop:`password`},{default:_(()=>[i(y,{modelValue:Z.value.password,"onUpdate:modelValue":f[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};