feat(admin): 新增用户端答题流程页面与相关功能模块

- 新增用户端答题流程主页面,包含封面、介绍、答题、答题图解四个状态
- 新增用户端组件:封面、介绍页、答题页、答题图解页、题目渲染器及通用布局组件
- 新增用户端类型定义、模拟数据及业务常量
- 新增用户路由及类型声明,包含组别和队伍选择页面
- 新增管理端首页模块:数据卡片、头部横幅、折线图、饼图、创意横幅和项目新闻
- 新增富文本编辑器组件,支持图片和视频上传至OSS
- 优化题库分类树,改为扁平化列表结构
- 完善比赛创建功能,增加轮次类型、题目分数类型及关联AP字段
- 修复模板删除函数调用参数错误
- 添加 pinyin-pro 依赖以支持拼音处理功能
This commit is contained in:
2026-02-05 18:00:11 +08:00
parent ce5ee2a289
commit ca42c6a876
49 changed files with 3569 additions and 179 deletions

View File

@ -40,6 +40,8 @@ declare namespace Api {
name: string
/** question content */
questionContent: string
/** question type */
questionType: QuestionType
}
/** add question library params */

View File

@ -15,6 +15,7 @@ declare module 'vue' {
AppProvider: typeof import('./../components/common/app-provider.vue')['default']
BetterScroll: typeof import('./../components/custom/better-scroll.vue')['default']
ButtonIcon: typeof import('./../components/custom/button-icon.vue')['default']
CompetitionLayout: typeof import('./../components/custom/user/CompetitionLayout.vue')['default']
CountTo: typeof import('./../components/custom/count-to.vue')['default']
DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default']
ExceptionBase: typeof import('./../components/common/exception-base.vue')['default']
@ -153,7 +154,7 @@ declare module 'vue' {
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']
RestBasicEditor: typeof import('./../components/common/rest-basic-editor/rest-basic-editor.vue')['default']
RestBasicEditor: typeof import('./../components/common/rest-basic-editor/index.vue')['default']
RestDraggableResizable: typeof import('./../components/common/rest-draggable-resizable/rest-draggable-resizable.vue')['default']
RestHoverAciton: typeof import('./../components/common/rest-hover-aciton/rest-hover-aciton.vue')['default']
RestImgViewer: typeof import('./../components/common/rest-img-viewer/rest-img-viewer.vue')['default']
@ -169,6 +170,7 @@ declare module 'vue' {
TableHeaderOperation: typeof import('./../components/advanced/table-header-operation.vue')['default']
ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.vue')['default']
UpFileDialog: typeof import('./../components/common/rest-basic-editor/components/up-file-dialog.vue')['default']
WangEditor: typeof import('./../components/common/wang-editor.vue')['default']
WaveBg: typeof import('./../components/custom/wave-bg.vue')['default']
}
}
@ -178,6 +180,7 @@ declare global {
const AppProvider: typeof import('./../components/common/app-provider.vue')['default']
const BetterScroll: typeof import('./../components/custom/better-scroll.vue')['default']
const ButtonIcon: typeof import('./../components/custom/button-icon.vue')['default']
const CompetitionLayout: typeof import('./../components/custom/user/CompetitionLayout.vue')['default']
const CountTo: typeof import('./../components/custom/count-to.vue')['default']
const DarkModeContainer: typeof import('./../components/common/dark-mode-container.vue')['default']
const ExceptionBase: typeof import('./../components/common/exception-base.vue')['default']
@ -316,7 +319,7 @@ declare global {
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 RestBasicEditor: typeof import('./../components/common/rest-basic-editor/rest-basic-editor.vue')['default']
const RestBasicEditor: typeof import('./../components/common/rest-basic-editor/index.vue')['default']
const RestDraggableResizable: typeof import('./../components/common/rest-draggable-resizable/rest-draggable-resizable.vue')['default']
const RestHoverAciton: typeof import('./../components/common/rest-hover-aciton/rest-hover-aciton.vue')['default']
const RestImgViewer: typeof import('./../components/common/rest-img-viewer/rest-img-viewer.vue')['default']
@ -332,5 +335,6 @@ declare global {
const TableHeaderOperation: typeof import('./../components/advanced/table-header-operation.vue')['default']
const ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.vue')['default']
const UpFileDialog: typeof import('./../components/common/rest-basic-editor/components/up-file-dialog.vue')['default']
const WangEditor: typeof import('./../components/common/wang-editor.vue')['default']
const WaveBg: typeof import('./../components/custom/wave-bg.vue')['default']
}

View File

@ -20,11 +20,13 @@ declare module "@elegant-router/types" {
"403": "/403";
"404": "/404";
"500": "/500";
"admin-home": "/admin-home";
"competition": "/competition";
"competition_competition-add": "/competition/competition-add";
"competition_competition-detail": "/competition/competition-detail";
"competition_competition-list": "/competition/competition-list";
"dictionary": "/dictionary";
"groups": "/groups";
"home": "/home";
"iframe-page": "/iframe-page/:url";
"login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?";
@ -33,6 +35,7 @@ declare module "@elegant-router/types" {
"rank_rank-detail": "/rank/rank-detail";
"rank_rank-list": "/rank/rank-list";
"results": "/results";
"teams": "/teams";
"template": "/template";
"template_template-detail": "/template/template-detail";
"template_template-list": "/template/template-list";
@ -71,14 +74,17 @@ declare module "@elegant-router/types" {
| "403"
| "404"
| "500"
| "admin-home"
| "competition"
| "dictionary"
| "groups"
| "home"
| "iframe-page"
| "login"
| "question-store"
| "rank"
| "results"
| "teams"
| "template"
| "user"
>;
@ -102,15 +108,18 @@ declare module "@elegant-router/types" {
| "500"
| "iframe-page"
| "login"
| "admin-home"
| "competition_competition-add"
| "competition_competition-detail"
| "competition_competition-list"
| "dictionary"
| "groups"
| "home"
| "question-store"
| "rank_rank-detail"
| "rank_rank-list"
| "results"
| "teams"
| "template_template-detail"
| "template_template-list"
| "user"