chenyc
2023-07-31 b7d347e75d0aeebca06a4f12c7a2aba155c24b1e
src/views/login/index.vue
@@ -1,200 +1,75 @@
<template>
   <div class="login-container">
      <div class="login-logo">
         <span>岱特智能科技</span>
      </div>
      <div class="login-content" :class="{ 'login-content-mobile': tabsActiveName === 'mobile' }">
         <el-row :gutter="0">
            <el-col :xs="0" :sm="12" :md="12" :lg="12" :xl="12">
               <div class="login-content-image">
                  <div></div>
               </div>
            </el-col>
            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
               <div class="login-content-main">
                  <div class="login-content-title">
                     <div class="login-content-logo"></div>
                     <div class="login-title">胜透血液透析管理平台</div>
                     <div class="login-welcome">WELCOME欢迎登陆</div>
                  </div>
                  <div>
                     <Account />
                  </div>
               </div>
            </el-col>
         </el-row>
      </div>
      <div class="login-copyright">
         <div class="mb5 login-copyright-company"></div>
         <div class="login-copyright-msg"></div>
      </div>
   </div>
</template>
<script setup lang="ts">
import { computed, onMounted, ref } from "vue";
import {base64toFile} from '@/samples/faceApi'
import { formatDate } from "@/utils/formatTime";
import { confingInfoStore } from "@/stores/StoresConfing";
<script lang="ts">
import { toRefs, reactive, computed } from 'vue';
import Account from '@/views/login/component/account.vue';
export default {
   name: 'loginIndex',
   components: { Account },
   setup() {
      const state = reactive({
         tabsActiveName: 'account',
         isTabPaneShow: true,
         isScan: false,
      });
      return {
         ...toRefs(state),
      };
   },
};
</script>
<style scoped lang="scss">
.login-container {
   width: 100%;
   height: 100%;
   background: url('@/assets/imgs/login/login-background.jpg') no-repeat;
   background-size: 100% 100%;
   .login-logo {
      position: absolute;
      top: 30px;
      left: 50%;
      height: 50px;
      display: flex;
      align-items: center;
      font-size: 20px;
      color: var(--color-primary);
      letter-spacing: 2px;
      width: 90%;
      transform: translateX(-50%);
   }
   .login-content {
      width: 848px;
      // padding: 20px;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%) translate3d(0, 0, 0);
      background-color: rgba(255, 255, 255, 0.99);
      // border: 5px solid var(--color-primary-light-8);
      border-radius: 10px;
      transition: height 0.2s linear;
      // height: 480px;
      overflow: hidden;
      z-index: 1;
      .login-content-image {
         padding: 40px 20px;
         width: 100%;
         height: 100%;
         background-color: #F1F7FF
      }
      .login-content-image div {
         width: 100%;
         height: 100%;
         background: url('@/assets/imgs/login/login.jpg') no-repeat;
         background-size: 100% 100%;
      }
      .login-content-main {
         margin: 75px 50px;
         // margin: 0 auto;
         // width: 80%;
         .login-content-title {
            color: #333;
            font-weight: 500;
         font-size: 22px;
            text-align: left;
            // letter-spacing: 4px;
            // margin: 15px 0 30px;
            white-space: nowrap;
            z-index: 5;
            // position: relative;
            // transition: all 0.3s ease;
            .login-content-logo {
               text-align: left;
               width: 40px;
               height: 30px;
               background: url('@/assets/imgs/login/favicon.svg') no-repeat;
               display: inline-block;
               vertical-align: middle;
            }
            .login-title {
               display: inline-block;
               width: 224px;
               height: 30px;
               font-size: 21px;
               font-family: PingFangSC-Medium, PingFang SC;
               font-weight: 500;
               color: #232426;
               line-height: 30px;
               letter-spacing: 1px;
               vertical-align: middle;
            }
            .login-welcome {
               width: 149px;
               height: 20px;
               font-size: 14px;
               font-family: PingFangSC-Medium, PingFang SC;
               font-weight: 500;
               color: #AAAAAA;
               line-height: 20px;
            }
         }
      }
      .login-content-main-sacn {
         // position: absolute;
         // top: 0;
         // right: 0;
         // width: 50px;
         // height: 50px;
         overflow: hidden;
         cursor: pointer;
         transition: all ease 0.3s;
         &-delta {
            position: absolute;
            width: 35px;
            height: 70px;
            z-index: 2;
            top: 2px;
            right: 21px;
            background: var(--el-color-white);
            transform: rotate(-45deg);
         }
         &:hover {
            opacity: 1;
            transition: all ease 0.3s;
            color: var(--color-primary);
         }
         i {
            width: 47px;
            height: 50px;
            display: inline-block;
            font-size: 48px;
            position: absolute;
            right: 2px;
            top: -1px;
         }
      }
   }
   .login-content-mobile {
      height: 418px;
   }
   .login-copyright {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
      bottom: 30px;
      text-align: center;
      color: var(--color-whites);
      font-size: 12px;
      opacity: 0.8;
      .login-copyright-company {
         white-space: nowrap;
      }
      .login-copyright-msg {
         @extend .login-copyright-company;
      }
   }
}
</style>
const msg = ref<string>("没识别到人脸...");
const dialogVisible=ref(true)
const date=ref('')
let trackerTask: any = null;
const inputCode=ref('')
const inputRef = ref()
// 标识用的画布
const myCanvas = ref<HTMLCanvasElement | null>(null);
let imgSrc:'';
// 实例人脸检查器
const myTracker: any = new tracking.ObjectTracker("face");
myTracker.setInitialScale(4);
myTracker.setStepSize(2);
myTracker.setEdgesDensity(0.1);
// 监听人脸检查器
myTracker.on("track", (event: tracking.TrackEvent) => {
  const context = myCanvas.value?.getContext("2d") as CanvasRenderingContext2D;
  if (myCanvas.value) {
    context.clearRect(0, 0, myCanvas.value.width, myCanvas.value.height);
  }
  if (event.data.length === 0) {
    msg.value = "没识别到人脸...";
  } else if(event.data.length === 1) {
    trackerTask.stop();
    msg.value = "检测到人脸";
    const myCanvas = document.getElementById("myCanvas");//
    const thisContext = myCanvas?.getContext("2d");
    const myVideo = document.querySelector("#myVideo") as HTMLVideoElement;
    thisContext.drawImage(myVideo, 0,0, 250, 200);
    imgSrc = myCanvas?.toDataURL('image/png');
    // 转文件
    // 识别框显示才能到传阿里云识别
    if(dialogVisible.value){
      base64toFile(imgSrc)
    }
    setTimeout(() => {
      console.log('监测到人脸后3s')
      trackerTask.run();
    }, 3000);
    // @ts-ignore
    if (typeof window.stream === "object") {
      myVideo.srcObject = null;
      // @ts-ignore
      window.stream.getTracks().forEach((track) => track.stop());
    }
  }
});
onMounted(() => {
  // 触发人脸检查器
  console.log('人脸识别初始化')
  const  isUseFaceRecogService = confingInfoStore().confingInfo.isUseFaceRecogService
  console.log('人脸识别',isUseFaceRecogService)
  setInterval(function () {
    date.value= formatDate(new Date(),'YYYY-mm-dd HH:MM')
  }, 1000)
  if (isUseFaceRecogService) {
    console.log('开启人脸识别初始化')
    setTimeout(()=>{
      trackerTask = tracking.track("#myVideo", myTracker, { camera: true });
    },2000)
  }else{
    console.log('关闭人脸识别')
  }
});
</script>