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

chore:基础管理接口对接

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