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