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

chore: update

上级 01dd3cfe
......@@ -9,6 +9,7 @@ interface Props {
modelValue: string | { name: string; url: string }[]
prefix?: string
size?: number
limit?: number
}
const props = withDefaults(defineProps<Props>(), {
......@@ -31,6 +32,10 @@ const showFileList = computed(() => {
// 上传之前
const handleBeforeUpload = async (file: any) => {
if (props.limit && fileList.value.length >= props.limit) {
ElMessage.error(`只能上传${props.limit}个文件`)
return false
}
if (props.size && file.size > props.size) {
ElMessage.error(`文件大小不能超过${props.size / 1024 / 1024}M`)
return false
......@@ -63,6 +68,11 @@ const handleSuccess = (response: any, file: any, files: any) => {
type: item.type || item.raw?.type
}
})
// .reverse()
// .filter((item: any, index: number) => {
// return props.limit ? index < props.limit : true
// })
// .reverse()
)
} else {
emit('update:modelValue', file.raw.url)
......
import httpRequest from '@/utils/axios'
import type { BookCreateItem } from './types'
// 获取学员列表
export function getBookList(params?: { name?: string; lab_id?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/lab/backend/book/index', { params })
// 获取课程列表
export function getCourseList() {
return httpRequest.get('/api/lab/v1/teacher/book/courses')
}
// 获取实验列表
export function getExperimentList(params: { course_id: string }) {
return httpRequest.get('/api/lab/v1/teacher/book/experiments', { params })
}
// 获取指导书列表
export function getBookList(params?: { name?: string; Book_id?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/lab/v1/teacher/book/list', { params })
}
// 获取指导书详情
export function getBook(params: { Book_id: string; page?: number; 'per-page'?: number }) {
return httpRequest.get('/api/lab/v1/teacher/book/view', { params })
}
// 创建指导书
export function createBook(data: BookCreateItem) {
return httpRequest.post('/api/lab/v1/teacher/book/create', data)
}
// 更新指导书
export function updateBook(data: BookCreateItem) {
return httpRequest.post('/api/lab/v1/teacher/book/update', data)
}
<script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus'
// import { ElMessage } from 'element-plus'
import type { BookItem, BookCreateItem } from '../types'
import { ElMessage } from 'element-plus'
import AppUpload from '@/components/base/AppUpload.vue'
import { createBook, updateBook } from '../api'
import { useGetCourseList } from '../composables/useGetCourseList'
import { useGetExperimentList } from '../composables/useGetExperimentList'
import { useMapStore } from '@/stores/map'
interface Props {
data?: any
data?: BookItem | null
}
const props = defineProps<Props>()
defineEmits<{
const emit = defineEmits<{
(e: 'update'): void
(e: 'update:modelValue', visible: boolean): void
}>()
const title = $computed(() => {
return '新增实验指导书'
})
// 课程列表
const { courses } = useGetCourseList()
// 数据状态
const status = useMapStore().getMapValuesByKey('system_status')
// 实验列表
const { experiments, updateExperiments } = useGetExperimentList()
const formRef = $ref<FormInstance>()
const form = reactive({ title: '', file: [], status: 1 })
const form = reactive<BookCreateItem>({
name: '',
course_id: '',
experiment_id: '',
status: '1',
url: '',
type: '',
size: '',
files: [],
protocol: false
})
watchEffect(() => {
if (!props.data) return
Object.assign(form, props.data)
})
watchEffect(() => {
updateExperiments(form.course_id)
})
const checkProtocol = (rule: any, value: any, callback: any) => {
if (!value) {
return callback(new Error('请阅读并同意'))
} else {
callback()
}
}
const rules = ref<FormRules>({
title: [{ required: true, message: '请输入问题描述', trigger: 'blur' }],
content: [{ required: true, message: '请输入问题详情', trigger: 'blur' }]
files: [{ type: 'array', required: true, message: '请上传实验指导书', trigger: 'blur' }],
name: [{ required: true, message: '请输入实验指导书名称', trigger: 'blur' }],
course_id: [{ required: true, message: '请选择关联实验课程', trigger: 'blur' }],
experiment_id: [{ required: true, message: '请选择关联实验', trigger: 'blur' }],
protocol: [{ validator: checkProtocol, message: '请阅读并同意', trigger: 'change' }]
})
const isUpdate = $computed(() => {
return !!form.id
})
const title = $computed(() => {
return isUpdate ? '编辑实验指导书' : '新增实验指导书'
})
function handleUploadSuccess(file: any) {
form.name = file.name
form.size = file.size
form.url = file.raw.url
form.type = file.raw.type
console.log(file)
}
// 提交
function handleSubmit() {
formRef?.validate().then(update)
formRef?.validate().then(() => {
console.log(form)
isUpdate ? handleUpdate(form) : handleCreate(form)
})
}
// 新增
function handleCreate(params: BookCreateItem) {
createBook(params).then(() => {
ElMessage({ message: '创建成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
})
}
// 修改
const update = () => {
// submitSuggestion(form).then(() => {
// ElMessage({ message: '提交成功', type: 'success' })
// emit('update')
// formRef?.resetFields()
// })
function handleUpdate(params: BookCreateItem) {
updateBook(params).then(() => {
ElMessage({ message: '修改成功', type: 'success' })
emit('update')
emit('update:modelValue', false)
})
}
</script>
<template>
<el-dialog :title="title" :close-on-click-modal="false" width="600px">
<el-form ref="formRef" :model="form" :rules="rules" label-width="150px">
<el-form-item label="实验指导书文件" prop="title">
<AppUpload v-model="form.file">
<el-dialog :title="title" :close-on-click-modal="false" width="600px" @update:modelValue="$emit('update:modelValue')">
<el-form ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="实验指导书文件" prop="files">
<AppUpload v-model="form.files" :limit="1" @success="handleUploadSuccess">
<template #tip>实验指导书文件支持格式包含:doc docx xls xlsx pdf ppt pptx,大小不超过50M</template>
</AppUpload>
</el-form-item>
<el-form-item label="实验指导书名称" prop="content">
<el-input v-model="form.title"></el-input>
<el-form-item label="实验指导书名称" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="关联实验课程" prop="files">
<el-input v-model="form.title" />
<el-form-item label="关联实验课程" prop="course_id">
<el-select v-model="form.course_id" style="width: 100%">
<el-option v-for="item in courses" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="关联实验" prop="files">
<el-select v-model="form.title" />
<el-form-item label="关联实验" prop="experiment_id">
<el-select v-model="form.experiment_id" style="width: 100%">
<el-option v-for="item in experiments" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="有效状态" prop="files">
<el-radio-group v-model="form.status" class="ml-4">
<el-radio label="1">有效</el-radio>
<el-radio label="2">失效</el-radio>
<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>
<el-checkbox label="我已阅读并同意"></el-checkbox>
<el-form-item prop="protocol">
<el-checkbox label="我已阅读并同意" v-model="form.protocol" />
<a
href="https://view.officeapps.live.com/op/view.aspx?src=https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/%E7%B4%AB%E8%8D%86%E6%95%99%E8%82%B2%E7%94%A8%E6%88%B7%E5%85%A5%E9%A9%BB%E5%8F%8A%E7%BD%91%E7%BB%9C%E6%95%99%E5%AD%A6%E8%B5%84%E6%BA%90%E5%8D%8F%E8%AE%AE(1).docx"
target="_blank"
......
import { getCourseList } from '../api'
export interface CourseType {
id: string
name: string
}
const courses = ref<CourseType[]>([])
export function useGetCourseList() {
!courses.value.length &&
getCourseList().then((res: any) => {
courses.value = res.data
})
return { courses }
}
import { getExperimentList } from '../api'
export interface ExperimentType {
id: string
name: string
}
export function useGetExperimentList() {
const experiments = ref<ExperimentType[]>([])
function updateExperiments(courseId: string) {
getExperimentList({ course_id: courseId }).then((res: any) => {
experiments.value = res.data
})
}
return { experiments, updateExperiments }
}
export interface BookItem {
course_id: string
course_name: string
created_operator: string
created_operator_name: string
created_time: string
delete_time: string
id: string
length: string
name: string
organ_id: string
organ_id_name: string
project_id: string
project_id_name: string
score: string
status: string
status_name: string
type: string
type_name: string
updated_operator: string
updated_operator_name: string
updated_time: string
}
export interface BookCreateItem {
id?: string
experiment_id: string
course_id: string
status: string
name: string
type: string
url: string
size: string
protocol: boolean
files: []
}
<script setup lang="ts">
import type { BookItem } from '../types'
import { CirclePlusFilled } from '@element-plus/icons-vue'
import AppList from '@/components/base/AppList.vue'
import ListItem from '../components/ListItem.vue'
import FormDialog from '../components/FormDialog.vue'
// import { getBookList } from '../api'
import { getBookList } from '../api'
const FormDialog = defineAsyncComponent(() => import('../components/FormDialog.vue'))
const appList = $ref<InstanceType<typeof AppList> | null>(null)
// 列表配置
const listOptions = {
// remote: {
// httpRequest: getBookList,
// params: { name: '', lab_id: '' }
// },
remote: {
httpRequest: getBookList,
params: { name: '', experiment_id: '' }
},
filters: [
{ type: 'input', prop: 'name', label: '实验指导书名称', placeholder: '请输入实验指导书名称' },
{ type: 'select', prop: 'lab_id', label: '关联实验', placeholder: '请选择关联实验' }
],
columns: [{ label: '名称', prop: 'name' }],
data: [{}, {}, {}, {}, {}, {}, {}]
columns: [{ label: '名称', prop: 'name' }]
}
let dialogVisible = $ref(false)
const rowData = ref<BookItem | undefined | null>(null)
// 新增
function handleAdd() {
rowData.value = null
dialogVisible = true
}
// 编辑
function handleUpdate(row: BookItem) {
rowData.value = row
dialogVisible = true
}
function onUpdateSuccess() {
dialogVisible = false
appList?.refetch()
}
</script>
<template>
<AppCard title="实验指导书管理">
<AppList v-bind="listOptions">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" round :icon="CirclePlusFilled" @click="handleAdd">新增实验指导书</el-button>
</template>
......@@ -36,8 +52,8 @@ function handleAdd() {
</div>
</template>
</AppList>
<FormDialog v-model="dialogVisible"></FormDialog>
</AppCard>
<FormDialog v-model="dialogVisible" :data="rowData" @update="onUpdateSuccess" v-if="dialogVisible"></FormDialog>
</template>
<style lang="scss" scoped>
......
......@@ -7,7 +7,6 @@ import { createExperiment, updateExperiment } from '../api'
import { useGetProjectList } from '@/composables/useGetProjectList'
import { useGetCourseList } from '../composables/useGetCourseList'
import { useGetTeacherList } from '../composables/useGetTeacherList'
import { useMapStore } from '@/stores/map'
interface Props {
......@@ -128,7 +127,7 @@ function handleUpdate(params: ExperimentCreateItem) {
<el-form-item label="实验总成绩" prop="score">
<el-input-number v-model="form.score" :min="1" :max="150" step-strictly style="width: 100%" />
</el-form-item>
<el-form-item label="有效状态" prop="files">
<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>
......
<script setup lang="ts">
import { CirclePlusFilled } from '@element-plus/icons-vue'
import type { ExperimentItem } from '../types'
import { CirclePlusFilled } from '@element-plus/icons-vue'
import AppList from '@/components/base/AppList.vue'
import { getExperimentList } from '../api'
......
......@@ -2,21 +2,21 @@ import httpRequest from '@/utils/axios'
// 获取课程列表
export function getCourseList() {
return httpRequest.get('/api/student/v1/student/course/all')
return httpRequest.get('/api/lab/v1/student/course/all')
}
// 获取实验指导书
export function getExperimentBook(params: { experiment_id: string }) {
return httpRequest.get('/api/student/v1/student/experiment-book/detail', { params })
return httpRequest.get('/api/lab/v1/student/experiment-book/detail', { params })
}
// 获取实验视频
export function getExperimentVideoList(params: { experiment_id: string }) {
return httpRequest.get('/api/student/v1/student/experiment-video/all', { params })
return httpRequest.get('/api/lab/v1/student/experiment-video/all', { params })
}
// 获取实验视频播放信息
export function getExperimentVideoPlayInfo(params: { source_id: string }) {
return httpRequest.get('/api/student/v1/student/experiment-video/replay-list', { params })
return httpRequest.get('/api/lab/v1/student/experiment-video/replay-list', { params })
}
// 获取实验讨论交流
......@@ -26,33 +26,33 @@ export function getExperimentDiscussList(params: {
page?: number
'per-page'?: number
}) {
return httpRequest.get('/api/student/v1/student/experiment-topic/list', { params })
return httpRequest.get('/api/lab/v1/student/experiment-topic/list', { params })
}
// 发表新话题
export function addExperimentDiscuss(data: { experiment_id: string; title: string; content: string }) {
return httpRequest.post('/api/student/v1/student/experiment-topic/issue', data)
return httpRequest.post('/api/lab/v1/student/experiment-topic/issue', data)
}
// 发表回复
export function addExperimentDiscussComment(data: { discussion_id: string; content: string }) {
return httpRequest.post('/api/student/v1/student/experiment-topic/comment', data)
return httpRequest.post('/api/lab/v1/student/experiment-topic/comment', data)
}
// 获取实验记录
export function getExperimentRecord(params: { experiment_id: string }) {
return httpRequest.get('/api/student/v1/student/experiment-record/detail', { params })
return httpRequest.get('/api/lab/v1/student/experiment-record/detail', { params })
}
// 截图
export function uploadExperimentPicture(data: { experiment_id: string; pictures: string }) {
return httpRequest.post('/api/student/v1/student/experiment-record/upload-pictures', data)
return httpRequest.post('/api/lab/v1/student/experiment-record/upload-pictures', data)
}
// 上传实验报告
export function uploadExperimentReport(data: { experiment_id: string; file: string }) {
return httpRequest.post('/api/student/v1/student/experiment-record/upload-report', data)
return httpRequest.post('/api/lab/v1/student/experiment-record/upload-report', data)
}
// 提交实验记录
export function submitExperimentRecord(data: { experiment_id: string }) {
return httpRequest.post('/api/student/v1/student/experiment-record/submit', data)
return httpRequest.post('/api/lab/v1/student/experiment-record/submit', data)
}
......@@ -53,7 +53,7 @@ const update = () => {
>
<el-form ref="formRef" :model="form" :rules="rules">
<el-form-item label="实验报告文件" prop="files">
<AppUpload v-model="form.files">
<AppUpload v-model="form.files" :limit="1">
<template #tip>实验报告文件只能上传一个,支持格式包含:doc docx pdf ppt pptx,大小不超过50M</template>
</AppUpload>
</el-form-item>
......
......@@ -25,22 +25,22 @@ const adminMenus: IMenuItem[] = [
path: '/admin/lab',
children: [
{
icon: Tickets,
icon: markRaw(Tickets),
name: '实验指导书管理',
path: '/admin/lab/book'
},
{
icon: Tickets,
icon: markRaw(Tickets),
name: '实验操作视频管理',
path: '/admin/lab/video'
},
{
icon: Tickets,
icon: markRaw(Tickets),
name: '实验讨论交流',
path: '/admin/lab/discuss'
},
{
icon: Tickets,
icon: markRaw(Tickets),
name: '实验成绩管理',
path: '/admin/lab/score'
}
......@@ -59,7 +59,7 @@ const adminMenus: IMenuItem[] = [
path: '/admin/system',
children: [
{
icon: Tickets,
icon: markRaw(Tickets),
name: '实验管理',
path: '/admin/system/experiment'
}
......@@ -74,7 +74,7 @@ export const useMenuStore = defineStore({
adminMenus
}),
getters: {
menus: state => state.studentMenus
menus: state => state.adminMenus
},
actions: {}
})
......@@ -26,10 +26,10 @@ export default defineConfig(({ mode }) => ({
cert: fs.readFileSync(path.join(__dirname, './https/dev.ezijing.com.pem'))
},
proxy: {
'/api/student': {
'/api/lab': {
target: 'http://test-resource-api.ezijing.com:8001',
changeOrigin: true,
rewrite: path => path.replace(/^\/api\/student/, '')
rewrite: path => path.replace(/^\/api\/lab/, '')
},
'/api': 'https://resource-center.ezijing.com'
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论