123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678 |
- import { defineComponent, onMounted, reactive, ref } from 'vue';
- import styles from './index.module.less';
- import {
- NImage,
- NButton,
- NAvatarGroup,
- NForm,
- NFormItem,
- NSelect,
- NPopselect,
- NSpace,
- NModal,
- NCascader,
- useMessage,
- NSpin
- } from 'naive-ui';
- import headerD from './images/headerD.png';
- import defultHeade from '@/components/layout/images/teacherIcon.png';
- import blackBoardBg from './images/blackboard_bg.png';
- import teacherMan from './images/teacher_man.png';
- import teacherWoman from './images/teacher_woman.png';
- import iconLession from './images/icon-lession.png';
- import iconBook from './images/icon-book.png';
- import iconDetail from './images/icon-detail.png';
- import iconSubject from './images/icon-subject.png';
- import iconTo from './images/icon-to.png';
- import t1 from './images/t1.png';
- import t2 from './images/t2.png';
- import t3 from './images/t3.png';
- import { useRouter } from 'vue-router';
- import { useUserStore } from '/src/store/modules/users';
- import SelectClass from './modals/selectClass';
- import dayjs from 'dayjs';
- import { gradeToCN, weekToCN } from '/src/utils/contants';
- import { getCLassStudent, getCourseChapter } from '../classList/api';
- import { useCatchStore } from '/src/store/modules/catchData';
- import { useThrottleFn } from '@vueuse/core';
- import {
- bookVersionPage,
- courseScheduleStart,
- lessonCoursewarePage,
- queryCourseware
- } from '../prepare-lessons/api';
- import TheNoticeBar from '/src/components/TheNoticeBar';
- import TeachGroup from './modals/teachGroup';
- import { classGroupList, courseSchedulePage } from './api';
- import TheEmpty from '/src/components/TheEmpty';
- import { setTabsCaches } from '/src/hooks/use-async';
- import HomeGuide from '/src/custom-plugins/guide-page/home-guide';
- export const formatDateToDay = () => {
- const hours = dayjs().hour();
- if (hours < 12) {
- return '早上好'; //如果小时数小于12则输出“早上好!”
- } else if (hours > 12 && hours < 18) {
- return '下午好'; //如果小时数大于12并且小于18,输入“下午好!”
- } else {
- return '晚上好'; //如果上面两个条件都不符合,则输出“晚上好!”
- }
- };
- export default defineComponent({
- name: 'home-page',
- setup() {
- const catchStore = useCatchStore();
- const message = useMessage();
- const router = useRouter();
- const userStore = useUserStore();
- const forms = reactive({
- applyClassItem: {} as any, // 选择的内容
- applyStatus: false,
- useStatus: false,
- studentList: [] as any,
- bookVersionId: null,
- classGroupId: null,
- category: null,
- subjectId: null,
- musicTagList: [] as any,
- loading: false,
- list: [] as any,
- unit: null,
- unitList: [],
- subjectList: [] as any,
- gradeList: [] as any,
- classLoading: false,
- total: 0, // 上课数量
- classSelect: {
- currentGradeNum: null,
- currentClass: null,
- name: ''
- } as any,
- popSelectOptions: [] as any
- });
- const teachList = ref({} as any);
- // 学生列表
- // getStdentList
- // 应用选择年级班级
- const onApplyConfirm = async (item: any) => {
- try {
- //
- const { data } = await getCLassStudent({
- page: 1,
- rows: 999,
- classGroupId: item.classGroupId
- });
- const temps = data.rows || [];
- temps.forEach((row: any) => {
- forms.studentList.push({
- name: row.nickname,
- src: row.avatar
- });
- });
- forms.applyClassItem = item;
- } catch {
- //
- }
- };
- const onUseConfirm = (item: any) => {
- forms.classSelect = {
- currentGradeNum: item.currentGradeNum,
- currentClass: item.classGroupId,
- name: item.name
- };
- getCourseSchedulePage();
- };
- const throttledFn = useThrottleFn(() => getLessonCourseware(), 500);
- const getLessonCourseware = async () => {
- forms.category = null;
- forms.unit = null;
- forms.category = null;
- forms.loading = true;
- try {
- const { data } = await lessonCoursewarePage({
- bookVersionId: forms.bookVersionId,
- enableFlag: 1,
- page: 1,
- rows: 99,
- type: 'COURSEWARE'
- // currentGradeNum: forms.applyClassItem.currentGradeNum
- });
- forms.list = data.rows.map((item: any) => {
- return {
- label: item.name,
- value: item.id
- };
- });
- } catch {
- //
- }
- forms.loading = false;
- };
- const getunitList = async () => {
- forms.unit = null;
- try {
- if (forms.category) {
- const res = await getCourseChapter(forms.category);
- forms.unitList = res.data.lessonList.map((item: any) => {
- return { ...item, label: item.name, value: item.id };
- });
- } else {
- forms.unitList = [];
- }
- } catch (e) {
- console.log(e);
- }
- };
- const getVersion = async () => {
- forms.unit = null;
- try {
- const { data } = await bookVersionPage({
- page: 1,
- rows: 99,
- type: 'COURSEWARE'
- });
- const temp = data.rows || [];
- temp.forEach((item: any) => {
- forms.musicTagList.push({
- id: item.id,
- name: item.name
- });
- });
- } catch {
- //
- }
- };
- // 获取年级班级
- const getClassList = async () => {
- try {
- const { data } = await classGroupList({ removeZeroClass: true });
- const cList = data || [];
- const gradeList: any = [];
- const popSelectOptions: any = [];
- cList.forEach((item: any, index: number) => {
- if (index === 0) {
- const temp = item.classGroupList[0];
- forms.classSelect = {
- currentGradeNum: item.currentGradeNum,
- currentClass: temp.id,
- name: temp.name
- };
- }
- const classList: any = [];
- item.classGroupList.forEach((i: any) => {
- classList.push({
- label: i.currentClass + '班',
- value: i.id,
- lastStudy: i.lastStudy
- });
- popSelectOptions.push({
- label: i.name,
- value: i.id,
- currentGradeNum: item.currentGradeNum,
- lastStudy: i.lastStudy
- });
- });
- gradeList.push({
- label: gradeToCN[item.currentGradeNum],
- value: item.currentGradeNum,
- childrens: classList
- });
- });
- forms.popSelectOptions = popSelectOptions;
- forms.gradeList = gradeList;
- } catch {
- //
- }
- };
- const getCourseSchedulePage = async () => {
- forms.classLoading = true;
- try {
- const { data } = await courseSchedulePage({
- classGroupId: forms.classSelect.currentClass,
- page: 1,
- rows: 6,
- teacherId: userStore.getUserInfo.id
- });
- const result = data.rows || [];
- forms.total = data.total || 0;
- const dateTime: any = {};
- result.forEach((item: any) => {
- const tempTime = dayjs(item.classDate).format('MM-DD');
- if (!dateTime[tempTime]) {
- dateTime[tempTime] = [];
- }
- const lessonCourseware = item.lessonCoursewareJson
- ? JSON.parse(item.lessonCoursewareJson)
- : {};
- dateTime[tempTime].push({
- classGroup: forms.classSelect.name,
- teacherName: item.teacherName,
- conent:
- lessonCourseware.lessonCoursewareName +
- ' | ' +
- lessonCourseware.lessonCoursewareDetailName +
- ' | ' +
- lessonCourseware.lessonCoursewareKnowledgeDetailName,
- image: item.teacherAvatar
- });
- });
- teachList.value = dateTime;
- } catch (e: any) {
- //
- console.log(e);
- }
- forms.classLoading = false;
- };
- onMounted(async () => {
- await getClassList();
- await catchStore.getSubjects();
- await getCourseSchedulePage();
- forms.subjectList = catchStore.getSubjectList.map((item: any) => {
- return {
- label: item.name,
- value: item.id
- };
- });
- getVersion();
- });
- const formsRef = ref();
- const gotoClassPage = () => {
- formsRef.value.validate(async (error: any) => {
- if (error) return;
- try {
- const { data } = await queryCourseware({
- coursewareDetailKnowledgeId: forms.unit,
- subjectId: forms.subjectId,
- page: 1,
- rows: 99
- });
- if (data.rows && data.rows.length > 0) {
- await courseScheduleStart({
- lessonCoursewareKnowledgeDetailId: forms.unit,
- classGroupId: forms.applyClassItem?.classGroupId
- });
- const { href } = router.resolve({
- path: '/attend-class',
- query: {
- type: 'class',
- classGroupId: forms.applyClassItem?.classGroupId,
- subjectId: forms.subjectId,
- detailId: forms.unit
- }
- });
- window.open(href, +new Date() + '');
- } else {
- message.error('当前章节暂无课件,请重新选择');
- }
- } catch {
- //
- }
- });
- };
- return () => (
- <div class={styles.homeWrap}>
- <div class={styles.homeInfoLeft}>
- <div class={styles.homeBanner}>
- <div class={styles.welcomeInfo}>
- <div class={styles.userInfo}>
- <div class={styles.userName}>
- Hi,{userStore.getUserInfo?.nickname} {formatDateToDay()}~
- </div>
- <div class={styles.userTime}>
- {dayjs().format('MM月DD日')},{weekToCN[dayjs().day()]}
- </div>
- </div>
- <div class={styles.userTips}>
- <span>欢迎您使用酷乐秀课堂乐器数字化教学平台!</span>
- <NButton color="#40A1FF" round class={styles.guide_btn}>
- 功能引导
- <i></i>
- </NButton>
- </div>
- </div>
- {/* <div class={styles.centerInfo}>11111</div> */}
- <div class={styles.applyInfo}>
- {userStore.getUserInfo.gender === 1 ? (
- <img src={teacherMan} class={styles.teacherMan} />
- ) : (
- <img src={teacherWoman} class={styles.teacherWoman} />
- )}
- <div class={styles.blackborad}>
- <img src={blackBoardBg} class={styles.blackBoardBg} />
- </div>
- <div class={styles.applyContainer}>
- <div class={styles.applyTitle}>
- <span
- class={styles.className}
- onClick={() => (forms.applyStatus = true)}>
- {forms.applyClassItem.name || '请选择班级'}
- </span>
- <NAvatarGroup options={forms.studentList} max={5} />
- </div>
- <div class={styles.informations}>
- {forms.applyClassItem.lastStudy ? (
- <>
- 上次课程:
- <TheNoticeBar text={forms.applyClassItem.lastStudy} />
- </>
- ) : (
- ''
- )}
- </div>
- <NForm showLabel={false} ref={formsRef} model={forms}>
- <NFormItem
- path="bookVersionId"
- rule={[
- {
- required: true,
- message: '',
- trigger: ['blur', 'change']
- }
- ]}>
- <div class={styles.selectContainer}>
- <img src={iconLession} />
- <NSelect
- placeholder="请选择教材版本"
- disabled={
- forms.applyClassItem?.currentGradeNum ? false : true
- }
- clearable
- options={[...forms.musicTagList]}
- labelField="name"
- valueField="id"
- v-model:value={forms.bookVersionId}
- onUpdate:value={() => throttledFn()}
- />
- </div>
- </NFormItem>
- <NFormItem
- path="category"
- rule={[
- {
- required: true,
- message: '',
- trigger: ['blur', 'change']
- }
- ]}>
- <div class={styles.selectContainer}>
- <img src={iconBook} />
- <NSelect
- placeholder="请选择册别"
- options={[...forms.list]}
- clearable
- disabled={!forms.bookVersionId}
- v-model:value={forms.category}
- onUpdate:value={() => getunitList()}
- />
- </div>
- </NFormItem>
- <NFormItem
- path="unit"
- rule={[
- {
- required: true,
- message: '',
- trigger: ['blur', 'change']
- }
- ]}>
- <div class={styles.selectContainer}>
- <img src={iconDetail} />
- <NCascader
- disabled={!forms.category}
- {...({
- options: [...forms.unitList],
- placeholder: '选择章节',
- clearable: true
- } as any)}
- childrenField="knowledgeList"
- valueField="id"
- labelField="name"
- v-model:value={forms.unit}
- checkStrategy="child"
- expandTrigger="hover"
- />
- </div>
- </NFormItem>
- <NFormItem
- path="subjectId"
- rule={[
- {
- required: true,
- message: '',
- trigger: ['blur', 'change'],
- type: 'number'
- }
- ]}>
- <div class={styles.selectContainer}>
- <img src={iconSubject} />
- <NSelect
- {...({
- options: [...forms.subjectList],
- placeholder: '选择乐器',
- clearable: true
- } as any)}
- v-model:value={forms.subjectId}
- />
- </div>
- </NFormItem>
- <NSpace class={styles.btnGroup} justify="center">
- <NButton
- round
- block
- class={styles.startClass}
- color="#FF6E4C"
- onClick={gotoClassPage}>
- 开始上课
- </NButton>
- <NButton
- round
- block
- class={styles.beforClass}
- color="#5B64D1"
- onClick={() => router.push('/prepare-lessons')}>
- 去备课
- </NButton>
- </NSpace>
- </NForm>
- </div>
- </div>
- </div>
- <div class={styles.toolContainer}>
- <div class={styles.toolTips}>
- <div class={styles.toolTitle}>工具箱</div>
- <div class={styles.toolContent}>
- 这里是常用的教学辅助工具,可帮助学生集中注意力、提高演奏效率,使演奏更完整平稳。让您在课堂上完成更好的教学。
- </div>
- </div>
- <img src={iconTo} class={styles.iconTo} />
- <div class={styles.toolFunction}>
- <div class={[styles.toolItem, styles.item1]}>
- <img src={t1} />
- <p class={styles.toolMemo}>提升效率,练习好节奏</p>
- <NButton class={styles.btn1}>节拍器</NButton>
- </div>
- <div class={[styles.toolItem, styles.item2]}>
- <img src={t2} />
- <p class={styles.toolMemo}>精准调音,一劳永逸</p>
- <NButton class={styles.btn2}>调音器</NButton>
- </div>
- <div class={[styles.toolItem, styles.item3]}>
- <img src={t3} />
- <p class={styles.toolMemo}>创造时间,集中注意力</p>
- <NButton class={styles.btn3}>计时器</NButton>
- </div>
- </div>
- </div>
- </div>
- <div class={styles.homeInfoRight}>
- <div class={styles.rightTeachingWrap}>
- <div class={styles.headerContainer}>
- <div
- class={styles.HeaderWrap}
- onClick={() => router.push('/setting')}>
- <NImage
- previewDisabled
- class={styles.headerD}
- src={headerD}></NImage>
- <NImage
- previewDisabled
- class={styles.defultHeade}
- src={userStore.getUserInfo.avatar || defultHeade}></NImage>
- </div>
- </div>
- <div class={styles.headerInfo}>
- <p class={styles.headerTitle}>{userStore.getUserInfo.nickname}</p>
- {userStore.getUserInfo.schoolInfos &&
- userStore.getUserInfo.schoolInfos.length > 0 && (
- <p class={styles.headerSubTitle}>
- {userStore.getUserInfo.schoolInfos[0].name}
- {/* | 音乐老师 */}
- </p>
- )}
- </div>
- <div class={styles.rightTeachingWrapTitle}>
- <h3 class={styles.rightTitle}>
- <div class={styles.titleDot}></div>上课记录
- </h3>
- {forms.classSelect.name && (
- <NPopselect
- v-model:value={forms.classSelect.currentClass}
- options={forms.popSelectOptions}
- trigger="click"
- onUpdate:value={(val: any) => {
- console.log(val, '1212');
- forms.popSelectOptions.forEach((item: any) => {
- if (item.value === val) {
- forms.classSelect = {
- currentGradeNum: item.currentGradeNum,
- currentClass: item.value,
- name: item.label
- };
- getCourseSchedulePage();
- }
- });
- }}>
- <div
- class={styles.lookMore}
- // onClick={() => (forms.useStatus = true)}
- >
- {forms.classSelect.name}
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
- <path
- d="M6 9l6 6l6-6"
- fill="none"
- stroke="currentColor"
- stroke-width="2"
- stroke-linecap="round"
- stroke-linejoin="round"></path>
- </svg>
- </div>
- </NPopselect>
- )}
- </div>
- <NSpin show={forms.classLoading} style={{ minHeight: '40vh' }}>
- {Object.keys(teachList.value).length > 0 && (
- <div class={styles.teachListWrap}>
- {Object.keys(teachList.value).map(key => (
- <TeachGroup
- list={teachList.value[key]}
- keys={key}></TeachGroup>
- ))}
- {forms.total > 6 && (
- <div class={styles.teachListWrapWall}>
- <span
- onClick={() => {
- setTabsCaches('attendclass', 'tabName', {
- path: '/classDetail'
- });
- router.push({
- path: '/classDetail',
- query: {
- name: forms.classSelect.name,
- id: forms.classSelect.currentClass
- }
- });
- }}>
- 查看全部
- </span>
- </div>
- )}
- </div>
- )}
- {Object.keys(teachList.value).length <= 0 &&
- !forms.classLoading && <TheEmpty />}
- </NSpin>
- </div>
- </div>
- {/* 添加自定义教材 */}
- <NModal
- v-model:show={forms.applyStatus}
- preset="card"
- showIcon={false}
- class={['modalTitle background', styles.assignHomework]}
- title={'选择班级'}
- blockScroll={false}>
- <SelectClass
- useDetail={{
- currentGradeNum: forms.applyClassItem.currentGradeNum,
- classGroupId: forms.applyClassItem.classGroupId
- }}
- gradeList={forms.gradeList}
- onConfirm={(item: any) => onApplyConfirm(item)}
- onClose={() => (forms.applyStatus = false)}
- />
- </NModal>
- <NModal
- v-model:show={forms.useStatus}
- preset="card"
- showIcon={false}
- class={['modalTitle background', styles.assignHomework]}
- title={'选择班级'}
- blockScroll={false}>
- <SelectClass
- useDetail={{
- currentGradeNum: forms.classSelect.currentGradeNum,
- classGroupId: forms.classSelect.currentClass
- }}
- gradeList={forms.gradeList}
- onConfirm={(item: any) => onUseConfirm(item)}
- onClose={() => (forms.useStatus = false)}
- />
- </NModal>
- <HomeGuide></HomeGuide>
- </div>
- );
- }
- });
|