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

chore: update

上级 321f7316
...@@ -121,6 +121,7 @@ ...@@ -121,6 +121,7 @@
"useBrowserLocation": true, "useBrowserLocation": true,
"useCached": true, "useCached": true,
"useClipboard": true, "useClipboard": true,
"useCloned": true,
"useColorMode": true, "useColorMode": true,
"useConfirmDialog": true, "useConfirmDialog": true,
"useCounter": true, "useCounter": true,
......
...@@ -122,6 +122,7 @@ declare global { ...@@ -122,6 +122,7 @@ declare global {
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
const useCached: typeof import('@vueuse/core')['useCached'] const useCached: typeof import('@vueuse/core')['useCached']
const useClipboard: typeof import('@vueuse/core')['useClipboard'] const useClipboard: typeof import('@vueuse/core')['useClipboard']
const useCloned: typeof import('@vueuse/core')['useCloned']
const useColorMode: typeof import('@vueuse/core')['useColorMode'] const useColorMode: typeof import('@vueuse/core')['useColorMode']
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
const useCounter: typeof import('@vueuse/core')['useCounter'] const useCounter: typeof import('@vueuse/core')['useCounter']
......
差异被折叠。
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
"@element-plus/icons-vue": "^2.0.9", "@element-plus/icons-vue": "^2.0.9",
"@tinymce/tinymce-vue": "^5.0.0", "@tinymce/tinymce-vue": "^5.0.0",
"@vant/area-data": "^1.3.2", "@vant/area-data": "^1.3.2",
"@vueuse/core": "^9.1.1", "@vueuse/core": "^9.2.0",
"ali-oss": "^6.17.1", "ali-oss": "^6.17.1",
"axios": "^0.27.2", "axios": "^0.27.2",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
"@types/qs": "^6.9.7", "@types/qs": "^6.9.7",
"@types/ua-parser-js": "^0.7.36", "@types/ua-parser-js": "^0.7.36",
"@types/video.js": "^7.3.46", "@types/video.js": "^7.3.46",
"@vitejs/plugin-vue": "^3.0.3", "@vitejs/plugin-vue": "^3.1.0",
"@vue/eslint-config-typescript": "^11.0.0", "@vue/eslint-config-typescript": "^11.0.0",
"@vue/tsconfig": "^0.1.3", "@vue/tsconfig": "^0.1.3",
"chalk": "^5.0.1", "chalk": "^5.0.1",
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
"sass": "^1.54.8", "sass": "^1.54.8",
"typescript": "~4.7.4", "typescript": "~4.7.4",
"unplugin-auto-import": "^0.11.2", "unplugin-auto-import": "^0.11.2",
"vite": "^3.0.9", "vite": "^3.1.0",
"vite-plugin-checker": "^0.5.1", "vite-plugin-checker": "^0.5.1",
"vue-tsc": "^0.40.5" "vue-tsc": "^0.40.5"
} }
......
...@@ -83,11 +83,3 @@ textarea:focus { ...@@ -83,11 +83,3 @@ textarea:focus {
margin-right: 0 !important; margin-right: 0 !important;
border-bottom: 1px solid #e6e6e6; border-bottom: 1px solid #e6e6e6;
} }
.descriptions-box {
margin-bottom: 20px;
}
.descriptions-box .el-descriptions__body {
padding: 30px 30px 10px;
border-radius: 12px;
}
...@@ -32,7 +32,7 @@ function handleClick(data: MessageType) { ...@@ -32,7 +32,7 @@ function handleClick(data: MessageType) {
// 指导老师 // 指导老师
// 实验评分 // 实验评分
if (payload?.channel === 1) { if (payload?.channel === 1) {
router.push({ path: '/admin/lab/record', query: payload }) router.push({ path: '/teacher/lab/record', query: payload })
} }
} else { } else {
// 学生 // 学生
......
<script setup lang="ts"> <script setup lang="ts">
defineProps<{ title?: string }>() interface Props {
title?: string
hasCardBackground?: boolean
hasBodyBackground?: boolean
}
withDefaults(defineProps<Props>(), { hasBodyBackground: true })
</script> </script>
<template> <template>
<div class="app-card"> <div class="app-card" :class="{ 'has-background': hasCardBackground }">
<div class="app-card-hd"> <div class="app-card-hd">
<slot name="header"> <slot name="header">
<h2 class="app-card-hd__title" v-if="title">{{ title }}</h2> <h2 class="app-card-hd__title" v-if="title">{{ title }}</h2>
...@@ -12,7 +17,7 @@ defineProps<{ title?: string }>() ...@@ -12,7 +17,7 @@ defineProps<{ title?: string }>()
</div> </div>
</slot> </slot>
</div> </div>
<div class="app-card-bd"> <div class="app-card-bd" :class="{ 'has-background': hasBodyBackground }">
<slot></slot> <slot></slot>
</div> </div>
</div> </div>
...@@ -20,10 +25,12 @@ defineProps<{ title?: string }>() ...@@ -20,10 +25,12 @@ defineProps<{ title?: string }>()
<style lang="scss"> <style lang="scss">
.app-card { .app-card {
// background: #fff; &.has-background {
// box-shadow: 0 1px 6px 0 rgb(228 232 235 / 20%); background: #fff;
// border-radius: 6px; box-shadow: 0 1px 6px 0 rgb(228 232 235 / 20%);
// padding: 20px; border-radius: 6px;
padding: 20px;
}
} }
.app-card + .app-card { .app-card + .app-card {
margin-top: 20px; margin-top: 20px;
...@@ -40,4 +47,11 @@ defineProps<{ title?: string }>() ...@@ -40,4 +47,11 @@ defineProps<{ title?: string }>()
line-height: 1; line-height: 1;
color: #333333; color: #333333;
} }
.app-card-bd {
&.has-background {
padding: 20px;
background-color: #fff;
border-radius: 12px;
}
}
</style> </style>
...@@ -165,7 +165,7 @@ defineExpose({ refetch, tableRef }) ...@@ -165,7 +165,7 @@ defineExpose({ refetch, tableRef })
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="table-list-hd-aside"><slot name="header-aside" /></div> <!-- <div class="table-list-hd-aside"><slot name="header-aside" /></div> -->
</div> </div>
<div class="table-list-buttons"><slot name="header-buttons"></slot></div> <div class="table-list-buttons"><slot name="header-buttons"></slot></div>
<slot></slot> <slot></slot>
...@@ -223,12 +223,15 @@ defineExpose({ refetch, tableRef }) ...@@ -223,12 +223,15 @@ defineExpose({ refetch, tableRef })
.table-list-hd { .table-list-hd {
display: flex; display: flex;
margin-bottom: 20px; margin-bottom: 20px;
&:empty {
display: none;
}
} }
.table-list-filter { .table-list-filter {
flex: 1; flex: 1;
padding: 30px 30px 10px; // padding: 30px 30px 10px;
background: #fff; // background: #f8f8f8;
border-radius: 12px; // border-radius: 12px;
} }
.table-list-buttons { .table-list-buttons {
margin-bottom: 20px; margin-bottom: 20px;
......
<script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus'
import type { ContestItem, ExperimentCreateItem } from '../types'
import { ElMessage } from 'element-plus'
import { createExperiment, updateExperiment } from '../api'
import { useMapStore } from '@/stores/map'
interface Props {
data?: ContestItem | null
}
const props = defineProps<Props>()
const emit = defineEmits<{
(e: 'update'): void
(e: 'update:modelValue', visible: boolean): void
}>()
// 数据状态
const status = useMapStore().getMapValuesByKey('system_status')
const formRef = $ref<FormInstance>()
const form = reactive<ExperimentCreateItem>({
organ_id: '',
status: '1',
course_id: '',
name: '',
length: 10,
type: '',
score: 100,
teachers_id: '',
teachers_ids: []
})
watchEffect(() => {
if (!props.data) return
const score = parseFloat(props.data.score)
const length = parseFloat(props.data.length)
const teachers_ids = props.data.teacher.map(item => item.id)
Object.assign(form, props.data, { score, length, teachers_ids })
})
const rules = ref<FormRules>({
name: [{ required: true, message: '请输入赛项名称' }]
})
const isUpdate = $computed(() => {
return !!form.id
})
// 提交
function handleSubmit() {
formRef?.validate().then(() => {
const params = {
...form,
teachers_id: form.teachers_ids?.join(',') || ''
}
isUpdate ? handleUpdate(params) : handleCreate(params)
})
}
// 新增
function handleCreate(params: ExperimentCreateItem) {
createExperiment(params).then(() => {
ElMessage({ message: '创建成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
})
}
// 修改
function handleUpdate(params: ExperimentCreateItem) {
updateExperiment(params).then(() => {
ElMessage({ message: '修改成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
})
}
</script>
<template>
<el-dialog
title="评分规则"
:close-on-click-modal="false"
width="800px"
@update:modelValue="$emit('update:modelValue')"
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="160px">
<el-form-item label="赛项名称" prop="name">
<el-input v-model="form.name" :disabled="isUpdate" />
</el-form-item>
<el-form-item label="多人评分" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="item in status" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="多人评分成绩计算规则" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="item in status" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="最低评分人数" prop="status">
<el-input v-model="form.name" :disabled="isUpdate" />
</el-form-item>
<el-form-item>
<el-table>
<el-table-column prop="date" label="评分规则">
<template #default="{ row }">
<el-input />
</template>
</el-table-column>
<el-table-column prop="date" label="评分方法">
<template #default="{ row }">
<el-input />
</template>
</el-table-column>
<el-table-column prop="date" label="关联考试">
<template #default="{ row }">
<el-input />
</template>
</el-table-column>
<el-table-column prop="date" label="分值">
<template #default="{ row }">
<el-input />
</template>
</el-table-column>
<el-table-column prop="date" label="占比(%)">
<template #default="{ row }">
<el-input />
</template>
</el-table-column>
<el-table-column prop="date" label="操作">
<template #default="{ row }">
<el-button type="text">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-row justify="center">
<el-button type="primary" round auto-insert-space @click="handleSubmit">保存</el-button>
<el-button round auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button>
</el-row>
</el-form>
</el-dialog>
</template>
...@@ -3,6 +3,7 @@ import type { ContestItem } from '../types' ...@@ -3,6 +3,7 @@ import type { ContestItem } from '../types'
import { getContestItem } from '../api' import { getContestItem } from '../api'
const ViewBook = defineAsyncComponent(() => import('../components/ViewBook.vue')) const ViewBook = defineAsyncComponent(() => import('../components/ViewBook.vue'))
const ViewVideo = defineAsyncComponent(() => import('../components/ViewVideo.vue')) const ViewVideo = defineAsyncComponent(() => import('../components/ViewVideo.vue'))
const JudgingRulesDialog = defineAsyncComponent(() => import('../components/JudgingRulesDialog.vue'))
interface Props { interface Props {
id: string id: string
...@@ -11,18 +12,21 @@ const props = defineProps<Props>() ...@@ -11,18 +12,21 @@ const props = defineProps<Props>()
let detail = $ref<ContestItem | null>(null) let detail = $ref<ContestItem | null>(null)
provide('detail', $$(detail)) provide('detail', $$(detail))
function fetchInfo() { function fetchInfo() {
getContestItem({ experiment_id: props.id }).then(res => { getContestItem({ experiment_id: props.id }).then(res => {
detail = res.data detail = res.data
}) })
} }
onMounted(() => fetchInfo) onMounted(fetchInfo)
const judgingRulesVisible = $ref(true)
</script> </script>
<template> <template>
<AppCard title="赛项管理"> <AppCard title="赛项信息">
<template #header-aside> <template #header-aside>
<el-button type="primary">评分规则</el-button> <el-button type="primary" @click="judgingRulesVisible = true">评分规则</el-button>
<el-button type="primary">评分专家</el-button> <el-button type="primary">评分专家</el-button>
<el-button type="primary">参赛选手</el-button> <el-button type="primary">参赛选手</el-button>
<el-button type="primary">评分细则</el-button> <el-button type="primary">评分细则</el-button>
...@@ -33,13 +37,12 @@ onMounted(() => fetchInfo) ...@@ -33,13 +37,12 @@ onMounted(() => fetchInfo)
<el-descriptions-item label="赛项课程:">{{ detail.course_name }}</el-descriptions-item> <el-descriptions-item label="赛项课程:">{{ detail.course_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> </el-descriptions>
<el-tabs>
<el-tab-pane label="训练指导书" lazy>
<ViewBook></ViewBook>
</el-tab-pane>
<el-tab-pane label="操作视频" lazy>
<ViewVideo></ViewVideo>
</el-tab-pane>
</el-tabs>
</AppCard> </AppCard>
<AppCard title="训练指导书">
<ViewBook></ViewBook>
</AppCard>
<AppCard title="操作视频">
<ViewVideo></ViewVideo>
</AppCard>
<JudgingRulesDialog v-model="judgingRulesVisible" v-if="judgingRulesVisible"></JudgingRulesDialog>
</template> </template>
...@@ -58,7 +58,7 @@ function handleRefetch() { ...@@ -58,7 +58,7 @@ function handleRefetch() {
<template #table-x="{ row }"> <template #table-x="{ row }">
<el-button type="primary" link> <el-button type="primary" link>
<router-link <router-link
:to="`/admin/system/experiment/group/${row.id}`" :to="`/admin/lab/experiment/group/${row.id}`"
target="_blank" target="_blank"
v-permission="'v1-backend-experiment-team-view'" v-permission="'v1-backend-experiment-team-view'"
>小组成员</router-link >小组成员</router-link
......
...@@ -3,9 +3,9 @@ import AppLayout from '@/components/layout/Index.vue' ...@@ -3,9 +3,9 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [ export const routes: Array<RouteRecordRaw> = [
{ {
path: '/admin/system', path: '/admin/lab',
component: AppLayout, component: AppLayout,
redirect: '/admin/system/experiment', redirect: '/admin/lab/experiment',
children: [ children: [
{ path: 'experiment', component: () => import('./views/Index.vue') }, { path: 'experiment', component: () => import('./views/Index.vue') },
{ path: 'experiment/:id', component: () => import('./views/View.vue'), props: true }, { path: 'experiment/:id', component: () => import('./views/View.vue'), props: true },
......
...@@ -67,10 +67,10 @@ function onUpdateSuccess() { ...@@ -67,10 +67,10 @@ function onUpdateSuccess() {
<template #table-x="{ row }: { row: ExperimentItem }"> <template #table-x="{ row }: { row: ExperimentItem }">
<el-button type="primary" round v-permission="'v1-backend-experiment-view'"> <el-button type="primary" round v-permission="'v1-backend-experiment-view'">
<router-link :to="`/admin/system/experiment/${row.id}`" target="_blank">查看</router-link> <router-link :to="`/admin/lab/experiment/${row.id}`" target="_blank">查看</router-link>
</el-button> </el-button>
<!-- <el-button type="primary" round v-permission="'v1-backend-experiment-view'"> <!-- <el-button type="primary" round v-permission="'v1-backend-experiment-view'">
<router-link :to="`/admin/system/experiment/${row.id}`" target="_blank">关联班级与分组</router-link> <router-link :to="`/admin/lab/experiment/${row.id}`" target="_blank">关联班级与分组</router-link>
</el-button> --> </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="'v1-backend-experiment-update'"
>编辑</el-button >编辑</el-button
......
...@@ -14,19 +14,19 @@ onMounted(() => { ...@@ -14,19 +14,19 @@ onMounted(() => {
}) })
function handleChange(id: string, type: number) { function handleChange(id: string, type: number) {
if (type === 1) { if (type === 1) {
router.push({ path: '/admin/lab/book', query: { experiment_id: id } }) router.push({ path: '/teacher/lab/book', query: { experiment_id: id } })
} else if (type === 2) { } else if (type === 2) {
router.push({ path: '/admin/lab/video', query: { experiment_id: id } }) router.push({ path: '/teacher/lab/video', query: { experiment_id: id } })
} }
} }
</script> </script>
<template> <template>
<div class="bg"> <div class="bg">
<router-link to="/admin/lab/book" class="link1"></router-link> <router-link to="/teacher/lab/book" class="link1"></router-link>
<router-link to="/admin/lab/record" class="link2"></router-link> <router-link to="/teacher/lab/record" class="link2"></router-link>
<router-link to="/admin/lab/video" class="link3"></router-link> <router-link to="/teacher/lab/video" class="link3"></router-link>
<router-link to="/admin/lab/discuss" class="link4"></router-link> <router-link to="/teacher/lab/discuss" class="link4"></router-link>
</div> </div>
<div class="select-group"> <div class="select-group">
<el-select size="large" placeholder="实验指导书" @change="handleChange($event, 1)"> <el-select size="large" placeholder="实验指导书" @change="handleChange($event, 1)">
......
...@@ -22,7 +22,7 @@ const genFileClassNames = $computed(() => { ...@@ -22,7 +22,7 @@ const genFileClassNames = $computed(() => {
<div class="button-group"> <div class="button-group">
<el-tooltip effect="dark" content="查看"> <el-tooltip effect="dark" content="查看">
<div class="button icon-view" v-permission="'v1-teacher-book-view'"> <div class="button icon-view" v-permission="'v1-teacher-book-view'">
<router-link :to="`/admin/lab/book/${data.id}`" target="_blank"></router-link> <router-link :to="`/teacher/lab/book/${data.id}`" target="_blank"></router-link>
</div> </div>
</el-tooltip> </el-tooltip>
<el-tooltip effect="dark" content="编辑"> <el-tooltip effect="dark" content="编辑">
......
...@@ -3,11 +3,11 @@ import AppLayout from '@/components/layout/Index.vue' ...@@ -3,11 +3,11 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [ export const routes: Array<RouteRecordRaw> = [
{ {
path: '/admin/lab', path: '/teacher/lab',
redirect: '/admin/lab/book' redirect: '/teacher/lab/book'
}, },
{ {
path: '/admin/lab/book', path: '/teacher/lab/book',
component: AppLayout, component: AppLayout,
children: [ children: [
{ path: '', component: () => import('./views/Index.vue') }, { path: '', component: () => import('./views/Index.vue') },
......
...@@ -56,7 +56,7 @@ function onUpdateSuccess() { ...@@ -56,7 +56,7 @@ function onUpdateSuccess() {
</script> </script>
<template> <template>
<AppCard title="实验指导书管理"> <AppCard title="实验指导书管理" :hasBodyBackground="false">
<AppList v-bind="listOptions" ref="appList"> <AppList v-bind="listOptions" ref="appList">
<template #header-buttons> <template #header-buttons>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'v1-teacher-book-create'" <el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'v1-teacher-book-create'"
...@@ -75,6 +75,11 @@ function onUpdateSuccess() { ...@@ -75,6 +75,11 @@ function onUpdateSuccess() {
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.table-list-filter) {
padding: 30px 30px 10px;
background: #fff;
border-radius: 12px;
}
.list-card { .list-card {
display: grid; display: grid;
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(4, 1fr);
......
...@@ -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: '/teacher/lab/discuss',
component: AppLayout, component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }] children: [{ path: '', component: () => import('./views/Index.vue') }]
} }
......
...@@ -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/discuss', path: '/teacher/lab/record',
component: AppLayout, component: AppLayout,
children: [{ path: '', component: () => import('./views/Index.vue') }] children: [{ path: '', component: () => import('./views/Index.vue') }]
} }
......
...@@ -9,7 +9,7 @@ defineProps<Props>() ...@@ -9,7 +9,7 @@ defineProps<Props>()
<template> <template>
<div class="list-item"> <div class="list-item">
<div class="list-item-pic"> <div class="list-item-pic">
<router-link :to="`/admin/lab/video/${data.id}`" target="_blank"> <router-link :to="`/teacher/lab/video/${data.id}`" target="_blank">
<el-image :src="data.cover" fit="cover"> <el-image :src="data.cover" fit="cover">
<template #error> <template #error>
<img src="/images/video_poster.png" /> <img src="/images/video_poster.png" />
...@@ -21,7 +21,7 @@ defineProps<Props>() ...@@ -21,7 +21,7 @@ defineProps<Props>()
<div class="list-item-main"> <div class="list-item-main">
<p>{{ data.name }}</p> <p>{{ data.name }}</p>
<div class="buttons"> <div class="buttons">
<router-link :to="`/admin/lab/video/${data.id}`" target="_blank" v-permission="'v1-teacher-video-view'"> <router-link :to="`/teacher/lab/video/${data.id}`" target="_blank" v-permission="'v1-teacher-video-view'">
<el-button type="primary" auto-insert-space>查看</el-button> <el-button type="primary" auto-insert-space>查看</el-button>
</router-link> </router-link>
<el-button <el-button
......
...@@ -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/video', path: '/teacher/lab/video',
component: AppLayout, component: AppLayout,
children: [ children: [
{ path: '', component: () => import('./views/Index.vue') }, { path: '', component: () => import('./views/Index.vue') },
......
...@@ -56,7 +56,7 @@ function onUpdateSuccess() { ...@@ -56,7 +56,7 @@ function onUpdateSuccess() {
</script> </script>
<template> <template>
<AppCard title="实验操作视频管理"> <AppCard title="实验操作视频管理" :has-body-background="false">
<AppList v-bind="listOptions" ref="appList"> <AppList v-bind="listOptions" ref="appList">
<template #header-buttons> <template #header-buttons>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'v1-teacher-video-create'" <el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'v1-teacher-video-create'"
...@@ -75,6 +75,11 @@ function onUpdateSuccess() { ...@@ -75,6 +75,11 @@ function onUpdateSuccess() {
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
:deep(.table-list-filter) {
padding: 30px 30px 10px;
background: #fff;
border-radius: 12px;
}
.list-card { .list-card {
display: grid; display: grid;
grid-template-columns: repeat(5, 1fr); grid-template-columns: repeat(5, 1fr);
......
...@@ -30,27 +30,27 @@ const studentMenus: IMenuItem[] = [ ...@@ -30,27 +30,27 @@ const studentMenus: IMenuItem[] = [
const adminMenus: IMenuItem[] = [ const adminMenus: IMenuItem[] = [
{ {
name: '智能营销', name: '智能营销',
path: '/admin/lab', path: '/teacher/lab',
tag: 'v1-teacher', tag: 'v1-teacher',
children: [ children: [
{ {
name: '实验指导书管理', name: '实验指导书管理',
path: '/admin/lab/book', path: '/teacher/lab/book',
tag: 'v1-teacher-book' tag: 'v1-teacher-book'
}, },
{ {
name: '实验操作视频管理', name: '实验操作视频管理',
path: '/admin/lab/video', path: '/teacher/lab/video',
tag: 'v1-teacher-video' tag: 'v1-teacher-video'
}, },
{ {
name: '实验讨论交流', name: '实验讨论交流',
path: '/admin/lab/discuss', path: '/teacher/lab/discuss',
tag: 'v1-teacher-discussion' tag: 'v1-teacher-discussion'
}, },
{ {
name: '实验成绩管理', name: '实验成绩管理',
path: '/admin/lab/record', path: '/teacher/lab/record',
tag: 'v1-teacher-record' tag: 'v1-teacher-record'
} }
] ]
...@@ -83,12 +83,12 @@ const adminMenus: IMenuItem[] = [ ...@@ -83,12 +83,12 @@ const adminMenus: IMenuItem[] = [
}, },
{ {
name: '系统管理', name: '系统管理',
path: '/admin/system', path: '/admin/lab',
tag: 'v1-backend-experiment', tag: 'v1-backend-experiment',
children: [ children: [
{ {
name: '实验管理', name: '实验管理',
path: '/admin/system/experiment', path: '/admin/lab/experiment',
tag: 'v1-backend-experiment' tag: 'v1-backend-experiment'
} }
] ]
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论