Compare commits
2 Commits
ed3c815cd7
...
8469e16638
| Author | SHA1 | Date | |
|---|---|---|---|
| 8469e16638 | |||
| e8cd6732d7 |
@ -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",
|
||||
|
||||
32
apps/admin/src/assets/imgs/user/rank-title.svg
Normal file
32
apps/admin/src/assets/imgs/user/rank-title.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 429 KiB |
45
apps/admin/src/components/custom/typeit/index.vue
Normal file
45
apps/admin/src/components/custom/typeit/index.vue
Normal 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>
|
||||
@ -5,6 +5,11 @@ export enum PublishStatus {
|
||||
Finished = 3,
|
||||
}
|
||||
|
||||
export enum RankPublishStatus {
|
||||
Unpublished = 0,
|
||||
Published = 1,
|
||||
}
|
||||
|
||||
export enum QuestionType {
|
||||
SingleChoice = 'SingleChoice', // 单选题
|
||||
MultipleChoice = 'MultipleChoice', // 多选题
|
||||
|
||||
@ -258,6 +258,7 @@ const local: App.I18n.Schema = {
|
||||
'results_results-list': 'Results List',
|
||||
'results_results-detail': 'Results Detail',
|
||||
'test': 'Test',
|
||||
'user_rank-list': 'User Rank List',
|
||||
},
|
||||
page: {
|
||||
login: {
|
||||
|
||||
@ -254,6 +254,7 @@ const local: App.I18n.Schema = {
|
||||
'results_results-list': '实时结果列表',
|
||||
'results_results-detail': '实时结果详情',
|
||||
'test': 'Test',
|
||||
'user_rank-list': '用户排名列表',
|
||||
},
|
||||
page: {
|
||||
login: {
|
||||
|
||||
@ -28,7 +28,6 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
|
||||
"question-store": () => import("@/views/question-store/index.vue"),
|
||||
"rank_rank-detail": () => import("@/views/rank/rank-detail/index.vue"),
|
||||
"rank_rank-list": () => import("@/views/rank/rank-list/index.vue"),
|
||||
"results_results-detail-copy": () => import("@/views/results/results-detail-copy/index.vue"),
|
||||
"results_results-detail": () => import("@/views/results/results-detail/index.vue"),
|
||||
"results_results-list": () => import("@/views/results/results-list/index.vue"),
|
||||
"template_template-detail": () => import("@/views/template/template-detail/index.vue"),
|
||||
@ -40,6 +39,8 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
|
||||
user_game: () => import("@/views/user/game/index.vue"),
|
||||
user_groups: () => import("@/views/user/groups/index.vue"),
|
||||
user_home: () => import("@/views/user/home/index.vue"),
|
||||
"user_rank-list": () => import("@/views/user/rank-list/index.vue"),
|
||||
"user_rank-pending": () => import("@/views/user/rank-pending/index.vue"),
|
||||
user_rules: () => import("@/views/user/rules/index.vue"),
|
||||
user_teams: () => import("@/views/user/teams/index.vue"),
|
||||
};
|
||||
|
||||
@ -197,16 +197,6 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
hideInMenu: true
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'results_results-detail-copy',
|
||||
path: '/results/results-detail-copy',
|
||||
component: 'view.results_results-detail-copy',
|
||||
meta: {
|
||||
title: 'results_results-detail-copy',
|
||||
i18nKey: 'route.results_results-detail-copy',
|
||||
hideInMenu: true
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'results_results-list',
|
||||
path: '/results/results-list',
|
||||
@ -341,6 +331,24 @@ export const generatedRoutes: GeneratedRoute[] = [
|
||||
constant: true
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'user_rank-list',
|
||||
path: '/user/rank-list',
|
||||
component: 'view.user_rank-list',
|
||||
meta: {
|
||||
title: 'user_rank-list',
|
||||
i18nKey: 'route.user_rank-list'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'user_rank-pending',
|
||||
path: '/user/rank-pending',
|
||||
component: 'view.user_rank-pending',
|
||||
meta: {
|
||||
title: 'user_rank-pending',
|
||||
i18nKey: 'route.user_rank-pending'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'user_rules',
|
||||
path: '/user/rules',
|
||||
|
||||
@ -180,7 +180,6 @@ const routeMap: RouteMap = {
|
||||
"rank_rank-list": "/rank/rank-list",
|
||||
"results": "/results",
|
||||
"results_results-detail": "/results/results-detail",
|
||||
"results_results-detail-copy": "/results/results-detail-copy",
|
||||
"results_results-list": "/results/results-list",
|
||||
"template": "/template",
|
||||
"template_template-detail": "/template/template-detail",
|
||||
@ -193,6 +192,8 @@ const routeMap: RouteMap = {
|
||||
"user_game": "/user/game",
|
||||
"user_groups": "/user/groups",
|
||||
"user_home": "/user/home",
|
||||
"user_rank-list": "/user/rank-list",
|
||||
"user_rank-pending": "/user/rank-pending",
|
||||
"user_rules": "/user/rules",
|
||||
"user_teams": "/user/teams"
|
||||
};
|
||||
|
||||
@ -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',
|
||||
})
|
||||
}
|
||||
|
||||
@ -1,10 +1,62 @@
|
||||
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',
|
||||
})
|
||||
}
|
||||
|
||||
/** 获取活动排行列表 */
|
||||
export function fetchActivityRankList(PageIndex: number, PageSize: number = 10) {
|
||||
return request<App.Service.Response<Api.Rank.ActivityRankList>>({
|
||||
url: `/Base/ActivityMain/GetActivity_Main_TotalPager?PageIndex=${PageIndex}&PageSizes=${PageSize}`,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
/** 修改排名的队伍分数 */
|
||||
export function updateTeamScore(data: Api.Rank.UpdateTeamScoreParams[], activityId: number) {
|
||||
return request<App.Service.Response>({
|
||||
url: `/Base/ActivityMain/UpdateTeamQuestionResultRecore/?ActivityID=${activityId}`,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
||||
/** 发布排名,更新状态 */
|
||||
export function publishRank(Id: number, Status = 1) {
|
||||
return request<App.Service.Response>({
|
||||
url: `/Base/ActivityMain/UpdateResultRecoreStatus`,
|
||||
method: 'post',
|
||||
data: {
|
||||
Id,
|
||||
Status,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
/** 获取用户排名列表 */
|
||||
export function fetchUserRankList(MainID: number, RoundType: number = 0) {
|
||||
return request<App.Service.Response<Api.Rank.ActivityRankResList>>({
|
||||
url: `/Base/ActivityMain/GetTeamsTotalList?MainID=${MainID}&RoundType=${RoundType}`,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
@ -10,19 +10,19 @@ 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 },
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
||||
/** 评委更新状态 (Correct/Wrong) */
|
||||
export function updateScoreStatus(Id: number, Status: number) {
|
||||
/** 结束活动时候调用 */
|
||||
export function endActivity(ActivityID: number) {
|
||||
return request<App.Service.Response>({
|
||||
url: `/Base/ActivityMain/UpdateTeamQuestionUseOneStatus?Id=${Id}&Status=${Status}`,
|
||||
url: `/Base/ActivityMain/AddOrUpdateActivity_Main_Total?ActivityID=${ActivityID}`,
|
||||
method: 'post',
|
||||
data: { Id, Status },
|
||||
data: { ActivityID },
|
||||
})
|
||||
}
|
||||
|
||||
8
apps/admin/src/typings/api/Competition.d.ts
vendored
8
apps/admin/src/typings/api/Competition.d.ts
vendored
@ -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 {
|
||||
|
||||
51
apps/admin/src/typings/api/rank.d.ts
vendored
51
apps/admin/src/typings/api/rank.d.ts
vendored
@ -31,6 +31,57 @@ declare namespace Api {
|
||||
/** common search params of table */
|
||||
type CommonSearchParams = Pick<Common.PaginatingCommonParams, 'currentPage' | 'pageSize'>
|
||||
|
||||
interface ActivityRankResList extends Array<ActivityRankItem> {}
|
||||
|
||||
interface ActivityRankItem {
|
||||
TeamID: number
|
||||
Name: string
|
||||
TotalPoint: number
|
||||
Questions: QuestionScore[]
|
||||
}
|
||||
|
||||
interface QuestionScore {
|
||||
QuestionNO: number
|
||||
ResultPotin: number
|
||||
}
|
||||
|
||||
interface ActivityRankList {
|
||||
Items: ActivityRank[]
|
||||
TotalRecords: number
|
||||
PageNumber: number
|
||||
PageSize: number
|
||||
TotalPages: number
|
||||
}
|
||||
|
||||
interface UpdateTeamScoreParams {
|
||||
/** 主活动 ID */
|
||||
ActivityID: number
|
||||
|
||||
Id: number
|
||||
/** 结果得分 */
|
||||
ResultPotins: number
|
||||
}
|
||||
|
||||
/** activity rank */
|
||||
interface ActivityRank {
|
||||
/** activity id */
|
||||
Id: number
|
||||
/** activity id (MainID) */
|
||||
ActivityId: number
|
||||
/** activity name */
|
||||
ActivityName: string
|
||||
/** start time */
|
||||
StartTime: string
|
||||
/** team number */
|
||||
TeamNum: number
|
||||
/** max point */
|
||||
MaxPoint: number
|
||||
/** last update time */
|
||||
LastUpdatetime: string
|
||||
/** is publish */
|
||||
Status: number
|
||||
}
|
||||
|
||||
/**
|
||||
* enable status
|
||||
*
|
||||
|
||||
8
apps/admin/src/typings/components.d.ts
vendored
8
apps/admin/src/typings/components.d.ts
vendored
@ -28,6 +28,8 @@ 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:roundStopCircle': typeof import('~icons/ic/round-stop-circle')['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 +50,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 +177,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 +202,8 @@ 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:roundStopCircle': typeof import('~icons/ic/round-stop-circle')['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 +224,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 +351,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']
|
||||
|
||||
6
apps/admin/src/typings/elegant-router.d.ts
vendored
6
apps/admin/src/typings/elegant-router.d.ts
vendored
@ -34,7 +34,6 @@ declare module "@elegant-router/types" {
|
||||
"rank_rank-list": "/rank/rank-list";
|
||||
"results": "/results";
|
||||
"results_results-detail": "/results/results-detail";
|
||||
"results_results-detail-copy": "/results/results-detail-copy";
|
||||
"results_results-list": "/results/results-list";
|
||||
"template": "/template";
|
||||
"template_template-detail": "/template/template-detail";
|
||||
@ -47,6 +46,8 @@ declare module "@elegant-router/types" {
|
||||
"user_game": "/user/game";
|
||||
"user_groups": "/user/groups";
|
||||
"user_home": "/user/home";
|
||||
"user_rank-list": "/user/rank-list";
|
||||
"user_rank-pending": "/user/rank-pending";
|
||||
"user_rules": "/user/rules";
|
||||
"user_teams": "/user/teams";
|
||||
};
|
||||
@ -123,7 +124,6 @@ declare module "@elegant-router/types" {
|
||||
| "question-store"
|
||||
| "rank_rank-detail"
|
||||
| "rank_rank-list"
|
||||
| "results_results-detail-copy"
|
||||
| "results_results-detail"
|
||||
| "results_results-list"
|
||||
| "template_template-detail"
|
||||
@ -135,6 +135,8 @@ declare module "@elegant-router/types" {
|
||||
| "user_game"
|
||||
| "user_groups"
|
||||
| "user_home"
|
||||
| "user_rank-list"
|
||||
| "user_rank-pending"
|
||||
| "user_rules"
|
||||
| "user_teams"
|
||||
>;
|
||||
|
||||
@ -3,6 +3,7 @@ import { NButton, NGi, NGrid, NSpace } from 'naive-ui'
|
||||
import { computed, onMounted, ref } from 'vue'
|
||||
import { useRouterPush } from '@/hooks/common/router'
|
||||
import { fetchCopyActivity, fetchDeleteActivity, fetchGetActivityList } from '@/service/api/competition'
|
||||
import { endActivity } from '@/service/api/result'
|
||||
import { useAppStore } from '@/store/modules/app'
|
||||
import CompetitionAddModal from '../competition-add/index.vue'
|
||||
|
||||
@ -94,6 +95,39 @@ function toDetail(item: Api.Competition.CompetitionItem) {
|
||||
routerPushByKey('competition_competition-detail', { query: { Id: item.Id.toString() } })
|
||||
}
|
||||
|
||||
async function handleCloseActivity(item: Api.Competition.CompetitionItem) {
|
||||
const d = window.$dialog?.warning({
|
||||
title: '确认结束',
|
||||
content: `确定结束活动:${item.Name}吗?结束活动后将生成排行榜数据。`,
|
||||
positiveText: '确认结束',
|
||||
negativeText: '取消',
|
||||
onPositiveClick: async () => {
|
||||
if (d) {
|
||||
d.loading = true
|
||||
}
|
||||
try {
|
||||
const { error } = await endActivity(item.Id)
|
||||
if (error) {
|
||||
window.$message?.error(error.message || '结束活动失败')
|
||||
return false
|
||||
}
|
||||
window.$message?.success(`已结束活动:${item.Name}`)
|
||||
fetchActivityList()
|
||||
return true
|
||||
}
|
||||
catch (e: any) {
|
||||
window.$message?.error(e.message || '操作失败')
|
||||
return false
|
||||
}
|
||||
finally {
|
||||
if (d) {
|
||||
d.loading = false
|
||||
}
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => fetchActivityList())
|
||||
</script>
|
||||
|
||||
@ -122,7 +156,7 @@ onMounted(() => fetchActivityList())
|
||||
<!-- 响应式布局:手机1列,平板2列,中屏3列,大屏4列 -->
|
||||
<NGrid :x-gap="gap" :y-gap="gap" responsive="screen" item-responsive>
|
||||
<NGi v-for="item in competitionListRef" :key="item.Id" span="24 s:12 m:8 l:6" @click="toDetail(item)">
|
||||
<CompetitionCard :item="item" @copy="handleCopy" @delete="handleDelete" />
|
||||
<CompetitionCard :item="item" @copy="handleCopy" @delete="handleDelete" @close="handleCloseActivity" />
|
||||
</NGi>
|
||||
</NGrid>
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@ const props = defineProps<Props>()
|
||||
const emit = defineEmits<{
|
||||
(e: 'copy', item: Api.Competition.CompetitionItem): void
|
||||
(e: 'delete', item: Api.Competition.CompetitionItem): void
|
||||
(e: 'close', item: Api.Competition.CompetitionItem): void
|
||||
}>()
|
||||
|
||||
const { options: publishStatusOptions } = useDict('publish_status')
|
||||
@ -83,6 +84,20 @@ const decorationBgClass = computed(() => {
|
||||
<div
|
||||
class="absolute right-4 top-4 z-20 flex gap-2 opacity-0 transition-opacity duration-300 group-hover:opacity-100"
|
||||
>
|
||||
<NTooltip v-if="[PublishStatus.Published, PublishStatus.Processing].includes(item.PublishStatus)">
|
||||
<template #trigger>
|
||||
<NButton
|
||||
circle secondary size="small" type="warning"
|
||||
class="shadow-sm backdrop-blur-sm !bg-white/80 hover:!bg-orange-50" @click.stop="emit('close', item)"
|
||||
>
|
||||
<template #icon>
|
||||
<icon-ic:round-stop-circle class="text-icon" />
|
||||
</template>
|
||||
</NButton>
|
||||
</template>
|
||||
结束活动
|
||||
</NTooltip>
|
||||
|
||||
<NTooltip>
|
||||
<template #trigger>
|
||||
<NButton
|
||||
|
||||
@ -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: '操作',
|
||||
|
||||
@ -1,14 +1,25 @@
|
||||
<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 { RankPublishStatus } from '@/enum/business'
|
||||
import { fetchRankDetail, fetchTeamQuestionScore, publishRank, updateTeamScore } from '@/service/api/rank'
|
||||
import RankHeader from './modules/rank-header.vue'
|
||||
import TeamItem from './modules/team-item.vue'
|
||||
|
||||
import TeamListHeader from './modules/team-list-header.vue'
|
||||
|
||||
const competitionInfo = {
|
||||
name: '阅读之星-辞海遨游环节 (2026)',
|
||||
date: '2026.01.12',
|
||||
}
|
||||
const route = useRoute()
|
||||
const message = useMessage()
|
||||
const activityId = route.query.activityId as string
|
||||
const id = route.query.id as string
|
||||
|
||||
const Status = ref(Number(route.query.Status))
|
||||
|
||||
const competitionInfo = ref({
|
||||
name: route.query.name as string || '阅读之星-辞海遨游环节 (2026)',
|
||||
date: route.query.date as string || '2026.01.12',
|
||||
})
|
||||
|
||||
interface TeamData {
|
||||
id: number
|
||||
@ -19,97 +30,213 @@ 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
|
||||
}
|
||||
|
||||
// console.log(data, 'data')
|
||||
// 假设后端返回的数据结构需要映射
|
||||
teamList.value = (data?.data || []).map((item: any, index: number) => ({
|
||||
id: item.TeamID,
|
||||
rank: index + 1,
|
||||
name: item.Name,
|
||||
group: '默认组', // 接口没有组名,暂时用默认
|
||||
correctCount: '0 / 0',
|
||||
totalScore: item.TotalPoint || 0,
|
||||
updateTime: '', // 暂时用当前时间
|
||||
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 || '获取队伍题目分数失败')
|
||||
}
|
||||
}
|
||||
|
||||
function handlePublish() {
|
||||
window.$message?.success('本场榜单发布成功')
|
||||
onMounted(() => {
|
||||
getRankDetail()
|
||||
})
|
||||
|
||||
async function toggleExpand(team: TeamData) {
|
||||
team.isExpanded = !team.isExpanded
|
||||
|
||||
if (team.isExpanded && Object.keys(team.scores).length === 0) {
|
||||
await getTeamQuestionScore(team)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存队伍的分数
|
||||
* @param 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,
|
||||
ActivityID: Number(activityId),
|
||||
}))
|
||||
|
||||
if (scoreList.length === 0) {
|
||||
message.warning('没有可保存的分数')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const { error } = await updateTeamScore(scoreList, Number(activityId))
|
||||
if (error) {
|
||||
message.error(error.message || '保存分数失败')
|
||||
return
|
||||
}
|
||||
message.success(`已保存 ${team.name} 的分数变动`)
|
||||
team.isExpanded = false
|
||||
team.updateTime = new Date().toLocaleString()
|
||||
await getRankDetail()
|
||||
}
|
||||
catch (e: any) {
|
||||
message.error(e.message || '保存分数失败')
|
||||
}
|
||||
}
|
||||
|
||||
async function handlePublish() {
|
||||
if (Status.value === RankPublishStatus.Published) {
|
||||
message.warning('本场榜单已发布,请勿重复发布')
|
||||
return
|
||||
}
|
||||
|
||||
const d = window.$dialog?.warning({
|
||||
title: '确认发布',
|
||||
content: '确定要发布本场榜单吗?发布后终端将可见结果。',
|
||||
positiveText: '确认发布',
|
||||
negativeText: '取消',
|
||||
onPositiveClick: async () => {
|
||||
if (d) {
|
||||
d.loading = true
|
||||
}
|
||||
try {
|
||||
const { error } = await publishRank(Number(id))
|
||||
if (error) {
|
||||
message.error(error.message || '发布失败')
|
||||
return false
|
||||
}
|
||||
message.success('本场榜单发布成功')
|
||||
Status.value = RankPublishStatus.Published
|
||||
return true
|
||||
}
|
||||
catch (e: any) {
|
||||
message.error(e.message || '发布失败')
|
||||
return false
|
||||
}
|
||||
finally {
|
||||
if (d) {
|
||||
d.loading = false
|
||||
}
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
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 +245,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 +256,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>
|
||||
|
||||
@ -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="100" 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>
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -1,14 +1,16 @@
|
||||
<script setup lang="tsx">
|
||||
import dayjs from 'dayjs'
|
||||
import { NButton, NCard, NTag } from 'naive-ui'
|
||||
import { reactive } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { defaultTransform, useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table'
|
||||
import { fetchRankList } from '@/service/api'
|
||||
import { RankPublishStatus } from '@/enum/business'
|
||||
import { useRouterPush } from '@/hooks/common/router'
|
||||
import { useNaivePaginatedTable, useTableOperate } from '@/hooks/common/table'
|
||||
import { fetchActivityRankList } from '@/service/api/rank'
|
||||
import { useAppStore } from '@/store/modules/app'
|
||||
import RankSearch from './modules/rank-search.vue'
|
||||
|
||||
const appStore = useAppStore()
|
||||
const router = useRouter()
|
||||
const { routerPushByKey } = useRouterPush()
|
||||
|
||||
const searchParams: Api.Rank.UserSearchParams = reactive({
|
||||
currentPage: 1,
|
||||
@ -19,34 +21,33 @@ const searchParams: Api.Rank.UserSearchParams = reactive({
|
||||
|
||||
const rankTitle = '排行榜管理列表'
|
||||
|
||||
const statusMap: Record<string, string> = {
|
||||
1: '已发布',
|
||||
2: '待审核',
|
||||
const statusMap: Record<number, string> = {
|
||||
[RankPublishStatus.Published]: '已发布',
|
||||
[RankPublishStatus.Unpublished]: '未发布',
|
||||
}
|
||||
|
||||
const { columns, data, getData, getDataByPage, loading, mobilePagination } = useNaivePaginatedTable({
|
||||
api: () => fetchRankList(searchParams as any),
|
||||
api: () => fetchActivityRankList(searchParams.currentPage, searchParams.pageSize),
|
||||
transform: (response) => {
|
||||
const transformed = defaultTransform(response)
|
||||
// Mocking data for Rank Management based on User API response
|
||||
const mockCompetitions = ['阅读之星-辞海遨游环节 (2026)', '古诗词大会年度精英巅峰赛', '趣味百科常识挑战周']
|
||||
const mockDates = ['2026.01.12', '2026.01.15', '2026.01.18']
|
||||
const mockScales = ['40 支队伍', '24 支队伍', '60 支队伍']
|
||||
const mockScores = ['145', '180', '120']
|
||||
const mockTimes = ['2026-01-22 16:30:12', '2026-01-22 12:00:00', '2026-01-21 18:22:45']
|
||||
const rawData = response.data?.data as unknown as Api.Rank.ActivityRankList || {}
|
||||
|
||||
transformed.data.forEach((item: any, index) => {
|
||||
const mockIndex = index % 3
|
||||
item.competitionActivityName = mockCompetitions[mockIndex] // Competition Name
|
||||
item.competitionActivityDate = mockDates[mockIndex] // Activity Date (using userEmail field)
|
||||
item.competitionTeamScale = mockScales[mockIndex] // Team Scale (using userPhone field)
|
||||
item.competitionMaxScore = mockScores[mockIndex] // Max Score (using nickName field)
|
||||
// item.createTime is typically available, we'll simulate update time
|
||||
item.createTime = mockTimes[mockIndex]
|
||||
// Status: 1 (Published), 2 (Pending)
|
||||
item.status = (index % 2 === 0) ? '2' : '1'
|
||||
})
|
||||
return transformed
|
||||
return {
|
||||
data: (rawData?.Items || []).map((item) => {
|
||||
return {
|
||||
ActivityId: item.ActivityId,
|
||||
id: item.Id,
|
||||
competitionActivityName: item.ActivityName,
|
||||
competitionActivityDate: item.StartTime ? dayjs(item.StartTime).format('YYYY-MM-DD') : '',
|
||||
competitionTeamScale: `${item.TeamNum} 支队伍`,
|
||||
competitionMaxScore: item.MaxPoint,
|
||||
createTime: item.LastUpdatetime ? dayjs(item.LastUpdatetime).format('YYYY-MM-DD HH:mm:ss') : '',
|
||||
status: item.Status,
|
||||
}
|
||||
}),
|
||||
pageNum: rawData?.PageNumber || 1,
|
||||
pageSize: rawData?.PageSize || 10,
|
||||
total: rawData?.TotalRecords || 0,
|
||||
}
|
||||
},
|
||||
onPaginationParamsChange: (params) => {
|
||||
searchParams.currentPage = params.page || 1
|
||||
@ -63,7 +64,7 @@ const { columns, data, getData, getDataByPage, loading, mobilePagination } = use
|
||||
align: 'center',
|
||||
key: 'index',
|
||||
width: 80,
|
||||
render: (row, index) => index + 1,
|
||||
render: (_row, index) => index + 1,
|
||||
},
|
||||
{
|
||||
key: 'competitionActivityName',
|
||||
@ -102,11 +103,10 @@ const { columns, data, getData, getDataByPage, loading, mobilePagination } = use
|
||||
title: '发布状态',
|
||||
align: 'center',
|
||||
render: (row) => {
|
||||
if (row.status === null)
|
||||
if (row.status === null || row.status === undefined)
|
||||
return null
|
||||
const label = statusMap[row.status] || '未知'
|
||||
// 1: Published (Success/Green), 2: Pending (Warning/Orange)
|
||||
return <NTag type={row.status === '1' ? 'success' : 'warning'}>{label}</NTag>
|
||||
const label = statusMap[Number(row.status)] || '未知'
|
||||
return <NTag type={Number(row.status) === RankPublishStatus.Published ? 'success' : 'warning'}>{label}</NTag>
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -115,7 +115,7 @@ const { columns, data, getData, getDataByPage, loading, mobilePagination } = use
|
||||
align: 'center',
|
||||
render: row => (
|
||||
<div class="flex-center">
|
||||
<NButton type="primary" text onClick={() => edit(row.id)}>
|
||||
<NButton type="primary" text onClick={() => edit(row)}>
|
||||
进入排行详情
|
||||
</NButton>
|
||||
</div>
|
||||
@ -128,13 +128,20 @@ const {
|
||||
checkedRowKeys,
|
||||
} = useTableOperate(data, 'id', getData)
|
||||
|
||||
function edit(id: number) {
|
||||
router.push({ name: 'rank_rank-detail', query: { id } })
|
||||
function edit(item: any) {
|
||||
routerPushByKey('rank_rank-detail', {
|
||||
query: {
|
||||
activityId: item.ActivityId,
|
||||
name: item.competitionActivityName,
|
||||
date: item.competitionActivityDate,
|
||||
Status: item.status,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
function handleBatchPublish() {
|
||||
window.$message?.success('批量发布成功')
|
||||
}
|
||||
// function handleBatchPublish() {
|
||||
// window.$message?.success('批量发布成功')
|
||||
// }
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@ -151,12 +158,12 @@ function handleBatchPublish() {
|
||||
您可以对所有比赛场次的最终积分进行核对、修正,并正式发布结果。
|
||||
</div>
|
||||
</div>
|
||||
<NButton type="primary" ghost class="ml-auto" @click="handleBatchPublish">
|
||||
<!-- <NButton type="primary" ghost class="ml-auto" @click="handleBatchPublish">
|
||||
<template #icon>
|
||||
<icon-ic-round-upload class="text-icon" />
|
||||
</template>
|
||||
批量发布至终端
|
||||
</NButton>
|
||||
</NButton> -->
|
||||
</div>
|
||||
</template>
|
||||
<!-- <template #header-extra>
|
||||
|
||||
@ -1,248 +0,0 @@
|
||||
<script lang="ts" setup>
|
||||
import { useIntervalFn } from '@vueuse/core'
|
||||
import { NButton } from 'naive-ui'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { computed, onUnmounted, ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { fetchUpdateCurrentQuestionUse } from '@/service/api/result'
|
||||
import { useActivityInfoStore } from '@/store/modules/activityinfo'
|
||||
import GroupTabs, { type GroupItem } from './modules/GroupTabs.vue'
|
||||
import TeamResultCard, { type AICharacter, type TeamResult } from './modules/TeamResultCard.vue'
|
||||
|
||||
const activityInfoStore = useActivityInfoStore()
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars
|
||||
const { activityId, groupId } = storeToRefs(activityInfoStore)
|
||||
|
||||
const route = useRoute()
|
||||
const TeamGroupID = computed(() => route.query?.TeamGroupID as string)
|
||||
|
||||
// --- 模拟数据和状态 ---
|
||||
|
||||
const groups = ref<GroupItem[]>(Array.from({ length: 8 }).map((_, i) => ({
|
||||
id: i + 1,
|
||||
name: `第 ${i + 1} 组`,
|
||||
})))
|
||||
|
||||
const currentGroupId = ref<number | string>(1) // 当前选中的组别 ID
|
||||
const teamsData = ref<TeamResult[]>([]) // 当前组别下的队伍数据
|
||||
const isPolling = ref(true) // 是否正在轮询
|
||||
|
||||
// 初始化某组的队伍结构
|
||||
function initGroupTeams(gid: number | string) {
|
||||
return Array.from({ length: 4 }).map((_, i) => ({
|
||||
id: `${gid}-${i + 1}`,
|
||||
name: `第 ${i + 1} 队`,
|
||||
correctCount: 0,
|
||||
score: 0,
|
||||
imageUrl: 'https://oss.qyzhjy.com/temp/1769653751992/a4.jpg',
|
||||
status: 'pending' as const,
|
||||
aiData: [],
|
||||
}))
|
||||
}
|
||||
|
||||
// 初始化数据
|
||||
teamsData.value = initGroupTeams(currentGroupId.value)
|
||||
|
||||
// --- 轮询 / 模拟逻辑 ---
|
||||
|
||||
// 存储人工修正记录,以便在更新时保留
|
||||
// Map<TeamID, Map<CharID, boolean>>
|
||||
const manualCorrections = ref<Record<string, Record<string, boolean>>>({})
|
||||
|
||||
function mergeAIResults(currentData: TeamResult[], incomingData: Record<string, AICharacter[]>) {
|
||||
currentData.forEach((team) => {
|
||||
const newChars = incomingData[team.id] || []
|
||||
if (newChars.length === 0)
|
||||
return
|
||||
|
||||
team.status = 'analyzing'
|
||||
|
||||
// 合并逻辑:
|
||||
// 1. 现有字符:如果需要更新,但要保留人工修正的状态?
|
||||
// 目前假设 AI 返回的结果是稳定的,但可能会有更多字符。
|
||||
// 2. 新字符:追加。
|
||||
|
||||
// 简单方法:替换列表但应用人工覆盖
|
||||
const mergedChars = newChars.map((char) => {
|
||||
const teamCorrections = manualCorrections.value[team.id] || {}
|
||||
if (typeof teamCorrections[char.id] !== 'undefined') {
|
||||
return { ...char, isCorrect: teamCorrections[char.id] }
|
||||
}
|
||||
return char
|
||||
})
|
||||
|
||||
team.aiData = mergedChars
|
||||
|
||||
// 重新计算分数/数量
|
||||
team.correctCount = mergedChars.filter(c => c.isCorrect).length
|
||||
team.score = team.correctCount * 1.5 // 假设每个字符 1.5 分
|
||||
|
||||
// 如果数据足够(模拟结束条件)
|
||||
if (team.aiData.length >= 20) {
|
||||
team.status = 'done'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 模拟 API 轮询
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars
|
||||
const { pause, resume } = useIntervalFn(() => {
|
||||
if (!isPolling.value)
|
||||
return
|
||||
|
||||
// 模拟获取当前队伍的数据
|
||||
// 实际中: const res = await api.getResults(currentGroupId.value)
|
||||
|
||||
// 模拟增量更新
|
||||
const incomingMockData: Record<string, AICharacter[]> = {}
|
||||
|
||||
teamsData.value.forEach((team) => {
|
||||
if (team.status === 'done') {
|
||||
incomingMockData[team.id] = team.aiData
|
||||
return
|
||||
}
|
||||
|
||||
// 添加 1-2 个随机字符
|
||||
const currentLen = team.aiData.length
|
||||
const nextLen = Math.min(currentLen + Math.floor(Math.random() * 3), 25)
|
||||
|
||||
const newChars: AICharacter[] = []
|
||||
for (let i = 0; i < nextLen; i++) {
|
||||
// 如果已存在,保留字符,否则生成新的
|
||||
if (i < currentLen) {
|
||||
// 我们使用上一次模拟的原始字符(尚未应用人工修正,
|
||||
// 实际上我们是在模拟“服务器”视图,它还不知道本地编辑)
|
||||
// 实际上为了模拟简单,我们就生成“新”列表。
|
||||
newChars.push({
|
||||
id: `char-${i}`,
|
||||
char: ['龙', '年', '大', '吉', '万', '事', '如', '意', '恭', '喜', '发', '财'][i % 12],
|
||||
isCorrect: i % 5 !== 0, // 模拟一些错误
|
||||
})
|
||||
}
|
||||
else {
|
||||
newChars.push({
|
||||
id: `char-${i}`,
|
||||
char: ['龙', '年', '大', '吉', '万', '事', '如', '意', '恭', '喜', '发', '财'][i % 12],
|
||||
isCorrect: Math.random() > 0.2, // 80% 正确率
|
||||
})
|
||||
}
|
||||
}
|
||||
incomingMockData[team.id] = newChars
|
||||
})
|
||||
|
||||
mergeAIResults(teamsData.value, incomingMockData)
|
||||
}, 2000)
|
||||
|
||||
// --- 事件处理 ---
|
||||
|
||||
function handleGroupChange(id: number | string) {
|
||||
currentGroupId.value = id
|
||||
// 重置新组的数据
|
||||
teamsData.value = initGroupTeams(id)
|
||||
// 清除还是保留人工修正?通常新一轮会清除,但如果是重新访问可能会保留?
|
||||
// 用户未指定。我将保留在以 teamID 为键的 map 中(groupId-teamIdx)。
|
||||
|
||||
// 如果停止了轮询,是否恢复?
|
||||
// 在实际应用中,可能需要为该组重新启动轮询。
|
||||
}
|
||||
|
||||
function handleToggleCorrect(teamId: number | string, charId: string) {
|
||||
const team = teamsData.value.find(t => t.id === teamId)
|
||||
if (!team)
|
||||
return
|
||||
|
||||
const char = team.aiData.find(c => c.id === charId)
|
||||
if (!char)
|
||||
return
|
||||
|
||||
// 切换状态
|
||||
char.isCorrect = !char.isCorrect
|
||||
|
||||
// 更新计数
|
||||
team.correctCount = team.aiData.filter(c => c.isCorrect).length
|
||||
team.score = team.correctCount * 1.5
|
||||
|
||||
// 保存到人工修正 map
|
||||
if (!manualCorrections.value[team.id]) {
|
||||
manualCorrections.value[team.id] = {}
|
||||
}
|
||||
manualCorrections.value[team.id][charId] = char.isCorrect
|
||||
}
|
||||
|
||||
function handleNext() {
|
||||
// “下一步”按钮的逻辑(也许是下一组?)
|
||||
const idx = groups.value.findIndex(g => g.id === currentGroupId.value)
|
||||
if (idx !== -1 && idx < groups.value.length - 1) {
|
||||
handleGroupChange(groups.value[idx + 1].id)
|
||||
}
|
||||
}
|
||||
|
||||
function handlePublish() {
|
||||
if (TeamGroupID.value) {
|
||||
fetchGetQuestionDetailData()
|
||||
window.$message?.success('结果已发布')
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchGetQuestionDetailData() {
|
||||
try {
|
||||
const { data: outlineData, error } = await fetchUpdateCurrentQuestionUse(TeamGroupID.value)
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(outlineData, 'outlineData')
|
||||
if (error) {
|
||||
window?.$message?.error(error.message)
|
||||
}
|
||||
}
|
||||
catch (error: any) {
|
||||
window?.$message?.error(error.message)
|
||||
}
|
||||
}
|
||||
|
||||
// 清理
|
||||
onUnmounted(() => {
|
||||
pause()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="h-full flex flex-col gap-2 overflow-hidden bg-[#F9FAFB] p-6">
|
||||
<!-- Top Bar -->
|
||||
<div class="flex items-center justify-between rounded-2xl bg-white px-6 py-4 shadow-sm">
|
||||
<div class="flex items-center gap-8">
|
||||
<h1 class="m-0 flex items-center gap-2 text-xl text-gray-800 font-bold">
|
||||
<div class="i-carbon-chart-line-data text-2xl text-blue-600" />
|
||||
实时结果
|
||||
</h1>
|
||||
<GroupTabs :groups="groups" :model-value="currentGroupId" @update:model-value="handleGroupChange" />
|
||||
</div>
|
||||
|
||||
<div class="flex gap-4">
|
||||
<div class="flex items-center rounded-full bg-blue-50 px-4 py-1.5 text-sm text-blue-600 font-bold">
|
||||
当前进度 1/10
|
||||
</div>
|
||||
<NButton secondary strong @click="handleNext">
|
||||
下一题
|
||||
</NButton>
|
||||
<NButton type="primary" strong class="px-6" @click="handlePublish">
|
||||
发布结果
|
||||
</NButton>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Content -->
|
||||
<div class="flex-1 overflow-hidden">
|
||||
<div class="grid grid-cols-4 h-full gap-6">
|
||||
<TeamResultCard
|
||||
v-for="team in teamsData" :key="team.id" :data="team"
|
||||
@toggle-correct="(charId) => handleToggleCorrect(team.id, charId)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
:deep(.n-card__content) {
|
||||
padding: 0;
|
||||
}
|
||||
</style>
|
||||
@ -1,45 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { NButton } from 'naive-ui'
|
||||
|
||||
export interface GroupItem {
|
||||
id: number | string
|
||||
name: string
|
||||
}
|
||||
|
||||
defineProps<{
|
||||
groups: GroupItem[]
|
||||
modelValue: number | string
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:modelValue', id: number | string): void
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="scrollbar-hide flex gap-3 overflow-x-auto pb-2">
|
||||
<NButton
|
||||
v-for="group in groups"
|
||||
:key="group.id"
|
||||
round
|
||||
size="large"
|
||||
:type="modelValue === group.id ? 'primary' : 'default'"
|
||||
:secondary="modelValue !== group.id"
|
||||
class="px-6 font-bold transition-all"
|
||||
:class="{ 'shadow-lg shadow-blue-500/30': modelValue === group.id }"
|
||||
@click="emit('update:modelValue', group.id)"
|
||||
>
|
||||
{{ group.name }}
|
||||
</NButton>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.scrollbar-hide::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
.scrollbar-hide {
|
||||
-ms-overflow-style: none;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
</style>
|
||||
@ -1,114 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { NImage } from 'naive-ui'
|
||||
|
||||
export interface AICharacter {
|
||||
id: string
|
||||
char: string
|
||||
isCorrect: boolean
|
||||
}
|
||||
|
||||
export interface TeamResult {
|
||||
id: number | string
|
||||
name: string
|
||||
correctCount: number
|
||||
score: number
|
||||
imageUrl: string
|
||||
status: 'pending' | 'analyzing' | 'done'
|
||||
aiData: AICharacter[]
|
||||
}
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars
|
||||
const props = defineProps<{
|
||||
data: TeamResult
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'toggle-correct', charId: string): void
|
||||
(e: 'update-char', charId: string, newChar: string): void
|
||||
}>()
|
||||
|
||||
// 切换正确状态
|
||||
function handleCharClick(item: AICharacter) {
|
||||
// eslint-disable-next-line vue/custom-event-name-casing
|
||||
emit('toggle-correct', item.id)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="h-full flex flex-col overflow-hidden border border-gray-100 rounded-xl bg-white shadow-sm">
|
||||
<!-- 头部信息 -->
|
||||
<div class="flex items-center justify-between border-b border-gray-100 bg-gray-50 px-4 py-3">
|
||||
<h3 class="m-0 text-lg text-gray-800 font-bold">
|
||||
{{ data.name }}
|
||||
</h3>
|
||||
<div class="flex gap-3 text-sm">
|
||||
<span class="text-green-600 font-bold">正确 {{ data.correctCount }} 个</span>
|
||||
<span class="text-blue-600 font-bold">积分 {{ data.score }} 分</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 图片区域 -->
|
||||
<div class="relative aspect-[3/4] w-full flex items-center justify-center overflow-hidden border-b border-gray-100 bg-gray-100">
|
||||
<!-- 图片居中 -->
|
||||
<NImage
|
||||
v-if="data.imageUrl"
|
||||
:src="data.imageUrl"
|
||||
class="h-full w-full flex items-center justify-center"
|
||||
:img-props="{ class: 'w-full h-full object-contain object-center' }"
|
||||
preview-disabled
|
||||
/>
|
||||
<div v-else class="h-full w-full flex items-center justify-center text-gray-400">
|
||||
等待上传答题卡...
|
||||
</div>
|
||||
|
||||
<!-- 加载遮罩 -->
|
||||
<!-- <div
|
||||
v-if="data.status === 'analyzing'"
|
||||
class="absolute inset-0 bg-black/20 flex items-center justify-center backdrop-blur-[1px]"
|
||||
>
|
||||
<NSpin size="large" />
|
||||
</div> -->
|
||||
</div>
|
||||
|
||||
<!-- AI 结果网格 -->
|
||||
<div class="min-h-[200px] flex-1 overflow-y-auto p-5">
|
||||
<div v-if="data.aiData.length === 0" class="h-full flex items-center justify-center text-sm text-gray-400">
|
||||
{{ data.status === 'pending' ? '等待识别...' : '暂无数据' }}
|
||||
</div>
|
||||
|
||||
<div v-else class="grid grid-cols-8 gap-2">
|
||||
<!--
|
||||
grid-cols-5 控制宽度 (宽度由网格列数控制)
|
||||
h-10 控制高度 (高度由固定高度类控制)
|
||||
-->
|
||||
<div
|
||||
v-for="item in data.aiData"
|
||||
:key="item.id"
|
||||
class="h-14 w-14 flex cursor-pointer select-none items-center justify-center rounded-lg text-lg font-bold transition-all active:scale-95 hover:scale-105"
|
||||
:class="[
|
||||
item.isCorrect
|
||||
? 'bg-green-100 text-green-600 border border-green-200'
|
||||
: 'bg-red-100 text-red-600 border border-red-200',
|
||||
]"
|
||||
@click="handleCharClick(item)"
|
||||
>
|
||||
{{ item.char }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* Custom scrollbar for the grid area if needed */
|
||||
::-webkit-scrollbar {
|
||||
width: 4px;
|
||||
}
|
||||
::-webkit-scrollbar-track {
|
||||
background: transparent;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #e5e7eb;
|
||||
border-radius: 2px;
|
||||
}
|
||||
</style>
|
||||
@ -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=1;Status=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字段"
|
||||
// 查看 typings,currentQuestion 是 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>
|
||||
|
||||
@ -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>
|
||||
@ -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[]) || []
|
||||
@ -136,9 +136,9 @@ async function fetchGetGameStatisticsData() {
|
||||
}
|
||||
|
||||
// 定时刷新 检查是否可以下一步
|
||||
timer.value = setInterval(checkNextStep, 2000)
|
||||
timer.value = setInterval(checkNextStep, 3000)
|
||||
// 定时刷新 游戏统计数据
|
||||
statisticsTimer.value = setInterval(fetchGetGameStatisticsData, 2000)
|
||||
statisticsTimer.value = setInterval(fetchGetGameStatisticsData, 3000)
|
||||
|
||||
/** 销毁 定时刷新 检查是否可以下一步 */
|
||||
onBeforeUnmount(() => {
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
<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 { PublishStatus } from '@/enum/business'
|
||||
import { useRouterPush } from '@/hooks/common/router'
|
||||
import { fetchUpdatePublishStatus } from '@/service/api/competition'
|
||||
import { fetchGetQuestionTableByActivityID } from '@/service/api/game'
|
||||
import { useActivityInfoStore } from '@/store/modules/activityinfo'
|
||||
import { AudioController } from '@/utils/audio'
|
||||
@ -28,10 +30,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,28 +74,41 @@ 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()
|
||||
}
|
||||
|
||||
function handleNext() {
|
||||
async function handleNext() {
|
||||
// 封面页的下一步操作,更改活动状态
|
||||
// 判断状态是否为已发布或处理中,若已发布或处理中则不能更改状态
|
||||
if (activityInfo.value?.PublishStatus === PublishStatus.Published || activityInfo.value?.PublishStatus === PublishStatus.Processing) {
|
||||
if (activityId.value) {
|
||||
try {
|
||||
await fetchUpdatePublishStatus(Number(activityId.value), PublishStatus.Processing)
|
||||
}
|
||||
catch (error) {
|
||||
console.error('更新活动状态失败', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
routerPushByKey('user_rules', {
|
||||
query: {
|
||||
activityId: activityId.value,
|
||||
@ -141,24 +158,20 @@ onMounted(async () => {
|
||||
<template>
|
||||
<CompetitionLayout
|
||||
:show-back="true" :show-next="showNextButton" :title="activityName" :title-bg-type="2"
|
||||
@back="handleBack"
|
||||
@next="handleNext"
|
||||
@back="handleBack" @next="handleNext"
|
||||
>
|
||||
<div class="h-screen w-full overflow-y-auto font-sans">
|
||||
<div class="relative z-10 min-h-full w-full">
|
||||
<div class="min-h-full w-full flex flex-col items-center pb-12 pt-24">
|
||||
<!-- 卡片列表 -->
|
||||
<TransitionGroup
|
||||
tag="div"
|
||||
name="card-anim"
|
||||
tag="div" name="card-anim"
|
||||
class="perspective-container max-w-[1800px] w-full flex flex-wrap justify-center gap-4 px-4 md:gap-10 md:px-12"
|
||||
>
|
||||
<div
|
||||
v-for="(node, index) in showCards ? questions : []"
|
||||
:key="node.id"
|
||||
v-for="(node, index) in showCards ? questions : []" :key="node.id"
|
||||
class="w-[44%] card-wrapper 2xl:w-[14%] lg:w-[21%] md:w-[28%] xl:w-[17%]"
|
||||
:style="{ animationDelay: `${index * 0.2}s` }"
|
||||
@click="toggleFlip(index)"
|
||||
:style="{ animationDelay: `${index * 0.2}s` }" @click="toggleFlip(index)"
|
||||
>
|
||||
<div class="flip-card-inner" :class="{ 'is-flipped': flippedCards.has(index) }">
|
||||
<!-- 正面 (Front) - 显示背面图案 -->
|
||||
@ -214,16 +227,19 @@ onMounted(async () => {
|
||||
transform: translate3d(0, 300px, -800px) rotateY(180deg) rotateX(45deg) scale(0.5);
|
||||
filter: blur(20px); // 深度模糊
|
||||
}
|
||||
|
||||
50% {
|
||||
opacity: 1;
|
||||
filter: blur(0); // 聚焦
|
||||
}
|
||||
|
||||
70% {
|
||||
// [过冲状态]
|
||||
// 飞到眼前一点点 (Z=50px)
|
||||
// 角度稍微回弹 (rotateY -15deg)
|
||||
transform: translate3d(0, -20px, 50px) rotateY(-15deg) rotateX(-10deg) scale(1.05);
|
||||
}
|
||||
|
||||
100% {
|
||||
// [最终归位]
|
||||
transform: translate3d(0, 0, 0) rotateY(0) rotateX(0) scale(1);
|
||||
|
||||
@ -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 {
|
||||
@ -189,7 +197,7 @@ async function fetchGetGameStatisticsData(_params: Api.Competition.QuestionAddPa
|
||||
if (store.currentQuestionInfo && store.currentQuestionDetail) {
|
||||
try {
|
||||
const { data } = await fetchGetGameStatistics(_params)
|
||||
console.log(data, 'data')
|
||||
// console.log(data, 'data')
|
||||
// 更新图表数据
|
||||
// 假设接口返回格式为: [{ TeamName: '组1', Points: 10, ResultPotins: 5 }, ...]
|
||||
// 需要根据实际接口返回结构调整映射逻辑
|
||||
@ -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())
|
||||
|
||||
@ -30,7 +30,7 @@ function buildOption(list: BarDatum[]): ECOption {
|
||||
axisPointer: { type: 'shadow' },
|
||||
},
|
||||
legend: {
|
||||
data: ['答题数量', '正确数量'],
|
||||
data: ['答题数量', '预估得分'],
|
||||
top: 0,
|
||||
right: 0,
|
||||
icon: 'circle',
|
||||
|
||||
@ -29,13 +29,10 @@ async function getGroups() {
|
||||
if (list && Array.isArray(list)) {
|
||||
groups.value = list.map((item: any) => ({
|
||||
...item,
|
||||
// id: item.Id,
|
||||
// name: item.Name,
|
||||
icon: 'activity', // Default icon since API might not provide one
|
||||
icon: 'activity',
|
||||
}))
|
||||
}
|
||||
isAllEnd.value = list.every((item: Api.Competition.ActivityTeamGroup) => item.IsEnd)
|
||||
// console.log(groups.value, 'groups.value')
|
||||
}
|
||||
finally {
|
||||
loading.value = false
|
||||
@ -49,7 +46,7 @@ function handleBack() {
|
||||
}
|
||||
|
||||
function handleNext() {
|
||||
routerPushByKey('user')
|
||||
routerPushByKey('user_rank-list', { query: { activityId } })
|
||||
}
|
||||
|
||||
function selectGroup(item: Api.Competition.ActivityTeamGroup) {
|
||||
|
||||
@ -3,6 +3,7 @@ import { NCarousel, NImage } from 'naive-ui'
|
||||
import { computed, onMounted, ref } from 'vue'
|
||||
import beacon from '@/assets/imgs/user/event-card-bg-icon.svg'
|
||||
import CompetitionLayout from '@/components/custom/user/CompetitionLayout.vue'
|
||||
import { PublishStatus } from '@/enum/business'
|
||||
import { useRouterPush } from '@/hooks/common/router'
|
||||
import { fetchGetActivityList } from '@/service/api/competition'
|
||||
import { useActivityInfoStore } from '@/store/modules/activityinfo'
|
||||
@ -32,14 +33,16 @@ async function getEvents() {
|
||||
|
||||
const list = data?.data || []
|
||||
if (list && Array.isArray(list)) {
|
||||
events.value = list.map((item: any) => ({
|
||||
...item,
|
||||
id: item.Id,
|
||||
title: item.Name,
|
||||
subTitle: item.Description,
|
||||
icon: 'activity',
|
||||
status: 'active',
|
||||
}))
|
||||
events.value = list
|
||||
.filter((item: any) => item.PublishStatus === PublishStatus.Published || item.PublishStatus === PublishStatus.Processing)
|
||||
.map((item: any) => ({
|
||||
...item,
|
||||
id: item.Id,
|
||||
title: item.Name,
|
||||
subTitle: item.Description,
|
||||
icon: 'activity',
|
||||
status: 'active',
|
||||
}))
|
||||
}
|
||||
}
|
||||
finally {
|
||||
@ -185,7 +188,7 @@ onMounted(() => {
|
||||
|
||||
.text-content {
|
||||
.event-title {
|
||||
font-size: 1.4rem;
|
||||
font-size: 1.1rem;
|
||||
font-weight: bold;
|
||||
color: $text-color;
|
||||
margin-bottom: 8px;
|
||||
|
||||
@ -81,7 +81,7 @@ watch(
|
||||
<div class="w-full flex p-6">
|
||||
<!-- <p>template:{{ template }}</p> -->
|
||||
<!-- 模板A: 汉字听写1-提示 (拼音+提示) -->
|
||||
<div v-if="template === QuestionCategoryEnum.ChineseCharacterDictation1" class="text-center">
|
||||
<div v-if="template === QuestionCategoryEnum.ChineseCharacterDictation1 || template === QuestionCategoryEnum.ChineseCharacterDictation2" class="text-center">
|
||||
<div class="mb-6 inline-block text-5xl font-bold leading-none">
|
||||
<div class="ptions-container1 mb-2 text-center text-2xl">
|
||||
{{ title }}
|
||||
@ -127,7 +127,7 @@ watch(
|
||||
</div>
|
||||
|
||||
<!-- 模板E: 成语-文字要求 -->
|
||||
<div v-else-if="template === QuestionCategoryEnum.IdiomWriting1" class="text-center">
|
||||
<div v-else-if="template === QuestionCategoryEnum.IdiomWriting1 || template === QuestionCategoryEnum.IdiomWriting2" class="text-center">
|
||||
<div class="mb-8 text-4xl text-gray-800 font-bold">
|
||||
<!-- {{ content }} -->
|
||||
<div class="rich-content" v-html="content" />
|
||||
|
||||
268
apps/admin/src/views/user/rank-list/index.vue
Normal file
268
apps/admin/src/views/user/rank-list/index.vue
Normal file
@ -0,0 +1,268 @@
|
||||
<script setup lang="tsx">
|
||||
import type { DataTableColumns } from 'naive-ui'
|
||||
import { NDataTable, NImage, NTag, useMessage } from 'naive-ui'
|
||||
import { onMounted, ref } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import title from '@/assets/imgs/user/rank-title.svg'
|
||||
import { fetchUserRankList } from '@/service/api/rank'
|
||||
|
||||
const route = useRoute()
|
||||
const message = useMessage()
|
||||
const MainID = Number(route.query.activityId)
|
||||
|
||||
// 定义数据结构
|
||||
interface TeamData {
|
||||
id: string
|
||||
rank: number
|
||||
teamName: string
|
||||
[key: string]: number | string // 允许任意数量的题目分数
|
||||
total: number
|
||||
}
|
||||
|
||||
const columns = ref<DataTableColumns<TeamData>>([
|
||||
{
|
||||
title: '排名',
|
||||
key: 'rank',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
render(row: TeamData) {
|
||||
const rank = row.rank
|
||||
if (rank === 1) {
|
||||
return <NTag type="warning" size="large" round>🏆</NTag>
|
||||
}
|
||||
if (rank === 2) {
|
||||
return <NTag type="info" size="large" round>🥈</NTag>
|
||||
}
|
||||
if (rank === 3) {
|
||||
return <NTag type="success" size="large" round>🥉</NTag>
|
||||
}
|
||||
return <span>{rank}</span>
|
||||
},
|
||||
},
|
||||
{ title: '队伍名称', key: 'teamName', align: 'left', width: 150, className: 'team-name' },
|
||||
{ title: '总积分', key: 'total', align: 'center', className: 'total-score' },
|
||||
])
|
||||
|
||||
const tableData = ref<TeamData[]>([])
|
||||
|
||||
async function getUserRankList() {
|
||||
const { data, error } = await fetchUserRankList(MainID)
|
||||
if (error) {
|
||||
message.error(error.message || '获取排行榜失败')
|
||||
return
|
||||
}
|
||||
|
||||
if (data?.data && data.data.length > 0) {
|
||||
// 动态生成题目列
|
||||
const firstTeam = data.data[0]
|
||||
const questionColumns = firstTeam.Questions.map(q => ({
|
||||
title: `第${q.QuestionNO}题`,
|
||||
key: `q${q.QuestionNO}`,
|
||||
align: 'center' as const,
|
||||
}))
|
||||
|
||||
// 更新表头
|
||||
columns.value = [
|
||||
{
|
||||
title: '排名',
|
||||
key: 'rank',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
render(row: TeamData) {
|
||||
const rank = row.rank
|
||||
if (rank === 1) {
|
||||
return <NTag type="warning" size="large" round>🏆</NTag>
|
||||
}
|
||||
if (rank === 2) {
|
||||
return <NTag type="info" size="large" round>🥈</NTag>
|
||||
}
|
||||
if (rank === 3) {
|
||||
return <NTag type="success" size="large" round>🥉</NTag>
|
||||
}
|
||||
return <span>{rank}</span>
|
||||
},
|
||||
},
|
||||
{ title: '队伍名称', key: 'teamName', align: 'left', width: 150, className: 'team-name' },
|
||||
...questionColumns,
|
||||
{ title: '总积分', key: 'total', align: 'center', className: 'total-score' },
|
||||
]
|
||||
|
||||
tableData.value = data.data.map((item, index) => {
|
||||
const questions: Record<string, number> = {}
|
||||
item.Questions.forEach((q) => {
|
||||
questions[`q${q.QuestionNO}`] = q.ResultPotin
|
||||
})
|
||||
|
||||
return {
|
||||
id: String(item.TeamID),
|
||||
rank: index + 1,
|
||||
teamName: item.Name,
|
||||
total: item.TotalPoint,
|
||||
...questions,
|
||||
} as TeamData
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
if (MainID) {
|
||||
getUserRankList()
|
||||
}
|
||||
})
|
||||
|
||||
// 动态赋予行样式:根据排名和奇偶数设置 class
|
||||
function rowClassName(row: TeamData) {
|
||||
const rank = row.rank
|
||||
const classes = ['rank-row']
|
||||
if (rank >= 1 && rank <= 3) {
|
||||
classes.push(`rank-top-${rank}`)
|
||||
}
|
||||
return classes.join(' ')
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<CompetitionLayout :show-back="false" :show-next="false" :show-title="false">
|
||||
<div class="leaderboard-container">
|
||||
<div class="leaderboard-header">
|
||||
<NImage :src="title" alt="logo" preview-disabled class="mt--60px" object-fit="contain" />
|
||||
<p class="mt--20px text-center text-sm text-#6b778d">
|
||||
"勤学如春起之苗,不见其增,日有所长"
|
||||
</p>
|
||||
</div>
|
||||
<div class="leaderboard-content">
|
||||
<NDataTable
|
||||
:columns="columns" :data="tableData" :bordered="false" :bottom-bordered="false"
|
||||
:row-class-name="rowClassName" class="rank-table"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</CompetitionLayout>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* 1. 整体容器和背景 */
|
||||
.leaderboard-container {
|
||||
width: 100%;
|
||||
min-height: 100vh;
|
||||
background-image: url('https://raw.githubusercontent.com/0x3f3f3f3f/figure-bed/main/img/20240524150352.png');
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 40px 20px;
|
||||
font-family: 'PingFang SC', 'Helvetica Neue', Arial, sans-serif;
|
||||
/* width: 100%; */
|
||||
/* height: 781px;
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: url('@/assets/imgs/user/team-bg.svg') no-repeat center center;
|
||||
background-size: 100% 100%;
|
||||
transform-origin: center;
|
||||
padding: 40px 20px;
|
||||
font-family: 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; */
|
||||
}
|
||||
|
||||
/* 2. 页面标题 */
|
||||
.leaderboard-header {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.leaderboard-header h1 {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 700;
|
||||
color: #1a2a44;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* .leaderboard-header p {
|
||||
font-size: 1rem;
|
||||
color: #6b778d;
|
||||
margin-top: 8px;
|
||||
} */
|
||||
|
||||
/* 3. 表格内容区 */
|
||||
.leaderboard-content {
|
||||
width: 100%;
|
||||
/* max-width: 1200px; */
|
||||
background-color: #fff;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 8px 24px rgba(26, 42, 68, 0.05);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* 4. Naive UI 表格深度定制 */
|
||||
:deep(.rank-table .n-data-table-thead) {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
:deep(.rank-table .n-data-table-th) {
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: #495057;
|
||||
border-bottom: 2px solid #dee2e6 !important;
|
||||
}
|
||||
|
||||
:deep(.rank-table .n-data-table-tr) {
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
:deep(.rank-table .n-data-table-tr:hover) {
|
||||
background-color: #f1f3f5 !important;
|
||||
}
|
||||
|
||||
:deep(.rank-table .n-data-table-td) {
|
||||
font-size: 15px;
|
||||
color: #333;
|
||||
border-bottom: 1px solid #e9ecef !important;
|
||||
padding-top: 16px !important;
|
||||
padding-bottom: 16px !important;
|
||||
}
|
||||
|
||||
/* 奇偶行交替色 */
|
||||
:deep(.rank-table .n-data-table-tr:nth-of-type(odd)) {
|
||||
background-color: #fdfdfd;
|
||||
}
|
||||
|
||||
/* 队伍名称和总分加粗 */
|
||||
:deep(.team-name) {
|
||||
font-weight: 600;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
:deep(.total-score) {
|
||||
font-weight: 700;
|
||||
font-size: 1.1rem;
|
||||
color: #e67e22;
|
||||
}
|
||||
|
||||
/* 前三名高亮 */
|
||||
:deep(.rank-top-1 .n-data-table-td) {
|
||||
background-color: #fff9e6 !important;
|
||||
}
|
||||
|
||||
:deep(.rank-top-2 .n-data-table-td) {
|
||||
background-color: #f0f4ff !important;
|
||||
}
|
||||
|
||||
:deep(.rank-top-3 .n-data-table-td) {
|
||||
background-color: #e6f4ea !important;
|
||||
}
|
||||
|
||||
:deep(.rank-top-1 .total-score) {
|
||||
color: #d4af37;
|
||||
}
|
||||
|
||||
:deep(.rank-top-2 .total-score) {
|
||||
color: #a0a0a0;
|
||||
}
|
||||
|
||||
:deep(.rank-top-3 .total-score) {
|
||||
color: #cd7f32;
|
||||
}
|
||||
</style>
|
||||
0
apps/admin/src/views/user/rank-pending/index.vue
Normal file
0
apps/admin/src/views/user/rank-pending/index.vue
Normal 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": ""
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
458
apps/question-importer/store/汉字听写 1.json
Normal file
458
apps/question-importer/store/汉字听写 1.json
Normal 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": ""
|
||||
}
|
||||
]
|
||||
452
apps/question-importer/store/汉字听写 2.json
Normal file
452
apps/question-importer/store/汉字听写 2.json
Normal 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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -1,452 +1,428 @@
|
||||
{
|
||||
"question_bank": [
|
||||
{
|
||||
"QuestionId": 4,
|
||||
"Name": "Jú",
|
||||
"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": "Qū",
|
||||
"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": "Qì",
|
||||
"Answer": "气、器、弃、泣、契、砌、迄、汽、憩、葺、讫、沏、亟、呮、咠、唭、噐、埴、夡、忔、憇、栔、槭、欫、気、汔、洓、湆、滊、炁、焏、甈、甓、盵、矵、碛、磜、磧、碶、磩、礘、竐、綥、綮、緀、緝、罊、翜、聺、臮、艩、芞、藒、蟿、訖、趞、跂、踦、迉、郪、釮、錡、闙、霼、鯚、鶺、鼜、齌",
|
||||
"QuestionId": 3,
|
||||
"Name": "pú táo jiǔ",
|
||||
"Answer": "葡萄酒",
|
||||
"Type": "text",
|
||||
"IsGood": 1,
|
||||
"ImageUrl": ""
|
||||
},
|
||||
{
|
||||
"QuestionId": 4,
|
||||
"Name": "Xù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": "Qì",
|
||||
"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": "Qì",
|
||||
"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": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -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
50
pnpm-lock.yaml
generated
@ -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: {}
|
||||
|
||||
Reference in New Issue
Block a user