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