|
|
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}; |