|
@@ -0,0 +1,179 @@
|
|
|
+<template>
|
|
|
+ <div class="gesture">
|
|
|
+ <Header :showClose="false" :showTool="false"></Header>
|
|
|
+ <div class="menu">
|
|
|
+ <swiper v-if="projectList.length" ref="mySwiper" :slides-per-view="5" :space-between="0" :initialSlide="2"
|
|
|
+ :loop="true" :centeredSlides="true">
|
|
|
+ <swiper-slide v-for="(item, index) in projectList " :key="index">
|
|
|
+ <div class="li">
|
|
|
+ <div class="pic"><img :src="'static/images/train/' + item.key + '.png'"></div>
|
|
|
+ <div class="name">
|
|
|
+ {{ item.name }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </swiper-slide>
|
|
|
+ </swiper>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup name="Gesture" lang="ts">
|
|
|
+import { initWs } from '@/utils/handController'
|
|
|
+import { Swiper, SwiperSlide } from 'swiper/vue';
|
|
|
+import { Navigation, Pagination } from 'swiper/modules';
|
|
|
+import 'swiper/css';
|
|
|
+import 'swiper/scss/navigation';
|
|
|
+import 'swiper/scss/pagination';
|
|
|
+
|
|
|
+const mySwiper = ref(null);
|
|
|
+const router = useRouter();
|
|
|
+const { proxy } = getCurrentInstance() as any;
|
|
|
+
|
|
|
+const data = reactive<any>({
|
|
|
+ projectList: [],
|
|
|
+ timerManager: {},
|
|
|
+});
|
|
|
+const { projectList, timerManager } = toRefs(data);
|
|
|
+
|
|
|
+/**
|
|
|
+ * 清空定时任务
|
|
|
+*/
|
|
|
+const getClearTimer = () => {
|
|
|
+ for (let key in timerManager.value) {
|
|
|
+ if (timerManager.value.hasOwnProperty(key)) {
|
|
|
+ clearInterval(timerManager.value[key])
|
|
|
+ timerManager.value[key] = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 初始化项目
|
|
|
+*/
|
|
|
+const getInitExam = () => {
|
|
|
+ getExam();
|
|
|
+ //定时刷新
|
|
|
+ timerManager.value.exam = setInterval(() => {
|
|
|
+ getExam();
|
|
|
+ }, 5000)
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * 获取项目
|
|
|
+*/
|
|
|
+const getExam = async () => {
|
|
|
+ await proxy?.$http.train.projectList().then((res: any) => {
|
|
|
+ projectList.value = proxy?.$utils.getProject(res.exams).filter((item: any) => {
|
|
|
+ //只显示能开的
|
|
|
+ return item.area.length > 0;
|
|
|
+ });
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+onBeforeMount(() => {
|
|
|
+ //加载WS
|
|
|
+ initWs((e: any) => {
|
|
|
+ //左滑动
|
|
|
+ if (e.data.result == "next_item") {
|
|
|
+
|
|
|
+ }
|
|
|
+ //举左手
|
|
|
+ if (e.data.result == "left_hand") {
|
|
|
+
|
|
|
+ }
|
|
|
+ //退出
|
|
|
+ if (e.data.result == "exit") {
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+ getInitExam();
|
|
|
+})
|
|
|
+onMounted(() => {
|
|
|
+})
|
|
|
+onUnmounted(() => {
|
|
|
+ getClearTimer();
|
|
|
+})
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+$topPadding: 5.19rem;
|
|
|
+$waiPadding: 6.51rem;
|
|
|
+
|
|
|
+.menu {
|
|
|
+ width: calc(100% - ($waiPadding * 2));
|
|
|
+ height: 100vh;
|
|
|
+ margin: 0 auto;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+
|
|
|
+ .li {
|
|
|
+ // width: calc((100% / 6) - 1rem + (1rem/6));
|
|
|
+ // margin-right: 1rem;
|
|
|
+ // margin-bottom: 1rem;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ padding: 3vh 0;
|
|
|
+ border-radius: 1.6rem;
|
|
|
+ box-sizing: border-box;
|
|
|
+ box-shadow: inset 0px 1px 0px 2px rgba(255, 255, 255, 0.9046), inset 0px 3px 6px 0px rgba(0, 0, 0, 0.0851);
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ justify-content: center;
|
|
|
+ text-align: center;
|
|
|
+ background: radial-gradient(96% 96% at 2% 32%, #FFFFFF 0%, #FCFDFD 54%, #E1E4E7 100%);
|
|
|
+ flex-shrink: 0;
|
|
|
+ cursor: pointer;
|
|
|
+
|
|
|
+ .name {
|
|
|
+ width: 100%;
|
|
|
+ font-size: 2.48rem;
|
|
|
+ color: #1A293A;
|
|
|
+ padding: 0.5rem 0;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ .pic {
|
|
|
+ width: 11.36vw;
|
|
|
+ height: 11.36vw;
|
|
|
+ border-radius: 50%;
|
|
|
+ background: radial-gradient(78% 78% at 53% 50%, #07121A 0%, #2A4256 49%, #5180A9 100%);
|
|
|
+ box-shadow: 0px 0px 2px 2px #FFFFFF;
|
|
|
+ margin-bottom: 2vh;
|
|
|
+ overflow: hidden;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ flex-shrink: 0;
|
|
|
+
|
|
|
+ img {
|
|
|
+ max-width: 88%;
|
|
|
+ max-height: 88%;
|
|
|
+ transition: all 1s;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ img {
|
|
|
+ transform: translateY(-0.5vw);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .swiper-slide {
|
|
|
+ transform: scale(0.8);
|
|
|
+ transition: all 0.3s ease-in-out;
|
|
|
+ border-radius: 1.6rem;
|
|
|
+ opacity: 0.6;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+
|
|
|
+ .swiper-slide-active {
|
|
|
+ opacity: 1;
|
|
|
+ transform: scale(1);
|
|
|
+
|
|
|
+ .li {
|
|
|
+ background: radial-gradient(167% 126% at 97% 6%, #35FFC6 0%, #00FFE8 100%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|