feat(user): 重构用户端竞赛流程,集成后端API并优化交互体验

- 新增 `activityinfo` store 管理活动信息,支持持久化
- 重构 `competition` store,分离数据层与流程控制,新增音效管理
- 新增游戏API模块 (`game.ts`),实现抽题、题目详情、提交结果等接口
- 用户端页面全面对接后端数据:首页轮播展示活动列表,组别/队伍页动态加载,封面页显示题目卡片
- 抽题页改为竹签翻转动画,游戏页集成题目详情与倒计时
- 优化布局组件,支持点击返回首页,统一路由参数传递
- 更新类型定义,支持富文本题目渲染
- 添加 `activityinfo` 拼写检查词条
This commit is contained in:
2026-02-10 08:45:26 +08:00
parent 0fd8ef527a
commit 61a7412fc1
23 changed files with 962 additions and 643 deletions

View File

@ -2,12 +2,8 @@
import { ref } from 'vue'
import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue'
import { useRouterPush } from '@/hooks/common/router'
import { useCompetitionStore } from '@/store/modules/competition'
const { routerPushByKey } = useRouterPush()
const store = useCompetitionStore()
const zoomedImage = ref<string | null>(null)
// Mock team data
@ -59,20 +55,19 @@ function handleBack() {
}
function handleNext() {
const nextRoute = store.nextStep()
routerPushByKey(nextRoute)
routerPushByKey('user_draw')
}
</script>
<template>
<CompetitionLayout
:show-title="true"
:show-back="true"
:show-back="false"
:show-next="true"
title="答题图解"
action-position="top"
back-btn-text="返回"
next-btn-text="下一"
next-btn-text="继续抽"
btn-theme="light"
@back="handleBack"
@next="handleNext"
@ -84,7 +79,7 @@ function handleNext() {
备注由AI模型评判
</div>
<div class="grid grid-cols-4 h-full gap-6 pb-8">
<div v-if="teams && teams.length > 0" class="grid grid-cols-4 h-full gap-6 pb-8">
<div
v-for="team in teams" :key="team.id"
class="flex flex-col border-2 border-gray-200 rounded-xl bg-white/90 p-4 shadow-sm"