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

chore: update

上级 321f7316
......@@ -121,6 +121,7 @@
"useBrowserLocation": true,
"useCached": true,
"useClipboard": true,
"useCloned": true,
"useColorMode": true,
"useConfirmDialog": true,
"useCounter": true,
......
......@@ -122,6 +122,7 @@ declare global {
const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation']
const useCached: typeof import('@vueuse/core')['useCached']
const useClipboard: typeof import('@vueuse/core')['useClipboard']
const useCloned: typeof import('@vueuse/core')['useCloned']
const useColorMode: typeof import('@vueuse/core')['useColorMode']
const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
const useCounter: typeof import('@vueuse/core')['useCounter']
......
差异被折叠。
......@@ -16,7 +16,7 @@
"@element-plus/icons-vue": "^2.0.9",
"@tinymce/tinymce-vue": "^5.0.0",
"@vant/area-data": "^1.3.2",
"@vueuse/core": "^9.1.1",
"@vueuse/core": "^9.2.0",
"ali-oss": "^6.17.1",
"axios": "^0.27.2",
"blueimp-md5": "^2.19.0",
......@@ -41,7 +41,7 @@
"@types/qs": "^6.9.7",
"@types/ua-parser-js": "^0.7.36",
"@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/tsconfig": "^0.1.3",
"chalk": "^5.0.1",
......@@ -50,7 +50,7 @@
"sass": "^1.54.8",
"typescript": "~4.7.4",
"unplugin-auto-import": "^0.11.2",
"vite": "^3.0.9",
"vite": "^3.1.0",
"vite-plugin-checker": "^0.5.1",
"vue-tsc": "^0.40.5"
}
......
......@@ -83,11 +83,3 @@ textarea:focus {
margin-right: 0 !important;
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) {
// 指导老师
// 实验评分
if (payload?.channel === 1) {
router.push({ path: '/admin/lab/record', query: payload })
router.push({ path: '/teacher/lab/record', query: payload })
}
} else {
// 学生
......
<script setup lang="ts">
defineProps<{ title?: string }>()
interface Props {
title?: string
hasCardBackground?: boolean
hasBodyBackground?: boolean
}
withDefaults(defineProps<Props>(), { hasBodyBackground: true })
</script>
<template>
<div class="app-card">
<div class="app-card" :class="{ 'has-background': hasCardBackground }">
<div class="app-card-hd">
<slot name="header">
<h2 class="app-card-hd__title" v-if="title">{{ title }}</h2>
......@@ -12,7 +17,7 @@ defineProps<{ title?: string }>()
</div>
</slot>
</div>
<div class="app-card-bd">
<div class="app-card-bd" :class="{ 'has-background': hasBodyBackground }">
<slot></slot>
</div>
</div>
......@@ -20,10 +25,12 @@ defineProps<{ title?: string }>()
<style lang="scss">
.app-card {
// background: #fff;
// box-shadow: 0 1px 6px 0 rgb(228 232 235 / 20%);
// border-radius: 6px;
// padding: 20px;
&.has-background {
background: #fff;
box-shadow: 0 1px 6px 0 rgb(228 232 235 / 20%);
border-radius: 6px;
padding: 20px;
}
}
.app-card + .app-card {
margin-top: 20px;
......@@ -40,4 +47,11 @@ defineProps<{ title?: string }>()
line-height: 1;
color: #333333;
}
.app-card-bd {
&.has-background {
padding: 20px;
background-color: #fff;
border-radius: 12px;
}
}
</style>
......@@ -165,7 +165,7 @@ defineExpose({ refetch, tableRef })
</el-form-item>
</el-form>
</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 class="table-list-buttons"><slot name="header-buttons"></slot></div>
<slot></slot>
......@@ -223,12 +223,15 @@ defineExpose({ refetch, tableRef })
.table-list-hd {
display: flex;
margin-bottom: 20px;
&:empty {
display: none;
}
}
.table-list-filter {
flex: 1;
padding: 30px 30px 10px;
background: #fff;
border-radius: 12px;
// padding: 30px 30px 10px;
// background: #f8f8f8;
// border-radius: 12px;
}
.table-list-buttons {
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'
import { getContestItem } from '../api'
const ViewBook = defineAsyncComponent(() => import('../components/ViewBook.vue'))
const ViewVideo = defineAsyncComponent(() => import('../components/ViewVideo.vue'))
const JudgingRulesDialog = defineAsyncComponent(() => import('../components/JudgingRulesDialog.vue'))
interface Props {
id: string
......@@ -11,18 +12,21 @@ const props = defineProps<Props>()
let detail = $ref<ContestItem | null>(null)
provide('detail', $$(detail))
function fetchInfo() {
getContestItem({ experiment_id: props.id }).then(res => {
detail = res.data
})
}
onMounted(() => fetchInfo)
onMounted(fetchInfo)
const judgingRulesVisible = $ref(true)
</script>
<template>
<AppCard title="赛项管理">
<AppCard title="赛项信息">
<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>
......@@ -33,13 +37,12 @@ onMounted(() => fetchInfo)
<el-descriptions-item label="赛项课程:">{{ detail.course_name }}</el-descriptions-item>
<el-descriptions-item label="所属机构/学校:">{{ detail.organ_id_name }}</el-descriptions-item>
</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 title="训练指导书">
<ViewBook></ViewBook>
</AppCard>
<AppCard title="操作视频">
<ViewVideo></ViewVideo>
</AppCard>
<JudgingRulesDialog v-model="judgingRulesVisible" v-if="judgingRulesVisible"></JudgingRulesDialog>
</template>
......@@ -58,7 +58,7 @@ function handleRefetch() {
<template #table-x="{ row }">
<el-button type="primary" link>
<router-link
:to="`/admin/system/experiment/group/${row.id}`"
:to="`/admin/lab/experiment/group/${row.id}`"
target="_blank"
v-permission="'v1-backend-experiment-team-view'"
>小组成员</router-link
......
......@@ -3,9 +3,9 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/admin/system',
path: '/admin/lab',
component: AppLayout,
redirect: '/admin/system/experiment',
redirect: '/admin/lab/experiment',
children: [
{ path: 'experiment', component: () => import('./views/Index.vue') },
{ path: 'experiment/:id', component: () => import('./views/View.vue'), props: true },
......
......@@ -67,10 +67,10 @@ function onUpdateSuccess() {
<template #table-x="{ row }: { row: ExperimentItem }">
<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 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 type="primary" round @click="handleUpdate(row)" v-permission="'v1-backend-experiment-update'"
>编辑</el-button
......
......@@ -14,19 +14,19 @@ onMounted(() => {
})
function handleChange(id: string, type: number) {
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) {
router.push({ path: '/admin/lab/video', query: { experiment_id: id } })
router.push({ path: '/teacher/lab/video', query: { experiment_id: id } })
}
}
</script>
<template>
<div class="bg">
<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>
<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>
</div>
<div class="select-group">
<el-select size="large" placeholder="实验指导书" @change="handleChange($event, 1)">
......
......@@ -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="`/admin/lab/book/${data.id}`" target="_blank"></router-link>
<router-link :to="`/teacher/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: '/admin/lab',
redirect: '/admin/lab/book'
path: '/teacher/lab',
redirect: '/teacher/lab/book'
},
{
path: '/admin/lab/book',
path: '/teacher/lab/book',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/Index.vue') },
......
......@@ -56,7 +56,7 @@ function onUpdateSuccess() {
</script>
<template>
<AppCard title="实验指导书管理">
<AppCard title="实验指导书管理" :hasBodyBackground="false">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'v1-teacher-book-create'"
......@@ -75,6 +75,11 @@ function onUpdateSuccess() {
</template>
<style lang="scss" scoped>
:deep(.table-list-filter) {
padding: 30px 30px 10px;
background: #fff;
border-radius: 12px;
}
.list-card {
display: grid;
grid-template-columns: repeat(4, 1fr);
......
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/admin/lab/record',
path: '/teacher/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: '/admin/lab/discuss',
path: '/teacher/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="`/admin/lab/video/${data.id}`" target="_blank">
<router-link :to="`/teacher/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="`/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>
</router-link>
<el-button
......
......@@ -3,7 +3,7 @@ import AppLayout from '@/components/layout/Index.vue'
export const routes: Array<RouteRecordRaw> = [
{
path: '/admin/lab/video',
path: '/teacher/lab/video',
component: AppLayout,
children: [
{ path: '', component: () => import('./views/Index.vue') },
......
......@@ -56,7 +56,7 @@ function onUpdateSuccess() {
</script>
<template>
<AppCard title="实验操作视频管理">
<AppCard title="实验操作视频管理" :has-body-background="false">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" :icon="CirclePlus" @click="handleAdd" v-permission="'v1-teacher-video-create'"
......@@ -75,6 +75,11 @@ function onUpdateSuccess() {
</template>
<style lang="scss" scoped>
:deep(.table-list-filter) {
padding: 30px 30px 10px;
background: #fff;
border-radius: 12px;
}
.list-card {
display: grid;
grid-template-columns: repeat(5, 1fr);
......
......@@ -30,27 +30,27 @@ const studentMenus: IMenuItem[] = [
const adminMenus: IMenuItem[] = [
{
name: '智能营销',
path: '/admin/lab',
path: '/teacher/lab',
tag: 'v1-teacher',
children: [
{
name: '实验指导书管理',
path: '/admin/lab/book',
path: '/teacher/lab/book',
tag: 'v1-teacher-book'
},
{
name: '实验操作视频管理',
path: '/admin/lab/video',
path: '/teacher/lab/video',
tag: 'v1-teacher-video'
},
{
name: '实验讨论交流',
path: '/admin/lab/discuss',
path: '/teacher/lab/discuss',
tag: 'v1-teacher-discussion'
},
{
name: '实验成绩管理',
path: '/admin/lab/record',
path: '/teacher/lab/record',
tag: 'v1-teacher-record'
}
]
......@@ -83,12 +83,12 @@ const adminMenus: IMenuItem[] = [
},
{
name: '系统管理',
path: '/admin/system',
path: '/admin/lab',
tag: 'v1-backend-experiment',
children: [
{
name: '实验管理',
path: '/admin/system/experiment',
path: '/admin/lab/experiment',
tag: 'v1-backend-experiment'
}
]
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论