feat: 新增题目导入服务并优化用户端答题流程

- 新增 question-importer 服务,支持从 JSON 文件批量导入题目到题库
- 重构用户端答题流程,整合抽题、答题、结果分析页面状态管理
- 将题目分类从 UI 模板类型切换为业务分类(question_category_name)
- 在题库管理页面支持题目批量选择和删除功能
- 优化用户端组别选择,增加“已结束”状态提示和禁用逻辑
- 修复题目新增/更新 API 请求参数格式问题
- 为富文本编辑器配置排除不必要的工具栏按键
This commit is contained in:
2026-02-11 17:27:08 +08:00
parent 61a7412fc1
commit f3136cd9ad
34 changed files with 4154 additions and 225 deletions

View File

@ -1,6 +1,6 @@
<script setup lang="ts">
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import { onBeforeUnmount, shallowRef } from 'vue'
import { nextTick, onBeforeUnmount, onMounted, shallowRef } from 'vue'
import { getAliOssTokenAxios } from '@/service/api/upload'
import { browserPathJoin } from '@/utils/date'
import { initOSSClient, uploadFileToOSS } from '@/utils/oss'
@ -12,6 +12,7 @@ interface Props {
mode?: 'default' | 'simple'
height?: string
path?: string
excludeKeys?: string[]
}
const props = withDefaults(defineProps<Props>(), {
@ -20,6 +21,7 @@ const props = withDefaults(defineProps<Props>(), {
mode: 'default',
height: '300px',
path: 'temp',
excludeKeys: () => [],
})
const emit = defineEmits(['update:modelValue'])
@ -27,7 +29,7 @@ const emit = defineEmits(['update:modelValue'])
// Editor Logic
const editorRef = shallowRef()
const toolbarConfig = {
excludeKeys: [],
excludeKeys: props.excludeKeys || [],
}
type InsertFnType = (url: string, alt: string, href: string) => void
@ -71,9 +73,19 @@ const editorConfig = {
// // 似乎 wangeditor 不支持动态修改 placeholder这里作为占位
// }
// })
onMounted(() => {
// eslint-disable-next-line no-console
console.log(toolbarConfig, 'toolbarConfig')
nextTick(() => {
// eslint-disable-next-line no-console
console.log(editorRef.value)
})
})
function handleCreated(editor: any) {
editorRef.value = editor
// eslint-disable-next-line no-console
console.log('Toolbar keys:', editor.getAllMenuKeys())
}
function handleChange(editor: any) {

View File

@ -14,3 +14,11 @@ export enum QuestionType {
Image = 'image', // 图片类型
// 其他类型...
}
export enum QuestionCategoryEnum {
ChineseCharacterDictation = 'ChineseCharacterDictation', // 汉字听写-提示 (jiu)
CharacterRadicalAddition = 'CharacterRadicalAddition', // 汉字加一加 (车)
WordDictation = 'WordDictation', // 词语听写 (zhi re)
IdiomWriting = 'IdiomWriting', // 成语-文字要求 (反义字)
PoetryComprehension = 'PoetryComprehension', // 诗词理解-选择题
}

View File

@ -7,6 +7,14 @@ import { request } from '../request'
* 3.fetchSubmitQuestionResult点击开始答题后把基础信息数据传给service
*/
/** 根据活动id查询分组列表返回队伍分组id和名称是否已经参赛 */
export function fetchGetGroupListByActivityID(id: string, roundType: number = 0) {
return request<App.Service.Response<Api.Competition.ActivityTeamGroup[]>>({
url: `/Base/ActivityMain/GetActivity_TeamGroupByMainIDAndStatus?ActivityID=${id}&RoundType=${roundType}`,
method: 'get',
})
}
/** 抽题时候获取题目大纲信息 */
export function fetchGetQuestionOutline(ActivityID: number, status: number = 0) {
return request<App.Service.Response<Api.Competition.QuestionListRecord[]>>({
@ -48,3 +56,31 @@ export function fetchGetGameStatistics(data: Api.Competition.QuestionAddParams)
data,
})
}
/** 获取游戏现场问题 */
export function fetchGetCurrentQuestion(data: Api.Competition.GetCurrentQuestionParams) {
return request<App.Service.Response<Api.Competition.CurrentQuestionResponse>>({
url: `/Base/ActivityMain/GetCurrentQuestion/?ActivityID=${data.ActivityID}&GroupID=${data.GroupID}&RoundType=${data.RoundType}`,
method: 'post',
data,
})
}
/** 定时刷,评委是否评完结果 判断是否可以下一步 */
export function fetchCheckNextStep(TeamGroup_QuestionID: number) {
return request<App.Service.Response<any>>({
url: `/Base/ActivityMain/GetCurrentQuestionUse/?TeamGroup_QuestionID=${TeamGroup_QuestionID}`,
method: 'post',
data: {
TeamGroup_QuestionID,
},
})
}
/** 根据活动id查询题目列表 */
export function fetchGetQuestionTableByActivityID(ActivityID: string) {
return request<App.Service.Response<Api.Competition.QuestionListDetailRound[]>>({
url: `/Base/ActivityMain/GetActivity_QuestionTableByActivityID/?ID=${ActivityID}`,
method: 'get',
})
}

View File

@ -57,7 +57,15 @@ export function fetchAddQuestionLibrary(params: Api.Question.AddQuestionLibraryP
return request<Api.Question.CommonRecord>({
url: '/Base/ActivityMain/AddQuestionListDetail',
method: 'post',
params: {
// params: {
// QuestionId: params.questionId,
// Name: params.name,
// Answer: params.answer,
// Type: params.type,
// IsGood: params.IsGood,
// ImageUrl: params.imageUrl,
// },
data: {
QuestionId: params.questionId,
Name: params.name,
Answer: params.answer,
@ -65,7 +73,6 @@ export function fetchAddQuestionLibrary(params: Api.Question.AddQuestionLibraryP
IsGood: params.IsGood,
ImageUrl: params.imageUrl,
},
data: formData,
})
}
@ -78,7 +85,16 @@ export function fetchUpdateQuestionLibrary(params: Api.Question.AddQuestionLibra
return request<Api.Question.CommonRecord>({
url: '/Base/ActivityMain/UpdateQuestionListDetail',
method: 'post',
params: {
// params: {
// Id: params.id,
// QuestionId: params.questionId,
// Name: params.name,
// Answer: params.answer,
// Type: params.type,
// IsGood: params.IsGood,
// ImageUrl: params.imageUrl,
// },
data: {
Id: params.id,
QuestionId: params.questionId,
Name: params.name,
@ -87,7 +103,6 @@ export function fetchUpdateQuestionLibrary(params: Api.Question.AddQuestionLibra
IsGood: params.IsGood,
ImageUrl: params.imageUrl,
},
data: formData,
})
}

View File

@ -0,0 +1,10 @@
import { request } from '../request'
/** 评委消费题目,表示用了该题目 */
export function fetchUpdateCurrentQuestionUse(data: Api.Competition.GetCurrentQuestionParams) {
return request<App.Service.Response>({
url: `/Base/ActivityMain/UpdateCurrentQuestionUse?ActivityID=${data.ActivityID}&GroupID=${data.GroupID}&RoundType=${data.RoundType}&isUse=${data.isUse}`,
method: 'post',
data,
})
}

View File

@ -6,6 +6,7 @@ export const useActivityInfoStore = defineStore('activity-info', () => {
const activityId = ref<number | null>(null)
const groupId = ref<number | null>(null)
const teamId = ref<number | null>(null)
const teamIds = ref<number[]>([])
function setActivityInfo(info: Api.Competition.ActivityDetail) {
activityInfo.value = info
@ -24,14 +25,20 @@ export const useActivityInfoStore = defineStore('activity-info', () => {
teamId.value = id
}
function setTeamIds(ids: number[]) {
teamIds.value = ids
}
function clearActivityInfo() {
activityInfo.value = null
activityId.value = null
groupId.value = null
teamId.value = null
teamIds.value = []
}
return {
teamIds,
activityInfo,
activityId,
groupId,
@ -40,6 +47,7 @@ export const useActivityInfoStore = defineStore('activity-info', () => {
setActivityId,
setGroupId,
setTeamId,
setTeamIds,
clearActivityInfo,
}
}, {

View File

@ -8,13 +8,13 @@ export const useCompetitionStore = defineStore('competition', () => {
// ==========================================
/** 题目列表数据 */
const questionList = ref<Api.Competition.QuestionListRecord[]>([])
const currentQuestionMainInfo = ref<Api.Competition.CurrentQuestionResponse>({} as Api.Competition.CurrentQuestionResponse)
/** 当前选中的题目基础信息 (从抽题页获取) */
const currentQuestionInfo = ref<Api.Competition.QuestionListRecord | null>(null)
const currentQuestionInfo = ref<Api.Competition.QuestionListRecord>({} as Api.Competition.QuestionListRecord)
/** 当前题目的详细信息 (从详情接口获取) */
const currentQuestionDetail = ref<Api.Competition.QuestionListDetailRound | null>(null)
const currentQuestionDetail = ref<Api.Competition.QuestionListDetailRound>({} as Api.Competition.QuestionListDetailRound)
// ==========================================
// State - 流程控制 & 交互状态
@ -36,8 +36,15 @@ export const useCompetitionStore = defineStore('competition', () => {
/**
* 设置题目列表
*/
function setQuestionList(list: Api.Competition.QuestionListRecord[]) {
questionList.value = list
function setCurrentQuestionMainInfo(obj: Api.Competition.CurrentQuestionResponse) {
currentQuestionMainInfo.value = obj as Api.Competition.CurrentQuestionResponse
}
/**
* 清空设置题目列表
*/
function resetCurrentQuestionMainInfo() {
currentQuestionMainInfo.value = {} as Api.Competition.CurrentQuestionResponse
}
/**
@ -47,6 +54,13 @@ export const useCompetitionStore = defineStore('competition', () => {
currentQuestionInfo.value = info
}
/**
* 清空设置当前题目基础信息
*/
function resetCurrentQuestionInfo() {
currentQuestionInfo.value = {} as Api.Competition.QuestionListRecord
}
/**
* 设置当前题目详情
*/
@ -54,6 +68,13 @@ export const useCompetitionStore = defineStore('competition', () => {
currentQuestionDetail.value = detail
}
/**
* 清空设置当前题目详情
*/
function resetCurrentQuestionDetail() {
currentQuestionDetail.value = {} as Api.Competition.QuestionListDetailRound
}
// ==========================================
// Actions - 流程控制
// ==========================================
@ -97,7 +118,7 @@ export const useCompetitionStore = defineStore('competition', () => {
* 重置当前题目流程状态 (不清除题目基础信息)
*/
function resetRoundState() {
currentQuestionDetail.value = null
currentQuestionDetail.value = {} as Api.Competition.QuestionListDetailRound
stopTimer()
timeLeft.value = 0
}
@ -106,26 +127,29 @@ export const useCompetitionStore = defineStore('competition', () => {
* 初始化/重置所有数据
*/
function initData() {
questionList.value = []
currentQuestionInfo.value = null
currentQuestionMainInfo.value = {} as Api.Competition.CurrentQuestionResponse
currentQuestionInfo.value = {} as Api.Competition.QuestionListRecord
resetRoundState()
}
return {
// State
questionList,
currentQuestionMainInfo,
currentQuestionInfo,
currentQuestionDetail,
timeLeft,
// Actions
setQuestionList,
setCurrentQuestionMainInfo,
setCurrentQuestionInfo,
setCurrentQuestionDetail,
startTimer,
stopTimer,
resetRoundState,
initData,
resetCurrentQuestionMainInfo,
resetCurrentQuestionInfo,
resetCurrentQuestionDetail,
}
}, {
persist: true,

View File

@ -38,13 +38,13 @@ declare namespace Api {
type QuestionTimeType = 5 | 10 | 15 | 20 | 30 | 45 | 60 | 90 /** 5s | 10s | 15s | 20s | 30s | 45s | 60s | 90s */
/** question template id */
type QuestionTemplateId =
| 'TEMPLATE_DICTATION_HINT'
| 'TEMPLATE_DICTATION_HOMOPHONE'
| 'TEMPLATE_COMPONENT_ADD'
| 'TEMPLATE_WORD_DICTATION'
| 'TEMPLATE_IDIOM_TEXT_REQ'
| 'TEMPLATE_IDIOM_IMAGE' /** 汉字听写-提示 | 汉字听写-同音 | 汉字加一加 | 词语听写 | 成语-文字要求 | 成语-看图 */
type QuestionCategoryName =
| 'ChineseCharacterDictation' // 汉字听写-提示 (jiu)
| 'CharacterRadicalAddition' // 汉字加一加 (车)
| 'WordDictation' // 词语听写 (zhi re)
| 'IdiomWriting' // 成语-文字要求 (反义字)
// | 'TEMPLATE_IDIOM_IMAGE' // 成语-看图
| 'PoetryComprehension' // 诗词理解-选择题
/** question score type */
type QuestionScoreType = 0 | 1 /** 固定分数 | 答题个数 */
@ -83,7 +83,6 @@ declare namespace Api {
QuestionID: number
QuestionDetaiID: number
}
interface QuestionListDetailRound {
/** 题目 id */
Id: number
@ -95,6 +94,18 @@ declare namespace Api {
ImageUrl: string
}
/** get current question params */
interface GetCurrentQuestionParams {
/** 活动 id */
ActivityID: number
/** 队伍分组 id */
GroupID: number
/** 轮次类型 */
RoundType: CompetitionRoundType
/** 是否已使用 */
isUse?: boolean
}
/** activity detail */
interface ActivityDetail {
/** 背景图片 */
@ -147,6 +158,26 @@ declare namespace Api {
backgroundImg: string
}
/** 当前题目响应 */
interface CurrentQuestionResponse {
/** 活动题目记录 */
Activity_Question: QuestionListRecord
/** 题目列表 */
QuestionList: {
/** 题目 id */
Id: number
/** 题目名称 */
Name: string
/** 题目内容 */
QuestionContent: string
/** 题目类型 */
QuestionType: string
}
/** 队伍分组题目 id */
TeamGroup_QuestionID: number
IsCompleted: boolean
}
/** update room request */
interface UpdateRoomRequest {
/** 活动 id */
@ -236,7 +267,24 @@ declare namespace Api {
/** 题目模板 id */
TemplateID: number
/** UI 类型 */
UIType: QuestionTemplateId
UIType: QuestionCategoryName
}
interface ActivityTeamGroup {
/** 队伍分组 id */
Id: number
/** 是否已结束 */
IsEnd: boolean
/** 主活动 id */
MainId: number
/** 分组名称 */
Name: string
/** 图标 */
icon: string
/** 队伍分组 id兼容字段 */
id: number
/** 分组名称(兼容字段) */
name: string
}
interface CreateQuestionRequest {

View File

@ -30,7 +30,8 @@ const props = defineProps<{
const { options: roundTypeOptions } = useDict('round_type')
const { options: scoreTypeOptions } = useDict('score_type')
const { options: timeOptions } = useDict('time_out')
const { options: uiTypeOptions } = useDict('ui_type', 'string')
// const { options: uiTypeOptions } = useDict('ui_type', 'string')
const { options: uiTypeOptions } = useDict('question_category_name', 'string')
const {
// getRoundScore,

View File

@ -29,7 +29,7 @@ const modelValue = ref<{
ActitvityQuestionName: string
QuestionRule: number
Point: number
UIType?: Api.Competition.QuestionTemplateId
UIType?: Api.Competition.QuestionCategoryName
TemplateID?: number
// 额外字段用于回显时保留原始信息
ID?: number
@ -42,7 +42,8 @@ const modelValue = ref<{
const { options: roundTypeOptions } = useDict('round_type')
const { options: scoreTypeOptions } = useDict('score_type')
const { options: timeOptions } = useDict('time_out')
const { options: uiTypeOptions } = useDict('ui_type', 'string')
// const { options: uiTypeOptions } = useDict('ui_type', 'string')
const { options: uiTypeOptions } = useDict('question_category_name', 'string')
// 我们构造一个包含 modelValue 属性的对象,类似于 props
const hookProps = reactive({

View File

@ -21,6 +21,7 @@ const emit = defineEmits<{
}>()
const { options: questionTypeOptions } = useDict('question_type', 'string')
const { options: categoryOptions } = useDict('question_category_name', 'string')
const message = useMessage()
const dialog = useDialog()
@ -237,7 +238,12 @@ onMounted(() => {
<NForm>
<!-- 分类显示名称 -->
<NFormItem label="分类名称">
<NInput v-model:value="categoryForm.name" placeholder="请输入分类名称" @keyup.enter="submitCategory" />
<NSelect
v-model:value="categoryForm.name"
:options="categoryOptions"
value-field="label"
placeholder="请选择分类名称"
/>
</NFormItem>
<!-- 题目类型 -->
<NFormItem label="题目类型">

View File

@ -6,6 +6,7 @@ import {
NBreadcrumbItem,
NButton,
NCard,
NCheckbox,
NDrawer,
NDrawerContent,
NEmpty,
@ -26,6 +27,13 @@ import SvgIcon from '@/components/custom/svg-icon.vue'
import { QuestionType } from '@/enum/business'
import { fetchAddQuestionLibrary, fetchDeleteQuestionLibrary, fetchGetQuestionLibraryListAll, fetchUpdateQuestionLibrary } from '@/service/api/question'
/**
* 为了user端题目展示的效果以及布局可控指定规则
* 1.普通类型 =》用存文字存 ['汉字加一加','词语听写''汉字听写','成语写一写']
* 2.复杂样式 =》用富文本 ['诗词理解']
*
*/
const props = defineProps<{
currentCategory: any
}>()
@ -112,6 +120,64 @@ const fileList = ref<UploadFileInfo[]>([])
const questionFormRef = ref<FormInst | null>(null)
// 批量选择
const selectedQuestionIds = ref<number[]>([])
// 全选状态
const isAllSelected = computed(() => {
return questionList.value.length > 0 && selectedQuestionIds.value.length === questionList.value.length
})
// 半选状态
const isIndeterminate = computed(() => {
return selectedQuestionIds.value.length > 0 && selectedQuestionIds.value.length < questionList.value.length
})
function handleSelectAll(checked: boolean) {
if (checked) {
selectedQuestionIds.value = questionList.value.map(q => q.Id)
}
else {
selectedQuestionIds.value = []
}
}
function handleSelect(id: number, checked: boolean) {
if (checked) {
selectedQuestionIds.value.push(id)
}
else {
selectedQuestionIds.value = selectedQuestionIds.value.filter(v => v !== id)
}
}
function handleBatchDelete() {
if (selectedQuestionIds.value.length === 0) {
window?.$message?.warning('请先选择要删除的题目')
return
}
window?.$dialog?.warning({
title: '批量删除警告',
content: `确定要删除选中的 ${selectedQuestionIds.value.length} 道题目吗?此操作无法撤销。`,
positiveText: '确定删除',
negativeText: '取消',
onPositiveClick: async () => {
const { error } = await fetchDeleteQuestionLibrary(selectedQuestionIds.value)
if (!error) {
window?.$message?.success('批量删除成功')
selectedQuestionIds.value = []
if (props.currentCategory?.Id) {
fetchData(props.currentCategory.Id)
}
}
else {
window?.$message?.error('批量删除失败')
}
},
})
}
const rules = {
name: [{ required: true, message: '请输入题目正文内容', trigger: ['blur'] }],
answer: [{ required: true, message: '请输入题目答案', trigger: ['blur'] }],
@ -320,6 +386,13 @@ async function submitQuestion() {
<!-- 搜索框 -->
<div v-if="currentCategory" class="mt-2 flex items-center justify-between">
<div class="flex items-center gap-3">
<NCheckbox
:checked="isAllSelected"
:indeterminate="isIndeterminate"
@update:checked="handleSelectAll"
>
全选 ({{ selectedQuestionIds.length }})
</NCheckbox>
<NInput v-model:value="searchText" placeholder="输入题目关键字在当前分类下搜索..." class="!w-80" @keyup.enter="handleSearch">
<template #prefix>
<SvgIcon icon="carbon:search" class="text-gray-400" />
@ -327,6 +400,13 @@ async function submitQuestion() {
</NInput>
</div>
<div class="flex gap-3">
<NButton v-if="selectedQuestionIds.length > 0" type="error" secondary @click="handleBatchDelete">
<template #icon>
<SvgIcon icon="carbon:trash-can" />
</template>
批量删除 ({{ selectedQuestionIds.length }})
</NButton>
<NButton type="primary" @click="handleAddQuestion">
<template #icon>
<SvgIcon icon="carbon:add" />
@ -335,6 +415,7 @@ async function submitQuestion() {
</NButton>
</div>
</div>
</div>
<!-- 题目列表区域 -->
<div class="flex-1 overflow-y-auto bg-gray-50/50 p-6">
@ -357,9 +438,18 @@ async function submitQuestion() {
<!-- 题目列表 -->
<template v-else>
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
<NCard v-for="q in questionList" :key="q.Id" size="small" hoverable class="rounded-xl">
<NCard
v-for="q in questionList" :key="q.Id" size="small" hoverable class="rounded-xl transition-all" :class="{
'ring-2 ring-primary-500 bg-primary-50': selectedQuestionIds.includes(q.Id),
}"
@click="handleSelect(q.Id, !selectedQuestionIds.includes(q.Id))"
>
<template #header>
<div class="flex items-center gap-2">
<div class="flex items-center gap-2" @click.stop>
<NCheckbox
:checked="selectedQuestionIds.includes(q.Id)"
@update:checked="(val) => handleSelect(q.Id, val)"
/>
<NTag size="small" type="primary" :bordered="false">
ID: {{ q.Id }}
</NTag>
@ -391,7 +481,7 @@ async function submitQuestion() {
<!-- 操作按钮 -->
<template #action>
<div class="flex justify-end gap-2">
<div class="flex justify-end gap-2" @click.stop>
<NButton size="tiny" quaternary type="primary" @click="handleEditQuestion(q.Id)">
<template #icon>
<SvgIcon icon="carbon:edit" />
@ -443,7 +533,10 @@ async function submitQuestion() {
<NForm ref="questionFormRef" label-placement="top" :rules="rules" :model="questionForm" size="small">
<NFormItem label="题目正文内容" path="name">
<div class="w-full overflow-hidden border border-gray-200 rounded-lg">
<WangEditor v-model="questionForm.name" placeholder="请输入题目内容..." height="300px" />
<WangEditor
v-model="questionForm.name" placeholder="请输入题目内容..." height="300px"
:exclude-keys="['header1', 'fontSize', 'fontFamily', 'lineHeight', 'justifyLeft', 'justifyRight', 'justifyCenter', 'justifyJustify', 'group-image', 'group-video', 'insertTable', 'headerSelect']"
/>
</div>
</NFormItem>

View File

@ -1,10 +1,16 @@
<script lang="ts" setup>
import { useIntervalFn } from '@vueuse/core'
import { NButton } from 'naive-ui'
import { storeToRefs } from 'pinia'
import { onUnmounted, ref } from 'vue'
import { fetchUpdateCurrentQuestionUse } from '@/service/api/result'
import { useActivityInfoStore } from '@/store/modules/activityinfo'
import GroupTabs, { type GroupItem } from './modules/GroupTabs.vue'
import TeamResultCard, { type AICharacter, type TeamResult } from './modules/TeamResultCard.vue'
const activityInfoStore = useActivityInfoStore()
const { activityId, groupId } = storeToRefs(activityInfoStore)
// --- 模拟数据和状态 ---
const groups = ref<GroupItem[]>(Array.from({ length: 8 }).map((_, i) => ({
@ -17,9 +23,9 @@ const teamsData = ref<TeamResult[]>([]) // 当前组别下的队伍数据
const isPolling = ref(true) // 是否正在轮询
// 初始化某组的队伍结构
function initGroupTeams(groupId: number | string) {
function initGroupTeams(gid: number | string) {
return Array.from({ length: 4 }).map((_, i) => ({
id: `${groupId}-${i + 1}`,
id: `${gid}-${i + 1}`,
name: `${i + 1}`,
correctCount: 0,
score: 0,
@ -167,9 +173,30 @@ function handleNext() {
}
function handlePublish() {
fetchGetQuestionDetailData()
window.$message?.success('结果已发布')
}
async function fetchGetQuestionDetailData() {
const params = {
ActivityID: Number(activityId.value),
GroupID: Number(groupId.value),
RoundType: 0 as Api.Competition.CompetitionRoundType,
}
try {
const { data: outlineData, error } = await fetchUpdateCurrentQuestionUse({ ...params, isUse: true })
// eslint-disable-next-line no-console
console.log(outlineData, 'outlineData')
if (error) {
window?.$message?.error(error.message)
}
}
catch (error: any) {
window?.$message?.error(error.message)
}
}
// 清理
onUnmounted(() => {
pause()
@ -185,11 +212,7 @@ onUnmounted(() => {
<div class="i-carbon-chart-line-data text-2xl text-blue-600" />
实时结果
</h1>
<GroupTabs
:groups="groups"
:model-value="currentGroupId"
@update:model-value="handleGroupChange"
/>
<GroupTabs :groups="groups" :model-value="currentGroupId" @update:model-value="handleGroupChange" />
</div>
<div class="flex gap-4">
@ -209,9 +232,7 @@ onUnmounted(() => {
<div class="flex-1 overflow-hidden">
<div class="grid grid-cols-4 h-full gap-6">
<TeamResultCard
v-for="team in teamsData"
:key="team.id"
:data="team"
v-for="team in teamsData" :key="team.id" :data="team"
@toggle-correct="(charId) => handleToggleCorrect(team.id, charId)"
/>
</div>

View File

@ -1,10 +1,26 @@
<script setup lang="ts">
import { ref } from 'vue'
import { computed, onBeforeUnmount, ref } from 'vue'
import { useRoute } from 'vue-router'
import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue'
import { useRouterPush } from '@/hooks/common/router'
import { fetchCheckNextStep, fetchGetCurrentQuestion } from '@/service/api/game'
import { useCompetitionStore } from '@/store/modules/competition'
const store = useCompetitionStore()
const { routerPushByKey } = useRouterPush()
const route = useRoute()
const activityId = computed(() => route.query?.activityId as string)
const groupsId = computed(() => route.query?.groupsId as string)
const teamId = computed(() => route.query?.teamId as string)
const teamIds = computed(() => route.query?.teamIds as string)
const currentQuestionMainInfo = computed(() => store.currentQuestionMainInfo)
const TeamGroup_QuestionID = computed(() => currentQuestionMainInfo.value?.TeamGroup_QuestionID || 0)
const zoomedImage = ref<string | null>(null)
const isCompleted = ref(false)
const showNextBtn = ref(false)
// Mock team data
const teams = ref([
@ -51,25 +67,105 @@ function handleZoom(img: string) {
}
function handleBack() {
routerPushByKey('user_game')
routerPushByKey('user_game', {
query: {
activityId: activityId.value,
groupsId: groupsId.value,
teamId: teamId.value,
teamIds: teamIds.value,
},
})
}
function handleNext() {
routerPushByKey('user_draw')
if (isCompleted.value) {
routerPushByKey('user_groups', {
query: {
activityId: activityId.value,
},
})
return
}
routerPushByKey('user_draw', {
query: {
activityId: activityId.value,
groupsId: groupsId.value,
teamId: teamId.value,
teamIds: teamIds.value,
},
})
// 清空当前题目信息
store.initData()
}
/**
* 获取题目详情
* 检测是否还有题可以抽取如果data为0则提示没有题可抽取
*/
async function initQuestions() {
if (!activityId.value)
return
try {
const { data: outlineData, error } = await fetchGetCurrentQuestion({
ActivityID: Number(activityId.value),
GroupID: Number(groupsId.value),
RoundType: 0,
})
// eslint-disable-next-line no-console
console.log(outlineData, 'outlineData')
if (error) {
window?.$message?.error(error.message)
}
isCompleted.value = outlineData?.data?.IsCompleted || false
}
catch (error) {
window.$message?.error('获取题目失败,请重试')
console.error(error)
}
}
const timer = ref<ReturnType<typeof setInterval> | undefined>(undefined)
/** 定时刷新 检查评委是否已经完成打分,是否可以下一步 fetchCheckNextStep */
async function checkNextStep() {
if (!activityId.value || !groupsId.value)
return
try {
const { data: nextStepData, error } = await fetchCheckNextStep(TeamGroup_QuestionID.value || 0)
// eslint-disable-next-line no-console
console.log(nextStepData, 'nextStepData')
if (error) {
window?.$message?.error(error.message)
}
const isUse = nextStepData?.data?.IsUse || false
showNextBtn.value = isUse
if (isUse) {
await initQuestions()
clearInterval(timer.value)
}
}
catch (error) {
window.$message?.error('检查是否可以下一步失败,请重试')
console.error(error)
}
}
// 定时刷新 检查是否可以下一步
timer.value = setInterval(checkNextStep, 2000)
/** 销毁 定时刷新 检查是否可以下一步 */
onBeforeUnmount(() => {
clearInterval(timer.value)
})
</script>
<template>
<CompetitionLayout
:show-title="true"
:show-back="false"
:show-next="true"
title="答题图解"
action-position="top"
back-btn-text="返回"
next-btn-text="继续抽题"
btn-theme="light"
@back="handleBack"
:show-title="true" :show-back="false" :show-next="showNextBtn" title="答题图解" action-position="top"
back-btn-text="返回" :next-btn-text="isCompleted ? '该组已完成回到选组' : '下一题'" btn-theme="light" @back="handleBack"
@next="handleNext"
>
<div class="relative h-full w-full flex flex-col items-center px-12 pt-10 font-sans">
@ -115,8 +211,7 @@ function handleNext() {
<div class="relative">
<input
v-model="team.manualScore"
type="number"
v-model="team.manualScore" type="number"
class="w-full border border-gray-300 rounded px-3 py-2 text-sm focus:border-blue-500 focus:outline-none"
placeholder="留个输入框,修改正确积分"
>
@ -128,8 +223,7 @@ function handleNext() {
<!-- Zoom Modal -->
<div
v-if="zoomedImage"
class="fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm"
v-if="zoomedImage" class="fixed inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm"
@click="zoomedImage = null"
>
<div class="relative max-h-[90vh] max-w-[90vw] p-4">

View File

@ -3,7 +3,7 @@ import { computed, onMounted, ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue'
import { useRouterPush } from '@/hooks/common/router'
import { fetchGetQuestionList } from '@/service/api/competition'
import { fetchGetQuestionTableByActivityID } from '@/service/api/game'
import { useActivityInfoStore } from '@/store/modules/activityinfo'
import { AudioController } from '@/utils/audio'
import { filterRepeat } from '@/utils/data'
@ -39,6 +39,7 @@ const route = useRoute()
const activityId = computed(() => activityInfoStore.activityId || Number(route.query?.activityId))
const groupsId = computed(() => Number(route.query?.groupsId)) || activityInfoStore.groupId
const teamId = computed(() => activityInfoStore.teamId || Number(route.query?.teamId))
const teamIds = computed(() => route.query?.teamIds as string)
async function getQuestions() {
if (!activityId.value || !groupsId.value || !teamId.value) {
@ -46,26 +47,22 @@ async function getQuestions() {
return
}
// 存 activityId,groupsId,teamId
activityInfoStore.setActivityId(activityId.value)
activityInfoStore.setGroupId(groupsId.value)
activityInfoStore.setTeamId(teamId.value)
loading.value = true
try {
const { data, error } = await fetchGetQuestionList(String(activityId.value))
const { data, error } = await fetchGetQuestionTableByActivityID(String(activityId.value))
if (error) {
window?.$message?.error(error.message)
return
}
const list = data?.data || []
if (list && Array.isArray(list)) {
// 根据ActitvityQuestionName去重
const uniqueData = filterRepeat(list as any[], 'ActitvityQuestionName')
const uniqueData = filterRepeat(list as any[], 'Name')
questions.value = uniqueData.map((item: any) => ({
id: item.Id,
moduleName: item.ActitvityQuestionName,
moduleName: item.Name,
}))
}
}
@ -95,7 +92,14 @@ function handleBack() {
}
function handleNext() {
routerPushByKey('user_rules', { query: { activityId: activityId.value, groupsId: groupsId.value, teamId: teamId.value } })
routerPushByKey('user_rules', {
query: {
activityId: activityId.value,
groupsId: groupsId.value,
teamId: teamId.value,
teamIds: teamIds.value,
},
})
}
function toggleFlip(index: number) {
@ -108,8 +112,23 @@ function toggleFlip(index: number) {
}
}
onMounted(() => {
getQuestions()
async function initSyncRouteParams() {
if (route.query.activityId)
activityInfoStore.setActivityId(Number(route.query.activityId))
if (route.query.groupsId)
activityInfoStore.setGroupId(Number(route.query.groupsId))
if (route.query.teamId)
activityInfoStore.setTeamId(Number(route.query.teamId))
if (route.query.teamIds) {
const ids = String(route.query.teamIds).split(',').map(Number).filter(id => !Number.isNaN(id))
if (ids.length > 0)
activityInfoStore.setTeamIds(ids)
}
}
onMounted(async () => {
await initSyncRouteParams()
await getQuestions()
})
</script>
@ -118,13 +137,13 @@ onMounted(() => {
:show-back="true" :show-next="showNextButton" :title="activityName" @back="handleBack"
@next="handleNext"
>
<div class="h-screen w-full overflow-hidden font-sans">
<div class="relative z-10 h-full w-full">
<div class="h-full w-full flex flex-col items-center pt-24">
<div class="h-screen w-full overflow-y-auto font-sans">
<div class="relative z-10 min-h-full w-full">
<div class="min-h-full w-full flex flex-col items-center pb-12 pt-24">
<!-- 卡片列表 -->
<div class="perspective-container grid grid-cols-4 max-w-7xl w-full gap-10 px-12">
<div class="perspective-container max-w-[1800px] w-full flex flex-wrap justify-center gap-4 px-4 md:gap-10 md:px-12">
<div
v-for="(node, index) in questions.slice(0, 4)" :key="node.id" class="card-wrapper"
v-for="(node, index) in questions" :key="node.id" class="w-[44%] card-wrapper 2xl:w-[14%] lg:w-[21%] md:w-[28%] xl:w-[17%]"
@click="toggleFlip(index)"
>
<div class="flip-card-inner" :class="{ 'is-flipped': flippedCards.has(index) }">

View File

@ -3,7 +3,7 @@ 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 { fetchGetQuestionOutline } from '@/service/api/game'
import { fetchGetCurrentQuestion } from '@/service/api/game'
import { useActivityInfoStore } from '@/store/modules/activityinfo'
import { useCompetitionStore } from '@/store/modules/competition'
import { AudioController } from '@/utils/audio'
@ -14,40 +14,43 @@ const { routerPushByKey, routerBack } = useRouterPush()
const route = useRoute()
const activityInfoStore = useActivityInfoStore()
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 store = useCompetitionStore()
const loading = ref(false)
const question = ref<Api.Competition.QuestionListRecord | null>(null)
const question = ref<Api.Competition.CurrentQuestionResponse | null>(null)
const flippedId = ref<number | null>(null)
const audioController = new AudioController()
// eslint-disable-next-line unused-imports/no-unused-vars
const pageDescription = computed(() => {
if (question.value) {
return question.value.QuestionSubTitle || ''
}
return ''
})
async function initQuestions() {
if (!activityId.value)
return
loading.value = true
try {
const { data: outlineData, error } = await fetchGetQuestionOutline(Number(activityId.value), 0)
const { data: outlineData, error } = await fetchGetCurrentQuestion({
ActivityID: Number(activityId.value),
GroupID: Number(groupsId.value),
RoundType: 0,
})
// eslint-disable-next-line no-console
console.log(outlineData, 'outlineData')
if (error) {
window?.$message?.error(error.message)
return
}
// 直接使用返回的对象数据,不进行数组转换
if (outlineData && outlineData.data) {
question.value = outlineData.data as unknown as Api.Competition.QuestionListRecord
store.setQuestionList([question.value]) // Store expects array, so wrap it
// const object = {
// ...outlineData.data?.Activity_Question || {},
// ...outlineData.data?.QuestionList || {},
// TeamGroup_QuestionID: outlineData.data?.TeamGroup_QuestionID || 0,
// }
question.value = outlineData.data as unknown as Api.Competition.CurrentQuestionResponse
store.setCurrentQuestionMainInfo(question.value)
}
}
catch (error) {
@ -63,7 +66,20 @@ onMounted(() => {
initQuestions()
})
async function handleCardClick(item: Api.Competition.QuestionListRecord) {
async function handleCardClick(item: Api.Competition.CurrentQuestionResponse) {
const { ID } = item?.Activity_Question || {}
if (!ID) {
window.$message?.error('题目ID不存在')
// 回到选组页面
routerPushByKey('user_groups', {
query: {
activityId: activityId.value,
},
})
return
}
if (flippedId.value)
return // 防止重复点击
@ -75,15 +91,21 @@ async function handleCardClick(item: Api.Competition.QuestionListRecord) {
catch (e) {
console.error('Audio play failed', e)
}
// 2. 触发翻转动画
flippedId.value = item.ID
flippedId.value = ID
// 3. 延迟1s后跳转
setTimeout(() => {
try {
store.setCurrentQuestionInfo(item)
routerPushByKey('user_game')
store.setCurrentQuestionInfo(item.Activity_Question || {})
routerPushByKey('user_game', {
query: {
activityId: activityId.value,
groupsId: groupsId.value,
teamId: teamId.value,
teamIds: teamIds.value,
},
})
}
catch (error) {
console.error('Navigation failed', error)
@ -101,16 +123,21 @@ async function handleCardClick(item: Api.Competition.QuestionListRecord) {
function handleBack() {
routerBack()
}
const questionMainTitle = computed(() => question.value?.QuestionList?.Name || '')
</script>
<template>
<CompetitionLayout :show-back="true" :show-next="false" :title="question?.ActitvityQuestionName || '抽题'" @back="handleBack">
<CompetitionLayout
:show-back="true" :show-next="false" :title="questionMainTitle || '抽题'"
@back="handleBack"
>
<div class="h-full w-full flex flex-col items-center pt-10 font-sans">
<div v-if="question" class="mb-10 max-w-4xl text-center">
<!-- <div v-if="question" class="mb-10 max-w-4xl text-center">
<div class="text-2xl text-gray-800 font-medium leading-relaxed tracking-wide">
{{ question?.ActitvityQuestionName || '' }}
</div>
{{ questionMainTitle || '' }}
</div>
</div> -->
<!-- 题目卡片列表 -->
<div v-if="loading" class="text-xl text-gray-500">
@ -119,20 +146,22 @@ function handleBack() {
<div v-else class="w-full flex flex-1 items-center justify-center pb-10">
<div v-if="question" class="lottery-stick-container">
<div
class="lottery-stick"
:class="{ 'is-selected': flippedId === question.ID }"
class="lottery-stick" :class="{ 'is-selected': flippedId === question?.Activity_Question?.ID }"
@click="handleCardClick(question)"
>
<!-- 签身 (默认显示) -->
<div class="stick-face stick-body">
<div class="stick-top-mark" />
<div class="writing-mode-vertical-rl h-full flex items-center justify-center text-xl text-yellow-900 font-bold tracking-widest opacity-80">
<div
class="writing-mode-vertical-rl h-full flex items-center justify-center text-xl text-yellow-900 font-bold tracking-widest opacity-80"
>
</div>
</div>
<!-- 签面 (翻转后显示 - 实际上是放大显示的) -->
<div class="stick-face stick-content">
<span class="writing-mode-vertical-rl text-2xl text-red-600 font-bold">{{ question.ActitvityQuestionName }}</span>
<span class="writing-mode-vertical-rl text-2xl text-red-600 font-bold">{{ questionMainTitle
}}</span>
</div>
</div>
</div>
@ -190,7 +219,8 @@ function handleBack() {
left: 0;
width: 100%;
height: 20px;
background-color: #ef4444; /* red-500 */
background-color: #ef4444;
/* red-500 */
border-radius: 8px 8px 0 0;
}

View File

@ -13,9 +13,13 @@ const { routerPushByKey } = useRouterPush()
const store = useCompetitionStore()
const activityInfoStore = useActivityInfoStore()
const { activityId, groupId, activityInfo } = storeToRefs(activityInfoStore)
// 直接从 Store 解构所需状态,保持单一数据源
const { activityId, groupId, activityInfo, teamId, teamIds } = storeToRefs(activityInfoStore)
const currentQuestionInfo = computed(() => store.currentQuestionInfo)
const currentQuestionDetail = computed(() => store.currentQuestionDetail)
const currentQuestionMainInfo = computed(() => store.currentQuestionMainInfo)
const loading = ref(false)
// 本地倒计时控制(为了在页面上显示“开始答题”还是倒计时)
@ -24,6 +28,11 @@ const isStarted = ref(false)
console.log(activityInfo.value, 'activityInfo.value')
console.log(currentQuestionInfo.value, 'currentQuestionInfo.value')
console.log(currentQuestionDetail.value, 'currentQuestionDetail.value')
console.log(currentQuestionMainInfo.value, 'currentQuestionMainInfo.value')
const mainTitle = computed(() => currentQuestionMainInfo.value?.QuestionList?.Name || '')
// const subTitle = computed(() => currentQuestionMainInfo.value?.QuestionList?.QuestionContent || '')
onMounted(async () => {
await fetchGetQuestionDetailData()
@ -33,7 +42,14 @@ onMounted(async () => {
watch(() => store.timeLeft, (newVal) => {
if (newVal === 0 && isStarted.value) {
store.stopTimer()
routerPushByKey('user_analysis')
routerPushByKey('user_analysis', {
query: {
activityId: String(activityId.value),
groupsId: String(groupId.value),
teamId: String(teamId.value),
teamIds: teamIds.value.join(','),
},
})
}
})
@ -69,7 +85,14 @@ const chartData = [
function handleBack() {
store.stopTimer()
routerPushByKey('user_draw')
routerPushByKey('user_draw', {
query: {
activityId: String(activityId.value),
groupsId: String(groupId.value),
teamId: String(teamId.value),
teamIds: teamIds.value.join(','),
},
})
}
/**
@ -80,12 +103,15 @@ async function fetchGetQuestionDetailData() {
loading.value = true
try {
const currentActivityId = String(activityId.value || '')
const questionId = store.currentQuestionInfo.QuestionID || (store.currentQuestionInfo as any).Id
const questionId = store.currentQuestionInfo?.QuestionID || (store.currentQuestionInfo as any).Id
const { data: detailData } = await fetchGetQuestionDetail(currentActivityId, questionId)
console.log(detailData, 'detailData')
if (detailData && detailData.data) {
store.setCurrentQuestionDetail(detailData.data)
}
else {
window?.$message?.error('题目详情不存在,请联系管理员')
}
}
catch (error) {
console.error('Failed to fetch question detail', error)
@ -126,7 +152,14 @@ async function handleNext() {
else {
// 备用逻辑:如果已经在答题中(理论上不会触发,因为上面已经跳转),直接跳转
store.stopTimer()
routerPushByKey('user_analysis')
routerPushByKey('user_analysis', {
query: {
activityId: String(activityId.value),
groupsId: String(groupId.value),
teamId: String(teamId.value),
teamIds: teamIds.value.join(','),
},
})
}
}
@ -147,18 +180,19 @@ async function fetchGetGameStatisticsData(_params: Api.Competition.QuestionAddPa
<template>
<CompetitionLayout
action-position="top" :show-back="false" :show-next="true"
:title="store.currentQuestionInfo?.ActitvityQuestionName || ''" back-btn-text="返回"
:next-btn-text="isStarted ? formattedTime : '开始答题'" :next-disabled="false" btn-theme="light" @back="handleBack"
@next="handleNext"
action-position="top" :show-back="false" :show-next="true" :title="mainTitle || ''"
back-btn-text="返回" :next-btn-text="isStarted ? formattedTime : '开始答题'" :next-disabled="isStarted" btn-theme="light"
@back="handleBack" @next="handleNext"
>
<div class="relative h-full w-full flex flex-col items-center overflow-hidden px-12 font-sans">
<!-- 题目说明 -->
<!-- <p>{{ store.currentQuestionInfo.ActitvityQuestionName }}</p> -->
<!-- <p class="mt-8px text-3xl">
{{ subTitle }}
</p> -->
<!-- 题目内容区域 -->
<div v-if="template && content" class="w-full flex flex-1 items-center justify-center overflow-hidden py-4">
<div class="max-h-full max-w-full flex items-center justify-center">
<QuestionRenderer :template="template" :content="content" class="origin-center scale-150 transform" />
<div class="max-h-full max-w-full">
<QuestionRenderer class="origin-center scale-150 transform" />
</div>
</div>

View File

@ -3,20 +3,15 @@ import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue'
import { useRouterPush } from '@/hooks/common/router'
import { fetchGetGroupList } from '@/service/api/competition'
import { fetchGetGroupListByActivityID } from '@/service/api/game'
const { routerPushByKey, routerBack } = useRouterPush()
const route = useRoute()
interface GroupItem {
id: number
name: string
icon: string
}
const groups = ref<GroupItem[]>([])
const groups = ref<Api.Competition.ActivityTeamGroup[]>([])
const loading = ref(false)
const activityId = route.query.activityId as string
const isAllEnd = ref(false)
async function getGroups() {
if (!activityId)
@ -24,7 +19,7 @@ async function getGroups() {
loading.value = true
try {
const { data, error } = await fetchGetGroupList(activityId)
const { data, error } = await fetchGetGroupListByActivityID(activityId, 0)
if (error) {
window?.$message?.error(error.message)
return
@ -33,11 +28,14 @@ async function getGroups() {
const list = data?.data || []
if (list && Array.isArray(list)) {
groups.value = list.map((item: any) => ({
id: item.Id,
name: item.Name,
...item,
// id: item.Id,
// name: item.Name,
icon: 'activity', // Default icon since API might not provide one
}))
}
isAllEnd.value = list.every((item: Api.Competition.ActivityTeamGroup) => item.IsEnd)
// console.log(groups.value, 'groups.value')
}
finally {
loading.value = false
@ -51,12 +49,15 @@ function handleBack() {
}
function handleNext() {
routerPushByKey('user_teams')
routerPushByKey('user')
}
function selectGroup(_id: number) {
function selectGroup(item: Api.Competition.ActivityTeamGroup) {
if (item.IsEnd)
return
// 选择组别逻辑
routerPushByKey('user_teams', { query: { activityId, groupsId: _id } })
routerPushByKey('user_teams', { query: { activityId, groupsId: item.Id } })
}
onMounted(() => {
@ -70,7 +71,8 @@ onMounted(() => {
<template>
<CompetitionLayout
:show-back="true"
:show-next="false"
:show-next="isAllEnd"
next-btn-text="查看队伍结果"
title="展示组别"
@back="handleBack"
@next="handleNext"
@ -81,10 +83,11 @@ onMounted(() => {
<div
v-for="(item, index) in groups"
v-show="showContent"
:key="item.id"
:key="item.Id"
class="group-item"
:class="{ 'is-disabled': item.IsEnd }"
:style="{ '--delay': `${index * 0.05}s` }"
@click="selectGroup(item.id)"
@click="selectGroup(item)"
>
<div class="icon-wrapper">
<div class="flower-bg" />
@ -94,7 +97,7 @@ onMounted(() => {
</div>
<div class="group-name-tag">
<span class="sun-icon"></span>
{{ item.name }}
{{ item.Name }}
</div>
</div>
</TransitionGroup>
@ -133,6 +136,16 @@ onMounted(() => {
margin: 0;
margin-bottom: 30px;
&.is-disabled {
opacity: 0.6;
cursor: not-allowed;
filter: grayscale(100%);
&:hover {
transform: none;
}
}
&:hover {
transform: translateY(-5px);
}

View File

@ -1,58 +1,131 @@
<script setup lang="ts">
import type { QuestionContent, UiTemplateType } from '../types'
import { computed } from 'vue'
import { computed, watch } from 'vue'
import { QuestionCategoryEnum } from '@/enum/business'
import { useCompetitionStore } from '@/store/modules/competition'
const props = defineProps<{
template: UiTemplateType
content: QuestionContent
}>()
// const props = defineProps<{
// template: QuestionCategoryName
// content: QuestionContent
// }>()
const store = useCompetitionStore()
const currentQuestionMainInfo = computed(() => store.currentQuestionMainInfo)
const currentQuestionDetail = computed(() => store.currentQuestionDetail)
// console.log(currentQuestionMainInfo.value, 'currentQuestionMainInfo')
// 题目
const title = computed(() => currentQuestionMainInfo.value?.QuestionList?.QuestionContent)
// 归属大纲
// const mainTitle = computed(() => currentQuestionMainInfo.value?.QuestionList?.Name)
// 题目内容
const content = computed(() => currentQuestionDetail.value.Name)
// 模版类型
const template = computed(() => currentQuestionMainInfo.value?.Activity_Question?.UIType)
/**
* 组合后的标题(用于汉字加一加模板)
* 将 content 插入到 title 的引号中,并拆分以支持不同样式
*/
const parsedComponentAddTitle = computed(() => {
const t = title.value || ''
const c = content.value || ''
// 尝试替换全角空引号
if (t.includes('“”')) {
const [prefix, suffix] = t.split('“”')
return {
type: 'quote_full',
prefix,
content: c,
suffix,
}
}
// 尝试替换半角空引号
if (t.includes('""')) {
const [prefix, suffix] = t.split('""')
return {
type: 'quote_half',
prefix,
content: c,
suffix,
}
}
// 如果没有找到空引号,直接追加
return {
type: 'normal',
prefix: t,
content: c,
suffix: '',
}
})
/** 获取富文本里面的text */
const pinyinChars = computed(() => {
if (props.template === 'TEMPLATE_WORD_DICTATION' && props.content.title) {
if (template.value === QuestionCategoryEnum.WordDictation && content.value) {
// 创建临时元素提取HTML文本内容
const div = document.createElement('div')
div.innerHTML = props.content.title
div.innerHTML = content.value
const text = div.textContent || ''
return text.trim().split(/\s+/).filter(Boolean)
}
return []
})
watch(
() => [currentQuestionMainInfo, currentQuestionDetail],
() => {
// eslint-disable-next-line no-console
console.log('Current currentQuestionMainInfo:', currentQuestionMainInfo.value)
// eslint-disable-next-line no-console
console.log('Current currentQuestionMainInfo:', currentQuestionMainInfo)
},
{ deep: true, immediate: true },
)
</script>
<template>
<div class="min-h-[400px] w-full flex items-center justify-center p-6">
<div class="w-full flex p-6" style="border: 1px solid red;">
<!-- template:{{ template }} -->
<!-- 模板A: 汉字听写-提示 (拼音+提示) -->
<div v-if="template === 'TEMPLATE_DICTATION_HINT'" class="text-center">
<div
class="mb-6 inline-block text-5xl font-bold leading-none"
style="text-shadow: 2px 2px 4px rgba(0,0,0,0.1);"
>
<div class="rich-content" v-html="content.title" />
<!-- {{ content.title }} -->
<div v-if="template === QuestionCategoryEnum.ChineseCharacterDictation" class="text-center">
<div class="mb-6 inline-block text-5xl font-bold leading-none">
<div class="ptions-container1 text-2xl">
{{ title }}
</div>
<div class="rich-content1">
{{ content }}
</div>
</div>
<!-- <div class="text-4xl text-gray-800 font-bold">
{{ content.meta?.hint }}
</div> -->
</div>
<!-- 模板B: 汉字听写-同音字 (大字) -->
<div v-else-if="template === 'TEMPLATE_DICTATION_HOMOPHONE'" class="text-center">
<div class="homophone text-[100px] text-red-600 font-bold">
<!-- {{ content.title }} -->
<div class="rich-content" v-html="content.title" />
</div>
</div>
<!-- 暂时未匹配到枚举保持原样或删除 -->
<!-- <div v-else-if="template === 'TEMPLATE_DICTATION_HOMOPHONE'" class="text-center"> -->
<!-- 模板C: 汉字加一加 (提示+部件) -->
<div v-else-if="template === 'TEMPLATE_COMPONENT_ADD'" class="text-center">
<div class="text-[100px] text-red-600 font-bold">
<!-- {{ content.title }} -->
<div class="rich-content" v-html="content.title" />
<div v-else-if="template === QuestionCategoryEnum.CharacterRadicalAddition" class="text-center">
<div class="text-[50px] font-bold">
<template v-if="parsedComponentAddTitle.type === 'quote_full'">
<span class="text-black">{{ parsedComponentAddTitle.prefix }}</span>
<span class="text-red-600">{{ parsedComponentAddTitle.content }}</span>
<span class="text-black">{{ parsedComponentAddTitle.suffix }}</span>
</template>
<template v-else-if="parsedComponentAddTitle.type === 'quote_half'">
<span class="text-black">{{ parsedComponentAddTitle.prefix }}"</span>
<span class="text-red-600">{{ parsedComponentAddTitle.content }}</span>
<span class="text-black">"{{ parsedComponentAddTitle.suffix }}</span>
</template>
<template v-else>
<span class="text-black">{{ parsedComponentAddTitle.prefix }}</span>
<span class="ml-4 text-red-600">{{ parsedComponentAddTitle.content }}</span>
</template>
</div>
</div>
<!-- 模板D: 词语听写 (拼音+提示) -->
<div v-else-if="template === 'TEMPLATE_WORD_DICTATION'" class="flex flex-col items-center">
<div v-else-if="template === QuestionCategoryEnum.WordDictation" class="flex flex-col items-center">
<div class="mb-8 flex flex-wrap justify-center gap-6">
<div
v-for="(char, index) in pinyinChars" :key="index"
@ -78,69 +151,30 @@ const pinyinChars = computed(() => {
</div>
<!-- 模板E: 成语-文字要求 -->
<div v-else-if="template === 'TEMPLATE_IDIOM_TEXT_REQ'" class="text-center">
<div v-else-if="template === QuestionCategoryEnum.IdiomWriting" class="text-center">
<div class="mb-8 text-4xl text-gray-800 font-bold">
<!-- {{ content.title }} -->
<div class="rich-content" v-html="content.title" />
<div class="rich-content" v-html="content" />
</div>
<!-- <div class="rounded bg-gray-100 px-4 py-2 text-xl text-gray-500">
示例{{ content.meta?.example }}
</div> -->
</div>
<!-- 模板F: 成语-看图 (使用Div占位) -->
<div v-else-if="template === 'TEMPLATE_IDIOM_IMAGE'" class="flex flex-col items-center text-center">
<!-- 模板F: 诗词理解 -->
<!-- <div v-else-if="template === 'TEMPLATE_IDIOM_IMAGE'" class="flex flex-col items-center text-center">
<div class="mb-6 h-60 w-80 flex items-center justify-center">
<!-- <span class="text-gray-400">图片展示区域<br></span> -->
<img :src="content.titleImage" alt="idiom image" class="h-full w-full object-contain">
</div>
<!-- <div class="text-xl text-gray-600 font-bold">
提示{{ content.meta?.hint }}
</div> -->
</div>
<!-- 模板G: 诗词理解-选择题 (通用选择题模板) -->
<div v-else-if="template === 'TEMPLATE_POETRY_MULTIPLE_CHOICE'" class="w-full flex flex-col items-center">
<div class="mb-1 text-2xl text-gray-800 font-bold leading-relaxed">
{{ content.title }}
</div>
<div class="options-container">
<div
v-for="(option, index) in content.options" :key="index" class="option-card group" :class="{
'is-mixed': !option.renderType || option.renderType === 'mixed' || option.renderType === 'image',
'is-text': option.renderType === 'text',
}"
>
<!-- 1. 图片渲染模式 -->
<div v-if="option.image" class="option-image-wrapper">
<img :src="option.image" :alt="option.label" class="option-image">
</div>
<!-- 2. 田字格渲染模式 -->
<div v-if="option.renderType === 'tianzige'" class="tianzige-wrapper">
<!-- 米字格背景 -->
<div class="tianzige-bg">
<div class="line-horizontal" />
<div class="line-vertical" />
<svg width="100%" height="100%" class="line-diagonal">
<line x1="0" y1="0" x2="100%" y2="100%" stroke="#f87171" stroke-width="1" stroke-dasharray="4 2" />
<line x1="100%" y1="0" x2="0" y2="100%" stroke="#f87171" stroke-width="1" stroke-dasharray="4 2" />
</svg>
</div>
<span class="tianzige-text">{{ option.text }}</span>
</div>
<!-- 选项标签和文字 -->
<div class="option-content">
<div class="option-label">
{{ option.label }}
</div>
<!-- 如果不是田字格模式显示普通文本 -->
<span v-if="option.renderType !== 'tianzige'" class="option-text">
{{ option.text }}
</span>
</div>
<div v-else-if="template === QuestionCategoryEnum.PoetryComprehension" class="w-full flex flex-col items-center">
<div class="options-container text-2xl">
{{ title }}
</div>
<div class="mb-1 text-3xl text-gray-800 font-bold leading-relaxed">
<div class="rich-content" v-html="content" />
</div>
</div>

View File

@ -13,6 +13,7 @@ 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()
@ -33,7 +34,14 @@ function handleBack() {
}
function handleNext() {
routerPushByKey('user_draw', { query: { activityId: activityId.value, groupsId: groupsId.value, teamId: teamId.value } })
routerPushByKey('user_draw', {
query: {
activityId: activityId.value,
groupsId: groupsId.value,
teamId: teamId.value,
teamIds: teamIds.value,
},
})
}
</script>

View File

@ -16,8 +16,9 @@ interface TeamItem {
const teams = ref<TeamItem[]>([])
const loading = ref(false)
const activityId = route.query.activityId
const groupsId = route.query.groupsId
const activityId = (route.query?.activityId) as string || ''
const groupsId = (route.query?.groupsId) as string || ''
const teamIds = ref<number[]>([])
async function getTeams() {
if (!groupsId)
@ -37,6 +38,7 @@ async function getTeams() {
name: item.Name,
icon: 'star', // Default icon
}))
teamIds.value = list.map((item: any) => item.Id)
}
}
finally {
@ -57,7 +59,7 @@ function handleNext() {
function selectTeam(_id: number) {
// 选择队伍逻辑
routerPushByKey('user_cover', { query: { activityId, groupsId, teamId: _id } })
routerPushByKey('user_cover', { query: { activityId, groupsId, teamId: _id, teamIds: teamIds.value.join(',') } })
}
onMounted(() => {

View File

@ -1,3 +1,6 @@
/**
* 废弃
*/
export type UiTemplateType =
| 'TEMPLATE_DICTATION_HINT' // 汉字听写-提示 (jiu)
| 'TEMPLATE_DICTATION_HOMOPHONE' // 汉字听写-同音 (tang)
@ -7,6 +10,17 @@ export type UiTemplateType =
| 'TEMPLATE_IDIOM_IMAGE' // 成语-看图
| 'TEMPLATE_POETRY_MULTIPLE_CHOICE' // 诗词理解-选择题
/**
* 题库类型
*/
export type QuestionCategoryName =
| 'ChineseCharacterDictation' // 汉字听写-提示 (jiu)
| 'CharacterRadicalAddition' // 汉字加一加 (车)
| 'WordDictation' // 词语听写 (zhi re)
| 'IdiomWriting' // 成语-文字要求 (反义字)
// | 'TEMPLATE_IDIOM_IMAGE' // 成语-看图
| 'PoetryComprehension' // 诗词理解-选择题
export interface QuestionOption {
label: string // A, B, C
text: string // 选项文本/值

View File

@ -0,0 +1,340 @@
{
"question_bank": [
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 5,
"Name": "请写出含有反义词的四字成语。",
"Answer": "深入浅出、喜怒无常、厚此薄彼、眼高手低、头重脚轻、继往开来、顾此失彼、哭笑不得、举足轻重、不相上下、悲喜交加、软硬兼施、文武双全、雅俗共赏、喜怒哀乐、恩怨分明、否极泰来、祸福相依、黑白分明、功败垂成、新陈代谢、盛衰荣辱、似是而非、此起彼伏、争先恐后、坐立不安、动静皆宜、以静制动、一动不如一静、大惊小怪、小题大做、大同小异、因小失大、大材小用、无中生有、有始无终、有勇无谋、有名无实、有眼无珠、有备无患、有恃无恐、得失参半、得不偿失、死里逃生、东张西望、左顾右盼、南辕北辙、前赴后继、里应外合、声东击西、上天入地、内忧外患、朝秦暮楚、朝令夕改、古为今用、今非昔比、早出晚归、昼伏夜出",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
}
]
}

View File

@ -0,0 +1,428 @@
{
"question_bank": [
{
"QuestionId": 3,
"Name": "chì rè",
"Answer": "炽热、赤热",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "hào hàn",
"Answer": "浩瀚、皓瀚",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "péng bó",
"Answer": "蓬勃、彭勃",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "cuǐ càn",
"Answer": "璀璨、璀粲",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "yōu yǎ",
"Answer": "优雅、幽雅",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "xuàn lì",
"Answer": "绚丽、炫丽",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "wǎn zhuǎn",
"Answer": "婉转、宛转",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "páng bó",
"Answer": "磅礴、旁礴",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "xuān nào",
"Answer": "喧闹、暄闹",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "yùn lǜ",
"Answer": "韵律、韵侓",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "diāo zhuó",
"Answer": "雕琢、雕斫",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "qīng cuì",
"Answer": "清脆、青翠",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "xiāo sè",
"Answer": "萧瑟、萧索",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "pú táo jiǔ",
"Answer": "葡萄酒",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "mǎ lù biān",
"Answer": "马路边",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "hú dié jié",
"Answer": "蝴蝶结",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "shuǐ jīng qiú",
"Answer": "水晶球",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "chūn tiān dào",
"Answer": "春天到",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "xiǎo niǎo jiào",
"Answer": "小鸟叫",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "huā ér xiāng",
"Answer": "花儿香",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "yuè liàng wān",
"Answer": "月亮弯",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "xīng xing shǎn",
"Answer": "星星闪",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "qīng wā tiào",
"Answer": "青蛙跳",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "zhī zhū wǎng",
"Answer": "蜘蛛网",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "yī bēn zhèng jīng",
"Answer": "一本正经",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "wǔ guāng shí sè",
"Answer": "五光十色",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "qī shàng bā xià",
"Answer": "七上八下",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "shǒu máng jiǎo luàn",
"Answer": "手忙脚乱",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "huā hóng liǔ lǜ",
"Answer": "花红柳绿",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "shān qīng shuǐ xiù",
"Answer": "山清水秀",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "chūn nuǎn huā kāi",
"Answer": "春暖花开",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "qiū gāo qì shuǎng",
"Answer": "秋高气爽",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "dōng nuǎn xià liáng",
"Answer": "冬暖夏凉",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "yuè míng xīng xī",
"Answer": "月明星稀",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "fēng hé rì lì",
"Answer": "风和日丽",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "shǔ yì",
"Answer": "鼠疫、署意",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "qiǎn xiǎn",
"Answer": "浅显、浅险",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "zhì nèn",
"Answer": "稚嫩、质嫩",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "sù xiàng",
"Answer": "塑像、素像",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "yōu xián",
"Answer": "悠闲、幽闲",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "hēi bǎn bǐ",
"Answer": "黑板笔",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "lán qiú chǎng",
"Answer": "篮球场",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "yóu yǒng chí",
"Answer": "游泳池",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "tú shū guǎn",
"Answer": "图书馆",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "diàn yǐng yuàn",
"Answer": "电影院",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "rén shān rén hǎi",
"Answer": "人山人海",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "wàn zǐ qiān hóng",
"Answer": "万紫千红",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "qiān biàn wàn huà",
"Answer": "千变万化",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "wú biān wú jì",
"Answer": "无边无际",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "bǎi huā qí fàng",
"Answer": "百花齐放",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "bǎi nián shù rén",
"Answer": "百年树人",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "qiān chuí bǎi liàn",
"Answer": "千锤百炼",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 3,
"Name": "wàn lǐ cháng chéng",
"Answer": "万里长城",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
}
]
}

View File

@ -0,0 +1,460 @@
{
"question_bank": [
{
"QuestionId": 27,
"Name": "liú 表示姓名",
"Answer": "刘,牛",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "zhāng 表示姓氏",
"Answer": "张,章",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "wáng 表示姓氏",
"Answer": "王",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "lǐ 表示姓氏",
"Answer": "李,里",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "chén 表示姓氏",
"Answer": "陈,晨",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "yáng 表示动物",
"Answer": "羊,杨",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "mǎ 表示动物",
"Answer": "马,码",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "niǎo 表示动物",
"Answer": "鸟",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "yú 表示动物",
"Answer": "鱼,于",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "gǒu 表示动物",
"Answer": "狗",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "huā 表示植物",
"Answer": "花,华",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "shù 表示植物",
"Answer": "树,数",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "cǎo 表示植物",
"Answer": "草,操",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "guǒ 表示植物",
"Answer": "果",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "yè 表示植物",
"Answer": "叶,页",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "shuǐ 表示自然元素",
"Answer": "水",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "huǒ 表示自然元素",
"Answer": "火",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "tǔ 表示自然元素",
"Answer": "土",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "jīn 表示自然元素",
"Answer": "金,今",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "mù 表示自然元素",
"Answer": "木,目",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "tiān 表示自然",
"Answer": "天,田",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "dì 表示自然",
"Answer": "地,第",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "shān 表示自然",
"Answer": "山,杉",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "chuān 表示自然",
"Answer": "川,穿",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "hé 表示自然",
"Answer": "河,和",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "rén 表示人类",
"Answer": "人,仁",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "kǒu 表示身体",
"Answer": "口",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "shǒu 表示身体",
"Answer": "手,首",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "zú 表示身体",
"Answer": "足,族",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "mù 表示身体",
"Answer": "目,木",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "ěr 表示身体",
"Answer": "耳,尔",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "bǐ 表示身体",
"Answer": "鼻,比",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "shé 表示身体",
"Answer": "舌",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "yá 表示身体",
"Answer": "牙,芽",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "xīn 表示身体",
"Answer": "心,新",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "gān 表示身体",
"Answer": "肝,干",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "chī 表示动作",
"Answer": "吃",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "hē 表示动作",
"Answer": "喝",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "zǒu 表示动作",
"Answer": "走",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "pǎo 表示动作",
"Answer": "跑",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "tiào 表示动作",
"Answer": "跳",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "kàn 表示动作",
"Answer": "看",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "tīng 表示动作",
"Answer": "听",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "shuō 表示动作",
"Answer": "说",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "dú 表示动作",
"Answer": "读",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "xiě 表示动作",
"Answer": "写",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "huà 表示动作",
"Answer": "画,话",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "yī 表示数字",
"Answer": "一",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "èr 表示数字",
"Answer": "二",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "sān 表示数字",
"Answer": "三",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "sì 表示数字",
"Answer": "四",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "wǔ 表示数字",
"Answer": "五",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "liù 表示数字",
"Answer": "六",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "qī 表示数字",
"Answer": "七",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "bā 表示数字",
"Answer": "八",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "jiǔ 表示数字",
"Answer": "九",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 27,
"Name": "shí 表示数字",
"Answer": "十,石",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
}
]
}

View File

@ -0,0 +1,468 @@
{
"question_bank": [
{
"QuestionId": 2,
"Name": "车",
"Answer": "辆、轼、转、软、轮、辐、输、轨、轩、轻、轺、辐、轴、轷、轱、辊、辎、轺、轸、辋、轳、轼、辘、辔、斩、连、阵、军、轰、库、辗、载、辈、晕、轳",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "木",
"Answer": "林、森、树、枝、柱、板、柜、桌、椅、楼、桥、村、材、松、柏、杨、柳、梅、李、杏、桃、梨、棋、格、栋、梁、架、根、植、森、杉、枯、朽、荣、荣、相、查、样、标、校、核、桃、根、株、椅、架、械、植、棚、橙",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "水",
"Answer": "冰、泉、泵、尿、沓、沝、淼、氼、沝、沯、沝、沯、沀、汆、氽、汞、沗、沓、汖、沯、沊、沝、沯、氼、沝、沓、沯、泵、沓、沗、沯、氼、沝、沓、沯、氼、沝、沓、沯、氼、沝、沓",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "火",
"Answer": "炎、焱、燚、灭、灰、灯、灶、灿、灼、灾、灵、灸、炒、炊、炕、炉、炖、炙、炬、炮、炸、烤、烧、烟、烫、烽、焰、焚、煤、煌、煲、熨、燎、燃、燥、爆、烁、炉、炊、炕、灶",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "口",
"Answer": "品、吕、回、日、田、申、甲、由、电、里、困、围、囚、图、圆、国、固、因、团、园、图、园、困、圆、囡、因、围、囟、囝、回、囧、囹、固、图、囿、圃、圄、圉、圈、圜、圆、园、围、困、图、国、园",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "日",
"Answer": "旦、早、旭、旮、旯、时、旷、旺、昨、昭、映、昧、是、显、星、春、昧、晓、晃、晌、晷、晨、晚、晾、晴、晶、晸、暑、暄、暗、暖、暇、暝、暴、暮、暾、曛、曜、曝、曦、曩、日",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "月",
"Answer": "朋、明、阴、朝、朗、期、朦、胧、肤、肥、服、胡、有、背、胃、胆、肝、肚、肠、肺、肢、肿、胀、腰、脚、腿、膀、臂、膝、脑、胖、脸、脐、胜、脉、胸、脊、育、背、胡",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "心",
"Answer": "必、志、忍、忌、忘、闷、忐、忑、忠、念、忽、思、怠、怎、怨、急、总、恶、恩、息、恳、恁、恋、恐、恕、悲、慈、意、感、想、愈、愿、慧、慰、憋、憨、憩、懋、懿、忒、忐、忑",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "手",
"Answer": "拜、掰、拿、拳、掌、掰、掱、摩、摹、擎、攀、挚、挛、挚、挲、撵、撅、撷、撺、擀、擘、擂、擞、攒、攉、攫、攥、攴、攵、收、改、攻、放、政、故、效、敏、救、教、败、敌、救",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "人",
"Answer": "从、众、今、介、以、令、全、会、合、企、余、伞、命、舍、拿、盒、盆、盒、拿、龛、介、仓、个、仄、以、令、全、会、企、众、从、介、以、令、全、会、合、企、余、伞、命",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "言",
"Answer": "信、誓、警、誉、詹、計、討、訓、記、訪、評、註、証、詠、試、詩、話、誠、誼、誤、說、読、課、調、談、請、論、諭、諦、諮、諸、諾、謀、謁、謂、謄、謎、謙、講、謝、謠、謬、謹、識、譜、議、護、譽、變",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "金",
"Answer": "鑫、针、钉、钏、钓、钒、钗、钙、钚、钛、钝、钞、钟、钢、钤、钥、钦、钧、钩、钫、钬、钯、钮、钰、钱、钳、钻、钿、钾、铀、铁、铂、铃、铅、铆、铊、铋、铌、铍、铎、铐、铑、铒、铕、铗、铘、铙、铚、铛",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "石",
"Answer": "岩、矿、码、砂、研、砖、砌、砍、泵、硬、破、砸、础、硅、硕、确、碑、碗、碟、碾、磕、磁、磅、磨、磷、磺、礁、础、碣、碲、碴、碹、碳、碣、磬、磲、磴、磷、磺、礁",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "山",
"Answer": "岁、岭、岩、岳、岸、峰、峡、峻、崇、崎、崖、岗、崩、崭、嵌、嵘、崽、巅、巍、岚、岔、岖、岈、岘、岙、岑、岔、岗、岵、岷、岽、岿、峁、峄、峋、峥、峦、峙、峡、峤、峦",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "土",
"Answer": "圭、垚、尘、地、场、址、块、坐、垃、坡、坦、坤、坻、坯、坪、坳、坷、坩、坫、坭、坳、垆、垌、垍、垓、垠、垩、垭、垯、垲、垴、垸、埂、埋、城、埔、域、埏、埕、埘、埙、埚、埝、埤、埭、埯、埸、培、基",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "马",
"Answer": "冯、驭、驮、驯、驰、驱、驳、驴、驶、驷、驸、驹、驻、驼、驿、驽、驾、骂、骁、骄、骆、骇、骈、骊、骋、验、骏、骐、骑、骒、骓、骖、骗、骚、骛、骜、骝、骞、骟、骠、骡、骢、骣、骤、骥、骧、骊",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "鸟",
"Answer": "鸡、鸣、鸥、鸦、鸭、鸯、鸳、鸽、鸾、鸿、鹃、鹅、鹑、鹉、鹊、鹋、鹛、鹜、鹞、鹣、鹤、鹦、鹬、鹰、鹭、鹳、鹬、鸤、鸧、鸨、鸩、鸪、鸫、鸬、鸭、鸮、鸯、鸰、鸱、鸲、鸴、鸵、鸶、鸷、鸸、鸹、鸺、鸼、鸽",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "鱼",
"Answer": "鱻、渔、鲁、鲂、鲅、鲍、鲈、鲇、鲋、鲎、鲐、鲑、鲒、鲔、鲕、鲚、鲛、鲜、鲞、鲟、鲠、鲤、鲥、鲦、鲧、鲨、鲩、鲫、鲭、鲮、鲰、鲱、鲲、鲳、鲵、鲶、鲷、鲺、鲻、鲽、鲾、鳀、鳁、鳂、鳃、鳄、鳅、鳆、鳇",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "虫",
"Answer": "虬、虮、虱、虹、虾、蚁、蚂、蚕、蛊、蛄、蛆、蛇、蛉、蛋、蛎、蛏、蛐、蛑、蛓、蛔、蛙、蛛、蛞、蛟、蛩、蛭、蛮、蛱、蛲、蛳、蛴、蛸、蛹、蛺、蛾、蜂、蜃、蜇、蜈、蜉、蜊、蜍、蜒、蜓、蜕、蜗、蜘、蜜",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "竹",
"Answer": "竿、竽、笃、笄、笆、笈、笋、笊、笏、笕、笔、笑、笤、笥、符、笨、笪、笫、第、笮、笱、笳、笸、笺、笼、笾、筇、筌、筎、筘、筚、筛、筜、筝、筠、筢、筮、筱、筲、筵、筷、筹、筻、签、简、箐、箜、箐、箓",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "禾",
"Answer": "利、秃、秀、私、秉、秆、秄、秈、秕、种、科、秒、秭、秣、秤、秦、秧、秩、租、秫、秸、秽、移、税、稚、稠、稂、稃、程、稆、稍、稔、稗、稞、稟、稠、稳、稷、稻、稼、稽、稿、穆、穑、穗、穰、穸、穻",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "米",
"Answer": "类、籽、粉、粒、粕、粗、粘、粟、粜、粝、粞、粳、粢、粤、粥、粲、粱、粮、粹、精、粽、糊、糁、糅、糕、糖、糙、糜、糗、糟、糠、糯、糨、糁、糇、糈、糌、糍、糈、糍、糌、糍",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "纟",
"Answer": "纠、红、纤、纡、约、级、纨、纪、纫、纬、纭、纯、纰、纱、纲、纳、纵、纶、纷、纸、纹、纺、纻、纽、纾、线、绀、绁、绂、练、组、绅、细、织、终、绉、绊、绋、绌、绍、绎、经、绐、绑、绒、结、绔、绕",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "贝",
"Answer": "贞、负、贡、财、责、贤、败、账、货、质、贩、贪、贫、贬、购、贮、贯、贰、贱、贲、贵、贶、贷、贸、费、贺、贻、贼、贽、贾、贿、贳、赁、赂、赃、资、赅、赆、赇、赈、赉、赊、赋、赌、赎、赏、赐、赑、赒",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "王",
"Answer": "玉、全、主、弄、玌、玎、玑、玕、玖、玛、玟、玢、环、玩、玮、玲、玳、玷、玻、珊、珍、珑、珈、珉、玻、珠、珐、珙、珞、珥、珧、珩、珲、珺、琀、琊、琏、琐、琚、琛、琨、琬、琮、琰、琯、琳、琴、琵",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "走",
"Answer": "赴、赵、赶、起、趁、趋、超、越、趄、趔、趑、趣、趟、趠、趡、趤、趦、趪、趫、趬、趭、趮、趯、趱、赶、起、越、超、趋、趁、趣、趟、趔、趑、趠、趡、趤、趦、趪、趫、趬、趭、趮、趯、趱",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "足",
"Answer": "趴、趵、趸、趿、跃、跄、跆、跋、跌、跎、跑、跖、跚、跛、距、跣、跨、跪、路、跳、践、跶、跷、跸、跹、跺、跻、跽、踅、踉、踊、踌、踏、踔、踝、踞、踟、踣、踦、踧、踱、踵、踶、踹、踺、踽、蹀、蹁",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "页",
"Answer": "顶、顷、顸、项、顺、须、顼、顽、顾、顿、颁、颂、颃、预、颅、领、颈、颉、颊、颋、颌、颍、颎、颏、颐、频、颓、颔、颖、颗、题、颙、颚、颛、颜、额、颞、颟、颠、颡、颢、颤、颥、颦、颧、顸、项",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "酉",
"Answer": "酒、配、酊、酋、酌、酎、酏、酐、酑、酒、酓、酕、酖、酗、酙、酚、酝、酞、酡、酢、酣、酤、酥、酬、酪、酮、酯、酰、酱、酲、酴、酵、酶、酷、酸、酹、酺、酽、酾、酿、醁、醅、醇、醉、醋、醌、醍、醐",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "艹",
"Answer": "艺、艾、节、芋、芍、芒、芝、芄、芑、芗、芎、芋、芌、芏、芐、芑、芊、芕、芗、芘、芙、芜、芝、芟、芡、芣、芤、芥、芦、芩、芪、芫、芬、芭、芮、芯、芰、花、芳、芷、芸、芹、芺、芽、苇、苋、苌、苍",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "宀",
"Answer": "字、安、宋、完、宏、牢、灾、宝、宗、定、宕、宠、宜、审、官、宛、实、宓、宣、宦、室、宫、宪、客、害、宽、家、宵、宴、宾、宰、案、容、宿、寂、寄、密、寇、富、寐、寒、寓、寞、寝、寤、寥、察、寡、寮",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "阝(左)",
"Answer": "队、阡、阪、阮、阱、防、阳、阴、阶、阻、阿、陀、陂、附、际、陆、陇、陈、陉、陕、降、限、陡、院、除、险、陪、陵、陶、陷、隍、隘、隙、障、隧、隗、隰、隳、陇、陈、陂、陉、陕、陇、陔、陖、陗、陘、陙",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "阝(右)",
"Answer": "邓、邗、邛、邝、邡、邢、邬、邰、邱、邳、邴、邵、邶、邸、邹、邺、邻、郏、郅、郇、郓、郕、郗、郜、郝、郡、郢、郦、郫、郭、郯、郴、郸、都、郾、郿、鄄、鄅、鄌、鄑、鄗、鄘、鄚、鄢、鄣、鄯、鄱、鄹",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "⻊",
"Answer": "路、跑、跳、踏、踩、踢、跪、跟、跨、蹦、蹈、蹭、踮、蹲、跃、跚、踉、跷、踌、踝、踞、踣、踧、踱、踵、踶、踹、踺、蹀、蹁、蹂、蹄、蹅、蹇、蹈、蹊、蹉、蹋、蹑、蹒、蹓、蹔、蹕、蹙、蹟、蹠、蹡、蹢",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "彳",
"Answer": "行、往、征、彼、径、待、徂、徉、很、徇、徕、徒、徐、得、徘、徙、徜、徨、循、微、徳、徴、徯、徭、微、徼、徽、彷、役、彻、佛、征、徂、徉、徊、律、後、徐、徒、得、徘、徙、徕、循、徨、微、徳、徵",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "犭",
"Answer": "犯、犰、犴、犷、犸、犹、狈、狂、狄、狁、狉、狎、狐、狝、狗、狙、狞、狟、狠、狡、狩、独、狭、狮、狯、狰、狱、狲、狳、狴、狺、狼、猁、狻、猃、猇、猓、猕、猖、猗、猘、猛、猜、猝、猞、猡、猢、猥",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "⺮",
"Answer": "竹、竿、竽、笃、笄、笆、笈、笋、笊、笏、笕、笔、笑、笤、笥、符、笨、笪、笫、第、笮、笱、笳、笸、笺、笼、笾、筇、筌、筎、筘、筚、筛、筜、筝、筠、筢、筮、筱、筲、筵、筷、筹、筻、签、简、箐、箜",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "女",
"Answer": "奶、奴、奸、她、好、如、妃、妄、妆、妇、妈、妍、妩、妓、妪、妒、妨、妞、妯、妲、妹、妻、妾、姆、始、姓、委、姗、妮、妯、妲、妹、妻、妾、姆、始、姓、委、姗、妮、姚、姜、姝、姣、姨、姻、姿、威",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "子",
"Answer": "孔、孕、存、孙、孜、孝、孟、季、孤、孢、孩、孺、孛、孥、学、孨、孪、孬、孭、孮、孯、孰、孱、孳、孵、孶、孷、孹、孻、孼、孽、孾、孿、孔、孕、存、孙、孜、孝、孟、季、孤、孢、孩、孺、孛、孥",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "⻌",
"Answer": "边、辽、达、过、迈、迁、迅、迄、巡、进、远、违、连、迟、迢、迤、迥、迦、迨、迪、迭、迮、述、迳、迫、迺、追、逅、适、逃、逄、逈、逋、通、逛、逝、逞、速、造、透、逐、逑、递、逖、逗、逦、逡、週",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "⺮",
"Answer": "竹、竿、竽、笃、笄、笆、笈、笋、笊、笏、笕、笔、笑、笤、笥、符、笨、笪、笫、第、笮、笱、笳、笸、笺、笼、笾、筇、筌、筎、筘、筚、筛、筜、筝、筠、筢、筮、筱、筲、筵、筷、筹、筻、签、简、箐、箜",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "扌",
"Answer": "扎、打、扑、扒、扔、扛、扣、托、执、扩、扫、扬、扶、抚、技、抠、扰、扼、拒、找、批、扯、抄、折、抓、扳、抡、扮、抢、抑、抛、投、抗、抖、护、扭、把、报、拟、抒、抻、抵、抹、抻、押、抽、抿、拂",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "氵",
"Answer": "汁、汀、汇、汉、污、江、汛、池、汤、汪、沛、沤、沥、沦、汹、沧、沨、沟、没、沏、沔、沙、汽、沃、沂、汹、泛、沧、沩、沪、沉、沈、沁、泐、沫、浅、法、沽、河、沾、泪、沮、油、泱、泳、泞、泻、泼",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "忄",
"Answer": "忆、忙、忖、忏、忉、忧、忋、快、忓、忔、忕、忡、忤、忪、怅、怆、怊、怍、怏、怑、怗、怙、怛、怕、怫、怦、性、怩、怪、怫、怿、恁、恂、恃、恬、恌、恑、恒、恢、恍、恓、恘、恚、恝、恟、恠、恡、恫",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "灬",
"Answer": "点、烈、热、烹、焦、然、煎、照、熙、熊、熏、熟、熹、熬、热、熏、熈、熟、熹、熏、燮、爇、爢、爣、爤、爥、爦、爧、爨、爩、点、烈、热、烹、焦、然、煎、照、熙、熊、熏、熟、熹、熬、热、熏",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "刂",
"Answer": "刊、刑、划、刈、刍、创、刚、列、刘、则、删、判、别、刭、刮、到、刳、制、刷、刹、刺、刻、刽、刿、剀、剁、剂、剃、削、剌、前、剐、剑、剔、剖、剥、剧、剩、割、剡、剞、剟、剡、剣、剥、剧、剩、割",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "礻",
"Answer": "礼、社、祀、祁、祃、祅、祆、祇、祈、祉、祊、祋、祌、祍、祎、祏、祐、祑、祒、祓、祔、祕、祖、祗、祚、祛、祜、祝、神、祟、祠、祢、祥、祷、祸、祺、祼、祾、禄、禅、禊、禋、福、禔、禕、禖、禘、禚",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "钅",
"Answer": "针、钉、钌、钋、钊、钏、钒、钓、钗、钙、钚、钛、钝、钞、钟、钠、钡、钢、钤、钥、钦、钧、钨、钩、钪、钫、钬、钭、钮、钯、钰、钱、钲、钳、钴、钵、钶、钷、钸、钹、钺、钻、钼、钽、钾、钿、铀、铁",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "冫",
"Answer": "冰、冯、冮、冲、决、冴、冻、况、冷、冶、冹、冺、净、冽、冾、冿、净、凂、凃、凄、凅、准、凇、凉、凊、凋、凌、凍、凓、凔、凕、凖、凗、凘、凚、凛、凝、凞、凟、冰、冯、冮、冲、决、冴、冻、况",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "疒",
"Answer": "疗、疖、疟、疠、疡、疣、疤、疥、疫、疰、疱、疲、疳、疴、疵、疸、疹、疼、疽、疾、痂、痃、痄、病、症、痈、痉、痒、痔、痕、痖、痘、痛、痞、痤、痦、痧、痪、痫、痬、痭、痮、痯、痰、痱、痴、痹、瘁",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "衤",
"Answer": "补、衩、衫、衬、衱、衲、衽、衿、袂、袄、袆、袈、袋、袍、袢、袜、袤、被、袪、袷、袺、裆、裈、裉、裎、裒、裓、裕、裨、裰、裱、裳、裴、裸、裹、裼、製、裾、褂、褊、褐、褓、褙、褛、褥、褪、褫、褰",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "饣",
"Answer": "饥、饦、饧、饨、饭、饮、饫、饪、饬、饲、饯、饰、饱、饴、饵、饶、饷、饸、饹、饺、饻、饼、饽、饾、饿、馀、馁、馃、馄、馅、馆、馇、馈、馉、馊、馋、馌、馍、馏、馐、馑、馒、馓、馔、馕、饥、饦",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "⻏",
"Answer": "邦、邪、邨、邬、邴、邵、邰、邳、邱、邶、邸、邹、邺、邻、郏、郅、郇、郓、郕、郗、郜、郝、郢、郦、郫、郭、郯、郴、郸、都、郾、郿、鄄、鄅、鄌、鄑、鄗、鄘、鄚、鄢、鄣、鄯、鄱、鄹、邛、邝",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "纟",
"Answer": "纠、红、纤、纡、约、级、纨、纪、纫、纬、纭、纯、纰、纱、纲、纳、纵、纶、纷、纸、纹、纺、纻、纽、纾、线、绀、绁、绂、练、组、绅、细、织、终、绉、绊、绋、绌、绍、绎、经、绐、绑、绒、结、绔、绕",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "罒",
"Answer": "罗、罚、罢、罩、罪、置、署、罹、罘、罝、罟、罡、罣、罥、罦、罨、罭、罯、罱、罳、罴、罶、罽、罾、罿、羁、羂、羃、羅、羆、羇、羈、羉、罗、罚、罢、罩、罪、置、署、罹、罘、罝、罟、罡、罣、罥",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "虍",
"Answer": "虎、虏、虐、虑、虔、虚、虞、虢、虣、虤、虥、虦、亏、虩、虪、虎、虏、虐、虑、虔、虚、虞、虢、虣、虤、虥、虦、亏、虩、虪、虎、虏、虐、虑、虔、虚、虞、虢、虣、虤、虥、虦、亏、虩、虪",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "辶",
"Answer": "边、辽、达、过、迈、迁、迅、迄、巡、进、远、违、连、迟、迢、迤、迥、迦、迨、迪、迭、迮、述、迳、迫、迺、追、逅、适、逃、逄、逈、逋、通、逛、逝、逞、速、造、透、逐、逑、递、逖、逗、逦、逡、週",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 2,
"Name": "罒",
"Answer": "罗、罚、罢、罩、罪、置、署、罹、罘、罝、罟、罡、罣、罥、罦、罨、罭、罯、罱、罳、罴、罶、罽、罾、罿、羁、羂、羃、羅、羆、羇、羈、羉、罗、罚、罢、罩、罪、置、署、罹、罘、罝、罟、罡、罣、罥",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
}
]
}

View File

@ -0,0 +1,452 @@
{
"question_bank": [
{
"QuestionId": 4,
"Name": "Jú",
"Answer": "巨、且、句、讵、郏、苣、姖、岠、局、拒、拠、洰、汩、车、具、冣、莒、弆、呿、駶、狙、岨、居、拘、拀、淗、湨、澽、忂、炬、柜、歫、昛、歫、举、佝、茮、柩、罝、珇、秬、矩、剧、陱、俱、伹、伿、挶、栨、椇、椐、椈、歫、毩、毱、疽、痀、眗、砠、租、窭、筥、篓、簴、籧、粔、罝、耟、聥、腒、艍、苴、莒、蒟、蘮、虡、蜛、螶、袓、襷、詎、諊、豦、貗、趄、跔、跙、踘、躆、躹、輂、邭、鄓、郹、鄅、鉅、鋸、鐻、閰、陱、雎、颶、駏、駒、駶、驧、髃、鴂、鴃、鵙、鵴、鶋、鼁、鼳",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuē",
"Answer": "薛、靴、削、噱、学、穴、乴、峃、嶨、斈、泶、澩、燢、膤、茓、袕、觷、辥、辪、鞾、鳕、鷽、鸴、踅、謔、噱、燢、谑、疶、疨、蒆、辥、鞾、髇、髐、魈、嚻、噰、斅、斆、燢、爚、狘、瞲、籱、蠦、蠸、觷、諔、譃、谑、谔、谻、豰、貜、趞、踅、躞、遯、遪、郺、鄏、鄻、酄、鍌、鎑、鐍、闅、隟、雤、鞾、韕、顨、饇、騔、驜、鱊、鱮、鷍、鷢、鸙、麧、龤",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Yuè",
"Answer": "月、悦、阅、越、岳、跃、粤、钺、栎、樾、刖、哕、妜、岄、恱、悅、戉、抈、捳、曱、枂、櫟、泧、瀹、爚、狘、玥、礿、禴、籆、籥、粤、臒、蘥、蚎、蚏、蛻、蠖、說、説、趯、跀、跃、軏、鈅、鉞、銳、銳、閱、閲、髺、鸑、鸙、黦",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Qū",
"Answer": "区、曲、屈、趋、驱、躯、蛆、祛、麴、诎、岖、阹、憈、敺、斪、欋、氍、焌、煀、璖、癯、磲、筁、籧、粬、紶、翑、胠、臞、菃、蕖、蘧、蛐、蠷、衐、袪、覰、覷、詘、趨、躣、軀、軥、迲、遽、釻、鐻、阹、駆、駈、騶、驅、鰸、鱋、麯、麴、鼩、齲",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuó",
"Answer": "着、卓、灼、浊、琢、酌、啄、斫、茁、倬、诼、禚、浞、涿、濯、焯、禚、窡、籗、籱、缴、罬、蠗、諑、謶、趠、踔、蹠、躅、鉵、鐯、鐲、鵫、鷟、鸐、斀、斲、斵、晫、椓、槕、櫡、汋、淖、灂、炪、灼、烵、犳、琸、矠",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Cuì",
"Answer": "翠、脆、粹、萃、悴、淬、毳、瘁、粹、竁、粋、紣、綷、翆、脃、膵、臎、襊、鏙、隹、顇、伜、倅、啐、崒、崪、忰、慛、椊、焠、璲、疩、皠、磪、竁、粋、縗、紣、翆、脺、膬、臎、襊、趡、鏙、顇、鷻",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Juàn",
"Answer": "卷、倦、眷、绢、隽、桊、狷、鄄、绢、睠、絭、縳、罥、羂、讂、踡、錈、鎸、鐫、韏、飬、餋、鵑、鷢、奆、姢、帣、悁、惓、慻、捲、梋、棬、泫、淃、焆、獧、瓹",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuǎn",
"Answer": "选、宣、悬、旋、玄、绚、轩、喧、渲、璇、煊、谖、萱、暄、儇、塇、媗、愃、揎、昍、晅、暅、楦、泫、洵、炫、烜、煊、玹、琄、癣、矎、禤、箮、翾、縼、繏、翧、蝖、蠉、諠、諼、讂、谖、鉉、鏇、鞙、韗、饌、駨、駽、鰚、鶱",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhàn",
"Answer": "战、站、占、绽、栈、湛、蘸、颤、佔、偡、嶘、战、戰、搌、栈、棧、椾、榐、橏、欃、湔、湛、澶、灒、琖、皽、碊、站、綻、菚、蘸、虥、袒、襢、覱、詀、謙、譧、譫、趈、蹍、躔、輚、轏、邅、醆、鉆、鋑、鏨、饘、驏、驙、鱣、鸇",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Niè",
"Answer": "聂、涅、孽、啮、嗫、镊、蹑、陧、臬、乜、枿、槷、櫱、氼、湼、疌、痆、篞、籋、糱、糵、聂、臲、苶、菍、蘖、蠥、讘、踂、踗、踙、躡、鉩、銸、鋷、錜、鎳、鑈、闑、隉、顳、齧、齧、囁、囐、嚙、囓、孼、嵲、巕、帇、惗、敜、枿、槷、櫱、痆",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Suì",
"Answer": "岁、遂、碎、穗、隧、祟、燧、谇、邃、睟、穂、襚、旞、繐、繸、譢、賥、遀、鏸、鐆、鐩、韢、髄、髓、穟、禭、穂、襚、旞、繐、繸、譢、賥、遀、鏸、鐆、鐩、韢、髄、髓、穟、禭",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Yuān",
"Answer": "渊、冤、鸳、鸢、眢、蜎、箢、肙、悁、棩、渁、渆、渕、淵、灁、鵷、鶢、鼘、鼝、囦、寃、怨、惌、棩、渕、淵、盶、眢、笎、蒬、蜎、裷、裫、駌、鳶、鴛、鼘、鼝",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Chuò",
"Answer": "辍、绰、戳、啜、龊、辵、娖、婥、婼、惙、擉、歠、涰、淖、磭、篧、綴、繛、缀、腏、荃、蔟、趠、踔、踱、輟、辶、逴、酫、鑡、齪、齱、吷、啜、嚽、婥、婼、惙、擉、歠、涰",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Qì",
"Answer": "气、器、弃、泣、契、砌、迄、汽、憩、葺、讫、沏、亟、呮、咠、唭、噐、埴、夡、忔、憇、栔、槭、欫、気、汔、洓、湆、滊、炁、焏、甈、甓、盵、矵、碛、磜、磧、碶、磩、礘、竐、綥、綮、緀、緝、罊、翜、聺、臮、艩、芞、藒、蟿、訖、趞、跂、踦、迉、郪、釮、錡、闙、霼、鯚、鶺、鼜、齌",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xùn",
"Answer": "迅、讯、训、逊、汛、殉、徇、巽、浚、逊、噀、嚑、坃、塤、壦、奞、愻、揗、攳、栒、楥、橁、殾、毥、汛、浚、潠、濬、灥、煇、燅、狥、珣、璕、畃、皨、瞓、矄、稄、筍、箰、篔、紃、絢、纁、臐、荨、蕈、薫、蘍、蟫、訊、訓、訙、訬、賐、迿、遜、鄩、鑂、鑫、雋、馴、駨、鱘、鱏",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuì",
"Answer": "坠、赘、缀、惴、缒、甀、畷、礈、笍、綴、縋、膇、諈、贅、轛、鑆、坠、隊、隧、膇、諈、贅、鑆、墜",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Cuàn",
"Answer": "窜、篡、爨、殩、熶、簒、竄、篡、镩、躥、攛、爨、殩、熶、簒、竄、篡、镩、躥、攛",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Juē",
"Answer": "撅、噘、屩、亅、孒、孓、屫、撅、撧、欮、決、氒、決、泬、潏、灍、玦、玨、璚、疦、瘚、絕、绝、芵、蕝、蕨、蚗、蟨、觖、觼、诀、譎、貜、赽、趹、蹶、蹷、逫、鈌、鐍、鐝、钁、駃、鴂、鴃、鷢、龣",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuè",
"Answer": "血、谑、穴、泬、狘、桖、烕、瞲、趐、轐、轌、鉥、瀥、粵、蘥、謔、谑、趐、轐、轌、鉥",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuān",
"Answer": "专、砖、转、颛、啭、堟、塼、嫥、専、甎、磚、竱、籑、蒃、蟤、諯、転、轉、鄟、顓、鱄",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Qióng",
"Answer": "穷、琼、穹、邛、茕、筇、銎、儝、卭、嬛、憌、桏、橩、焭、焪、煢、熍、琁、璚、瓊、睘、瞏、穷、竆、笻、窮、藑、藭、蛩、蛬、赹、趜、跫、銎、顈、",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Yuè",
"Answer": "月、乐、越、跃、岳、悦、阅、粤、钥、栎、樾、戉、抈、岄、岳、恱、悅、戉、抈、枂、栎、樾、泧、瀹、爚、狘、玥、礿、禴、籆、籥、粤、臒、蘥、蚎、蚏、蛻、蠖、說、趯、跀、跃、軏、鈅、鉞、銳、銳、閱、閲、髺、鸑、鸙、黦",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Chuàng",
"Answer": "创、怆、刱、剏、剙、愴、摐、牎、牕、瘡、窓、窗、蔥、闖、戧、摐、牎、牕、瘡、窓、窗、蔥、闖、戧",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuān",
"Answer": "宣、轩、喧、萱、暄、煊、儇、谖、塇、媗、愃、揎、昍、晅、暅、楦、泫、洵、炫、烜、煊、玹、琄、癣、矎、禤、箮、翾、縼、繏、翧、蝖、蠉、諠、諼、讂、谖、鉉、鏇、鞙、韗、饌、駨、駽、鰚、鶱",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuì",
"Answer": "坠、赘、缀、惴、缒、甀、畷、礈、笍、綴、縋、膇、諈、贅、轛、鑆、队、隧、膇、諈、贅、鑆、墜",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Niè",
"Answer": "聂、涅、孽、啮、嗫、镊、蹑、陧、臬、乜、枿、槷、櫱、氼、湼、疌、痆、篞、籋、糱、糵、聂、臲、苶、菍、蘖、蠥、讘、踂、踗、踙、躡、鉩、銸、鋷、錜、鎳、鑈、闑、隉、顳、齧、齧、囁、囐、嚙、囓、孼、嵲、巕、帇、惗、敜、枿、槷、櫱、痆",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Suì",
"Answer": "岁、遂、碎、穗、隧、祟、燧、谇、邃、睟、穂、襚、旞、繐、繸、譢、賥、遀、鏸、鐆、鐩、韢、髄、髓、穟、禭、穂、襚、旞、繐、繸、譢、賥、遀、鏸、鐆、鐩、韢、髄、髓、穟、禭",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Yuān",
"Answer": "渊、冤、鸳、鸢、眢、蜎、箢、肙、悁、棩、渁、渆、渕、淵、灁、鵷、鶢、鼘、鼝、囦、寃、怨、惌、棩、渕、淵、盶、眢、笎、蒬、蜎、裷、裫、駌、鳶、鴛、鼘、鼝",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Chuò",
"Answer": "辍、绰、戳、啜、龊、辵、娖、婥、婼、惙、擉、歠、涰、淖、磭、篧、綴、繛、缀、腏、荃、蔟、趠、踔、踱、輟、辶、逴、酫、鑡、齪、齱、吷、啜、嚽、婥、婼、惙、擉、歠、涰",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Qì",
"Answer": "气、器、弃、泣、契、砌、迄、汽、憩、葺、讫、沏、亟、呮、咠、唭、噐、埴、夡、忔、憇、栔、槭、欫、気、汔、洓、湆、滊、炁、焏、甈、甓、盵、矵、碛、磜、磧、碶、磩、礘、竐、綥、綮、緀、緝、罊、翜、聺、臮、艩、芞、藒、蟿、訖、趞、跂、踦、迉、郪、釮、錡、闙、霼、鯚、鶺、鼜、齌",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xùn",
"Answer": "迅、讯、训、逊、汛、殉、徇、巽、浚、逊、噀、嚑、坃、塤、壦、奞、愻、揗、攳、栒、楥、橁、殾、毥、汛、浚、潠、濬、灥、煇、燅、狥、珣、璕、畃、皨、瞓、矄、稄、筍、箰、篔、紃、絢、纁、臐、荨、蕈、薫、蘍、蟫、訊、訓、訙、訬、賐、迿、遜、鄩、鑂、鑫、雋、馴、駨、鱘、鱏",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuì",
"Answer": "坠、赘、缀、惴、缒、甀、畷、礈、笍、綴、縋、膇、諈、贅、轛、鑆、坠、隊、隧、膇、諈、贅、鑆、墜",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Cuàn",
"Answer": "窜、篡、爨、殩、熶、簒、竄、篡、镩、躥、攛、爨、殩、熶、簒、竄、篡、镩、躥、攛",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Juē",
"Answer": "撅、噘、屩、亅、孒、孓、屫、撅、撧、欮、決、氒、決、泬、潏、灍、玦、玨、璚、疦、瘚、絕、绝、芵、蕝、蕨、蚗、蟨、觖、觼、诀、譎、貜、赽、趹、蹶、蹷、逫、鈌、鐍、鐝、钁、駃、鴂、鴃、鷢、龣",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuè",
"Answer": "血、谑、穴、泬、狘、桖、烕、瞲、趐、轐、轌、鉥、瀥、粵、蘥、謔、谑、趐、轐、轌、鉥",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuān",
"Answer": "专、砖、转、颛、啭、堟、塼、嫥、専、甎、磚、竱、籑、蒃、蟤、諯、転、轉、鄟、顓、鱄",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Qióng",
"Answer": "穷、琼、穹、邛、茕、筇、銎、儝、卭、嬛、憌、桏、橩、焭、焪、煢、熍、琁、璚、瓊、睘、瞏、穷、竆、笻、窮、藑、藭、蛩、蛬、赹、趜、跫、銎、顈、",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Yuè",
"Answer": "月、乐、越、跃、岳、悦、阅、粤、钥、栎、樾、戉、抈、岄、岳、恱、悅、戉、抈、枂、栎、樾、泧、瀹、爚、狘、玥、礿、禴、籆、籥、粤、臒、蘥、蚎、蚏、蛻、蠖、說、趯、跀、跃、軏、鈅、鉞、銳、銳、閱、閲、髺、鸑、鸙、黦",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Chuàng",
"Answer": "创、怆、刱、剏、剙、愴、摐、牎、牕、瘡、窓、窗、蔥、闖、戧、摐、牎、牕、瘡、窓、窗、蔥、闖、戧",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuān",
"Answer": "宣、轩、喧、萱、暄、煊、儇、谖、塇、媗、愃、揎、昍、晅、暅、楦、泫、洵、炫、烜、煊、玹、琄、癣、矎、禤、箮、翾、縼、繏、翧、蝖、蠉、諠、諼、讂、谖、鉉、鏇、鞙、韗、饌、駨、駽、鰚、鶱",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuì",
"Answer": "坠、赘、缀、惴、缒、甀、畷、礈、笍、綴、縋、膇、諈、贅、轛、鑆、队、隧、膇、諈、贅、鑆、墜",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Niè",
"Answer": "聂、涅、孽、啮、嗫、镊、蹑、陧、臬、乜、枿、槷、櫱、氼、湼、疌、痆、篞、籋、糱、糵、聂、臲、苶、菍、蘖、蠥、讘、踂、踗、踙、躡、鉩、銸、鋷、錜、鎳、鑈、闑、隉、顳、齧、齧、囁、囐、嚙、囓、孼、嵲、巕、帇、惗、敜、枿、槷、櫱、痆",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Suì",
"Answer": "岁、遂、碎、穗、隧、祟、燧、谇、邃、睟、穂、襚、旞、繐、繸、譢、賥、遀、鏸、鐆、鐩、韢、髄、髓、穟、禭、穂、襚、旞、繐、繸、譢、賥、遀、鏸、鐆、鐩、韢、髄、髓、穟、禭",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Yuān",
"Answer": "渊、冤、鸳、鸢、眢、蜎、箢、肙、悁、棩、渁、渆、渕、淵、灁、鵷、鶢、鼘、鼝、囦、寃、怨、惌、棩、渕、淵、盶、眢、笎、蒬、蜎、裷、裫、駌、鳶、鴛、鼘、鼝",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Chuò",
"Answer": "辍、绰、戳、啜、龊、辵、娖、婥、婼、惙、擉、歠、涰、淖、磭、篧、綴、繛、缀、腏、荃、蔟、趠、踔、踱、輟、辶、逴、酫、鑡、齪、齱、吷、啜、嚽、婥、婼、惙、擉、歠、涰",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Qì",
"Answer": "气、器、弃、泣、契、砌、迄、汽、憩、葺、讫、沏、亟、呮、咠、唭、噐、埴、夡、忔、憇、栔、槭、欫、気、汔、洓、湆、滊、炁、焏、甈、甓、盵、矵、碛、磜、磧、碶、磩、礘、竐、綥、綮、緀、緝、罊、翜、聺、臮、艩、芞、藒、蟿、訖、趞、跂、踦、迉、郪、釮、錡、闙、霼、鯚、鶺、鼜、齌",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xùn",
"Answer": "迅、讯、训、逊、汛、殉、徇、巽、浚、逊、噀、嚑、坃、塤、壦、奞、愻、揗、攳、栒、楥、橁、殾、毥、汛、浚、潠、濬、灥、煇、燅、狥、珣、璕、畃、皨、瞓、矄、稄、筍、箰、篔、紃、絢、纁、臐、荨、蕈、薫、蘍、蟫、訊、訓、訙、訬、賐、迿、遜、鄩、鑂、鑫、雋、馴、駨、鱘、鱏",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuì",
"Answer": "坠、赘、缀、惴、缒、甀、畷、礈、笍、綴、縋、膇、諈、贅、轛、鑆、坠、隊、隧、膇、諈、贅、鑆、墜",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Cuàn",
"Answer": "窜、篡、爨、殩、熶、簒、竄、篡、镩、躥、攛、爨、殩、熶、簒、竄、篡、镩、躥、攛",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Juē",
"Answer": "撅、噘、屩、亅、孒、孓、屫、撅、撧、欮、決、氒、決、泬、潏、灍、玦、玨、璚、疦、瘚、絕、绝、芵、蕝、蕨、蚗、蟨、觖、觼、诀、譎、貜、赽、趹、蹶、蹷、逫、鈌、鐍、鐝、钁、駃、鴂、鴃、鷢、龣",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuè",
"Answer": "血、谑、穴、泬、狘、桖、烕、瞲、趐、轐、轌、鉥、瀥、粵、蘥、謔、谑、趐、轐、轌、鉥",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Zhuān",
"Answer": "专、砖、转、颛、啭、堟、塼、嫥、専、甎、磚、竱、籑、蒃、蟤、諯、転、轉、鄟、顓、鱄",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Qióng",
"Answer": "穷、琼、穹、邛、茕、筇、銎、儝、卭、嬛、憌、桏、橩、焭、焪、煢、熍、琁、璚、瓊、睘、瞏、穷、竆、笻、窮、藑、藭、蛩、蛬、赹、趜、跫、銎、顈、",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Yuè",
"Answer": "月、乐、越、跃、岳、悦、阅、粤、钥、栎、樾、戉、抈、岄、岳、恱、悅、戉、抈、枂、栎、樾、泧、瀹、爚、狘、玥、礿、禴、籆、籥、粤、臒、蘥、蚎、蚏、蛻、蠖、說、趯、跀、跃、軏、鈅、鉞、銳、銳、閱、閲、髺、鸑、鸙、黦",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Chuàng",
"Answer": "创、怆、刱、剏、剙、愴、摐、牎、牕、瘡、窓、窗、蔥、闖、戧、摐、牎、牕、瘡、窓、窗、蔥、闖、戧",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 4,
"Name": "Xuān",
"Answer": "宣、轩、喧、萱、暄、煊、儇、谖、塇、媗、愃、揎、昍、晅、暅、楦、泫、洵、炫、烜、煊、玹、琄、癣、矎、禤、箮、翾、縼、繏、翧、蝖、蠉、諠、諼、讂、谖、鉉、鏇、鞙、韗、饌、駨、駽、鰚、鶱",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
}
]
}

View File

@ -0,0 +1,460 @@
{
"question_bank": [
{
"QuestionId": 28,
"Name": "<p>《闻王昌龄左迁龙标遥有此寄》中,\"<span style=\"color: rgb(225, 60, 57);\"><strong>左迁</strong></span>\"的意思是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.贬官,降职 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.搬家 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.一路向西游玩</strong></p>",
"Answer": "A",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李白《行路难》中\"<span style=\"color: rgb(225, 60, 57);\"><strong>金樽清酒斗十千</strong></span>\"的\"斗十千\"意思是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.十千斗酒 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.一斗值十千钱 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.酒的名字</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>杜甫《春望》中\"<span style=\"color: rgb(225, 60, 57);\"><strong>烽火连三月</strong></span>\"的\"烽火\"指代( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.烟火 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.战争 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.篝火</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王维《使至塞上》\"<span style=\"color: rgb(225, 60, 57);\"><strong>大漠孤烟直</strong></span>\"中\"孤烟\"指的是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.炊烟 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.沙尘暴 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.烽火台的狼烟</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李商隐《无题》中\"<span style=\"color: rgb(225, 60, 57);\"><strong>青鸟殷勤为探看</strong></span>\"的\"青鸟\"象征( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.爱情鸟 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.神鸟 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.信使</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>白居易《琵琶行》\"<span style=\"color: rgb(225, 60, 57);\"><strong>千呼万唤始出来</strong></span>\"描绘的是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.等待很久 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.反复呼唤 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.琵琶女出场时的羞涩</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>苏轼《水调歌头》\"<span style=\"color: rgb(225, 60, 57);\"><strong>明月几时有</strong></span>\"表达了作者( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.询问月亮出现时间 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.单纯的写景 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.对人生的哲理思考</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>辛弃疾《青玉案·元夕》\"<span style=\"color: rgb(225, 60, 57);\"><strong>众里寻他千百度</strong></span>\"的\"度\"意思是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.度过 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.温度 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.次,回</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李清照《声声慢》\"<span style=\"color: rgb(225, 60, 57);\"><strong>乍暖还寒时候</strong></span>\"描写的是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.冷暖交替 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.心情变化 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.初春天气变化无常</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王勃《滕王阁序》\"<span style=\"color: rgb(225, 60, 57);\"><strong>落霞与孤鹜齐飞</strong></span>\"中\"鹜\"指的是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.大雁 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.天鹅 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.野鸭</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>范仲淹《岳阳楼记》\"<span style=\"color: rgb(225, 60, 57);\"><strong>先天下之忧而忧</strong></span>\"体现了作者的( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.个人忧愁 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.家庭烦恼 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.忧国忧民情怀</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>陶渊明《饮酒》\"<span style=\"color: rgb(225, 60, 57);\"><strong>采菊东篱下</strong></span>\"表达了作者( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.喜欢菊花 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.劳动场景 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.归隐田园的闲适</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>杜牧《泊秦淮》\"<span style=\"color: rgb(225, 60, 57);\"><strong>商女不知亡国恨</strong></span>\"的\"商女\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.商人女儿 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.商朝女子 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.歌女</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>陆游《示儿》\"<span style=\"color: rgb(225, 60, 57);\"><strong>王师北定中原日</strong></span>\"的\"王师\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.王者之师 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.王家的老师 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.宋朝军队</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>孟浩然《过故人庄》\"<span style=\"color: rgb(225, 60, 57);\"><strong>把酒话桑麻</strong></span>\"的\"桑麻\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.丝织品 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.植物名称 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.农事</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王之涣《凉州词》\"<span style=\"color: rgb(225, 60, 57);\"><strong>羌笛何须怨杨柳</strong></span>\"的\"杨柳\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.杨柳树 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.春风 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.《折杨柳》曲</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>刘禹锡《陋室铭》\"<span style=\"color: rgb(225, 60, 57);\"><strong>苔痕上阶绿</strong></span>\"描绘了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.台阶脏乱 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.苔藓生长 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.居住环境幽静</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李贺《雁门太守行》\"<span style=\"color: rgb(225, 60, 57);\"><strong>黑云压城城欲摧</strong></span>\"运用了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.描写天气 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.夸张手法 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.比喻敌军压境</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>柳宗元《江雪》\"<span style=\"color: rgb(225, 60, 57);\"><strong>孤舟蓑笠翁</strong></span>\"中\"蓑笠\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.帽子 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.装饰品 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.雨具</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>文天祥《过零丁洋》\"<span style=\"color: rgb(225, 60, 57);\"><strong>人生自古谁无死</strong></span>\"表达了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.人生苦短 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.悲观情绪 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.舍生取义的决心</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>马致远《天净沙·秋思》\"<span style=\"color: rgb(225, 60, 57);\"><strong>断肠人在天涯</strong></span>\"的\"断肠人\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.生病的人 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.肠子断掉的人 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.极度悲伤的游子</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>张继《枫桥夜泊》\"<span style=\"color: rgb(225, 60, 57);\"><strong>江枫渔火对愁眠</strong></span>\"的\"愁\"源于( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.生活困苦 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.天气不好 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.羁旅之思</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>晏殊《浣溪沙》\"<span style=\"color: rgb(225, 60, 57);\"><strong>无可奈何花落去</strong></span>\"蕴含( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.花谢的描写 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.无奈心情 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.时光流逝的感慨</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王昌龄《出塞》\"<span style=\"color: rgb(225, 60, 57);\"><strong>秦时明月汉时关</strong></span>\"运用了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.对比手法 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.夸张手法 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.互文手法</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>岑参《白雪歌送武判官归京》\"<span style=\"color: rgb(225, 60, 57);\"><strong>忽如一夜春风来</strong></span>\"描写的是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.春天到来 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.刮风 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.雪花如梨花盛开</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>韩愈《早春呈水部张十八员外》\"<span style=\"color: rgb(225, 60, 57);\"><strong>草色遥看近却无</strong></span>\"描写了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.视力不好 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.远近差异 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.初春草色的特点</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李煜《虞美人》\"<span style=\"color: rgb(225, 60, 57);\"><strong>问君能有几多愁</strong></span>\"的\"君\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.君王 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.君子 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.作者自己</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>高适《别董大》\"<span style=\"color: rgb(225, 60, 57);\"><strong>千里黄云白日曛</strong></span>\"的\"曛\"意思是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.温暖 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.日落 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.昏暗</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>杨万里《小池》\"<span style=\"color: rgb(225, 60, 57);\"><strong>小荷才露尖尖角</strong></span>\"运用了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.比喻手法 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.夸张手法 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.拟人手法</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王安石《泊船瓜洲》\"<span style=\"color: rgb(225, 60, 57);\"><strong>春风又绿江南岸</strong></span>\"的\"绿\"是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.形容词 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.名词 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.使动用法</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>杜牧《山行》\"<span style=\"color: rgb(225, 60, 57);\"><strong>停车坐爱枫林晚</strong></span>\"的\"坐\"意思是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.坐下 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.乘坐 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.因为</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>贾岛《题李凝幽居》\"<span style=\"color: rgb(225, 60, 57);\"><strong>鸟宿池边树</strong></span>\"的意境是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.热闹 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.凄凉 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.幽静</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>崔颢《黄鹤楼》\"<span style=\"color: rgb(225, 60, 57);\"><strong>昔人已乘黄鹤去</strong></span>\"的\"昔人\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.古人 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.敌人 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.仙人</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>张若虚《春江花月夜》\"<span style=\"color: rgb(225, 60, 57);\"><strong>江畔何人初见月</strong></span>\"表达了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.询问他人 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.写景 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.对宇宙人生的思考</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李白《将进酒》\"<span style=\"color: rgb(225, 60, 57);\"><strong>钟鼓馔玉不足贵</strong></span>\"的\"馔玉\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.美玉 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.乐器 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.珍美的饮食</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李绅《悯农》\"<span style=\"color: rgb(225, 60, 57);\"><strong>锄禾日当午</strong></span>\"的\"禾\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.稻谷 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.杂草 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.禾苗</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>韦应物《滁州西涧》\"<span style=\"color: rgb(225, 60, 57);\"><strong>野渡无人舟自横</strong></span>\"表现了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.荒凉 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.热闹 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.闲适宁静的意境</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>曹操《观沧海》\"<span style=\"color: rgb(225, 60, 57);\"><strong>水何澹澹</strong></span>\"的\"澹澹\"形容( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.水深 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.水流快 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.水波荡漾</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>屈原《离骚》\"<span style=\"color: rgb(225, 60, 57);\"><strong>路漫漫其修远兮</strong></span>\"表达了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.路途遥远 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.困难重重 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.追求理想的决心</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王翰《凉州词》\"<span style=\"color: rgb(225, 60, 57);\"><strong>葡萄美酒夜光杯</strong></span>\"描绘的是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.美酒介绍 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.酒杯说明 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.边塞宴饮场景</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>刘长卿《逢雪宿芙蓉山主人》\"<span style=\"color: rgb(225, 60, 57);\"><strong>风雪夜归人</strong></span>\"的\"归人\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.主人 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.风雪 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.诗人自己</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王湾《次北固山下》\"<span style=\"color: rgb(225, 60, 57);\"><strong>海日生残夜</strong></span>\"的\"生\"意思是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.产生 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.生命 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.升起</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>赵师秀《约客》\"<span style=\"color: rgb(225, 60, 57);\"><strong>闲敲棋子落灯花</strong></span>\"表现了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.悠闲自在 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.下棋 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.等待的焦躁</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>卢纶《塞下曲》\"<span style=\"color: rgb(225, 60, 57);\"><strong>月黑雁飞高</strong></span>\"渲染了( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.夜景 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.寂静 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.紧张的战斗气氛</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>李白《静夜思》\"<span style=\"color: rgb(225, 60, 57);\"><strong>床前明月光</strong></span>\"的\"床\"可能指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.睡床 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.井栏 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.桌椅</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>杜甫《绝句》\"<span style=\"color: rgb(225, 60, 57);\"><strong>两个黄鹂鸣翠柳</strong></span>\"描绘的季节是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.夏季 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.冬季 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.春季</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>杜荀鹤《小松》\"<span style=\"color: rgb(225, 60, 57);\"><strong>自小刺头深草里</strong></span>\"的\"刺头\"比喻( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.调皮的孩子 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.松针 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.不被人重视的才能</strong></p>",
"Answer": "C",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>贺知章《咏柳》\"<span style=\"color: rgb(225, 60, 57);\"><strong>碧玉妆成一树高</strong></span>\"把柳树比作( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.美女 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.碧玉 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.少女</strong></p>",
"Answer": "A",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>孟郊《游子吟》\"<span style=\"color: rgb(225, 60, 57);\"><strong>谁言寸草心</strong></span>\"中\"寸草心\"比喻( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.小草的嫩芽 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.儿女的心意 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.微小的心</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>王建《十五夜望月》\"<span style=\"color: rgb(225, 60, 57);\"><strong>中庭地白树栖鸦</strong></span>\"的\"地白\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.地面发白 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.月光照地 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.霜</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>罗隐《蜂》\"<span style=\"color: rgb(225, 60, 57);\"><strong>采得百花成蜜后</strong></span>\"的寓意是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.赞美蜜蜂勤劳 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.讽刺不劳而获 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.描写采蜜过程</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>郑板桥《竹石》\"<span style=\"color: rgb(225, 60, 57);\"><strong>咬定青山不放松</strong></span>\"赞美了竹子的( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.生长环境 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.坚韧不拔 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.外形美观</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>龚自珍《己亥杂诗》\"<span style=\"color: rgb(225, 60, 57);\"><strong>落红不是无情物</strong></span>\"的\"落红\"指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.红色落叶 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.落花 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.晚霞</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>于谦《石灰吟》\"<span style=\"color: rgb(225, 60, 57);\"><strong>粉骨碎身浑不怕</strong></span>\"表达了作者的( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.勇敢精神 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.忠诚坚贞 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.牺牲精神</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>叶绍翁《游园不值》\"<span style=\"color: rgb(225, 60, 57);\"><strong>春色满园关不住</strong></span>\"蕴含的哲理是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.春天美好 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.新生事物不可阻挡 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.园门紧闭</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>林升《题临安邸》\"<span style=\"color: rgb(225, 60, 57);\"><strong>暖风熏得游人醉</strong></span>\"暗指( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.天气温暖 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.纸醉金迷的生活 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.酒醉</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 1,
"ImageUrl": ""
},
{
"QuestionId": 28,
"Name": "<p>朱熹《春日》\"<span style=\"color: rgb(225, 60, 57);\"><strong>等闲识得东风面</strong></span>\"的\"等闲\"意思是( &nbsp; &nbsp;)。</p><p><br></p><p><strong> &nbsp; &nbsp;A.等待闲暇 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B.平常,轻易 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C.悠闲</strong></p>",
"Answer": "B",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
}
]
}

View File

@ -0,0 +1,27 @@
{
"name": "@reader-star/question-importer",
"version": "1.0.0",
"description": "",
"author": "",
"license": "ISC",
"keywords": [],
"main": "index.ts",
"scripts": {
"start": "ts-node src/index.ts",
"run-import": "ts-node src/index.ts --run-now",
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"axios": "^1.13.5",
"express": "^5.2.1",
"form-data": "^4.0.5",
"fs-extra": "^11.3.3"
},
"devDependencies": {
"@types/express": "^5.0.6",
"@types/fs-extra": "^11.0.4",
"@types/node": "^25.2.2",
"ts-node": "^10.9.2",
"typescript": "^5.9.3"
}
}

View File

@ -0,0 +1,44 @@
/* eslint-disable no-console */
import path from 'node:path'
import fs from 'fs-extra'
const FILE_PATH = path.join(__dirname, '../asset/词语听写.json')
async function cleanCiyuJson() {
try {
if (!fs.existsSync(FILE_PATH)) {
console.error(`File not found: ${FILE_PATH}`)
return
}
const data = await fs.readJSON(FILE_PATH)
if (data.question_bank && Array.isArray(data.question_bank)) {
let modifiedCount = 0
data.question_bank.forEach((q: any) => {
if (q.Name && typeof q.Name === 'string') {
// Remove HTML tags using regex
const cleanName = q.Name.replace(/<[^>]*>/g, '').trim()
if (cleanName !== q.Name) {
console.log(`Cleaning: ${q.Name} -> ${cleanName}`)
q.Name = cleanName
modifiedCount++
}
}
})
if (modifiedCount > 0) {
await fs.writeJSON(FILE_PATH, data, { spaces: 2 })
console.log(`Successfully cleaned ${modifiedCount} items in 词语听写.json`)
}
else {
console.log('No changes needed for 词语听写.json')
}
}
}
catch (error) {
console.error('Error processing file:', error)
}
}
cleanCiyuJson()

View File

@ -0,0 +1,141 @@
/* eslint-disable no-console */
import path from 'node:path'
import process from 'node:process'
import axios from 'axios'
import express from 'express'
import fs from 'fs-extra'
const app = express()
const PORT = 3001 // 避免与前端端口冲突(通常是 3000 或 9527
console.log('Script started')
console.log('Arguments:', process.argv)
// 配置
const API_BASE_URL = 'http://localhost:9527'
const IMPORT_API_PATH = '/proxy-default/Base/ActivityMain/AddQuestionListDetail'
const ASSET_DIR = path.join(__dirname, '../asset')
// 来自 curl 命令的请求头
const HEADERS = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Custom-Platform': 'pc',
'Origin': 'http://localhost:9527',
'Referer': 'http://localhost:9527/question-store',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36',
'apifoxToken': 'XL299LiMEDZ0H5h3A29PxwQXdMJqWyY2',
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
}
interface Question {
QuestionId: number
Name: string
Answer: string
Type: string
IsGood: number
ImageUrl: string
}
interface QuestionBank {
question_bank: Question[]
}
async function importQuestions() {
try {
// 检查资源目录是否存在
console.log(`Checking asset directory: ${ASSET_DIR}`)
if (!fs.existsSync(ASSET_DIR)) {
console.error(`Asset directory not found: ${ASSET_DIR}`)
return
}
// 获取资源目录下的所有 JSON 文件
const files = await fs.readdir(ASSET_DIR)
console.log(`Files found in directory:`, files)
const jsonFiles = files.filter(file => file.endsWith('.json'))
console.log(`Found ${jsonFiles.length} JSON files in ${ASSET_DIR}`)
for (const file of jsonFiles) {
const filePath = path.join(ASSET_DIR, file)
console.log(`\nStarting import for file: ${file}`)
const data: QuestionBank = await fs.readJSON(filePath)
const questions = data.question_bank
if (!questions || !Array.isArray(questions)) {
console.error(`Invalid JSON format in ${file}: question_bank array not found.`)
continue
}
console.log(`Found ${questions.length} questions in ${file}.`)
for (const [index, question] of questions.entries()) {
console.log(`[${file}] Importing question ${index + 1}/${questions.length}: ID ${question.QuestionId}`)
try {
// 构建请求体 (JSON)
const body = {
QuestionId: question.QuestionId,
Name: question.Name,
Answer: question.Answer,
Type: question.Type,
IsGood: question.IsGood,
ImageUrl: question.ImageUrl || '',
}
// 发送请求
const url = `${API_BASE_URL}${IMPORT_API_PATH}`
const response = await axios.post(url, body, {
headers: {
...HEADERS,
'Content-Type': 'application/json',
},
})
console.log(`Success: ${response.status} - ${JSON.stringify(response.data)}`)
}
catch (error: any) {
console.error(`Failed to import question ${question.QuestionId}:`, error.message)
if (error.response) {
console.error('Response data:', error.response.data)
}
}
// 添加短暂延迟以避免服务器过载
await new Promise(resolve => setTimeout(resolve, 200))
}
}
console.log('\nAll imports completed.')
}
catch (error) {
console.error('Error during import process:', error)
}
}
// 触发导入的路由
app.get('/run-import', async (req, res) => {
console.log('Received manual trigger for import...')
importQuestions() // 后台运行
res.send('Import process started. Check console for logs.')
})
// 如果传递了参数则直接运行导入,不启动 Web 服务
if (process.argv.includes('--run-now')) {
importQuestions().then(() => {
process.exit(0)
})
}
else {
app.listen(PORT, () => {
console.log(`Importer service running at http://localhost:${PORT}`)
console.log('Ensure questions.json is present in the root of this service.')
console.log(`To start import, visit http://localhost:${PORT}/run-import`)
})
}

View File

@ -0,0 +1,11 @@
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"strict": true,
"outDir": "./dist",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true
}
}

View File

@ -7,6 +7,9 @@
"cleanup": "pnpm -r exec rm -rf node_modules",
"dev:admin": "pnpm --filter @reader-star/admin dev",
"dev:user": "pnpm --filter @reader-star/user dev",
"dev:importer": "pnpm --filter @reader-star/question-importer start",
"dev:api": "pnpm --filter @reader-star/question-importer run-import",
"build": "pnpm -r build",
"lint": "eslint . --fix",
"prepare": "simple-git-hooks",
"typecheck": "pnpm -r typecheck"

566
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff