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

chore: update

上级 eff22a07
......@@ -32,13 +32,13 @@ function handleClick(data: MessageType) {
// 指导老师
// 实验评分
if (payload?.channel === 1) {
router.push({ path: '/teacher/lab/record', query: payload })
router.push({ path: '/admin/lab/record', query: payload })
}
} else if (userStore.role?.id === 6) {
// 专家
// 大赛评分
if (payload?.channel === 3) {
router.push({ path: '/teacher/contest/record', query: payload })
router.push({ path: '/admin/contest/record', query: payload })
}
} else {
// 学生
......
......@@ -90,14 +90,21 @@ function onUpdateSuccess() {
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<!-- <el-button type="primary" round :icon="CirclePlus" @click="handleAdd">新增参赛选手</el-button> -->
<el-button type="primary" round :icon="Upload" @click="importVisible = true">批量导入</el-button>
<el-button
type="primary"
round
:icon="Upload"
@click="importVisible = true"
v-permission="'competition-competitor-import'"
>批量导入</el-button
>
</template>
<template #table-x="{ row }: { row: Contestant }">
<el-button type="primary" round @click="handleView(row)" v-permission="'v1-backend-experiment-view'"
<el-button type="primary" round @click="handleView(row)" v-permission="'competition-competitor-detail'"
>查看</el-button
>
<el-button type="primary" round @click="handleUpdate(row)" v-permission="'v1-backend-experiment-update'"
<el-button type="primary" round @click="handleUpdate(row)" v-permission="'competition-competitor-update'"
>编辑</el-button
>
</template>
......@@ -108,15 +115,13 @@ function onUpdateSuccess() {
v-model="dialogVisible"
:data="rowData"
@update="onUpdateSuccess"
v-if="dialogVisible && rowData"
></FormDialog>
v-if="dialogVisible && rowData"></FormDialog>
<!-- 查看 -->
<ViewDialog
v-model="viewVisible"
:data="rowData"
@update="onUpdateSuccess"
v-if="viewVisible && rowData"
></ViewDialog>
v-if="viewVisible && rowData"></ViewDialog>
<!-- 批量导入 -->
<ImportDialog v-model="importVisible" @update="onUpdateSuccess" v-if="importVisible"></ImportDialog>
</template>
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/teacher/contest/discuss',
path: '/admin/contest/discuss',
component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }]
}
......
......@@ -63,7 +63,7 @@ function onUpdateSuccess() {
<span :class="{ 'is-info': !!row.replies_num }">{{ row.replies_num }}</span>
</template>
<template #table-x="{ row }">
<el-button text type="primary" @click="handleComment(row)" v-permission="'v1-teacher-discussion-view'"
<el-button text type="primary" @click="handleComment(row)" v-permission="'v1-teacher-train-discussion-comment'"
>答疑</el-button
>
</template>
......@@ -73,8 +73,7 @@ function onUpdateSuccess() {
v-model="dialogVisible"
:data="rowData"
@update="onUpdateSuccess"
v-if="dialogVisible && rowData"
></DiscussDialog>
v-if="dialogVisible && rowData"></DiscussDialog>
</template>
<style lang="scss" scoped>
......
......@@ -58,7 +58,7 @@ const listOptions = $computed(() => {
})
const importVisible = $ref(false)
const rowData = ref<Expert | undefined | null>(null)
const rowData = ref<Expert>()
// 查看
let viewDialogVisible = $ref(false)
......@@ -69,7 +69,7 @@ function handleView(row: Expert) {
// 新增
function handleAdd() {
rowData.value = null
rowData.value = undefined
dialogVisible = true
}
......@@ -89,17 +89,22 @@ function onUpdateSuccess() {
<AppCard title="评分专家管理">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" round :icon="CirclePlus" @click="handleAdd">新增评分专家</el-button>
<el-button type="primary" round :icon="Upload" @click="importVisible = true">批量导入</el-button>
<el-button type="primary" round :icon="CirclePlus" @click="handleAdd" v-permission="'expert-create'"
>新增评分专家</el-button
>
<el-button
type="primary"
round
:icon="Upload"
@click="importVisible = true"
v-permission="'expert-batch-import'"
>批量导入</el-button
>
</template>
<template #table-x="{ row }: { row: Expert }">
<el-button type="primary" round @click="handleView(row)" v-permission="'v1-backend-experiment-view'"
>查看</el-button
>
<el-button type="primary" round @click="handleUpdate(row)" v-permission="'v1-backend-experiment-update'"
>编辑</el-button
>
<el-button type="primary" round @click="handleView(row)" v-permission="'expert-detail'">查看</el-button>
<el-button type="primary" round @click="handleUpdate(row)" v-permission="'expert-update'">编辑</el-button>
</template>
</AppList>
</AppCard>
......
......@@ -46,7 +46,7 @@ const exportUrl = $computed(() => {
<el-dialog title="参赛选手列表">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<a :href="exportUrl" target="_blank">
<a :href="exportUrl" target="_blank" v-permission="'competition-competitor-export'">
<el-button type="primary">导出</el-button>
</a>
</template>
......
......@@ -63,17 +63,16 @@ function onUpdateSuccess() {
<template>
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd">新增</el-button>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'competition-book-create'"
>新增</el-button
>
</template>
<template #table-x="{ row }">
<el-button link round type="success">查阅</el-button>
<el-button link round type="primary" @click="handleUpdate(row)">编辑</el-button>
<el-button
link
round
type="danger"
@click="handleRemoveClass(row)"
v-permission="'v1-backend-experiment-class-add'"
<el-button link round type="success" v-permission="'competition-book-detail'">查阅</el-button>
<el-button link round type="primary" @click="handleUpdate(row)" v-permission="'competition-book-update'"
>编辑</el-button
>
<el-button link round type="danger" @click="handleRemoveClass(row)" v-permission="'competition-book-delete'"
>删除</el-button
>
</template>
......
......@@ -60,17 +60,16 @@ function onUpdateSuccess() {
<template>
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd">新增</el-button>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'competition-video-create'"
>新增</el-button
>
</template>
<template #table-x="{ row }">
<el-button link round type="success">查阅</el-button>
<el-button link round type="primary" @click="handleUpdate(row)">编辑</el-button>
<el-button
link
round
type="danger"
@click="handleRemoveClass(row)"
v-permission="'v1-backend-experiment-class-add'"
<el-button link round type="success" v-permission="'competition-video-detail'">查阅</el-button>
<el-button link round type="primary" @click="handleUpdate(row)" v-permission="'competition-video-update'"
>编辑</el-button
>
<el-button link round type="danger" @click="handleRemoveClass(row)" v-permission="'competition-video-delete'"
>删除</el-button
>
</template>
......
......@@ -73,18 +73,16 @@ function onUpdateSuccess() {
<AppCard title="赛项管理">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" :icon="CirclePlus" v-permission="'v1-backend-experiment-create'" @click="handleAdd"
>新增赛项</el-button
>
<el-button type="primary" :icon="CirclePlus" v-permission="'competition-create'" @click="handleAdd">
新增赛项
</el-button>
</template>
<template #table-x="{ row }: { row: ContestItem }">
<el-button type="primary" round v-permission="'v1-backend-experiment-view'">
<el-button type="primary" round v-permission="'competition-detail'">
<router-link :to="`/admin/contest/items/${row.id}`" target="_blank">查看</router-link>
</el-button>
<el-button type="primary" round @click="handleUpdate(row)" v-permission="'v1-backend-experiment-update'"
>编辑</el-button
>
<el-button type="primary" round @click="handleUpdate(row)" v-permission="'competition-edit'">编辑</el-button>
</template>
</AppList>
</AppCard>
......
......@@ -68,10 +68,18 @@ const scoringRulesBookVisible = $ref(false)
<template>
<AppCard title="查看赛项信息">
<template #header-aside>
<el-button type="primary" @click="scoringRulesVisible = true">评分规则</el-button>
<el-button type="primary" @click="scoringExpertsVisible = true">评分专家</el-button>
<el-button type="primary" @click="contestantVisible = true">参赛选手</el-button>
<el-button type="primary" @click="scoringRulesBookVisible = true">评分细则</el-button>
<el-button type="primary" @click="scoringRulesVisible = true" v-permission="'competition-rule'"
>评分规则</el-button
>
<el-button type="primary" @click="scoringExpertsVisible = true" v-permission="'competition-bind-experts'"
>评分专家</el-button
>
<el-button type="primary" @click="contestantVisible = true" v-permission="'competition-competitor-list'"
>参赛选手</el-button
>
<el-button type="primary" @click="scoringRulesBookVisible = true" v-permission="'competition-rubric-update'"
>评分细则</el-button
>
</template>
<div class="top" v-if="detail">
<div class="top-cover">
......@@ -110,8 +118,7 @@ const scoringRulesBookVisible = $ref(false)
<!-- 评分细则 -->
<ScoringRulesBookDialog
v-model="scoringRulesBookVisible"
v-if="scoringRulesBookVisible && detail"
></ScoringRulesBookDialog>
v-if="scoringRulesBookVisible && detail"></ScoringRulesBookDialog>
</template>
<style lang="scss">
......
<script setup lang="ts">
import { ElMessage } from 'element-plus'
import { useMapStore } from '@/stores/map'
import { useFilterList } from '../composables/useFilterList'
import { syncExam } from '../api'
const emit = defineEmits<{
(e: 'update'): void
}>()
// 评分方法
const scoreMethods = useMapStore().getMapValuesByKey('scoring_manner')
const { competitions } = useFilterList()
const form = reactive<any>({
competition: undefined
......@@ -17,6 +22,10 @@ function handleSync(row: any) {
emit('update')
})
}
// 评分方法
function scoreMethodText(value: string) {
return scoreMethods.find(item => item.value == value)?.label || value
}
</script>
<template>
......@@ -29,7 +38,9 @@ function handleSync(row: any) {
</el-form-item>
</el-form>
<el-table :data="form.competition?.rules">
<el-table-column label="评分方法" prop="type" align="center" width="200"></el-table-column>
<el-table-column label="评分方法" prop="type" align="center" width="200">
<template #default="{ row }"> {{ scoreMethodText(row.type) }} </template>
</el-table-column>
<el-table-column label="考试名称" prop="exam_name" align="center"></el-table-column>
<el-table-column label="实考人数/应考人数" align="center" width="160">
<template #default="{ row }"> {{ row.finish_count }}/{{ row.all_count }} </template>
......
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/teacher/contest/score',
path: '/admin/contest/record',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/Index.vue') },
......
......@@ -75,7 +75,9 @@ const dialogVisible = $ref(false)
</p>
</div>
<div>
<el-button type="primary" @click="dialogVisible = true">评分</el-button>
<el-button type="primary" @click="dialogVisible = true" v-permission="'v1-expert-check-set-score'"
>评分</el-button
>
</div>
</el-row>
</AppCard>
......
......@@ -94,7 +94,7 @@ function onUpdateSuccess() {
round
:icon="Refresh"
@click="syncDialogVisible = true"
v-permission="'v1-teacher-record-upload'"
v-permission="'v1-expert-check-sync-exam'"
>系统同步考试成绩</el-button
>
<el-button
......@@ -102,7 +102,7 @@ function onUpdateSuccess() {
round
:icon="Upload"
@click="importExamVisible = true"
v-permission="'v1-teacher-record-upload'"
v-permission="'v1-expert-check-import-exam'"
>批量导入考试成绩</el-button
>
<el-button
......@@ -110,7 +110,7 @@ function onUpdateSuccess() {
round
:icon="Upload"
@click="importScoreVisible = true"
v-permission="'v1-teacher-record-upload'"
v-permission="'v1-expert-check-import-score'"
>批量导入完整评分</el-button
>
</template>
......@@ -119,8 +119,8 @@ function onUpdateSuccess() {
<span :class="{ 'is-info': row.score !== '--' }">{{ row.score }}</span>
</template>
<template #table-x="{ row }">
<el-button text type="primary" v-if="row.publish_status === '0'" v-permission="'v1-teacher-record-check'">
<router-link :to="`/teacher/contest/record/${row.id}`" target="_blank">评分</router-link>
<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>
</el-button>
</template>
</AppList>
......
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/teacher/contest/record',
path: '/admin/contest/score',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/Index.vue') },
......
......@@ -60,14 +60,14 @@ function onUpdateSuccess() {
<AppList v-bind="listOptions" ref="appList">
<template #table-teachers="{ row }"> {{ row.teachers.join() }} </template>
<template #table-x="{ row }">
<el-button round type="primary" v-permission="'v1-teacher-record-check'">
<router-link :to="`/teacher/contest/score/${row.id}?name=${row.name}`" target="_blank">查看成绩</router-link>
<el-button round type="primary" v-permission="'v1-expert-score-competitor-view'">
<router-link :to="`/admin/contest/score/${row.id}?name=${row.name}`" target="_blank">查看成绩</router-link>
</el-button>
<el-button
round
type="primary"
@click="handlePublish(row)"
v-permission="'v1-teacher-record-check'"
v-permission="'v1-expert-score-publish'"
v-if="row.publish_status !== '1'">
发布赛项成绩
</el-button>
......
......@@ -22,7 +22,7 @@ const genFileClassNames = $computed(() => {
<div class="button-group">
<el-tooltip effect="dark" content="查看">
<div class="button icon-view" v-permission="'v1-teacher-book-view'">
<router-link :to="`/teacher/lab/book/${data.id}`" target="_blank"></router-link>
<router-link :to="`/admin/lab/book/${data.id}`" target="_blank"></router-link>
</div>
</el-tooltip>
<el-tooltip effect="dark" content="编辑">
......
......@@ -3,11 +3,11 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/teacher/lab',
redirect: '/teacher/lab/book'
path: '/admin/lab',
redirect: '/admin/lab/book'
},
{
path: '/teacher/lab/book',
path: '/admin/lab/book',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/Index.vue') },
......
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/teacher/lab/record',
path: '/admin/lab/discuss',
component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }]
}
......
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/teacher/lab/discuss',
path: '/admin/lab/record',
component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }]
}
......
......@@ -9,7 +9,7 @@ defineProps<Props>()
<template>
<div class="list-item">
<div class="list-item-pic">
<router-link :to="`/teacher/lab/video/${data.id}`" target="_blank">
<router-link :to="`/admin/lab/video/${data.id}`" target="_blank">
<el-image :src="data.cover" fit="cover">
<template #error>
<img src="/images/video_poster.png" />
......@@ -21,7 +21,7 @@ defineProps<Props>()
<div class="list-item-main">
<p>{{ data.name }}</p>
<div class="buttons">
<router-link :to="`/teacher/lab/video/${data.id}`" target="_blank" v-permission="'v1-teacher-video-view'">
<router-link :to="`/admin/lab/video/${data.id}`" target="_blank" v-permission="'v1-teacher-video-view'">
<el-button type="primary" auto-insert-space>查看</el-button>
</router-link>
<el-button
......
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/teacher/lab/video',
path: '/admin/lab/video',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/Index.vue') },
......
......@@ -14,19 +14,19 @@ onMounted(() => {
})
function handleChange(id: string, type: number) {
if (type === 1) {
router.push({ path: '/teacher/lab/book', query: { experiment_id: id } })
router.push({ path: '/admin/lab/book', query: { experiment_id: id } })
} else if (type === 2) {
router.push({ path: '/teacher/lab/video', query: { experiment_id: id } })
router.push({ path: '/admin/lab/video', query: { experiment_id: id } })
}
}
</script>
<template>
<div class="bg">
<router-link to="/teacher/contest/score" class="link1"></router-link>
<router-link to="/teacher/contest/record" class="link2"></router-link>
<router-link to="/teacher/contest/discuss" class="link3"></router-link>
<router-link to="/teacher/contest/discuss" class="link4"></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/discuss" class="link3"></router-link>
<router-link to="/admin/contest/discuss" class="link4"></router-link>
</div>
<div class="select-group">
<el-select size="large" placeholder="大赛评分" @change="handleChange($event, 1)">
......
......@@ -14,19 +14,19 @@ onMounted(() => {
})
function handleChange(id: string, type: number) {
if (type === 1) {
router.push({ path: '/teacher/lab/book', query: { experiment_id: id } })
router.push({ path: '/admin/lab/book', query: { experiment_id: id } })
} else if (type === 2) {
router.push({ path: '/teacher/lab/video', query: { experiment_id: id } })
router.push({ path: '/admin/lab/video', query: { experiment_id: id } })
}
}
</script>
<template>
<div class="bg">
<router-link to="/teacher/lab/book" class="link1"></router-link>
<router-link to="/teacher/lab/record" class="link2"></router-link>
<router-link to="/teacher/lab/video" class="link3"></router-link>
<router-link to="/teacher/lab/discuss" class="link4"></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/video" class="link3"></router-link>
<router-link to="/admin/lab/discuss" class="link4"></router-link>
</div>
<div class="select-group">
<el-select size="large" placeholder="实验指导书" @change="handleChange($event, 1)">
......
......@@ -28,7 +28,7 @@ const typeText = $computed(() => {
<li>参赛形式:{{ typeText }}</li>
<li>所属学校:{{ data.org_name }}</li>
</ul>
<router-link :to="`/student/contest/lab/${data.id}`" target="_blank" v-if="isMy">
<router-link :to="`/student/contest/lab/${data.id}`" v-if="isMy">
<el-button round type="primary">我要训练</el-button>
</router-link>
<router-link :to="{ path: '/student/contest/join', query: { id: data.id, name: data.name } }" v-else>
......
......@@ -5,8 +5,6 @@ import { useUserStore } from '@/stores/user'
interface State {
studentMenus: IMenuItem[]
adminMenus: IMenuItem[]
teacherMenus: IMenuItem[]
expertMenus: IMenuItem[]
}
// 学生菜单
......@@ -28,103 +26,105 @@ const studentMenus: IMenuItem[] = [
path: '/student/contest/score'
}
]
// 教师菜单
const teacherMenus: IMenuItem[] = [
{
name: '首页',
path: '/'
},
{
name: '实验指导书管理',
path: '/teacher/lab/book',
tag: 'v1-teacher-book'
},
{
name: '实验操作视频管理',
path: '/teacher/lab/video',
tag: 'v1-teacher-video'
},
{
name: '实验讨论交流',
path: '/teacher/lab/discuss',
tag: 'v1-teacher-discussion'
},
{
name: '实验成绩管理',
path: '/teacher/lab/record',
tag: 'v1-teacher-record'
},
{
name: '大赛训练答疑',
path: '/teacher/contest/discuss'
}
]
// 专家菜单
const expertMenus: IMenuItem[] = [
// 管理员菜单
const adminMenus: IMenuItem[] = [
{
name: '首页',
path: '/'
},
{
name: '大赛评分',
path: '/teacher/contest/record'
name: '智能营销',
path: '/admin/lab',
children: [
{
name: '实验管理',
path: '/admin/lab/experiment',
tag: 'v1-backend-experiment'
},
{
name: '实验指导书管理',
path: '/admin/lab/book',
tag: 'v1-teacher-book'
},
{
name: '实验操作视频管理',
path: '/admin/lab/video',
tag: 'v1-teacher-video'
},
{
name: '实验讨论交流',
path: '/admin/lab/discuss',
tag: 'v1-teacher-discussion'
},
{
name: '实验成绩管理',
path: '/admin/lab/record',
tag: 'v1-teacher-record'
}
]
},
{
name: '大赛发布成绩',
path: '/teacher/contest/score'
name: '技能大赛',
path: '/admin/contest',
children: [
{
name: '赛项管理',
path: '/admin/contest/items',
tag: 'competition'
},
{
name: '参赛选手管理',
path: '/admin/contest/contestants',
tag: 'competition-competitor'
},
{
name: '评分专家管理',
path: '/admin/contest/experts',
tag: 'expert'
},
{
name: '大赛训练答疑',
path: '/admin/contest/discuss',
tag: 'v1-teacher-train-discussion'
},
{
name: '大赛评分',
path: '/admin/contest/record',
tag: 'v1-expert-check'
},
{
name: '大赛发布成绩',
path: '/admin/contest/score',
tag: 'v1-expert-score'
}
]
},
{
name: '大赛成绩分析',
path: '/teacher/contest/analyze',
name: '成绩分析',
path: '/admin/contest/analyze',
children: [
{
name: '赛项成绩画像',
path: '/teacher/contest/score/analyze'
path: '/admin/contest/score/analyze'
},
{
name: '学生个人成绩画像',
path: '/teacher/contest/student/analyze'
path: '/admin/contest/student/analyze'
}
]
}
]
// 管理员菜单
const adminMenus: IMenuItem[] = [
{
name: '实验管理',
path: '/admin/lab/experiment',
tag: 'v1-backend-experiment'
},
{
name: '赛项管理',
path: '/admin/contest/items'
},
{
name: '参赛选手管理',
path: '/admin/contest/contestants'
},
{
name: '评分专家管理',
path: '/admin/contest/experts'
}
]
export const useMenuStore = defineStore({
id: 'menu',
state: (): State => ({
studentMenus,
adminMenus,
teacherMenus,
expertMenus
adminMenus
}),
getters: {
menus: state => {
const userStore = useUserStore()
if (userStore.role?.id === 6) {
return state.expertMenus
} else if (userStore.role?.id === 5) {
return state.teacherMenus
} else if (userStore.role?.id === 1) {
if (userStore.role?.id === 1) {
return state.studentMenus
} else {
return state.adminMenus
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论