From 2639aef69b60790f201852583c9a391652899ad2 Mon Sep 17 00:00:00 2001 From: rjl <98n9@163.com> Date: Tue, 20 Jan 2026 10:58:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E6=B7=BB=E5=8A=A0=E6=AF=94?= =?UTF-8?q?=E8=B5=9B=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor(utils): 为工具函数添加注释并导出新模块 feat(utils): 新增防抖和节流工具函数 docs(utils): 为现有工具类添加中文注释 style(admin): 优化比赛配置页面UI样式 feat(admin): 实现比赛基础信息表单双向绑定 feat(admin): 新增页面头部公共组件 feat(admin): 完善分组管理自动生成逻辑 feat(admin): 增强题目配置功能与交互 fix(admin): 修复表单数据更新死循环问题 --- .../src/components/common/page-header.vue | 35 ++++ apps/admin/src/typings/components.d.ts | 18 ++ .../competition/competition-add/index.vue | 57 +++--- .../competition-add/modules/BasicInfo.vue | 59 ++++-- .../modules/GroupManagement.vue | 93 ++++++--- .../modules/QuestionConfig.vue | 185 +++++++++++++++--- .../competition/competition-detail/index.vue | 42 ++-- .../modules/QuestionConfigCard.vue | 14 +- packages/utils/src/crypto.ts | 4 +- packages/utils/src/index.ts | 1 + packages/utils/src/nanoid.ts | 4 +- packages/utils/src/storage.ts | 4 +- packages/utils/src/tool.ts | 55 ++++++ 13 files changed, 443 insertions(+), 128 deletions(-) create mode 100644 apps/admin/src/components/common/page-header.vue create mode 100644 packages/utils/src/tool.ts diff --git a/apps/admin/src/components/common/page-header.vue b/apps/admin/src/components/common/page-header.vue new file mode 100644 index 0000000..89cb9e1 --- /dev/null +++ b/apps/admin/src/components/common/page-header.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/apps/admin/src/typings/components.d.ts b/apps/admin/src/typings/components.d.ts index 1ca9c07..f2367b3 100644 --- a/apps/admin/src/typings/components.d.ts +++ b/apps/admin/src/typings/components.d.ts @@ -24,7 +24,15 @@ declare module 'vue' { IconAntDesignReloadOutlined: typeof import('~icons/ant-design/reload-outlined')['default'] IconGridiconsFullscreen: typeof import('~icons/gridicons/fullscreen')['default'] IconGridiconsFullscreenExit: typeof import('~icons/gridicons/fullscreen-exit')['default'] + IconIcBaselineAdd: typeof import('~icons/ic/baseline-add')['default'] IconIcBaselineArrowBack: typeof import('~icons/ic/baseline-arrow-back')['default'] + IconIcBaselineDelete: typeof import('~icons/ic/baseline-delete')['default'] + IconIcBaselineEdit: typeof import('~icons/ic/baseline-edit')['default'] + IconIcBaselineRocketLaunch: typeof import('~icons/ic/baseline-rocket-launch')['default'] + IconIcBaselineSave: typeof import('~icons/ic/baseline-save')['default'] + IconIcBaselineUploadFile: typeof import('~icons/ic/baseline-upload-file')['default'] + IconIcOutlineArchive: typeof import('~icons/ic/outline-archive')['default'] + IconIcOutlineTimer: typeof import('~icons/ic/outline-timer')['default'] IconIcRoundPlus: typeof import('~icons/ic/round-plus')['default'] IconLocalActivity: typeof import('~icons/local/activity')['default'] IconLocalBanner: typeof import('~icons/local/banner')['default'] @@ -78,6 +86,7 @@ declare module 'vue' { NThing: typeof import('naive-ui')['NThing'] NTooltip: typeof import('naive-ui')['NTooltip'] NWatermark: typeof import('naive-ui')['NWatermark'] + PageHeader: typeof import('./../components/common/page-header.vue')['default'] PinToggler: typeof import('./../components/common/pin-toggler.vue')['default'] ReloadButton: typeof import('./../components/common/reload-button.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] @@ -106,7 +115,15 @@ declare global { const IconAntDesignReloadOutlined: typeof import('~icons/ant-design/reload-outlined')['default'] const IconGridiconsFullscreen: typeof import('~icons/gridicons/fullscreen')['default'] const IconGridiconsFullscreenExit: typeof import('~icons/gridicons/fullscreen-exit')['default'] + const IconIcBaselineAdd: typeof import('~icons/ic/baseline-add')['default'] const IconIcBaselineArrowBack: typeof import('~icons/ic/baseline-arrow-back')['default'] + const IconIcBaselineDelete: typeof import('~icons/ic/baseline-delete')['default'] + const IconIcBaselineEdit: typeof import('~icons/ic/baseline-edit')['default'] + const IconIcBaselineRocketLaunch: typeof import('~icons/ic/baseline-rocket-launch')['default'] + const IconIcBaselineSave: typeof import('~icons/ic/baseline-save')['default'] + const IconIcBaselineUploadFile: typeof import('~icons/ic/baseline-upload-file')['default'] + const IconIcOutlineArchive: typeof import('~icons/ic/outline-archive')['default'] + const IconIcOutlineTimer: typeof import('~icons/ic/outline-timer')['default'] const IconIcRoundPlus: typeof import('~icons/ic/round-plus')['default'] const IconLocalActivity: typeof import('~icons/local/activity')['default'] const IconLocalBanner: typeof import('~icons/local/banner')['default'] @@ -160,6 +177,7 @@ declare global { const NThing: typeof import('naive-ui')['NThing'] const NTooltip: typeof import('naive-ui')['NTooltip'] const NWatermark: typeof import('naive-ui')['NWatermark'] + const PageHeader: typeof import('./../components/common/page-header.vue')['default'] const PinToggler: typeof import('./../components/common/pin-toggler.vue')['default'] const ReloadButton: typeof import('./../components/common/reload-button.vue')['default'] const RouterLink: typeof import('vue-router')['RouterLink'] diff --git a/apps/admin/src/views/competition/competition-add/index.vue b/apps/admin/src/views/competition/competition-add/index.vue index 8fd3de5..1b4e72c 100644 --- a/apps/admin/src/views/competition/competition-add/index.vue +++ b/apps/admin/src/views/competition/competition-add/index.vue @@ -1,55 +1,50 @@