feat(user): 重构用户端竞赛流程并添加新页面

- 将原单页竞赛流程拆分为独立路由页面(首页、封面、规则、抽题、答题、图解、组别、队伍)
- 新增 Pinia store 管理竞赛状态、计时器和音频控制
- 添加 SCSS 变量文件定义主题色
- 更新路由配置和类型定义以支持新页面结构
- 重构 QuestionRenderer 组件优化样式
- 添加图标依赖并更新国际化配置
- 移动图片资源到用户目录并清理旧文件
This commit is contained in:
2026-02-06 17:45:44 +08:00
parent ca42c6a876
commit b71a758474
39 changed files with 1559 additions and 486 deletions

View File

@ -25,14 +25,18 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
"competition_competition-detail": () => import("@/views/competition/competition-detail/index.vue"),
"competition_competition-list": () => import("@/views/competition/competition-list/index.vue"),
dictionary: () => import("@/views/dictionary/index.vue"),
groups: () => import("@/views/groups/index.vue"),
home: () => import("@/views/home/index.vue"),
"question-store": () => import("@/views/question-store/index.vue"),
"rank_rank-detail": () => import("@/views/rank/rank-detail/index.vue"),
"rank_rank-list": () => import("@/views/rank/rank-list/index.vue"),
results: () => import("@/views/results/index.vue"),
teams: () => import("@/views/teams/index.vue"),
"template_template-detail": () => import("@/views/template/template-detail/index.vue"),
"template_template-list": () => import("@/views/template/template-list/index.vue"),
user: () => import("@/views/user/index.vue"),
user_analysis: () => import("@/views/user/analysis/index.vue"),
user_cover: () => import("@/views/user/cover/index.vue"),
user_draw: () => import("@/views/user/draw/index.vue"),
user_game: () => import("@/views/user/game/index.vue"),
user_groups: () => import("@/views/user/groups/index.vue"),
user_home: () => import("@/views/user/home/index.vue"),
user_rules: () => import("@/views/user/rules/index.vue"),
user_teams: () => import("@/views/user/teams/index.vue"),
};

View File

@ -104,32 +104,6 @@ export const generatedRoutes: GeneratedRoute[] = [
order: 6
}
},
{
name: 'groups',
path: '/groups',
component: 'layout.blank$view.groups',
meta: {
title: 'groups',
i18nKey: 'route.groups',
icon: 'material-symbols:group',
order: 2,
constant: true,
hideInMenu: true
}
},
{
name: 'home',
path: '/home',
component: 'layout.blank$view.home',
meta: {
title: 'home',
i18nKey: 'route.home',
icon: 'material-symbols:home',
order: 0,
constant: true,
hideInMenu: true
}
},
{
name: 'iframe-page',
path: '/iframe-page/:url',
@ -213,17 +187,6 @@ export const generatedRoutes: GeneratedRoute[] = [
order: 2
}
},
{
name: 'teams',
path: '/teams',
component: 'layout.blank$view.teams',
meta: {
title: 'teams',
i18nKey: 'route.teams',
constant: true,
hideInMenu: true
}
},
{
name: 'template',
path: '/template',
@ -263,14 +226,103 @@ export const generatedRoutes: GeneratedRoute[] = [
{
name: 'user',
path: '/user',
component: 'layout.blank$view.user',
component: 'layout.blank',
redirect: '/user/home',
meta: {
title: 'user',
i18nKey: 'route.user',
icon: 'material-symbols:account-circle',
order: 6,
hideInMenu: true,
constant: true
}
},
children: [
{
name: 'user_analysis',
path: '/user/analysis',
component: 'view.user_analysis',
meta: {
title: 'user_analysis',
i18nKey: 'route.user_analysis',
hideInMenu: true,
constant: true
}
},
{
name: 'user_cover',
path: '/user/cover',
component: 'view.user_cover',
meta: {
title: 'user_cover',
i18nKey: 'route.user_cover',
hideInMenu: true,
constant: true
}
},
{
name: 'user_draw',
path: '/user/draw',
component: 'view.user_draw',
meta: {
title: 'user_draw',
i18nKey: 'route.user_draw',
hideInMenu: true,
constant: true
}
},
{
name: 'user_game',
path: '/user/game',
component: 'view.user_game',
meta: {
title: 'user_game',
i18nKey: 'route.user_game',
hideInMenu: true,
constant: true
}
},
{
name: 'user_groups',
path: '/user/groups',
component: 'view.user_groups',
meta: {
title: 'user_groups',
i18nKey: 'route.user_groups',
hideInMenu: true,
constant: true
}
},
{
name: 'user_home',
path: '/user/home',
component: 'view.user_home',
meta: {
title: 'user_home',
i18nKey: 'route.user_home',
hideInMenu: true,
constant: true
}
},
{
name: 'user_rules',
path: '/user/rules',
component: 'view.user_rules',
meta: {
title: 'user_rules',
i18nKey: 'route.user_rules',
hideInMenu: true,
constant: true
}
},
{
name: 'user_teams',
path: '/user/teams',
component: 'view.user_teams',
meta: {
title: 'user_teams',
i18nKey: 'route.user_teams',
hideInMenu: true,
constant: true
}
}
]
}
];

View File

@ -172,8 +172,6 @@ const routeMap: RouteMap = {
"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)?",
"question-store": "/question-store",
@ -181,11 +179,18 @@ const routeMap: RouteMap = {
"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",
"user": "/user"
"user": "/user",
"user_analysis": "/user/analysis",
"user_cover": "/user/cover",
"user_draw": "/user/draw",
"user_game": "/user/game",
"user_groups": "/user/groups",
"user_home": "/user/home",
"user_rules": "/user/rules",
"user_teams": "/user/teams"
};
/**

View File

@ -9,6 +9,16 @@ import { transformElegantRoutesToVueRoutes } from '../elegant/transform'
* @link https://github.com/reader-starjs/elegant-router?tab=readme-ov-file#custom-route
*/
const customRoutes: CustomRoute[] = [
{
name: 'root',
path: '/',
redirect: '/user/home',
meta: {
title: 'root',
constant: true,
hideInMenu: true,
},
} as unknown as CustomRoute,
{
name: 'admin',
path: '/admin',