123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- import {
- PropType,
- defineComponent,
- nextTick,
- onMounted,
- reactive,
- watch,
- ref
- } from 'vue';
- import styles from './index.module.less';
- import icon_back from '../../image/icon_back.svg';
- import icon_play from '../../image/icon_class.png';
- import { useRouter } from 'vue-router';
- import { listenerMessage, postMessage } from '@/helpers/native-message';
- import { showToast } from 'vant';
- import queryString from 'query-string';
- import CoursewareDetail from '@/custom-plugins/guide-page/courseware-detail';
- import { usePageVisibility } from '@vant/use';
- import { state } from '@/state';
- import TheNoticeBar from '@/components/the-noticeBar';
- export default defineComponent({
- name: 'the-book',
- props: {
- bookData: {
- type: Object as PropType<any>,
- default: () => ({})
- },
- tab: {
- type: String,
- default: ''
- },
- show: {
- type: Boolean,
- default: false
- },
- rect: {
- type: Object as PropType<DOMRect>,
- default: () => ({})
- }
- },
- emits: ['close'],
- setup(props, { emit }) {
- const router = useRouter();
- console.log(state.user.data.phone);
- const lastTimeKey = 'lastTime' + (state?.user?.data?.phone ?? '');
- const data = reactive({
- show: false,
- width: 0,
- height: 0,
- transform: '',
- list: [] as any[][],
- lastTime: localStorage.getItem(lastTimeKey)
- });
- const showGuide = ref(false);
- const isend = ref(false)
- const isHandMove = ref(false)
- const handleCreate = (key: string, url: string) => {
- return new Promise((resolve, reject) => {
- const _s = document.head.querySelector(`script[data-key="${key}"]`);
- if (!_s) {
- const s = document.createElement('script');
- s.setAttribute('data-key', key);
- s.src = url;
- s.onload = async () => {
- console.log(key + ' 加载完成');
- resolve(1);
- };
- document.head.appendChild(s);
- }
- });
- };
- const init = async () => {
-
-
- console.log('初始化完成');
- };
- let book: any = null;
- let timer: any = null;
- const handleBook = () => {
- book = (window as any).$('#flipbook');
- const height = document.body.clientHeight * 0.8;
- data.height = height;
- data.width = height * (210 / 297) * 2;
- book.turn({
- autoCenter: true,
- duration: 1000,
- disable: false,
- acceleration: true,
-
- elevation: 50,
- width: data.width,
- height: data.height,
- gradients: true,
-
- })
-
-
-
-
- book.bind('turned', (event: Event, page: any, corner: any) => {
- setTimeout(() => {
- showGuide.value = true;
- }, 500);
-
-
-
-
-
-
- });
- book.bind('turning', (event: Event, page: any, corner: any) => {
- console.log(page, 'page', book.turn('pages'))
- if (page === book.turn('pages')) {
- handleClose(false)
-
-
-
- }
- return
- })
-
- };
- const getRect = () => {
- const bookWrap = document.querySelector(
- '.bookWrap'
- ) as unknown as HTMLElement;
- if (bookWrap) {
- const rect = bookWrap.getBoundingClientRect();
- const xScale = props.rect.width / (rect.width / 2);
- const yScale = props.rect.height / rect.height;
- const left =
- (((rect.width / 2) * (xScale - 1)) / 2 +
- props.rect.x -
- rect.x -
- rect.width / 4) /
- xScale;
- const top =
- ((rect.height * (yScale - 1)) / 2 + props.rect.y - rect.y) / yScale;
- const transform = `scale3d(${xScale}, ${yScale}, 1) translate(${left}px, ${top}px)`;
- bookWrap.style.transform = data.transform = transform;
- bookWrap.style.transition = 'transform 0s';
- nextTick(() => {
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- bookWrap.style.transition = 'transform 1s';
- bookWrap.style.transform = '';
- data.show = true;
- timer = setTimeout(() => {
- book.turn('page', 2);
- setTimeout(() => {
- showGuide.value = true;
- }, 1500);
- }, 500);
- });
- });
- });
- }
- };
- const handleClose = (gotoOne = true) => {
- if (isend.value) {
- return
- }
- isend.value = true
- clearTimeout(timer);
- const bookWrap = document.querySelector(
- '.bookWrap'
- ) as unknown as HTMLElement;
- if (gotoOne) {
- book.turn('page', 1);
- }
- if (bookWrap) {
- bookWrap.style.transform = data.transform;
- }
- emit('close');
- setTimeout(() => {
- bookWrap.style.transition = '';
- bookWrap.style.transform = '';
- data.show = false;
- data.list = [];
- isend.value = false
- }, 1000);
- };
- onMounted(async () => {
- await init();
- listenerMessage('webViewOnResume', () => {
- data.lastTime = localStorage.getItem(lastTimeKey);
- });
- });
- const getList = () => {
- if (!props.bookData?.lessonList) return;
- const step = Math.floor((document.body.clientHeight * 0.8 - 40) / 50);
- console.log('🚀 ~ step:', step);
- const list = [];
- let listItem = [] as any[];
- for (let i = 0; i < props.bookData.lessonList.length; i++) {
- const item = props.bookData.lessonList[i];
- if (listItem.length >= step) {
- list.push([...listItem]);
- listItem = [{ name: item.name }];
- } else {
- listItem.push({ name: item.name });
- }
- for (let j = 0; j < item.knowledgeList.length; j++) {
- if (listItem.length >= step) {
- list.push([...listItem]);
- listItem = [item.knowledgeList[j]];
- } else {
- listItem.push(item.knowledgeList[j]);
- }
- }
- }
- if (listItem.length) {
- list.push(listItem);
- }
- data.list = list;
-
-
-
- };
- watch(
- () => props.show,
- () => {
- if (props.show) {
- getList();
- nextTick(() => {
- handleBook();
- requestAnimationFrame(() => {
- getRect();
- });
- });
- }
- }
- );
- const handleOpenPlay = (item: any) => {
- if (item.id) {
- if (!item.containMaterial) {
- showToast('暂无资源');
- return;
- }
- localStorage.setItem(lastTimeKey, item.id);
- const query = queryString.stringify({
- id: item.id,
- lessonCoursewareId: item.lessonCoursewareId,
- lessonCoursewareDetailId: item.lessonCoursewareDetailId,
- name: item.name,
- tab: props.tab
- });
- const url =
- location.origin + location.pathname + '#/courseware-play?' + query;
- console.log('🚀 ~ url:', url);
- postMessage({
- api: 'openWebView',
- content: {
- url,
- orientation: 0,
- isHideTitle: false,
- c_orientation: 0
- }
- });
-
-
-
-
-
-
-
-
-
-
- }
- };
- const isStartAnimate = (item: any) => {
-
- return false
- }
- return () => (
- <div class={[styles.book, data.show ? '' : styles.bookHide]} onClick={() => handleClose()}>
- <div class={styles.back} >
- <img src={icon_back} />
- </div>
- <div class="bookWrap" style={{ width: data.width + 'px' }} onClick={(e: Event) => {
- e.stopPropagation()
- }} >
- {!!data.list.length && (
- <div id="flipbook" class={[data.show && 'animated']}>
- <div class="page">
- <img
- style="width: 100%; height: 100%; object-fit: cover;"
- src={props.bookData.coverImg}
- />
- </div>
- {data.list.map((list: any) => {
- return (
- <div class="page">
- <div class={styles.wrap}>
- <div class={styles.wrapItem}>
- {list.map((item: any, index: number) => {
- return (
- <>
- <div
- class={[styles.item, item.id && styles.des]}
- onTouchstart={(e: TouchEvent) => {
- e.stopPropagation();
- }}
- onClick={(e: Event) => {
- e.stopPropagation();
- handleOpenPlay(item);
- }}
- onTouchend={(e: TouchEvent) => {
- console.log(e)
- }}
- >
- {item.id ? (
- <img
- id={index == 1 ? 'coursewareDetail-0' : ''}
- class={styles.icon}
- src={icon_play}
- />
- ) : null}
- <div
- class={styles.name}
- style={{ lineHeight: '20Px' }}>
- {item.name}
- {}
- {data.lastTime === item.id && (
- <span class={styles.last}>上次观看</span>
- )}
- </div>
- </div >
- </>
- );
- })}
- </div>
- </div>
- </div>
- );
- })}
- {data.list.length % 2 === 1 && (
- <div class="page" style={{ pointerEvents: 'none' }}>
- <div class={styles.wrap}>
- <div class={styles.wrapItem}></div>
- </div>
- </div>
- )}
- <div class="page">
- <img
- style="width: 100%; height: 100%; object-fit: cover;"
- src={props.bookData.coverImg}
- />
- {
- }
- </div>
- </div >
- )}
- </div >
- {showGuide.value ? <CoursewareDetail></CoursewareDetail> : null}
- </div >
- );
- }
- });
|