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
9.5 KiB

import{r as e}from"./rolldown-runtime-BYbx6iT9.js";import{$t as t,C as n,D as r,Et as ee,O as i,Q as te,S as ne,Y as a,Z as o,_t as s,at as c,b as l,ct as u,g as d,in as f,k as p,q as m,st as h,w as g,x as _}from"./vue.runtime.esm-bundler-OsdSFvn7.js";import{b as v,d as y,f as b,i as x}from"./index-DFPdDGyr.js";import{t as S}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{o as C}from"./competitions-B-kaXeZ_.js";import{t as w}from"./adminCompetition-pM-_JRNe.js";async function T(e){let{data:t}=await x.post(`/reviewers`,e),n=t?.data??t;if(!n||typeof n!=`object`)throw Error(`创建响应无效`);return n}async function E(e,t){let{data:n}=await x.patch(`/reviewers/${e}`,t),r=n?.data??n;if(!r||typeof r!=`object`)throw Error(`更新响应无效`);return r}async function re(e){await x.post(`/reviewers/${e}/delete`)}function D(e){if(!e||typeof e!=`object`)throw Error(`列表响应格式无效`);let t=e;if(Array.isArray(t.data)&&typeof t.current_page==`number`){let e=t.data;return{data:e,meta:{current_page:t.current_page,last_page:typeof t.last_page==`number`?t.last_page:1,per_page:typeof t.per_page==`number`?t.per_page:e.length||15,total:typeof t.total==`number`?t.total:e.length}}}throw Error(`列表响应格式无效`)}async function ie(e){let{data:t}=await x.get(`/reviewer-scopes`,{params:e});return D(t)}async function O(e){let{data:t}=await x.get(`/competitions/${e}/reviewer-scope-track-counts`),n=t?.data??t;return!n||typeof n!=`object`?{}:n}async function ae(e){let{data:t}=await x.post(`/reviewer-scopes`,e),n=t?.data??t;if(!n||typeof n!=`object`)throw Error(`创建响应无效`);return n}async function oe(e){await x.post(`/reviewer-scopes/${e}/delete`)}var se={class:`proto-reviewer-page admin-desktop-page`},ce={key:1,class:`reviewer-manage-shell`},le={class:`reviewer-track-panel`},ue={class:`reviewer-track-tabs`},k=[`onClick`],A={class:`reviewer-track-tab-name`},j={class:`reviewer-track-tab-count`},M={class:`reviewer-editor-panel`},N={class:`reviewer-editor-head`},P={class:`reviewer-track-title`},F={class:`reviewer-track-meta mb-0`},I={class:`reviewer-editor-actions`},L=[`disabled`],R={class:`table-responsive`},z={key:0,class:`table table-sm align-middle mb-0 reviewer-manage-table`},B={class:`text-end reviewer-row-actions`},V=[`onClick`],H=[`onClick`],U={key:1,class:`empty-hint`},W=p({__name:`ReviewerManageView`,setup(e){let{selectedCompetitionId:p}=v(w()),x=s([]),S=s({}),D=s(null),W=s([]),G=s(!1),K=s(!1),q=s(!1),J=s(`create`),Y=s(!1),X=s(null),Z=s(),Q=s({name:``,mobile:``,username:``,password:``}),de={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(J.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`}]},fe=l(()=>x.value.find(e=>e.track_code===D.value)?.title??``),pe=l(()=>`已配置 ${D.value?S.value[D.value]??0:0} 名评审员`);async function me(){let e=p.value;if(G.value=!0,!e){x.value=[],S.value={},D.value=null,G.value=!1;return}try{if(x.value=(await C(e)).filter(e=>e.is_enabled).sort((e,t)=>e.sort-t.sort),!x.value.length){D.value=null,S.value={};return}(!D.value||!x.value.some(e=>e.track_code===D.value))&&(D.value=x.value[0]?.track_code??null),S.value=await O(e)}catch(e){x.value=[],b.warning(e instanceof Error?e.message:`赛道加载失败`)}finally{G.value=!1}}async function $(){let e=p.value,t=D.value;if(!e||!t){W.value=[];return}K.value=!0;try{W.value=(await ie({competition_id:e,track_code:t,page:1,per_page:500})).data,S.value=await O(e)}catch(e){W.value=[],b.error(e instanceof Error?e.message:`加载失败`)}finally{K.value=!1}}function he(e){D.value=e}c(p,()=>{D.value=null,me().then(()=>$())},{immediate:!0}),c(D,()=>{$()});function ge(e){return e.reviewer?.password_display??`—`}function _e(e){let t=e.reviewer?.mobile;return t&&String(t).trim()!==``?String(t):`—`}function ve(){J.value=`create`,X.value=null,Q.value={name:``,mobile:``,username:``,password:``},q.value=!0}function ye(e){J.value=`edit`,X.value=e.reviewer_id;let t=e.reviewer;Q.value={name:t?.name??``,mobile:t?.mobile??``,username:t?.username??``,password:``},q.value=!0}async function be(){if(!Z.value)return;let e=p.value,t=D.value;!e||!t||await Z.value.validate(async n=>{if(n){Y.value=!0;try{if(J.value===`create`){let n=0;try{n=(await T({name:Q.value.name.trim(),username:Q.value.username.trim(),password:Q.value.password,mobile:Q.value.mobile.trim()||null})).id}catch(e){b.error(e instanceof Error?e.message:`创建评审员失败`),Y.value=!1;return}try{await ae({reviewer_id:n,competition_id:e,track_code:t})}catch(e){try{await re(n)}catch{}b.error(e instanceof Error?e.message:`绑定赛道失败`),Y.value=!1;return}b.success(`评审员信息已保存`)}else{let e=X.value;await E(e,{name:Q.value.name.trim(),username:Q.value.username.trim(),mobile:Q.value.mobile.trim()||null,...Q.value.password.trim()?{password:Q.value.password.trim()}:{}}),b.success(`评审员信息已更新`)}q.value=!1,await $(),e&&(S.value=await O(e))}catch(e){b.error(e instanceof Error?e.message:`保存失败`)}finally{Y.value=!1}}})}async function xe(e){let t=e.reviewer?.name??`该评审员`;try{await y.confirm(`确定移除「${t}」对本赛道的评审权限吗?(不删除全局账号)`,`确认删除`,{type:`warning`,confirmButtonText:`确定删除`,cancelButtonText:`取消`})}catch{return}try{await oe(e.id),b.success(`已移除`),await $();let t=p.value;t&&(S.value=await O(t))}catch(e){b.error(e instanceof Error?e.message:`删除失败`)}}return(e,s)=>{let c=o(`el-alert`),l=o(`el-input`),v=o(`el-form-item`),y=o(`el-col`),b=o(`el-row`),C=o(`el-form`),w=o(`el-button`),T=o(`el-dialog`),E=te(`loading`);return m(),g(`div`,se,[s[11]||=_(`div`,{class:`rev-head`},[_(`h5`,{class:`section-title mb-0`},`评审员管理`)],-1),ee(p)?u((m(),g(`div`,ce,[_(`aside`,le,[s[6]||=_(`div`,{class:`reviewer-track-panel-title`},`赛道配置`,-1),_(`div`,ue,[(m(!0),g(d,null,a(x.value,e=>(m(),g(`button`,{key:e.id,type:`button`,class:t([`reviewer-track-tab`,{active:D.value===e.track_code}]),onClick:t=>he(e.track_code)},[_(`span`,A,f(e.title),1),_(`span`,j,f(S.value[e.track_code]??0)+` 人`,1)],10,k))),128))])]),_(`section`,M,[_(`div`,N,[_(`div`,null,[_(`h6`,P,f(fe.value||`—`),1),_(`p`,F,f(pe.value),1)]),_(`div`,I,[_(`button`,{type:`button`,class:`prm-btn-outline`,disabled:!D.value,onClick:ve},` 新增评审员 `,8,L)])]),u((m(),g(`div`,R,[D.value?(m(),g(`table`,z,[s[7]||=_(`thead`,null,[_(`tr`,null,[_(`th`,{style:{width:`18%`}},`姓名`),_(`th`,{style:{width:`22%`}},`电话`),_(`th`,{style:{width:`24%`}},`账户`),_(`th`,{style:{width:`24%`}},`密码`),_(`th`,{class:`text-end`,style:{width:`12%`}},`操作`)])],-1),_(`tbody`,null,[(m(!0),g(d,null,a(W.value,e=>(m(),g(`tr`,{key:e.id},[_(`td`,null,f(e.reviewer?.name??`—`),1),_(`td`,null,f(_e(e)),1),_(`td`,null,f(e.reviewer?.username??`—`),1),_(`td`,null,f(ge(e)),1),_(`td`,B,[_(`button`,{type:`button`,class:`prm-btn-outline sm`,onClick:t=>ye(e)},`修改`,8,V),_(`button`,{type:`button`,class:`prm-btn-light sm`,onClick:t=>xe(e)},`删除`,8,H)])]))),128))])])):n(``,!0),D.value?n(``,!0):(m(),g(`div`,U,f(x.value.length===0?`本场暂无启用中的赛道,请先在「赛事中心」配置赛道后再维护评审员。`:``),1))])),[[E,K.value]]),s[8]||=_(`p`,{class:`footnote`},` 正式环境仅存密码摘要;列表中为占位符而非明文密码。 `,-1)])])),[[E,G.value]]):(m(),ne(c,{key:0,type:`warning`,"show-icon":``,closable:!1,class:`rev-alert`,title:`请先在顶栏「赛事切换」中选择一场赛事,再按赛道维护评审员。`})),i(T,{modelValue:q.value,"onUpdate:modelValue":s[5]||=e=>q.value=e,title:J.value===`create`?`新增评审员`:`修改评审员`,width:`520px`,"destroy-on-close":``,class:`rev-dialog`},{footer:h(()=>[i(w,{onClick:s[4]||=e=>q.value=!1},{default:h(()=>[...s[9]||=[r(`取消`,-1)]]),_:1}),i(w,{type:`primary`,loading:Y.value,onClick:be},{default:h(()=>[...s[10]||=[r(`确定`,-1)]]),_:1},8,[`loading`])]),default:h(()=>[i(C,{ref_key:`formRef`,ref:Z,model:Q.value,rules:de,"label-position":`top`,class:`rev-form`},{default:h(()=>[i(b,{gutter:12},{default:h(()=>[i(y,{span:12},{default:h(()=>[i(v,{label:`姓名`,prop:`name`,required:``},{default:h(()=>[i(l,{modelValue:Q.value.name,"onUpdate:modelValue":s[0]||=e=>Q.value.name=e,maxlength:`64`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),i(y,{span:12},{default:h(()=>[i(v,{label:`电话`,prop:`mobile`},{default:h(()=>[i(l,{modelValue:Q.value.mobile,"onUpdate:modelValue":s[1]||=e=>Q.value.mobile=e,maxlength:`20`,placeholder:`可选`},null,8,[`modelValue`])]),_:1})]),_:1}),i(y,{span:12},{default:h(()=>[i(v,{label:`账户`,prop:`username`,required:``},{default:h(()=>[i(l,{modelValue:Q.value.username,"onUpdate:modelValue":s[2]||=e=>Q.value.username=e,maxlength:`64`,autocomplete:`off`,placeholder:`必填`},null,8,[`modelValue`])]),_:1})]),_:1}),i(y,{span:12},{default:h(()=>[i(v,{label:J.value===`create`?`密码`:`密码(不修改请留空)`,prop:`password`},{default:h(()=>[i(l,{modelValue:Q.value.password,"onUpdate:modelValue":s[3]||=e=>Q.value.password=e,type:`password`,"show-password":``,maxlength:`255`,autocomplete:`new-password`,placeholder:J.value===`create`?`必填`:`留空表示不修改`},null,8,[`modelValue`,`placeholder`])]),_:1},8,[`label`])]),_:1})]),_:1})]),_:1},8,[`model`])]),_:1},8,[`modelValue`,`title`])])}}}),G=e({default:()=>K}),K=S(W,[[`__scopeId`,`data-v-7a2127e6`]]);export{G as n,K as t};