|
@@ -18,7 +18,14 @@ import {
|
|
|
NTabPane,
|
|
|
NTabs,
|
|
|
useMessage,
|
|
|
- NPopselect
|
|
|
+ NPopselect,
|
|
|
+ NPopover,
|
|
|
+ NForm,
|
|
|
+ NFormItem,
|
|
|
+ NInput,
|
|
|
+ NSpace,
|
|
|
+ NCascader,
|
|
|
+ NSwitch
|
|
|
} from 'naive-ui';
|
|
|
import { usePrepareStore } from '/src/store/modules/prepareLessons';
|
|
|
import add from '@/views/studentList/images/add.png';
|
|
@@ -43,6 +50,15 @@ import PreviewWindow from '/src/views/preview-window';
|
|
|
import Related from './related';
|
|
|
import Train from '../train';
|
|
|
import ResourceMain from '../../resource-main';
|
|
|
+import { useCatchStore } from '/src/store/modules/catchData';
|
|
|
+import deepClone from '/src/helpers/deep-clone';
|
|
|
+import {
|
|
|
+ api_teacherChapterLessonCoursewareAdd,
|
|
|
+ api_coursewareToTeacherCourseware,
|
|
|
+ api_updateCoursewareInfo
|
|
|
+} from '../../../api';
|
|
|
+import { vaildPPTUrl } from '/src/utils/urlUtils';
|
|
|
+import { useUserStore } from '/src/store/modules/users';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'courseware-presets',
|
|
@@ -103,7 +119,7 @@ export default defineComponent({
|
|
|
workVisiable: false,
|
|
|
wikiCategoryIdChild: null,
|
|
|
instrumentErrorVisiable: false,
|
|
|
- instrumentErrorContent: ""
|
|
|
+ instrumentErrorContent: ''
|
|
|
});
|
|
|
|
|
|
const getCoursewareList = async () => {
|
|
@@ -137,7 +153,11 @@ export default defineComponent({
|
|
|
name: item.name,
|
|
|
coverImg: firstItem && firstItem[0]?.bizInfo.coverImg,
|
|
|
type: firstItem && firstItem[0]?.bizInfo.type,
|
|
|
- isNotWork: item.lessonPreTrainingNum <= 0 ? true : false // 是否布置作业
|
|
|
+ isNotWork: item.lessonPreTrainingNum <= 0 ? true : false, // 是否布置作业
|
|
|
+ coursewareType: item.coursewareType,
|
|
|
+ instrumentIds: item.instrumentIds,
|
|
|
+ pptId: firstItem && firstItem[0]?.id,
|
|
|
+ teacherSaveFlag: item.teacherSaveFlag
|
|
|
});
|
|
|
});
|
|
|
forms.tableList = tempList;
|
|
@@ -422,43 +442,37 @@ export default defineComponent({
|
|
|
};
|
|
|
|
|
|
/** 上课前检测声部 */
|
|
|
- const onClassCheckInstrument = async (item: any,
|
|
|
+ const onClassCheckInstrument = async (
|
|
|
+ item: any,
|
|
|
classGroupId: any,
|
|
|
- instrumentId?: any) => {
|
|
|
-
|
|
|
+ instrumentId?: any
|
|
|
+ ) => {
|
|
|
try {
|
|
|
- if(classGroupId) {
|
|
|
- const {data} = await api_courseScheduleCheck({
|
|
|
+ if (classGroupId) {
|
|
|
+ const { data } = await api_courseScheduleCheck({
|
|
|
classGroupId,
|
|
|
chapterLessonCoursewareId: item.id
|
|
|
- })
|
|
|
+ });
|
|
|
forms.attendClassItem = item;
|
|
|
forms.attendClassId = classGroupId;
|
|
|
- if(!data.chapterLessonCoursewareFlag) {
|
|
|
+ if (!data.chapterLessonCoursewareFlag) {
|
|
|
forms.instrumentErrorVisiable = true;
|
|
|
- forms.instrumentErrorContent = '课件支持的乐器与班级不符,是否继续使用该课件上课?'
|
|
|
- } else if(!data.materialFlag) {
|
|
|
+ forms.instrumentErrorContent =
|
|
|
+ '课件支持的乐器与班级不符,是否继续使用该课件上课?';
|
|
|
+ } else if (!data.materialFlag) {
|
|
|
forms.instrumentErrorVisiable = true;
|
|
|
- forms.instrumentErrorContent = '课件中含有不符合班级乐器的资源,是否继续使用该课件上课?'
|
|
|
+ forms.instrumentErrorContent =
|
|
|
+ '课件中含有不符合班级乐器的资源,是否继续使用该课件上课?';
|
|
|
} else {
|
|
|
- onStartClass(
|
|
|
- item,
|
|
|
- classGroupId,
|
|
|
- instrumentId
|
|
|
- );
|
|
|
+ onStartClass(item, classGroupId, instrumentId);
|
|
|
}
|
|
|
} else {
|
|
|
- onStartClass(
|
|
|
- item,
|
|
|
- classGroupId,
|
|
|
- instrumentId
|
|
|
- );
|
|
|
+ onStartClass(item, classGroupId, instrumentId);
|
|
|
}
|
|
|
-
|
|
|
} catch {
|
|
|
- //
|
|
|
+ //
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
const selectChildObj = (item: any) => {
|
|
|
const obj: any = {};
|
|
@@ -487,6 +501,151 @@ export default defineComponent({
|
|
|
});
|
|
|
return instrumentId;
|
|
|
});
|
|
|
+ /* ppt课件 */
|
|
|
+ const userStore = useUserStore();
|
|
|
+ const pptCourseware = reactive({
|
|
|
+ pptCoursewareShow: false,
|
|
|
+ id: '',
|
|
|
+ name: '',
|
|
|
+ subjects: [],
|
|
|
+ openFlagEnable: true,
|
|
|
+ openFlag: false
|
|
|
+ });
|
|
|
+ const pptFormsRef = ref();
|
|
|
+ const subjectList = ref<any[]>([]);
|
|
|
+ const updateSubjectList = (ids?: any[]) => {
|
|
|
+ // 获取适用乐器编号 ,修改的乐器编号,集合
|
|
|
+ ids = ids || [];
|
|
|
+ const courseIds: any = [];
|
|
|
+ prepareStore.getInstrumentList.forEach((item: any) => {
|
|
|
+ if (Array.isArray(item.instruments)) {
|
|
|
+ item.instruments.forEach((child: any) => {
|
|
|
+ courseIds.push(child.id);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ const allIds = [...new Set([...courseIds, ...ids])];
|
|
|
+
|
|
|
+ const tempList: any = [];
|
|
|
+ useCatchStore().getSubjectList.forEach((item: any) => {
|
|
|
+ const temp = deepClone(item);
|
|
|
+ temp.enableFlag = false;
|
|
|
+ if (Array.isArray(temp.instruments)) {
|
|
|
+ temp.instruments.forEach((child: any) => {
|
|
|
+ child.enableFlag = false;
|
|
|
+ if (allIds.includes(child.id)) {
|
|
|
+ child.enableFlag = true;
|
|
|
+ temp.enableFlag = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ tempList.push(temp);
|
|
|
+ });
|
|
|
+ const tempSubjects: any[] = [];
|
|
|
+ tempList.forEach((subject: any) => {
|
|
|
+ if (subject.enableFlag) {
|
|
|
+ const { instruments, ...r } = subject;
|
|
|
+
|
|
|
+ if (instruments && instruments.length > 0) {
|
|
|
+ const tempChild: any[] = [];
|
|
|
+ instruments?.forEach((instrument: any) => {
|
|
|
+ if (instrument.enableFlag) {
|
|
|
+ tempChild.push(instrument);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (tempChild.length > 0)
|
|
|
+ tempSubjects.push({ ...r, instruments: tempChild });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ subjectList.value = tempSubjects;
|
|
|
+ };
|
|
|
+ const chioseAll = (list: any) => {
|
|
|
+ // 全选
|
|
|
+ const ids = [] as any;
|
|
|
+ list.map((item: any) => {
|
|
|
+ if (Array.isArray(item.instruments)) {
|
|
|
+ item.instruments.forEach((c: any) => {
|
|
|
+ ids.push(c.value);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }) as any;
|
|
|
+ pptCourseware.subjects = ids;
|
|
|
+ };
|
|
|
+ function handlePptConfirm() {
|
|
|
+ pptFormsRef.value?.validate(async (err: any) => {
|
|
|
+ if (err) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const { id, name, subjects, openFlag, openFlagEnable } = pptCourseware;
|
|
|
+ if (id) {
|
|
|
+ const params = {
|
|
|
+ id,
|
|
|
+ name,
|
|
|
+ instrumentIds: subjects.join(','),
|
|
|
+ openFlag,
|
|
|
+ autoPlay: false,
|
|
|
+ openFlagEnable
|
|
|
+ };
|
|
|
+ api_updateCoursewareInfo(params).then(res => {
|
|
|
+ if (res.code === 200) {
|
|
|
+ pptCourseware.pptCoursewareShow = false;
|
|
|
+ getCoursewareList();
|
|
|
+ eventGlobal.emit('openCoursewareChanged');
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ const params = {
|
|
|
+ name,
|
|
|
+ instrumentIds: subjects.join(','),
|
|
|
+ openFlag,
|
|
|
+ autoPlay: false,
|
|
|
+ coursewareDetailKnowledgeId: prepareStore.getSelectKey,
|
|
|
+ coursewareType: 'PPT'
|
|
|
+ };
|
|
|
+ api_teacherChapterLessonCoursewareAdd(params).then(res => {
|
|
|
+ if (res.code === 200) {
|
|
|
+ pptCourseware.pptCoursewareShow = false;
|
|
|
+ getCoursewareList();
|
|
|
+ eventGlobal.emit('openCoursewareChanged');
|
|
|
+ const { teacherSaveFlag, id, chapterKnowledgeList } = res.data;
|
|
|
+ handleRouterPPT({
|
|
|
+ teacherSaveFlag,
|
|
|
+ id,
|
|
|
+ pptId:
|
|
|
+ chapterKnowledgeList[0]?.chapterKnowledgeMaterialList[0]?.id
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ function handlePptEdit(item: Record<string, any>) {
|
|
|
+ updateSubjectList();
|
|
|
+ pptCourseware.id = item.id;
|
|
|
+ pptCourseware.name = item.name;
|
|
|
+ pptCourseware.subjects = item.instrumentIds
|
|
|
+ ? item.instrumentIds.split(',')
|
|
|
+ : [];
|
|
|
+ pptCourseware.openFlag = item.openFlag;
|
|
|
+ pptCourseware.openFlagEnable = item.openFlagEnable;
|
|
|
+ pptCourseware.pptCoursewareShow = true;
|
|
|
+ }
|
|
|
+ async function handleRouterPPT(item: Record<string, any>) {
|
|
|
+ // 当teacherSaveFlag为false时候,需要把平台数据转为老师自己的课件
|
|
|
+ if (!item.teacherSaveFlag) {
|
|
|
+ await api_coursewareToTeacherCourseware(item.id);
|
|
|
+ item.teacherSaveFlag = true;
|
|
|
+ }
|
|
|
+ const href = `${vaildPPTUrl()}/#/pptEditor?id=${
|
|
|
+ item.pptId
|
|
|
+ }&Authorization=${userStore.getToken}`;
|
|
|
+ window.open(href);
|
|
|
+ }
|
|
|
+ onMounted(async () => {
|
|
|
+ await useCatchStore().getSubjects();
|
|
|
+ });
|
|
|
return () => (
|
|
|
<div
|
|
|
class={[
|
|
@@ -527,23 +686,57 @@ export default defineComponent({
|
|
|
}}
|
|
|
v-slots={{
|
|
|
suffix: () => (
|
|
|
- <NButton
|
|
|
- class={styles.addBtn}
|
|
|
- type="primary"
|
|
|
- bordered={false}
|
|
|
- onClick={() => {
|
|
|
- eventGlobal.emit('teacher-slideshow', true);
|
|
|
- emit('change', {
|
|
|
- status: true,
|
|
|
- type: 'create'
|
|
|
- });
|
|
|
- }}>
|
|
|
- <NImage
|
|
|
- class={styles.addBtnIcon}
|
|
|
- previewDisabled
|
|
|
- src={add}></NImage>
|
|
|
- 创建课件
|
|
|
- </NButton>
|
|
|
+ <NPopover
|
|
|
+ placement="bottom"
|
|
|
+ trigger="hover"
|
|
|
+ showArrow={false}
|
|
|
+ to={false}
|
|
|
+ duration={50}>
|
|
|
+ {{
|
|
|
+ trigger: () => (
|
|
|
+ <NButton
|
|
|
+ class={styles.addBtn}
|
|
|
+ type="primary"
|
|
|
+ bordered={false}>
|
|
|
+ <NImage
|
|
|
+ class={styles.addBtnIcon}
|
|
|
+ previewDisabled
|
|
|
+ src={add}></NImage>
|
|
|
+ 创建课件
|
|
|
+ </NButton>
|
|
|
+ ),
|
|
|
+ default: () => (
|
|
|
+ <div>
|
|
|
+ <div
|
|
|
+ class={styles.popoverItem}
|
|
|
+ onClick={() => {
|
|
|
+ eventGlobal.emit('teacher-slideshow', true);
|
|
|
+ emit('change', {
|
|
|
+ status: true,
|
|
|
+ type: 'create'
|
|
|
+ });
|
|
|
+ }}>
|
|
|
+ <span>数字化课件</span>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class={styles.popoverItem}
|
|
|
+ onClick={() => {
|
|
|
+ updateSubjectList();
|
|
|
+ Object.assign(pptCourseware, {
|
|
|
+ pptCoursewareShow: true,
|
|
|
+ id: '',
|
|
|
+ name: '',
|
|
|
+ subjects: [],
|
|
|
+ openFlagEnable: true,
|
|
|
+ openFlag: false
|
|
|
+ });
|
|
|
+ }}>
|
|
|
+ <span>PPT</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </NPopover>
|
|
|
)
|
|
|
}}>
|
|
|
{[
|
|
@@ -617,14 +810,23 @@ export default defineComponent({
|
|
|
// forms.editTitle = item.name;
|
|
|
// forms.editTitleVisiable = true;
|
|
|
// }}
|
|
|
- onEdit={() => {
|
|
|
+ onEdit={type => {
|
|
|
//
|
|
|
- eventGlobal.emit('teacher-slideshow', true);
|
|
|
- emit('change', {
|
|
|
- status: true,
|
|
|
- type: 'update',
|
|
|
- groupItem: { id: item.id }
|
|
|
- });
|
|
|
+ if (item.coursewareType === 'PPT') {
|
|
|
+ if (type === 'PPT') {
|
|
|
+ // 进入 ppt 编辑页面
|
|
|
+ handleRouterPPT(item);
|
|
|
+ } else {
|
|
|
+ handlePptEdit(item);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ eventGlobal.emit('teacher-slideshow', true);
|
|
|
+ emit('change', {
|
|
|
+ status: true,
|
|
|
+ type: 'update',
|
|
|
+ groupItem: { id: item.id }
|
|
|
+ });
|
|
|
+ }
|
|
|
}}
|
|
|
onStartClass={() =>
|
|
|
onClassCheckInstrument(item, forms.classGroupId)
|
|
@@ -798,14 +1000,10 @@ export default defineComponent({
|
|
|
contentDirection="left"
|
|
|
onClose={() => {
|
|
|
forms.instrumentErrorVisiable = false;
|
|
|
-
|
|
|
}}
|
|
|
onConfirm={() => {
|
|
|
- //
|
|
|
- onStartClass(
|
|
|
- forms.attendClassItem,
|
|
|
- forms.attendClassId
|
|
|
- );
|
|
|
+ //
|
|
|
+ onStartClass(forms.attendClassItem, forms.attendClassId);
|
|
|
}}
|
|
|
/>
|
|
|
</NModal>
|
|
@@ -885,6 +1083,124 @@ export default defineComponent({
|
|
|
</div>
|
|
|
</div>
|
|
|
</NModal>
|
|
|
+ {/* 新建ppt课件 */}
|
|
|
+ <NModal
|
|
|
+ maskClosable={modalClickMask}
|
|
|
+ v-model:show={pptCourseware.pptCoursewareShow}
|
|
|
+ preset="card"
|
|
|
+ class={['modalTitle', styles.pptCoursewareModal]}
|
|
|
+ title={'课件设置'}>
|
|
|
+ <NForm
|
|
|
+ ref={pptFormsRef}
|
|
|
+ model={pptCourseware}
|
|
|
+ labelAlign="right"
|
|
|
+ labelPlacement="left">
|
|
|
+ <NFormItem
|
|
|
+ label="课件名称"
|
|
|
+ path="name"
|
|
|
+ rule={[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请输入课件名称',
|
|
|
+ trigger: ['blur', 'change']
|
|
|
+ }
|
|
|
+ ]}>
|
|
|
+ <NInput
|
|
|
+ placeholder="请输入课件名称"
|
|
|
+ v-model:value={pptCourseware.name}
|
|
|
+ maxlength={20}
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </NFormItem>
|
|
|
+ <NFormItem
|
|
|
+ label="适用乐器"
|
|
|
+ path="subjects"
|
|
|
+ rule={[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请选择适用乐器',
|
|
|
+ trigger: ['blur', 'change'],
|
|
|
+ type: 'array'
|
|
|
+ }
|
|
|
+ ]}>
|
|
|
+ <NCascader
|
|
|
+ placeholder="请选择乐器(可多选)"
|
|
|
+ class={styles.btnSubjectList}
|
|
|
+ options={subjectList.value}
|
|
|
+ checkStrategy="child"
|
|
|
+ showPath={false}
|
|
|
+ childrenField="instruments"
|
|
|
+ expandTrigger="hover"
|
|
|
+ labelField="name"
|
|
|
+ valueField="id"
|
|
|
+ clearable
|
|
|
+ filterable
|
|
|
+ multiple
|
|
|
+ maxTagCount={1}
|
|
|
+ v-model:value={pptCourseware.subjects}
|
|
|
+ v-slots={{
|
|
|
+ action: () => (
|
|
|
+ <>
|
|
|
+ <NButton
|
|
|
+ text
|
|
|
+ style=" --n-width: 100% "
|
|
|
+ size="small"
|
|
|
+ onClick={() => chioseAll(subjectList.value)}>
|
|
|
+ 全选
|
|
|
+ </NButton>
|
|
|
+ </>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </NFormItem>
|
|
|
+ <div class={styles.btnItem}>
|
|
|
+ <span class={styles.btnTitle}>
|
|
|
+ 公开课件
|
|
|
+ <NTooltip style={{ maxWidth: '200px' }} showArrow={false}>
|
|
|
+ {{
|
|
|
+ trigger: () => <i class={styles.iconQuestion}></i>,
|
|
|
+ default: () => '公开课件后,其它老师可以使用该课件上课'
|
|
|
+ }}
|
|
|
+ </NTooltip>
|
|
|
+ </span>
|
|
|
+ {!pptCourseware.openFlagEnable ? (
|
|
|
+ <NTooltip style={{ maxWidth: '200px' }} showArrow={false}>
|
|
|
+ {{
|
|
|
+ trigger: () => (
|
|
|
+ <NSwitch
|
|
|
+ size="large"
|
|
|
+ v-model:value={pptCourseware.openFlag}
|
|
|
+ disabled={!pptCourseware.openFlagEnable}
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ default: () =>
|
|
|
+ '为尊重课件原作者,在“相关课件”中添加的课件不支持公开'
|
|
|
+ }}
|
|
|
+ </NTooltip>
|
|
|
+ ) : (
|
|
|
+ <NSwitch
|
|
|
+ size="large"
|
|
|
+ v-model:value={pptCourseware.openFlag}
|
|
|
+ disabled={!pptCourseware.openFlagEnable}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ <NSpace class={styles.updateBtnGroup}>
|
|
|
+ <NButton
|
|
|
+ strong
|
|
|
+ type="default"
|
|
|
+ round
|
|
|
+ onClick={() => {
|
|
|
+ pptCourseware.pptCoursewareShow = false;
|
|
|
+ }}>
|
|
|
+ 取消
|
|
|
+ </NButton>
|
|
|
+ <NButton strong type="primary" round onClick={handlePptConfirm}>
|
|
|
+ 确认
|
|
|
+ </NButton>
|
|
|
+ </NSpace>
|
|
|
+ </NForm>
|
|
|
+ </NModal>
|
|
|
</div>
|
|
|
);
|
|
|
}
|