feat: 添加排行榜分数编辑和题目详情展示功能

- 在排行榜详情页中,添加队伍题目分数编辑功能,支持批量保存
- 新增打字机组件用于题目答案的动态展示
- 优化游戏页面的答题数量统计逻辑,使用 UserAnswerFont 解析
- 更新题目导入工具,支持更多 JSON 格式
- 调整游戏倒计时逻辑,优先使用题目详情中的时间
- 移除排行榜中的部分冗余列,优化界面显示
This commit is contained in:
2026-03-05 18:08:17 +08:00
parent ed3c815cd7
commit e8cd6732d7
29 changed files with 1879 additions and 1238 deletions

View File

@ -52,6 +52,7 @@
"pinyin-pro": "^3.28.0", "pinyin-pro": "^3.28.0",
"quill-toolbar-tip": "^0.1.0", "quill-toolbar-tip": "^0.1.0",
"tailwind-merge": "3.4.0", "tailwind-merge": "3.4.0",
"typeit": "^8.8.7",
"v-scale-screen": "^2.3.0", "v-scale-screen": "^2.3.0",
"vue": "3.5.26", "vue": "3.5.26",
"vue-draggable-plus": "0.6.0", "vue-draggable-plus": "0.6.0",

View File

@ -0,0 +1,45 @@
<script lang="ts" setup>
import type { Options } from 'typeit'
import type { El } from 'typeit/dist/types'
import TypeIt from 'typeit'
import { onMounted, shallowRef } from 'vue'
const textRef = shallowRef<El>()
function init() {
if (!textRef.value)
return
const options: Options = {
strings: 'SoybeanAdmin是一个清新优雅、高颜值且功能强大的后台管理模板',
lifeLike: true,
speed: 120,
loop: true,
}
const initTypeIt = new TypeIt(textRef.value, options)
initTypeIt.go()
}
onMounted(() => {
init()
})
</script>
<template>
<div>
<NCard title="打字机 插件" :bordered="false" class="h-full card-wrapper">
<NSpace :vertical="true">
<GithubLink link="https://github.com/alexmacarthur/typeit" />
<WebSiteLink label="文档地址:" link="https://www.typeitjs.com/docs/vanilla/usage/" />
</NSpace>
<NDivider title-placement="left">
基本示例
</NDivider>
<span ref="textRef" class="text-18px" />
</NCard>
</div>
</template>
<style scoped></style>

View File

@ -95,3 +95,11 @@ export function fetchGetCurrentQuestionByRoomID(RoomID: number) {
}, },
}) })
} }
/** 根据QuestionDetaiID查询题目详情 */
export function fetchGetQuestionDetailByID(QuestionDetailID: number) {
return request<App.Service.Response<Api.Competition.QuestionListDetailRound>>({
url: `/Base/ActivityMain/GetQuestionListDetailByID/?QuestionID=${QuestionDetailID}`,
method: 'get',
})
}

View File

@ -1,10 +1,25 @@
import { request } from '../request' import { request } from '../request'
/** get user list */ /** get user list */
export function fetchRankList(data?: Api.Rank.UserSearchParams) { export function fetchRankList(MainID: number, RoundType = 0) {
return request<Api.Rank.CommonRecord>({ return request<Api.Rank.CommonRecord>({
url: '/admin/v1/class/pagelist', url: `/Base/ActivityMain/GetTeamsTotal/list?MainID=${MainID}&RoundType=${RoundType}`,
method: 'post', method: 'get',
data: data || {}, })
}
/** 获取队伍排名详情 */
export function fetchRankDetail(MainID: number, RoundType = 0) {
return request<Api.Rank.CommonRecord>({
url: `/Base/ActivityMain/GetTeamsTotal?MainID=${MainID}&RoundType=${RoundType}`,
method: 'get',
})
}
/** 根据队伍 id获取具体的题目分数 */
export function fetchTeamQuestionScore(TeamID: number) {
return request<Api.Rank.CommonRecord>({
url: `/Base/ActivityMain/GetTeamQuestionUseByTeamID?TeamID=${TeamID}`,
method: 'get',
}) })
} }

View File

@ -10,19 +10,10 @@ export function updateCurrentQuestionUse(TeamGroupID: number) {
} }
/** 评委对其进行打分 */ /** 评委对其进行打分 */
export function updateScore(Id: number, ResultPotins: number) { export function updateScore(data: { Id: number, ResultPotins: number, QuestionDetailID: number, QuestionId: number }[]) {
return request<App.Service.Response>({ return request<App.Service.Response>({
url: `/Base/ActivityMain/UpdateTeamQuestionUseOne?Id=${Id}&ResultPotins=${ResultPotins}`, url: `/Base/ActivityMain/UpdateTeamQuestionResultList`,
method: 'post', method: 'post',
data: { Id, ResultPotins }, data,
})
}
/** 评委更新状态 (Correct/Wrong) */
export function updateScoreStatus(Id: number, Status: number) {
return request<App.Service.Response>({
url: `/Base/ActivityMain/UpdateTeamQuestionUseOneStatus?Id=${Id}&Status=${Status}`,
method: 'post',
data: { Id, Status },
}) })
} }

View File

@ -105,6 +105,7 @@ declare namespace Api {
IsGood: number IsGood: number
Image: string Image: string
ImageUrl: string ImageUrl: string
Answer: string
} }
/** get current question params */ /** get current question params */
@ -203,6 +204,7 @@ declare namespace Api {
Point: number Point: number
/** 题目详情 id */ /** 题目详情 id */
QuestionDetailID: number QuestionDetailID: number
QuestionDetaiID: number
/** 题目 id */ /** 题目 id */
QuestionID: number QuestionID: number
/** 题目规则 */ /** 题目规则 */
@ -219,6 +221,8 @@ declare namespace Api {
TeamList: any[] TeamList: any[]
/** 宽度 */ /** 宽度 */
Width: number Width: number
ActivityID: number
Answer: string
} }
/** update room request */ /** update room request */
@ -299,6 +303,10 @@ declare namespace Api {
Points: number Points: number
ResultPotins: number ResultPotins: number
Status: number Status: number
// 兼容字段(用于兜底)
AnswerValuePicture?: string
Guid?: string
QuestionDetaiID: number | null
} }
interface QuestionListRecord { interface QuestionListRecord {

View File

@ -28,6 +28,7 @@ declare module 'vue' {
'IconIc:baselineArrowRightAlt': typeof import('~icons/ic/baseline-arrow-right-alt')['default'] 'IconIc:baselineArrowRightAlt': typeof import('~icons/ic/baseline-arrow-right-alt')['default']
'IconIc:baselineDeleteForever': typeof import('~icons/ic/baseline-delete-forever')['default'] 'IconIc:baselineDeleteForever': typeof import('~icons/ic/baseline-delete-forever')['default']
'IconIc:roundPublish': typeof import('~icons/ic/round-publish')['default'] 'IconIc:roundPublish': typeof import('~icons/ic/round-publish')['default']
'IconIc:twotoneRule': typeof import('~icons/ic/twotone-rule')['default']
IconIcBaselineAdd: typeof import('~icons/ic/baseline-add')['default'] IconIcBaselineAdd: typeof import('~icons/ic/baseline-add')['default']
IconIcBaselineAddPlus: typeof import('~icons/ic/baseline-add-plus')['default'] IconIcBaselineAddPlus: typeof import('~icons/ic/baseline-add-plus')['default']
IconIcBaselineArrowBack: typeof import('~icons/ic/baseline-arrow-back')['default'] IconIcBaselineArrowBack: typeof import('~icons/ic/baseline-arrow-back')['default']
@ -48,6 +49,7 @@ declare module 'vue' {
IconIcBaselineSettingsBackupRestore: typeof import('~icons/ic/baseline-settings-backup-restore')['default'] IconIcBaselineSettingsBackupRestore: typeof import('~icons/ic/baseline-settings-backup-restore')['default']
IconIcBaselineUpload: typeof import('~icons/ic/baseline-upload')['default'] IconIcBaselineUpload: typeof import('~icons/ic/baseline-upload')['default']
IconIcBaselineUploadFile: typeof import('~icons/ic/baseline-upload-file')['default'] IconIcBaselineUploadFile: typeof import('~icons/ic/baseline-upload-file')['default']
IconIcCarbonUserAvatarFilledAlt: typeof import('~icons/ic/carbon-user-avatar-filled-alt')['default']
IconIcOutlineAccessTime: typeof import('~icons/ic/outline-access-time')['default'] IconIcOutlineAccessTime: typeof import('~icons/ic/outline-access-time')['default']
IconIcOutlineAddToPhotos: typeof import('~icons/ic/outline-add-to-photos')['default'] IconIcOutlineAddToPhotos: typeof import('~icons/ic/outline-add-to-photos')['default']
IconIcOutlineArchive: typeof import('~icons/ic/outline-archive')['default'] IconIcOutlineArchive: typeof import('~icons/ic/outline-archive')['default']
@ -174,6 +176,7 @@ declare module 'vue' {
TableHeaderOperation: typeof import('./../components/advanced/table-header-operation.vue')['default'] TableHeaderOperation: typeof import('./../components/advanced/table-header-operation.vue')['default']
ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.vue')['default'] ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.vue')['default']
TianZiGe: typeof import('./../components/custom/user/TianZiGe.vue')['default'] TianZiGe: typeof import('./../components/custom/user/TianZiGe.vue')['default']
Typeit: typeof import('./../components/custom/typeit/index.vue')['default']
UpFileDialog: typeof import('./../components/common/rest-basic-editor/components/up-file-dialog.vue')['default'] UpFileDialog: typeof import('./../components/common/rest-basic-editor/components/up-file-dialog.vue')['default']
WangEditor: typeof import('./../components/common/wang-editor.vue')['default'] WangEditor: typeof import('./../components/common/wang-editor.vue')['default']
WaveBg: typeof import('./../components/custom/wave-bg.vue')['default'] WaveBg: typeof import('./../components/custom/wave-bg.vue')['default']
@ -198,6 +201,7 @@ declare global {
const 'IconIc:baselineArrowRightAlt': typeof import('~icons/ic/baseline-arrow-right-alt')['default'] const 'IconIc:baselineArrowRightAlt': typeof import('~icons/ic/baseline-arrow-right-alt')['default']
const 'IconIc:baselineDeleteForever': typeof import('~icons/ic/baseline-delete-forever')['default'] const 'IconIc:baselineDeleteForever': typeof import('~icons/ic/baseline-delete-forever')['default']
const 'IconIc:roundPublish': typeof import('~icons/ic/round-publish')['default'] const 'IconIc:roundPublish': typeof import('~icons/ic/round-publish')['default']
const 'IconIc:twotoneRule': typeof import('~icons/ic/twotone-rule')['default']
const IconIcBaselineAdd: typeof import('~icons/ic/baseline-add')['default'] const IconIcBaselineAdd: typeof import('~icons/ic/baseline-add')['default']
const IconIcBaselineAddPlus: typeof import('~icons/ic/baseline-add-plus')['default'] const IconIcBaselineAddPlus: typeof import('~icons/ic/baseline-add-plus')['default']
const IconIcBaselineArrowBack: typeof import('~icons/ic/baseline-arrow-back')['default'] const IconIcBaselineArrowBack: typeof import('~icons/ic/baseline-arrow-back')['default']
@ -218,6 +222,7 @@ declare global {
const IconIcBaselineSettingsBackupRestore: typeof import('~icons/ic/baseline-settings-backup-restore')['default'] const IconIcBaselineSettingsBackupRestore: typeof import('~icons/ic/baseline-settings-backup-restore')['default']
const IconIcBaselineUpload: typeof import('~icons/ic/baseline-upload')['default'] const IconIcBaselineUpload: typeof import('~icons/ic/baseline-upload')['default']
const IconIcBaselineUploadFile: typeof import('~icons/ic/baseline-upload-file')['default'] const IconIcBaselineUploadFile: typeof import('~icons/ic/baseline-upload-file')['default']
const IconIcCarbonUserAvatarFilledAlt: typeof import('~icons/ic/carbon-user-avatar-filled-alt')['default']
const IconIcOutlineAccessTime: typeof import('~icons/ic/outline-access-time')['default'] const IconIcOutlineAccessTime: typeof import('~icons/ic/outline-access-time')['default']
const IconIcOutlineAddToPhotos: typeof import('~icons/ic/outline-add-to-photos')['default'] const IconIcOutlineAddToPhotos: typeof import('~icons/ic/outline-add-to-photos')['default']
const IconIcOutlineArchive: typeof import('~icons/ic/outline-archive')['default'] const IconIcOutlineArchive: typeof import('~icons/ic/outline-archive')['default']
@ -344,6 +349,7 @@ declare global {
const TableHeaderOperation: typeof import('./../components/advanced/table-header-operation.vue')['default'] const TableHeaderOperation: typeof import('./../components/advanced/table-header-operation.vue')['default']
const ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.vue')['default'] const ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.vue')['default']
const TianZiGe: typeof import('./../components/custom/user/TianZiGe.vue')['default'] const TianZiGe: typeof import('./../components/custom/user/TianZiGe.vue')['default']
const Typeit: typeof import('./../components/custom/typeit/index.vue')['default']
const UpFileDialog: typeof import('./../components/common/rest-basic-editor/components/up-file-dialog.vue')['default'] const UpFileDialog: typeof import('./../components/common/rest-basic-editor/components/up-file-dialog.vue')['default']
const WangEditor: typeof import('./../components/common/wang-editor.vue')['default'] const WangEditor: typeof import('./../components/common/wang-editor.vue')['default']
const WaveBg: typeof import('./../components/custom/wave-bg.vue')['default'] const WaveBg: typeof import('./../components/custom/wave-bg.vue')['default']

View File

@ -61,7 +61,7 @@ watch(() => props.visible, (val) => {
const columns: DataTableColumns<any> = [ const columns: DataTableColumns<any> = [
{ title: 'ID', key: 'ID', width: 80 }, { title: 'ID', key: 'ID', width: 80 },
{ title: '键 (Key)', key: 'UI_Key' }, { title: '键 (Key)', key: 'UI_Key' },
{ title: '值 (Value)', key: 'UI_Value' }, { title: '值 (Value)', key: 'UI_Value', width: 100 },
{ title: '备注', key: 'BakValue' }, { title: '备注', key: 'BakValue' },
{ {
title: '操作', title: '操作',

View File

@ -1,14 +1,22 @@
<script setup lang="tsx"> <script setup lang="tsx">
import { NCard, NDivider } from 'naive-ui' import { NCard, NDivider, useMessage } from 'naive-ui'
import { ref } from 'vue' import { onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import { fetchRankDetail, fetchTeamQuestionScore } from '@/service/api/rank'
import { updateScore as updateScoreApi } from '@/service/api/result'
import RankHeader from './modules/rank-header.vue' import RankHeader from './modules/rank-header.vue'
import TeamItem from './modules/team-item.vue' import TeamItem from './modules/team-item.vue'
import TeamListHeader from './modules/team-list-header.vue' import TeamListHeader from './modules/team-list-header.vue'
const competitionInfo = { const route = useRoute()
const message = useMessage()
const activityId = route.query.activityId as string
const competitionInfo = ref({
name: '阅读之星-辞海遨游环节 (2026)', name: '阅读之星-辞海遨游环节 (2026)',
date: '2026.01.12', date: '2026.01.12',
} })
interface TeamData { interface TeamData {
id: number id: number
@ -19,88 +27,138 @@ interface TeamData {
totalScore: number totalScore: number
updateTime: string updateTime: string
isExpanded: boolean isExpanded: boolean
scores: Record<string, number> scores: Record<string, { score: number, questionId: number, teamQuestionUseId: number, questionDetailId: number }>
} }
const teamList = ref<TeamData[]>([ const teamList = ref<TeamData[]>([])
{
id: 1,
rank: 1,
name: '清华学霸团',
group: '第一组',
correctCount: '15 / 15',
totalScore: 150,
updateTime: '2026-01-22 16:28:55',
isExpanded: true,
scores: {
q1: 10,
q2: 10,
q3: 10,
q4: 10,
q5: 10,
q6: 10,
q7: 10,
q8: 5,
q9: 10,
q10: 10,
q11: 15,
q12: 10,
q13: 15,
q14: 10,
q15: 5,
},
},
{
id: 2,
rank: 2,
name: '无敌先锋队',
group: '第一组',
correctCount: '13 / 15',
totalScore: 145,
updateTime: '2026-01-22 16:30:12',
isExpanded: false,
scores: {},
},
{
id: 3,
rank: 3,
name: '明日之星社',
group: '第二组',
correctCount: '13 / 15',
totalScore: 130,
updateTime: '2026-01-22 16:25:22',
isExpanded: false,
scores: {},
},
{
id: 4,
rank: 4,
name: '火箭竞技团',
group: '第一组',
correctCount: '13 / 15',
totalScore: 125,
updateTime: '2026-01-22 16:22:10',
isExpanded: false,
scores: {},
},
])
function toggleExpand(team: TeamData) { /** 获取排行榜详情 */
// Collapse others if needed, or allow multiple. Screenshot shows one. async function getRankDetail() {
// Let's toggle. if (!activityId)
team.isExpanded = !team.isExpanded return
try {
// If expanding, maybe populate scores if empty (mock logic) const { data, error } = await fetchRankDetail(Number(activityId))
if (team.isExpanded && Object.keys(team.scores).length === 0) { if (error) {
for (let i = 1; i <= 15; i++) { message.error(error.message)
team.scores[`q${i}`] = 10 return
} }
// 假设后端返回的数据结构需要映射
teamList.value = (data?.data || []).map((item: any, index: number) => ({
id: item.TeamID,
rank: index + 1,
name: item.Name,
group: '默认组', // 接口没有组名,暂时用默认
correctCount: '0 / 0',
totalScore: item.Point || 0,
updateTime: new Date().toLocaleString(), // 暂时用当前时间
isExpanded: false,
scores: {},
}))
}
catch (err: any) {
message.error(err.message || '获取排行榜详情失败')
} }
} }
function saveScores(team: TeamData) { /** 获取队伍具体的题目分数 */
window.$message?.success(`已保存 ${team.name} 的分数变动`) async function getTeamQuestionScore(team: TeamData) {
team.isExpanded = false try {
const { data, error } = await fetchTeamQuestionScore(team.id)
if (error) {
message.error(error.message)
return
}
// 映射接口数据到 scores
// 接口返回的是一个数组,每个元素对应一个题目
// 我们使用 QuestionId 或者 index 作为 key
const scores: Record<string, { score: number, questionId: number, teamQuestionUseId: number, questionDetailId: number }> = {}
let totalScore = 0
let correctCount = 0
let questionCount = 0
const list = data?.data || []
list.forEach((item: any, index: number) => {
// 使用 q + (index + 1) 作为 key例如 q1, q2...
const key = `q${index + 1}`
// ResultPotins 是最终得分
const score = item.ResultPotins || 0
scores[key] = {
score,
questionId: item.QuestionId || 0,
teamQuestionUseId: item.Id || 0, // 使用接口返回的 Id 作为 TeamQuestionUseID
questionDetailId: item.QuestionDetaiID || 0, // 注意后端字段拼写 QuestionDetaiID
}
totalScore += score
// 统计正确数:如果分数 > 0 视为正确,或者根据 Status 判断
// 这里暂时以分数 > 0 为准,或者 ResultPotins === Points (满分)
// 根据示例数据Points是题目分值ResultPotins是得分。
// 只要得分 > 0 就算对?或者得分 == Points
// 简单起见,得分 > 0 算对
if (score > 0) {
correctCount++
}
questionCount++
})
team.scores = scores
team.totalScore = totalScore
team.correctCount = `${correctCount} / ${questionCount}`
}
catch (err: any) {
message.error(err.message || '获取队伍题目分数失败')
}
}
onMounted(() => {
getRankDetail()
})
async function toggleExpand(team: TeamData) {
team.isExpanded = !team.isExpanded
if (team.isExpanded && Object.keys(team.scores).length === 0) {
await getTeamQuestionScore(team)
}
}
async function saveScores(team: TeamData) {
// window.$message?.success(`已保存 ${team.name} 的分数变动`)
// console.log(team.scores, 'team.scores');
// 构建提交数据
// 我们只提交有 teamQuestionUseId 的分数
// 假设所有分数都需要提交,或者可以只提交变化的分数(如果能追踪变化)
// 这里简单起见,提交该队伍所有题目的当前分数
const scoreList = Object.values(team.scores)
.filter(item => item.teamQuestionUseId)
.map(item => ({
Id: item.teamQuestionUseId,
ResultPotins: item.score,
QuestionDetailID: item.questionDetailId,
QuestionId: item.questionId,
}))
if (scoreList.length === 0) {
message.warning('没有可保存的分数')
return
}
try {
const { error } = await updateScoreApi(scoreList)
if (error) {
message.error(error.message || '保存分数失败')
return
}
message.success(`已保存 ${team.name} 的分数变动`)
team.isExpanded = false
}
catch (e: any) {
message.error(e.message || '保存分数失败')
}
} }
function handlePublish() { function handlePublish() {
@ -109,7 +167,32 @@ function handlePublish() {
function updateScore(team: TeamData, key: string, value: number | null) { function updateScore(team: TeamData, key: string, value: number | null) {
if (value !== null) { if (value !== null) {
team.scores[key] = value if (team.scores[key]) {
team.scores[key].score = value
}
else {
// 这是一个新key的情况应该不太可能发生但为了类型安全
// 这里我们无法得知 questionId所以暂时设为 0 或者需要修改逻辑传递 questionId
// 实际上 updateScore 是由 UI 触发的UI 遍历的是现有的 keys
team.scores[key] = { score: value, questionId: 0, teamQuestionUseId: 0, questionDetailId: 0 }
}
// 重新计算总分和正确题数
let totalScore = 0
let correctCount = 0
const keys = Object.keys(team.scores)
const questionCount = keys.length
keys.forEach((k) => {
const s = team.scores[k].score
totalScore += s
if (s > 0) {
correctCount++
}
})
team.totalScore = totalScore
team.correctCount = `${correctCount} / ${questionCount}`
} }
} }
</script> </script>
@ -118,11 +201,7 @@ function updateScore(team: TeamData, key: string, value: number | null) {
<div class="flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto"> <div class="flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
<NCard :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden"> <NCard :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
<!-- Header --> <!-- Header -->
<RankHeader <RankHeader :title="competitionInfo.name" :date="competitionInfo.date" @publish="handlePublish" />
:title="competitionInfo.name"
:date="competitionInfo.date"
@publish="handlePublish"
/>
<NDivider /> <NDivider />
@ -133,12 +212,8 @@ function updateScore(team: TeamData, key: string, value: number | null) {
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<!-- Data Rows --> <!-- Data Rows -->
<TeamItem <TeamItem
v-for="team in teamList" v-for="team in teamList" :key="team.id" :team="team" @toggle-expand="toggleExpand"
:key="team.id" @save-scores="saveScores" @update-score="updateScore"
:team="team"
@toggle-expand="toggleExpand"
@save-scores="saveScores"
@update-score="updateScore"
/> />
</div> </div>
</NCard> </NCard>

View File

@ -11,7 +11,7 @@ interface TeamData {
totalScore: number totalScore: number
updateTime: string updateTime: string
isExpanded: boolean isExpanded: boolean
scores: Record<string, number> scores: Record<string, { score: number, questionId: number, teamQuestionUseId: number, questionDetailId: number }>
} }
const props = defineProps<{ const props = defineProps<{
@ -59,14 +59,14 @@ const rankStyle = computed(() => {
</div> </div>
<!-- Group --> <!-- Group -->
<div class="text-gray-500"> <!-- <div class="text-gray-500">
{{ team.group }} {{ team.group }}
</div> </div> -->
<!-- Correct Count --> <!-- Correct Count -->
<div class="font-bold font-mono"> <!-- <div class="font-bold font-mono">
{{ team.correctCount }} {{ team.correctCount }}
</div> </div> -->
<!-- Score --> <!-- Score -->
<div class="text-16px text-primary font-bold"> <div class="text-16px text-primary font-bold">
@ -96,16 +96,16 @@ const rankStyle = computed(() => {
</div> </div>
<NGrid :x-gap="16" :y-gap="16" :cols="5"> <NGrid :x-gap="16" :y-gap="16" :cols="5">
<NGridItem v-for="i in 15" :key="i"> <NGridItem v-for="(item, key, index) in team.scores" :key="key">
<div class="border rounded bg-white p-3"> <div class="border rounded bg-white p-3">
<div class="mb-2 flex justify-between text-12px text-gray-400"> <div class="mb-2 flex justify-between text-12px text-gray-400">
<span>Q{{ i }} SCORE</span> <span>{{ item.questionId }}-Q{{ index + 1 }} SCORE</span>
<span>/ 10</span> <span />
</div> </div>
<NInputNumber <NInputNumber
:value="team.scores[`q${i}`]" :min="0" :max="10" button-placement="both" :value="item.score" :min="0" :max="10" button-placement="both"
class="text-center text-primary font-bold" class="text-center text-primary font-bold"
@update:value="(val) => emit('updateScore', team, `q${i}`, val)" @update:value="(val) => emit('updateScore', team, String(key), val)"
/> />
</div> </div>
</NGridItem> </NGridItem>

View File

@ -1,5 +1,4 @@
<script setup lang="ts"> <script setup lang="ts">
import { NTooltip } from 'naive-ui'
</script> </script>
<template> <template>
@ -19,7 +18,7 @@ import { NTooltip } from 'naive-ui'
> >
<div>排名</div> <div>排名</div>
<div>队伍名称</div> <div>队伍名称</div>
<div>所属小组</div> <!-- <div>所属小组</div>
<div class="flex items-center"> <div class="flex items-center">
正确题数 正确题数
<NTooltip placement="top" trigger="hover"> <NTooltip placement="top" trigger="hover">
@ -30,7 +29,7 @@ import { NTooltip } from 'naive-ui'
</template> </template>
做题数量因加时赛可能有所不同 做题数量因加时赛可能有所不同
</NTooltip> </NTooltip>
</div> </div> -->
<div>总积分 (Total)</div> <div>总积分 (Total)</div>
<div>更新时间</div> <div>更新时间</div>
<div class="text-right"> <div class="text-right">

View File

@ -7,12 +7,15 @@ import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { QuestionCategoryEnum } from '@/enum/business' import { QuestionCategoryEnum } from '@/enum/business'
import { fetchGetQuestionList } from '@/service/api/competition' import { fetchGetQuestionList } from '@/service/api/competition'
import { fetchGetCurrentQuestionByRoomID, fetchGetGameStatistics, fetchGetGroupListByActivityID } from '@/service/api/game' import { fetchGetCurrentQuestionByRoomID, fetchGetGameStatistics, fetchGetGroupListByActivityID, fetchGetQuestionDetailByID } from '@/service/api/game'
import { updateCurrentQuestionUse, updateScore } from '@/service/api/result' import { updateCurrentQuestionUse, updateScore } from '@/service/api/result'
import GroupTabs, { type GroupItem } from './modules/GroupTabs.vue' import GroupTabs, { type GroupItem } from './modules/GroupTabs.vue'
import Typewriter from './modules/Typewriter.vue'
// 本地持久化存储手动修改的状态 (key: roomId-questionId-guid) // 本地存储手动修改的状态 (key: roomId-questionId-teamId-guid, value: status)
const manualStatusStorage = useStorage<Record<string, number>>('read-star-manual-status', {}) const manualStatusStorage = useStorage<Record<string, number>>('read-star-manual-status', {})
// 本地存储手动修改的分数 (key: roomId-questionId-teamId-guid, value: score)
const manualScoreStorage = useStorage<Record<string, number>>('read-star-manual-score', {})
const route = useRoute() const route = useRoute()
const message = useMessage() const message = useMessage()
@ -20,20 +23,39 @@ const activityId = computed(() => route.query?.activityId as string)
const roomId = computed(() => route.query?.roomId as string) const roomId = computed(() => route.query?.roomId as string)
const currentGroupId = ref<number | string>('') // 当前选中的组别 ID const currentGroupId = ref<number | string>('') // 当前选中的组别 ID
const currentQuestionId = ref<number | string>('') // 当前选中的题目 ID const currentQuestionId = ref<number | string>('') // 当前选中的题目大纲 ID
const currentQuestionType = ref<string>('') // 当前选中的题目类型 const currentQuestionType = ref<string>('') // 当前选中的题目类型
const groups = ref<GroupItem[]>([]) const groups = ref<GroupItem[]>([])
const questionList = ref<(GroupItem & { type: string })[]>([]) const questionList = ref<(GroupItem & { type: string })[]>([])
const currentQuestion = ref<Api.Competition.GetCurrentQuestionInfo>() // 当前正在参赛的题目 const currentQuestion = ref<Api.Competition.GetCurrentQuestionInfo>() // 当前正在参赛的题目
const questionInfo = ref<Api.Competition.QuestionListDetailRound>() // 题目详情
const currentQuestionDetailID = ref<number | string>('') // 当前选中的题目详情 ID
// 判断当前activityId是正在比赛的活动
const isActiveActivityId = computed(() => {
if (!currentQuestion.value)
return false
const qActivityId = (currentQuestion.value as any).MainID || (currentQuestion.value as any).ActivityID
return Number(activityId.value) === Number(qActivityId)
})
// 计算当前题目类型对应的布局 // 计算当前题目类型对应的布局
const currentLayout = computed(() => { const currentLayout = computed(() => {
// 只有 汉字加一加 (CharacterRadicalAddition) 需要人工评分 (列表布局 - 分屏视图) // 只有 汉字加一加 (CharacterRadicalAddition) 需要人工评分 (列表布局 - 分屏视图)
// 其他所有题型 (汉字听写、诗词、词语听写、成语) 都使用长框展示 (网格布局 - 带切换的大图) // 其他所有题型 (汉字听写、诗词、词语听写、成语) 都使用长框展示 (网格布局 - 带切换的大图)
if (currentQuestionType.value === QuestionCategoryEnum.CharacterRadicalAddition) { // 修正需求scoringTypes 包含 CharacterRadicalAddition, IdiomWriting1, ChineseCharacterDictation2
// 这些题型使用 'list' 布局,其他使用 'grid'
// 补充:当 scoringTypes 为 grid 时候,只有对错和正确,提交给接口分数规则是:如果评委觉得是正确的,就取 currentQuestion 里面的 Point 字段,反之错的就是 0
const scoringTypes = [
QuestionCategoryEnum.CharacterRadicalAddition,
QuestionCategoryEnum.IdiomWriting1,
QuestionCategoryEnum.ChineseCharacterDictation2,
]
if (scoringTypes.includes(currentQuestionType.value as any)) {
return 'list' return 'list'
} }
// 其他题型 (汉字听写、诗词、词语听写、成语看图等) 使用 'grid' 布局 (网格布局 - 带切换的大图)
return 'grid' return 'grid'
}) })
@ -60,11 +82,37 @@ async function setStatus(team: TeamResult, item: any, status: number) {
} }
} }
/** 根据 QuestionDetailID 查询题目详情 */
async function fetchQuestionDetail(QuestionDetailID: number) {
try {
const { data } = await fetchGetQuestionDetailByID(QuestionDetailID)
if (data?.data) {
questionInfo.value = data.data
console.log(questionInfo.value, 'questionInfo')
}
}
catch (error: any) {
message.error(error.message || '查询题目详情失败')
}
}
async function handleManualScoreUpdate(item: any, newScore: number) { async function handleManualScoreUpdate(item: any, newScore: number) {
item.Score = newScore item.Score = newScore
item._isManual = true item._isManual = true
// 保存分数到本地存储
if (roomId.value && currentQuestionId.value && item.Guid && item.TeamId) {
const key = `${roomId.value}-${currentQuestionId.value}-${item.TeamId}-${item.Guid}`
manualScoreStorage.value[key] = newScore
}
try { try {
await updateScore(item.TeamQuestionUseID, newScore) await updateScore([{
Id: item.TeamQuestionUseID,
ResultPotins: newScore,
QuestionDetailID: item.QuestionDetailID || 0,
QuestionId: item.QuestionId || 0,
}])
message.success('分数已更新') message.success('分数已更新')
} }
catch (e: any) { catch (e: any) {
@ -86,22 +134,46 @@ function handleNext() {
/** /**
* 根据房间当前题目,自动同步选中题目和当前正在比赛的组 * 根据房间当前题目,自动同步选中题目和当前正在比赛的组
* 逻辑:
* - 如果后端返回了当前题目的 QuestionID并且题目列表已加载则将 currentQuestionId 设为该题
* - 同时同步 currentQuestionType便于切换布局
* - 若找不到匹配项,则维持现状(由首次加载保持为第一题)
*/ */
function syncCurrentQuestionSelection() { function syncCurrentQuestionSelection() {
const qid = currentQuestion.value?.QuestionID // 1. 如果不是当前正在进行的活动,默认选中第一组第一题
const gid = currentQuestion.value?.TeamGroupID if (!isActiveActivityId.value) {
if (!qid || questionList.value.length === 0) console.log('当前活动不是正在进行的活动,默认选中第一组第一题')
if (groups.value.length > 0) {
currentGroupId.value = groups.value[0].id
}
if (questionList.value.length > 0) {
currentQuestionId.value = questionList.value[0].id
currentQuestionType.value = questionList.value[0].type
}
return return
const hit = questionList.value.find(q => Number(q.id) === Number(qid)) }
if (gid)
// 2. 如果是当前正在进行的活动,同步选中当前正在进行的题目和组
const currentQ = currentQuestion.value
const qid = currentQ?.QuestionID
const gid = currentQ?.TeamGroupID
// 尝试匹配题目
if (qid) {
const hit = questionList.value.find(q => Number(q.id) === Number(qid))
if (hit) {
currentQuestionId.value = hit.id
currentQuestionType.value = (hit as any).type || ''
}
}
// 尝试匹配组
if (gid) {
currentGroupId.value = gid currentGroupId.value = gid
if (hit) { }
currentQuestionId.value = hit.id
currentQuestionType.value = (hit as any).type || '' // 兜底:如果同步失败(例如当前题目不在列表中),默认选中第一个
if (!currentQuestionId.value && questionList.value.length > 0) {
currentQuestionId.value = questionList.value[0].id
currentQuestionType.value = questionList.value[0].type
}
if (!currentGroupId.value && groups.value.length > 0) {
currentGroupId.value = groups.value[0].id
} }
} }
@ -194,7 +266,7 @@ async function fetchCurrentQuestion() {
* 获取答题卡数据 * 获取答题卡数据
*/ */
async function fetchAnswerData() { async function fetchAnswerData() {
if (!currentGroupId.value || !currentQuestionId.value || !currentQuestion.value?.QuestionDetailID) if (!currentGroupId.value || !currentQuestionId.value)
return return
try { try {
const params = { const params = {
@ -212,6 +284,20 @@ async function fetchAnswerData() {
const result = data?.data || [] const result = data?.data || []
console.log('接口返回的游戏统计数据:', result) console.log('接口返回的游戏统计数据:', result)
// 获取题目详情 ID
let detailId = 0
// 1. 尝试从答题卡数据中获取当前比赛的题目详情 ID (优先)
if (result.length > 0) {
const item = result[0]
if (item) {
detailId = item?.QuestionDetaiID || 0
}
}
// 如果获取到了新的 detailId更新 currentQuestionDetailID (会触发 watch 调用 fetchQuestionDetail)
if (detailId && detailId !== Number(currentQuestionDetailID.value)) {
currentQuestionDetailID.value = detailId
}
result.forEach((item) => { result.forEach((item) => {
const UserAnswerFont = JSON.parse(item.UserAnswerFont) const UserAnswerFont = JSON.parse(item.UserAnswerFont)
console.log('解析后的 UserAnswerFont:', UserAnswerFont) console.log('解析后的 UserAnswerFont:', UserAnswerFont)
@ -225,7 +311,8 @@ async function fetchAnswerData() {
if (t.Answers) { if (t.Answers) {
t.Answers.forEach((a: any) => { t.Answers.forEach((a: any) => {
if (a.Guid) { if (a.Guid) {
oldMap.set(a.Guid, a) // 使用 TeamId + Guid 作为 key确保唯一性
oldMap.set(`${t.TeamId}-${a.Guid}`, a)
} }
}) })
} }
@ -238,52 +325,119 @@ async function fetchAnswerData() {
if (answerData.UserAnswerFont) { if (answerData.UserAnswerFont) {
const parsedFonts = JSON.parse(answerData.UserAnswerFont) const parsedFonts = JSON.parse(answerData.UserAnswerFont)
parsedAnswers = Array.isArray(parsedFonts) ? parsedFonts : [] parsedAnswers = Array.isArray(parsedFonts) ? parsedFonts : []
console.warn('parsed fonts', parsedFonts) // console.warn('parsed fonts', parsedFonts)
} }
} }
catch (e) { catch (e) {
console.error('解析 UserAnswerFont 失败', e) console.error('解析 UserAnswerFont 失败', e)
} }
// 如果 UserAnswerFont 为空,尝试使用根对象的数据构建答案(适用于选择题等没有切图的题型)
if (parsedAnswers.length === 0 && (answerData.UserAnswerPicture || answerData.AnswerValuePicture)) {
parsedAnswers = [{
Guid: answerData.Guid || `${answerData.QuestionId}-${answerData.TeamId}`,
TeamQuestionUseID: answerData.Id, // 确保有 TeamQuestionUseID 用于后续更新分数
AnswerText: '查看原图', // 默认提示文案
AnswerValuePicture: answerData.AnswerValuePicture || answerData.UserAnswerPicture,
Status: answerData.Status,
Score: answerData.Points, // 使用根节点的 Points
}]
}
// 将新答案与旧的手动编辑合并 // 将新答案与旧的手动编辑合并
const mergedAnswers = parsedAnswers.map((ans: any) => { const mergedAnswers = parsedAnswers.map((ans: any) => {
const oldAns = oldMap.get(ans.Guid) // 使用 TeamId + Guid 获取旧状态,确保不同队伍之间不冲突
const oldAns = oldMap.get(`${answerData.TeamId}-${ans.Guid}`)
// 检查本地存储是否有手动修改记录 // 检查本地存储是否有手动修改记录
const storageKey = `${roomId.value}-${currentQuestionId.value}-${answerData.TeamId}-${ans.Guid}` const storageKey = `${roomId.value}-${currentQuestionId.value}-${answerData.TeamId}-${ans.Guid}`
const storedStatus = manualStatusStorage.value[storageKey] const storedStatus = manualStatusStorage.value[storageKey]
const storedScore = manualScoreStorage.value[storageKey]
const hasStoredStatus = storedStatus !== undefined const hasStoredStatus = storedStatus !== undefined
const hasStoredScore = storedScore !== undefined
// 记录 AI 的原始推荐值(如果后端返回了) // 记录 AI 的原始推荐值(如果后端返回了)
const aiStatus = ans.Status const aiStatus = ans.Status
const aiScore = ans.Score // _aiScore 专门用于存储 AI 的推荐分数(优先取外层 Points如果没有则尝试内层
const aiScore = answerData.Points ?? ans.Score ?? ans.Point
if ((oldAns && oldAns._isManual) || hasStoredStatus) { // 强制更新图片 URL防止缓存
// 优先使用 ans 中的图片,如果没有则回退到 answerData 中的图片
const imageUrl = ans.AnswerValuePicture || (parsedAnswers.length === 1 && parsedAnswers[0] === ans ? answerData.UserAnswerPicture : '')
let finalImageUrl = imageUrl
let cleanBaseUrl = ''
let timestamp = new Date().getTime()
if (imageUrl) {
// 清理 URL 中的反引号、引号和空格
cleanBaseUrl = imageUrl.replace(/[`'"]/g, '').trim()
// 尝试复用旧的时间戳以防止闪烁
// 只有当 URL 发生变化,或者 AI 状态/分数发生变化时才更新时间戳
// 注意:如果 ans.AnswerValuePicture 发生了变化即使只是参数变化cleanBaseUrl 会变
if (oldAns && oldAns._baseImgUrl === cleanBaseUrl && oldAns._aiStatus === aiStatus && oldAns._aiScore === aiScore && oldAns._t) {
timestamp = oldAns._t
}
// 强制刷新:每次都添加新的时间戳
const separator = cleanBaseUrl.includes('?') ? '&' : '?'
finalImageUrl = `${cleanBaseUrl}${separator}_t=${timestamp}`
}
// 判断是否手动干预:
// 1. 本地存储有状态 (hasStoredStatus) 或有分数 (hasStoredScore)
// 2. 内存中有手动标记 (oldAns._isManual)
const isManual = hasStoredStatus || hasStoredScore || (oldAns && oldAns._isManual)
if (isManual) {
// 优先使用本地存储的状态,其次是内存中的手动编辑状态 // 优先使用本地存储的状态,其次是内存中的手动编辑状态
const finalStatus = hasStoredStatus ? storedStatus : (oldAns ? oldAns.Status : ans.Status) const finalStatus = hasStoredStatus ? storedStatus : (oldAns ? oldAns.Status : ans.Status)
const finalScore = oldAns ? oldAns.Score : ans.Score // 分数目前只在内存保留,也可以加 localStorage
return { // 分数逻辑:
// 1. 优先使用本地存储的分数 (hasStoredScore)
// 2. 其次使用内存中的手动分数 (oldAns.Score)
// 3. 如果都没有 (可能是只改了状态没改分数),则默认 null
let finalScore: number | null = null
if (hasStoredScore) {
finalScore = storedScore
}
else if (oldAns && oldAns.Score !== undefined && oldAns.Score !== null) {
finalScore = oldAns.Score
}
// 修正:在返回的对象中注入 TeamId以便 handleManualScoreUpdate 使用
const resultItem = {
...ans, ...ans,
TeamId: answerData.TeamId, // [新增] 注入 TeamId
QuestionId: answerData.QuestionId, // [新增]
QuestionDetailID: answerData.QuestionDetaiID, // [新增] 注意后端字段拼写
AnswerText: ans.AnswerText,
AnswerValuePicture: finalImageUrl,
_baseImgUrl: cleanBaseUrl,
_t: timestamp, // 保存时间戳
Score: finalScore, Score: finalScore,
Status: finalStatus, Status: finalStatus,
_isManual: true, _isManual: true,
_aiStatus: aiStatus, // 保存 AI 的最新状态供参考 _aiStatus: aiStatus,
_aiScore: aiScore, _aiScore: aiScore,
} }
return resultItem
} }
// 如果没有手动编辑,不要自动应用 AI 的状态,保持“未评”状态
// 用 _isManual = false 来表示 "未人工介入",此时 Status 仍然跟随 AI (ans.Status)
// 但 UI 上会显示 "AI 推荐: Correct/Wrong",而不是 "已人工校准"。
// 只有当用户点击后_isManual = true才显示 "已人工校准"。
// 并且 Status = ans.Status (AI 的值)。
// 如果没有手动编辑
return { return {
...ans, ...ans,
Status: ans.Status, // 默认跟随 AI但 UI 会标记为 "AI 推荐" TeamId: answerData.TeamId, // [新增] 注入 TeamId
QuestionId: answerData.QuestionId, // [新增]
QuestionDetailID: answerData.QuestionDetaiID, // [新增] 注意后端字段拼写
AnswerText: ans.AnswerText,
AnswerValuePicture: finalImageUrl,
_baseImgUrl: cleanBaseUrl,
_t: timestamp, // 保存时间戳
Status: ans.Status,
_aiStatus: aiStatus, _aiStatus: aiStatus,
_aiScore: aiScore, _aiScore: aiScore,
_isManual: false, // 明确标记为非手动 Score: null, // 默认 null
_isManual: false,
} }
}) })
@ -311,6 +465,13 @@ async function fetchAnswerData() {
*/ */
async function handleNexCurrentQuestion() { async function handleNexCurrentQuestion() {
await fetchCurrentQuestion() await fetchCurrentQuestion()
// 校验 ActivityID 是否一致
if (!isActiveActivityId.value) {
window.$message?.warning('当前房间正在进行的不是本场活动,无法跳转到当前题目')
return
}
if (currentQuestionId.value && currentGroupId.value) { if (currentQuestionId.value && currentGroupId.value) {
currentQuestionId.value = currentQuestion.value?.QuestionID || currentQuestionId.value currentQuestionId.value = currentQuestion.value?.QuestionID || currentQuestionId.value
currentGroupId.value = currentQuestion.value?.TeamGroupID || currentGroupId.value currentGroupId.value = currentQuestion.value?.TeamGroupID || currentGroupId.value
@ -343,28 +504,64 @@ function handlePublish() {
negativeText: '再次检查', negativeText: '再次检查',
onPositiveClick: async () => { onPositiveClick: async () => {
// 在发布前,将所有手动修改的分数/状态提交一次 // 在发布前,将所有手动修改的分数/状态提交一次
const updatePromises: Promise<any>[] = [] // 注意:现在 updateScore 接口支持批量提交,我们需要收集所有需要提交的数据
const scoreList: { Id: number, ResultPotins: number, QuestionDetailID: number, QuestionId: number }[] = []
let isValid = true
teamResults.value.forEach((team) => { teamResults.value.forEach((team) => {
if (!isValid)
return
if (team.Answers) { if (team.Answers) {
team.Answers.forEach((item: any) => { team.Answers.forEach((item: any) => {
if (item._isManual) { // 无论是手动还是 AI 推荐,最终都需要提交分数
// 调用 updateScore 接口提交分数 // 如果是 grid 布局客观题Status=1 -> 1分Status=0 -> 0分
// 对于客观题,如果 Status=1 (Correct)Score=1Status=0 (Wrong)Score=0 // 如果是 list 布局(主观题),直接用 Score 分数
// 假设客观题满分是 1 分 (或者根据业务逻辑调整) // 必须有 TeamQuestionUseID (Id) 才能提交
if (item.TeamQuestionUseID) {
let scoreToSubmit = item.Score let scoreToSubmit = item.Score
if (currentLayout.value === 'grid') {
scoreToSubmit = item.Status === 1 ? 1 : 0 // 校验:对于 list 布局(主观题),分数不能为 null
if (currentLayout.value === 'list' && (scoreToSubmit === null || scoreToSubmit === undefined)) {
window.$message?.error(`队伍 "${team.TeamName}" 存在未打分的题目,请检查`)
isValid = false
return
} }
updatePromises.push(updateScore(item.TeamQuestionUseID, scoreToSubmit)) if (currentLayout.value === 'grid') {
// Grid 布局(客观题):只有对错
// 规则:如果评委认为是正确 (Status=1),则使用当前题目的总分 (currentQuestion.Point)
// 否则(错误),分数为 0
// 注意currentQuestion 可能没有 Point 字段,需要确认类型,如果没有则尝试从 item._aiScore 获取或者默认 1
// 根据需求:"就取currentQuestion里面的Point字段"
// 查看 typingscurrentQuestion 是 GetCurrentQuestionInfo 类型,可能没有 Point。
// 假设 GetCurrentQuestionInfo 有 Point 字段 (或者 Points / Score)
// 如果 currentQuestion 没有,回退到 item._aiScore (AI 认为正确的那个分数) 还是默认 1
// 通常客观题分数是固定的。这里假设 currentQuestion 有 Point。
// 修正currentQuestion.value 可能是 undefined。
const maxPoint = (currentQuestion.value as any)?.Point || (currentQuestion.value as any)?.Score || 1
scoreToSubmit = item.Status === 1 ? maxPoint : 0
}
// 确保分数为数字
scoreList.push({
Id: item.TeamQuestionUseID,
ResultPotins: Number(scoreToSubmit || 0),
QuestionDetailID: item.QuestionDetailID || 0,
QuestionId: item.QuestionId || 0,
})
} }
}) })
} }
}) })
if (!isValid)
return
try { try {
await Promise.all(updatePromises) if (scoreList.length > 0) {
await updateScore(scoreList)
}
await fetchUpdateCurrentQuestionUse(currentQuestion.value?.TeamGroupQuestionID || 0) await fetchUpdateCurrentQuestionUse(currentQuestion.value?.TeamGroupQuestionID || 0)
// 发布成功后,清理本地存储 // 发布成功后,清理本地存储
const prefix = `${roomId.value}-${currentQuestionId.value}-` const prefix = `${roomId.value}-${currentQuestionId.value}-`
@ -372,6 +569,10 @@ function handlePublish() {
if (k.startsWith(prefix)) if (k.startsWith(prefix))
delete manualStatusStorage.value[k] delete manualStatusStorage.value[k]
}) })
Object.keys(manualScoreStorage.value).forEach((k) => {
if (k.startsWith(prefix))
delete manualScoreStorage.value[k]
})
} }
catch (error: any) { catch (error: any) {
window.$message?.error(error.message || '提交分数或发布失败,请重试') window.$message?.error(error.message || '提交分数或发布失败,请重试')
@ -387,10 +588,41 @@ function handlePublish() {
const pollingTimer = ref<NodeJS.Timeout | null>(null) const pollingTimer = ref<NodeJS.Timeout | null>(null)
function startPolling() { function startPolling() {
if (pollingTimer.value) stopPolling()
// 检查是否已经结束
const endTime = (currentQuestion.value as any)?.EndTime
if (endTime) {
// 增加 8s 缓冲时间
const end = new Date(endTime).getTime() + 12000
const now = new Date().getTime()
if (now > end) {
console.log('当前题目已结束含12s缓冲仅获取一次最终结果不启动轮询', endTime)
fetchAnswerData()
return
}
}
// 如果不是当前正在进行的活动,仅获取一次数据,不启动轮询
if (!isActiveActivityId.value) {
console.log('当前活动 ID 不是正在比赛的活动,仅获取一次数据', activityId.value, currentQuestion.value?.ActivityID)
fetchAnswerData()
return return
}
fetchAnswerData() // 立即获取 fetchAnswerData() // 立即获取
pollingTimer.value = setInterval(() => { pollingTimer.value = setInterval(() => {
// 每次轮询前再次检查是否过期
const currentEndTime = (currentQuestion.value as any)?.EndTime
if (currentEndTime) {
// 增加 8s 缓冲时间
const endTs = new Date(currentEndTime).getTime() + 12000
if (Date.now() > endTs) {
console.log('题目时间已到含12s缓冲停止轮询', currentEndTime)
stopPolling()
return
}
}
fetchAnswerData() fetchAnswerData()
}, 3000) }, 3000)
} }
@ -437,6 +669,14 @@ watch([currentGroupId, currentQuestionId], () => {
} }
}) })
watch(() => currentQuestionDetailID.value, (newVal) => {
console.log(newVal)
if (newVal) {
fetchQuestionDetail(Number(newVal))
}
}, { immediate: true })
onMounted(async () => { onMounted(async () => {
// 并行拉取分组、题目与当前题目,完成后做一次同步 // 并行拉取分组、题目与当前题目,完成后做一次同步
await Promise.all([fetchGroups(), fetchQuestions(), fetchCurrentQuestion()]) await Promise.all([fetchGroups(), fetchQuestions(), fetchCurrentQuestion()])
@ -498,12 +738,12 @@ onUnmounted(() => {
</div> </div>
<!-- 参考答案展示如果有 --> <!-- 参考答案展示如果有 -->
<div v-if="currentQuestion?.Answer" class="border border-green-200 rounded-lg bg-green-50 p-4"> <div v-if="questionInfo?.Answer" class="border border-green-200 rounded-lg bg-green-50 p-4">
<div class="mb-2 text-sm text-green-800 font-bold tracking-wider uppercase"> <div class="mb-2 text-sm text-green-800 font-bold tracking-wider uppercase">
参考答案 参考答案
</div> </div>
<div class="text-base text-green-900 font-medium leading-relaxed"> <div class="text-base text-green-900 font-medium leading-relaxed">
{{ currentQuestion.Answer }} {{ questionInfo.Answer }}
</div> </div>
</div> </div>
</div> </div>
@ -536,26 +776,28 @@ onUnmounted(() => {
!item._isManual ? 'border-gray-300 bg-gray-50/30' : (item.Status === 1 ? 'border-green-500 bg-green-50/30' : 'border-red-500 bg-red-50/30'), !item._isManual ? 'border-gray-300 bg-gray-50/30' : (item.Status === 1 ? 'border-green-500 bg-green-50/30' : 'border-red-500 bg-red-50/30'),
]" ]"
> >
<!-- 图片上方的标签 --> <div v-if="item.AnswerText" class="text-lg text-gray-800 font-bold">
<div class="mb-2 text-center text-lg text-gray-700 font-bold"> <span> ai识别出的答题文本</span>
{{ item.AnswerText || '答案' }} <Typewriter :text="item.AnswerText" />
</div> </div>
<!-- AI Suggestion Indicator --> <!-- AI Suggestion Indicator -->
<div <div class="mb-2 flex items-center justify-center gap-2 text-xs font-bold">
v-if="!item._isManual" <!-- AI 推荐 -->
class="mb-2 flex items-center justify-center gap-1 text-xs text-orange-500 font-bold" <div class="flex items-center gap-1 text-orange-500">
> <div class="i-carbon-ai-status" />
<div class="i-carbon-ai-status" /> <span>AI: {{ item._aiScore }} ({{ item._aiStatus === 1 ? '对' : '错' }})</span>
AI 推荐: {{ item.Status === 1 ? '正确' : '错误' }} </div>
</div> <!-- 分隔符 -->
<!-- Manual Calibration Indicator --> <div class="h-3 w-[1px] bg-gray-300" />
<div <!-- 当前状态 -->
v-else <div v-if="!item._isManual" class="text-gray-400">
class="mb-2 flex items-center justify-center gap-1 text-xs text-green-600 font-bold" 跟随 AI
> </div>
<div class="i-carbon-user-avatar-filled-alt" /> <div v-else class="flex items-center gap-1 text-green-600">
已人工校准: {{ item.Status === 1 ? '正确' : '错误' }} <div class="i-carbon-user-avatar-filled-alt" />
<span>人工: {{ item.Status === 1 ? '对' : '错' }}</span>
</div>
</div> </div>
<!-- 图片展示 --> <!-- 图片展示 -->
<div class="flex items-center justify-center"> <div class="flex items-center justify-center">
@ -571,10 +813,16 @@ onUnmounted(() => {
> >
<!-- 如果未校准显示两个按钮 --> <!-- 如果未校准显示两个按钮 -->
<template v-if="!item._isManual"> <template v-if="!item._isManual">
<NButton strong secondary round size="medium" type="success" class="shadow-xl" @click="setStatus(team, item, 1)"> <NButton
strong secondary round size="medium" type="success" class="shadow-xl"
@click="setStatus(team, item, 1)"
>
确认正确 (绿) 确认正确 (绿)
</NButton> </NButton>
<NButton strong secondary round size="medium" type="error" class="shadow-xl" @click="setStatus(team, item, 0)"> <NButton
strong secondary round size="medium" type="error" class="shadow-xl"
@click="setStatus(team, item, 0)"
>
确认错误 () 确认错误 ()
</NButton> </NButton>
</template> </template>
@ -603,8 +851,8 @@ onUnmounted(() => {
<div <div
class="flex items-center gap-1 border border-green-200 rounded bg-green-50 px-2 py-1 text-xs text-green-600" class="flex items-center gap-1 border border-green-200 rounded bg-green-50 px-2 py-1 text-xs text-green-600"
> >
<div class="i-carbon-checkmark" /> <icon-ic:twotone-rule class="text-icon" />
已人工校准 <span> 已人工校准</span>
</div> </div>
</div> </div>
</div> </div>
@ -613,12 +861,13 @@ onUnmounted(() => {
<!-- List Layout: 主观题 -> Split View (Image Left, Scoring Right) --> <!-- List Layout: 主观题 -> Split View (Image Left, Scoring Right) -->
<div v-else class="w-full flex flex-col gap-6"> <div v-else class="w-full flex flex-col gap-6">
<div <div
v-for="(item, idx) in team.Answers" :key="item.Guid" v-for="item in team.Answers" :key="item.Guid"
class="flex flex-col gap-6 border border-gray-100 rounded-xl bg-white p-6 shadow-sm" class="flex flex-col gap-6 border border-gray-100 rounded-xl bg-white p-6 shadow-sm"
> >
<!-- Title --> <!-- Title -->
<div class="text-lg text-gray-800 font-bold"> <div class="text-lg text-gray-800 font-bold">
{{ idx + 1 }}. {{ item.AnswerText || '题目' }} (汉字加一加) <span> ai识别出的答题文本</span>
<Typewriter :text="item.AnswerText || '题目'" />
</div> </div>
<div class="flex flex-col gap-6 lg:flex-row"> <div class="flex flex-col gap-6 lg:flex-row">
@ -630,6 +879,7 @@ onUnmounted(() => {
<div class="i-carbon-image" /> <div class="i-carbon-image" />
主观题原图展示区 主观题原图展示区
</div> </div>
<div class="h-full flex items-center justify-center"> <div class="h-full flex items-center justify-center">
<NImage <NImage
v-if="item.AnswerValuePicture || item.imageUrl" v-if="item.AnswerValuePicture || item.imageUrl"
@ -651,25 +901,56 @@ onUnmounted(() => {
<div class="mt-1 text-sm text-gray-500"> <div class="mt-1 text-sm text-gray-500">
请根据对的字数进行打分 请根据对的字数进行打分
</div> </div>
<div v-if="!item._isManual" class="mt-2 flex items-center gap-2 rounded bg-orange-50 px-2 py-1 text-xs text-orange-600"> <!-- 评分状态展示区域明确区分 AI 推荐和人工干预状态 -->
<div class="i-carbon-ai-status" /> <div class="mt-2 flex flex-col gap-2">
AI 推荐: {{ item.Score }} <!-- AI 推荐信息 (始终显示作为参考) -->
</div> <div
<div v-else class="mt-2 flex items-center gap-2 rounded bg-green-50 px-2 py-1 text-xs text-green-600"> class="flex items-center justify-between border border-gray-100 rounded bg-gray-50 px-3 py-2"
<div class="i-carbon-user-avatar-filled-alt" /> >
已人工校准: {{ item.Score }} <div class="flex items-center gap-1.5">
<div class="i-carbon-ai-status text-orange-500" />
<span class="text-xs text-gray-600 font-medium">AI 推荐</span>
</div>
<div class="flex items-center gap-2">
<span class="text-sm text-gray-800 font-bold">{{ item._aiScore }} </span>
<span
class="rounded px-1.5 py-0.5 text-[10px]"
:class="item._aiStatus === 1 ? 'bg-green-100 text-green-700' : 'bg-red-100 text-red-700'"
>
{{ item._aiStatus === 1 ? '判对' : '判错' }}
</span>
</div>
</div>
<!-- 当前生效状态提示 -->
<div
v-if="item._isManual"
class="flex items-center gap-1 border border-green-200 rounded bg-green-50 px-2 py-1 text-xs text-green-600"
>
<!-- <div class="i-carbon-user-avatar-filled-alt" /> -->
<icon-ic:twotone-rule class="text-icon" />
<span> 已人工校准</span>
</div>
<div v-else class="flex items-center gap-1.5 px-1 text-xs text-gray-400">
<div class="i-carbon-arrows-horizontal" />
<span>当前跟随 AI 推荐结果</span>
</div>
</div> </div>
</div> </div>
<!-- Score Input --> <!-- Score Input -->
<div class="flex flex-col gap-2"> <div class="flex flex-col gap-2">
<div class="text-sm text-gray-600 font-medium"> <div class="text-sm text-gray-600 font-medium">
最终得分 最终得分 (人工)
</div> </div>
<div class="flex items-center border border-blue-100 rounded-xl bg-white px-4 py-3 shadow-sm"> <div class="flex items-center border border-blue-100 rounded-xl bg-white px-4 py-3 shadow-sm">
<!-- <NInputNumber v-model:value="item.Score" :min="0" :max="100" :show-button="false" <!-- <NInputNumber v-model:value="item.Score" :min="0" :max="100" :show-button="false"
class="flex-1 text-center text-3xl font-bold !border-none" placeholder="0" /> --> class="flex-1 text-center text-3xl font-bold !border-none" placeholder="0" /> -->
<NInputNumber v-model:value="item.Score" button-placement="both" :min="0" :max="100" @update:value="(val) => handleManualScoreUpdate(item, val || 0)"> <NInputNumber
v-model:value="item.Score" button-placement="both" :min="0" :max="100"
@update:value="(val) => handleManualScoreUpdate(item, val || 0)"
>
<template #suffix> <template #suffix>
</template> </template>
@ -682,13 +963,13 @@ onUnmounted(() => {
<div class="text-sm text-gray-600 font-medium"> <div class="text-sm text-gray-600 font-medium">
快捷打分 快捷打分
</div> </div>
<div class="grid grid-cols-2 gap-3"> <div class="grid grid-cols-4 gap-2">
<NButton <NButton
v-for="score in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" :key="score" secondary strong v-for="score in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" :key="score" secondary strong
:type="item.Score === score ? 'primary' : 'default'" class="h-10" :type="item.Score === score ? 'primary' : 'default'" class="h-10 w-full"
@click="() => handleManualScoreUpdate(item, score)" @click="() => handleManualScoreUpdate(item, score)"
> >
{{ score }} {{ score }}
</NButton> </NButton>
</div> </div>
</div> </div>

View File

@ -0,0 +1,48 @@
<script lang="ts" setup>
import type { Options } from 'typeit'
import TypeIt from 'typeit'
import { onMounted, onUnmounted, ref, watch } from 'vue'
const props = defineProps<{
text?: string
}>()
const textRef = ref<HTMLElement>()
let typeItInstance: any = null
function init() {
if (!textRef.value)
return
if (typeItInstance) {
typeItInstance.destroy()
}
const options: Options = {
strings: props.text || '',
lifeLike: true,
speed: 100,
loop: false,
cursor: false,
}
typeItInstance = new TypeIt(textRef.value, options).go()
}
onMounted(() => {
init()
})
watch(() => props.text, () => {
init()
})
onUnmounted(() => {
if (typeItInstance) {
typeItInstance.destroy()
}
})
</script>
<template>
<span ref="textRef" class="text-lg text-gray-800 font-bold" />
</template>

View File

@ -20,7 +20,7 @@ const currentQuestionDetail = computed(() => store.currentQuestionDetail)
const TeamGroup_QuestionID = computed(() => currentQuestionMainInfo.value?.TeamGroup_QuestionID || 0) const TeamGroup_QuestionID = computed(() => currentQuestionMainInfo.value?.TeamGroup_QuestionID || 0)
const QuestionID = computed(() => currentQuestionMainInfo.value?.Activity_Question.ID || 0) const QuestionID = computed(() => currentQuestionMainInfo.value?.Activity_Question.ID || 0)
const QuestionDetaiID = computed(() => currentQuestionDetail.value?.Id || 0) const QuestionDetailID = computed(() => currentQuestionDetail.value?.Id || 0)
const zoomedImage = ref<string | null>(null) const zoomedImage = ref<string | null>(null)
const isCompleted = ref(false) const isCompleted = ref(false)
@ -123,7 +123,7 @@ async function fetchGetGameStatisticsData() {
const _params = { const _params = {
TeamGroupID: Number(groupsId.value), TeamGroupID: Number(groupsId.value),
QuestionID: Number(QuestionID.value), QuestionID: Number(QuestionID.value),
QuestionDetaiID: Number(QuestionDetaiID.value), QuestionDetaiID: Number(QuestionDetailID.value),
} }
const { data } = await fetchGetGameStatistics(_params) const { data } = await fetchGetGameStatistics(_params)
teams.value = (data?.data as any[]) || [] teams.value = (data?.data as any[]) || []

View File

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, onMounted, ref, watch } from 'vue' import { computed, onMounted, ref } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue' import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue'
import { useRouterPush } from '@/hooks/common/router' import { useRouterPush } from '@/hooks/common/router'
@ -28,10 +28,12 @@ const activityName = computed(() => activityInfo.value?.ActivityTitle || '星·
const flippedCards = ref<Set<number>>(new Set()) const flippedCards = ref<Set<number>>(new Set())
// 计算是否所有卡片都已翻转 (当前显示4张卡片) // 计算是否所有卡片都已翻转 (当前显示4张卡片)
// eslint-disable-next-line unused-imports/no-unused-vars
const isAllFlipped = computed(() => flippedCards.value.size === questions.value.length) const isAllFlipped = computed(() => flippedCards.value.size === questions.value.length)
// 控制下一步按钮的显示(带延迟) // 控制下一步按钮的显示(带延迟)
const showNextButton = ref(false) const showNextButton = ref(true)
// eslint-disable-next-line prefer-const, unused-imports/no-unused-vars
let timer: ReturnType<typeof setTimeout> | null = null let timer: ReturnType<typeof setTimeout> | null = null
// 获取路由参数 // 获取路由参数
@ -70,22 +72,22 @@ async function getQuestions() {
loading.value = false loading.value = false
} }
} }
// 测试先注释掉
// watch(isAllFlipped, (val) => {
// if (timer) {
// clearTimeout(timer)
// timer = null
// }
watch(isAllFlipped, (val) => { // if (val) {
if (timer) { // timer = setTimeout(() => {
clearTimeout(timer) // showNextButton.value = true
timer = null // }, 1500)
} // }
// else {
if (val) { // showNextButton.value = false
timer = setTimeout(() => { // }
showNextButton.value = true // })
}, 1500)
}
else {
showNextButton.value = false
}
})
function handleBack() { function handleBack() {
routerBack() routerBack()

View File

@ -130,7 +130,15 @@ async function handleNext() {
// 点击开始答题 // 点击开始答题
if (!isStarted.value) { if (!isStarted.value) {
isStarted.value = true isStarted.value = true
store.startTimer(store.currentQuestionInfo?.QuestionTime || 10)
// 获取题目时间,优先从 currentQuestionInfo 获取,兼容大小写
// 并在获取失败时尝试从 detail 获取(如果后端在详情接口也返回了时间)
const infoTime = store.currentQuestionInfo?.QuestionTime || (store.currentQuestionInfo as any)?.questionTime
const detailTime = (store.currentQuestionDetail as any)?.QuestionTime || (store.currentQuestionDetail as any)?.questionTime
const duration = Number(infoTime || detailTime || 120) // 默认值改为 120s 或者保持 10s用户说是 120s
console.log('开始倒计时,时长:', duration, 'InfoTime:', infoTime, 'DetailTime:', detailTime)
store.startTimer(duration)
// 提交题目使用记录 // 提交题目使用记录
try { try {
@ -207,10 +215,34 @@ async function fetchGetGameStatisticsData(_params: Api.Competition.QuestionAddPa
// 使用 Map 去重,以 TeamId 为准,保留最新的状态 // 使用 Map 去重,以 TeamId 为准,保留最新的状态
const teamMap = new Map() const teamMap = new Map()
list.forEach((item) => { list.forEach((item) => {
let answerCount = 0
try {
if (item.UserAnswerFont) {
const parsed = JSON.parse(item.UserAnswerFont)
if (Array.isArray(parsed) && parsed.length > 0) {
// 如果 AnswerText 存在,取其长度;否则(如选择题)如果对象存在则算 1 个
// 逻辑:如果是填空/听写类AnswerText 是字符串,取长度?
// 根据需求:答题数量用 UserAnswerFont 里面 AnswerText 字段的 length 长度
// 注意AnswerText 可能是 "B" (选择题) 或 "汉字" (听写)
// 如果是数组,是否需要累加所有项的 AnswerText 长度?
// 假设 UserAnswerFont 是一个数组 [{"AnswerText": "..."}]
// 这里我们遍历数组累加长度
parsed.forEach((p: any) => {
if (p.AnswerText) {
answerCount += String(p.AnswerText).length
}
})
}
}
}
catch (e) {
console.error('解析 UserAnswerFont 失败', e)
}
teamMap.set(item.TeamName, { teamMap.set(item.TeamName, {
group: item.TeamName || '未知队伍', group: item.TeamName || '未知队伍',
total: item.Points || 0, total: answerCount, // 答题数量
correct: item.ResultPotins || 0, correct: item.Points || 0, // 预估得分 (使用外层 Points)
}) })
}) })
chartData.value = Array.from(teamMap.values()) chartData.value = Array.from(teamMap.values())

View File

@ -30,7 +30,7 @@ function buildOption(list: BarDatum[]): ECOption {
axisPointer: { type: 'shadow' }, axisPointer: { type: 'shadow' },
}, },
legend: { legend: {
data: ['答题数量', '正确数量'], data: ['答题数量', '预估得分'],
top: 0, top: 0,
right: 0, right: 0,
icon: 'circle', icon: 'circle',

View File

@ -1,9 +1,17 @@
{ {
"question_bank": [ "question_bank": [
{
"QuestionId": 27,
"Name": "jiū 表示小鸟的叫声",
"Answer": "啾",
"Type": "text",
"IsGood": 0,
"ImageUrl": ""
},
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "liú 表示姓名", "Name": "liú 表示姓名",
"Answer": "刘,牛", "Answer": "刘",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -11,7 +19,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "zhāng 表示姓氏", "Name": "zhāng 表示姓氏",
"Answer": "张,章", "Answer": "张",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -27,7 +35,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "lǐ 表示姓氏", "Name": "lǐ 表示姓氏",
"Answer": "李,里", "Answer": "李",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -35,7 +43,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "chén 表示姓氏", "Name": "chén 表示姓氏",
"Answer": "陈,晨", "Answer": "陈",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -43,7 +51,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "yáng 表示动物", "Name": "yáng 表示动物",
"Answer": "羊,杨", "Answer": "羊",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -51,7 +59,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "mǎ 表示动物", "Name": "mǎ 表示动物",
"Answer": "马,码", "Answer": "马",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -67,7 +75,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "yú 表示动物", "Name": "yú 表示动物",
"Answer": "鱼,于", "Answer": "鱼",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -83,7 +91,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "huā 表示植物", "Name": "huā 表示植物",
"Answer": "花,华", "Answer": "花",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -91,7 +99,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "shù 表示植物", "Name": "shù 表示植物",
"Answer": "树,数", "Answer": "树",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -99,7 +107,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "cǎo 表示植物", "Name": "cǎo 表示植物",
"Answer": "草,操", "Answer": "草",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -115,7 +123,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "yè 表示植物", "Name": "yè 表示植物",
"Answer": "叶,页", "Answer": "叶",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -147,7 +155,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "jīn 表示自然元素", "Name": "jīn 表示自然元素",
"Answer": "金,今", "Answer": "金",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -155,7 +163,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "mù 表示自然元素", "Name": "mù 表示自然元素",
"Answer": "木,目", "Answer": "木",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -163,7 +171,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "tiān 表示自然", "Name": "tiān 表示自然",
"Answer": "天,田", "Answer": "天",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -171,7 +179,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "dì 表示自然", "Name": "dì 表示自然",
"Answer": "地,第", "Answer": "地",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -179,7 +187,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "shān 表示自然", "Name": "shān 表示自然",
"Answer": "山,杉", "Answer": "山",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -187,7 +195,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "chuān 表示自然", "Name": "chuān 表示自然",
"Answer": "川,穿", "Answer": "川",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -195,7 +203,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "hé 表示自然", "Name": "hé 表示自然",
"Answer": "河,和", "Answer": "河",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -203,7 +211,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "rén 表示人类", "Name": "rén 表示人类",
"Answer": "人,仁", "Answer": "人",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -219,7 +227,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "shǒu 表示身体", "Name": "shǒu 表示身体",
"Answer": "手,首", "Answer": "手",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -227,7 +235,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "zú 表示身体", "Name": "zú 表示身体",
"Answer": "足,族", "Answer": "足",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -235,7 +243,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "mù 表示身体", "Name": "mù 表示身体",
"Answer": "目,木", "Answer": "目",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -243,15 +251,15 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "ěr 表示身体", "Name": "ěr 表示身体",
"Answer": "耳,尔", "Answer": "耳",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
}, },
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "bǐ 表示身体", "Name": "bí 表示身体",
"Answer": "鼻,比", "Answer": "鼻",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -267,7 +275,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "yá 表示身体", "Name": "yá 表示身体",
"Answer": "牙,芽", "Answer": "牙",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -275,7 +283,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "xīn 表示身体", "Name": "xīn 表示身体",
"Answer": "心,新", "Answer": "心",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -283,7 +291,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "gān 表示身体", "Name": "gān 表示身体",
"Answer": "肝,干", "Answer": "肝",
"Type": "text", "Type": "text",
"IsGood": 1, "IsGood": 1,
"ImageUrl": "" "ImageUrl": ""
@ -371,7 +379,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "huà 表示动作", "Name": "huà 表示动作",
"Answer": "画,话", "Answer": "画",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""
@ -451,7 +459,7 @@
{ {
"QuestionId": 27, "QuestionId": 27,
"Name": "shí 表示数字", "Name": "shí 表示数字",
"Answer": "十,石", "Answer": "十",
"Type": "text", "Type": "text",
"IsGood": 0, "IsGood": 0,
"ImageUrl": "" "ImageUrl": ""

View File

@ -40,10 +40,6 @@ interface Question {
ImageUrl: string ImageUrl: string
} }
interface QuestionBank {
question_bank: Question[]
}
async function importQuestions() { async function importQuestions() {
try { try {
// 检查资源目录是否存在 // 检查资源目录是否存在
@ -64,11 +60,17 @@ async function importQuestions() {
const filePath = path.join(ASSET_DIR, file) const filePath = path.join(ASSET_DIR, file)
console.log(`\nStarting import for file: ${file}`) console.log(`\nStarting import for file: ${file}`)
const data: QuestionBank = await fs.readJSON(filePath) const data: any = await fs.readJSON(filePath)
const questions = data.question_bank let questions: Question[] = []
if (!questions || !Array.isArray(questions)) { if (Array.isArray(data)) {
console.error(`Invalid JSON format in ${file}: question_bank array not found.`) questions = data
}
else if (data.question_bank && Array.isArray(data.question_bank)) {
questions = data.question_bank
}
else {
console.error(`Invalid JSON format in ${file}: question_bank array not found or data is not an array.`)
continue continue
} }

View File

@ -1,340 +0,0 @@
{
"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

@ -1,428 +0,0 @@
{
"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,458 @@
[
{
"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,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

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

@ -19,7 +19,7 @@
}, },
"devDependencies": { "devDependencies": {
"@read-star/eslint-config": "workspace:*", "@read-star/eslint-config": "workspace:*",
"eslint": "latest", "eslint": "^9.39.2",
"eslint-plugin-format": "^1.3.1", "eslint-plugin-format": "^1.3.1",
"lint-staged": "latest", "lint-staged": "latest",
"simple-git-hooks": "latest", "simple-git-hooks": "latest",

50
pnpm-lock.yaml generated
View File

@ -16,14 +16,14 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:packages/eslint-config version: link:packages/eslint-config
eslint: eslint:
specifier: latest specifier: ^9.39.2
version: 9.39.2(jiti@2.6.1) version: 9.39.2(jiti@2.6.1)
eslint-plugin-format: eslint-plugin-format:
specifier: ^1.3.1 specifier: ^1.3.1
version: 1.3.1(eslint@9.39.2(jiti@2.6.1)) version: 1.3.1(eslint@9.39.2(jiti@2.6.1))
lint-staged: lint-staged:
specifier: latest specifier: latest
version: 16.2.7 version: 16.3.2
simple-git-hooks: simple-git-hooks:
specifier: latest specifier: latest
version: 2.13.1 version: 2.13.1
@ -117,6 +117,9 @@ importers:
tailwind-merge: tailwind-merge:
specifier: 3.4.0 specifier: 3.4.0
version: 3.4.0 version: 3.4.0
typeit:
specifier: ^8.8.7
version: 8.8.7
v-scale-screen: v-scale-screen:
specifier: ^2.3.0 specifier: ^2.3.0
version: 2.3.0(vue@3.5.26(typescript@5.9.3)) version: 2.3.0(vue@3.5.26(typescript@5.9.3))
@ -1496,6 +1499,9 @@ packages:
'@types/unist@3.0.3': '@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
'@types/web-animations-js@2.2.16':
resolution: {integrity: sha512-ATELeWMFwj8eQiH0KmvsCl1V2lu/qx/CjOBmv4ADSZS5u8r4reMyjCXtxG7khqyiwH3IOMNdrON/Ugn94OUcRA==}
'@types/web-bluetooth@0.0.21': '@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
@ -2363,8 +2369,8 @@ packages:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
commander@14.0.2: commander@14.0.3:
resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'} engines: {node: '>=20'}
commander@7.2.0: commander@7.2.0:
@ -3299,6 +3305,7 @@ packages:
glob@10.5.0: glob@10.5.0:
resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true hasBin: true
glob@13.0.0: glob@13.0.0:
@ -3846,8 +3853,8 @@ packages:
lines-and-columns@1.2.4: lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
lint-staged@16.2.7: lint-staged@16.3.2:
resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} resolution: {integrity: sha512-xKqhC2AeXLwiAHXguxBjuChoTTWFC6Pees0SHPwOpwlvI3BH7ZADFPddAdN3pgo3aiKgPUx/bxE78JfUnxQnlg==}
engines: {node: '>=20.17'} engines: {node: '>=20.17'}
hasBin: true hasBin: true
@ -4202,10 +4209,6 @@ packages:
namespace-emitter@2.0.1: namespace-emitter@2.0.1:
resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==}
nano-spawn@2.0.0:
resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==}
engines: {node: '>=20.17'}
nanoid@3.3.11: nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -4464,11 +4467,6 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
engines: {node: '>=12'} engines: {node: '>=12'}
pidtree@0.6.0:
resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
engines: {node: '>=0.10'}
hasBin: true
pinia-plugin-persistedstate@4.7.1: pinia-plugin-persistedstate@4.7.1:
resolution: {integrity: sha512-WHOqh2esDlR3eAaknPbqXrkkj0D24h8shrDPqysgCFR6ghqP/fpFfJmMPJp0gETHsvrh9YNNg6dQfo2OEtDnIQ==} resolution: {integrity: sha512-WHOqh2esDlR3eAaknPbqXrkkj0D24h8shrDPqysgCFR6ghqP/fpFfJmMPJp0gETHsvrh9YNNg6dQfo2OEtDnIQ==}
peerDependencies: peerDependencies:
@ -5352,6 +5350,9 @@ packages:
resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
typeit@8.8.7:
resolution: {integrity: sha512-sSVpy+cjeFP6Z+fZqiHzUSShg5yYFeJEt/Qut/bX945+Axyq+Yq+GPOuuk+sofoccSv8nNX/ibOOHkbki2mEpg==}
typescript@5.9.3: typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
@ -6817,6 +6818,8 @@ snapshots:
'@types/unist@3.0.3': {} '@types/unist@3.0.3': {}
'@types/web-animations-js@2.2.16': {}
'@types/web-bluetooth@0.0.21': {} '@types/web-bluetooth@0.0.21': {}
'@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': '@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
@ -7906,7 +7909,7 @@ snapshots:
dependencies: dependencies:
delayed-stream: 1.0.0 delayed-stream: 1.0.0
commander@14.0.2: {} commander@14.0.3: {}
commander@7.2.0: {} commander@7.2.0: {}
@ -9512,14 +9515,13 @@ snapshots:
lines-and-columns@1.2.4: {} lines-and-columns@1.2.4: {}
lint-staged@16.2.7: lint-staged@16.3.2:
dependencies: dependencies:
commander: 14.0.2 commander: 14.0.3
listr2: 9.0.5 listr2: 9.0.5
micromatch: 4.0.8 micromatch: 4.0.8
nano-spawn: 2.0.0
pidtree: 0.6.0
string-argv: 0.3.2 string-argv: 0.3.2
tinyexec: 1.0.2
yaml: 2.8.2 yaml: 2.8.2
listr2@9.0.5: listr2@9.0.5:
@ -10071,8 +10073,6 @@ snapshots:
namespace-emitter@2.0.1: {} namespace-emitter@2.0.1: {}
nano-spawn@2.0.0: {}
nanoid@3.3.11: {} nanoid@3.3.11: {}
nanoid@5.1.6: {} nanoid@5.1.6: {}
@ -10315,8 +10315,6 @@ snapshots:
picomatch@4.0.3: {} picomatch@4.0.3: {}
pidtree@0.6.0: {}
pinia-plugin-persistedstate@4.7.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))): pinia-plugin-persistedstate@4.7.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))):
dependencies: dependencies:
defu: 6.1.4 defu: 6.1.4
@ -11322,6 +11320,10 @@ snapshots:
typed-array-buffer: 1.0.3 typed-array-buffer: 1.0.3
typed-array-byte-offset: 1.0.4 typed-array-byte-offset: 1.0.4
typeit@8.8.7:
dependencies:
'@types/web-animations-js': 2.2.16
typescript@5.9.3: {} typescript@5.9.3: {}
ufo@1.6.1: {} ufo@1.6.1: {}