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",
"quill-toolbar-tip": "^0.1.0",
"tailwind-merge": "3.4.0",
"typeit": "^8.8.7",
"v-scale-screen": "^2.3.0",
"vue": "3.5.26",
"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'
/** get user list */
export function fetchRankList(data?: Api.Rank.UserSearchParams) {
export function fetchRankList(MainID: number, RoundType = 0) {
return request<Api.Rank.CommonRecord>({
url: '/admin/v1/class/pagelist',
method: 'post',
data: data || {},
url: `/Base/ActivityMain/GetTeamsTotal/list?MainID=${MainID}&RoundType=${RoundType}`,
method: 'get',
})
}
/** 获取队伍排名详情 */
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>({
url: `/Base/ActivityMain/UpdateTeamQuestionUseOne?Id=${Id}&ResultPotins=${ResultPotins}`,
url: `/Base/ActivityMain/UpdateTeamQuestionResultList`,
method: 'post',
data: { Id, ResultPotins },
})
}
/** 评委更新状态 (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 },
data,
})
}

View File

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

View File

@ -28,6 +28,7 @@ declare module 'vue' {
'IconIc:baselineArrowRightAlt': typeof import('~icons/ic/baseline-arrow-right-alt')['default']
'IconIc:baselineDeleteForever': typeof import('~icons/ic/baseline-delete-forever')['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']
IconIcBaselineAddPlus: typeof import('~icons/ic/baseline-add-plus')['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']
IconIcBaselineUpload: typeof import('~icons/ic/baseline-upload')['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']
IconIcOutlineAddToPhotos: typeof import('~icons/ic/outline-add-to-photos')['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']
ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.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']
WangEditor: typeof import('./../components/common/wang-editor.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:baselineDeleteForever': typeof import('~icons/ic/baseline-delete-forever')['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 IconIcBaselineAddPlus: typeof import('~icons/ic/baseline-add-plus')['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 IconIcBaselineUpload: typeof import('~icons/ic/baseline-upload')['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 IconIcOutlineAddToPhotos: typeof import('~icons/ic/outline-add-to-photos')['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 ThemeSchemaSwitch: typeof import('./../components/common/theme-schema-switch.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 WangEditor: typeof import('./../components/common/wang-editor.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> = [
{ title: 'ID', key: 'ID', width: 80 },
{ title: '键 (Key)', key: 'UI_Key' },
{ title: '值 (Value)', key: 'UI_Value' },
{ title: '值 (Value)', key: 'UI_Value', width: 100 },
{ title: '备注', key: 'BakValue' },
{
title: '操作',

View File

@ -1,14 +1,22 @@
<script setup lang="tsx">
import { NCard, NDivider } from 'naive-ui'
import { ref } from 'vue'
import { NCard, NDivider, useMessage } from 'naive-ui'
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 TeamItem from './modules/team-item.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)',
date: '2026.01.12',
}
})
interface TeamData {
id: number
@ -19,88 +27,138 @@ interface TeamData {
totalScore: number
updateTime: string
isExpanded: boolean
scores: Record<string, number>
scores: Record<string, { score: number, questionId: number, teamQuestionUseId: number, questionDetailId: number }>
}
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: {},
},
])
const teamList = ref<TeamData[]>([])
function toggleExpand(team: TeamData) {
// Collapse others if needed, or allow multiple. Screenshot shows one.
// Let's toggle.
team.isExpanded = !team.isExpanded
// If expanding, maybe populate scores if empty (mock logic)
if (team.isExpanded && Object.keys(team.scores).length === 0) {
for (let i = 1; i <= 15; i++) {
team.scores[`q${i}`] = 10
/** 获取排行榜详情 */
async function getRankDetail() {
if (!activityId)
return
try {
const { data, error } = await fetchRankDetail(Number(activityId))
if (error) {
message.error(error.message)
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} 的分数变动`)
team.isExpanded = false
/** 获取队伍具体的题目分数 */
async function getTeamQuestionScore(team: TeamData) {
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() {
@ -109,7 +167,32 @@ function handlePublish() {
function updateScore(team: TeamData, key: string, value: number | 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>
@ -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">
<NCard :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
<!-- Header -->
<RankHeader
:title="competitionInfo.name"
:date="competitionInfo.date"
@publish="handlePublish"
/>
<RankHeader :title="competitionInfo.name" :date="competitionInfo.date" @publish="handlePublish" />
<NDivider />
@ -133,12 +212,8 @@ function updateScore(team: TeamData, key: string, value: number | null) {
<div class="flex flex-col gap-4">
<!-- Data Rows -->
<TeamItem
v-for="team in teamList"
:key="team.id"
:team="team"
@toggle-expand="toggleExpand"
@save-scores="saveScores"
@update-score="updateScore"
v-for="team in teamList" :key="team.id" :team="team" @toggle-expand="toggleExpand"
@save-scores="saveScores" @update-score="updateScore"
/>
</div>
</NCard>

View File

@ -11,7 +11,7 @@ interface TeamData {
totalScore: number
updateTime: string
isExpanded: boolean
scores: Record<string, number>
scores: Record<string, { score: number, questionId: number, teamQuestionUseId: number, questionDetailId: number }>
}
const props = defineProps<{
@ -59,14 +59,14 @@ const rankStyle = computed(() => {
</div>
<!-- Group -->
<div class="text-gray-500">
<!-- <div class="text-gray-500">
{{ team.group }}
</div>
</div> -->
<!-- Correct Count -->
<div class="font-bold font-mono">
<!-- <div class="font-bold font-mono">
{{ team.correctCount }}
</div>
</div> -->
<!-- Score -->
<div class="text-16px text-primary font-bold">
@ -96,16 +96,16 @@ const rankStyle = computed(() => {
</div>
<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="mb-2 flex justify-between text-12px text-gray-400">
<span>Q{{ i }} SCORE</span>
<span>/ 10</span>
<span>{{ item.questionId }}-Q{{ index + 1 }} SCORE</span>
<span />
</div>
<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"
@update:value="(val) => emit('updateScore', team, `q${i}`, val)"
@update:value="(val) => emit('updateScore', team, String(key), val)"
/>
</div>
</NGridItem>

View File

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

View File

@ -7,12 +7,15 @@ import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { QuestionCategoryEnum } from '@/enum/business'
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 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', {})
// 本地存储手动修改的分数 (key: roomId-questionId-teamId-guid, value: score)
const manualScoreStorage = useStorage<Record<string, number>>('read-star-manual-score', {})
const route = useRoute()
const message = useMessage()
@ -20,20 +23,39 @@ const activityId = computed(() => route.query?.activityId as string)
const roomId = computed(() => route.query?.roomId as string)
const currentGroupId = ref<number | string>('') // 当前选中的组别 ID
const currentQuestionId = ref<number | string>('') // 当前选中的题目 ID
const currentQuestionId = ref<number | string>('') // 当前选中的题目大纲 ID
const currentQuestionType = ref<string>('') // 当前选中的题目类型
const groups = ref<GroupItem[]>([])
const questionList = ref<(GroupItem & { type: string })[]>([])
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(() => {
// 只有 汉字加一加 (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'
}
// 其他题型 (汉字听写、诗词、词语听写、成语看图等) 使用 '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) {
item.Score = newScore
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 {
await updateScore(item.TeamQuestionUseID, newScore)
await updateScore([{
Id: item.TeamQuestionUseID,
ResultPotins: newScore,
QuestionDetailID: item.QuestionDetailID || 0,
QuestionId: item.QuestionId || 0,
}])
message.success('分数已更新')
}
catch (e: any) {
@ -86,22 +134,46 @@ function handleNext() {
/**
* 根据房间当前题目,自动同步选中题目和当前正在比赛的组
* 逻辑:
* - 如果后端返回了当前题目的 QuestionID并且题目列表已加载则将 currentQuestionId 设为该题
* - 同时同步 currentQuestionType便于切换布局
* - 若找不到匹配项,则维持现状(由首次加载保持为第一题)
*/
function syncCurrentQuestionSelection() {
const qid = currentQuestion.value?.QuestionID
const gid = currentQuestion.value?.TeamGroupID
if (!qid || questionList.value.length === 0)
// 1. 如果不是当前正在进行的活动,默认选中第一组第一题
if (!isActiveActivityId.value) {
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
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
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() {
if (!currentGroupId.value || !currentQuestionId.value || !currentQuestion.value?.QuestionDetailID)
if (!currentGroupId.value || !currentQuestionId.value)
return
try {
const params = {
@ -212,6 +284,20 @@ async function fetchAnswerData() {
const result = data?.data || []
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) => {
const UserAnswerFont = JSON.parse(item.UserAnswerFont)
console.log('解析后的 UserAnswerFont:', UserAnswerFont)
@ -225,7 +311,8 @@ async function fetchAnswerData() {
if (t.Answers) {
t.Answers.forEach((a: any) => {
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) {
const parsedFonts = JSON.parse(answerData.UserAnswerFont)
parsedAnswers = Array.isArray(parsedFonts) ? parsedFonts : []
console.warn('parsed fonts', parsedFonts)
// console.warn('parsed fonts', parsedFonts)
}
}
catch (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 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 storedStatus = manualStatusStorage.value[storageKey]
const storedScore = manualScoreStorage.value[storageKey]
const hasStoredStatus = storedStatus !== undefined
const hasStoredScore = storedScore !== undefined
// 记录 AI 的原始推荐值(如果后端返回了)
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 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,
TeamId: answerData.TeamId, // [新增] 注入 TeamId
QuestionId: answerData.QuestionId, // [新增]
QuestionDetailID: answerData.QuestionDetaiID, // [新增] 注意后端字段拼写
AnswerText: ans.AnswerText,
AnswerValuePicture: finalImageUrl,
_baseImgUrl: cleanBaseUrl,
_t: timestamp, // 保存时间戳
Score: finalScore,
Status: finalStatus,
_isManual: true,
_aiStatus: aiStatus, // 保存 AI 的最新状态供参考
_aiStatus: aiStatus,
_aiScore: aiScore,
}
return resultItem
}
// 如果没有手动编辑,不要自动应用 AI 的状态,保持“未评”状态
// 用 _isManual = false 来表示 "未人工介入",此时 Status 仍然跟随 AI (ans.Status)
// 但 UI 上会显示 "AI 推荐: Correct/Wrong",而不是 "已人工校准"。
// 只有当用户点击后_isManual = true才显示 "已人工校准"。
// 并且 Status = ans.Status (AI 的值)。
// 如果没有手动编辑
return {
...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,
_aiScore: aiScore,
_isManual: false, // 明确标记为非手动
Score: null, // 默认 null
_isManual: false,
}
})
@ -311,6 +465,13 @@ async function fetchAnswerData() {
*/
async function handleNexCurrentQuestion() {
await fetchCurrentQuestion()
// 校验 ActivityID 是否一致
if (!isActiveActivityId.value) {
window.$message?.warning('当前房间正在进行的不是本场活动,无法跳转到当前题目')
return
}
if (currentQuestionId.value && currentGroupId.value) {
currentQuestionId.value = currentQuestion.value?.QuestionID || currentQuestionId.value
currentGroupId.value = currentQuestion.value?.TeamGroupID || currentGroupId.value
@ -343,28 +504,64 @@ function handlePublish() {
negativeText: '再次检查',
onPositiveClick: async () => {
// 在发布前,将所有手动修改的分数/状态提交一次
const updatePromises: Promise<any>[] = []
// 注意:现在 updateScore 接口支持批量提交,我们需要收集所有需要提交的数据
const scoreList: { Id: number, ResultPotins: number, QuestionDetailID: number, QuestionId: number }[] = []
let isValid = true
teamResults.value.forEach((team) => {
if (!isValid)
return
if (team.Answers) {
team.Answers.forEach((item: any) => {
if (item._isManual) {
// 调用 updateScore 接口提交分数
// 对于客观题,如果 Status=1 (Correct)Score=1Status=0 (Wrong)Score=0
// 假设客观题满分是 1 分 (或者根据业务逻辑调整)
// 无论是手动还是 AI 推荐,最终都需要提交分数
// 如果是 grid 布局客观题Status=1 -> 1分Status=0 -> 0分
// 如果是 list 布局(主观题),直接用 Score 分数
// 必须有 TeamQuestionUseID (Id) 才能提交
if (item.TeamQuestionUseID) {
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 {
await Promise.all(updatePromises)
if (scoreList.length > 0) {
await updateScore(scoreList)
}
await fetchUpdateCurrentQuestionUse(currentQuestion.value?.TeamGroupQuestionID || 0)
// 发布成功后,清理本地存储
const prefix = `${roomId.value}-${currentQuestionId.value}-`
@ -372,6 +569,10 @@ function handlePublish() {
if (k.startsWith(prefix))
delete manualStatusStorage.value[k]
})
Object.keys(manualScoreStorage.value).forEach((k) => {
if (k.startsWith(prefix))
delete manualScoreStorage.value[k]
})
}
catch (error: any) {
window.$message?.error(error.message || '提交分数或发布失败,请重试')
@ -387,10 +588,41 @@ function handlePublish() {
const pollingTimer = ref<NodeJS.Timeout | null>(null)
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
}
fetchAnswerData() // 立即获取
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()
}, 3000)
}
@ -437,6 +669,14 @@ watch([currentGroupId, currentQuestionId], () => {
}
})
watch(() => currentQuestionDetailID.value, (newVal) => {
console.log(newVal)
if (newVal) {
fetchQuestionDetail(Number(newVal))
}
}, { immediate: true })
onMounted(async () => {
// 并行拉取分组、题目与当前题目,完成后做一次同步
await Promise.all([fetchGroups(), fetchQuestions(), fetchCurrentQuestion()])
@ -498,12 +738,12 @@ onUnmounted(() => {
</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>
<div class="text-base text-green-900 font-medium leading-relaxed">
{{ currentQuestion.Answer }}
{{ questionInfo.Answer }}
</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'),
]"
>
<!-- 图片上方的标签 -->
<div class="mb-2 text-center text-lg text-gray-700 font-bold">
{{ item.AnswerText || '答案' }}
<div v-if="item.AnswerText" class="text-lg text-gray-800 font-bold">
<span> ai识别出的答题文本</span>
<Typewriter :text="item.AnswerText" />
</div>
<!-- AI Suggestion Indicator -->
<div
v-if="!item._isManual"
class="mb-2 flex items-center justify-center gap-1 text-xs text-orange-500 font-bold"
>
<div class="i-carbon-ai-status" />
AI 推荐: {{ item.Status === 1 ? '正确' : '错误' }}
</div>
<!-- Manual Calibration Indicator -->
<div
v-else
class="mb-2 flex items-center justify-center gap-1 text-xs text-green-600 font-bold"
>
<div class="i-carbon-user-avatar-filled-alt" />
已人工校准: {{ item.Status === 1 ? '正确' : '错误' }}
<div class="mb-2 flex items-center justify-center gap-2 text-xs font-bold">
<!-- AI 推荐 -->
<div class="flex items-center gap-1 text-orange-500">
<div class="i-carbon-ai-status" />
<span>AI: {{ item._aiScore }} ({{ item._aiStatus === 1 ? '对' : '错' }})</span>
</div>
<!-- 分隔符 -->
<div class="h-3 w-[1px] bg-gray-300" />
<!-- 当前状态 -->
<div v-if="!item._isManual" class="text-gray-400">
跟随 AI
</div>
<div v-else class="flex items-center gap-1 text-green-600">
<div class="i-carbon-user-avatar-filled-alt" />
<span>人工: {{ item.Status === 1 ? '对' : '错' }}</span>
</div>
</div>
<!-- 图片展示 -->
<div class="flex items-center justify-center">
@ -571,10 +813,16 @@ onUnmounted(() => {
>
<!-- 如果未校准显示两个按钮 -->
<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 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>
</template>
@ -603,8 +851,8 @@ onUnmounted(() => {
<div
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>
@ -613,12 +861,13 @@ onUnmounted(() => {
<!-- List Layout: 主观题 -> Split View (Image Left, Scoring Right) -->
<div v-else class="w-full flex flex-col gap-6">
<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"
>
<!-- Title -->
<div class="text-lg text-gray-800 font-bold">
{{ idx + 1 }}. {{ item.AnswerText || '题目' }} (汉字加一加)
<span> ai识别出的答题文本</span>
<Typewriter :text="item.AnswerText || '题目'" />
</div>
<div class="flex flex-col gap-6 lg:flex-row">
@ -630,6 +879,7 @@ onUnmounted(() => {
<div class="i-carbon-image" />
主观题原图展示区
</div>
<div class="h-full flex items-center justify-center">
<NImage
v-if="item.AnswerValuePicture || item.imageUrl"
@ -651,25 +901,56 @@ onUnmounted(() => {
<div class="mt-1 text-sm text-gray-500">
请根据对的字数进行打分
</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">
<div class="i-carbon-ai-status" />
AI 推荐: {{ item.Score }}
</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">
<div class="i-carbon-user-avatar-filled-alt" />
已人工校准: {{ item.Score }}
<!-- 评分状态展示区域明确区分 AI 推荐和人工干预状态 -->
<div class="mt-2 flex flex-col gap-2">
<!-- AI 推荐信息 (始终显示作为参考) -->
<div
class="flex items-center justify-between border border-gray-100 rounded bg-gray-50 px-3 py-2"
>
<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>
<!-- Score Input -->
<div class="flex flex-col gap-2">
<div class="text-sm text-gray-600 font-medium">
最终得分
最终得分 (人工)
</div>
<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"
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>
@ -682,13 +963,13 @@ onUnmounted(() => {
<div class="text-sm text-gray-600 font-medium">
快捷打分
</div>
<div class="grid grid-cols-2 gap-3">
<div class="grid grid-cols-4 gap-2">
<NButton
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)"
>
{{ score }}
{{ score }}
</NButton>
</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 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 isCompleted = ref(false)
@ -123,7 +123,7 @@ async function fetchGetGameStatisticsData() {
const _params = {
TeamGroupID: Number(groupsId.value),
QuestionID: Number(QuestionID.value),
QuestionDetaiID: Number(QuestionDetaiID.value),
QuestionDetaiID: Number(QuestionDetailID.value),
}
const { data } = await fetchGetGameStatistics(_params)
teams.value = (data?.data as any[]) || []

View File

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

View File

@ -130,7 +130,15 @@ async function handleNext() {
// 点击开始答题
if (!isStarted.value) {
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 {
@ -207,10 +215,34 @@ async function fetchGetGameStatisticsData(_params: Api.Competition.QuestionAddPa
// 使用 Map 去重,以 TeamId 为准,保留最新的状态
const teamMap = new Map()
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, {
group: item.TeamName || '未知队伍',
total: item.Points || 0,
correct: item.ResultPotins || 0,
total: answerCount, // 答题数量
correct: item.Points || 0, // 预估得分 (使用外层 Points)
})
})
chartData.value = Array.from(teamMap.values())

View File

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

View File

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

View File

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

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

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

50
pnpm-lock.yaml generated
View File

@ -16,14 +16,14 @@ importers:
specifier: workspace:*
version: link:packages/eslint-config
eslint:
specifier: latest
specifier: ^9.39.2
version: 9.39.2(jiti@2.6.1)
eslint-plugin-format:
specifier: ^1.3.1
version: 1.3.1(eslint@9.39.2(jiti@2.6.1))
lint-staged:
specifier: latest
version: 16.2.7
version: 16.3.2
simple-git-hooks:
specifier: latest
version: 2.13.1
@ -117,6 +117,9 @@ importers:
tailwind-merge:
specifier: 3.4.0
version: 3.4.0
typeit:
specifier: ^8.8.7
version: 8.8.7
v-scale-screen:
specifier: ^2.3.0
version: 2.3.0(vue@3.5.26(typescript@5.9.3))
@ -1496,6 +1499,9 @@ packages:
'@types/unist@3.0.3':
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':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
@ -2363,8 +2369,8 @@ packages:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
commander@14.0.2:
resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
commander@14.0.3:
resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
engines: {node: '>=20'}
commander@7.2.0:
@ -3299,6 +3305,7 @@ packages:
glob@10.5.0:
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
glob@13.0.0:
@ -3846,8 +3853,8 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
lint-staged@16.2.7:
resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==}
lint-staged@16.3.2:
resolution: {integrity: sha512-xKqhC2AeXLwiAHXguxBjuChoTTWFC6Pees0SHPwOpwlvI3BH7ZADFPddAdN3pgo3aiKgPUx/bxE78JfUnxQnlg==}
engines: {node: '>=20.17'}
hasBin: true
@ -4202,10 +4209,6 @@ packages:
namespace-emitter@2.0.1:
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:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -4464,11 +4467,6 @@ packages:
resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
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:
resolution: {integrity: sha512-WHOqh2esDlR3eAaknPbqXrkkj0D24h8shrDPqysgCFR6ghqP/fpFfJmMPJp0gETHsvrh9YNNg6dQfo2OEtDnIQ==}
peerDependencies:
@ -5352,6 +5350,9 @@ packages:
resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==}
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:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
@ -6817,6 +6818,8 @@ snapshots:
'@types/unist@3.0.3': {}
'@types/web-animations-js@2.2.16': {}
'@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)':
@ -7906,7 +7909,7 @@ snapshots:
dependencies:
delayed-stream: 1.0.0
commander@14.0.2: {}
commander@14.0.3: {}
commander@7.2.0: {}
@ -9512,14 +9515,13 @@ snapshots:
lines-and-columns@1.2.4: {}
lint-staged@16.2.7:
lint-staged@16.3.2:
dependencies:
commander: 14.0.2
commander: 14.0.3
listr2: 9.0.5
micromatch: 4.0.8
nano-spawn: 2.0.0
pidtree: 0.6.0
string-argv: 0.3.2
tinyexec: 1.0.2
yaml: 2.8.2
listr2@9.0.5:
@ -10071,8 +10073,6 @@ snapshots:
namespace-emitter@2.0.1: {}
nano-spawn@2.0.0: {}
nanoid@3.3.11: {}
nanoid@5.1.6: {}
@ -10315,8 +10315,6 @@ snapshots:
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))):
dependencies:
defu: 6.1.4
@ -11322,6 +11320,10 @@ snapshots:
typed-array-buffer: 1.0.3
typed-array-byte-offset: 1.0.4
typeit@8.8.7:
dependencies:
'@types/web-animations-js': 2.2.16
typescript@5.9.3: {}
ufo@1.6.1: {}