提交 61321542 authored 作者: matian's avatar matian

chore:基础管理接口对接

上级 39760f25
......@@ -125,7 +125,7 @@ onMounted(() => {
fetchList()
})
defineExpose({ refetch, tableRef })
defineExpose({ refetch, tableRef, params })
</script>
<template>
......
import httpRequest from '@/utils/axios'
// 获取学生列表
export function getProList(params?: { type?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/psp/backend/video/index', { params })
// 获取班级列表
export function getClassList(params?: { name?: string; organ_id?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/class/list', { params })
}
// 添加班级
export function addClass(data: {
name?: string
organ_id?: string
start_year?: string
code: string
specialty_id: string
teacher_id: string
}) {
return httpRequest.post('/api/resource/v1/learning/class/create', data)
}
// 更新班级
export function updateClass(data: {
id: string
name: string
organ_id: string
start_year: string
code: string
specialty_id: string
teacher_id: string
}) {
return httpRequest.post('/api/resource/v1/learning/class/update', data)
}
// 添加班级
export function getClassDetail(params: { id: string }) {
return httpRequest.get('/api/resource/v1/learning/class/view', { params })
}
// 搜索班主任
export function searchTeacher(params: { organ_id: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/class/search-teacher', { params })
}
// 获取专业列表
export function getProList(params?: { name?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/backend/specialty/list', { params })
}
// 获取班级学员列表
export function getClassStuList(params?: { class_id?: string; name?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/class/students', { params })
}
// 获取班级学期列表
export function getClassSemList(params?: { class_id?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/class/semesters', { params })
}
// 关联学生-获取学生列表
export function getRelationClassStuList(params?: {
class_id?: string
name?: string
page?: string
'per-page'?: string
}) {
return httpRequest.get('/api/resource/v1/learning/class/add-students', { params })
}
// 关联学期-获取学期列表
export function getRelationSemList(params?: { class_id: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/class/add-semesters', { params })
}
// 关联学生-关联/移除学生
export function relationClassStu(data?: { class_id: string; students_id: string; type: string }) {
return httpRequest.post('/api/resource/v1/learning/class/add-students ', data)
}
// 关联学生-关联/移除学生
export function relationClassSem(data?: { class_id: string; semesters_id: string; type: string }) {
return httpRequest.post('/api/resource/v1/learning/class/add-semesters', data)
}
<script lang="ts" setup>
import type { FormRules } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { useMapStore } from '@/stores/map'
import { useProjectList } from '@/composables/useGetProjectList'
import { addClass, updateClass, getClassDetail, searchTeacher, getProList } from '../api'
const ruleFormRef = ref<FormInstance>()
const store = useMapStore()
const emit = defineEmits<Emits>()
const schoolList = [
{
id: '111',
name: '清华'
},
{
id: '222',
name: '北大'
}
]
const departmentList: any = useProjectList('', '79806610719731712').departmentList
const startYearList = store.getMapValuesByKey('class_start_year')
const form = reactive({
code: '',
name: '',
school: '',
headmaster: '',
major: '',
enter_month: ''
organ_id: '',
teacher_id: '',
specialty_id: '',
start_year: '',
status: '1'
})
const rules = reactive<FormRules>({
code: [{ required: true, message: '请输入专业代码', trigger: 'change' }],
name: [{ required: true, message: '请输入专业名称', trigger: 'blur' }],
school: [{ required: true, message: '请选择所属部门/学校', trigger: 'change' }],
headmaster: [{ required: true, message: '请选择班主任', trigger: 'change' }],
major: [{ required: true, message: '请选择所属专业', trigger: 'blur' }],
enter_month: [{ required: true, message: '请选择入学年份', trigger: 'change' }]
code: [{ required: true, message: '请输入班级代码', trigger: 'change' }],
name: [{ required: true, message: '请输入班级名称', trigger: 'blur' }],
organ_id: [{ required: true, message: '请选择所属部门/学校', trigger: 'change' }],
teacher_id: [{ required: true, message: '请选择班主任', trigger: 'change' }],
specialty_id: [{ required: true, message: '请选择所属专业', trigger: 'blur' }],
start_year: [{ required: true, message: '请选择入学年份', trigger: 'change' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }]
})
const props = defineProps({
isShowClassDialog: {
......@@ -36,6 +38,9 @@ const props = defineProps({
},
id: {
type: String
},
isEdit: {
type: String
}
})
interface Emits {
......@@ -46,48 +51,127 @@ interface Emits {
const handleCancel = () => {
emit('update:isShowClassDialog', false)
}
const handleConfirm = () => {
emit('update:isShowClassDialog', false)
emit('create')
// 确认
const handleConfirm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate(valid => {
console.log(valid)
if (valid) {
if (props.isEdit === '0') {
const params: any = Object.assign({}, form)
addClass(params).then(() => {
ElMessage.success('新增学生成功')
emit('update:isShowClassDialog', false)
emit('create')
})
} else if (props.isEdit === '1') {
const params: any = Object.assign({ id: props.id }, form)
updateClass(params).then(() => {
ElMessage.success('更新学生成功')
emit('update:isShowClassDialog', false)
emit('create')
})
} else {
emit('update:isShowClassDialog', false)
emit('create')
}
}
})
}
// 获取详情
if (props.isEdit === '2' || props.isEdit === '1') {
const params: any = { id: props.id }
getClassDetail(params).then((res: any) => {
console.log(res)
Object.keys(form).forEach(key => {
form[key] = res.data[key]
})
})
}
const teacherList: any = ref([])
const allLecturers: any = ref([])
watch(
() => form.organ_id,
() => {
if (form.organ_id !== '') {
searchTeacher({ organ_id: form.organ_id, 'per-page': '100' }).then((res: any) => {
teacherList.value = res.data.list
teacherList.value.forEach((item: any) => {
const findItem = allLecturers.value.find((cItem: any) => cItem.id === item.id)
if (!findItem) {
allLecturers.value.push(item)
}
})
})
} else {
allLecturers.value = []
}
}
)
const proList: any = ref([])
const allPro: any = ref([])
getProList({ name: '', 'per-page': '100' }).then((res: any) => {
proList.value = res.data.list
proList.value.forEach((item: any) => {
const findItem = allPro.value.find((cItem: any) => cItem.id === item.id)
if (!findItem) {
allPro.value.push(item)
}
})
})
</script>
<template>
<el-dialog :model-value="isShowClassDialog" draggable :before-close="handleCancel" :title="props.title" width="30%">
<el-form :model="form" label-position="right" label-width="auto" :rules="rules" ref="formRef">
<el-form :model="form" label-position="right" label-width="auto" :rules="rules" ref="ruleFormRef">
<el-form-item label="班级代码:" prop="code">
<el-input v-model="form.code" :disabled="props.title === '查看详情'"></el-input>
</el-form-item>
<el-form-item label="专业名称:" prop="name">
<el-form-item label="班级名称:" prop="name">
<el-input v-model="form.name" :disabled="props.title === '查看详情'"></el-input>
</el-form-item>
<el-form-item label="所属部门/学校:" prop="school">
<el-select v-model="form.school" placeholder="请选择所属部门/学校" :disabled="props.title === '查看详情'">
<el-option v-for="(item, index) in schoolList" :key="index" :label="item.name" :value="item.id"></el-option>
<el-form-item label="所属部门/学校:" prop="organ_id">
<el-select clearable v-model="form.organ_id" :disabled="props.title === '查看详情'" style="width: 100%">
<el-option v-for="item in departmentList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="班主任:" prop="teacher_id">
<el-select v-model="form.teacher_id" clearable placeholder="请输入班主任" style="width: 230px">
<el-option v-for="item in teacherList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="班主任:" prop="headmaster">
<el-select v-model="form.headmaster" placeholder="请选择所属部门/学校" :disabled="props.title === '查看详情'">
<el-option v-for="(item, index) in schoolList" :key="index" :label="item.name" :value="item.id"></el-option>
<el-form-item label="所属专业:" prop="specialty_id">
<el-select v-model="form.specialty_id" clearable placeholder="请输入所属专业" style="width: 230px">
<el-option v-for="item in proList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="所属专业:" prop="major">
<el-select v-model="form.major" placeholder="请选择所属部门/学校" :disabled="props.title === '查看详情'">
<el-option v-for="(item, index) in schoolList" :key="index" :label="item.name" :value="item.id"></el-option>
<el-form-item label="入学年份:" prop="start_year">
<el-select v-model="form.start_year" placeholder="请选择所属部门/学校" :disabled="props.title === '查看详情'">
<el-option
v-for="(item, index) in startYearList"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="入学年份:" prop="enter_month">
<el-date-picker
v-model="form.enter_month"
type="year"
placeholder="请选择入学年份"
<el-form-item label="状态" prop="status">
<el-switch
size="large"
v-model="form.status"
active-value="1"
inactive-value="0"
inline-prompt
style="--el-switch-on-color: #aa1941"
:disabled="props.title === '查看详情'"
/>
></el-switch>
</el-form-item>
</el-form>
<template #footer>
<template #footer v-if="props.isEdit === '1'">
<span>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleConfirm">确认</el-button>
<el-button type="primary" @click="handleConfirm(ruleFormRef)">确认</el-button>
</span>
</template>
</el-dialog>
......
<script lang="ts" setup>
import AddStudent from '../../student/components/AddStudent.vue'
import { ElMessage } from 'element-plus'
import { getRelationClassStuList, relationClassStu } from '../api'
const emit = defineEmits<Emits>()
defineProps({
const props = defineProps({
isAddStuDialog: {
type: Boolean
},
......@@ -13,95 +13,83 @@ defineProps({
})
interface Emits {
(e: 'update:isAddStuDialog', isAddStuDialog: boolean): void
(e: 'create'): void
}
const isShowAddDialog = ref(false)
const title = ref('')
const id = ref('')
const classInfo: any = ref({}) // 班级信息
const multiSelection = ref([])
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: {
httpRequest: getRelationClassStuList,
params: { name: '', class_id: props.id },
callback(data: any) {
classInfo.value = data.info
return { list: data.list, total: data.total }
}
},
filters: [{ type: 'input', prop: 'name', label: '学生姓名:', placeholder: '学生姓名' }],
columns: [
{ type: 'selection' },
{ label: '序号', type: 'index', align: 'center' },
{ label: '学号', prop: 'sno', align: 'center' },
{ label: '学号', prop: 'sno_number', align: 'center' },
{ label: '姓名', prop: 'name', align: 'center' },
{ label: '性别', prop: 'sex', align: 'center' },
{ label: '出生年月', prop: 'birth', align: 'center' },
{ label: '省', prop: 'province', align: 'center' },
{ label: '市', prop: 'city', align: 'center' },
{ label: '县', prop: 'county', align: 'center' },
{ label: '性别', prop: 'gender_name', align: 'center' },
{ label: '出生年月', prop: 'birthday', align: 'center' },
{ label: '省', prop: 'province_name', align: 'center' },
{ label: '市', prop: 'city_name', align: 'center' },
{ label: '县', prop: 'county_name', align: 'center' },
{ label: '联系电话', prop: 'mobile', align: 'center' },
{ label: '部门/学校', prop: 'school', align: 'center' },
{ label: '专业', prop: 'major', align: 'center' },
{ label: '班级', prop: 'class', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '300', fixed: 'right' }
],
data: [
{
name: 111
},
{
name: 111
},
{
name: 111
},
{
name: 111
}
{ label: '部门/学校', prop: 'organ_id_name', align: 'center' },
{ label: '专业', prop: 'specialty_id_name', align: 'center' },
{ label: '班级', prop: 'class_id_name', align: 'center' }
]
}
})
const handleAddStu = () => {
console.log(111)
const handleSelectChange = (val: any) => {
multiSelection.value = val
}
const handleDel = (row: any) => {
console.log(row)
}
const handleDetail = (row: any) => {
console.log(row)
id.value = row.id
isShowAddDialog.value = true
title.value = '查看详情'
const handleAddStu = () => {
const params: any = {
class_id: props.id,
students_id: multiSelection.value.map((item: any) => item.id).toString(),
type: 'add'
}
relationClassStu(params).then(() => {
ElMessage.success('关联学生成功')
emit('update:isAddStuDialog', false)
emit('create')
})
}
const handleCancel = () => {
emit('update:isAddStuDialog', false)
}
const handleRefresh = () => {
console.log('ppp')
}
</script>
<template>
<el-dialog :model-value="isAddStuDialog" draggable title="添加班级学生" width="60%" :before-close="handleCancel">
<div style="overflow-y: auto; height: 70vh">
<el-descriptions>
<el-descriptions-item label="班级代码:">kooriookami</el-descriptions-item>
<el-descriptions-item label="班级名称">18100000000</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">Suzhou</el-descriptions-item>
<el-descriptions-item label="班级代码:">{{ classInfo.code }}</el-descriptions-item>
<el-descriptions-item label="班级名称">{{ classInfo.name }}</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">{{ classInfo.organ_id_name }}</el-descriptions-item>
<el-descriptions-item label="班 主 任:">
<el-tag size="small">School</el-tag>
<el-tag size="small">{{ classInfo.teacher_id_name }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="所属专业">工商管理</el-descriptions-item>
<el-descriptions-item label="入学年份">2021</el-descriptions-item>
<el-descriptions-item label="所属专业">{{ classInfo.specialty_id_name }}</el-descriptions-item>
<el-descriptions-item label="入学年份">{{ classInfo.start_year_name }}</el-descriptions-item>
</el-descriptions>
<AppList v-bind="listOptions" ref="appList" border stripe style="margin-top: 30px">
<AppList
v-bind="listOptions"
ref="appList"
border
stripe
style="margin-top: 30px"
@selection-change="handleSelectChange"
>
<el-button type="primary" round @click="handleAddStu">关联选择学生</el-button>
<template #table-operate="{ row }">
<el-space>
<el-link type="primary" plain @click="handleDetail(row)">查看</el-link>
<el-link plain @click="handleDel(row)">移除</el-link>
</el-space>
</template>
</AppList>
</div>
<!-- 新增学生 -->
</el-dialog>
<AddStudent
v-if="isShowAddDialog === true"
v-model:isShowAddDialog="isShowAddDialog"
:id="id"
:title="title"
@create="handleRefresh"
/>
</template>
<script lang="ts" setup>
import { ElMessage } from 'element-plus'
import { getRelationSemList, relationClassSem } from '../api'
const emit = defineEmits<Emits>()
const props = defineProps({
......@@ -16,18 +19,45 @@ interface Emits {
(e: 'update:isShowTermDialog', isShowTermDialog: boolean): void
(e: 'create'): void
}
const termList: any = ref([])
const formInfo = ref({})
const form = reactive({
name: '',
start_time: '',
end_time: '',
week: ''
length: ''
})
const handleCancel = () => {
emit('update:isShowTermDialog', false)
}
const handleConfirm = () => {
emit('update:isShowTermDialog', false)
emit('create')
const params: any = {
class_id: props.id,
semesters_id: termList.value.filter((item: any) => item.name === form.name)[0].id,
type: 'add'
}
relationClassSem(params).then(() => {
ElMessage.success('关联学期成功')
emit('update:isShowTermDialog', false)
emit('create')
})
}
const params: any = { class_id: props.id, 'per-page': '1000' }
getRelationSemList(params).then(res => {
termList.value = res.data.list
})
const handleChangeTerm = (val: any) => {
if (val !== '') {
formInfo.value = termList.value.filter((item: any) => item.id === val)[0]
Object.keys(form).forEach(key => {
form[key] = formInfo.value[key]
})
} else {
form.start_time = ''
form.end_time = ''
form.length = ''
}
}
</script>
<template>
......@@ -41,7 +71,16 @@ const handleConfirm = () => {
>
<el-form :model="form" label-position="right" label-width="auto">
<el-form-item label="学期名称:" prop="name">
<el-input v-model="form.name" :disabled="props.title === '查看详情'"></el-input>
<el-select
clearable
v-model="form.name"
:disabled="props.title === '查看详情'"
style="width: 100%"
placeholder="请选择学期"
@change="handleChangeTerm"
>
<el-option v-for="item in termList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="学期开始日期:" prop="start_time">
<el-input v-model="form.start_time" disabled></el-input>
......@@ -49,8 +88,8 @@ const handleConfirm = () => {
<el-form-item label="学期结束日期:" prop="end_time">
<el-input v-model="form.end_time" disabled></el-input>
</el-form-item>
<el-form-item label="教学周:" prop="week">
<el-input v-model="form.week" disabled></el-input>
<el-form-item label="教学周:" prop="length">
<el-input v-model="form.length" disabled></el-input>
</el-form-item>
</el-form>
<template #footer>
......
<script lang="ts" setup>
import { ElMessage } from 'element-plus'
import AddStudentDialog from './AddStudentDialog.vue'
import AddStudent from '../../student/components/AddStudent.vue'
import { getClassStuList, relationClassStu } from '../api'
const emit = defineEmits<Emits>()
const appList = ref()
const isAddStuDialog = ref(false)
defineProps({
const props = defineProps({
isShowClassStuDialog: {
type: Boolean
},
......@@ -18,47 +21,46 @@ interface Emits {
const isShowAddDialog = ref(false)
const title = ref('')
const id = ref('')
const classInfo: any = ref({})
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: {
httpRequest: getClassStuList,
params: { name: '', class_id: props.id },
callback(data: any) {
classInfo.value = data.info
return { list: data.list, total: data.total }
}
},
filters: [{ type: 'input', prop: 'name', label: '学生姓名:', placeholder: '学生姓名' }],
columns: [
{ label: '序号', type: 'index', align: 'center' },
{ label: '班级代码', prop: 'code', align: 'center' },
{ label: '班级名称', prop: 'name', align: 'center' },
{ label: '所属部门/学校', prop: 'school', align: 'center' },
{ label: '人数', prop: 'number', align: 'center' },
{ label: '班主任', prop: 'headmaster', align: 'center' },
{ label: '专业', prop: 'major', align: 'center' },
{ label: '入学年份', prop: 'enter_month', align: 'center' },
{ label: '更新时间', prop: 'update_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '300', fixed: 'right' }
],
data: [
{
name: 111
},
{
name: 111
},
{
name: 111
},
{
name: 111
}
{ label: '学号', prop: 'sno_number', align: 'center' },
{ label: '姓名', prop: 'name', align: 'center' },
{ label: '性别', prop: 'gender', align: 'center' },
{ label: '有效状态', prop: 'status_name', align: 'center' },
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '200', fixed: 'right' }
]
}
})
const handleAddStu = () => {
isAddStuDialog.value = true
console.log(isAddStuDialog)
}
const handleDel = (row: any) => {
console.log(row)
const params: any = {
class_id: props.id,
students_id: row.id,
type: 'delete'
}
relationClassStu(params).then(() => {
ElMessage.success('移除学生成功')
handleRefresh()
})
}
const handleDetail = (row: any) => {
console.log(row)
id.value = row.id
isShowAddDialog.value = true
title.value = '查看详情'
}
......@@ -66,21 +68,21 @@ const handleCancel = () => {
emit('update:isShowClassStuDialog', false)
}
const handleRefresh = () => {
console.log('ppp')
appList.value.refetch()
}
</script>
<template>
<el-dialog :model-value="isShowClassStuDialog" draggable title="班级学生" width="70%" :before-close="handleCancel">
<div style="overflow-y: auto; height: 70vh">
<el-descriptions>
<el-descriptions-item label="班级代码:">kooriookami</el-descriptions-item>
<el-descriptions-item label="班级名称">18100000000</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">Suzhou</el-descriptions-item>
<el-descriptions-item label="班级代码:">{{ classInfo?.code }}</el-descriptions-item>
<el-descriptions-item label="班级名称">{{ classInfo?.name }}</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">{{ classInfo?.organ_id_name }}</el-descriptions-item>
<el-descriptions-item label="班 主 任:">
<el-tag size="small">School</el-tag>
<el-tag size="small">{{ classInfo?.teacher_id_name }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="所属专业">工商管理</el-descriptions-item>
<el-descriptions-item label="入学年份">2021</el-descriptions-item>
<el-descriptions-item label="所属专业">{{ classInfo?.specialty_id_name }}</el-descriptions-item>
<el-descriptions-item label="入学年份">{{ classInfo?.start_year_name }}</el-descriptions-item>
</el-descriptions>
<AppList v-bind="listOptions" ref="appList" border stripe style="margin-top: 30px">
<el-button type="primary" round @click="handleAddStu">添加学生</el-button>
......@@ -92,13 +94,19 @@ const handleRefresh = () => {
</template>
</AppList>
</div>
<AddStudentDialog v-model:isAddStuDialog="isAddStuDialog" v-if="isAddStuDialog === true" />
<AddStudentDialog
v-model:isAddStuDialog="isAddStuDialog"
v-if="isAddStuDialog === true"
:id="props.id"
@create="handleRefresh"
/>
<AddStudent
v-if="isShowAddDialog === true"
v-model:isShowAddDialog="isShowAddDialog"
:id="id"
:title="title"
@create="handleRefresh"
:isEdit="'2'"
/>
</el-dialog>
</template>
<script lang="ts" setup>
import { ElMessage } from 'element-plus'
import AddTermDialog from './AddTermDialog.vue'
import AddSemester from '../../semester/components/AddSemester.vue'
import { getClassSemList, relationClassSem } from '../api'
const emit = defineEmits<Emits>()
const appList = ref()
const title = ref('')
const id = ref('')
const id: any = ref('')
const isShowTermDialog = ref(false)
defineProps({
const isShowAddSemDialog = ref(false)
const classInfo: any = ref({})
const props = defineProps({
isRelatingDialog: {
type: Boolean
},
......@@ -18,46 +26,46 @@ interface Emits {
}
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: {
httpRequest: getClassSemList,
params: { class_id: props.id },
callback(data: any) {
classInfo.value = data.info
return { list: data.list, total: data.total }
}
},
filters: [{ type: 'input', prop: 'name', label: '学生姓名:', placeholder: '学生姓名' }],
columns: [
{ label: '序号', type: 'index', align: 'center' },
{ label: '学期名称', prop: 'name', align: 'center' },
{ label: '学期开始时间', prop: 'start_time', align: 'center' },
{ label: ' 学期结束时间', prop: 'end_time', align: 'center' },
{ label: '教学周', prop: 'week', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '300', fixed: 'right' }
],
data: [
{
name: 111
},
{
name: 111
},
{
name: 111
},
{
name: 111
}
{ label: '教学周', prop: 'length', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '200', fixed: 'right' }
]
}
})
const handleAddTerm = () => {
isShowTermDialog.value = true
title.value = '添加班级关联学期'
console.log(111)
id.value = props.id
}
const handleDel = (row: any) => {
const params: any = {
class_id: props.id,
semesters_id: row.id,
type: 'delete'
}
relationClassSem(params).then(() => {
ElMessage.success('移除学期成功')
handleFresh()
})
console.log(row)
}
const handleDetail = (row: any) => {
isShowTermDialog.value = true
isShowAddSemDialog.value = true
id.value = row.id
title.value = '查看详情'
console.log(row)
}
const handleCancel = () => {
emit('update:isRelatingDialog', false)
......@@ -70,14 +78,14 @@ const handleFresh = () => {
<el-dialog :model-value="isRelatingDialog" draggable title="班级关联学期" width="70%" :before-close="handleCancel">
<div style="overflow-y: auto; height: 70vh">
<el-descriptions>
<el-descriptions-item label="班级代码:">kooriookami</el-descriptions-item>
<el-descriptions-item label="班级名称">18100000000</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">Suzhou</el-descriptions-item>
<el-descriptions-item label="班级代码:">{{ classInfo?.code }}</el-descriptions-item>
<el-descriptions-item label="班级名称">{{ classInfo?.name }}</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">{{ classInfo?.organ_id_name }}</el-descriptions-item>
<el-descriptions-item label="班 主 任:">
<el-tag size="small">School</el-tag>
<el-tag size="small">{{ classInfo?.teacher_id_name }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="所属专业">工商管理</el-descriptions-item>
<el-descriptions-item label="入学年份">2021</el-descriptions-item>
<el-descriptions-item label="所属专业">{{ classInfo?.specialty_id_name }}</el-descriptions-item>
<el-descriptions-item label="入学年份">{{ classInfo?.start_year_name }}</el-descriptions-item>
</el-descriptions>
<AppList v-bind="listOptions" ref="appList" border stripe style="margin-top: 30px">
<el-button type="primary" round @click="handleAddTerm">添加学期</el-button>
......@@ -96,5 +104,12 @@ const handleFresh = () => {
:title="title"
@create="handleFresh"
/>
<AddSemester
v-if="isShowAddSemDialog === true"
v-model:isShowAddSemDialog="isShowAddSemDialog"
:id="id"
:title="title"
:isEdit="'2'"
/>
</el-dialog>
</template>
<script setup lang="ts">
// import { getProList } from '../api'
import { getClassList } from '../api'
import AddClass from '../components/AddClass.vue'
import ClassStudents from '../components/ClassStudents.vue'
import RelatedTerm from '../components/RelatedTerm.vue'
......@@ -9,12 +9,13 @@ import RelatedTerm from '../components/RelatedTerm.vue'
const appList = ref()
const id = ref('')
const title = ref('')
const isEdit = ref('')
const isShowClassDialog = ref(false)
const isShowClassStuDialog = ref(false)
const isRelatingDialog = ref(false)
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: { httpRequest: getClassList, params: { name: '', organ_id: '' } },
filters: [
{ type: 'input', prop: 'name', label: '班级名称:', placeholder: '班级名称' },
{ type: 'input', prop: 'school', label: '所属部门/学校:', placeholder: '所属部门/学校' }
......@@ -23,34 +24,32 @@ const listOptions = $computed(() => {
{ label: '序号', type: 'index', align: 'center' },
{ label: '班级代码', prop: 'code', align: 'center' },
{ label: '班级名称', prop: 'name', align: 'center' },
{ label: '所属部门/学校', prop: 'school', align: 'center' },
{ label: '人数', prop: 'number', align: 'center' },
{ label: '班主任', prop: 'headmaster', align: 'center' },
{ label: '专业', prop: 'major', align: 'center' },
{ label: '入学年份', prop: 'enter_month', align: 'center' },
{ label: '更新时间', prop: 'update_time', align: 'center' },
{ label: '所属部门/学校', prop: 'organ_id_name', align: 'center' },
{ label: '人数', prop: 'student_nums', align: 'center' },
{ label: '班主任', prop: 'teacher_id_name', align: 'center' },
{ label: '专业', prop: 'specialty_id_name', align: 'center' },
{ label: '入学年份', prop: 'start_year_name', align: 'center' },
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '300', fixed: 'right' }
],
data: [
{
name: 111
}
]
}
})
const handleAddClass = () => {
isShowClassDialog.value = true
title.value = '新增班级'
isEdit.value = '0'
}
const handleEdit = (row: any) => {
isShowClassDialog.value = true
title.value = '编辑班级'
id.value = row.id
isEdit.value = '1'
}
const handleDetail = (row: any) => {
isShowClassDialog.value = true
title.value = '查看详情'
id.value = row.id
isEdit.value = '2'
}
const handleClassStu = (row: any) => {
isShowClassStuDialog.value = true
......@@ -61,6 +60,9 @@ const handleRelating = (row: any) => {
isRelatingDialog.value = true
id.value = row.id
}
const handleFresh = () => {
appList.value.refetch()
}
</script>
<template>
......@@ -77,7 +79,14 @@ const handleRelating = (row: any) => {
</template>
</AppList>
</AppCard>
<AddClass v-model:isShowClassDialog="isShowClassDialog" v-if="isShowClassDialog === true" :title="title" :id="id" />
<ClassStudents v-model:isShowClassStuDialog="isShowClassStuDialog" v-if="isShowClassStuDialog === true" />
<RelatedTerm v-model:isRelatingDialog="isRelatingDialog" v-if="isRelatingDialog === true" />
<AddClass
v-model:isShowClassDialog="isShowClassDialog"
v-if="isShowClassDialog === true"
:title="title"
:id="id"
:isEdit="isEdit"
@create="handleFresh"
/>
<ClassStudents v-model:isShowClassStuDialog="isShowClassStuDialog" v-if="isShowClassStuDialog === true" :id="id" />
<RelatedTerm v-model:isRelatingDialog="isRelatingDialog" v-if="isRelatingDialog === true" :id="id" />
</template>
import httpRequest from '@/utils/axios'
// 获取学生列表
export function getProList(params?: { type?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/psp/backend/video/index', { params })
// 获取专业列表
export function getProList(params?: { name?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/backend/specialty/list', { params })
}
// 创建专业
export function createPro(data: {
name: string
code: string
education_background: string
length_of_schooling: string
degree_category: string
degree: string
}) {
return httpRequest.post('/api/resource/v1/backend/specialty/create', data)
}
// 更新专业
export function updatePro(data: {
id: string
name: string
code: string
education_background: string
length_of_schooling: string
degree_category: string
degree: string
}) {
return httpRequest.post('/api/resource/v1/backend/specialty/update', data)
}
// 获取专业详情
export function getProDetail(params: { id: string }) {
return httpRequest.get('/api/resource/v1/backend/specialty/view', { params })
}
<script lang="ts" setup>
import type { FormRules } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { useMapStore } from '@/stores/map'
import { createPro, updatePro, getProDetail } from '../api'
const ruleFormRef = ref<FormInstance>()
const store = useMapStore()
const emit = defineEmits<Emits>()
const schoolList = [
{
id: '111',
name: '清华'
},
{
id: '222',
name: '北大'
}
]
const categoryList = store.getMapValuesByKey('specialty_category')
const educationList = store.getMapValuesByKey('specialty_education_background')
const schoolingList = store.getMapValuesByKey('specialty_length_of_schooling')
const degreeCategoryList = store.getMapValuesByKey('specialty_degree_category')
const specialtyDegreeList = store.getMapValuesByKey('specialty_degree')
const form = reactive({
code: '',
name: '',
category: '',
education: 1,
schoolLength: 1,
degreeCategory: '',
degree: 0
education_background: '1',
length_of_schooling: '1',
degree_category: '',
degree: '1'
})
const rules = reactive<FormRules>({
code: [{ required: true, message: '请输入专业代码', trigger: 'change' }],
name: [{ required: true, message: '请输入专业名称', trigger: 'blur' }],
category: [{ required: true, message: '请选择专业类别', trigger: 'change' }],
education: [{ required: true, message: '请选择学历', trigger: 'blur' }],
schoolLength: [{ required: true, message: '请选择学制', trigger: 'change' }],
degreeCategory: [{ required: true, message: '请选择学位门类', trigger: 'blur' }],
education_background: [{ required: true, message: '请选择学历', trigger: 'blur' }],
length_of_schooling: [{ required: true, message: '请选择学制', trigger: 'change' }],
degree_category: [{ required: true, message: '请选择学位门类', trigger: 'blur' }],
degree: [{ required: true, message: '请选择学位', trigger: 'blur' }]
})
const props = defineProps({
......@@ -38,6 +40,9 @@ const props = defineProps({
},
id: {
type: String
},
isEdit: {
type: String
}
})
interface Emits {
......@@ -48,14 +53,47 @@ interface Emits {
const handleCancel = () => {
emit('update:isShowProDialog', false)
}
const handleConfirm = () => {
emit('update:isShowProDialog', false)
emit('create')
const handleConfirm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate(valid => {
console.log(valid)
if (valid) {
if (props.isEdit === '0') {
const params: any = Object.assign({}, form)
createPro(params).then(() => {
ElMessage.success('新增专业成功')
emit('update:isShowProDialog', false)
emit('create')
})
} else if (props.isEdit === '1') {
const params: any = Object.assign({ id: props.id }, form)
updatePro(params).then(() => {
ElMessage.success('更新专业成功')
emit('update:isShowProDialog', false)
emit('create')
})
} else {
emit('update:isShowProDialog', false)
emit('create')
}
}
})
}
// 获取详情
if (props.isEdit === '2' || props.isEdit === '1') {
const params: any = { id: props.id }
getProDetail(params).then((res: any) => {
console.log(res)
Object.keys(form).forEach(key => {
form[key] = res.data[key]
})
})
}
</script>
<template>
<el-dialog :model-value="isShowProDialog" draggable :before-close="handleCancel" :title="props.title" width="30%">
<el-form :model="form" label-position="right" label-width="auto" :rules="rules" ref="formRef">
<el-form :model="form" label-position="right" label-width="auto" :rules="rules" ref="ruleFormRef">
<el-form-item label="专业代码:" prop="code">
<el-input v-model="form.code" :disabled="props.title === '查看详情'"></el-input>
</el-form-item>
......@@ -63,39 +101,45 @@ const handleConfirm = () => {
<el-input v-model="form.name" :disabled="props.title === '查看详情'"></el-input>
</el-form-item>
<el-form-item label="专业类别:" prop="category">
<el-select v-model="form.category" placeholder="请选择所属部门/学校" :disabled="props.title === '查看详情'">
<el-option v-for="(item, index) in schoolList" :key="index" :label="item.name" :value="item.id"></el-option>
<el-select v-model="form.category" placeholder="请选择专业类别" :disabled="props.title === '查看详情'">
<el-option
v-for="(item, index) in categoryList"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="学历:" prop="education">
<el-radio-group v-model="form.education" :disabled="props.title === '查看详情'">
<el-radio :label="0">专科</el-radio>
<el-radio :label="1">本科</el-radio>
<el-form-item label="学历:" prop="education_background">
<el-radio-group v-model="form.education_background" :disabled="props.title === '查看详情'">
<el-radio v-for="item in educationList" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="学制:" prop="schoolLength">
<el-radio-group v-model="form.schoolLength" :disabled="props.title === '查看详情'">
<el-radio :label="0">3年</el-radio>
<el-radio :label="1">4年</el-radio>
<el-radio :label="2">5年</el-radio>
<el-form-item label="学制:" prop="length_of_schooling">
<el-radio-group v-model="form.length_of_schooling" :disabled="props.title === '查看详情'">
<el-radio v-for="item in schoolingList" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="学位门类:" prop="degreeCategory">
<el-select v-model="form.degreeCategory" :disabled="props.title === '查看详情'">
<el-option v-for="(item, index) in schoolList" :key="index" :label="item.name" :value="item.id"></el-option>
<el-form-item label="学位门类:" prop="degree_category">
<el-select v-model="form.degree_category" :disabled="props.title === '查看详情'" placeholder="请选择学位门类">
<el-option
v-for="(item, index) in degreeCategoryList"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="学位:" prop="degree">
<el-radio-group v-model="form.degree" :disabled="props.title === '查看详情'">
<el-radio :label="0">学士</el-radio>
<el-radio :label="1">硕士</el-radio>
<el-radio v-for="item in specialtyDegreeList" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<template #footer v-if="props.isEdit !== '1'">
<span>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleConfirm">确认</el-button>
<el-button type="primary" @click="handleConfirm(ruleFormRef)">确认</el-button>
</span>
</template>
</el-dialog>
......
<script setup lang="ts">
// import { getProList } from '../api'
import { getProList } from '../api'
import AddPro from '../components/AddPro.vue'
// import { useMapStore } from '@/stores/map'
// const store = useMapStore()
const appList = ref()
const title = ref('')
const id = ref('')
const isEdit = ref('')
const isShowProDialog = ref(false)
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: { httpRequest: getProList, params: { name: '' } },
filters: [{ type: 'input', prop: 'name', label: '专业名称:', placeholder: '专业名称' }],
columns: [
{ label: '序号', type: 'index', align: 'center' },
{ label: '专业代码', prop: 'code', align: 'center' },
{ label: '专业名称', prop: 'name', align: 'center' },
{ label: '专业类别', prop: 'category', align: 'center' },
{ label: '学历', prop: 'education', align: 'center' },
{ label: '学制', prop: 'schoolLength', align: 'center' },
{ label: '学位门类', prop: 'degreeCategory', align: 'center' },
{ label: '学位', prop: 'degree', align: 'center' },
{ label: '更新时间', prop: 'update_time', align: 'center' },
{ label: '专业类别', prop: 'category_name', align: 'center' },
{ label: '学历', prop: 'education_background_name', align: 'center' },
{ label: '学制', prop: 'length_of_schooling_name', align: 'center' },
{ label: '学位门类', prop: 'degree_category_name', align: 'center' },
{ label: '学位', prop: 'degree_name', align: 'center' },
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center' }
],
data: [
{
name: 222
}
]
}
})
const handleAddPro = () => {
isShowProDialog.value = true
title.value = '新增专业'
isEdit.value = '0'
}
const handleDetail = (row: any) => {
isShowProDialog.value = true
title.value = '查看详情'
id.value = row.id
isEdit.value = '1'
}
const handleEdit = (row: any) => {
isShowProDialog.value = true
title.value = '编辑专业'
id.value = row.id
isEdit.value = '2'
}
const handleFresh = () => {
appList.value.refetch()
......@@ -64,7 +63,9 @@ const handleFresh = () => {
<AddPro
v-if="isShowProDialog === true"
v-model:isShowProDialog="isShowProDialog"
:id="id"
:title="title"
:isEdit="isEdit"
@create="handleFresh"
/>
</template>
import httpRequest from '@/utils/axios'
// 获取学生列表
export function getProList(params?: { type?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/psp/backend/video/index', { params })
// 获取学期列表
export function getSemList(params?: { name?: string; organ_id?: string; page?: number; page_size?: number }) {
return httpRequest.get('/api/resource/v1/learning/semester/list', { params })
}
// 添加学期
export function addSem(data?: {
organ_id: string
name: string
start_time?: string
end_time?: string
length?: string
}) {
return httpRequest.post('/api/resource/v1/learning/semester/create', data)
}
// 获取学期详情
export function getSemDetail(params?: { id: string }) {
return httpRequest.get('/api/resource/v1/learning/semester/view', { params })
}
// 更新学期
export function updateSem(data?: {
id: string
organ_id: string
name: string
start_time?: string
end_time?: string
length?: string
}) {
return httpRequest.post('/api/resource/v1/learning/semester/update', data)
}
// 获取学期中的课程列表
export function getSemCourse(params?: { semester_id: string; name?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/semester/courses', { params })
}
// 关联课程-获取课程列表
export function getRelationSemCourse(params?: {
semester_id: string
classification?: string
name?: string
page?: string
'per-page'?: string
}) {
return httpRequest.get('/api/resource/v1/learning/semester/add-courses', { params })
}
// 关联学期-关联/移除学期
export function relationSemCourse(data: { semester_id: string; courses_id: string; type: string }) {
return httpRequest.post('/api/resource/v1/learning/semester/add-courses', data)
}
<script lang="ts" setup>
import { ElMessage } from 'element-plus'
import { getRelationSemCourse, relationSemCourse } from '../api'
const emit = defineEmits<Emits>()
defineProps({
const props = defineProps({
isShowCourse: {
type: Boolean
},
......@@ -10,43 +14,54 @@ defineProps({
})
interface Emits {
(e: 'update:isShowCourse', isShowCourse: boolean): void
(e: 'create'): void
}
const semInfo: any = ref({})
const multiSelection = ref([])
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: {
httpRequest: getRelationSemCourse,
params: { semester_id: props.id, name: '', classification: '' },
callback(data: any) {
semInfo.value = data.info
return { list: data.list, total: data.total }
}
},
filters: [
{ type: 'select', prop: 'name', label: '课程分类:', placeholder: '课程分类' },
{ type: 'select', prop: 'classification', label: '课程分类:', placeholder: '课程分类' },
{ type: 'input', prop: 'name', label: '课程名称:', placeholder: '课程名称' }
],
columns: [
{ type: 'selection' },
{ label: '序号', type: 'index', align: 'center' },
{ label: '课程名称', prop: 'name', align: 'center' },
{ label: '课程类型', prop: 'school', align: 'center' },
{ label: '选课类型', prop: 'number', align: 'center' },
{ label: '课程分类', prop: 'headmaster', align: 'center' },
{ label: '课程学分', prop: 'major', align: 'center' },
{ label: '课程类型', prop: 'online_type_name', align: 'center' },
{ label: '选课类型', prop: 'elective_type_name', align: 'center' },
{ label: '课程分类', prop: 'classification_name', align: 'center' },
{ label: '课程学分', prop: 'credit', align: 'center' },
{ label: '讲师', prop: 'enter_month', align: 'center' },
{ label: '更新时间', prop: 'update_time', align: 'center' },
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '200', fixed: 'right' }
],
data: [
{
name: 111
},
{
name: 111
},
{
name: 111
},
{
name: 111
}
]
}
})
const handleSelectChange = (val: any) => {
multiSelection.value = val
}
const handleAddStu = () => {
const params: any = {
semester_id: props.id,
courses_id: multiSelection.value.map((item: any) => item.id).toString(),
type: 'add'
}
relationSemCourse(params).then(() => {
ElMessage.success('关联课程成功')
emit('update:isShowCourse', false)
emit('create')
})
console.log(111)
}
......@@ -58,19 +73,26 @@ const handleCancel = () => {
<el-dialog :model-value="isShowCourse" draggable title="关联选择课程" width="50%" :before-close="handleCancel">
<div style="overflow-y: auto; height: 70vh">
<el-descriptions>
<el-descriptions-item label="学期名称:">kooriookami</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">18100000000</el-descriptions-item>
<el-descriptions-item label="开始日期:">Suzhou</el-descriptions-item>
<el-descriptions-item label="学期名称:">{{ semInfo.name }}</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">{{ semInfo.organ_id_name }}</el-descriptions-item>
<el-descriptions-item label="开始日期:">{{ semInfo.start_time }}</el-descriptions-item>
<el-descriptions-item label="结束日期:">
<el-tag size="small">School</el-tag>
<el-tag size="small">{{ semInfo.end_time }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="教学周">工商管理</el-descriptions-item>
<el-descriptions-item label="教学周">{{ semInfo.length }}</el-descriptions-item>
</el-descriptions>
<AppList v-bind="listOptions" ref="appList" border stripe style="margin-top: 30px">
<AppList
v-bind="listOptions"
ref="appList"
border
stripe
style="margin-top: 30px"
@selection-change="handleSelectChange"
>
<el-button type="primary" round @click="handleAddStu">关联选择课程</el-button>
<template #table-operate>
<template #table-operate="{ row }">
<el-space>
<router-link :to="'/course/my/view?id=6952509530357891072'" target="_blank">
<router-link :to="`/course/my/view?id=${row.id}`" target="_blank">
<el-link type="primary" plain>查看</el-link>
</router-link>
</el-space>
......
<script lang="ts" setup>
import type { FormRules } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { useProjectList } from '@/composables/useGetProjectList'
import { getSemDetail, addSem, updateSem } from '../api'
const emit = defineEmits<Emits>()
const schoolList = [
{
id: '111',
name: '清华'
},
{
id: '222',
name: '北大'
}
]
const ruleFormRef = ref<FormInstance>()
const departmentList: any = useProjectList('', '79806610719731712').departmentList
const form = reactive({
name: '',
school: '',
organ_id: '',
start_time: '',
end_time: '',
week: ''
length: ''
})
const rules = reactive<FormRules>({
name: [{ required: true, message: '请输入学期名称', trigger: 'blur' }],
school: [{ required: true, message: '请选择所属部门/学校', trigger: 'change' }]
organ_id: [{ required: true, message: '请选择所属部门/学校', trigger: 'change' }]
})
const props = defineProps({
isShowAddSemDialog: {
......@@ -33,7 +32,7 @@ const props = defineProps({
type: String
},
isEdit: {
type: Boolean
type: String
}
})
interface Emits {
......@@ -44,21 +43,53 @@ interface Emits {
const handleCancel = () => {
emit('update:isShowAddSemDialog', false)
}
const handleConfirm = () => {
emit('update:isShowAddSemDialog', false)
emit('create')
// 确定
const handleConfirm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate(valid => {
console.log(valid)
if (valid) {
if (props.isEdit === '0') {
const params: any = Object.assign({}, form)
addSem(params).then(() => {
ElMessage.success('新增学期成功')
emit('update:isShowAddSemDialog', false)
emit('create')
})
} else if (props.isEdit === '1') {
const params: any = Object.assign({ id: props.id }, form)
updateSem(params).then(() => {
ElMessage.success('更新学期成功')
emit('update:isShowAddSemDialog', false)
emit('create')
})
} else {
emit('update:isShowAddSemDialog', false)
emit('create')
}
}
})
}
// 获取详情
if (props.isEdit === '2' || props.isEdit === '1') {
const params: any = { id: props.id }
getSemDetail(params).then((res: any) => {
Object.keys(form).forEach(key => {
form[key] = res.data[key]
})
})
}
</script>
<template>
<el-dialog :model-value="isShowAddSemDialog" draggable :before-close="handleCancel" :title="props.title" width="30%">
<el-form :model="form" label-position="right" label-width="auto" :rules="rules" ref="formRef">
<el-form :model="form" label-position="right" label-width="auto" :rules="rules" ref="ruleFormRef">
<el-form :model="form" label-position="right" label-width="auto">
<el-form-item label="学期名称:" prop="name">
<el-input v-model="form.name" :disabled="props.title === '查看详情'"></el-input>
<el-input v-model="form.name" :disabled="props.isEdit === '2'"></el-input>
</el-form-item>
<el-form-item label="所属部门/学校:" prop="school">
<el-select v-model="form.school" placeholder="请选择所属部门/学校" :disabled="props.title === '查看详情'">
<el-option v-for="(item, index) in schoolList" :key="index" :label="item.name" :value="item.id"></el-option>
<el-form-item label="所属部门/学校:" prop="organ_id">
<el-select clearable v-model="form.organ_id" :disabled="props.isEdit === '2'" style="width: 100%">
<el-option v-for="item in departmentList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="学期开始日期:" prop="start_time">
......@@ -66,7 +97,7 @@ const handleConfirm = () => {
v-model="form.start_time"
type="date"
placeholder="学期开始日期"
:disabled="props.title === '查看详情'"
:disabled="props.isEdit === '2'"
/>
</el-form-item>
<el-form-item label="学期结束日期:" prop="end_time">
......@@ -74,18 +105,18 @@ const handleConfirm = () => {
v-model="form.end_time"
type="date"
placeholder="学期结束日期"
:disabled="props.title === '查看详情'"
:disabled="props.isEdit === '2'"
/>
</el-form-item>
<el-form-item label="教学周:" prop="week">
<el-input v-model="form.week" :disabled="props.title === '查看详情'"></el-input>
<el-form-item label="教学周:" prop="length">
<el-input v-model="form.length" :disabled="props.isEdit === '2'"></el-input>
</el-form-item>
</el-form>
</el-form>
<template #footer>
<template #footer v-if="props.isEdit !== '2'">
<span>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleConfirm">确认</el-button>
<el-button type="primary" @click="handleConfirm(ruleFormRef)">确认</el-button>
</span>
</template>
</el-dialog>
......
<script lang="ts" setup>
import { ElMessage } from 'element-plus'
import AddSemCourse from './AddSemCourse.vue'
import { getSemCourse, relationSemCourse } from '../api'
const emit = defineEmits<Emits>()
defineProps({
const props = defineProps({
isShowSemCourseDialog: {
type: Boolean
},
......@@ -12,50 +14,58 @@ defineProps({
interface Emits {
(e: 'update:isShowSemCourseDialog', isShowSemCourseDialog: boolean): void
}
const appList = ref()
const id: any = ref('')
const isShowCourse = ref(false)
const semInfo: any = ref({})
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: {
httpRequest: getSemCourse,
params: { semester_id: props.id, name: '' },
callback(data: any) {
semInfo.value = data.info
return { list: data.list, total: data.total }
}
},
filters: [{ type: 'input', prop: 'name', label: '课程名称:', placeholder: '课程名称' }],
columns: [
{ label: '序号', type: 'index', align: 'center' },
{ label: '课程名称', prop: 'name', align: 'center' },
{ label: '课程类型', prop: 'school', align: 'center' },
{ label: '选课类型', prop: 'number', align: 'center' },
{ label: '课程分类', prop: 'headmaster', align: 'center' },
{ label: '课程学分', prop: 'major', align: 'center' },
{ label: '课程类型', prop: 'online_type_name', align: 'center' },
{ label: '选课类型', prop: 'elective_type_name', align: 'center' },
{ label: '课程分类', prop: 'classification_name', align: 'center' },
{ label: '课程学分', prop: 'credit', align: 'center' },
{ label: '讲师', prop: 'enter_month', align: 'center' },
{ label: '更新时间', prop: 'update_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '300', fixed: 'right' }
],
data: [
{
name: 111
},
{
name: 111
},
{
name: 111
},
{
name: 111
}
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '200', fixed: 'right' }
]
}
})
const handleAddCourse = () => {
isShowCourse.value = true
console.log(111)
id.value = props.id
}
const handleDel = (row: any) => {
console.log(row)
const params: any = {
semester_id: props.id,
courses_id: row.id,
type: 'delete'
}
relationSemCourse(params).then(() => {
ElMessage.success('移除课程成功')
handleFresh()
})
}
const handleCancel = () => {
emit('update:isShowSemCourseDialog', false)
}
const handleFresh = () => {
appList.value.refetch()
}
</script>
<template>
<el-dialog
......@@ -67,19 +77,19 @@ const handleCancel = () => {
>
<div style="overflow-y: auto; height: 70vh">
<el-descriptions>
<el-descriptions-item label="学期名称:">kooriookami</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">18100000000</el-descriptions-item>
<el-descriptions-item label="开始日期:">Suzhou</el-descriptions-item>
<el-descriptions-item label="学期名称:">{{ semInfo.name }}</el-descriptions-item>
<el-descriptions-item label="所属部门/学校:">{{ semInfo.organ_id_name }}</el-descriptions-item>
<el-descriptions-item label="开始日期:">{{ semInfo.start_time }}</el-descriptions-item>
<el-descriptions-item label="结束日期:">
<el-tag size="small">School</el-tag>
<el-tag size="small">{{ semInfo.end_time }}</el-tag>
</el-descriptions-item>
<el-descriptions-item label="教学周">工商管理</el-descriptions-item>
<el-descriptions-item label="教学周">{{ semInfo.length }}</el-descriptions-item>
</el-descriptions>
<AppList v-bind="listOptions" ref="appList" border stripe style="margin-top: 30px">
<el-button type="primary" round @click="handleAddCourse">添加课程</el-button>
<template #table-operate="{ row }">
<el-space>
<router-link :to="'/course/my/view?id=6952509530357891072'" target="_blank">
<router-link :to="`/course/my/view??id=${row.id}`" target="_blank">
<el-link type="primary" plain>查看</el-link>
</router-link>
<el-link plain @click="handleDel(row)">移除</el-link>
......@@ -87,6 +97,6 @@ const handleCancel = () => {
</template>
</AppList>
</div>
<AddSemCourse v-model:isShowCourse="isShowCourse" v-if="isShowCourse === true" />
<AddSemCourse v-model:isShowCourse="isShowCourse" v-if="isShowCourse === true" :id="id" @create="handleFresh" />
</el-dialog>
</template>
<script setup lang="ts">
// import { getProList } from '../api'
import { getSemList } from '../api'
import AddSemester from '../components/AddSemester.vue'
import SemesterCourse from '../components/SemesterCourse.vue'
// import { useMapStore } from '@/stores/map'
......@@ -7,52 +7,53 @@ import SemesterCourse from '../components/SemesterCourse.vue'
const appList = ref()
const title = ref('')
const id = ref('')
const isEdit = ref(false)
const isEdit = ref('')
const isShowAddSemDialog = ref(false)
const isShowSemCourseDialog = ref(false)
const listOptions = $computed(() => {
return {
// remote: { httpRequest: getProList, params: { name: '' } },
remote: { httpRequest: getSemList, params: { name: '', organ_id: '' } },
filters: [
{ type: 'input', prop: 'name', label: '学期名称', placeholder: '学期名称' },
{ type: 'input', prop: 'name', label: '所属部门/学校', placeholder: '所属部门/学校' }
{ type: 'input', prop: 'name', label: '学期名称:', placeholder: '学期名称' },
{ type: 'input', prop: 'organ_id', label: '所属部门/学校:', placeholder: '所属部门/学校' }
],
columns: [
{ label: '序号', type: 'index', align: 'center' },
{ label: '学期名称', prop: 'name', align: 'center' },
{ label: '所属部门/学校', prop: 'name', align: 'center' },
{ label: '学期开始日期', prop: 'name', align: 'center' },
{ label: '学期结束日期', prop: 'name', align: 'center' },
{ label: '教学周', prop: 'name', align: 'center' },
{ label: '更新时间', prop: 'update_time', align: 'center' },
{ label: '所属部门/学校', prop: 'organ_id_name', align: 'center' },
{ label: '学期开始日期', prop: 'start_time', align: 'center' },
{ label: '学期结束日期', prop: 'end_time', align: 'center' },
{ label: '教学周', prop: 'length', align: 'center' },
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center' }
],
data: [
{
name: '1111'
}
]
}
})
const handleAddSemester = () => {
isShowAddSemDialog.value = true
title.value = '新增学期'
isEdit.value = '0'
}
const handleDetail = (row: any) => {
const handleEdit = (row: any) => {
isShowAddSemDialog.value = true
title.value = '查看详情'
title.value = '编辑学期'
id.value = row.id
isEdit.value = '1'
}
const handleEdit = (row: any) => {
const handleDetail = (row: any) => {
isShowAddSemDialog.value = true
title.value = '编辑学期'
title.value = '查看详情'
id.value = row.id
isEdit.value = true
isEdit.value = '2'
}
const handleCourse = (row: any) => {
isShowSemCourseDialog.value = true
id.value = row.id
}
const handleFresh = () => {
appList.value.refetch()
}
</script>
<template>
......@@ -72,8 +73,13 @@ const handleCourse = (row: any) => {
v-model:isShowAddSemDialog="isShowAddSemDialog"
v-if="isShowAddSemDialog === true"
:title="title"
:id="title"
:id="id"
:isEdit="isEdit"
@create="handleFresh"
/>
<SemesterCourse
v-model:isShowSemCourseDialog="isShowSemCourseDialog"
v-if="isShowSemCourseDialog === true"
:id="id"
/>
<SemesterCourse v-model:isShowSemCourseDialog="isShowSemCourseDialog" v-if="isShowSemCourseDialog === true" />
</template>
......@@ -4,7 +4,7 @@ import httpRequest from '@/utils/axios'
export function getStaffList(params?: { name?: string; organ_id?: string; page?: string; ['per-page']?: string }) {
return httpRequest.get('/api/resource/v1/learning/teacher/list', { params })
}
// // 获取学生列表
// 添加学生
export function addStaff(data?: {
school: string
name: string
......
import httpRequest from '@/utils/axios'
// 获取学生列表
export function getStudentList(params?: { type?: string; page?: number; page_size?: number }) {
export function getStudentList(params?: { name?: string; organ_id?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/student/list', { params })
}
// // 导入学生
......@@ -10,6 +10,11 @@ export function importStudent(data: { file: any }) {
headers: { 'Content-Type': 'multipart/form-data' }
})
}
// 导出学生
export function exportStudent(params: { name: string; organ_id: string }) {
return httpRequest.get('/api/resource/v1/learning/student/download', { params, responseType: 'blob' })
}
// 导出学生
// 添加学生
export function addStudent(data?: {
name: string
......@@ -48,3 +53,7 @@ export function getStuDetail(params?: { id: string }) {
export function getClassList(params?: { specialty_id: string; organ_id: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/learning/student/search-class', { params })
}
// 获取专业列表
export function getProList(params?: { name?: string; page?: string; 'per-page'?: string }) {
return httpRequest.get('/api/resource/v1/backend/specialty/list', { params })
}
......@@ -4,7 +4,7 @@ import { ElMessage } from 'element-plus'
import { useProjectList } from '@/composables/useGetProjectList'
import { useMapStore } from '@/stores/map'
import { addStudent, updateStudent, getStuDetail, getClassList } from '../api'
import { addStudent, updateStudent, getStuDetail, getClassList, getProList } from '../api'
const store = useMapStore()
const ruleFormRef = ref<FormInstance>()
......@@ -14,7 +14,6 @@ const departmentList: any = useProjectList('', '79806610719731712').departmentLi
const sexList = store.mapList.filter((item: any) => item.key === 'system_gender')[0].values
const idTypeList = store.mapList.filter((item: any) => item.key === 'system_id_type')[0].values
const statusList = store.getMapValuesByKey('system_status')
const majorList = store.getMapValuesByKey('specialty_category')
const form = reactive({
sno_number: '',
......@@ -35,8 +34,8 @@ const rules = reactive<FormRules>({
mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
id_type: [{ required: true, message: '请选择证件类型', trigger: 'change' }],
id_number: [{ required: true, message: '请输入证件号码', trigger: 'blur' }],
organ_id: [{ required: true, message: '请选择部门/学校', trigger: 'change' }]
// status: [{ required: true, message: '请选择状态', trigger: 'change' }]
organ_id: [{ required: true, message: '请选择部门/学校', trigger: 'change' }],
status: [{ required: true, message: '请选择状态', trigger: 'change' }]
})
const props = defineProps({
isShowAddDialog: {
......@@ -100,23 +99,56 @@ if (props.isEdit === '2' || props.isEdit === '1') {
})
})
}
const proList: any = ref([])
const allPro: any = ref([])
watch(
() => form.organ_id,
() => {
if (form.organ_id !== '') {
getProList({ name: '', 'per-page': '100' }).then((res: any) => {
proList.value = res.data.list
proList.value.forEach((item: any) => {
const findItem = allPro.value.find((cItem: any) => cItem.id === item.id)
if (!findItem) {
allPro.value.push(item)
}
})
})
}
}
)
const loading = ref(false)
const classList: any = ref([])
const allLecturers: any = ref([])
const handleClassList = (query: string) => {
if (query) {
loading.value = true
getClassList({ specialty_id: query, organ_id: form.organ_id, 'per-page': '100' }).then((res: any) => {
loading.value = false
classList.value = res.data.list
classList.value.forEach((item: any) => {
const findItem = allLecturers.value.find((cItem: any) => cItem.id === item.id)
if (!findItem) {
allLecturers.value.push(item)
}
watch(
() => form.specialty_id,
() => {
if (form.organ_id !== '') {
getClassList({ specialty_id: form.specialty_id, organ_id: form.organ_id, 'per-page': '100' }).then((res: any) => {
loading.value = false
classList.value = res.data.list
classList.value.forEach((item: any) => {
const findItem = allLecturers.value.find((cItem: any) => cItem.id === item.id)
if (!findItem) {
allLecturers.value.push(item)
}
})
})
})
} else {
}
}
)
const handleChangeOrgan = (val: any) => {
if (val === '') {
form.specialty_id = ''
proList.value = []
form.class_id = ''
classList.value = []
}
}
const handleChangeSpe = (val: any) => {
if (val === '') {
form.class_id = ''
classList.value = []
}
}
......@@ -125,65 +157,70 @@ const handleClassList = (query: string) => {
<el-dialog :model-value="isShowAddDialog" draggable :before-close="handleCancel" :title="props.title" width="30%">
<el-form :model="form" label-width="120px" :rules="rules" ref="ruleFormRef">
<el-form-item label="学号:" prop="sno_number">
<el-input v-model="form.sno_number" :disabled="props.title === '查看详情'"></el-input>
<el-input v-model="form.sno_number" :disabled="props.isEdit === '2'"></el-input>
</el-form-item>
<el-form-item label="姓名:" prop="name">
<el-input v-model="form.name" :disabled="props.title === '查看详情'"></el-input>
<el-input v-model="form.name" :disabled="props.isEdit === '2'"></el-input>
</el-form-item>
<el-form-item label="性别:" prop="gender">
<el-radio-group v-model="form.gender" :disabled="props.title === '查看详情'">
<el-radio-group v-model="form.gender" :disabled="props.isEdit === '2'">
<el-radio v-for="(item, index) in sexList" :key="index" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="联系电话:" prop="mobile">
<el-input v-model="form.mobile" :disabled="props.title === '查看详情'"></el-input>
<el-input v-model="form.mobile" :disabled="props.isEdit === '2'"></el-input>
</el-form-item>
<el-form-item label="证件类型:" prop="card_type">
<el-radio-group v-model="form.id_type" :disabled="props.title === '查看详情'">
<el-radio-group v-model="form.id_type" :disabled="props.isEdit === '2'">
<el-radio v-for="(item, index) in idTypeList" :key="index" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="证件号码:" prop="id_number">
<el-input v-model="form.id_number" :disabled="props.title === '查看详情'" />
<el-input v-model="form.id_number" :disabled="props.isEdit === '2'" />
</el-form-item>
<el-form-item label="所属部门/学校:" prop="organ_id">
<el-select clearable v-model="form.organ_id" :disabled="props.title === '查看详情'" style="width: 100%">
<el-select
clearable
v-model="form.organ_id"
:disabled="props.isEdit === '2'"
style="width: 100%"
placeholder="请选择所属部门/学校"
@change="handleChangeOrgan"
>
<el-option v-for="item in departmentList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="专业:" prop="specialty_id">
<el-select v-model="form.specialty_id" placeholder="请选择专业" :disabled="props.title === '查看详情'">
<el-option
v-for="(item, index) in majorList"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
<el-select
v-model="form.specialty_id"
clearable
placeholder="请选择专业"
style="width: 230px"
@change="handleChangeSpe"
:disabled="props.isEdit === '2'"
>
<el-option v-for="item in proList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="班级:" prop="class_id">
<el-select
v-model="form.class_id"
clearable
filterable
remote
multiple
placeholder="请输入班级"
:remote-method="handleClassList"
:loading="loading"
placeholder="请选择班级"
style="width: 230px"
:disabled="props.isEdit === '2'"
>
<el-option v-for="item in classList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="系统同步状态:" prop="status">
<el-radio-group v-model="form.status" :disabled="props.title === '查看详情'">
<el-form-item label="状态:" prop="status">
<el-radio-group v-model="form.status" :disabled="props.isEdit === '2'">
<el-radio v-for="(item, id) in statusList" :key="id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer v-if="isEdit !== '2'">
<template #footer v-if="props.isEdit !== '2'">
<span>
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleConfirm(ruleFormRef)">确认</el-button>
......
......@@ -37,14 +37,14 @@ const fetchFileUpload = (option: any) => {
return new Promise(() => {
importStudent({ file: option.file }).then(() => {
ElMessage.success('导入数据成功')
emit('update:isShowImportDialog', false)
emit('create')
})
})
}
const handleSubmitUpload = () => {
upload.value.submit()
emit('update:isShowImportDialog', false)
emit('create')
}
</script>
<template>
......
......@@ -2,45 +2,40 @@
import { useProjectList } from '@/composables/useGetProjectList'
import AddStudent from '../components/AddStudent.vue'
import ImportStudent from '../components/ImportStudent.vue'
import { getStudentList } from '../api'
// import { useMapStore } from '@/stores/map'
// const store = useMapStore()
import { getStudentList, exportStudent } from '../api'
const departmentList: any = useProjectList('', '79806610719731712').departmentList
const appList = ref()
const id = ref('')
const title = ref('')
const isEdit = ref('')
const isShowAddDialog = ref(false)
const isShowImportDialog = ref(false)
const listOptions = $computed(() => {
return {
remote: { httpRequest: getStudentList, params: { name: '', organ_id: '' } },
filters: [
{ type: 'input', prop: 'name', label: '学生姓名:', placeholder: '学生姓名' },
{ type: 'select', slots: 'filter-department' }
],
columns: [
{ type: 'selection' },
{ label: '序号', type: 'index', align: 'center' },
{ label: '学号', prop: 'sno_number', align: 'center' },
{ label: '姓名', prop: 'name', align: 'center' },
{ label: '性别', prop: 'gender', align: 'center' },
{ label: '出生年月', prop: 'birthday', align: 'center' },
{ label: '省', prop: 'province_name', align: 'center' },
{ label: '市', prop: 'city_name', align: 'center' },
{ label: '县', prop: 'county_name', align: 'center' },
{ label: '联系电话', prop: 'mobile', align: 'center' },
{ label: '部门/学校', prop: 'organ_id_name', align: 'center' },
{ label: '专业', prop: 'specialty_id_name', align: 'center' },
{ label: '班级', prop: 'class_id_name', align: 'center' },
{ label: '身份证号', prop: 'id_number', align: 'center' },
{ label: '有效状态', prop: 'status_name', align: 'center' },
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', fixed: 'right' }
]
}
})
const listOptions = {
remote: { httpRequest: getStudentList, params: { name: '', organ_id: '' } },
filters: [
{ type: 'input', prop: 'name', label: '学生姓名:', placeholder: '学生姓名' },
{ type: 'select', slots: 'filter-department' }
],
columns: [
{ type: 'selection' },
{ label: '序号', type: 'index', align: 'center' },
{ label: '学号', prop: 'sno_number', align: 'center' },
{ label: '姓名', prop: 'name', align: 'center' },
{ label: '性别', prop: 'gender', align: 'center' },
{ label: '出生年月', prop: 'birthday', align: 'center' },
{ label: '省', prop: 'province_name', align: 'center' },
{ label: '市', prop: 'city_name', align: 'center' },
{ label: '县', prop: 'county_name', align: 'center' },
{ label: '联系电话', prop: 'mobile', align: 'center' },
{ label: '部门/学校', prop: 'organ_id_name', align: 'center' },
{ label: '专业', prop: 'specialty_id_name', align: 'center' },
{ label: '班级', prop: 'class_id_name', align: 'center' },
{ label: '身份证号', prop: 'id_number', align: 'center' },
{ label: '有效状态', prop: 'status_name', align: 'center' },
{ label: '更新时间', prop: 'updated_time', align: 'center' },
{ label: '操作', slots: 'table-operate', align: 'center', minWidth: '200', fixed: 'right' }
]
}
// 刷新页面
const handleRefresh = () => {
......@@ -72,13 +67,37 @@ const handleImport = () => {
}
// 导出
const handleExport = () => {
console.log('000')
const params = Object.assign({}, appList.value?.params)
exportStudent(params).then((r: any) => {
const blob = new Blob([r], { type: 'application/vnd.ms-excel' })
if ('download' in document.createElement('a')) {
const elink = document.createElement('a')
elink.download = '学员数据.xlsx'
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}
})
}
const multipleSelection: any = ref([])
const handleSelectionChange = (val: any) => {
multipleSelection.value = val
}
</script>
<template>
<AppCard title="学生管理">
<AppList v-bind="listOptions" ref="appList" border stripe style="margin-top: 30px">
<AppList
v-bind="listOptions"
ref="appList"
@selection-change="handleSelectionChange"
border
stripe
style="margin-top: 30px"
>
<el-button type="primary" round @click="handleAddStudent">新增学生</el-button>
<el-button type="primary" round @click="handleImport">批量导入</el-button>
<el-button type="primary" round @click="handleExport">导出</el-button>
......
......@@ -207,18 +207,18 @@ const liveOptions = computed(() => {
</div>
<div class="other-info">
<div class="item">
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/course-view-icon10.png" />
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/course-view-icon11.png" />
<div class="label">课程所属部门</div>
<div class="value">{{ props.data.organ_id_name }}</div>
</div>
<div class="item">
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/course-view-icon11.png" />
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/course-view-icon12.png" />
<div class="label">课程公开信息</div>
<div class="value">{{ props.data.department_public_name }}</div>
<div class="value">{{ props.data.platform_public_name }}</div>
</div>
<div class="item">
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/course-view-icon12.png" />
<img src="https://webapp-pub.oss-cn-beijing.aliyuncs.com/center_resource/course-view-icon15.png" />
<div class="label">课程授权信息</div>
<div class="value" v-for="(item, index) in props.data.auth_departments" :key="index">
{{ item.department_name }}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论