Browse Source

添加Vip和禁止录屏功能

lex 9 months ago
parent
commit
0c32fc63a1

+ 1 - 1
src/helpers/native-message.ts

@@ -27,7 +27,7 @@ window.postMessage = (message: IPostMessage) => {
 type CallBack = (evt?: IPostMessage) => void;
 
 // eslint-disable-next-line @typescript-eslint/no-empty-function
-const loop = () => {};
+const loop = () => { };
 
 const calls: { [key: string]: CallBack | CallBack[] } = {};
 

+ 130 - 15
src/views/exercise-after-class/index.tsx

@@ -1,4 +1,4 @@
-import { Button, Icon, Popup, Swipe, SwipeItem } from 'vant';
+import { Button, Icon, Popup, Swipe, SwipeItem, showDialog } from 'vant';
 import {
   defineComponent,
   onMounted,
@@ -6,7 +6,8 @@ import {
   onUnmounted,
   ref,
   Transition,
-  watch
+  watch,
+  nextTick
 } from 'vue';
 import styles from './index.module.less';
 import 'plyr/dist/plyr.css';
@@ -14,7 +15,11 @@ import request from '@/helpers/request';
 import { state } from '@/state';
 import { useRoute } from 'vue-router';
 import iconBack from '../coursewarePlay/image/back.svg';
-import { postMessage } from '@/helpers/native-message';
+import {
+  listenerMessage,
+  postMessage,
+  promisefiyPostMessage
+} from '@/helpers/native-message';
 // import { browser } from '@/helpers/utils';
 import { Vue3Lottie } from 'vue3-lottie';
 import playLoadData from '../coursewarePlay/datas/data.json';
@@ -22,6 +27,7 @@ import playLoadData from '../coursewarePlay/datas/data.json';
 import VideoClass from './video-class';
 import { usePageVisibility } from '@vant/use';
 import { useInterval, useIntervalFn } from '@vueuse/core';
+import { handleCheckVip } from '../hook/useFee';
 
 // const materialType = {
 //   视频: 'VIDEO',
@@ -74,6 +80,7 @@ export default defineComponent({
     const query = route.query;
     const headeRef = ref();
     const data = reactive({
+      disableScreenRecordingFlag: '0', // disable recording
       visiableStatus: false,
       visiableConfirmText: '下一题',
       isLastIndex: false,
@@ -151,10 +158,9 @@ export default defineComponent({
             loop: false,
             videoEle: null,
             timer: null,
-            // muted: state.user.data?.vipMember ? false : true, // 静音
-            muted: true,
-            autoplay: true
-            // autoplay: state.user.data?.vipMember ? true : false //自动播放
+            muted: state.user.data?.vipMember ? false : true, // 静音
+            // muted: true,
+            autoplay: state.user.data?.vipMember ? true : false //自动播放
           };
         });
         console.log(data.trainings, 'trainings');
@@ -162,6 +168,11 @@ export default defineComponent({
           (n: any) => n.id == route.query.materialId
         );
         data.videoData = data.itemList[0];
+
+        if (data.disableScreenRecordingFlag === '1') {
+          // 检测是否录屏
+          handleLimitScreenRecord();
+        }
         handleExerciseCompleted();
       }
     };
@@ -193,20 +204,124 @@ export default defineComponent({
       }
     };
 
+    // 获取支付渠道
+    const sysParamConfig = async () => {
+      try {
+        const res = await request.get(
+          state.platformApi + '/sysConfig/queryByParamName',
+          {
+            params: {
+              paramName: 'disable_screen_recording_flag'
+            }
+          }
+        );
+        data.disableScreenRecordingFlag = res.data.paranValue || '';
+      } catch {
+        //
+      }
+    };
+
+    let timers: any = null;
+    const checkVideoPlay = () => {
+      const activeVideoRef = data.videoData?.videoEle;
+      if (activeVideoRef) {
+        timers = setInterval(() => {
+          if (!activeVideoRef.paused()) {
+            activeVideoRef.pause();
+            clearInterval(timers);
+          }
+          activeVideoRef.pause();
+        }, 100);
+      }
+      setTimeout(() => {
+        clearInterval(timers);
+      }, 3000);
+    };
+    // 切换播放
+    const togglePlay = (m: any, isPlay: boolean) => {
+      if (isPlay) {
+        m.videoEle?.play();
+      } else {
+        m.videoEle?.pause();
+      }
+    };
+    //录屏时间触发
+    const handleLimitScreenRecord = async () => {
+      const result = await promisefiyPostMessage({
+        api: 'getDeviceStatus',
+        content: { type: 'video' }
+      });
+      const { status } = result?.content || {};
+      if (status == '1') {
+        data.itemList.forEach((item: any) => (item.autoPlay = false));
+        handleStopVideo();
+        // 处理事件 - 事件事件后加载的
+        checkVideoPlay();
+        data.visiableStatus = false;
+        showDialog({
+          title: '温馨提示',
+          message: '课件内容请勿录屏',
+          beforeClose: () => {
+            return new Promise(resolve => {
+              promisefiyPostMessage({
+                api: 'getDeviceStatus',
+                content: { type: 'video' }
+              }).then((res: any) => {
+                const content = res.content;
+                if (content?.status == '1') {
+                  togglePlay(data.videoData, false);
+                  resolve(false);
+                } else {
+                  togglePlay(data.videoData, true);
+                  resolve(true);
+                }
+
+                handleExerciseCompleted();
+              });
+            });
+          }
+        });
+      }
+    };
     onMounted(async () => {
+      await sysParamConfig();
       const trainings = await getTrainingRecord();
       // 初始化状态
-      // trainings.forEach((record: any) => {
-      //   if (record.times > record.trainingTimes) {
-      //     console.log(record, 'times');
-      //     data.isPlayBaseStatus = false;
-      //   }
-      // });
 
       setRecord(trainings);
       // 是否为会员
-      // data.isMember = handleCheckVip();
+      if (state.platformType === 'STUDENT') {
+        data.isMember = handleCheckVip();
+        console.log(data.isMember, 'isMember');
+        if (!data.isMember) {
+          nextTick(() => {
+            postMessage({
+              api: 'courseLoading',
+              content: {
+                show: false,
+                type: 'fullscreen'
+              }
+            });
+          });
+          return;
+        }
+      }
 
+      if (data.disableScreenRecordingFlag === '1') {
+        //禁止录屏 ios
+        listenerMessage('setVideoPlayer', result => {
+          if (result?.content?.status == 'pause') {
+            handleLimitScreenRecord();
+          }
+        });
+        // 安卓
+        postMessage({
+          api: 'limitScreenRecord',
+          content: {
+            type: 1
+          }
+        });
+      }
       // 只有学生才统计数据
       if (state.platformType === 'STUDENT') {
         // 间隔多少时间同步数据
@@ -328,7 +443,7 @@ export default defineComponent({
     };
     const dialogCancel = () => {
       try {
-        data.trainings[data.itemIndex].currentTime = 0;
+        // data.trainings[data.itemIndex].currentTime = 0;
       } catch (e) {
         //
       }

+ 1 - 1
src/views/exercise-after-class/video-class.tsx

@@ -58,7 +58,7 @@ export default defineComponent({
         nextTick(() => {
           videoItem.value?.pause();
         });
-        // console.log(props.item, item.value, '-----')
+        // console.log(props.item, item.value, props.isMember, '-----');
         videoItem.value.poster(props.item.coverImg); // 封面
         videoItem.value.src(props.item.content); // url 播放地址
         videoItem.value.loop(props.item.loop);

+ 7 - 0
src/views/hook/useFee.ts

@@ -7,6 +7,13 @@ import { showDialog } from 'vant';
 export const gotoMemberCenter = () => {
   postMessage({ api: 'back' });
   const browserInfo = browser();
+<<<<<<< Updated upstream
+=======
+  let pathname = '/'
+  if (/gym.lexiaoya.cn/.test(location.origin) || /test.gym.lexiaoya.cn/.test(location.origin)) {
+    pathname = '/mdaya/'
+  }
+>>>>>>> Stashed changes
   if (browserInfo.isApp) {
     const url = window.location.origin + `/#/member`;
     postMessage({