提交 dba3278d authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 b8d0c4a6
...@@ -12,6 +12,7 @@ const myRef = $ref<HTMLElement>() ...@@ -12,6 +12,7 @@ const myRef = $ref<HTMLElement>()
let countUp: CountUp | null = null let countUp: CountUp | null = null
onMounted(() => { onMounted(() => {
if (!myRef) return
countUp = new CountUp(myRef, props.endVal, props.options) countUp = new CountUp(myRef, props.endVal, props.options)
if (!countUp.error) { if (!countUp.error) {
countUp.start() countUp.start()
......
...@@ -4,7 +4,7 @@ import AppList from '@/components/base/AppList.vue' ...@@ -4,7 +4,7 @@ import AppList from '@/components/base/AppList.vue'
import { getContestantList } from '../api' import { getContestantList } from '../api'
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
const detail = $ref<ContestItem>(inject('detail')) const detail = $ref(inject<ContestItem>('detail'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 性别 // 性别
...@@ -13,7 +13,7 @@ const genderList = useMapStore().getMapValuesByKey('system_gender') ...@@ -13,7 +13,7 @@ const genderList = useMapStore().getMapValuesByKey('system_gender')
const listOptions = { const listOptions = {
remote: { remote: {
httpRequest: getContestantList, httpRequest: getContestantList,
params: { competition_id: detail.id, student_name: '' } params: { competition_id: detail?.id, student_name: '' }
}, },
filters: [{ type: 'input', prop: 'student_name', label: '选手姓名', placeholder: '请输入选手姓名' }], filters: [{ type: 'input', prop: 'student_name', label: '选手姓名', placeholder: '请输入选手姓名' }],
columns: [ columns: [
...@@ -38,7 +38,7 @@ const listOptions = { ...@@ -38,7 +38,7 @@ const listOptions = {
} }
const exportUrl = $computed(() => { const exportUrl = $computed(() => {
return `/api/resource/v1/backend/competition-competitor/export?competition_id=${detail.id}` return `/api/resource/v1/backend/competition-competitor/export?competition_id=${detail?.id}`
}) })
</script> </script>
......
...@@ -11,7 +11,7 @@ const emit = defineEmits<{ ...@@ -11,7 +11,7 @@ const emit = defineEmits<{
// 角色列表 // 角色列表
const roleList = useMapStore().getMapValuesByKey('expert_role') const roleList = useMapStore().getMapValuesByKey('expert_role')
const detail = $ref<ContestItem>(inject('detail')) const detail = $ref(inject('detail') as ContestItem)
let list = $ref<any>([]) let list = $ref<any>([])
function fetchList() { function fetchList() {
......
...@@ -18,7 +18,7 @@ const emit = defineEmits<{ ...@@ -18,7 +18,7 @@ const emit = defineEmits<{
const ScoringExpertsAddDialog = defineAsyncComponent(() => import('./ScoringExpertsAddDialog.vue')) const ScoringExpertsAddDialog = defineAsyncComponent(() => import('./ScoringExpertsAddDialog.vue'))
const detail = $ref<ContestItem>(inject('detail')) const detail = $ref(inject('detail') as ContestItem)
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 性别 // 性别
......
...@@ -17,7 +17,7 @@ const emit = defineEmits<{ ...@@ -17,7 +17,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const detail = $ref<ContestItem>(inject('detail')) const detail = $ref(inject('detail') as ContestItem)
// 数据状态 // 数据状态
const status = useMapStore().getMapValuesByKey('system_status') const status = useMapStore().getMapValuesByKey('system_status')
......
...@@ -17,7 +17,7 @@ const emit = defineEmits<{ ...@@ -17,7 +17,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const detail = $ref<ContestItem>(inject('detail')) const detail = $ref(inject('detail') as ContestItem)
// 评分方法 // 评分方法
const scoreMethods = useMapStore().getMapValuesByKey('scoring_manner') const scoreMethods = useMapStore().getMapValuesByKey('scoring_manner')
......
...@@ -17,7 +17,7 @@ const emit = defineEmits<{ ...@@ -17,7 +17,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const detail = $ref<ContestItem>(inject('detail')) const detail = $ref(inject('detail') as ContestItem)
// 数据状态 // 数据状态
const status = useMapStore().getMapValuesByKey('system_status') const status = useMapStore().getMapValuesByKey('system_status')
......
...@@ -17,7 +17,7 @@ const emit = defineEmits<{ ...@@ -17,7 +17,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const detail = $ref<ContestItem>(inject('detail')) const detail = $ref(inject('detail') as ContestItem)
// 数据状态 // 数据状态
const status = useMapStore().getMapValuesByKey('system_status') const status = useMapStore().getMapValuesByKey('system_status')
......
...@@ -8,15 +8,15 @@ interface Props { ...@@ -8,15 +8,15 @@ interface Props {
data: ExperimentItem data: ExperimentItem
} }
const props = defineProps<Props>() defineProps<Props>()
const emit = defineEmits<{ defineEmits<{
(e: 'update'): void (e: 'update'): void
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const formRef = $ref<FormInstance>() const formRef = $ref<FormInstance>()
const form = reactive({ const form = reactive<any>({
is_show: 1, is_show: 1,
rule_list: [ rule_list: [
{ {
...@@ -48,7 +48,7 @@ function handleSubmit() { ...@@ -48,7 +48,7 @@ function handleSubmit() {
// 当前评分方法 // 当前评分方法
function currentRuleNames(value: number) { function currentRuleNames(value: number) {
const typeList = form.rule_list.map(item => item.type) const typeList = form.rule_list.map((item: any) => item.type)
return gradeRuleList.filter(item => { return gradeRuleList.filter(item => {
return item.value === value || item.value === 5 || !typeList.includes(item.value) return item.value === value || item.value === 5 || !typeList.includes(item.value)
}) })
......
...@@ -7,7 +7,7 @@ const props = defineProps<Props>() ...@@ -7,7 +7,7 @@ const props = defineProps<Props>()
const teacherText = $computed(() => { const teacherText = $computed(() => {
if (!props.data) return '' if (!props.data) return ''
return props.data.teacher.map(item => item.name).join('、') return props.data.teacher.map((item: any) => item.name).join('、')
}) })
</script> </script>
......
...@@ -8,7 +8,7 @@ const emit = defineEmits<{ ...@@ -8,7 +8,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const detail = $ref<ExperimentItem>(inject('detail')) const detail = $ref(inject('detail') as ExperimentItem)
// 列表配置 // 列表配置
const listOptions = { const listOptions = {
......
...@@ -8,7 +8,7 @@ const emit = defineEmits<{ ...@@ -8,7 +8,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const detail = $ref<GroupItem>(inject('detail')) const detail = $ref(inject('detail') as GroupItem)
// 列表配置 // 列表配置
const listOptions = { const listOptions = {
......
...@@ -10,7 +10,7 @@ interface Props { ...@@ -10,7 +10,7 @@ interface Props {
} }
const props = defineProps<Props>() const props = defineProps<Props>()
const detail = $ref<ExperimentItem>(inject('detail')) const detail = $ref(inject<ExperimentItem>('detail'))
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 列表配置 // 列表配置
...@@ -38,7 +38,7 @@ function handleRefetch() { ...@@ -38,7 +38,7 @@ function handleRefetch() {
</script> </script>
<template> <template>
<el-dialog title="学生分组"> <el-dialog title="学生分组">
<el-descriptions :column="2"> <el-descriptions :column="2" v-if="detail">
<el-descriptions-item label="实验名称:">{{ detail.name }}</el-descriptions-item> <el-descriptions-item label="实验名称:">{{ detail.name }}</el-descriptions-item>
<el-descriptions-item label="所属机构:">{{ detail.organ_id_name }}</el-descriptions-item> <el-descriptions-item label="所属机构:">{{ detail.organ_id_name }}</el-descriptions-item>
<el-descriptions-item label="班级名称:">{{ data.name }}</el-descriptions-item> <el-descriptions-item label="班级名称:">{{ data.name }}</el-descriptions-item>
...@@ -71,7 +71,6 @@ function handleRefetch() { ...@@ -71,7 +71,6 @@ function handleRefetch() {
v-model="dialogVisible" v-model="dialogVisible"
:data="data" :data="data"
@update="handleRefetch" @update="handleRefetch"
v-if="dialogVisible" v-if="dialogVisible"></StudentGroupFormDialog>
></StudentGroupFormDialog>
</el-dialog> </el-dialog>
</template> </template>
...@@ -14,7 +14,7 @@ const emit = defineEmits<{ ...@@ -14,7 +14,7 @@ const emit = defineEmits<{
(e: 'update:modelValue', visible: boolean): void (e: 'update:modelValue', visible: boolean): void
}>() }>()
const detail = $ref<ExperimentItem>(inject('detail')) const detail = $ref(inject('detail') as ExperimentItem)
const formRef = $ref<FormInstance>() const formRef = $ref<FormInstance>()
const form = reactive({ name: '' }) const form = reactive({ name: '' })
...@@ -28,7 +28,7 @@ function handleSubmit() { ...@@ -28,7 +28,7 @@ function handleSubmit() {
} }
// 创建 // 创建
const handleCreate = () => { const handleCreate = () => {
const params = { ...form, experiment_id: detail.id, class_id: props.data.id } const params = { ...form, experiment_id: detail?.id, class_id: props.data.id }
experimentAddClassGroup(params).then(() => { experimentAddClassGroup(params).then(() => {
ElMessage({ message: '创建成功', type: 'success' }) ElMessage({ message: '创建成功', type: 'success' })
emit('update') emit('update')
...@@ -42,8 +42,7 @@ const handleCreate = () => { ...@@ -42,8 +42,7 @@ const handleCreate = () => {
title="新增实验分组" title="新增实验分组"
:close-on-click-modal="false" :close-on-click-modal="false"
width="600px" width="600px"
@update:modelValue="$emit('update:modelValue')" @update:modelValue="$emit('update:modelValue')">
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="110px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="110px">
<el-form-item label="实验名称">{{ detail.name }}</el-form-item> <el-form-item label="实验名称">{{ detail.name }}</el-form-item>
<el-form-item label="实验小组名称" prop="name"> <el-form-item label="实验小组名称" prop="name">
......
...@@ -41,8 +41,8 @@ const listOptions = $computed(() => { ...@@ -41,8 +41,8 @@ const listOptions = $computed(() => {
<template> <template>
<el-dialog title="查看历史成绩"> <el-dialog title="查看历史成绩">
<AppList v-bind="listOptions" ref="appList"> <AppList v-bind="listOptions" ref="appList">
<template #table-name>{{ detail.student_name }}</template> <template #table-name>{{ detail?.student_name }}</template>
<template #table-number>{{ detail.sno_number }}</template> <template #table-number>{{ detail?.sno_number }}</template>
</AppList> </AppList>
</el-dialog> </el-dialog>
</template> </template>
......
<script setup lang="ts"> <script setup lang="ts">
import type { Contest } from '../types' import type { Contest } from '../types'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { contestMode } from '@/utils/dictionary'
import { updateTrainCount } from '../api' import { updateTrainCount } from '../api'
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
...@@ -13,9 +12,6 @@ const router = useRouter() ...@@ -13,9 +12,6 @@ const router = useRouter()
const isMy = $computed(() => { const isMy = $computed(() => {
return !!props.data.login_id return !!props.data.login_id
}) })
const modeText = $computed(() => {
return contestMode[props.data.mode]
})
const types = useMapStore().getMapValuesByKey('competition_type') const types = useMapStore().getMapValuesByKey('competition_type')
// 赛项类型 // 赛项类型
......
...@@ -13,7 +13,7 @@ const emit = defineEmits<{ ...@@ -13,7 +13,7 @@ const emit = defineEmits<{
(e: 'update'): void (e: 'update'): void
}>() }>()
const detail = $ref<ExperimentRecord>(inject('detail')) const detail = $ref(inject('detail') as ExperimentRecord)
const isEmpty = $computed(() => { const isEmpty = $computed(() => {
return !props.competition_id || !detail return !props.competition_id || !detail
......
...@@ -24,7 +24,7 @@ function fetchInfo() { ...@@ -24,7 +24,7 @@ function fetchInfo() {
data: { data: {
experiment_id: props.experiment_id, experiment_id: props.experiment_id,
course_id: props.course_id, course_id: props.course_id,
book_id: detail.id book_id: detail?.id
} }
}) })
}) })
...@@ -32,15 +32,9 @@ function fetchInfo() { ...@@ -32,15 +32,9 @@ function fetchInfo() {
watchEffect(() => { watchEffect(() => {
fetchInfo() fetchInfo()
}) })
const isEmpty = $computed(() => {
return !props.experiment_id || !detail?.id
})
</script> </script>
<template> <template>
<el-empty description="暂无数据" v-if="isEmpty" /> <Preview :url="detail.url" v-if="props.experiment_id && detail?.id"></Preview>
<template v-else> <el-empty description="暂无数据" v-else />
<Preview :url="detail.url"></Preview>
</template>
</template> </template>
<script setup lang="ts">
import type { ExperimentRecord } from '../types'
interface Props {
experiment_id?: string
}
defineProps<Props>()
const detail = $ref(inject<ExperimentRecord>('detail'))
</script>
<template>
<template v-if="detail && experiment_id"> </template>
<el-empty description="暂无数据" v-else />
</template>
...@@ -11,7 +11,7 @@ interface Props { ...@@ -11,7 +11,7 @@ interface Props {
const props = defineProps<Props>() const props = defineProps<Props>()
const detail = $ref<ExperimentRecord>(inject('detail')) const detail = $ref(inject<ExperimentRecord>('detail'))
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'update'): void (e: 'update'): void
...@@ -49,15 +49,13 @@ const update = () => { ...@@ -49,15 +49,13 @@ const update = () => {
title="上传实验报告" title="上传实验报告"
:close-on-click-modal="false" :close-on-click-modal="false"
width="600px" width="600px"
@update:modelValue="$emit('update:modelValue')" @update:modelValue="$emit('update:modelValue')">
>
<el-form ref="formRef" :model="form" :rules="rules"> <el-form ref="formRef" :model="form" :rules="rules">
<el-form-item label="实验报告文件" prop="files"> <el-form-item label="实验报告文件" prop="files">
<AppUpload <AppUpload
v-model="form.files" v-model="form.files"
:limit="1" :limit="1"
accept=".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,.pdf,application/pdf,.ppt,.pptx,application/vnd.ms-powerpoint" accept=".doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,.pdf,application/pdf,.ppt,.pptx,application/vnd.ms-powerpoint">
>
<template #tip>实验报告文件只能上传一个,支持格式包含:doc docx pdf ppt pptx,大小不超过50M</template> <template #tip>实验报告文件只能上传一个,支持格式包含:doc docx pdf ppt pptx,大小不超过50M</template>
</AppUpload> </AppUpload>
</el-form-item> </el-form-item>
......
...@@ -14,12 +14,10 @@ const emit = defineEmits<{ ...@@ -14,12 +14,10 @@ const emit = defineEmits<{
(e: 'update'): void (e: 'update'): void
}>() }>()
const detail = $ref<ExperimentRecord>(inject('detail')) const detail = $ref(inject<ExperimentRecord>('detail'))
const dialogVisible = $ref(false) const dialogVisible = $ref(false)
const isEmpty = $computed(() => {
return !props.experiment_id || !detail
})
const canRemove = $computed(() => { const canRemove = $computed(() => {
return !(detail?.status !== 0) return !(detail?.status !== 0)
}) })
...@@ -34,7 +32,7 @@ function handlePreview(index: number) { ...@@ -34,7 +32,7 @@ function handlePreview(index: number) {
function handleRemove(index: number) { function handleRemove(index: number) {
ElMessageBox.confirm('删除之后无法恢复,确认删除该截图吗?', '提示').then(() => { ElMessageBox.confirm('删除之后无法恢复,确认删除该截图吗?', '提示').then(() => {
if (!props.experiment_id) return if (!props.experiment_id) return
const pictures = detail.pictures.filter((item, i) => i !== index) const pictures = detail?.pictures.filter((item, i) => i !== index)
uploadExperimentPicture({ experiment_id: props.experiment_id, pictures: JSON.stringify(pictures) }).then(() => { uploadExperimentPicture({ experiment_id: props.experiment_id, pictures: JSON.stringify(pictures) }).then(() => {
emit('update') emit('update')
}) })
...@@ -43,8 +41,7 @@ function handleRemove(index: number) { ...@@ -43,8 +41,7 @@ function handleRemove(index: number) {
</script> </script>
<template> <template>
<el-empty description="暂无数据" v-if="isEmpty" /> <template v-if="detail && experiment_id">
<template v-else>
<div class="result-score"> <div class="result-score">
<h2>我的成绩</h2> <h2>我的成绩</h2>
<template v-if="detail.status === 2"> <template v-if="detail.status === 2">
...@@ -71,6 +68,7 @@ function handleRemove(index: number) { ...@@ -71,6 +68,7 @@ function handleRemove(index: number) {
<ImageViewer v-model="imageViewerVisible" :index="imageViewerIndex" :items="detail.pictures"></ImageViewer> <ImageViewer v-model="imageViewerVisible" :index="imageViewerIndex" :items="detail.pictures"></ImageViewer>
<ResultScoreDialog v-model="dialogVisible"></ResultScoreDialog> <ResultScoreDialog v-model="dialogVisible"></ResultScoreDialog>
</template> </template>
<el-empty description="暂无数据" v-else />
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
import type { ExperimentRecord } from '../types' import type { ExperimentRecord } from '../types'
import { Document } from '@element-plus/icons-vue' import { Document } from '@element-plus/icons-vue'
const detail = $ref<ExperimentRecord>(inject('detail')) const detail = $ref(inject<ExperimentRecord>('detail'))
const score = $computed<number>(() => { const score = $computed<number>(() => {
const result = const result =
((detail.score_details.operate || 0) + (detail.score_details.result || 0) + (detail.score_details.file || 0)) / 3 ((detail?.score_details.operate || 0) + (detail?.score_details.result || 0) + (detail?.score_details.file || 0)) / 3
return parseFloat(result.toFixed(2)) return parseFloat(result.toFixed(2))
}) })
</script> </script>
......
...@@ -8,6 +8,7 @@ import { upload } from '@/utils/upload' ...@@ -8,6 +8,7 @@ import { upload } from '@/utils/upload'
import { getExperimentRecord, uploadExperimentPicture, submitExperimentRecord } from '../api' import { getExperimentRecord, uploadExperimentPicture, submitExperimentRecord } from '../api'
import dayjs from 'dayjs' import dayjs from 'dayjs'
const Info = defineAsyncComponent(() => import('../components/Info.vue'))
const Book = defineAsyncComponent(() => import('../components/Book.vue')) const Book = defineAsyncComponent(() => import('../components/Book.vue'))
const Video = defineAsyncComponent(() => import('../components/Video.vue')) const Video = defineAsyncComponent(() => import('../components/Video.vue'))
const Discuss = defineAsyncComponent(() => import('../components/Discuss.vue')) const Discuss = defineAsyncComponent(() => import('../components/Discuss.vue'))
...@@ -164,6 +165,9 @@ function handleResize() { ...@@ -164,6 +165,9 @@ function handleResize() {
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-tabs type="border-card"> <el-tabs type="border-card">
<el-tab-pane label="实验信息" lazy>
<Info :experiment_id="form.experiment_id"></Info>
</el-tab-pane>
<el-tab-pane label="实训指导" lazy> <el-tab-pane label="实训指导" lazy>
<Book :course_id="form.course_id" :experiment_id="form.experiment_id" :key="resizeKey"></Book> <Book :course_id="form.course_id" :experiment_id="form.experiment_id" :key="resizeKey"></Book>
</el-tab-pane> </el-tab-pane>
......
...@@ -4,8 +4,8 @@ export const json2Array = function (data: any, isValueToNumber = true) { ...@@ -4,8 +4,8 @@ export const json2Array = function (data: any, isValueToNumber = true) {
} }
// 参赛模式 // 参赛模式
export const contestMode: Record<number, any> = { export const contestMode: Record<string, any> = {
1: '个人赛' '1': '个人赛'
} }
// 参赛模式列表 // 参赛模式列表
export const contestModeList = json2Array(contestMode, false) export const contestModeList = json2Array(contestMode, false)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论