|
@@ -1,61 +1,90 @@
|
|
|
import MHeader from '@/components/m-header';
|
|
|
import MSticky from '@/components/m-sticky';
|
|
|
-import { Cell, CellGroup, DropdownItem, DropdownMenu, Icon, Image } from 'vant';
|
|
|
+import {
|
|
|
+ ActionBar,
|
|
|
+ Cell,
|
|
|
+ CellGroup,
|
|
|
+ DropdownItem,
|
|
|
+ DropdownMenu,
|
|
|
+ Icon,
|
|
|
+ Image,
|
|
|
+ List
|
|
|
+} from 'vant';
|
|
|
import { defineComponent, onMounted, reactive, ref } from 'vue';
|
|
|
import styles from './index.module.less';
|
|
|
import DropDownModal from './drop-down-modal';
|
|
|
import iconSetting from '@/common/images/icon-setting.png';
|
|
|
import iconMusic from '@/common/images/icon-music.png';
|
|
|
import iconTeacher from '@/common/images/icon-teacher-default.png';
|
|
|
-// import iconEmpty from './images/icon-empty.png';
|
|
|
+import iconEmpty from './images/icon-empty.png';
|
|
|
import MImagePreview from '@/components/m-image-preview';
|
|
|
import SkeletonModal from './skeleton-modal';
|
|
|
import MEmpty from '@/components/m-empty';
|
|
|
import MFullRefresh from '@/components/m-full-refresh';
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
+import request from '@/helpers/request';
|
|
|
+import KActionSheet from '@/component-ui/k-action-sheet';
|
|
|
+import dayjs from 'dayjs';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'site-management',
|
|
|
setup() {
|
|
|
+ const router = useRouter();
|
|
|
const dropDownItemRef = ref();
|
|
|
const dropDownItemRef1 = ref();
|
|
|
const forms = reactive({
|
|
|
- loading: true,
|
|
|
- refreshing: false,
|
|
|
- titleTimeValue: '',
|
|
|
+ isClick: false,
|
|
|
+ titleTimeValue: [],
|
|
|
titleOrchestraValue: '',
|
|
|
- timeColumns: [
|
|
|
- { text: '全部时间', value: '' },
|
|
|
- { text: '杭州', value: 'Hangzhou' },
|
|
|
- { text: '宁波', value: 'Ningbo' },
|
|
|
- { text: '温州', value: 'Wenzhou' },
|
|
|
- { text: '绍兴', value: 'Shaoxing' },
|
|
|
- { text: '湖州', value: 'Huzhou' }
|
|
|
- ],
|
|
|
+ listState: {
|
|
|
+ dataShow: true, // 判断是否有数据
|
|
|
+ loading: true,
|
|
|
+ finished: false,
|
|
|
+ refreshing: false
|
|
|
+ },
|
|
|
+ params: {
|
|
|
+ startTime: null,
|
|
|
+ endTime: null,
|
|
|
+ musicGroupId: null,
|
|
|
+ page: 1,
|
|
|
+ rows: 20
|
|
|
+ },
|
|
|
+ timeColumns: [],
|
|
|
+ orchestraColumns: [{ text: '全部乐团', value: '' }], //
|
|
|
imageShow: false,
|
|
|
startPosition: 0,
|
|
|
- imagePreview: [
|
|
|
- 'https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/d7108568f10844c1b25db8cebf971caa_mergeImage.png',
|
|
|
- 'https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/d7d77ad6169c4b688cea7183dfabbae2_mergeImage.png',
|
|
|
- 'https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/5714fa27180d4115b5bcae6cc2a9ea4f_mergeImage.png'
|
|
|
- ] as string[]
|
|
|
+ imagePreview: [] as string[],
|
|
|
+ pointCourseStatus: false, // 红点
|
|
|
+ list: []
|
|
|
});
|
|
|
|
|
|
+ const getInitTimer = (week = 4) => {
|
|
|
+ const tempTimer: any = [];
|
|
|
+ for (let i = 0; i < week; i++) {
|
|
|
+ const startDay = dayjs()
|
|
|
+ .subtract(i, 'week')
|
|
|
+ .startOf('week')
|
|
|
+ .add(1, 'day');
|
|
|
+ const endDay = dayjs().subtract(i, 'week').endOf('week').add(1, 'day');
|
|
|
+ tempTimer.push({
|
|
|
+ text:
|
|
|
+ startDay.format('YYYY/MM/DD') + ' - ' + endDay.format('YYYY/MM/DD'),
|
|
|
+ value: [startDay.format('YYYY-MM-DD'), endDay.format('YYYY-MM-DD')]
|
|
|
+ });
|
|
|
+ }
|
|
|
+ console.log(tempTimer, 'tempTimer');
|
|
|
+ forms.timeColumns = tempTimer;
|
|
|
+ forms.titleTimeValue = tempTimer[0].value;
|
|
|
+ };
|
|
|
+
|
|
|
const onDropDownClose = (item: any) => {
|
|
|
item.value && item.value.toggle();
|
|
|
};
|
|
|
|
|
|
const formatName = (type: string) => {
|
|
|
- if (type === 'time') {
|
|
|
- let name = '';
|
|
|
- forms.timeColumns.forEach((item: any) => {
|
|
|
- if (forms.titleTimeValue === item.value) {
|
|
|
- name = item.text;
|
|
|
- }
|
|
|
- });
|
|
|
- return name;
|
|
|
- } else if (type === 'orchestra') {
|
|
|
+ if (type === 'orchestra') {
|
|
|
let name = '';
|
|
|
- forms.timeColumns.forEach((item: any) => {
|
|
|
+ forms.orchestraColumns.forEach((item: any) => {
|
|
|
if (forms.titleOrchestraValue === item.value) {
|
|
|
name = item.text;
|
|
|
}
|
|
@@ -64,10 +93,65 @@ export default defineComponent({
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- onMounted(() => {
|
|
|
- setTimeout(() => {
|
|
|
- forms.loading = false;
|
|
|
- }, 2000);
|
|
|
+ const getList = async () => {
|
|
|
+ try {
|
|
|
+ if (forms.isClick) return;
|
|
|
+ forms.isClick = true;
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/api-web/classGroup/teachingPointCourse',
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ ...forms.params,
|
|
|
+ startTime: forms.titleTimeValue[0] || null,
|
|
|
+ endTime: forms.titleTimeValue[1] || null
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ const result = data || {};
|
|
|
+ // 处理重复请求数据
|
|
|
+ if (forms.list.length > 0 && result.pageNo === 1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 判断是否有数据
|
|
|
+ if (forms.listState.refreshing) {
|
|
|
+ forms.list = result.rows || [];
|
|
|
+ } else {
|
|
|
+ forms.list = forms.list.concat(result.rows || []);
|
|
|
+ }
|
|
|
+
|
|
|
+ forms.listState.finished = result.pageNo >= result.pages;
|
|
|
+ forms.params.page = result.pageNo + 1;
|
|
|
+ } catch {
|
|
|
+ forms.listState.finished = true;
|
|
|
+ } finally {
|
|
|
+ forms.listState.dataShow = forms.list.length > 0;
|
|
|
+ forms.listState.refreshing = false;
|
|
|
+ forms.listState.loading = false;
|
|
|
+ forms.isClick = false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 红点
|
|
|
+ const teachingPointCourse = async () => {
|
|
|
+ try {
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/api-web/classGroup/teachingPointRemind'
|
|
|
+ );
|
|
|
+ forms.pointCourseStatus = data || false;
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const onRefresh = () => {
|
|
|
+ forms.params.page = 1;
|
|
|
+ getList();
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ getInitTimer();
|
|
|
+ await getList();
|
|
|
+ teachingPointCourse();
|
|
|
});
|
|
|
return () => (
|
|
|
<div class={styles.siteManagement}>
|
|
@@ -75,31 +159,29 @@ export default defineComponent({
|
|
|
<MHeader>
|
|
|
{{
|
|
|
right: () => (
|
|
|
- <Icon class={styles.iconSetting} name={iconSetting} dot />
|
|
|
+ <Icon
|
|
|
+ class={styles.iconSetting}
|
|
|
+ name={iconSetting}
|
|
|
+ dot={forms.pointCourseStatus}
|
|
|
+ onClick={() => {
|
|
|
+ router.push('/site-settings');
|
|
|
+ }}
|
|
|
+ />
|
|
|
)
|
|
|
}}
|
|
|
</MHeader>
|
|
|
|
|
|
<DropdownMenu>
|
|
|
- <DropdownItem ref={dropDownItemRef} title={formatName('time')}>
|
|
|
- <DropDownModal
|
|
|
- selectValues={forms.titleTimeValue}
|
|
|
- columns={forms.timeColumns}
|
|
|
- open={dropDownItemRef.value.state.showPopup}
|
|
|
- onDropDownClose={() => onDropDownClose(dropDownItemRef)}
|
|
|
- onDropDownConfirm={(values: any) => {
|
|
|
- forms.titleTimeValue = values[0];
|
|
|
- console.log(values, 'time');
|
|
|
- onDropDownClose(dropDownItemRef);
|
|
|
- }}
|
|
|
- />
|
|
|
- </DropdownItem>
|
|
|
+ <DropdownItem
|
|
|
+ ref={dropDownItemRef}
|
|
|
+ v-model={forms.titleTimeValue}
|
|
|
+ options={forms.timeColumns as any}></DropdownItem>
|
|
|
<DropdownItem
|
|
|
ref={dropDownItemRef1}
|
|
|
title={formatName('orchestra')}>
|
|
|
<DropDownModal
|
|
|
selectValues={forms.titleOrchestraValue}
|
|
|
- columns={forms.timeColumns}
|
|
|
+ columns={forms.orchestraColumns}
|
|
|
open={dropDownItemRef1.value.state.showPopup}
|
|
|
onDropDownClose={() => onDropDownClose(dropDownItemRef1)}
|
|
|
onDropDownConfirm={(values: any) => {
|
|
@@ -112,135 +194,133 @@ export default defineComponent({
|
|
|
</DropdownMenu>
|
|
|
</MSticky>
|
|
|
|
|
|
- <MFullRefresh
|
|
|
- v-model:modelValue={forms.refreshing}
|
|
|
- onRefresh={() => {
|
|
|
- setTimeout(() => {
|
|
|
- forms.refreshing = false;
|
|
|
- }, 1000);
|
|
|
- }}
|
|
|
- style={{
|
|
|
- minHeight: `calc(100vh - var(--header-height))`
|
|
|
- }}>
|
|
|
- <SkeletonModal v-model:show={forms.loading}>
|
|
|
- {/* <MEmpty
|
|
|
+ <SkeletonModal v-model:show={forms.listState.loading}>
|
|
|
+ <MFullRefresh
|
|
|
+ v-model:modelValue={forms.listState.refreshing}
|
|
|
+ onRefresh={() => onRefresh()}
|
|
|
style={{
|
|
|
minHeight: `calc(100vh - var(--header-height))`
|
|
|
- }}
|
|
|
- description="暂无数据"
|
|
|
- /> */}
|
|
|
- <div class={styles.siteItem}>
|
|
|
- <CellGroup class={styles.cellGroup} border={false}>
|
|
|
- <Cell border={false} center>
|
|
|
- {{
|
|
|
- title: () => (
|
|
|
- <div class={styles.orchestraName}>
|
|
|
- <img src={iconMusic} class={styles.iconMusic} />
|
|
|
- <p class={styles.overhide}>
|
|
|
- 武汉小学乐团武汉小学乐团武汉小学乐团武汉小学乐团
|
|
|
- </p>
|
|
|
- </div>
|
|
|
- ),
|
|
|
- default: () => (
|
|
|
- <p class={[styles.address, styles.overhide]}>
|
|
|
- 1年级1班1年级1班1年级1班
|
|
|
- </p>
|
|
|
- )
|
|
|
- }}
|
|
|
- </Cell>
|
|
|
- <Cell center class={styles.username}>
|
|
|
- {{
|
|
|
- icon: () => (
|
|
|
- <Image
|
|
|
- src={iconTeacher}
|
|
|
- class={styles.iconTeacher}
|
|
|
- fit="contain"
|
|
|
- />
|
|
|
- ),
|
|
|
- title: () => (
|
|
|
- <div>
|
|
|
- <div class={styles.classname}>声部课·上低音号</div>
|
|
|
- <div class={styles.name}>王丹丹</div>
|
|
|
+ }}>
|
|
|
+ <List
|
|
|
+ finished={forms.listState.finished}
|
|
|
+ finishedText=" "
|
|
|
+ style={{ overflow: 'hidden' }}
|
|
|
+ onLoad={getList}
|
|
|
+ immediateCheck={false}>
|
|
|
+ {forms.listState.dataShow ? (
|
|
|
+ forms.list.map((item: any) => (
|
|
|
+ <div class={styles.siteItem}>
|
|
|
+ <CellGroup class={styles.cellGroup} border={false}>
|
|
|
+ <Cell border={false} center>
|
|
|
+ {{
|
|
|
+ title: () => (
|
|
|
+ <div class={styles.orchestraName}>
|
|
|
+ <img src={iconMusic} class={styles.iconMusic} />
|
|
|
+ <p class={styles.overhide}>
|
|
|
+ {item.musicGroupName}
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ ),
|
|
|
+ default: () => (
|
|
|
+ <p class={[styles.address, styles.overhide]}>
|
|
|
+ 1年级1班1年级1班1年级1班
|
|
|
+ </p>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Cell>
|
|
|
+ <Cell center class={styles.username}>
|
|
|
+ {{
|
|
|
+ icon: () => (
|
|
|
+ <Image
|
|
|
+ src={iconTeacher}
|
|
|
+ class={styles.iconTeacher}
|
|
|
+ fit="contain"
|
|
|
+ />
|
|
|
+ ),
|
|
|
+ title: () => (
|
|
|
+ <div>
|
|
|
+ <div class={styles.classname}>
|
|
|
+ {item.courseName}
|
|
|
+ </div>
|
|
|
+ <div class={styles.name}>{item.teacherName}</div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Cell>
|
|
|
+ </CellGroup>
|
|
|
+ <CellGroup class={styles.cellGroup}>
|
|
|
+ <div class={[styles.photoGroup]}>
|
|
|
+ <div class={styles.photoUp}>
|
|
|
+ <h3>
|
|
|
+ <span class={styles.photoTitle}>课前照片</span>
|
|
|
+ </h3>
|
|
|
+ {item.signPhoto ? (
|
|
|
+ <div class={styles.photoList}>
|
|
|
+ {(item.signPhoto.split(',') || []).map(
|
|
|
+ (img: string, index: number) => (
|
|
|
+ <div
|
|
|
+ class={styles.photo}
|
|
|
+ onClick={() => {
|
|
|
+ forms.imagePreview =
|
|
|
+ item.signPhoto.split(',') || [];
|
|
|
+ forms.imageShow = true;
|
|
|
+ forms.startPosition = index;
|
|
|
+ }}>
|
|
|
+ <Image src={img} />
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ <div class={styles.photoEmpty}>
|
|
|
+ <img src={iconEmpty} class={styles.iconEmpty} />
|
|
|
+ <p>老师未上传照片~</p>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ <div class={styles.photoDown}>
|
|
|
+ <h3>
|
|
|
+ <span class={styles.photoTitle}>课后照片</span>
|
|
|
+ </h3>
|
|
|
+ {item.signOutPhoto ? (
|
|
|
+ <div class={styles.photoList}>
|
|
|
+ {(item.signOutPhoto.split(',') || []).map(
|
|
|
+ (img: string, index: number) => (
|
|
|
+ <div
|
|
|
+ class={styles.photo}
|
|
|
+ onClick={() => {
|
|
|
+ forms.imagePreview =
|
|
|
+ item.signOutPhoto.split(',') || [];
|
|
|
+ forms.imageShow = true;
|
|
|
+ forms.startPosition = index;
|
|
|
+ }}>
|
|
|
+ <Image src={img} />
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ <div class={styles.photoEmpty}>
|
|
|
+ <img src={iconEmpty} class={styles.iconEmpty} />
|
|
|
+ <p>老师未上传照片~</p>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- )
|
|
|
- }}
|
|
|
- </Cell>
|
|
|
- </CellGroup>
|
|
|
- <CellGroup class={styles.cellGroup}>
|
|
|
- <div class={[styles.photoGroup]}>
|
|
|
- <div class={styles.photoUp}>
|
|
|
- <h3>
|
|
|
- <span class={styles.photoTitle}>课前照片</span>
|
|
|
- </h3>
|
|
|
- <div class={styles.photoList}>
|
|
|
- <div
|
|
|
- class={styles.photo}
|
|
|
- onClick={() => {
|
|
|
- forms.imageShow = true;
|
|
|
- forms.startPosition = 0;
|
|
|
- }}>
|
|
|
- <Image src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/d7108568f10844c1b25db8cebf971caa_mergeImage.png" />
|
|
|
- </div>
|
|
|
- <div
|
|
|
- class={styles.photo}
|
|
|
- onClick={() => {
|
|
|
- forms.imageShow = true;
|
|
|
- forms.startPosition = 1;
|
|
|
- }}>
|
|
|
- <Image src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/d7d77ad6169c4b688cea7183dfabbae2_mergeImage.png" />
|
|
|
- </div>
|
|
|
- <div
|
|
|
- class={styles.photo}
|
|
|
- onClick={() => {
|
|
|
- forms.imageShow = true;
|
|
|
- forms.startPosition = 2;
|
|
|
- }}>
|
|
|
- <Image src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/5714fa27180d4115b5bcae6cc2a9ea4f_mergeImage.png" />
|
|
|
- <div class={styles.photoMore}>+8</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- {/* <div class={styles.photoEmpty}>
|
|
|
- <img src={iconEmpty} class={styles.iconEmpty} />
|
|
|
- <p>老师未上传照片~</p>
|
|
|
- </div> */}
|
|
|
+ </CellGroup>
|
|
|
</div>
|
|
|
- <div class={styles.photoDown}>
|
|
|
- <h3>
|
|
|
- <span class={styles.photoTitle}>课后照片</span>
|
|
|
- </h3>
|
|
|
- <div class={styles.photoList}>
|
|
|
- <div
|
|
|
- class={styles.photo}
|
|
|
- onClick={() => {
|
|
|
- forms.imageShow = true;
|
|
|
- forms.startPosition = 0;
|
|
|
- }}>
|
|
|
- <Image src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/d7108568f10844c1b25db8cebf971caa_mergeImage.png" />
|
|
|
- </div>
|
|
|
- <div
|
|
|
- class={styles.photo}
|
|
|
- onClick={() => {
|
|
|
- forms.imageShow = true;
|
|
|
- forms.startPosition = 1;
|
|
|
- }}>
|
|
|
- <Image src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/d7d77ad6169c4b688cea7183dfabbae2_mergeImage.png" />
|
|
|
- </div>
|
|
|
- <div
|
|
|
- class={styles.photo}
|
|
|
- onClick={() => {
|
|
|
- forms.imageShow = true;
|
|
|
- forms.startPosition = 2;
|
|
|
- }}>
|
|
|
- <Image src="https://lanhu-dds-backend.oss-cn-beijing.aliyuncs.com/merge_image/imgs/5714fa27180d4115b5bcae6cc2a9ea4f_mergeImage.png" />
|
|
|
- <div class={styles.photoMore}>+8</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </CellGroup>
|
|
|
- </div>
|
|
|
- </SkeletonModal>
|
|
|
- </MFullRefresh>
|
|
|
+ ))
|
|
|
+ ) : (
|
|
|
+ <MEmpty
|
|
|
+ style={{
|
|
|
+ minHeight: `calc(100vh - var(--header-height))`
|
|
|
+ }}
|
|
|
+ description="暂无数据"
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </List>
|
|
|
+ </MFullRefresh>
|
|
|
+ </SkeletonModal>
|
|
|
|
|
|
<MImagePreview
|
|
|
v-model:show={forms.imageShow}
|