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
11 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{C as e,D as t,Et as n,O as r,Q as ee,S as i,W as te,Y as a,Z as o,_t as s,at as c,b as l,ct as ne,g as u,in as d,k as f,q as p,st as m,w as h,x as g}from"./vue.runtime.esm-bundler-OsdSFvn7.js";import{b as _,f as v,i as y}from"./index-DFPdDGyr.js";import{t as b}from"./_plugin-vue_export-helper-CXTkFu_Z.js";import{a as x}from"./competitions-B-kaXeZ_.js";import{t as re}from"./adminCompetition-pM-_JRNe.js";import{t as ie}from"./competitionAdminLabels-v0rVrY9u.js";import{t as ae}from"./datetimeShanghai-D1tceWM9.js";async function S(e){let{data:t}=await y.get(`/competitions/${e}/dashboard`);if(!t||typeof t!=`object`)throw Error(`首页统计响应无效`);return t}var C={class:`dashboard`},w={class:`dashboard-head`},oe={class:`meta-line`},se={class:`time-line`},ce={class:`head-actions`},le={class:`metric-grid`,"aria-label":`核心指标`},ue={class:`metric-label`},T={class:`metric-value`},E={class:`metric-hint`},D={class:`main-grid`},O={class:`panel`},k={class:`setup-list`},A={class:`setup-copy`},j={class:`panel`},M={class:`progress-kpis`},N={class:`main-grid main-grid--wide`},P={class:`panel`},F={class:`panel-head`},I={class:`panel-subtitle`},L={class:`panel`},R={class:`shortcut-list`},z=[`href`],de={key:1,class:`shortcut shortcut-button`,type:`button`,disabled:``},B={class:`panel`},V=b(f({__name:`AdminDashboardView`,setup(f){let y=re(),{competitions:b,selectedCompetitionId:V}=_(y),H=s(!1),U=s(null),fe=[{key:`published`,label:`赛事发布`,description:`对外报名和评审入口依赖发布状态`,routeName:`admin-competition-workspace`},{key:`signup_form_schema`,label:`报名表单`,description:`选手报名字段由 Schema 渲染`,routeName:`admin-competition-workspace`},{key:`tracks`,label:`赛道配置`,description:`评审范围和报名分组按赛道隔离`,routeName:`admin-competition-workspace`},{key:`pledge`,label:`承诺书`,description:`提交报名时需要签署的赛事文本`,routeName:`admin-competition-workspace`},{key:`review_form_schema`,label:`评审表单`,description:`未配置时评审端将使用系统默认表单`,routeName:`admin-competition-workspace`},{key:`reviewer_scopes`,label:`评审范围`,description:`评审员必须绑定赛事和赛道后才能看到项目`,routeName:`admin-reviewers-list`}],W=l(()=>U.value?.summary??null),G=l(()=>U.value?.competition??null),pe=l(()=>{let e=G.value;if(!e)return`未选择赛事`;let t=Date.now(),n=e.signup_open_at?new Date(e.signup_open_at).getTime():null,r=e.signup_close_at?new Date(e.signup_close_at).getTime():null;return e.published?n&&t<n?`报名未开始`:r&&t>r?e.status===`reviewing`?`评审中`:`报名已截止`:e.status===`reviewing`?`评审中`:e.status===`ended`?`已结束`:`报名中`:`未发布`}),me=l(()=>{let e=W.value;return[{label:`报名总数`,value:e?.applications_total??0,hint:`含草稿和已提交`},{label:`已提交`,value:e?.applications_submitted??0,hint:`可进入评审范围`},{label:`草稿`,value:e?.applications_draft??0,hint:`选手尚未正式提交`},{label:`待评项目`,value:e?.applications_pending_review??0,hint:`参与评审且暂无评分`},{label:`已评项目`,value:e?.applications_reviewed??0,hint:`至少已有一条评分`},{label:`评审记录`,value:e?.review_scores_total??0,hint:`累计提交评分数`}]}),he=l(()=>{let e=W.value;return!e||e.applications_submitted===0?0:Math.round(e.applications_reviewed/e.applications_submitted*100)}),K=l(()=>`/admin/`.endsWith(`/`)?`/admin/`.slice(0,-1):`/admin/`),q=l(()=>{let e=G.value?.slug;return e?`${K.value}/c/${encodeURIComponent(e)}/apply`:``}),J=l(()=>{let e=G.value?.slug;return e?`${K.value}/c/${encodeURIComponent(e)}/review`:``}),Y=l(()=>{let e=G.value?.slug;return e?`${K.value}/c/${encodeURIComponent(e)}/manage`:``});async function ge(){if(b.value.length>0)return;let e=await x({page:1,per_page:100});y.setCompetitionList(e.data)}async function X(){H.value=!0;try{await ge();let e=V.value;if(!e){U.value=null;return}U.value=await S(e)}catch(e){U.value=null,v.error(e instanceof Error?e.message:`首页数据加载失败`)}finally{H.value=!1}}function Z(e){return e?ae(e,`未配置`):`未配置`}function Q(e){return e===`submitted`||e===`published`||e===`signup_open`?`success`:e===`draft`?`info`:e===`reviewing`?`primary`:e===`signup_closed`||e===`ended`?`warning`:`info`}function _e(e){return e===`submitted`?`已提交`:e===`draft`?`草稿`:e}async function $(e){if(e)try{await navigator.clipboard.writeText(`${window.location.origin}${e}`),v.success(`已复制完整链接`)}catch{v.error(`复制失败,请手动选择文本`)}}return c(V,()=>{X()}),te(()=>{X()}),(te,s)=>{let c=o(`el-tag`),l=o(`el-button`),f=o(`RouterLink`),_=o(`el-progress`),v=o(`el-table-column`),y=o(`el-table`),b=o(`el-empty`),x=ee(`loading`);return ne((p(),h(`div`,C,[U.value&&G.value?(p(),h(u,{key:0},[g(`section`,w,[g(`div`,null,[s[3]||=g(`div`,{class:`eyebrow`},`运营工作台`,-1),g(`h1`,null,d(G.value.name),1),g(`div`,oe,[r(c,{type:Q(G.value.status),effect:`plain`},{default:m(()=>[t(d(n(ie)(G.value.status)),1)]),_:1},8,[`type`]),r(c,{type:G.value.published?`success`:`info`,effect:`plain`},{default:m(()=>[t(d(G.value.published?`已发布`:`未发布`),1)]),_:1},8,[`type`]),g(`span`,null,`当前阶段:`+d(pe.value),1),g(`span`,null,`slug:`+d(G.value.slug),1)]),g(`div`,se,[g(`span`,null,`报名开始:`+d(Z(G.value.signup_open_at)),1),g(`span`,null,`报名截止:`+d(Z(G.value.signup_close_at)),1)])]),g(`div`,ce,[r(f,{to:{name:`admin-competition-workspace`}},{default:m(()=>[r(l,{type:`danger`},{default:m(()=>[...s[4]||=[t(`赛事配置`,-1)]]),_:1})]),_:1}),r(f,{to:{name:`admin-competitions-list`}},{default:m(()=>[r(l,null,{default:m(()=>[...s[5]||=[t(`赛事列表`,-1)]]),_:1})]),_:1})])]),g(`section`,le,[(p(!0),h(u,null,a(me.value,e=>(p(),h(`div`,{key:e.label,class:`metric-card`},[g(`div`,ue,d(e.label),1),g(`div`,T,d(e.value),1),g(`div`,E,d(e.hint),1)]))),128))]),g(`section`,D,[g(`div`,O,[s[7]||=g(`div`,{class:`panel-head`},[g(`h2`,null,`配置完整度`),g(`span`,{class:`panel-subtitle`},`影响报名、提交和评审流转`)],-1),g(`div`,k,[(p(),h(u,null,a(fe,e=>g(`div`,{key:e.key,class:`setup-row`},[r(c,{type:U.value.setup[e.key]?`success`:e.key===`review_form_schema`?`warning`:`danger`,effect:`plain`,size:`small`},{default:m(()=>[t(d(U.value.setup[e.key]?`已完成`:e.key===`review_form_schema`?`默认`:`待处理`),1)]),_:2},1032,[`type`]),g(`div`,A,[g(`strong`,null,d(e.label),1),g(`span`,null,d(e.description),1)]),r(f,{to:{name:e.routeName}},{default:m(()=>[r(l,{link:``,type:`danger`},{default:m(()=>[...s[6]||=[t(`处理`,-1)]]),_:1})]),_:1},8,[`to`])])),64))])]),g(`div`,j,[s[13]||=g(`div`,{class:`panel-head`},[g(`h2`,null,`评审进度`),g(`span`,{class:`panel-subtitle`},`仅统计已提交报名`)],-1),r(_,{percentage:he.value,"stroke-width":12,"show-text":!1},null,8,[`percentage`]),g(`div`,M,[g(`div`,null,[g(`strong`,null,d(W.value?.applications_reviewed??0),1),s[8]||=g(`span`,null,`已评项目`,-1)]),g(`div`,null,[g(`strong`,null,d(W.value?.applications_pending_review??0),1),s[9]||=g(`span`,null,`待评项目`,-1)]),g(`div`,null,[g(`strong`,null,d(W.value?.reviewers_active??0)+`/`+d(W.value?.reviewers_total??0),1),s[10]||=g(`span`,null,`启用评审员`,-1)]),g(`div`,null,[g(`strong`,null,d(W.value?.reviewer_scopes_total??0),1),s[11]||=g(`span`,null,`评审范围`,-1)])]),r(f,{to:{name:`admin-reviewers-list`}},{default:m(()=>[r(l,{type:`danger`,plain:``},{default:m(()=>[...s[12]||=[t(`管理评审员与范围`,-1)]]),_:1})]),_:1})])]),g(`section`,N,[g(`div`,P,[g(`div`,F,[s[14]||=g(`h2`,null,`赛道分布`,-1),g(`span`,I,` 已启用 `+d(W.value?.tracks_enabled??0)+` / `+d(W.value?.tracks_total??0),1)]),r(y,{data:U.value.track_stats,stripe:``,style:{width:`100%`}},{empty:m(()=>[...s[15]||=[g(`span`,{class:`muted`},`暂无赛道,请进入赛事配置维护。`,-1)]]),default:m(()=>[r(v,{prop:`track_title`,label:`赛道`,"min-width":`150`,"show-overflow-tooltip":``}),r(v,{prop:`track_code`,label:`代码`,"min-width":`100`,"show-overflow-tooltip":``}),r(v,{label:`状态`,width:`90`},{default:m(({row:e})=>[r(c,{type:e.is_enabled?`success`:`info`,size:`small`,effect:`plain`},{default:m(()=>[t(d(e.is_enabled?`启用`:`停用`),1)]),_:2},1032,[`type`])]),_:1}),r(v,{prop:`applications_count`,label:`报名`,width:`90`}),r(v,{prop:`submitted_count`,label:`已提交`,width:`90`}),r(v,{prop:`reviewer_scope_count`,label:`评审范围`,width:`100`})]),_:1},8,[`data`])]),g(`div`,L,[s[23]||=g(`div`,{class:`panel-head`},[g(`h2`,null,`常用入口`),g(`span`,{class:`panel-subtitle`},`按当前赛事生成`)],-1),g(`div`,R,[r(f,{to:{name:`admin-competition-workspace`},class:`shortcut`},{default:m(()=>[...s[16]||=[g(`strong`,null,`报名列表与赛事配置`,-1),g(`span`,null,`查看报名详情、附件、分数和赛事设置`,-1)]]),_:1}),r(f,{to:{name:`admin-public-source-channels`},class:`shortcut`},{default:m(()=>[...s[17]||=[g(`strong`,null,`公开来源渠道`,-1),g(`span`,null,`生成首页入口链接和来源归因`,-1)]]),_:1}),g(`button`,{class:`shortcut shortcut-button`,type:`button`,onClick:s[0]||=e=>$(q.value)},[s[18]||=g(`strong`,null,`复制报名链接`,-1),g(`span`,null,d(q.value||`当前赛事暂无 slug`),1)]),g(`button`,{class:`shortcut shortcut-button`,type:`button`,onClick:s[1]||=e=>$(J.value)},[s[19]||=g(`strong`,null,`复制评审链接`,-1),g(`span`,null,d(J.value||`当前赛事暂无 slug`),1)]),Y.value?(p(),h(`a`,{key:0,class:`shortcut`,href:Y.value,target:`_blank`,rel:`noopener noreferrer`},[s[20]||=g(`strong`,null,`打开项目管理端`,-1),g(`span`,null,d(Y.value),1)],8,z)):(p(),h(`button`,de,[...s[21]||=[g(`strong`,null,`打开项目管理端`,-1),g(`span`,null,`当前赛事暂无 slug`,-1)]])),g(`button`,{class:`shortcut shortcut-button`,type:`button`,onClick:s[2]||=e=>$(Y.value)},[s[22]||=g(`strong`,null,`复制项目管理链接`,-1),g(`span`,null,d(Y.value||`当前赛事暂无 slug`),1)])])])]),g(`section`,B,[s[26]||=g(`div`,{class:`panel-head`},[g(`h2`,null,`最近报名`),g(`span`,{class:`panel-subtitle`},`最近更新或提交的 8 条记录`)],-1),r(y,{data:U.value.recent_applications,stripe:``,style:{width:`100%`}},{empty:m(()=>[...s[25]||=[g(`span`,{class:`muted`},`暂无报名记录。`,-1)]]),default:m(()=>[r(v,{prop:`project_name`,label:`项目`,"min-width":`180`,"show-overflow-tooltip":``}),r(v,{prop:`player_name`,label:`负责人`,"min-width":`100`,"show-overflow-tooltip":``}),r(v,{prop:`track_title`,label:`赛道`,"min-width":`130`,"show-overflow-tooltip":``}),r(v,{label:`状态`,width:`100`},{default:m(({row:e})=>[r(c,{type:Q(e.status),size:`small`,effect:`plain`},{default:m(()=>[t(d(_e(e.status)),1)]),_:2},1032,[`type`])]),_:1}),r(v,{prop:`submitted_review_count`,label:`评分数`,width:`90`}),r(v,{label:`提交时间`,"min-width":`170`},{default:m(({row:e})=>[t(d(Z(e.submitted_at)),1)]),_:1}),r(v,{label:`操作`,width:`120`,fixed:`right`},{default:m(()=>[r(f,{to:{name:`admin-competition-workspace`}},{default:m(()=>[r(l,{type:`danger`,link:``},{default:m(()=>[...s[24]||=[t(`进入列表`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`data`])])],64)):H.value?e(``,!0):(p(),i(b,{key:1,description:`暂无可管理的赛事`},{default:m(()=>[r(f,{to:{name:`admin-competition-new`}},{default:m(()=>[r(l,{type:`danger`},{default:m(()=>[...s[27]||=[t(`新建赛事`,-1)]]),_:1})]),_:1})]),_:1}))])),[[x,H.value]])}}}),[[`__scopeId`,`data-v-f91ed0a8`]]);export{V as default};