ZZJ
2022-02-11 d365829b14ca4256d39694b9cdcd43bad0ad8595
bug修复
6个文件已删除
16个文件已添加
11个文件已修改
648 ■■■■■ 已修改文件
public/images/settings/实时监控.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/数据可视化.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/数据推送.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/数据栈配置.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/日志管理.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/1仰卧检测.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/2个体静止.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/3安全警戒.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/4安全帽检测.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/5奔跑.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/6车辆检测.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/7抽烟.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/简约图标/8人体结构化.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/系统设置.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/1仰卧检测.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/2个体静止.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/3安全警戒.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/4安全帽检测.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/5奔跑.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/6车辆检测.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/7抽烟.png 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/面性图标/8人体结构化.png 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/subComponents/FileUpload/file.vue 321 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/ai/index/App.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/ai/index/detail.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/desktop/index/components/DFrame.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/settings/components/AuthorizationSetting.vue 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/settings/index/index.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/settings/views/clusterManagement.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/settings/views/generalSettings.vue 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/vindicate/index/App.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/images/settings/ʵʱ¼à¿Ø.png
Binary files differ
public/images/settings/Êý¾Ý¿ÉÊÓ»¯.png
Binary files differ
public/images/settings/Êý¾ÝÍÆËÍ.png
Binary files differ
public/images/settings/Êý¾ÝÕ»ÅäÖÃ.png
Binary files differ
public/images/settings/ÈÕÖ¾¹ÜÀí.png
Binary files differ
public/images/settings/¼òԼͼ±ê/1ÑöÎÔ¼ì²â.png
public/images/settings/¼òԼͼ±ê/2¸öÌå¾²Ö¹.png
public/images/settings/¼òԼͼ±ê/3°²È«¾¯½ä.png
public/images/settings/¼òԼͼ±ê/4°²È«Ã±¼ì²â.png
public/images/settings/¼òԼͼ±ê/5±¼ÅÜ.png
public/images/settings/¼òԼͼ±ê/6³µÁ¾¼ì²â.png
public/images/settings/¼òԼͼ±ê/7³éÑÌ.png
public/images/settings/¼òԼͼ±ê/8ÈËÌå½á¹¹»¯.png
public/images/settings/ϵͳÉèÖÃ.png
Binary files differ
public/images/settings/ÃæÐÔͼ±ê/1ÑöÎÔ¼ì²â.png
public/images/settings/ÃæÐÔͼ±ê/2¸öÌå¾²Ö¹.png
public/images/settings/ÃæÐÔͼ±ê/3°²È«¾¯½ä.png
public/images/settings/ÃæÐÔͼ±ê/4°²È«Ã±¼ì²â.png
public/images/settings/ÃæÐÔͼ±ê/5±¼ÅÜ.png
public/images/settings/ÃæÐÔͼ±ê/6³µÁ¾¼ì²â.png
public/images/settings/ÃæÐÔͼ±ê/7³éÑÌ.png
public/images/settings/ÃæÐÔͼ±ê/8ÈËÌå½á¹¹»¯.png
src/api/system.ts
@@ -517,3 +517,18 @@
  })
}
export const getAuthInfo = () => {
  return request({
    url: "/data/api-v/sysset/showAuthInfo",
    method: "get"
  })
}
export const setAuthInfo = (data: any) => {
  return request({
    url: "/data/api-v/sysset/setAuthInfo",
    method: "post",
    data
  })
}
src/components/subComponents/FileUpload/file.vue
@@ -24,28 +24,36 @@
      :extension="extension"
      :file-category="fileCategory"
    >
      <div class="uploader-file-progress" :class="progressingClass" :style="progressStyle"></div>
      <div
        class="uploader-file-progress"
        :class="progressingClass"
        :style="progressStyle"
      ></div>
      <div class="uploader-file-info">
        <div class="uploader-file-name">
          <i class="uploader-file-icon" :icon="fileCategory"></i>
          {{file.name}}
          {{ file.name }}
        </div>
        <div class="uploader-file-size">{{formatedSize}}</div>
        <div class="uploader-file-size">{{ formatedSize }}</div>
        <div class="uploader-file-meta"></div>
        <div class="uploader-file-status">
          <span v-show="status !== 'uploading'">{{statusText}}</span>
          <span v-show="status !== 'uploading'">{{ statusText }}</span>
          <span v-show="status === 'uploading'">
            <span>{{progressStyle.progress}}</span>
            <em>{{formatedAverageSpeed}}</em>
            <span>{{ progressStyle.progress }}</span>
            <em>{{ formatedAverageSpeed }}</em>
            <i>&nbsp;&nbsp;{{formatedTimeRemaining}}</i>
            <i>&nbsp;&nbsp;{{ formatedTimeRemaining }}</i>
          </span>
        </div>
        <div class="uploader-file-actions">
          <span class="uploader-file-pause" @click="pause"></span>
          <span class="uploader-file-resume" @click="resume">️</span>
          <span class="uploader-file-retry" @click="retry"></span>
          <span class="uploader-file-remove" @click="remove"></span>
          <el-tooltip effect="dark" content="重新上传" placement="bottom">
            <span class="uploader-file-retry" @click="retry"></span>
          </el-tooltip>
          <el-tooltip effect="dark" content="删除" placement="bottom">
            <span class="uploader-file-remove" @click="remove"></span>
          </el-tooltip>
        </div>
      </div>
    </slot>
@@ -53,11 +61,11 @@
</template>
<script>
import Uploader from 'simple-uploader.js'
import events from './common/file-events'
import { secondsToStr } from './common/utils'
import Uploader from "simple-uploader.js";
import events from "./common/file-events";
import { secondsToStr } from "./common/utils";
const COMPONENT_NAME = 'uploader-file'
const COMPONENT_NAME = "uploader-file";
export default {
  name: COMPONENT_NAME,
@@ -65,13 +73,13 @@
    file: {
      type: Object,
      default() {
        return {}
      }
        return {};
      },
    },
    list: {
      type: Boolean,
      default: false
    }
      default: false,
    },
  },
  data() {
    return {
@@ -83,231 +91,248 @@
      isComplete: false,
      isUploading: false,
      size: 0,
      formatedSize: '',
      formatedSize: "",
      uploadedSize: 0,
      progress: 0,
      timeRemaining: 0,
      type: '',
      extension: '',
      progressingClass: ''
    }
      type: "",
      extension: "",
      progressingClass: "",
    };
  },
  computed: {
    fileCategory() {
      const extension = this.extension
      const isFolder = this.file.isFolder
      let type = isFolder ? 'folder' : 'unknown'
      const categoryMap = this.file.uploader.opts.categoryMap
      const extension = this.extension;
      const isFolder = this.file.isFolder;
      let type = isFolder ? "folder" : "unknown";
      const categoryMap = this.file.uploader.opts.categoryMap;
      const typeMap = categoryMap || {
        image: ['gif', 'jpg', 'jpeg', 'png', 'bmp', 'webp'],
        video: ['mp4', 'm3u8', 'rmvb', 'avi', 'swf', '3gp', 'mkv', 'flv'],
        audio: ['mp3', 'wav', 'wma', 'ogg', 'aac', 'flac'],
        document: ['doc', 'txt', 'docx', 'pages', 'epub', 'pdf', 'numbers', 'csv', 'xls', 'xlsx', 'keynote', 'ppt', 'pptx']
      }
        image: ["gif", "jpg", "jpeg", "png", "bmp", "webp"],
        video: ["mp4", "m3u8", "rmvb", "avi", "swf", "3gp", "mkv", "flv"],
        audio: ["mp3", "wav", "wma", "ogg", "aac", "flac"],
        document: [
          "doc",
          "txt",
          "docx",
          "pages",
          "epub",
          "pdf",
          "numbers",
          "csv",
          "xls",
          "xlsx",
          "keynote",
          "ppt",
          "pptx",
        ],
      };
      Object.keys(typeMap).forEach((_type) => {
        const extensions = typeMap[_type]
        const extensions = typeMap[_type];
        if (extensions.indexOf(extension) > -1) {
          type = _type
          type = _type;
        }
      })
      return type
      });
      return type;
    },
    progressStyle() {
      const progress = Math.floor(this.progress * 100)
      const style = `translateX(${Math.floor(progress - 100)}%)`
      const progress = Math.floor(this.progress * 100);
      const style = `translateX(${Math.floor(progress - 100)}%)`;
      return {
        progress: `${progress}%`,
        webkitTransform: style,
        mozTransform: style,
        msTransform: style,
        transform: style
      }
        transform: style,
      };
    },
    formatedAverageSpeed() {
      return `${Uploader.utils.formatSize(this.averageSpeed)} / s`
      return `${Uploader.utils.formatSize(this.averageSpeed)} / s`;
    },
    status() {
      const isUploading = this.isUploading
      const isComplete = this.isComplete
      const isError = this.error
      const paused = this.paused
      const isUploading = this.isUploading;
      const isComplete = this.isComplete;
      const isError = this.error;
      const paused = this.paused;
      if (isComplete) {
        return 'success'
        return "success";
      } else if (isError) {
        return 'error'
        return "error";
      } else if (isUploading) {
        return 'uploading'
        return "uploading";
      } else if (paused) {
        return 'paused'
        return "paused";
      } else {
        return 'waiting'
        return "waiting";
      }
    },
    statusText() {
      const status = this.status
      const fileStatusText = this.file.uploader.fileStatusText
      let txt = status
      if (typeof fileStatusText === 'function') {
        txt = fileStatusText(status, this.response)
      const status = this.status;
      const fileStatusText = this.file.uploader.fileStatusText;
      let txt = status;
      if (typeof fileStatusText === "function") {
        txt = fileStatusText(status, this.response);
      } else {
        txt = fileStatusText[status]
        txt = fileStatusText[status];
      }
      return txt || status
      return txt || status;
    },
    formatedTimeRemaining() {
      const timeRemaining = this.timeRemaining
      const file = this.file
      const timeRemaining = this.timeRemaining;
      const file = this.file;
      if (timeRemaining === Number.POSITIVE_INFINITY || timeRemaining === 0) {
        return ''
        return "";
      }
      let parsedTimeRemaining = secondsToStr(timeRemaining)
      const parseTimeRemaining = file.uploader.opts.parseTimeRemaining
      let parsedTimeRemaining = secondsToStr(timeRemaining);
      const parseTimeRemaining = file.uploader.opts.parseTimeRemaining;
      if (parseTimeRemaining) {
        parsedTimeRemaining = parseTimeRemaining(timeRemaining, parsedTimeRemaining)
        parsedTimeRemaining = parseTimeRemaining(
          timeRemaining,
          parsedTimeRemaining
        );
      }
      return parsedTimeRemaining
    }
      return parsedTimeRemaining;
    },
  },
  watch: {
    status(newStatus, oldStatus) {
      if (oldStatus && newStatus === 'uploading' && oldStatus !== 'uploading') {
      if (oldStatus && newStatus === "uploading" && oldStatus !== "uploading") {
        this.tid = setTimeout(() => {
          this.progressingClass = 'uploader-file-progressing'
        }, 200)
          this.progressingClass = "uploader-file-progressing";
        }, 200);
      } else {
        clearTimeout(this.tid)
        this.progressingClass = ''
        clearTimeout(this.tid);
        this.progressingClass = "";
      }
    }
    },
  },
  methods: {
    _actionCheck() {
      this.paused = this.file.paused
      this.error = this.file.error
      this.isUploading = this.file.isUploading()
      this.paused = this.file.paused;
      this.error = this.file.error;
      this.isUploading = this.file.isUploading();
    },
    pause() {
      this.file.pause()
      this._actionCheck()
      this._fileProgress()
      this.file.pause();
      this._actionCheck();
      this._fileProgress();
    },
    resume() {
      this.file.resume()
      this._actionCheck()
      this.file.resume();
      this._actionCheck();
    },
    remove() {
      this.file.cancel()
      this.file.cancel();
    },
    retry() {
      this.file.retry()
      this._actionCheck()
      this.file.retry();
      this._actionCheck();
    },
    processResponse(message) {
      let res = message
      let res = message;
      try {
        res = JSON.parse(message)
      } catch (e) { }
      this.response = res
        res = JSON.parse(message);
      } catch (e) {}
      this.response = res;
    },
    fileEventsHandler(event, args) {
      const rootFile = args[0]
      const file = args[1]
      const target = this.list ? rootFile : file
      const rootFile = args[0];
      const file = args[1];
      const target = this.list ? rootFile : file;
      if (this.file === target) {
        if (this.list && event === 'fileSuccess') {
          this.processResponse(args[2])
          return
        if (this.list && event === "fileSuccess") {
          this.processResponse(args[2]);
          return;
        }
        this[`_${event}`].apply(this, args)
        this[`_${event}`].apply(this, args);
      }
    },
    _fileProgress() {
      this.progress = this.file.progress()
      this.averageSpeed = this.file.averageSpeed
      this.currentSpeed = this.file.currentSpeed
      this.timeRemaining = this.file.timeRemaining()
      this.uploadedSize = this.file.sizeUploaded()
      this._actionCheck()
      this.progress = this.file.progress();
      this.averageSpeed = this.file.averageSpeed;
      this.currentSpeed = this.file.currentSpeed;
      this.timeRemaining = this.file.timeRemaining();
      this.uploadedSize = this.file.sizeUploaded();
      this._actionCheck();
    },
    _fileSuccess(rootFile, file, message) {
      if (rootFile) {
        this.processResponse(message)
        this.processResponse(message);
      }
      this._fileProgress()
      this.error = false
      this.isComplete = true
      this.isUploading = false
      console.log('rootFile, file, message', rootFile, file, message)
      this._fileProgress();
      this.error = false;
      this.isComplete = true;
      this.isUploading = false;
      console.log("rootFile, file, message", rootFile, file, message);
    },
    _fileComplete() {
      this._fileSuccess()
      this._fileSuccess();
    },
    _fileError(rootFile, file, message) {
      this._fileProgress()
      console.log('rootFile, file, message', rootFile, file, message)
      this.processResponse(message)
      this.error = true
      this.isComplete = false
      this.isUploading = false
    }
      this._fileProgress();
      console.log("rootFile, file, message", rootFile, file, message);
      this.processResponse(message);
      this.error = true;
      this.isComplete = false;
      this.isUploading = false;
    },
  },
  mounted() {
    const staticProps = ['paused', 'error', 'averageSpeed', 'currentSpeed']
    const staticProps = ["paused", "error", "averageSpeed", "currentSpeed"];
    const fnProps = [
      'isComplete',
      'isUploading',
      "isComplete",
      "isUploading",
      {
        key: 'size',
        fn: 'getSize'
        key: "size",
        fn: "getSize",
      },
      {
        key: 'formatedSize',
        fn: 'getFormatSize'
        key: "formatedSize",
        fn: "getFormatSize",
      },
      {
        key: 'uploadedSize',
        fn: 'sizeUploaded'
        key: "uploadedSize",
        fn: "sizeUploaded",
      },
      'progress',
      'timeRemaining',
      "progress",
      "timeRemaining",
      {
        key: 'type',
        fn: 'getType'
        key: "type",
        fn: "getType",
      },
      {
        key: 'extension',
        fn: 'getExtension'
      }
    ]
    staticProps.forEach(prop => {
      this[prop] = this.file[prop]
    })
        key: "extension",
        fn: "getExtension",
      },
    ];
    staticProps.forEach((prop) => {
      this[prop] = this.file[prop];
    });
    fnProps.forEach((fnProp) => {
      if (typeof fnProp === 'string') {
        this[fnProp] = this.file[fnProp]()
      if (typeof fnProp === "string") {
        this[fnProp] = this.file[fnProp]();
      } else {
        this[fnProp.key] = this.file[fnProp.fn]()
        this[fnProp.key] = this.file[fnProp.fn]();
      }
    })
    });
    const handlers = this._handlers = {}
    const handlers = (this._handlers = {});
    const eventHandler = (event) => {
      handlers[event] = (...args) => {
        this.fileEventsHandler(event, args)
      }
      return handlers[event]
    }
        this.fileEventsHandler(event, args);
      };
      return handlers[event];
    };
    events.forEach((event) => {
      this.file.uploader.on(event, eventHandler(event))
    })
      this.file.uploader.on(event, eventHandler(event));
    });
  },
  destroyed() {
    events.forEach((event) => {
      this.file.uploader.off(event, this._handlers[event])
    })
    this._handlers = null
  }
}
      this.file.uploader.off(event, this._handlers[event]);
    });
    this._handlers = null;
  },
};
</script>
<style>
src/pages/ai/index/App.vue
@@ -88,7 +88,9 @@
                    <div class="desc-2">版本 {{ item.version }}</div>
                  </div>
                  <div class="right-icon">
                    <span class="icon iconfont">&#xe71a;</span>
                    <el-tooltip effect="dark" content="下载" placement="bottom">
                      <span class="icon iconfont">&#xe71a;</span>
                    </el-tooltip>
                  </div>
                </div>
              </div>
@@ -357,6 +359,7 @@
          <detailPage
            :detailProductID="detailProductID"
            :detailType="detailType"
            :detailPrice="detailPrice"
            v-if="inDetail"
            @flushSdk="getAllSdk"
            @flushApp="getAllApps"
@@ -469,6 +472,7 @@
      showUpload: false,
      detailType: "",
      detailProductID: "",
      detailPrice: "",
      buttonAuthority: sessionStorage.getItem("buttonAuthoritys") || [],
      activeName: "应用中心",
      patchUpdateStatus: "",
@@ -617,6 +621,7 @@
    checkDetail(item, typ) {
      this.inDetail = true;
      this.detailProductID = item.id;
      this.detailPrice = item.price;
      if (typ) {
        this.detailType = typ;
      } else {
@@ -844,7 +849,6 @@
                version: res.data.apps[0].version,
                productName: res.data.productName,
                installContent: res.data.apps[0].installContent,
              };
            }
            if (res.data.sdks.length > 0) {
@@ -1402,7 +1406,8 @@
                min-width: 100px;
                text-align: end;
                position: absolute;
                right: 0;    width: 120px;
                right: 0;
                width: 120px;
                margin-top: 2px;
              }
              .rocket-icon {
src/pages/ai/index/detail.vue
@@ -38,7 +38,7 @@
            <el-button
              size="mini"
              round
              v-if="!isActive && showInstallNotActive"
              v-if="!isActive && (!detailPrice || showInstallNotActive)"
              @click="downloadSdkInSide"
              >安装</el-button
            >
@@ -50,14 +50,14 @@
              clearable
              :autofocus="true"
              v-model="activeCode"
              v-if="!isActive && !showInstallNotActive"
              v-if="!isActive && !showInstallNotActive && detailPrice"
            >
            </el-input>
            <el-button
              size="mini"
              round
              class="act-btn"
              v-if="!isActive && !showInstallNotActive"
              v-if="!isActive && !showInstallNotActive && detailPrice"
              @click="actived"
              >激活</el-button
            >
@@ -69,14 +69,14 @@
            > -->
          </div>
        </div>
        <div class="back-btn" @click="goback">
        <!-- <div class="back-btn" @click="goback">
          <span class="icon iconfont">&#xe680;</span>
          <span class="back-text">返回</span>
        </div>
        </div> -->
      </div>
      <div class="text-area">
        <div class="text-line">
          <span class="icon iconfont" >&#xe710;</span>
          <span class="icon iconfont">&#xe710;</span>
          <span class="title">版本:</span>
          <span class="desc">{{ productDetail.productVersion }}</span>
        </div>
@@ -144,7 +144,7 @@
          class="rec-item"
          v-for="(item, index) in otherProducts"
          :key="index"
            @click="checkInWindow(item)"
          @click="checkInWindow(item)"
        >
          <div class="icon-img">
            <img
@@ -165,7 +165,6 @@
            <el-button
              size="small"
              type="primary"
              round
              @click="checkInWindow(item)"
              >查看</el-button
@@ -312,6 +311,7 @@
    detailProductID: {
      type: String,
    },
    detailPrice: {},
  },
  directives: {
    focus: {
@@ -325,15 +325,20 @@
    this.autoRefreshAppAndSdkState();
    this.getUnActivedList();
    this.getUnActivedAppList();
    this.showBackBtn();
    this.addBackListener();
  },
  beforeDestroy() {
    this.autoRefresh = false;
    this.hiddenBackBtn();
  },
  methods: {
    getDetail(id) {
      getAppDetail({ id: id || this.detailProductID })
        .then((res) => {
          if (res.success) {
            console.log("----------");
            console.log(res);
            this.productDetail = res.data.detail;
            this.otherProducts = res.data.randoms;
@@ -545,7 +550,7 @@
              if (res && res.success) {
                app.unloadLoading = false;
                // _this.getAllApps();
                this.$emit("flushApp")
                this.$emit("flushApp");
                window.parent.postMessage(
                  {
                    msg: "AppUpdate",
@@ -557,7 +562,7 @@
                  message: "卸载应用成功",
                  type: "success",
                });
                this.goback()
                this.goback();
              }
            })
            .catch((e) => {
@@ -766,9 +771,9 @@
                sdk.unloadLoading = false;
                this.$notify.success("卸载完成");
                // _this.getAllSdk();
                this.$emit("flushSdk")
                this.$emit("flushSdk");
                window.parent.postMessage({ msg: "AppUpdate" }, "*");
                this.goback()
                this.goback();
              }
            })
            .catch((e) => {
@@ -857,7 +862,7 @@
    inputBlur(item) {
      this.$set(item, "isEdit", false);
    },
     autoRefreshAppAndSdkState() {
    autoRefreshAppAndSdkState() {
      this.getAllApps();
      this.getAllSdk();
      if (!this.autoRefresh) {
@@ -871,6 +876,29 @@
          this.getAllSdk();
        }
      }, 1000);
    },
    showBackBtn() {
      window.parent.postMessage(
        {
          msg: "showBack",
        },
        "*"
      );
    },
    hiddenBackBtn() {
      window.parent.postMessage(
        {
          msg: "hiddenBack",
        },
        "*"
      );
    },
    addBackListener() {
      window.addEventListener("message", (e) => {
        if (e.data.msg === "返回应用中心") {
          this.goback();
        }
      });
    },
  },
};
@@ -1009,8 +1037,7 @@
        height: 25px;
        .icon {
          font-size: 14px;
           margin-right: 4px;
          margin-right: 4px;
        }
        .title {
          font-size: 12px;
@@ -1042,16 +1069,13 @@
        margin-bottom: 10px;
        .title {
          width: 80px;
          height: 20px;
          display: inline-block;
          line-height: 20px;
          padding: 0px 10px;
          letter-spacing: 0.5px;
          font-size: 12px;
          color: #828282;
          display: flex;
          align-items: center;
          justify-content: center;
          font-weight: bold;
          border: 1px solid;
          border: 1px solid #e0e0e0;
          box-sizing: border-box;
          border-radius: 22px;
@@ -1122,9 +1146,14 @@
          font-size: 14px;
          font-weight: bold;
          line-height: 28px;
          width: 116px;
          height: 28px;
          letter-spacing: 0.1px;
          color: #4f4f4f;
          overflow: hidden;
          white-space: nowrap;
          text-overflow: ellipsis;
        }
        .desc-2 {
          font-size: 12px;
@@ -1136,11 +1165,11 @@
        .el-button {
          padding: 3px 12px;
          border-radius: 22px;
            background-color: #f2f2f7 !important;
                border-color: #f2f2f7 !important;
                color: #4f4f4f;
                font-size: 12px;
                font-weight: bold;
          background-color: #f2f2f7 !important;
          border-color: #f2f2f7 !important;
          color: #4f4f4f;
          font-size: 12px;
          font-weight: bold;
        }
        // .el-button--primary:hover {
        //   background: #089fb3 !important;
src/pages/desktop/index/components/DFrame.vue
@@ -84,11 +84,7 @@
    data: Object,
  },
  created() {
    window.addEventListener("message", (e) => {
      if (e.data.msg === "showBack") {
        this.isShowBack = true;
      }
    });
    this.addBackListener();
  },
  data() {
    return {
@@ -221,15 +217,31 @@
      //return false;
    },
    // èœå•栏返回
    back() {
      let active = this.$store.state.desktop.minDocks;
      active = active.filter((item) => item.highlight);
      console.log(`返回${active.alt}`);
      console.log(active);
      const iframeArr = document.querySelectorAll("iframe");
      iframeArr.forEach((item) => {
        item.contentWindow.postMessage({ msg: `返回${active[0].alt}` }, "*");
      });
    },
    // æ·»åŠ è¿”å›žæŒ‰é’®ç›¸å…³ç›‘å¬
    addBackListener() {
      //显示返回按钮
      window.addEventListener("message", (e) => {
        if (e.data.msg === "showBack") {
          this.isShowBack = true;
        }
      });
      //隐藏返回按钮
      window.addEventListener("message", (e) => {
        if (e.data.msg === "hiddenBack") {
          this.isShowBack = false;
        }
      });
    },
  },
  directives: {
    drag(el, binding) {
src/pages/settings/components/AuthorizationSetting.vue
@@ -9,12 +9,13 @@
        ref="joinForm"
        class="join-form"
      >
        <!-- æŽˆæƒç®¡ç†æ–¹å¼ -->
        <el-form-item>
          <div class="row">
            <div class="item-title">设备授权管理方式</div>
            <div class="inputContain">
              <el-select
                v-model="settingForm.authorizationType"
                v-model="settingForm.need_auth_pwd"
                placeholder="请选择"
                size="small"
                :popper-append-to-body="false"
@@ -30,33 +31,40 @@
          </div>
        </el-form-item>
        <el-form-item prop="password" v-if="settingForm.authorizationType == 1">
        <!-- æŽˆæƒå¯†ç  -->
        <el-form-item prop="auth_pwd" v-if="settingForm.need_auth_pwd == 1">
          <div class="row">
            <div class="item-title">授权密钥</div>
            <div class="inputContain">
              <el-input
                v-model="settingForm.password"
                v-model="settingForm.auth_pwd"
                placeholder="请输入6位授权密钥"
                maxlength="6"
                show-password
                show-auth_pwd
              ></el-input>
            </div>
          </div>
        </el-form-item>
      </el-form>
      <div class="save">保存</div>
      <div class="save" @click="submit">保存</div>
    </div>
  </div>
</template>
<script>
import { getAuthInfo, setAuthInfo } from "@/api/system";
export default {
  created() {
    this.getAuth();
  },
  data() {
    return {
      settingForm: {
        authorizationType: 0,
        password: "",
        need_auth_pwd: 0, //授权管理方式
        auth_pwd: "", //授权密钥
        id: "", //设备id
      },
      typeOptions: [
        {
@@ -67,14 +75,44 @@
          label: "密码校验",
          value: 1,
        },
      ],
      ], //授权管理方式选项
      rules: {
        password: [
        auth_pwd: [
          { min: 6, max: 6, message: "长度为6个字符", trigger: "blur" },
        ],
      },
      }, //正则校验
    };
  },
  methods: {
    //获取授权信息
    async getAuth() {
      const res = await getAuthInfo();
      if (res.code === 200 && res.success) {
        //授权数据回填
        this.settingForm = res.data;
      } else {
        this.$notify.error({
          title: "错误",
          message: "获取授权信息失败",
        });
      }
    },
    //提交授权配置
    async submit() {
      const res = await setAuthInfo(this.settingForm);
      if (res.code === 200 && res.success) {
        this.$notify.success({
          title: "成功",
          message: "修改成功",
        });
      } else {
        this.$notify.error({
          title: "错误",
          message: "修改失败",
        });
      }
    },
  },
};
</script>
src/pages/settings/index/index.vue
@@ -899,13 +899,6 @@
    };
  },
  created() {
    window.parent.postMessage(
      {
        msg: "showBack",
      },
      "*"
    );
    let color = localStorage.getItem("--colorCard");
    if (color) {
      document.documentElement.style.setProperty("--colorCard", `${color}`);
@@ -916,6 +909,7 @@
    clearInterval(this.browserTimer);
  },
  mounted() {
    // è¿”回按钮回调
    window.addEventListener("message", (e) => {
      if (e.data.msg === "返回系统设置") {
        this.showWelcome = true;
@@ -1546,6 +1540,27 @@
      }
    },
  },
  watch: {
    showWelcome(newVal) {
      if (newVal) {
        // éšè—è¿”回按按钮
        window.parent.postMessage(
          {
            msg: "hiddenBack",
          },
          "*"
        );
      } else {
        //显示返回按钮
        window.parent.postMessage(
          {
            msg: "showBack",
          },
          "*"
        );
      }
    },
  },
};
</script>
<style lang="scss">
src/pages/settings/views/clusterManagement.vue
@@ -259,7 +259,7 @@
    };
    const checkID = (rule, value, callback) => {
      if (!value) {
        return callback(new Error("密码不能为空"));
        return callback(new Error("ID不能为空"));
      }
    };
    return {
src/pages/settings/views/generalSettings.vue
@@ -44,6 +44,17 @@
                step-strictly
                size="small"
              ></el-input-number
              >&nbsp;s -->
              <el-input-number
                v-model="min_len"
                @change="fakeObj.min = +(min_len / 1.2)"
                :min="5"
                :step="5"
                :max="120"
                step-strictly
                size="small"
              ></el-input-number
              >&nbsp;s
            </div>
          </div>
@@ -102,6 +113,10 @@
                    style="cursor: pointer"
                    >{{ playSpan }}</span
                  >
                  <!-- <span class="iconfont" v-else style="cursor: pointer">{{
                    playSpan2
                  }}</span> -->
                  <img
                    v-else
                    src="/images/settings/暂停.png"
@@ -113,6 +128,13 @@
                      margin-top: 15px;
                    "
                  />
                  <!--
                  <i
                    v-if="!item.isPlay"
                    class="el-icon-video-play"
                    style=""
                  ></i>
                  <i v-else class="el-icon-video-pause"></i> -->
                </span>
                <span
                  class="icon iconfont del"
@@ -185,7 +207,7 @@
          <div class="top-title">图标主题</div>
          <div class="icon-bar" style="cursor: pointer" @click="selectIcons(0)">
            <div class="bar-title">
              <span class="title">扁平写实图标</span>
              <span class="title">面性风格</span>
              <span
                class="icon iconfont"
                :class="activeIcons == 0 ? 'icon-active' : 'icon-normal'"
@@ -204,7 +226,7 @@
          </div>
          <div class="icon-bar" style="cursor: pointer" @click="selectIcons(1)">
            <div class="bar-title">
              <span class="title">扁平化图标</span>
              <span class="title">简约风格</span>
              <span
                class="icon iconfont"
                :class="activeIcons == 1 ? 'icon-active' : 'icon-normal'"
@@ -285,14 +307,22 @@
      },
      isPlay: false,
      realIconList: [
        { url: "/images/settings/日志管理.png", color: "green" },
        { url: "/images/settings/实时监控.png", color: "yellow" },
        { url: "/images/settings/数据可视化.png", color: "pink" },
        { url: "/images/settings/面性图标/1仰卧检测.png" },
        { url: "/images/settings/面性图标/2个体静止.png" },
        { url: "/images/settings/面性图标/3安全警戒.png" },
        { url: "/images/settings/面性图标/4安全帽检测.png" },
        { url: "/images/settings/面性图标/5奔跑.png" },
        { url: "/images/settings/面性图标/6车辆检测.png" },
        { url: "/images/settings/面性图标/7抽烟.png" },
      ],
      flatIconList: [
        { url: "/images/settings/数据推送.png" },
        { url: "/images/settings/数据栈配置.png" },
        { url: "/images/settings/系统设置.png" },
        { url: "/images/settings/简约图标/1仰卧检测.png" },
        { url: "/images/settings/简约图标/2个体静止.png" },
        { url: "/images/settings/简约图标/3安全警戒.png" },
        { url: "/images/settings/简约图标/4安全帽检测.png" },
        { url: "/images/settings/简约图标/5奔跑.png" },
        { url: "/images/settings/简约图标/6车辆检测.png" },
        { url: "/images/settings/简约图标/7抽烟.png" },
      ],
      tableBGList: [
        { name: "background", url: "/images/desktop/background.png" },
@@ -325,10 +355,16 @@
    });
    const url = this.curUser.backgroundpic;
    this.activeIcons = this.curUser.useIconType - 1;
    this.universalColor = this.colorList.findIndex(
      (x) => x.color == localStorage.getItem("--colorCard")
    );
    this.activeBg = url ? this.tableBGList.findIndex((x) => x.url == url) : 0;
    this.universalColor = this.colorList.findIndex((x) => {
      return x.color == localStorage.getItem("--colorCard");
    });
    if (url) {
      this.activeBg = this.tableBGList.findIndex((x) => {
        return x.url == url;
      });
    } else {
      this.activeBg = 0;
    }
    const e = this.$refs.curPage;
    e.addEventListener("click", (e) => {
      if (this.showUpload) {
@@ -364,6 +400,7 @@
      }).then((res) => {
        if (res.success) {
          sessionStorage.setItem("userInfo", JSON.stringify(res.data));
          debugger;
          this.$message.success(res.msg);
        }
      });
@@ -796,7 +833,9 @@
        font-weight: 700;
        margin-top: 20px;
      }
      /*     .icon-bar:hover {
        background-color: rgba(233, 233, 233, 1);
      } */
      .color-bar {
        display: flex;
        justify-content: center;
src/pages/vindicate/index/App.vue
@@ -107,7 +107,7 @@
  components: {
    systemClean,
    updateSettings,
      BackUp,
    BackUp,
    restartSettings,
    sysInfo,
  },
@@ -126,7 +126,7 @@
          img_white: "/images/vindicate/系统清理-白.png",
          img_welcome: "/images/vindicate/系统清理.png",
        },
        {
          name: "重启设置",
          img_black: "/images/vindicate/重启设置-黑.png",
@@ -164,13 +164,6 @@
    };
  },
  created() {
    window.parent.postMessage(
      {
        msg: "showBack",
      },
      "*"
    );
    let color = localStorage.getItem("--colorCard");
    if (color) {
      document.documentElement.style.setProperty("--colorCard", `${color}`);
@@ -236,6 +229,27 @@
        return this.searchArr.filter((item) => {
          return item.name.indexOf(this.searchText.toUpperCase()) > -1;
        });
      }
    },
  },
  watch: {
    showWelcome(newVal) {
      if (newVal) {
        // éšè—è¿”回按按钮
        window.parent.postMessage(
          {
            msg: "hiddenBack",
          },
          "*"
        );
      } else {
        //显示返回按钮
        window.parent.postMessage(
          {
            msg: "showBack",
          },
          "*"
        );
      }
    },
  },
@@ -378,10 +392,10 @@
      background-color: rgba(251, 251, 255, 0.1);
      backdrop-filter: blur(4px);
      float: left;
      width: 442px;
      width: 288px;
      height: 190px;
      margin: 0 15px;
      margin-bottom: 30px;
      margin: 0 10px;
      margin-bottom: 20px;
      border-radius: 15px;
      display: flex;
      justify-content: center;
vue.config.js
@@ -40,8 +40,10 @@
  // }
});
const serverUrl = "http://192.168.20.189:7009"; // ç¾Šäº”//
//const serverUrl = "http://192.168.20.189:7009"; // ç¾Šäº”//
//  const serverUrl = "http://192.168.8.10:7009";
const serverUrl = "http://192.168.8.118:7009";
const serverUrl2 = "http://192.168.8.10:9000";
// const serverUrl = "http://192.168.20.10:7009";
// const serverUrl2 = "http://192.168.20.10:9000";