|
@@ -1,721 +1,721 @@
|
|
|
-import { defineComponent, reactive, onMounted, ref } from 'vue';
|
|
|
-import styles from './index.module.less';
|
|
|
-import {
|
|
|
- NButton,
|
|
|
- NCascader,
|
|
|
- NDataTable,
|
|
|
- NForm,
|
|
|
- NFormItem,
|
|
|
- NImage,
|
|
|
- NModal,
|
|
|
- NSpace,
|
|
|
- useMessage
|
|
|
-} from 'naive-ui';
|
|
|
-import SearchInput from '@/components/searchInput';
|
|
|
-import CSelect from '@/components/CSelect';
|
|
|
-import Pagination from '@/components/pagination';
|
|
|
-import { classGroupList, deleteClass, getSubject, addGroup } from './api';
|
|
|
-import CreateClass from './modals/createClass';
|
|
|
-import RestStudentBox from './modals/restStudentBox';
|
|
|
-import { getgradeNumList, classArray } from './contants';
|
|
|
-import add from '@/views/studentList/images/add.png';
|
|
|
-import ClassGuide from '@/custom-plugins/guide-page/class-guide';
|
|
|
-import { useRoute, useRouter } from 'vue-router';
|
|
|
-import TheEmpty from '/src/components/TheEmpty';
|
|
|
-import TheTooltip from '/src/components/TheTooltip';
|
|
|
-import PreviewWindow from '../preview-window';
|
|
|
-import ResetSubject from './modals/resetSubject';
|
|
|
-import UpdateSubject from './modals/updateSubject';
|
|
|
-import { getGradeLevelList, getGradeYearList } from '../home/api';
|
|
|
-import { initCache, setCache } from '/src/hooks/use-async';
|
|
|
-import AddStudentModel from '../studentList/modals/addStudentModel';
|
|
|
-import { useUserStore } from '/src/store/modules/users';
|
|
|
-import { useCatchStore } from '/src/store/modules/catchData';
|
|
|
-export default defineComponent({
|
|
|
- name: 'class-classList',
|
|
|
- setup() {
|
|
|
- const catchData = useCatchStore();
|
|
|
- const users = useUserStore();
|
|
|
- const state = reactive({
|
|
|
- searchForm: {
|
|
|
- keyword: null as any,
|
|
|
- currentClass: '',
|
|
|
- currentGradeNum: '',
|
|
|
- instrumentId: '',
|
|
|
- gradeYear: '',
|
|
|
- gradeLevel: ''
|
|
|
- },
|
|
|
- orchestraType: null,
|
|
|
- courseTypeCode: null,
|
|
|
- loading: false,
|
|
|
- pagination: {
|
|
|
- page: 1,
|
|
|
- rows: 10,
|
|
|
- pageTotal: 6
|
|
|
- },
|
|
|
- gradeNumList: [] as any,
|
|
|
- tableList: [] as any,
|
|
|
- studentVisible: false,
|
|
|
- activeRow: null as any,
|
|
|
- showaddClass: false,
|
|
|
- goCourseVisiable: false,
|
|
|
- removeVisiable: false,
|
|
|
- removeRow: {} as any,
|
|
|
- previewModal: false,
|
|
|
- previewParams: {} as any,
|
|
|
- lastCourse: null as any,
|
|
|
- groupBtnLoading: false, // 按钮是否在请求中
|
|
|
- // subjectList: [] as any,
|
|
|
- showResetClass: false,
|
|
|
- showSubjectClass: false,
|
|
|
- groupVisiable: false,
|
|
|
- popSelectYearList: [] as any,
|
|
|
- popSelectLevelList: [] as any,
|
|
|
- addStudentVisible: false
|
|
|
- });
|
|
|
- const formRef = ref();
|
|
|
- const message = useMessage();
|
|
|
- const router = useRouter();
|
|
|
- const route = useRoute();
|
|
|
- const search = () => {
|
|
|
- state.pagination.page = 1;
|
|
|
- getList();
|
|
|
- setCache({ current: state.searchForm, saveKey: route.path });
|
|
|
- };
|
|
|
- const showGuide = ref(false);
|
|
|
- state.gradeNumList = getgradeNumList();
|
|
|
- const onReset = () => {
|
|
|
- state.searchForm = {
|
|
|
- keyword: null as any,
|
|
|
- currentClass: '' as any,
|
|
|
- currentGradeNum: '' as any,
|
|
|
- instrumentId: '' as any,
|
|
|
- gradeYear: '' as any,
|
|
|
- gradeLevel: ''
|
|
|
- };
|
|
|
- if (state.popSelectYearList.length > 1) {
|
|
|
- state.searchForm.gradeYear = state.popSelectYearList[1].id;
|
|
|
- }
|
|
|
- getList();
|
|
|
- setCache({ current: state.searchForm, saveKey: route.path });
|
|
|
- };
|
|
|
-
|
|
|
- const removeClass = async () => {
|
|
|
- try {
|
|
|
- await deleteClass({ ids: state.removeRow.id });
|
|
|
- getList();
|
|
|
- message.success(`删除成功`);
|
|
|
- state.removeVisiable = false;
|
|
|
- } catch (e) {
|
|
|
- console.log(e);
|
|
|
- }
|
|
|
- };
|
|
|
- const getList = async () => {
|
|
|
- // classGroupList
|
|
|
- state.loading = true;
|
|
|
- try {
|
|
|
- const res = await classGroupList({
|
|
|
- ...state.searchForm,
|
|
|
- ...state.pagination
|
|
|
- });
|
|
|
- state.tableList = res.data.rows;
|
|
|
- state.pagination.pageTotal = res.data.total;
|
|
|
- state.loading = false;
|
|
|
-
|
|
|
- setTimeout(() => {
|
|
|
- if (state.tableList.length > 0) {
|
|
|
- showGuide.value = true;
|
|
|
- }
|
|
|
- }, 500);
|
|
|
- } catch (e) {
|
|
|
- state.loading = false;
|
|
|
- console.log(e);
|
|
|
- }
|
|
|
- };
|
|
|
- // const getSubjectList = async () => {
|
|
|
- // const res = await getSubject({ page: 1, rows: 9999 });
|
|
|
- // state.subjectList = res.data.rows.map((item: any) => {
|
|
|
- // return {
|
|
|
- // value: item.id,
|
|
|
- // label: item.name
|
|
|
- // };
|
|
|
- // });
|
|
|
- // state.subjectList.unshift({ value: '', label: '全部声部' });
|
|
|
- // };
|
|
|
- const columns = () => {
|
|
|
- return [
|
|
|
- {
|
|
|
- title: '班级名称',
|
|
|
- key: 'name'
|
|
|
- },
|
|
|
- {
|
|
|
- title: '学年',
|
|
|
- key: 'gradeYear'
|
|
|
- },
|
|
|
- {
|
|
|
- title: '学级',
|
|
|
- key: 'gradeLevel',
|
|
|
- render(row: any) {
|
|
|
- return row.gradeLevel ? `${row.gradeLevel}级` : '';
|
|
|
- }
|
|
|
- },
|
|
|
- {
|
|
|
- title: '班级乐器',
|
|
|
- key: 'instrumentName'
|
|
|
- },
|
|
|
- {
|
|
|
- title: '学生人数',
|
|
|
- key: 'preStudentNum'
|
|
|
- },
|
|
|
- {
|
|
|
- title: '上次学习',
|
|
|
- key: 'lastStudy',
|
|
|
- width: '20%',
|
|
|
- render(row: any) {
|
|
|
- return row.lastStudy ? (
|
|
|
- <TheTooltip
|
|
|
- maxWidth={300}
|
|
|
- showContentWidth={300}
|
|
|
- content={row.lastStudy}
|
|
|
- />
|
|
|
- ) : (
|
|
|
- '--'
|
|
|
- );
|
|
|
- }
|
|
|
- },
|
|
|
- {
|
|
|
- title: '操作',
|
|
|
- key: 'id',
|
|
|
-
|
|
|
- render(row: any, index: number) {
|
|
|
- return (
|
|
|
- <div>
|
|
|
- <NSpace>
|
|
|
- {index == 0 ? (
|
|
|
- <div id="class-0">
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- text
|
|
|
- onClick={() => {
|
|
|
- router.push({
|
|
|
- path: '/classDetail',
|
|
|
- query: {
|
|
|
- name: row.name,
|
|
|
- id: row.id,
|
|
|
- gradeYear: row.gradeYear,
|
|
|
- upgradeFlag: row.upgradeFlag ? 1 : 0 // 是否为历史班
|
|
|
- }
|
|
|
- });
|
|
|
- }}>
|
|
|
- 详情
|
|
|
- </NButton>
|
|
|
- </div>
|
|
|
- ) : (
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- text
|
|
|
- onClick={() => {
|
|
|
- router.push({
|
|
|
- path: '/classDetail',
|
|
|
- query: {
|
|
|
- name: row.name,
|
|
|
- id: row.id,
|
|
|
- gradeYear: row.gradeYear,
|
|
|
- upgradeFlag: row.upgradeFlag ? 1 : 0 // 是否为历史班
|
|
|
- }
|
|
|
- });
|
|
|
- }}>
|
|
|
- 详情
|
|
|
- </NButton>
|
|
|
- )}
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- disabled={!row.upgradeFlag || row.instrumentId}
|
|
|
- text
|
|
|
- onClick={() => resetClassSubject(row)}>
|
|
|
- 修改乐器
|
|
|
- </NButton>
|
|
|
- {index == 0 ? (
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- disabled={!row.upgradeFlag}
|
|
|
- {...{ id: 'class-1' }}
|
|
|
- text
|
|
|
- onClick={() => {
|
|
|
- startResetStudent(row);
|
|
|
- }}>
|
|
|
- 学生调整
|
|
|
- </NButton>
|
|
|
- ) : (
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- disabled={!row.upgradeFlag}
|
|
|
- text
|
|
|
- onClick={() => {
|
|
|
- startResetStudent(row);
|
|
|
- }}>
|
|
|
- 学生调整
|
|
|
- </NButton>
|
|
|
- )}
|
|
|
- {index == 0 ? (
|
|
|
- <NButton
|
|
|
- {...{ id: 'class-2' }}
|
|
|
- disabled={!row.upgradeFlag}
|
|
|
- type="primary"
|
|
|
- text
|
|
|
- onClick={() => classesBegin(row)}>
|
|
|
- 开始上课
|
|
|
- </NButton>
|
|
|
- ) : (
|
|
|
- <NButton
|
|
|
- disabled={!row.upgradeFlag}
|
|
|
- type="primary"
|
|
|
- text
|
|
|
- onClick={() => classesBegin(row)}>
|
|
|
- 开始上课
|
|
|
- </NButton>
|
|
|
- )}
|
|
|
-
|
|
|
- {/* <p
|
|
|
- style={{ color: '#EA4132', cursor: 'pointer' }}
|
|
|
- onClick={() => {
|
|
|
- state.removeVisiable = true;
|
|
|
- state.removeRow = row;
|
|
|
- }}>
|
|
|
- 删除
|
|
|
- </p> */}
|
|
|
- {!(row.preStudentNum > 0) ? (
|
|
|
- <NButton
|
|
|
- type="error"
|
|
|
- color="#EA4132"
|
|
|
- textColor="#EA4132"
|
|
|
- text
|
|
|
- onClick={() => {
|
|
|
- state.removeVisiable = true;
|
|
|
- state.removeRow = row;
|
|
|
- }}>
|
|
|
- 删除
|
|
|
- </NButton>
|
|
|
- ) : null}
|
|
|
- {row.imGroupId ? null : (
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- disabled={!row.upgradeFlag}
|
|
|
- text
|
|
|
- onClick={() => {
|
|
|
- createImgroup(row);
|
|
|
- }}>
|
|
|
- 创建群聊
|
|
|
- </NButton>
|
|
|
- )}
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- disabled={!row.upgradeFlag}
|
|
|
- text
|
|
|
- onClick={() => {
|
|
|
- const { schoolInfos } = users.getUserInfo;
|
|
|
- const schoolId =
|
|
|
- schoolInfos.length > 0 ? schoolInfos[0].id : null;
|
|
|
- if (schoolId) {
|
|
|
- state.addStudentVisible = true;
|
|
|
- state.activeRow = {
|
|
|
- id: schoolId,
|
|
|
- classId: row.id,
|
|
|
- currentGradeNum: row.currentGradeNum,
|
|
|
- currentClass: row.currentClass,
|
|
|
- gradeYear: row.gradeYear
|
|
|
- };
|
|
|
- }
|
|
|
- }}>
|
|
|
- 邀请学生
|
|
|
- </NButton>
|
|
|
- </NSpace>
|
|
|
- </div>
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
- ];
|
|
|
- };
|
|
|
-
|
|
|
- const startResetStudent = (row: any) => {
|
|
|
- state.activeRow = row;
|
|
|
- state.studentVisible = true;
|
|
|
- };
|
|
|
-
|
|
|
- const classesBegin = async (row: any) => {
|
|
|
- try {
|
|
|
- // 判断是否有声部
|
|
|
- if (row.instrumentId) {
|
|
|
- //
|
|
|
- // 声部先取上次上课的声部,如果没有则取班级上面的声部
|
|
|
- router.push({
|
|
|
- path: '/prepare-lessons',
|
|
|
- query: {
|
|
|
- lastUseCoursewareId: row.lessonCoursewareId,
|
|
|
- unit: row.lessonCoursewareKnowledgeDetailId,
|
|
|
- instrumentId: row.instrumentId,
|
|
|
- courseScheduleSubjectId: row.courseScheduleSubjectId,
|
|
|
- preStudentNum: row.preStudentNum,
|
|
|
- name: row.name, // 班级名称
|
|
|
- classGroupId: row.id // 班级编号
|
|
|
- }
|
|
|
- });
|
|
|
- } else {
|
|
|
- state.showSubjectClass = true;
|
|
|
- state.activeRow = row;
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.log(e);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const resetClassSubject = (row: any) => {
|
|
|
- state.activeRow = row;
|
|
|
- state.showResetClass = true;
|
|
|
- };
|
|
|
- const createImgroup = async (row: any) => {
|
|
|
- state.activeRow = row;
|
|
|
- state.groupVisiable = true;
|
|
|
- };
|
|
|
-
|
|
|
- const submitGroup = async () => {
|
|
|
- console.log(state.activeRow, 'row');
|
|
|
- state.groupBtnLoading = true;
|
|
|
- try {
|
|
|
- await addGroup({ classGroupId: state.activeRow.id });
|
|
|
- message.success('创建成功');
|
|
|
- state.groupVisiable = false;
|
|
|
- await getList();
|
|
|
- } catch (e) {
|
|
|
- console.log(e);
|
|
|
- }
|
|
|
- state.groupBtnLoading = false;
|
|
|
- };
|
|
|
-
|
|
|
- // 获取学年
|
|
|
- const getYearList = async () => {
|
|
|
- try {
|
|
|
- const { data } = await getGradeYearList();
|
|
|
- const temp = data || [];
|
|
|
- temp.forEach((i: any) => {
|
|
|
- i.name = i.name + '学年';
|
|
|
- });
|
|
|
- // temp.unshift({
|
|
|
- // id: '',
|
|
|
- // name: '全部学年'
|
|
|
- // });
|
|
|
- state.popSelectYearList = temp || [];
|
|
|
- if (temp.length > 1 && !state.searchForm.gradeYear) {
|
|
|
- state.searchForm.gradeYear = temp[1].id;
|
|
|
- }
|
|
|
- } catch {
|
|
|
- //
|
|
|
- }
|
|
|
- };
|
|
|
- // 获取学级
|
|
|
- const getLevelList = async () => {
|
|
|
- try {
|
|
|
- const { data } = await getGradeLevelList();
|
|
|
- const temp = data || [];
|
|
|
- temp.forEach((i: any) => {
|
|
|
- i.name = i.name + '级';
|
|
|
- });
|
|
|
- temp.unshift({
|
|
|
- id: '',
|
|
|
- name: '全部学级'
|
|
|
- });
|
|
|
- state.popSelectLevelList = temp || [];
|
|
|
- if (temp.length > 0 && !state.searchForm.gradeLevel) {
|
|
|
- state.searchForm.gradeLevel = temp[0].id;
|
|
|
- }
|
|
|
- } catch {
|
|
|
- //
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- initCache({
|
|
|
- current: state.searchForm,
|
|
|
- callBack: (active: any) => {
|
|
|
- state.searchForm = active;
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- onMounted(async () => {
|
|
|
- state.loading = true;
|
|
|
- await catchData.getSubjects();
|
|
|
-
|
|
|
- // getSubjectList();
|
|
|
- await getYearList();
|
|
|
- await getLevelList();
|
|
|
- await getList();
|
|
|
-
|
|
|
- state.loading = false;
|
|
|
- });
|
|
|
- return () => (
|
|
|
- <div class={styles.listWrap}>
|
|
|
- <div class={styles.searchList}>
|
|
|
- <NForm label-placement="left" inline ref={formRef}>
|
|
|
- <NFormItem>
|
|
|
- <SearchInput
|
|
|
- {...{ placeholder: '请输入班级名称' }}
|
|
|
- class={styles.searchInput}
|
|
|
- searchWord={state.searchForm.keyword}
|
|
|
- onChangeValue={(val: string) =>
|
|
|
- (state.searchForm.keyword = val)
|
|
|
- }></SearchInput>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem>
|
|
|
- <CSelect
|
|
|
- {...({
|
|
|
- options: state.popSelectYearList,
|
|
|
- placeholder: '选择学年',
|
|
|
- clearable: false,
|
|
|
- inline: true,
|
|
|
- labelField: 'name',
|
|
|
- valueField: 'id'
|
|
|
- } as any)}
|
|
|
- v-model:value={state.searchForm.gradeYear}></CSelect>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem>
|
|
|
- <CSelect
|
|
|
- {...({
|
|
|
- options: state.popSelectLevelList,
|
|
|
- placeholder: '选择学级',
|
|
|
- clearable: true,
|
|
|
- inline: true,
|
|
|
- labelField: 'name',
|
|
|
- valueField: 'id'
|
|
|
- } as any)}
|
|
|
- v-model:value={state.searchForm.gradeLevel}></CSelect>
|
|
|
- </NFormItem>
|
|
|
-
|
|
|
- <NFormItem>
|
|
|
- <CSelect
|
|
|
- {...({
|
|
|
- options: state.gradeNumList,
|
|
|
- placeholder: '选择年级',
|
|
|
- clearable: true,
|
|
|
- inline: true
|
|
|
- } as any)}
|
|
|
- v-model:value={state.searchForm.currentGradeNum}></CSelect>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem>
|
|
|
- <CSelect
|
|
|
- {...({
|
|
|
- options: classArray,
|
|
|
- placeholder: '选择班级',
|
|
|
- clearable: true,
|
|
|
- inline: true
|
|
|
- } as any)}
|
|
|
- v-model:value={state.searchForm.currentClass}></CSelect>
|
|
|
- </NFormItem>
|
|
|
- <NFormItem>
|
|
|
- {/* <CSelect
|
|
|
- {...({
|
|
|
- options: [
|
|
|
- { value: '', label: '全部声部' },
|
|
|
- ...catchData.getSubjectList
|
|
|
- ],
|
|
|
- placeholder: '选择乐器',
|
|
|
- clearable: true,
|
|
|
- inline: true
|
|
|
- } as any)}
|
|
|
- v-model:value={state.searchForm.instrumentId}></CSelect> */}
|
|
|
- <NCascader
|
|
|
- to="body"
|
|
|
- placeholder="选择乐器"
|
|
|
- options={[
|
|
|
- { value: '', label: '全部乐器' },
|
|
|
- ...catchData.getSubjectList
|
|
|
- ]}
|
|
|
- childrenField="instruments"
|
|
|
- checkStrategy="child"
|
|
|
- expandTrigger="hover"
|
|
|
- showPath={false}
|
|
|
- v-model:value={state.searchForm.instrumentId}
|
|
|
- onUpdate:value={(val: any, option: any, pathValues: any) => {
|
|
|
- console.log(val, option, pathValues);
|
|
|
- }}
|
|
|
- />
|
|
|
- </NFormItem>
|
|
|
- <NFormItem>
|
|
|
- <NSpace justify="end">
|
|
|
- <NButton type="primary" class="searchBtn" onClick={search}>
|
|
|
- 搜索
|
|
|
- </NButton>
|
|
|
- <NButton
|
|
|
- type="primary"
|
|
|
- ghost
|
|
|
- class="resetBtn"
|
|
|
- onClick={onReset}>
|
|
|
- 重置
|
|
|
- </NButton>
|
|
|
- </NSpace>
|
|
|
- </NFormItem>
|
|
|
- </NForm>
|
|
|
- </div>
|
|
|
- <NButton
|
|
|
- class={styles.addBtn}
|
|
|
- type="primary"
|
|
|
- onClick={() => (state.showaddClass = true)}
|
|
|
- v-slots={{
|
|
|
- icon: () => (
|
|
|
- <>
|
|
|
- <NImage
|
|
|
- class={styles.addBtnIcon}
|
|
|
- previewDisabled
|
|
|
- src={add}></NImage>
|
|
|
- </>
|
|
|
- )
|
|
|
- }}>
|
|
|
- 创建班级
|
|
|
- </NButton>
|
|
|
- <div class={styles.tableWrap}>
|
|
|
- <NDataTable
|
|
|
- v-slots={{
|
|
|
- empty: () => <TheEmpty></TheEmpty>
|
|
|
- }}
|
|
|
- class={styles.classTable}
|
|
|
- loading={state.loading}
|
|
|
- columns={columns()}
|
|
|
- data={state.tableList}></NDataTable>
|
|
|
- <Pagination
|
|
|
- v-model:page={state.pagination.page}
|
|
|
- v-model:pageSize={state.pagination.rows}
|
|
|
- v-model:pageTotal={state.pagination.pageTotal}
|
|
|
- onList={getList}
|
|
|
- sync
|
|
|
- />
|
|
|
- </div>
|
|
|
- <NModal
|
|
|
- v-model:show={state.studentVisible}
|
|
|
- preset="card"
|
|
|
- class={['modalTitle background', styles.studentVisible]}
|
|
|
- title={'学生调整'}>
|
|
|
- <RestStudentBox
|
|
|
- activeRow={state.activeRow}
|
|
|
- onClose={() => (state.studentVisible = false)}
|
|
|
- onGetList={() => getList()}></RestStudentBox>
|
|
|
- </NModal>
|
|
|
- <NModal
|
|
|
- v-model:show={state.showaddClass}
|
|
|
- style={{ width: '500px' }}
|
|
|
- display-directive="if"
|
|
|
- preset="card"
|
|
|
- class={['modalTitle background']}
|
|
|
- title={'创建班级'}>
|
|
|
- <CreateClass
|
|
|
- gradeYearList={state.popSelectYearList}
|
|
|
- gradeNumList={state.gradeNumList}
|
|
|
- classArray={classArray}
|
|
|
- onGetList={() => getList()}
|
|
|
- onClose={() => (state.showaddClass = false)}
|
|
|
- />
|
|
|
- </NModal>
|
|
|
- <NModal
|
|
|
- v-model:show={state.showResetClass}
|
|
|
- style={{ width: '500px' }}
|
|
|
- display-directive="if"
|
|
|
- preset="card"
|
|
|
- class={['modalTitle background']}
|
|
|
- title={'修改乐器'}>
|
|
|
- <ResetSubject
|
|
|
- activeRow={state.activeRow}
|
|
|
- onGetList={() => getList()}
|
|
|
- onClose={() => (state.showResetClass = false)}
|
|
|
- />
|
|
|
- </NModal>
|
|
|
-
|
|
|
- <NModal
|
|
|
- v-model:show={state.showSubjectClass}
|
|
|
- style={{ width: '500px' }}
|
|
|
- preset="card"
|
|
|
- class={['modalTitle background']}
|
|
|
- title={'修改乐器'}>
|
|
|
- {state.showSubjectClass ? (
|
|
|
- <UpdateSubject
|
|
|
- activeRow={state.activeRow}
|
|
|
- onGetList={() => getList()}
|
|
|
- onConfirm={(item: any) => {
|
|
|
- //
|
|
|
- router.push({
|
|
|
- path: '/prepare-lessons',
|
|
|
- query: {
|
|
|
- ...item
|
|
|
- }
|
|
|
- });
|
|
|
- }}
|
|
|
- onClose={() => (state.showSubjectClass = false)}
|
|
|
- />
|
|
|
- ) : null}
|
|
|
- </NModal>
|
|
|
-
|
|
|
- {/* 上课弹窗 */}
|
|
|
- <PreviewWindow
|
|
|
- v-model:show={state.previewModal}
|
|
|
- type="attend"
|
|
|
- params={state.previewParams}
|
|
|
- />
|
|
|
-
|
|
|
- <NModal
|
|
|
- v-model:show={state.removeVisiable}
|
|
|
- preset="card"
|
|
|
- class={['modalTitle', styles.removeVisiable]}
|
|
|
- title={'删除班级'}>
|
|
|
- <div class={styles.studentRemove}>
|
|
|
- <p>
|
|
|
- 确定要删除班级么?
|
|
|
- <span>删除班级信息将会清空</span>。
|
|
|
- </p>
|
|
|
-
|
|
|
- <NSpace class={styles.btnGroup} justify="center">
|
|
|
- <NButton round type="primary" onClick={removeClass}>
|
|
|
- 确定
|
|
|
- </NButton>
|
|
|
- <NButton round onClick={() => (state.removeVisiable = false)}>
|
|
|
- 取消
|
|
|
- </NButton>
|
|
|
- </NSpace>
|
|
|
- </div>
|
|
|
- </NModal>
|
|
|
-
|
|
|
- <NModal
|
|
|
- v-model:show={state.groupVisiable}
|
|
|
- preset="card"
|
|
|
- class={['modalTitle', styles.removeVisiable]}
|
|
|
- title={'创建群聊'}>
|
|
|
- <div class={styles.studentRemove}>
|
|
|
- <p style={{ textAlign: 'center' }}>是否创建班级群聊</p>
|
|
|
-
|
|
|
- <NSpace class={styles.btnGroup} justify="center">
|
|
|
- <NButton
|
|
|
- round
|
|
|
- type="primary"
|
|
|
- onClick={submitGroup}
|
|
|
- loading={state.groupBtnLoading}
|
|
|
- disabled={state.groupBtnLoading}>
|
|
|
- 确定
|
|
|
- </NButton>
|
|
|
- <NButton round onClick={() => (state.groupVisiable = false)}>
|
|
|
- 取消
|
|
|
- </NButton>
|
|
|
- </NSpace>
|
|
|
- </div>
|
|
|
- </NModal>
|
|
|
- {showGuide.value ? <ClassGuide></ClassGuide> : null}
|
|
|
-
|
|
|
- {state.addStudentVisible ? (
|
|
|
- <div
|
|
|
- v-model:show={state.addStudentVisible}
|
|
|
- class={['n-modal-mask', styles.popBox]}>
|
|
|
- <AddStudentModel
|
|
|
- activeRow={state.activeRow}
|
|
|
- onClose={() => {
|
|
|
- state.addStudentVisible = false;
|
|
|
- }}></AddStudentModel>
|
|
|
- </div>
|
|
|
- ) : null}
|
|
|
- </div>
|
|
|
- );
|
|
|
- }
|
|
|
-});
|
|
|
+import { defineComponent, reactive, onMounted, ref } from 'vue';
|
|
|
+import styles from './index.module.less';
|
|
|
+import {
|
|
|
+ NButton,
|
|
|
+ NCascader,
|
|
|
+ NDataTable,
|
|
|
+ NForm,
|
|
|
+ NFormItem,
|
|
|
+ NImage,
|
|
|
+ NModal,
|
|
|
+ NSpace,
|
|
|
+ useMessage
|
|
|
+} from 'naive-ui';
|
|
|
+import SearchInput from '@/components/searchInput';
|
|
|
+import CSelect from '@/components/CSelect';
|
|
|
+import Pagination from '@/components/pagination';
|
|
|
+import { classGroupList, deleteClass, getSubject, addGroup } from './api';
|
|
|
+import CreateClass from './modals/createClass';
|
|
|
+import RestStudentBox from './modals/restStudentBox';
|
|
|
+import { getgradeNumList, classArray } from './contants';
|
|
|
+import add from '@/views/studentList/images/add.png';
|
|
|
+import ClassGuide from '@/custom-plugins/guide-page/class-guide';
|
|
|
+import { useRoute, useRouter } from 'vue-router';
|
|
|
+import TheEmpty from '/src/components/TheEmpty';
|
|
|
+import TheTooltip from '/src/components/TheTooltip';
|
|
|
+import PreviewWindow from '../preview-window';
|
|
|
+import ResetSubject from './modals/resetSubject';
|
|
|
+import UpdateSubject from './modals/updateSubject';
|
|
|
+import { getGradeLevelList, getGradeYearList } from '../home/api';
|
|
|
+import { initCache, setCache } from '/src/hooks/use-async';
|
|
|
+import AddStudentModel from '../studentList/modals/addStudentModel';
|
|
|
+import { useUserStore } from '/src/store/modules/users';
|
|
|
+import { useCatchStore } from '/src/store/modules/catchData';
|
|
|
+export default defineComponent({
|
|
|
+ name: 'class-classList',
|
|
|
+ setup() {
|
|
|
+ const catchData = useCatchStore();
|
|
|
+ const users = useUserStore();
|
|
|
+ const state = reactive({
|
|
|
+ searchForm: {
|
|
|
+ keyword: null as any,
|
|
|
+ currentClass: '',
|
|
|
+ currentGradeNum: '',
|
|
|
+ instrumentId: '',
|
|
|
+ gradeYear: '',
|
|
|
+ gradeLevel: ''
|
|
|
+ },
|
|
|
+ orchestraType: null,
|
|
|
+ courseTypeCode: null,
|
|
|
+ loading: false,
|
|
|
+ pagination: {
|
|
|
+ page: 1,
|
|
|
+ rows: 10,
|
|
|
+ pageTotal: 6
|
|
|
+ },
|
|
|
+ gradeNumList: [] as any,
|
|
|
+ tableList: [] as any,
|
|
|
+ studentVisible: false,
|
|
|
+ activeRow: null as any,
|
|
|
+ showaddClass: false,
|
|
|
+ goCourseVisiable: false,
|
|
|
+ removeVisiable: false,
|
|
|
+ removeRow: {} as any,
|
|
|
+ previewModal: false,
|
|
|
+ previewParams: {} as any,
|
|
|
+ lastCourse: null as any,
|
|
|
+ groupBtnLoading: false, // 按钮是否在请求中
|
|
|
+ // subjectList: [] as any,
|
|
|
+ showResetClass: false,
|
|
|
+ showSubjectClass: false,
|
|
|
+ groupVisiable: false,
|
|
|
+ popSelectYearList: [] as any,
|
|
|
+ popSelectLevelList: [] as any,
|
|
|
+ addStudentVisible: false
|
|
|
+ });
|
|
|
+ const formRef = ref();
|
|
|
+ const message = useMessage();
|
|
|
+ const router = useRouter();
|
|
|
+ const route = useRoute();
|
|
|
+ const search = () => {
|
|
|
+ state.pagination.page = 1;
|
|
|
+ getList();
|
|
|
+ setCache({ current: state.searchForm, saveKey: route.path });
|
|
|
+ };
|
|
|
+ const showGuide = ref(false);
|
|
|
+ state.gradeNumList = getgradeNumList();
|
|
|
+ const onReset = () => {
|
|
|
+ state.searchForm = {
|
|
|
+ keyword: null as any,
|
|
|
+ currentClass: '' as any,
|
|
|
+ currentGradeNum: '' as any,
|
|
|
+ instrumentId: '' as any,
|
|
|
+ gradeYear: '' as any,
|
|
|
+ gradeLevel: ''
|
|
|
+ };
|
|
|
+ if (state.popSelectYearList.length > 1) {
|
|
|
+ state.searchForm.gradeYear = state.popSelectYearList[1].id;
|
|
|
+ }
|
|
|
+ getList();
|
|
|
+ setCache({ current: state.searchForm, saveKey: route.path });
|
|
|
+ };
|
|
|
+
|
|
|
+ const removeClass = async () => {
|
|
|
+ try {
|
|
|
+ await deleteClass({ ids: state.removeRow.id });
|
|
|
+ getList();
|
|
|
+ message.success(`删除成功`);
|
|
|
+ state.removeVisiable = false;
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const getList = async () => {
|
|
|
+ // classGroupList
|
|
|
+ state.loading = true;
|
|
|
+ try {
|
|
|
+ const res = await classGroupList({
|
|
|
+ ...state.searchForm,
|
|
|
+ ...state.pagination
|
|
|
+ });
|
|
|
+ state.tableList = res.data.rows;
|
|
|
+ state.pagination.pageTotal = res.data.total;
|
|
|
+ state.loading = false;
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ if (state.tableList.length > 0) {
|
|
|
+ showGuide.value = true;
|
|
|
+ }
|
|
|
+ }, 500);
|
|
|
+ } catch (e) {
|
|
|
+ state.loading = false;
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ // const getSubjectList = async () => {
|
|
|
+ // const res = await getSubject({ page: 1, rows: 9999 });
|
|
|
+ // state.subjectList = res.data.rows.map((item: any) => {
|
|
|
+ // return {
|
|
|
+ // value: item.id,
|
|
|
+ // label: item.name
|
|
|
+ // };
|
|
|
+ // });
|
|
|
+ // state.subjectList.unshift({ value: '', label: '全部声部' });
|
|
|
+ // };
|
|
|
+ const columns = () => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ title: '班级名称',
|
|
|
+ key: 'name'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '学年',
|
|
|
+ key: 'gradeYear'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '学级',
|
|
|
+ key: 'gradeLevel',
|
|
|
+ render(row: any) {
|
|
|
+ return row.gradeLevel ? `${row.gradeLevel}级` : '';
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '班级乐器',
|
|
|
+ key: 'instrumentName'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '学生人数',
|
|
|
+ key: 'preStudentNum'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '上次学习',
|
|
|
+ key: 'lastStudy',
|
|
|
+ width: '20%',
|
|
|
+ render(row: any) {
|
|
|
+ return row.lastStudy ? (
|
|
|
+ <TheTooltip
|
|
|
+ maxWidth={300}
|
|
|
+ showContentWidth={300}
|
|
|
+ content={row.lastStudy}
|
|
|
+ />
|
|
|
+ ) : (
|
|
|
+ '--'
|
|
|
+ );
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ key: 'id',
|
|
|
+
|
|
|
+ render(row: any, index: number) {
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <NSpace>
|
|
|
+ {index == 0 ? (
|
|
|
+ <div id="class-0">
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ text
|
|
|
+ onClick={() => {
|
|
|
+ router.push({
|
|
|
+ path: '/classDetail',
|
|
|
+ query: {
|
|
|
+ name: row.name,
|
|
|
+ id: row.id,
|
|
|
+ gradeYear: row.gradeYear,
|
|
|
+ upgradeFlag: row.upgradeFlag ? 1 : 0 // 是否为历史班
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }}>
|
|
|
+ 详情
|
|
|
+ </NButton>
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ text
|
|
|
+ onClick={() => {
|
|
|
+ router.push({
|
|
|
+ path: '/classDetail',
|
|
|
+ query: {
|
|
|
+ name: row.name,
|
|
|
+ id: row.id,
|
|
|
+ gradeYear: row.gradeYear,
|
|
|
+ upgradeFlag: row.upgradeFlag ? 1 : 0 // 是否为历史班
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }}>
|
|
|
+ 详情
|
|
|
+ </NButton>
|
|
|
+ )}
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ disabled={!row.upgradeFlag || row.instrumentId}
|
|
|
+ text
|
|
|
+ onClick={() => resetClassSubject(row)}>
|
|
|
+ 修改乐器
|
|
|
+ </NButton>
|
|
|
+ {index == 0 ? (
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ disabled={!row.upgradeFlag}
|
|
|
+ {...{ id: 'class-1' }}
|
|
|
+ text
|
|
|
+ onClick={() => {
|
|
|
+ startResetStudent(row);
|
|
|
+ }}>
|
|
|
+ 学生调整
|
|
|
+ </NButton>
|
|
|
+ ) : (
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ disabled={!row.upgradeFlag}
|
|
|
+ text
|
|
|
+ onClick={() => {
|
|
|
+ startResetStudent(row);
|
|
|
+ }}>
|
|
|
+ 学生调整
|
|
|
+ </NButton>
|
|
|
+ )}
|
|
|
+ {index == 0 ? (
|
|
|
+ <NButton
|
|
|
+ {...{ id: 'class-2' }}
|
|
|
+ disabled={!row.upgradeFlag}
|
|
|
+ type="primary"
|
|
|
+ text
|
|
|
+ onClick={() => classesBegin(row)}>
|
|
|
+ 开始上课
|
|
|
+ </NButton>
|
|
|
+ ) : (
|
|
|
+ <NButton
|
|
|
+ disabled={!row.upgradeFlag}
|
|
|
+ type="primary"
|
|
|
+ text
|
|
|
+ onClick={() => classesBegin(row)}>
|
|
|
+ 开始上课
|
|
|
+ </NButton>
|
|
|
+ )}
|
|
|
+
|
|
|
+ {/* <p
|
|
|
+ style={{ color: '#EA4132', cursor: 'pointer' }}
|
|
|
+ onClick={() => {
|
|
|
+ state.removeVisiable = true;
|
|
|
+ state.removeRow = row;
|
|
|
+ }}>
|
|
|
+ 删除
|
|
|
+ </p> */}
|
|
|
+ {!(row.preStudentNum > 0) ? (
|
|
|
+ <NButton
|
|
|
+ type="error"
|
|
|
+ color="#EA4132"
|
|
|
+ textColor="#EA4132"
|
|
|
+ text
|
|
|
+ onClick={() => {
|
|
|
+ state.removeVisiable = true;
|
|
|
+ state.removeRow = row;
|
|
|
+ }}>
|
|
|
+ 删除
|
|
|
+ </NButton>
|
|
|
+ ) : null}
|
|
|
+ {row.imGroupId ? null : (
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ disabled={!row.upgradeFlag}
|
|
|
+ text
|
|
|
+ onClick={() => {
|
|
|
+ createImgroup(row);
|
|
|
+ }}>
|
|
|
+ 创建群聊
|
|
|
+ </NButton>
|
|
|
+ )}
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ disabled={!row.upgradeFlag}
|
|
|
+ text
|
|
|
+ onClick={() => {
|
|
|
+ const { schoolInfos } = users.getUserInfo;
|
|
|
+ const schoolId =
|
|
|
+ schoolInfos.length > 0 ? schoolInfos[0].id : null;
|
|
|
+ if (schoolId) {
|
|
|
+ state.addStudentVisible = true;
|
|
|
+ state.activeRow = {
|
|
|
+ id: schoolId,
|
|
|
+ classId: row.id,
|
|
|
+ currentGradeNum: row.currentGradeNum,
|
|
|
+ currentClass: row.currentClass,
|
|
|
+ gradeYear: row.gradeYear
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }}>
|
|
|
+ 邀请学生
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ };
|
|
|
+
|
|
|
+ const startResetStudent = (row: any) => {
|
|
|
+ state.activeRow = row;
|
|
|
+ state.studentVisible = true;
|
|
|
+ };
|
|
|
+
|
|
|
+ const classesBegin = async (row: any) => {
|
|
|
+ try {
|
|
|
+ // 判断是否有声部
|
|
|
+ if (row.instrumentId) {
|
|
|
+ //
|
|
|
+ // 声部先取上次上课的声部,如果没有则取班级上面的声部
|
|
|
+ router.push({
|
|
|
+ path: '/prepare-lessons',
|
|
|
+ query: {
|
|
|
+ lastUseCoursewareId: row.lessonCoursewareId,
|
|
|
+ unit: row.lessonCoursewareKnowledgeDetailId,
|
|
|
+ instrumentId: row.instrumentId,
|
|
|
+ courseScheduleSubjectId: row.courseScheduleSubjectId,
|
|
|
+ preStudentNum: row.preStudentNum,
|
|
|
+ name: row.name, // 班级名称
|
|
|
+ classGroupId: row.id // 班级编号
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ state.showSubjectClass = true;
|
|
|
+ state.activeRow = row;
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const resetClassSubject = (row: any) => {
|
|
|
+ state.activeRow = row;
|
|
|
+ state.showResetClass = true;
|
|
|
+ };
|
|
|
+ const createImgroup = async (row: any) => {
|
|
|
+ state.activeRow = row;
|
|
|
+ state.groupVisiable = true;
|
|
|
+ };
|
|
|
+
|
|
|
+ const submitGroup = async () => {
|
|
|
+ console.log(state.activeRow, 'row');
|
|
|
+ state.groupBtnLoading = true;
|
|
|
+ try {
|
|
|
+ await addGroup({ classGroupId: state.activeRow.id });
|
|
|
+ message.success('创建成功');
|
|
|
+ state.groupVisiable = false;
|
|
|
+ await getList();
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
+ state.groupBtnLoading = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 获取学年
|
|
|
+ const getYearList = async () => {
|
|
|
+ try {
|
|
|
+ const { data } = await getGradeYearList();
|
|
|
+ const temp = data || [];
|
|
|
+ temp.forEach((i: any) => {
|
|
|
+ i.name = i.name + '学年';
|
|
|
+ });
|
|
|
+ // temp.unshift({
|
|
|
+ // id: '',
|
|
|
+ // name: '全部学年'
|
|
|
+ // });
|
|
|
+ state.popSelectYearList = temp || [];
|
|
|
+ if (temp.length > 1 && !state.searchForm.gradeYear) {
|
|
|
+ state.searchForm.gradeYear = temp[1].id;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+ // 获取学级
|
|
|
+ const getLevelList = async () => {
|
|
|
+ try {
|
|
|
+ const { data } = await getGradeLevelList();
|
|
|
+ const temp = data || [];
|
|
|
+ temp.forEach((i: any) => {
|
|
|
+ i.name = i.name + '级';
|
|
|
+ });
|
|
|
+ temp.unshift({
|
|
|
+ id: '',
|
|
|
+ name: '全部学级'
|
|
|
+ });
|
|
|
+ state.popSelectLevelList = temp || [];
|
|
|
+ if (temp.length > 0 && !state.searchForm.gradeLevel) {
|
|
|
+ state.searchForm.gradeLevel = temp[0].id;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ initCache({
|
|
|
+ current: state.searchForm,
|
|
|
+ callBack: (active: any) => {
|
|
|
+ state.searchForm = active;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ state.loading = true;
|
|
|
+ await catchData.getSubjects();
|
|
|
+
|
|
|
+ // getSubjectList();
|
|
|
+ await getYearList();
|
|
|
+ await getLevelList();
|
|
|
+ await getList();
|
|
|
+
|
|
|
+ state.loading = false;
|
|
|
+ });
|
|
|
+ return () => (
|
|
|
+ <div class={styles.listWrap}>
|
|
|
+ <div class={styles.searchList}>
|
|
|
+ <NForm label-placement="left" inline ref={formRef}>
|
|
|
+ <NFormItem>
|
|
|
+ <SearchInput
|
|
|
+ {...{ placeholder: '请输入班级名称' }}
|
|
|
+ class={styles.searchInput}
|
|
|
+ searchWord={state.searchForm.keyword}
|
|
|
+ onChangeValue={(val: string) =>
|
|
|
+ (state.searchForm.keyword = val)
|
|
|
+ }></SearchInput>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem>
|
|
|
+ <CSelect
|
|
|
+ {...({
|
|
|
+ options: state.popSelectYearList,
|
|
|
+ placeholder: '选择学年',
|
|
|
+ clearable: false,
|
|
|
+ inline: true,
|
|
|
+ labelField: 'name',
|
|
|
+ valueField: 'id'
|
|
|
+ } as any)}
|
|
|
+ v-model:value={state.searchForm.gradeYear}></CSelect>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem>
|
|
|
+ <CSelect
|
|
|
+ {...({
|
|
|
+ options: state.popSelectLevelList,
|
|
|
+ placeholder: '选择学级',
|
|
|
+ clearable: true,
|
|
|
+ inline: true,
|
|
|
+ labelField: 'name',
|
|
|
+ valueField: 'id'
|
|
|
+ } as any)}
|
|
|
+ v-model:value={state.searchForm.gradeLevel}></CSelect>
|
|
|
+ </NFormItem>
|
|
|
+
|
|
|
+ <NFormItem>
|
|
|
+ <CSelect
|
|
|
+ {...({
|
|
|
+ options: state.gradeNumList,
|
|
|
+ placeholder: '选择年级',
|
|
|
+ clearable: true,
|
|
|
+ inline: true
|
|
|
+ } as any)}
|
|
|
+ v-model:value={state.searchForm.currentGradeNum}></CSelect>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem>
|
|
|
+ <CSelect
|
|
|
+ {...({
|
|
|
+ options: classArray,
|
|
|
+ placeholder: '选择班级',
|
|
|
+ clearable: true,
|
|
|
+ inline: true
|
|
|
+ } as any)}
|
|
|
+ v-model:value={state.searchForm.currentClass}></CSelect>
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem>
|
|
|
+ {/* <CSelect
|
|
|
+ {...({
|
|
|
+ options: [
|
|
|
+ { value: '', label: '全部声部' },
|
|
|
+ ...catchData.getSubjectList
|
|
|
+ ],
|
|
|
+ placeholder: '选择乐器',
|
|
|
+ clearable: true,
|
|
|
+ inline: true
|
|
|
+ } as any)}
|
|
|
+ v-model:value={state.searchForm.instrumentId}></CSelect> */}
|
|
|
+ <NCascader
|
|
|
+ to="body"
|
|
|
+ placeholder="选择乐器"
|
|
|
+ options={[
|
|
|
+ { value: '', label: '全部乐器' },
|
|
|
+ ...catchData.getSubjectList
|
|
|
+ ]}
|
|
|
+ childrenField="instruments"
|
|
|
+ checkStrategy="child"
|
|
|
+ expandTrigger="click"
|
|
|
+ showPath={false}
|
|
|
+ v-model:value={state.searchForm.instrumentId}
|
|
|
+ onUpdate:value={(val: any, option: any, pathValues: any) => {
|
|
|
+ console.log(val, option, pathValues);
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem>
|
|
|
+ <NSpace justify="end">
|
|
|
+ <NButton type="primary" class="searchBtn" onClick={search}>
|
|
|
+ 搜索
|
|
|
+ </NButton>
|
|
|
+ <NButton
|
|
|
+ type="primary"
|
|
|
+ ghost
|
|
|
+ class="resetBtn"
|
|
|
+ onClick={onReset}>
|
|
|
+ 重置
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </NFormItem>
|
|
|
+ </NForm>
|
|
|
+ </div>
|
|
|
+ <NButton
|
|
|
+ class={styles.addBtn}
|
|
|
+ type="primary"
|
|
|
+ onClick={() => (state.showaddClass = true)}
|
|
|
+ v-slots={{
|
|
|
+ icon: () => (
|
|
|
+ <>
|
|
|
+ <NImage
|
|
|
+ class={styles.addBtnIcon}
|
|
|
+ previewDisabled
|
|
|
+ src={add}></NImage>
|
|
|
+ </>
|
|
|
+ )
|
|
|
+ }}>
|
|
|
+ 创建班级
|
|
|
+ </NButton>
|
|
|
+ <div class={styles.tableWrap}>
|
|
|
+ <NDataTable
|
|
|
+ v-slots={{
|
|
|
+ empty: () => <TheEmpty></TheEmpty>
|
|
|
+ }}
|
|
|
+ class={styles.classTable}
|
|
|
+ loading={state.loading}
|
|
|
+ columns={columns()}
|
|
|
+ data={state.tableList}></NDataTable>
|
|
|
+ <Pagination
|
|
|
+ v-model:page={state.pagination.page}
|
|
|
+ v-model:pageSize={state.pagination.rows}
|
|
|
+ v-model:pageTotal={state.pagination.pageTotal}
|
|
|
+ onList={getList}
|
|
|
+ sync
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <NModal
|
|
|
+ v-model:show={state.studentVisible}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle background', styles.studentVisible]}
|
|
|
+ title={'学生调整'}>
|
|
|
+ <RestStudentBox
|
|
|
+ activeRow={state.activeRow}
|
|
|
+ onClose={() => (state.studentVisible = false)}
|
|
|
+ onGetList={() => getList()}></RestStudentBox>
|
|
|
+ </NModal>
|
|
|
+ <NModal
|
|
|
+ v-model:show={state.showaddClass}
|
|
|
+ style={{ width: '500px' }}
|
|
|
+ display-directive="if"
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle background']}
|
|
|
+ title={'创建班级'}>
|
|
|
+ <CreateClass
|
|
|
+ gradeYearList={state.popSelectYearList}
|
|
|
+ gradeNumList={state.gradeNumList}
|
|
|
+ classArray={classArray}
|
|
|
+ onGetList={() => getList()}
|
|
|
+ onClose={() => (state.showaddClass = false)}
|
|
|
+ />
|
|
|
+ </NModal>
|
|
|
+ <NModal
|
|
|
+ v-model:show={state.showResetClass}
|
|
|
+ style={{ width: '500px' }}
|
|
|
+ display-directive="if"
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle background']}
|
|
|
+ title={'修改乐器'}>
|
|
|
+ <ResetSubject
|
|
|
+ activeRow={state.activeRow}
|
|
|
+ onGetList={() => getList()}
|
|
|
+ onClose={() => (state.showResetClass = false)}
|
|
|
+ />
|
|
|
+ </NModal>
|
|
|
+
|
|
|
+ <NModal
|
|
|
+ v-model:show={state.showSubjectClass}
|
|
|
+ style={{ width: '500px' }}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle background']}
|
|
|
+ title={'修改乐器'}>
|
|
|
+ {state.showSubjectClass ? (
|
|
|
+ <UpdateSubject
|
|
|
+ activeRow={state.activeRow}
|
|
|
+ onGetList={() => getList()}
|
|
|
+ onConfirm={(item: any) => {
|
|
|
+ //
|
|
|
+ router.push({
|
|
|
+ path: '/prepare-lessons',
|
|
|
+ query: {
|
|
|
+ ...item
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }}
|
|
|
+ onClose={() => (state.showSubjectClass = false)}
|
|
|
+ />
|
|
|
+ ) : null}
|
|
|
+ </NModal>
|
|
|
+
|
|
|
+ {/* 上课弹窗 */}
|
|
|
+ <PreviewWindow
|
|
|
+ v-model:show={state.previewModal}
|
|
|
+ type="attend"
|
|
|
+ params={state.previewParams}
|
|
|
+ />
|
|
|
+
|
|
|
+ <NModal
|
|
|
+ v-model:show={state.removeVisiable}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle', styles.removeVisiable]}
|
|
|
+ title={'删除班级'}>
|
|
|
+ <div class={styles.studentRemove}>
|
|
|
+ <p>
|
|
|
+ 确定要删除班级么?
|
|
|
+ <span>删除班级信息将会清空</span>。
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <NSpace class={styles.btnGroup} justify="center">
|
|
|
+ <NButton round type="primary" onClick={removeClass}>
|
|
|
+ 确定
|
|
|
+ </NButton>
|
|
|
+ <NButton round onClick={() => (state.removeVisiable = false)}>
|
|
|
+ 取消
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </div>
|
|
|
+ </NModal>
|
|
|
+
|
|
|
+ <NModal
|
|
|
+ v-model:show={state.groupVisiable}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle', styles.removeVisiable]}
|
|
|
+ title={'创建群聊'}>
|
|
|
+ <div class={styles.studentRemove}>
|
|
|
+ <p style={{ textAlign: 'center' }}>是否创建班级群聊</p>
|
|
|
+
|
|
|
+ <NSpace class={styles.btnGroup} justify="center">
|
|
|
+ <NButton
|
|
|
+ round
|
|
|
+ type="primary"
|
|
|
+ onClick={submitGroup}
|
|
|
+ loading={state.groupBtnLoading}
|
|
|
+ disabled={state.groupBtnLoading}>
|
|
|
+ 确定
|
|
|
+ </NButton>
|
|
|
+ <NButton round onClick={() => (state.groupVisiable = false)}>
|
|
|
+ 取消
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </div>
|
|
|
+ </NModal>
|
|
|
+ {showGuide.value ? <ClassGuide></ClassGuide> : null}
|
|
|
+
|
|
|
+ {state.addStudentVisible ? (
|
|
|
+ <div
|
|
|
+ v-model:show={state.addStudentVisible}
|
|
|
+ class={['n-modal-mask', styles.popBox]}>
|
|
|
+ <AddStudentModel
|
|
|
+ activeRow={state.activeRow}
|
|
|
+ onClose={() => {
|
|
|
+ state.addStudentVisible = false;
|
|
|
+ }}></AddStudentModel>
|
|
|
+ </div>
|
|
|
+ ) : null}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+});
|