Browse Source

需求修挂

bobo04052021@163.com 2 months ago
parent
commit
5a392e11d4

+ 333 - 208
pages/filecenter/filecenter.vue

@@ -1,213 +1,264 @@
 <template name="filecenter">
-  <view >
-    <u-navbar title="文件中心" :bgStatusImage="backPic0" :bgImage="backPic" :safeAreaInsetTop="true" leftIcon=""> </u-navbar>
-  <view class="container">
-    <view class="main">
-      <view class="u-page">
-      <u-subsection
-        :list="sectionList"
-        mode="subsection"
-        :current="curNow"
-        @change="sectionChange"
-      ></u-subsection>
-      <u-list>
-        <u-list-item
-          class="itemback"
-          v-for="(item, index) in fileData"
-          :key="index"
-        >
-          <view class="content flcard" @tap="openFile(item)">
-            <view
-              class="demo-layout bg-purple-light"
-              style="margin-bottom: 20rpx"
+  <view>
+    <u-navbar
+      title="文件中心"
+      :bgStatusImage="backPic0"
+      :bgImage="backPic"
+      :safeAreaInsetTop="true"
+      @leftClick="fileTreeShow"
+    >
+      <!-- <view class="u-nav-slot" slot="left">
+        <u-icon name="list" size="20"> </u-icon>
+      </view> -->
+    </u-navbar>
+    <!-- <view v-if="menushow" class="menupage">
+      <FileTreeMenu @menuClick="menuClick"></FileTreeMenu>
+    </view> -->
+    <view v-if="!menushow" class="container">
+      <view class="main">
+        <view class="fileArea" style="margin-top: 15px">
+          <view style="margin-top: 15px; margin-left: 10px" class="fileTitle"
+            >文件名称</view
+          >
+          <u-input
+            style="margin-top: 15px; border-color: #2a94ff"
+            v-model="fileName"
+            type="text"
+          ></u-input
+        ></view>
+        <view class="pickerArea">
+          <view class="btns">
+            <u-button
+              style="margin: 15px"
+              type="primary"
+              :text="fileType ? fileType : '选择文件类型'"
+              @click="pickershow = true"
+            ></u-button>
+            <u-button style="margin: 15px" type="primary" @click="searchFile"
+              >查询</u-button
+            >
+          </view>
+          <u-picker
+            :show="pickershow"
+            :columns="fileTypeList"
+            keyName="label"
+            @cancel="pickershow = false"
+            @confirm="selectFileType"
+          ></u-picker>
+        </view>
+        <view class="u-page">
+          <u-subsection
+            :list="sectionList"
+            mode="subsection"
+            :current="curNow"
+            @change="sectionChange"
+          ></u-subsection>
+          <u-list>
+            <u-list-item
+              class="itemback"
+              v-for="(item, index) in fileData"
+              :key="index"
             >
-              <view style="margin-top: 10rpx">
-                <text class="text-style1">{{ item.fileName }}</text>
+              <view class="content flcard" @tap="openFile(item)">
+                <view
+                  class="demo-layout bg-purple-light"
+                  style="margin-bottom: 20rpx"
+                >
+                  <view style="margin-top: 10rpx">
+                    <text class="text-style1">{{ item.fileName }}</text>
+                  </view>
+                </view>
+                <view class="datacard laiyuan">
+                  <view style="margin: 20rpx 20rpx">
+                    <text class="text-style">{{ item.fileSource }}</text>
+                  </view>
+                  <view style="margin: 20rpx 20rpx; font-size: small"
+                    >文件来源</view
+                  >
+                </view>
+                <view class="datacard zhuangtai">
+                  <view style="margin: 20rpx 20rpx">
+                    <text class="text-style">{{
+                      item.bpmStatus_dictText
+                    }}</text>
+                  </view>
+                  <view style="margin: 20rpx 20rpx; font-size: small"
+                    >审批状态</view
+                  >
+                </view>
+                <view class="datacard user">
+                  <view style="margin: 20rpx 20rpx">
+                    <text class="text-style">{{ item.createBy }}</text>
+                  </view>
+                  <view style="margin: 20rpx 20rpx; font-size: small"
+                    >创建人</view
+                  >
+                </view>
+                <view class="datacard time">
+                  <view style="margin: 20rpx 20rpx">
+                    <text class="text-style">{{ item.createTime }}</text>
+                  </view>
+                  <view style="margin: 20rpx 20rpx; font-size: small"
+                    >上传时间</view
+                  >
+                </view>
               </view>
-            </view>
-            <view class="datacard laiyuan">
-              <view style="margin: 20rpx 20rpx">
-                <text class="text-style">{{ item.fileSource }}</text>
+              <view class="btnClass">
+                <u-button
+                  class="btn"
+                  type="primary"
+                  shape="circle"
+                  text="审批详情"
+                  @click="detailmodal(item)"
+                ></u-button>
+                <u-button
+                  class="btn"
+                  type="primary"
+                  shape="circle"
+                  text="提交"
+                  @click="commitmodal(item)"
+                ></u-button>
+                <u-button
+                  class="btn"
+                  type="primary"
+                  shape="circle"
+                  text="撤回"
+                  @click="retractmodal(item)"
+                ></u-button>
+                <u-button
+                  class="btn"
+                  type="primary"
+                  shape="circle"
+                  text="下载"
+                  @click="download(item)"
+                ></u-button>
+                <u-button
+                  class="btn"
+                  type="primary"
+                  shape="circle"
+                  text="删除"
+                  @click="showmodal(item)"
+                ></u-button>
               </view>
-              <view style="margin: 20rpx 20rpx; font-size: small"
-                >文件来源</view
-              >
-            </view>
-            <view class="datacard zhuangtai">
-              <view style="margin: 20rpx 20rpx">
-                <text class="text-style">{{ item.bpmStatus_dictText }}</text>
+            </u-list-item>
+          </u-list>
+          <!-- 审批详情 -->
+          <u-popup
+            :show="detailShow"
+            :closeable="true"
+            :round="10"
+            mode="bottom"
+            @close="detailClose"
+          >
+            <view>
+              <view class="title">
+                <span class="firetext">流程审批进度历史</span>
               </view>
-              <view style="margin: 20rpx 20rpx; font-size: small"
-                >审批状态</view
-              >
-            </view>
-            <view class="datacard user">
-              <view style="margin: 20rpx 20rpx">
-                <text class="text-style">{{ item.createBy }}</text>
+              <view class="table-container">
+                <view class="table">
+                  <view class="table-header">
+                    <view class="table-cell">序号</view>
+                    <view class="table-cell">当前环节</view>
+                    <view class="table-cell">审批人</view>
+                    <view class="table-cell">审批结果</view>
+                    <view class="table-cell">审批开始时间</view>
+                    <view class="table-cell">审批结束时间</view>
+                    <view class="table-cell">处理意见</view>
+                    <view class="table-cell">状态</view>
+                    <!-- ... 根据需要添加更多表头 -->
+                  </view>
+                  <view
+                    class="table-row"
+                    v-for="(item, index) in tableData"
+                    :key="index"
+                  >
+                    <view class="table-cell"
+                      ><template>
+                        <span>{{ index + 1 }}</span>
+                      </template></view
+                    >
+                    <view class="table-cell">{{ item.name }}</view>
+                    <view class="table-cell">
+                      <template>
+                        <span
+                          v-if="item.assignees && item.assignees.length > 0"
+                        >
+                          {{ item.assignees[0].username }}
+                        </span>
+                        <!-- 如果没有审批人,可以显示空或占位符 -->
+                        <span v-else> - </span>
+                      </template></view
+                    >
+                    <view class="table-cell">{{ item.deleteReason }}</view>
+                    <view class="table-cell">{{ item.createTime }}</view>
+                    <view class="table-cell">{{ item.endTime }}</view>
+                    <view class="table-cell">{{ item.comment }}</view>
+                    <view class="table-cell">
+                      <template>
+                        <span v-if="item.assignees[0].isExecutor">
+                          已处理
+                        </span>
+                        <!-- 如果没有审批人,可以显示空或占位符 -->
+                        <span v-else> 待处理</span>
+                      </template></view
+                    >
+                    <!-- ... 根据需要添加更多单元格 -->
+                  </view>
+                </view>
               </view>
-              <view style="margin: 20rpx 20rpx; font-size: small">创建人</view>
             </view>
-            <view class="datacard time">
-              <view style="margin: 20rpx 20rpx">
-                <text class="text-style">{{ item.createTime }}</text>
+            <view>
+              <view class="title">
+                <span class="firetext">实时流程图</span>
               </view>
-              <view style="margin: 20rpx 20rpx; font-size: small"
-                >上传时间</view
-              >
+              <image style="width: 100%" :src="imageUrl" alt="" />
             </view>
-          </view>
-          <view class="btnClass">
-            <u-button
-              class="btn"
-              type="primary"
-              shape="circle"
-              text="审批详情"
-              @click="detailmodal(item)"
-            ></u-button>
-            <u-button
-              class="btn"
-              type="primary"
-              shape="circle"
-              text="提交"
-              @click="commitmodal(item)"
-            ></u-button>
-            <u-button
-              class="btn"
-              type="primary"
-              shape="circle"
-              text="撤回"
-              @click="retractmodal(item)"
-            ></u-button>
-            <u-button
-              class="btn"
-              type="primary"
-              shape="circle"
-              text="下载"
-              @click="download(item)"
-            ></u-button>
-            <u-button
-              class="btn"
-              type="primary"
-              shape="circle"
-              text="删除"
-              @click="showmodal(item)"
-            ></u-button>
-          </view>
-        </u-list-item>
-      </u-list>
-      <!-- 审批详情 -->
-      <u-popup
-        :show="detailShow"
-        :closeable="true"
-        :round="10"
-        mode="bottom"
-        @close="detailClose"
-      >
-        <view>
-          <view class="title">
-            <span class="firetext">流程审批进度历史</span>
-          </view>
-          <view class="table-container">
-            <view class="table">
-              <view class="table-header">
-                <view class="table-cell">序号</view>
-                <view class="table-cell">当前环节</view>
-                <view class="table-cell">审批人</view>
-                <view class="table-cell">审批结果</view>
-                <view class="table-cell">审批开始时间</view>
-                <view class="table-cell">审批结束时间</view>
-                <view class="table-cell">处理意见</view>
-                <view class="table-cell">状态</view>
-                <!-- ... 根据需要添加更多表头 -->
-              </view>
-              <view
-                class="table-row"
-                v-for="(item, index) in tableData"
-                :key="index"
+          </u-popup>
+          <!-- 删除 -->
+          <u-modal
+            :show="show"
+            :showCancelButton="true"
+            :showConfirmButton="true"
+            :content="content"
+            @confirm="confirm"
+            @cancel="cancel"
+          ></u-modal>
+          <!-- 提交 -->
+          <u-picker
+            :show="commitShow"
+            :columns="[columns]"
+            title="选择审批"
+            @confirm="confirmCommit"
+            @cancel="cancelCommit"
+          ></u-picker>
+          <!-- 撤回 -->
+          <u-popup
+            :show="showretract"
+            :closeable="true"
+            :round="10"
+            mode="bottom"
+            @close="close"
+          >
+            <view>
+              <u--textarea
+                v-model="value1"
+                placeholder="请输入撤回原因"
+              ></u--textarea>
+            </view>
+            <view class="button-container">
+              <u-button @click="cancelRetract" shape="circle">取消</u-button>
+              <u-button @click="confirmRetract" shape="circle" type="primary"
+                >确认</u-button
               >
-                <view class="table-cell"
-                  ><template>
-                    <span>{{ index + 1 }}</span>
-                  </template></view
-                >
-                <view class="table-cell">{{ item.name }}</view>
-                <view class="table-cell">
-                  <template>
-                    <span v-if="item.assignees && item.assignees.length > 0">
-                      {{ item.assignees[0].username }}
-                    </span>
-                    <!-- 如果没有审批人,可以显示空或占位符 -->
-                    <span v-else> - </span>
-                  </template></view
-                >
-                <view class="table-cell">{{ item.deleteReason }}</view>
-                <view class="table-cell">{{ item.createTime }}</view>
-                <view class="table-cell">{{ item.endTime }}</view>
-                <view class="table-cell">{{ item.comment }}</view>
-                <view class="table-cell">
-                  <template>
-                    <span v-if="item.assignees[0].isExecutor"> 已处理 </span>
-                    <!-- 如果没有审批人,可以显示空或占位符 -->
-                    <span v-else> 待处理</span>
-                  </template></view
-                >
-                <!-- ... 根据需要添加更多单元格 -->
-              </view>
             </view>
-          </view>
-        </view>
-        <view>
-          <view class="title">
-            <span class="firetext">实时流程图</span>
-          </view>
-          <image style="width: 100%" :src="imageUrl" alt="" />
-        </view>
-      </u-popup>
-      <!-- 删除 -->
-      <u-modal
-        :show="show"
-        :showCancelButton="true"
-        :showConfirmButton="true"
-        :content="content"
-        @confirm="confirm"
-        @cancel="cancel"
-      ></u-modal>
-      <!-- 提交 -->
-      <u-picker
-        :show="commitShow"
-        :columns="[columns]"
-        title="选择审批"
-        @confirm="confirmCommit"
-        @cancel="cancelCommit"
-      ></u-picker>
-      <!-- 撤回 -->
-      <u-popup
-        :show="showretract"
-        :closeable="true"
-        :round="10"
-        mode="bottom"
-        @close="close"
-      >
-        <view>
-          <u--textarea
-            v-model="value1"
-            placeholder="请输入撤回原因"
-          ></u--textarea>
+          </u-popup>
+          <u-notify
+            message="只有审批中的数据才能撤回!"
+            :show="notifyShow"
+            :duration="1000"
+          ></u-notify>
         </view>
-        <view class="button-container">
-          <u-button @click="cancelRetract" shape="circle">取消</u-button>
-          <u-button @click="confirmRetract" shape="circle" type="primary"
-            >确认</u-button
-          >
-        </view>
-      </u-popup>
-      <u-notify
-        message="只有审批中的数据才能撤回!"
-        :show="notifyShow"
-        :duration="1000"
-      ></u-notify>
-    </view>
-    </view>
+      </view>
     </view>
   </view>
 </template>
@@ -215,8 +266,11 @@
 <script>
 import api from "@/api/api";
 import configService from "../../common/service/config.service";
+import FileTreeMenu from "./treeMenu/fileTreeMenu.vue";
 export default {
-  components: {},
+  components: {
+    FileTreeMenu,
+  },
   name: "filecenter",
   watch: {},
   data() {
@@ -228,6 +282,22 @@ export default {
         { name: "待审批", code: 1 },
         { name: "已审批", code: 2 },
       ],
+      fileTypeList: [
+        [
+          { label: ".txt", value: "txt" },
+          { label: ".doc", value: "doc" },
+          { label: ".docx", value: "docx" },
+          { label: ".xls", value: "xls" },
+          { label: ".xlsx", value: "xlsx" },
+          { label: ".ppt", value: "ppt" },
+          { label: ".pptx", value: "pptx" },
+          { label: ".jpg", value: "jpg" },
+          { label: ".png", value: "png" },
+          { label: ".pdf", value: "pdf" },
+        ],
+      ],
+      fileType: "", //文件类型
+      pickershow: false,
       curNow: 0,
       fileData: [],
       bpmStatus: 1, //1处理中  2 已完成  3 已驳回
@@ -246,6 +316,8 @@ export default {
       tableData: [], //审批内容
       detailItem: "", //详情文件
       imageUrl: "",
+      fileName: "", //文件名称搜索框
+      menushow: false,
     };
   },
   mounted() {
@@ -253,27 +325,63 @@ export default {
   },
   computed: {},
   methods: {
+    fileTreeShow(e) {
+      this.menushow = !this.menushow;
+    },
+    menuClick(id) {
+      this.menushow = false;
+    },
+    //选择文件类型
+    selectFileType(e) {
+      this.pickershow = false;
+      this.fileType = e.value[0].label;
+    },
+    //根据条件查询相关文件
+    searchFile() {
+      this.getFileInfo();
+    },
     sectionChange(newVal) {
       this.curNow = newVal;
       if (this.curNow === 0) {
         // 如果选择了“全部”,返回所有文件
         this.bpmStatus = "";
-        this.getFileInfo(this.bpmStatus);
+        this.getFileInfo();
       } else if (this.curNow === 1) {
         // 否则,根据curNow的值过滤文件
         this.bpmStatus = 1;
-        this.getFileInfo(this.bpmStatus);
+        this.getFileInfo();
       } else if (this.curNow === 2) {
         this.bpmStatus = 2;
-        this.getFileInfo(this.bpmStatus);
+        this.getFileInfo();
       }
     },
-    getFileInfo(code) {
+    getTreeList() {
+      var params = { parentId: "" };
+      new Promise((resolve, reject) => {
+        api
+          .getFileInfo(params)
+          .then((response) => {
+            if (response.data.code == 200) {
+              let data = response.data.result.records;
+              let datas = data.filter((v) => v.fileType == null);
+              let list = list2trees(datas);
+              listArr.push(...list);
+            } else {
+              reject(response);
+            }
+          })
+          .catch((error) => {
+            console.log("catch===>response", response);
+            reject(error);
+          });
+      });
+    },
+    getFileInfo() {
       var params = {
-        bpmStatus: code,
+        bpmStatus: this.bpmStatus,
         column: "createTime",
-        fileSuffix: "",
-        likeFileName: "",
+        fileSuffix: this.fileType,
+        likeFileName: this.fileName,
         pageNo: 1,
         pageSize: 10000,
         parentId: "",
@@ -533,6 +641,22 @@ export default {
 </script>
 
 <style scoped>
+.fileTitle {
+  margin-right: 20px;
+  line-height: 40px;
+}
+.fileArea,
+.pickerArea {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-around;
+}
+.btns {
+  width: 100%;
+  display: flex;
+  flex-direction: row;
+  justify-content: space-around;
+}
 .button-container {
   display: flex;
   justify-content: space-between;
@@ -547,9 +671,10 @@ button {
   border-radius: 5px;
   cursor: pointer;
 }
+.container {
+  margin-top: 30px;
+}
 .main {
-  /* margin-top: 100rpx; */
-  /* margin-top: 80px; */
   display: flex;
   flex-direction: column;
 }

+ 149 - 2
pages/home/detail/autodoor/autodoor.vue

@@ -75,7 +75,6 @@
             :gatestate1="frontGateStatus"
             :gatestate2="midGateStatus"
             :gatestate3="rearGateStatus"
-            :cameralist="cameralist"
             :height="height"
             :doorcount="ndoorcount"
           ></doorAnimate>
@@ -132,6 +131,67 @@
             :windowcount="nwindownum"
           ></windowAnimate>
         </div>
+        <div
+          class="flcard"
+          style="height: calc(100vh - 80px); overflow-y: auto; padding: 0px"
+        >
+          <u-row
+            :gutter="0"
+            v-for="(row, index) in rows"
+            style="width: calc(100vw - 50px); float: left"
+            :key="index"
+          >
+            <!-- 循环所有摄像头,根据摄像头个数分行分列 -->
+            <!-- 分列 -->
+            <u-col
+              :span="24"
+              v-for="(item, subindex) in row.list"
+              :key="subindex"
+              style="margin-top: 5px; margin-bottom: 5px"
+              :style="'height:' + height"
+            >
+              <!-- 摄像头标题显示 -->
+              <u-row>
+                <view class="videotitle">
+                  <span>{{ item.name }}</span
+                  ><span v-if="item.netStatus == 0">【网络断开】</span>
+                </view>
+              </u-row>
+
+              <!-- 摄像头展示 -->
+              <view
+                v-if="item.devicekind == 'flv'"
+                style="width: 100%; height: 100%; text-align: center"
+              >
+                <video
+                  :id="'cameraElement' + item.id"
+                  muted
+                  autoplay
+                  controls
+                  width="100%"
+                  height="100%"
+                ></video>
+              </view>
+              <!-- 海康控件展示 -->
+              <iframe
+                v-if="item.devicekind == 'hk'"
+                ref="iframe"
+                frameborder="0"
+                scrolling="yes"
+                style="
+                  z-index: -1;
+                  background-color: transparent;
+                  width: 100%;
+                  height: 100%;
+                  top: 0;
+                  left: 0;
+                  bottom: 0;
+                "
+                :src="item.showurl"
+              ></iframe>
+            </u-col>
+          </u-row>
+        </div>
         <div class="flcard">
           <div class="flex-container">
             <div
@@ -290,6 +350,7 @@ import windowAnimate from "../windowAnimate/windowAnimate.vue";
 import windrectAnimate from "../windrectAnimate/windrectAnimate.vue";
 import fanlocalAnimate from "../fanlocalAnimate/fanlocalAnimate2.vue";
 import fanmainAnimate from "../fanmainAnimate/fanmainAnimate.vue";
+import flvjs from "flv.js";
 export default {
   data() {
     return {
@@ -332,6 +393,12 @@ export default {
       fan2State: "",
       deviceid: "", //ID
       cameralist: [], //摄像数据
+      rows: [], //分行
+      flvPlayer: [],
+      num: 1, //摄像头个数
+      columnNum: 1, //列数
+      columSpan: 24, //列块
+      cameraType: "",
     };
   },
   onLoad(query) {
@@ -462,7 +529,8 @@ export default {
           .then((response) => {
             if (response.data.code == 200) {
               if (response.data.result.records.length > 0) {
-                this.cameralist = response.data.result.records[0];
+                this.cameralist = response.data.result.records;
+                this.initData();
               }
             } else {
               resolve(response);
@@ -473,6 +541,69 @@ export default {
           });
       });
     },
+    initData() {
+      this.num = this.cameralist.length;
+      // 根据总数量  设置行数、列数
+      // 分行分列
+      this.setRows();
+      // if (this.cameraType == "flv") {
+      if (this.cameralist.length > 0) {
+        setTimeout(() => {
+          this.cameralist.forEach((element) => {
+            if (element.netStatus == 1)
+              // 根据id设置每个播放摄像头的地址
+              this.setVideoUrl(element, element.id);
+          });
+        }, 1000);
+        // }
+      }
+      // }
+    },
+
+    // 根据id设置每个播放摄像头的地址
+    setVideoUrl(element, id) {
+      if (flvjs.isSupported()) {
+        var videourl = element.ip;
+        if (videourl == null || videourl.indexOf("http") == -1)
+          videourl = configUrl.getCameraFLV() + id + ".flv";
+        var videoElement = document.getElementById("cameraElement" + id);
+        // 控件设置地址信息
+        var vdo = flvjs.createPlayer({
+          type: "flv",
+          url: videourl,
+        });
+        // 控件绑定
+        vdo.attachMediaElement(videoElement);
+        vdo.load();
+        // 播放
+        vdo.play();
+        this.flvPlayer.push(vdo);
+      }
+    },
+
+    // 每行摄像头分列
+    setRows() {
+      this.rows = [];
+      var index = 0;
+      // 循环行
+      for (var i = 0; i < this.cameralist.length; i++) {
+        // 一行
+        var row1 = {};
+        var rowlist = [];
+        // 根据摄像头信息设置每个摄像头的访问地址
+        if (index == 0)
+          this.cameralist[i].showurl =
+            this.cameralist[i].showurl + "&checkComponent=1";
+        // 每行摄像头信息
+        rowlist.push(this.cameralist[i]);
+        index++;
+        row1.index = i;
+        row1.list = rowlist;
+        // 摄像头行数
+        this.rows.push(row1);
+        console.log(this.rows, "1111111111111111");
+      }
+    },
     //设备控制
     ctrlDevice(pass) {
       let IDString = String(this.itemId); // 将 ID 转换为字符串
@@ -517,11 +648,27 @@ export default {
   destroyed() {
     // 停止定时器
     this.stopTimer();
+    // 控件清除缓存
+    this.flvPlayer.forEach((element) => {
+      element.pause();
+      element.unload();
+      element.detachMediaElement();
+      element.destroy();
+      element = null;
+    });
   },
 };
 </script>
 
 <style lang="scss" scoped>
+.videotitle {
+  z-index: 2;
+  position: absolute;
+  top: 0px;
+  top: 10px;
+  right: 10px;
+  font-size: 16px;
+}
 .top-nav {
   background-image: url(../../../../static/topnavbar.png);
   background-size: cover; /* 背景图片大小适应 */

+ 8 - 48
pages/home/detail/doorAnimate/doorAnimate.vue

@@ -28,18 +28,7 @@
             id="rightdoor1"
           ></div>
         </div>
-        <div>
-          <!-- <video
-            v-if="item.type == 'flv'"
-            :id="'cameraElement' + item.id"
-            muted
-            autoplay
-            controls
-            width="100%"
-            height="100%"
-            style="width: 100%"
-          ></video> -->
-        </div>
+        <div></div>
       </div>
       <div style="" v-show="doorcount == 2">
         <div class="door2" v-show="doorcount == 2" :style="{ height: height }">
@@ -94,9 +83,6 @@
             id="rightdoor3"
           ></div>
         </div>
-        <div>
-          <!-- <view class="video-js flex" ref="video"> </view> -->
-        </div>
       </div>
       <div style="" v-show="doorcount == 3">
         <div class="door3" v-show="doorcount == 3" :style="{ height: height }">
@@ -313,14 +299,18 @@
 </template>
 
 <script>
-// import FlvJs from 'flv.js';
 export default {
   data() {
     return {
+      rows: [], //分行
       height: "200px",
       videoDeviceId: "",
-      flvPlayer: "",
+      flvPlayer: [],
       VideoDeviceUrl: "",
+      videoList: [],
+      num: 1, //摄像头个数
+      columnNum: 1, //列数
+      columSpan: 24, //列块
     };
   },
   props: [
@@ -331,33 +321,7 @@ export default {
     "doorcount",
     "cameralist",
   ],
-  methods: {
-    initData(val) {},
-    // videoPush: function () {
-    //   var video = document.createElement("video");
-    //   video.id = "video";
-    //   video.style = "width: 100%;";
-    //   video.controls = true;
-    //   this.flvPlayer = flvjs.createPlayer({
-    //     type: "flv",
-    //     isLive: true,
-    //     url: this.VideoDeviceUrl,
-    //   });
-    //   this.flvPlayer.attachMediaElement(video);
-    //   this.flvPlayer.load();
-    //   this.flvPlayer.play();
-    //   this.$refs.video.$el.appendChild(video);
-    // },
-
-    // //注销视频
-    // flv_destroy() {
-    //   this.flvPlayer.pause();
-    //   this.flvPlayer.unload();
-    //   this.flvPlayer.detachMediaElement();
-    //   this.flvPlayer.destroy();
-    //   this.flvPlayer = null;
-    // },
-  },
+  methods: {},
   watch: {
     doorcount(val) {
       if (val == 1) {
@@ -373,11 +337,7 @@ export default {
         this.height = "180px";
       }
     },
-    cameralist(val) {
-      this.initData(val);
-    },
   },
-  onUnload() {},
 };
 </script>
 

+ 818 - 0
pages/home/detail/fanmainAnimate/fanmainAnimate.vue

@@ -0,0 +1,818 @@
+<template>
+  <!-- 新的主通机动画 -->
+  <view style="width: 100%; height: 100%">
+    <div class="pageback">
+      <!-- 动画展示 -->
+      <div style="z-index: 33; height: 100%">
+        <div class="ventilate" id="topPic">
+          <!-- 进风箭头 -->
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic1-10'
+                    : reverseVal + 'arrowpic1'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic1-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic1-11'
+                    : reverseVal + 'arrowpic1-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic1-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic1"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic2-10'
+                    : reverseVal + 'arrowpic2'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic2-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic2-11'
+                    : reverseVal + 'arrowpic2-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic2-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic2"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic3-10'
+                    : reverseVal + 'arrowpic3'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic3-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic3-11'
+                    : reverseVal + 'arrowpic3-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic3-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic3"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic4-10'
+                    : reverseVal + 'arrowpic4'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic4-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic4-11'
+                    : reverseVal + 'arrowpic4-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic4-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic4"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic5-10'
+                    : reverseVal + 'arrowpic5'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic5-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic5-11'
+                    : reverseVal + 'arrowpic5-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic5-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic5"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic6-10'
+                    : reverseVal + 'arrowpic6'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic6-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic6-11'
+                    : reverseVal + 'arrowpic6-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic6-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic6"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic7-10'
+                    : reverseVal + 'arrowpic7'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic7-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic7-11'
+                    : reverseVal + 'arrowpic7-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic7-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic7"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic8-10'
+                    : reverseVal + 'arrowpic8'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic8-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic8-11'
+                    : reverseVal + 'arrowpic8-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic8-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic8"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic9-10'
+                    : reverseVal + 'arrowpic9'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic9-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic9-11'
+                    : reverseVal + 'arrowpic9-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic9-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic9"
+          ></div>
+          <div
+            :class="[
+              nowfengji == '1'
+                ? door1 == 1
+                  ? topdoor1 == 1
+                    ? reverseVal + 'arrowpic10-10'
+                    : reverseVal + 'arrowpic10'
+                  : topdoor1 == 1
+                  ? reverseVal + 'arrowpic10-3'
+                  : ''
+                : nowfengji == '2'
+                ? door2 == 1
+                  ? topdoor2 == 1
+                    ? reverseVal + 'arrowpic10-11'
+                    : reverseVal + 'arrowpic10-2'
+                  : topdoor2 == 1
+                  ? reverseVal + 'arrowpic10-4'
+                  : ''
+                : '',
+            ]"
+            id="arrowpic10"
+          ></div>
+
+          <!-- 风扇动画展示 -->
+          <!-- 巷道门阀 -->
+
+          <div
+            id="topdoor1"
+            class="doordivb"
+            style="width: 1%; height: 40%; top: 3%; left: 71%"
+          >
+            <div id="topdoor" :class="[door1 == 1 ? 'door1' : 'door2']"></div>
+          </div>
+          <div
+            id="bottomdoor1"
+            class="doordivb"
+            style="width: 1%; height: 46%; top: 54.3%; left: 72%"
+          >
+            <div
+              id="bottomdoor"
+              :class="[door2 == 1 ? 'door1' : 'door2']"
+            ></div>
+          </div>
+
+          <!-- 天窗 -->
+          <div
+            id="topwindow1"
+            class="topwindow"
+            style="width: 3%; height: 19%; top: 2%; left: 66.9%; z-index: 10"
+          >
+            <div
+              id="topwindow"
+              :class="[
+                nowfengji == '1' && topdoor1 == 1 ? 'topwindow1' : 'topwindow2',
+              ]"
+            ></div>
+          </div>
+          <div
+            id="topwindow2"
+            class="topwindow"
+            style="width: 3%; height: 19%; top: 53%; left: 67%; z-index: 10"
+          >
+            <div
+              id="topwindow"
+              :class="[
+                nowfengji == '2' && topdoor2 ? 'topwindow1' : 'topwindow2',
+              ]"
+            ></div>
+          </div>
+          <!-- <div class="box-left" style="width:5.5%;height:14%;top: 15%;left: 20%;"></div> -->
+          <div
+            class="box"
+            style="top: 12.2%; left: 30.4%"
+            v-if="groupType != 'lh' && groupType !== 'wlyk'"
+          >
+            <div id="box2" :class="reverseVal ? 'fz' : 'zz'">
+              <span></span>
+              <span></span>
+              <span></span>
+              <span></span>
+            </div>
+            <!-- <div class="box-right" style="width:6%;height:14%;top: 15%;left:32%;"> -->
+            <!-- 风机旁边阀门 -->
+          </div>
+          <div
+            class="box-s"
+            style="top: 12.2%; left: 34.5%"
+            :style="
+              groupType != 'lh' && groupType !== 'wlyk'
+                ? 'top: 12.2%;left: 34.5%;'
+                : 'top: 12.2%;left: 32.5%;'
+            "
+          >
+            <div id="box2-s" :class="reverseVal ? 'fz1' : 'zz1'">
+              <span></span>
+              <span></span>
+              <span></span>
+              <span></span>
+            </div>
+          </div>
+          <!-- <div class="box-left" style="width:5.5%;height:14%;top: 80%;left: 20%;"></div> -->
+          <div
+            class="box"
+            style="bottom: 11.7%; left: 27.8%"
+            v-if="groupType != 'lh' && groupType !== 'wlyk'"
+          >
+            <div id="box1" :class="reverseVal ? 'fz' : 'zz'">
+              <span></span>
+              <span></span>
+              <span></span>
+              <span></span>
+            </div>
+          </div>
+          <!-- 蝶阀 -->
+          <div
+            id="topfundoor1"
+            class="fundoor"
+            style="width: 3%; height: 36%; left: 45.9%; z-index: 10; top: 6.6%"
+          >
+            <div
+              id="topfundoor"
+              :class="[
+                nowfengji == '1' && fundoor1 == 1 ? 'fundoor1' : 'fundoor2',
+              ]"
+            ></div>
+          </div>
+          <div
+            id="bottomfundoor1"
+            class="fundoor"
+            style="width: 3%; height: 36%; left: 44%; z-index: 10; top: 57%"
+          >
+            <div
+              id="bottomfundoor"
+              :class="[
+                nowfengji == '2' && fundoor2 == 1 ? 'fundoor1' : 'fundoor2',
+              ]"
+            ></div>
+          </div>
+          <!-- 风机 -->
+          <!-- <div class="box-right" style="width:6%;height:14%;top: 80%;left:32.5%;"> -->
+          <div
+            class="box-s"
+            style="bottom: 11.7%; left: 32.4%"
+            :style="
+              groupType != 'lh' && groupType !== 'wlyk'
+                ? 'bottom: 11.7%;left:32.4%;'
+                : 'bottom: 11.7%;left:30.4%;'
+            "
+          >
+            <div id="box1-s" :class="reverseVal ? 'fz1' : 'zz1'">
+              <span></span>
+              <span></span>
+              <span></span>
+              <span></span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <!-- 文字标识 -->
+      <div
+        style="
+          position: absolute;
+          color: #fff;
+          top: 20%;
+          left: 10%;
+          color: #ff0;
+        "
+      >
+        <span>1号电机</span>
+      </div>
+      <div
+        style="
+          position: absolute;
+          color: #fff;
+          top: 20%;
+          left: 39%;
+          color: #ff0;
+        "
+      >
+        <span>2号电机</span>
+      </div>
+      <div
+        style="
+          position: absolute;
+          color: #fff;
+          color: #ff0;
+          bottom: 57%;
+          left: 10%;
+        "
+      >
+        <span>1号电机</span>
+      </div>
+      <div
+        style="
+          position: absolute;
+          color: #fff;
+          bottom: 57%;
+          left: 38%;
+          color: #ff0;
+        "
+      >
+        <span>2号电机</span>
+      </div>
+      <div style="position: absolute; color: #fff; bottom: -3.7%; left: 28.4%">
+        <span v-if="topindex == 2">1#风机</span>
+        <span v-if="topindex == 1">2#风机</span>
+      </div>
+      <div style="position: absolute; color: #fff; bottom: 45.7%; left: 31.4%">
+        <span v-if="topindex == 2">2#风机</span>
+        <span v-if="topindex == 1">1#风机</span>
+      </div>
+      <!-- 风筒风速传感器 -->
+      <div class="imgF1"></div>
+      <div class="imgF2"></div>
+    </div>
+  </view>
+</template>
+<script>
+export default {
+  components: {},
+  data: function () {
+    return {
+      fengliangUp: "", // 风量上限
+      fengliangDown: "", // 风量下限
+      controTypeName: "变频器频率",
+      // 界面风机动画
+
+      // 控制类型 1 变频器频率 2 需风量
+      controlType: "1",
+      loading: "", // 数据加载
+      yMax1: 100,
+      yMax2: 10,
+      yMax3: 1000,
+      topindex: 1,
+      textColor: "#000",
+      option1: {},
+      nowfengji: "",
+      reverseVal: "",
+    };
+  },
+  props: [
+    "door1",
+    "topdoor1",
+    "fundoor1",
+    "door2",
+    "topdoor2",
+    "fundoor2",
+    "groupType",
+    "fanMsStatus",
+  ],
+  created() {
+    // this.myInterval()
+  },
+  watch: {
+    fanMsStatus(val) {
+      if (val == false) {
+        this.reverseVal = "reverse-";
+      } else {
+        this.reverseVal = "";
+      }
+    },
+  },
+  // 获取第一页实时数据
+  beforeMount: function (e) {
+    var than = this;
+  },
+  methods: {
+    // 顶部风机序号值
+    setTopIndex(val) {
+      this.topindex = val;
+    },
+    // 根据当前运行分机,设置动画
+    setQidongfengji(val) {
+      if (this.nowfengji != val) {
+        this.nowfengji = val;
+        this.setFengjiDonghua();
+      }
+    },
+    // 风机动画
+    setFengjiDonghua() {
+      if (this.nowfengji == "2") {
+        if (configUrl.group != "lh") {
+          document.getElementById("box1").style.animationPlayState = "running";
+          document.getElementById("box1").style.WebkitAnimationPlayState =
+            "running";
+          document.getElementById("box2").style.animationPlayState = "paused";
+          document.getElementById("box2").style.WebkitAnimationPlayState =
+            "paused";
+        }
+        document.getElementById("box1-s").style.animationPlayState = "running";
+        document.getElementById("box1-s").style.WebkitAnimationPlayState =
+          "running";
+
+        document.getElementById("box2-s").style.animationPlayState = "paused";
+        document.getElementById("box2-s").style.WebkitAnimationPlayState =
+          "paused";
+      } else if (this.nowfengji == "1") {
+        if (configUrl.group != "lh") {
+          document.getElementById("box2").style.animationPlayState = "running";
+          document.getElementById("box2").style.WebkitAnimationPlayState =
+            "running";
+          document.getElementById("box1").style.animationPlayState = "paused";
+          document.getElementById("box1").style.WebkitAnimationPlayState =
+            "paused";
+        }
+        document.getElementById("box2-s").style.animationPlayState = "running";
+        document.getElementById("box2-s").style.WebkitAnimationPlayState =
+          "running";
+        document.getElementById("box1-s").style.animationPlayState = "paused";
+        document.getElementById("box1-s").style.WebkitAnimationPlayState =
+          "paused";
+      } else {
+        document.getElementById("box2").style.animationPlayState = "paused";
+        document.getElementById("box2").style.WebkitAnimationPlayState =
+          "paused";
+        document.getElementById("box2-s").style.animationPlayState = "paused";
+        document.getElementById("box2-s").style.WebkitAnimationPlayState =
+          "paused";
+        document.getElementById("box1").style.animationPlayState = "paused";
+        document.getElementById("box1").style.WebkitAnimationPlayState =
+          "paused";
+        document.getElementById("box1-s").style.animationPlayState = "paused";
+        document.getElementById("box1-s").style.WebkitAnimationPlayState =
+          "paused";
+      }
+    },
+  },
+  computed: {},
+  mounted() {},
+  destroyed() {},
+};
+</script>
+
+<style scoped>
+div.pageback {
+  padding-top: 10px;
+  margin-top: 12px;
+  width: 100vw;
+  height: calc(60% - 50px);
+  min-height: 350px;
+  background-image: url(/static/mainfan/page-back.png);
+  background-size: 100% 100%;
+}
+div.ventilate {
+  margin-top: 12px;
+  width: calc(100vw - 20px);
+  height: calc(60% - 50px);
+  min-height: 330px;
+  background-image: url(/static/mainfan/main_ventilate_new.png);
+  background-size: 100% 100%;
+  perspective: 800px;
+}
+</style>
+<style scoped>
+@media screen and (max-width: 4096px) {
+  .box {
+    position: absolute;
+    transform: perspective(1000px) rotateY(-23deg);
+    width: 1%;
+    height: 20%;
+    transform-style: preserve-3d;
+  }
+  .box-s {
+    position: absolute;
+    transform: perspective(1000px) rotateY(-23deg);
+    width: 1%;
+    height: 20%;
+    transform-style: preserve-3d;
+  }
+}
+@media screen and (min-width: 4096px) {
+  .box {
+    position: absolute;
+    transform: perspective(1000px) rotateY(21deg);
+    width: 1%;
+    height: 20%;
+    transform-style: preserve-3d;
+  }
+  .box-s {
+    position: absolute;
+    transform: perspective(1000px) rotateY(21deg);
+    width: 1%;
+    height: 20%;
+    transform-style: preserve-3d;
+  }
+}
+.doordivb {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  /* background-image: url(/static/aminfandoor-new-1.png); */
+  background-size: 100% 100%;
+}
+.door1 {
+  position: absolute;
+  transform: scaleX(0.1) scaleY(0.5);
+  width: 100%;
+  height: 100%;
+  top: -2px;
+  left: 0px;
+  transition: all 2s ease;
+  transform-origin: 100% 100%;
+  background-image: url(/static/mainfan/fun-door-new-1.png);
+  background-size: 100% 100%;
+}
+.door2 {
+  position: absolute;
+  transform: scaleX(1) scaleY(1);
+  width: 100%;
+  height: 100%;
+  top: -2px;
+  left: 0px;
+  transition: all 2s ease;
+  transform-origin: 100% 100%;
+  background-image: url(/static/mainfan/fun-door-new-1.png);
+  background-size: 100% 100%;
+}
+.fundoor {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-image: url(/static/mainfan/fun-door-new-1.png);
+  background-size: 100% 100%;
+}
+.fundoor1 {
+  position: absolute;
+  transform: scaleX(0);
+  width: 100%;
+  height: 100%;
+  top: 1px;
+  left: 1px;
+  transition: all 2s ease;
+  background-image: url(/static/mainfan/fun-door-new-2.png);
+  background-size: 100% 100%;
+}
+.fundoor2 {
+  position: absolute;
+  transform: scaleX(1);
+  width: 100%;
+  height: 100%;
+  top: 1px;
+  left: 1px;
+  transition: all 2s ease;
+  background-image: url(/static/mainfan/fun-door-new-2.png);
+  background-size: 100% 100%;
+}
+.topwindow {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  /* background-image: url(../././assets/img/topwindow-1.png); */
+  background-size: 100% 100%;
+}
+.topwindow1 {
+  position: absolute;
+  transform: scaleY(0.05);
+  width: 100%;
+  height: 100%;
+  top: 0px;
+  left: 0px;
+  transition: all 2s ease;
+  transform-origin: 100% 0%;
+  background-image: url(/static/mainfan/topwindow-new-2.png);
+  background-size: 100% 100%;
+}
+.topwindow2 {
+  position: absolute;
+  transform: scaleY(1);
+  width: 100%;
+  height: 100%;
+  top: 0px;
+  left: 0px;
+  transition: all 2s ease;
+  transform-origin: 100% 0%;
+  background-image: url(/static/mainfan/topwindow-new-2.png);
+  background-size: 100% 100%;
+}
+.box::before,
+.box-s::before {
+  content: "";
+  position: absolute;
+  bottom: -20px;
+  left: 0;
+  width: 50%;
+  height: 10px;
+  background: #000;
+  filter: blur(10px);
+  opacity: 0.6;
+  transform: rotateX(90deg);
+}
+.box .zz {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  transform-style: preserve-3d;
+  animation: animate 5s linear infinite;
+  animation-play-state: paused;
+  -webkit-animation-play-state: paused;
+}
+.box .fz {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  transform-style: preserve-3d;
+  animation: animateFz 5s linear infinite;
+  animation-play-state: paused;
+  -webkit-animation-play-state: paused;
+}
+.box-s .zz1 {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  transform-style: preserve-3d;
+  animation: animate2 5s linear infinite;
+  animation-play-state: paused;
+  -webkit-animation-play-state: paused;
+}
+.box-s .fz1 {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  transform-style: preserve-3d;
+  animation: animateFz1 5s linear infinite;
+  animation-play-state: paused;
+  -webkit-animation-play-state: paused;
+}
+.box div span,
+.box-s div span {
+  position: absolute;
+  top: 0;
+  left: 0;
+  display: block;
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(0deg, #f1f1f1, #999, #f1f1f1);
+  border-radius: 15px;
+}
+
+.box div span:nth-child(1),
+.box-s div span:nth-child(1) {
+  transform: rotateX(0deg);
+}
+.box div span:nth-child(2),
+.box-s div span:nth-child(2) {
+  transform: rotateX(45deg);
+}
+.box div span:nth-child(3),
+.box-s div span:nth-child(3) {
+  transform: rotateX(-45deg);
+}
+.box div span:nth-child(4),
+.box-s div span:nth-child(4) {
+  transform: rotateX(90deg);
+}
+div.box-right {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-image: url(/static/mainfan/fengji-right2.png);
+  background-size: 100% 100%;
+}
+div.box-left {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-image: url(/static/mainfan/fengji-left.png);
+  background-size: 100% 100%;
+}
+@keyframes animate {
+  0% {
+    transform: perspective(1000px) rotateX(0deg);
+  }
+  100% {
+    transform: perspective(1000px) rotateX(360deg);
+  }
+}
+@keyframes animateFz {
+  0% {
+    transform: perspective(1000px) rotateX(360deg);
+  }
+  100% {
+    transform: perspective(1000px) rotateX(0deg);
+  }
+}
+@keyframes animate2 {
+  0% {
+    transform: perspective(1000px) rotateX(360deg);
+  }
+  100% {
+    transform: perspective(1000px) rotateX(0deg);
+  }
+}
+
+@keyframes animateFz1 {
+  0% {
+    transform: perspective(1000px) rotateX(0deg);
+  }
+  100% {
+    transform: perspective(1000px) rotateX(360deg);
+  }
+}
+</style>