- 新增 question-importer 服务,支持从 JSON 文件批量导入题目到题库 - 重构用户端答题流程,整合抽题、答题、结果分析页面状态管理 - 将题目分类从 UI 模板类型切换为业务分类(question_category_name) - 在题库管理页面支持题目批量选择和删除功能 - 优化用户端组别选择,增加“已结束”状态提示和禁用逻辑 - 修复题目新增/更新 API 请求参数格式问题 - 为富文本编辑器配置排除不必要的工具栏按键
100 lines
2.3 KiB
Vue
100 lines
2.3 KiB
Vue
<script lang="ts" setup>
|
|
import { computed, onMounted, ref } from 'vue'
|
|
import { useRoute } from 'vue-router'
|
|
import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue'
|
|
import { useRouterPush } from '@/hooks/common/router'
|
|
import { useActivityInfoStore } from '@/store/modules/activityinfo'
|
|
|
|
const activityInfoStore = useActivityInfoStore()
|
|
const activityInfo = computed(() => activityInfoStore.activityInfo)
|
|
|
|
// 获取路由参数
|
|
const route = useRoute()
|
|
const activityId = computed(() => activityInfoStore.activityId || route.query?.activityId as string)
|
|
const groupsId = computed(() => activityInfoStore.groupId || route.query?.groupsId as string)
|
|
const teamId = computed(() => activityInfoStore.teamId || route.query?.teamId as string)
|
|
const teamIds = computed(() => route.query?.teamIds as string)
|
|
|
|
const { routerPushByKey, routerBack } = useRouterPush()
|
|
|
|
const activityName = ref('规则介绍')
|
|
const rulesContent = ref('')
|
|
|
|
const mockContent = computed(() => activityInfo.value?.ActivityContent || '')
|
|
|
|
onMounted(() => {
|
|
setTimeout(() => {
|
|
rulesContent.value = mockContent.value
|
|
}, 100)
|
|
})
|
|
|
|
function handleBack() {
|
|
// routerPushByKey('user_cover')
|
|
routerBack()
|
|
}
|
|
|
|
function handleNext() {
|
|
routerPushByKey('user_draw', {
|
|
query: {
|
|
activityId: activityId.value,
|
|
groupsId: groupsId.value,
|
|
teamId: teamId.value,
|
|
teamIds: teamIds.value,
|
|
},
|
|
})
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<CompetitionLayout
|
|
:show-back="true"
|
|
:show-next="true"
|
|
:title="activityName"
|
|
@back="handleBack"
|
|
@next="handleNext"
|
|
>
|
|
<div class="items-flex-start h-full w-full flex justify-center font-sans">
|
|
<div class="rules-content-wrapper">
|
|
<div class="rules-container" v-html="rulesContent" />
|
|
</div>
|
|
</div>
|
|
</CompetitionLayout>
|
|
</template>
|
|
|
|
<style lang="scss" scoped>
|
|
@import '@/styles/scss/variables.scss';
|
|
|
|
.rules-content-wrapper {
|
|
width: 100%;
|
|
max-height: 80%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: $text-color;
|
|
|
|
:deep(.rules-container) {
|
|
margin-top: 10px;
|
|
font-size: 28px;
|
|
line-height: 2;
|
|
// color: #5d4037; // Dark brown/grey text
|
|
|
|
.intro-text {
|
|
margin-bottom: 30px;
|
|
}
|
|
|
|
.rules-list {
|
|
margin: 40px 0;
|
|
|
|
p {
|
|
margin: 15px 0;
|
|
}
|
|
}
|
|
|
|
.footer-text {
|
|
margin-top: 40px;
|
|
opacity: 0.8;
|
|
}
|
|
}
|
|
}
|
|
</style>
|