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

chore: update

上级 320adfe6
...@@ -32,13 +32,13 @@ function handleClick(data: MessageType) { ...@@ -32,13 +32,13 @@ function handleClick(data: MessageType) {
// 指导老师 // 指导老师
// 实验评分 // 实验评分
if (payload?.channel === 1) { if (payload?.channel === 1) {
router.push({ path: '/admin/lab/record', query: payload }) router.push({ path: '/admin/lab/score', query: payload })
} }
} else if (userStore.role?.id === 6) { } else if (userStore.role?.id === 6) {
// 专家 // 专家
// 大赛评分 // 大赛评分
if (payload?.channel === 3) { if (payload?.channel === 3) {
router.push({ path: '/admin/contest/record', query: payload }) router.push({ path: '/admin/contest/check', query: payload })
} }
} else { } else {
// 学生 // 学生
......
import type { RouteRecordRaw } from 'vue-router'
import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/admin/contest/analyze',
component: AppLayout,
children: [
{ path: 'score', component: () => import('./views/Score.vue') },
{ path: 'student', component: () => import('./views/Student.vue') }
]
}
]
<script setup lang="ts"></script>
<template>
<div></div>
</template>
<script setup lang="ts"></script>
<template>
<div></div>
</template>
import httpRequest from '@/utils/axios' import httpRequest from '@/utils/axios'
// 获取实验记录列表 // 获取大赛评分列表
export function getExperimentRecordList(params?: { export function getCheckList(params?: {
competition_id?: string competition_id?: string
check_status?: string check_status?: string
organ_id?: string organ_id?: string
......
...@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue' ...@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [ export const routes: Array<RouteRecordRaw> = [
{ {
path: '/admin/contest/record', path: '/admin/contest/check',
component: AppLayout, component: AppLayout,
children: [ children: [
{ path: '', component: () => import('./views/Index.vue') }, { path: '', component: () => import('./views/Index.vue') },
......
<script setup lang="ts"> <script setup lang="ts">
import { Refresh, Upload } from '@element-plus/icons-vue' import { Refresh, Upload } from '@element-plus/icons-vue'
import AppList from '@/components/base/AppList.vue' import AppList from '@/components/base/AppList.vue'
import { getExperimentRecordList } from '../api' import { getCheckList } from '../api'
import { useFilterList } from '../composables/useFilterList' import { useFilterList } from '../composables/useFilterList'
const SyncExamDialog = defineAsyncComponent(() => import('../components/SyncExamDialog.vue')) const SyncExamDialog = defineAsyncComponent(() => import('../components/SyncExamDialog.vue'))
...@@ -16,7 +16,7 @@ const appList = $ref<InstanceType<typeof AppList> | null>(null) ...@@ -16,7 +16,7 @@ const appList = $ref<InstanceType<typeof AppList> | null>(null)
const listOptions = $computed(() => { const listOptions = $computed(() => {
return { return {
remote: { remote: {
httpRequest: getExperimentRecordList, httpRequest: getCheckList,
params: { params: {
competition_id: '', competition_id: '',
check_status: '', check_status: '',
...@@ -120,7 +120,7 @@ function onUpdateSuccess() { ...@@ -120,7 +120,7 @@ function onUpdateSuccess() {
</template> </template>
<template #table-x="{ row }"> <template #table-x="{ row }">
<el-button text type="primary" v-if="row.publish_status === '0'" v-permission="'v1-expert-check-set-score'"> <el-button text type="primary" v-if="row.publish_status === '0'" v-permission="'v1-expert-check-set-score'">
<router-link :to="`/admin/contest/record/${row.id}`" target="_blank">评分</router-link> <router-link :to="`/admin/contest/check/${row.id}`" target="_blank">评分</router-link>
</el-button> </el-button>
</template> </template>
</AppList> </AppList>
......
...@@ -3,6 +3,7 @@ import type { ContestBookItem } from '../types' ...@@ -3,6 +3,7 @@ import type { ContestBookItem } from '../types'
import { CirclePlus } from '@element-plus/icons-vue' import { CirclePlus } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import AppList from '@/components/base/AppList.vue' import AppList from '@/components/base/AppList.vue'
import ViewBookPreviewDialog from './ViewBookPreviewDialog.vue'
import { getContestBook, deleteContestBook } from '../api' import { getContestBook, deleteContestBook } from '../api'
const FormDialog = defineAsyncComponent(() => import('./ViewBookFormDialog.vue')) const FormDialog = defineAsyncComponent(() => import('./ViewBookFormDialog.vue'))
...@@ -46,6 +47,12 @@ function handleUpdate(row: ContestBookItem) { ...@@ -46,6 +47,12 @@ function handleUpdate(row: ContestBookItem) {
rowData.value = row rowData.value = row
dialogVisible = true dialogVisible = true
} }
// 查阅
let viewVisible = $ref(false)
function handleView(row: ContestBookItem) {
rowData.value = row
viewVisible = true
}
// 删除 // 删除
function handleRemoveClass(row: ContestBookItem) { function handleRemoveClass(row: ContestBookItem) {
ElMessageBox.confirm('确定要删除吗?', '提示').then(() => { ElMessageBox.confirm('确定要删除吗?', '提示').then(() => {
...@@ -68,7 +75,9 @@ function onUpdateSuccess() { ...@@ -68,7 +75,9 @@ function onUpdateSuccess() {
> >
</template> </template>
<template #table-x="{ row }"> <template #table-x="{ row }">
<el-button link round type="success" v-permission="'competition-book-detail'">查阅</el-button> <el-button link round type="info" @click="handleView(row)" v-permission="'competition-book-detail'"
>查阅</el-button
>
<el-button link round type="primary" @click="handleUpdate(row)" v-permission="'competition-book-update'" <el-button link round type="primary" @click="handleUpdate(row)" v-permission="'competition-book-update'"
>编辑</el-button >编辑</el-button
> >
...@@ -78,4 +87,5 @@ function onUpdateSuccess() { ...@@ -78,4 +87,5 @@ function onUpdateSuccess() {
</template> </template>
</AppList> </AppList>
<FormDialog v-model="dialogVisible" :data="rowData" @update="onUpdateSuccess" v-if="dialogVisible"></FormDialog> <FormDialog v-model="dialogVisible" :data="rowData" @update="onUpdateSuccess" v-if="dialogVisible"></FormDialog>
<ViewBookPreviewDialog v-model="viewVisible" :data="rowData" v-if="viewVisible && rowData"></ViewBookPreviewDialog>
</template> </template>
<script setup lang="ts">
import type { ContestBookItem } from '../types'
import Preview from '@/components/Preview.vue'
interface Props {
data: ContestBookItem
}
const props = defineProps<Props>()
const file = $computed(() => {
return JSON.parse(props.data.url)
})
</script>
<template>
<el-dialog title="查阅训练指导书">
<Preview :url="file.url" style="height: 60vh"></Preview>
</el-dialog>
</template>
...@@ -3,6 +3,7 @@ import type { ContestVideoItem } from '../types' ...@@ -3,6 +3,7 @@ import type { ContestVideoItem } from '../types'
import { CirclePlus } from '@element-plus/icons-vue' import { CirclePlus } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import AppList from '@/components/base/AppList.vue' import AppList from '@/components/base/AppList.vue'
import ViewVideoPreviewDialog from './ViewVideoPreviewDialog.vue'
import { getContestVideoList, deleteContestVideo } from '../api' import { getContestVideoList, deleteContestVideo } from '../api'
const FormDialog = defineAsyncComponent(() => import('./ViewVideoFormDialog.vue')) const FormDialog = defineAsyncComponent(() => import('./ViewVideoFormDialog.vue'))
...@@ -43,6 +44,12 @@ function handleUpdate(row: ContestVideoItem) { ...@@ -43,6 +44,12 @@ function handleUpdate(row: ContestVideoItem) {
rowData.value = row rowData.value = row
dialogVisible = true dialogVisible = true
} }
// 查阅
let viewVisible = $ref(false)
function handleView(row: ContestVideoItem) {
rowData.value = row
viewVisible = true
}
// 删除 // 删除
function handleRemoveClass(row: ContestVideoItem) { function handleRemoveClass(row: ContestVideoItem) {
ElMessageBox.confirm('确定要删除吗?', '提示').then(() => { ElMessageBox.confirm('确定要删除吗?', '提示').then(() => {
...@@ -65,7 +72,9 @@ function onUpdateSuccess() { ...@@ -65,7 +72,9 @@ function onUpdateSuccess() {
> >
</template> </template>
<template #table-x="{ row }"> <template #table-x="{ row }">
<el-button link round type="success" v-permission="'competition-video-detail'">查阅</el-button> <el-button link round type="info" @click="handleView(row)" v-permission="'competition-video-detail'"
>查阅</el-button
>
<el-button link round type="primary" @click="handleUpdate(row)" v-permission="'competition-video-update'" <el-button link round type="primary" @click="handleUpdate(row)" v-permission="'competition-video-update'"
>编辑</el-button >编辑</el-button
> >
...@@ -75,4 +84,5 @@ function onUpdateSuccess() { ...@@ -75,4 +84,5 @@ function onUpdateSuccess() {
</template> </template>
</AppList> </AppList>
<FormDialog v-model="dialogVisible" :data="rowData" @update="onUpdateSuccess" v-if="dialogVisible"></FormDialog> <FormDialog v-model="dialogVisible" :data="rowData" @update="onUpdateSuccess" v-if="dialogVisible"></FormDialog>
<ViewVideoPreviewDialog v-model="viewVisible" :data="rowData" v-if="viewVisible && rowData"></ViewVideoPreviewDialog>
</template> </template>
<script setup lang="ts">
import type { ContestVideoItem } from '../types'
import AppVideoPlayer from '@/components/base/AppVideoPlayer.vue'
import { getContestVideoPalyInfo } from '../api'
interface Props {
data: ContestVideoItem
}
const props = defineProps<Props>()
let playList = $ref<any>([])
function fetchInfo() {
getContestVideoPalyInfo({ source_id: props.data.source_id }).then(res => {
playList = res.data.replay_list.play_info_list
})
}
const playUrl = $computed(() => {
return playList[0]?.PlayURL || ''
})
onMounted(() => {
fetchInfo()
})
</script>
<template>
<el-dialog title="查阅操作视频">
<AppVideoPlayer
:options="{ fluid: true, sources: [{ src: playUrl, type: 'application/x-mpegURL' }] }"
v-if="playUrl"></AppVideoPlayer>
</el-dialog>
</template>
...@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue' ...@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [ export const routes: Array<RouteRecordRaw> = [
{ {
path: '/admin/lab/record', path: '/admin/lab/score',
component: AppLayout, component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }] children: [{ path: '', component: () => import('./views/Index.vue') }]
} }
......
...@@ -24,7 +24,7 @@ function handleChange(id: string, type: number) { ...@@ -24,7 +24,7 @@ function handleChange(id: string, type: number) {
<template> <template>
<div class="bg"> <div class="bg">
<router-link to="/admin/contest/score" class="link1"></router-link> <router-link to="/admin/contest/score" class="link1"></router-link>
<router-link to="/admin/contest/record" class="link2"></router-link> <router-link to="/admin/contest/check" class="link2"></router-link>
<router-link to="/admin/contest/discuss" class="link3"></router-link> <router-link to="/admin/contest/discuss" class="link3"></router-link>
<router-link to="/admin/contest/discuss" class="link4"></router-link> <router-link to="/admin/contest/discuss" class="link4"></router-link>
</div> </div>
......
...@@ -24,7 +24,7 @@ function handleChange(id: string, type: number) { ...@@ -24,7 +24,7 @@ function handleChange(id: string, type: number) {
<template> <template>
<div class="bg"> <div class="bg">
<router-link to="/admin/lab/book" class="link1"></router-link> <router-link to="/admin/lab/book" class="link1"></router-link>
<router-link to="/admin/lab/record" class="link2"></router-link> <router-link to="/admin/lab/score" class="link2"></router-link>
<router-link to="/admin/lab/video" class="link3"></router-link> <router-link to="/admin/lab/video" class="link3"></router-link>
<router-link to="/admin/lab/discuss" class="link4"></router-link> <router-link to="/admin/lab/discuss" class="link4"></router-link>
</div> </div>
......
<script setup lang="ts"></script> <script setup lang="ts"></script>
<template> <template>
<AppCard></AppCard> <div></div>
</template> </template>
...@@ -58,7 +58,7 @@ const adminMenus: IMenuItem[] = [ ...@@ -58,7 +58,7 @@ const adminMenus: IMenuItem[] = [
}, },
{ {
name: '实验成绩管理', name: '实验成绩管理',
path: '/admin/lab/record', path: '/admin/lab/score',
tag: 'v1-teacher-record' tag: 'v1-teacher-record'
} }
] ]
...@@ -89,7 +89,7 @@ const adminMenus: IMenuItem[] = [ ...@@ -89,7 +89,7 @@ const adminMenus: IMenuItem[] = [
}, },
{ {
name: '大赛评分', name: '大赛评分',
path: '/admin/contest/record', path: '/admin/contest/check',
tag: 'v1-expert-check' tag: 'v1-expert-check'
}, },
{ {
...@@ -105,11 +105,11 @@ const adminMenus: IMenuItem[] = [ ...@@ -105,11 +105,11 @@ const adminMenus: IMenuItem[] = [
children: [ children: [
{ {
name: '赛项成绩画像', name: '赛项成绩画像',
path: '/admin/contest/score/analyze' path: '/admin/contest/analyze/score'
}, },
{ {
name: '学生个人成绩画像', name: '学生个人成绩画像',
path: '/admin/contest/student/analyze' path: '/admin/contest/analyze/student'
} }
] ]
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论