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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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