Browse Source

Merge branch 'feature/ning-wireless-lamp' into develop

# Conflicts:
#	languages/zh-CN.js
#	package-lock.json
wenningning 2 years ago
parent
commit
60e2dc0089

File diff suppressed because it is too large
+ 0 - 1
dist/static/css/chunk-30ca8599.b1dd7a76.css


File diff suppressed because it is too large
+ 0 - 1
dist/static/css/chunk-5c92bfb9.03dafb85.css


BIN
dist/static/img/avatar.7aebfb9d.jpeg


File diff suppressed because it is too large
+ 0 - 1
dist/static/js/chunk-2d0c8d8c.348cef43.js


+ 0 - 1
dist/static/js/chunk-2d2105d3.d4ca2bd4.js

@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d2105d3"],{b829:function(n,e,o){"use strict";o.r(e);o("fb6a"),o("ac1f"),o("841c");var c,a,t={name:"AuthRedirect",created:function(){var n=window.location.search.slice(1);window.localStorage&&(window.localStorage.setItem("x-admin-oauth-code",n),window.close())},render:function(n){return n()}},d=t,i=o("2877"),l=Object(i["a"])(d,c,a,!1,null,null,null);e["default"]=l.exports}}]);

+ 0 - 1
dist/static/js/chunk-2d230fe7.042d38d1.js

@@ -1 +0,0 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d230fe7"],{ef3c:function(e,r,n){"use strict";n.r(r);n("ac1f"),n("5319");var t,u,a={created:function(){var e=this.$route,r=e.params,n=e.query,t=r.path;this.$router.replace({path:"/"+t,query:n})},render:function(e){return e()}},c=a,o=n("2877"),p=Object(o["a"])(c,t,u,!1,null,null,null);r["default"]=p.exports}}]);

+ 3 - 2
languages/en.js

@@ -1056,8 +1056,9 @@ module.exports = {
     HUMAN_DETECTION_RADAR: 'Sleep Detection Radar',
     ALARM_INFUSION: 'Infusion alarm',
     ELECTRONIC_FENCE: 'Electronic fence',
-    WIRELESS_DOOR_LAMP: 'Wireless door lamp',
-    WIRELESS_CONVERSION_BOX: 'Wireless conversion box'
+    S433_DOOR_LAMP: 'Wireless door lamp',
+    S433_TRANSFER_BOX: 'Wireless conversion box',
+    S433_RECEIVER: 'Signal receiver'
   },
   vitalSignsDeviceType: {
     BLOOD_SUGAR: 'Blood Pressure Meter',

+ 3 - 2
languages/es.js

@@ -1057,8 +1057,9 @@ module.exports = {
     HUMAN_DETECTION_RADAR: 'Radar de monitoreo del sueño',
     ALARM_INFUSION: 'Alarma de infusión',
     ELECTRONIC_FENCE: 'Valla electrónica',
-    WIRELESS_DOOR_LAMP: 'Luz de puerta inalámbrica',
-    WIRELESS_CONVERSION_BOX: 'Caja de conversión inalámbrica'
+    S433_DOOR_LAMP: 'Luz de puerta inalámbrica',
+    S433_TRANSFER_BOX: 'Caja de conversión inalámbrica',
+    S433_RECEIVER: 'Receptor de señal'
   },
   vitalSignsDeviceType: {
     BLOOD_SUGAR: 'Medidor de presión arterial',

+ 4 - 3
languages/zh-CN.js

@@ -1010,8 +1010,8 @@ module.exports = {
     organization: '组织机构',
     roleManage: '角色管理',
     debugging485: '485调试',
-    deviceFrame: '设备空间',
     linuxVersion: 'Linux设备版本',
+    deviceFrame: '设备空间',
     ledDevice: 'LED点阵屏',
     entraceguardUser: '用户通行设置',
     customBoardManage: '自定义信息看板屏',
@@ -1058,8 +1058,9 @@ module.exports = {
     HUMAN_DETECTION_RADAR: '睡眠监测雷达',
     ALARM_INFUSION: '输液报警器',
     ELECTRONIC_FENCE: '电子围栏',
-    WIRELESS_DOOR_LAMP: '无线门灯',
-    WIRELESS_CONVERSION_BOX: '无线转换盒'
+    S433_DOOR_LAMP: '433无线门灯',
+    S433_TRANSFER_BOX: '433无线转换盒',
+    S433_RECEIVER: '433接收器'
   },
   vitalSignsDeviceType: {
     BLOOD_SUGAR: '血糖仪',

+ 0 - 172
node_modules/zrender/src/svg/helper/ClippathManager.js

@@ -1,172 +0,0 @@
-/**
- * @file Manages SVG clipPath elements.
- * @author Zhang Wenli
- */
-
-import Definable from './Definable';
-import * as zrUtil from '../../core/util';
-import * as matrix from '../../core/matrix';
-
-/**
- * Manages SVG clipPath elements.
- *
- * @class
- * @extends Definable
- * @param   {number}     zrId    zrender instance id
- * @param   {SVGElement} svgRoot root of SVG document
- */
-function ClippathManager(zrId, svgRoot) {
-    Definable.call(this, zrId, svgRoot, 'clipPath', '__clippath_in_use__');
-}
-
-
-zrUtil.inherits(ClippathManager, Definable);
-
-
-/**
- * Update clipPath.
- *
- * @param {Displayable} displayable displayable element
- */
-ClippathManager.prototype.update = function (displayable) {
-    var svgEl = this.getSvgElement(displayable);
-    if (svgEl) {
-        this.updateDom(svgEl, displayable.__clipPaths, false);
-    }
-
-    var textEl = this.getTextSvgElement(displayable);
-    if (textEl) {
-        // Make another clipPath for text, since it's transform
-        // matrix is not the same with svgElement
-        this.updateDom(textEl, displayable.__clipPaths, true);
-    }
-
-    this.markUsed(displayable);
-};
-
-
-/**
- * Create an SVGElement of displayable and create a <clipPath> of its
- * clipPath
- *
- * @param {Displayable} parentEl  parent element
- * @param {ClipPath[]}  clipPaths clipPaths of parent element
- * @param {boolean}     isText    if parent element is Text
- */
-ClippathManager.prototype.updateDom = function (
-    parentEl,
-    clipPaths,
-    isText
-) {
-    if (clipPaths && clipPaths.length > 0) {
-        // Has clipPath, create <clipPath> with the first clipPath
-        var defs = this.getDefs(true);
-        var clipPath = clipPaths[0];
-        var clipPathEl;
-        var id;
-
-        var dom = isText ? '_textDom' : '_dom';
-
-        if (clipPath[dom]) {
-            // Use a dom that is already in <defs>
-            id = clipPath[dom].getAttribute('id');
-            clipPathEl = clipPath[dom];
-
-            // Use a dom that is already in <defs>
-            if (!defs.contains(clipPathEl)) {
-                // This happens when set old clipPath that has
-                // been previously removed
-                defs.appendChild(clipPathEl);
-            }
-        }
-        else {
-            // New <clipPath>
-            id = 'zr' + this._zrId + '-clip-' + this.nextId;
-            ++this.nextId;
-            clipPathEl = this.createElement('clipPath');
-            clipPathEl.setAttribute('id', id);
-            defs.appendChild(clipPathEl);
-
-            clipPath[dom] = clipPathEl;
-        }
-
-        // Build path and add to <clipPath>
-        var svgProxy = this.getSvgProxy(clipPath);
-        if (clipPath.transform
-            && clipPath.parent.invTransform
-            && !isText
-        ) {
-            /**
-             * If a clipPath has a parent with transform, the transform
-             * of parent should not be considered when setting transform
-             * of clipPath. So we need to transform back from parent's
-             * transform, which is done by multiplying parent's inverse
-             * transform.
-             */
-            // Store old transform
-            var transform = Array.prototype.slice.call(
-                clipPath.transform
-            );
-
-            // Transform back from parent, and brush path
-            matrix.mul(
-                clipPath.transform,
-                clipPath.parent.invTransform,
-                clipPath.transform
-            );
-            svgProxy.brush(clipPath);
-
-            // Set back transform of clipPath
-            clipPath.transform = transform;
-        }
-        else {
-            svgProxy.brush(clipPath);
-        }
-
-        var pathEl = this.getSvgElement(clipPath);
-
-        clipPathEl.innerHTML = '';
-        /**
-         * Use `cloneNode()` here to appendChild to multiple parents,
-         * which may happend when Text and other shapes are using the same
-         * clipPath. Since Text will create an extra clipPath DOM due to
-         * different transform rules.
-         */
-        clipPathEl.appendChild(pathEl.cloneNode());
-
-        parentEl.setAttribute('clip-path', 'url(#' + id + ')');
-
-        if (clipPaths.length > 1) {
-            // Make the other clipPaths recursively
-            this.updateDom(clipPathEl, clipPaths.slice(1), isText);
-        }
-    }
-    else {
-        // No clipPath
-        if (parentEl) {
-            parentEl.setAttribute('clip-path', 'none');
-        }
-    }
-};
-
-/**
- * Mark a single clipPath to be used
- *
- * @param {Displayable} displayable displayable element
- */
-ClippathManager.prototype.markUsed = function (displayable) {
-    var that = this;
-    if (displayable.__clipPaths && displayable.__clipPaths.length > 0) {
-        zrUtil.each(displayable.__clipPaths, function (clipPath) {
-            if (clipPath._dom) {
-                Definable.prototype.markUsed.call(that, clipPath._dom);
-            }
-            if (clipPath._textDom) {
-                Definable.prototype.markUsed.call(that, clipPath._textDom);
-            }
-        });
-    }
-};
-
-
-export default ClippathManager;

+ 0 - 212
node_modules/zrender/src/svg/helper/ShadowManager.js

@@ -1,212 +0,0 @@
-/**
- * @file Manages SVG shadow elements.
- * @author Zhang Wenli
- */
-
-import Definable from './Definable';
-import * as zrUtil from '../../core/util';
-
-/**
- * Manages SVG shadow elements.
- *
- * @class
- * @extends Definable
- * @param   {number}     zrId    zrender instance id
- * @param   {SVGElement} svgRoot root of SVG document
- */
-function ShadowManager(zrId, svgRoot) {
-    Definable.call(
-        this,
-        zrId,
-        svgRoot,
-        ['filter'],
-        '__filter_in_use__',
-        '_shadowDom'
-    );
-}
-
-
-zrUtil.inherits(ShadowManager, Definable);
-
-
-/**
- * Create new shadow DOM for fill or stroke if not exist,
- * but will not update shadow if exists.
- *
- * @param {SvgElement}  svgElement   SVG element to paint
- * @param {Displayable} displayable  zrender displayable element
- */
-ShadowManager.prototype.addWithoutUpdate = function (
-    svgElement,
-    displayable
-) {
-    if (displayable && hasShadow(displayable.style)) {
-        var style = displayable.style;
-
-        // Create dom in <defs> if not exists
-        var dom;
-        if (style._shadowDom) {
-            // Gradient exists
-            dom = style._shadowDom;
-
-            var defs = this.getDefs(true);
-            if (!defs.contains(style._shadowDom)) {
-                // _shadowDom is no longer in defs, recreate
-                this.addDom(dom);
-            }
-        }
-        else {
-            // New dom
-            dom = this.add(displayable);
-        }
-
-        this.markUsed(displayable);
-
-        var id = dom.getAttribute('id');
-        svgElement.style.filter = 'url(#' + id + ')';
-    }
-};
-
-
-/**
- * Add a new shadow tag in <defs>
- *
- * @param {Displayable} displayable  zrender displayable element
- * @return {SVGFilterElement} created DOM
- */
-ShadowManager.prototype.add = function (displayable) {
-    var dom = this.createElement('filter');
-    var style = displayable.style;
-
-    // Set dom id with shadow id, since each shadow instance
-    // will have no more than one dom element.
-    // id may exists before for those dirty elements, in which case
-    // id should remain the same, and other attributes should be
-    // updated.
-    style._shadowDomId = style._shadowDomId || this.nextId++;
-    dom.setAttribute('id', 'zr' + this._zrId
-        + '-shadow-' + style._shadowDomId);
-
-    this.updateDom(displayable, dom);
-    this.addDom(dom);
-
-    return dom;
-};
-
-
-/**
- * Update shadow.
- *
- * @param {Displayable} displayable  zrender displayable element
- */
-ShadowManager.prototype.update = function (svgElement, displayable) {
-    var style = displayable.style;
-    if (hasShadow(style)) {
-        var that = this;
-        Definable.prototype.update.call(this, displayable, function (style) {
-            that.updateDom(displayable, style._shadowDom);
-        });
-    }
-    else {
-        // Remove shadow
-        this.remove(svgElement, style);
-    }
-};
-
-
-/**
- * Remove DOM and clear parent filter
- */
-ShadowManager.prototype.remove = function (svgElement, style) {
-    if (style._shadowDomId != null) {
-        this.removeDom(style);
-        svgElement.style.filter = '';
-    }
-};
-
-
-/**
- * Update shadow dom
- *
- * @param {Displayable} displayable  zrender displayable element
- * @param {SVGFilterElement} dom DOM to update
- */
-ShadowManager.prototype.updateDom = function (displayable, dom) {
-    var domChild = dom.getElementsByTagName('feDropShadow');
-    if (domChild.length === 0) {
-        domChild = this.createElement('feDropShadow');
-    }
-    else {
-        domChild = domChild[0];
-    }
-
-    var style = displayable.style;
-    var scaleX = displayable.scale ? (displayable.scale[0] || 1) : 1;
-    var scaleY = displayable.scale ? (displayable.scale[1] || 1) : 1;
-
-    // TODO: textBoxShadowBlur is not supported yet
-    var offsetX, offsetY, blur, color;
-    if (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY) {
-        offsetX = style.shadowOffsetX || 0;
-        offsetY = style.shadowOffsetY || 0;
-        blur = style.shadowBlur;
-        color = style.shadowColor;
-    }
-    else if (style.textShadowBlur) {
-        offsetX = style.textShadowOffsetX || 0;
-        offsetY = style.textShadowOffsetY || 0;
-        blur = style.textShadowBlur;
-        color = style.textShadowColor;
-    }
-    else {
-        // Remove shadow
-        this.removeDom(dom, style);
-        return;
-    }
-
-    domChild.setAttribute('dx', offsetX / scaleX);
-    domChild.setAttribute('dy', offsetY / scaleY);
-    domChild.setAttribute('flood-color', color);
-
-    // Divide by two here so that it looks the same as in canvas
-    // See: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowblur
-    var stdDx = blur / 2 / scaleX;
-    var stdDy = blur / 2 / scaleY;
-    var stdDeviation = stdDx + ' ' + stdDy;
-    domChild.setAttribute('stdDeviation', stdDeviation);
-
-    // Fix filter clipping problem
-    dom.setAttribute('x', '-100%');
-    dom.setAttribute('y', '-100%');
-    dom.setAttribute('width', Math.ceil(blur / 2 * 200) + '%');
-    dom.setAttribute('height', Math.ceil(blur / 2 * 200) + '%');
-
-    dom.appendChild(domChild);
-
-    // Store dom element in shadow, to avoid creating multiple
-    // dom instances for the same shadow element
-    style._shadowDom = dom;
-};
-
-/**
- * Mark a single shadow to be used
- *
- * @param {Displayable} displayable displayable element
- */
-ShadowManager.prototype.markUsed = function (displayable) {
-    var style = displayable.style;
-    if (style && style._shadowDom) {
-        Definable.prototype.markUsed.call(this, style._shadowDom);
-    }
-};
-
-function hasShadow(style) {
-    // TODO: textBoxShadowBlur is not supported yet
-    return style
-        && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY
-            || style.textShadowBlur || style.textShadowOffsetX
-            || style.textShadowOffsetY);
-}
-
-
-export default ShadowManager;

+ 195 - 227
package-lock.json

@@ -35,27 +35,27 @@
       }
     },
     "@babel/compat-data": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.21.0.tgz",
-      "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
+      "version": "7.20.14",
+      "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.14.tgz",
+      "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
       "dev": true
     },
     "@babel/core": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.21.0.tgz",
-      "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
+      "version": "7.20.12",
+      "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.20.12.tgz",
+      "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
       "dev": true,
       "requires": {
-        "@ampproject/remapping": "^2.2.0",
+        "@ampproject/remapping": "^2.1.0",
         "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.21.0",
+        "@babel/generator": "^7.20.7",
         "@babel/helper-compilation-targets": "^7.20.7",
-        "@babel/helper-module-transforms": "^7.21.0",
-        "@babel/helpers": "^7.21.0",
-        "@babel/parser": "^7.21.0",
+        "@babel/helper-module-transforms": "^7.20.11",
+        "@babel/helpers": "^7.20.7",
+        "@babel/parser": "^7.20.7",
         "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.0",
-        "@babel/types": "^7.21.0",
+        "@babel/traverse": "^7.20.12",
+        "@babel/types": "^7.20.7",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -87,14 +87,13 @@
       }
     },
     "@babel/generator": {
-      "version": "7.21.1",
-      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.21.1.tgz",
-      "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
+      "version": "7.20.14",
+      "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.14.tgz",
+      "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.21.0",
+        "@babel/types": "^7.20.7",
         "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
       },
       "dependencies": {
@@ -167,15 +166,15 @@
       }
     },
     "@babel/helper-create-class-features-plugin": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz",
-      "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==",
+      "version": "7.20.12",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz",
+      "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.21.0",
-        "@babel/helper-member-expression-to-functions": "^7.21.0",
+        "@babel/helper-function-name": "^7.19.0",
+        "@babel/helper-member-expression-to-functions": "^7.20.7",
         "@babel/helper-optimise-call-expression": "^7.18.6",
         "@babel/helper-replace-supers": "^7.20.7",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
@@ -183,13 +182,13 @@
       }
     },
     "@babel/helper-create-regexp-features-plugin": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz",
-      "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==",
+      "version": "7.20.5",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz",
+      "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
-        "regexpu-core": "^5.3.1"
+        "regexpu-core": "^5.2.1"
       }
     },
     "@babel/helper-define-polyfill-provider": {
@@ -245,13 +244,13 @@
       }
     },
     "@babel/helper-function-name": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
-      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+      "version": "7.19.0",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+      "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.20.7",
-        "@babel/types": "^7.21.0"
+        "@babel/template": "^7.18.10",
+        "@babel/types": "^7.19.0"
       }
     },
     "@babel/helper-hoist-variables": {
@@ -264,12 +263,12 @@
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz",
-      "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz",
+      "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.21.0"
+        "@babel/types": "^7.20.7"
       }
     },
     "@babel/helper-module-imports": {
@@ -282,9 +281,9 @@
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
-      "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
+      "version": "7.20.11",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+      "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
       "dev": true,
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -293,8 +292,8 @@
         "@babel/helper-split-export-declaration": "^7.18.6",
         "@babel/helper-validator-identifier": "^7.19.1",
         "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.2",
-        "@babel/types": "^7.21.2"
+        "@babel/traverse": "^7.20.10",
+        "@babel/types": "^7.20.7"
       }
     },
     "@babel/helper-optimise-call-expression": {
@@ -378,9 +377,9 @@
       "dev": true
     },
     "@babel/helper-validator-option": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
-      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+      "version": "7.18.6",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+      "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
       "dev": true
     },
     "@babel/helper-wrap-function": {
@@ -396,14 +395,14 @@
       }
     },
     "@babel/helpers": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.21.0.tgz",
-      "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
+      "version": "7.20.13",
+      "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.20.13.tgz",
+      "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
       "dev": true,
       "requires": {
         "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.0",
-        "@babel/types": "^7.21.0"
+        "@babel/traverse": "^7.20.13",
+        "@babel/types": "^7.20.7"
       }
     },
     "@babel/highlight": {
@@ -418,9 +417,9 @@
       }
     },
     "@babel/parser": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.21.2.tgz",
-      "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==",
+      "version": "7.20.15",
+      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.15.tgz",
+      "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==",
       "dev": true
     },
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
@@ -466,27 +465,27 @@
       }
     },
     "@babel/plugin-proposal-class-static-block": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz",
-      "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz",
+      "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.21.0",
+        "@babel/helper-create-class-features-plugin": "^7.20.7",
         "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       }
     },
     "@babel/plugin-proposal-decorators": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz",
-      "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==",
+      "version": "7.20.13",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.13.tgz",
+      "integrity": "sha512-7T6BKHa9Cpd7lCueHBBzP0nkXNina+h5giOZw+a8ZpMfPFY19VjJAjIxyFHuWkhCWgL6QMqRiY/wB1fLXzm6Mw==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.21.0",
+        "@babel/helper-create-class-features-plugin": "^7.20.12",
         "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/helper-replace-supers": "^7.20.7",
         "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/plugin-syntax-decorators": "^7.21.0"
+        "@babel/plugin-syntax-decorators": "^7.19.0"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
@@ -573,9 +572,9 @@
       }
     },
     "@babel/plugin-proposal-optional-chaining": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
-      "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz",
+      "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.20.2",
@@ -594,13 +593,13 @@
       }
     },
     "@babel/plugin-proposal-private-property-in-object": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz",
-      "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==",
+      "version": "7.20.5",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz",
+      "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
-        "@babel/helper-create-class-features-plugin": "^7.21.0",
+        "@babel/helper-create-class-features-plugin": "^7.20.5",
         "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       }
@@ -643,12 +642,12 @@
       }
     },
     "@babel/plugin-syntax-decorators": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz",
-      "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==",
+      "version": "7.19.0",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz",
+      "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.20.2"
+        "@babel/helper-plugin-utils": "^7.19.0"
       }
     },
     "@babel/plugin-syntax-dynamic-import": {
@@ -798,24 +797,24 @@
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz",
-      "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==",
+      "version": "7.20.15",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz",
+      "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.20.2"
       }
     },
     "@babel/plugin-transform-classes": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz",
-      "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz",
+      "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==",
       "dev": true,
       "requires": {
         "@babel/helper-annotate-as-pure": "^7.18.6",
         "@babel/helper-compilation-targets": "^7.20.7",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.21.0",
+        "@babel/helper-function-name": "^7.19.0",
         "@babel/helper-optimise-call-expression": "^7.18.6",
         "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/helper-replace-supers": "^7.20.7",
@@ -872,12 +871,12 @@
       }
     },
     "@babel/plugin-transform-for-of": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz",
-      "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==",
+      "version": "7.18.8",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz",
+      "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.20.2"
+        "@babel/helper-plugin-utils": "^7.18.6"
       }
     },
     "@babel/plugin-transform-function-name": {
@@ -920,12 +919,12 @@
       }
     },
     "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz",
-      "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==",
+      "version": "7.20.11",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz",
+      "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.21.2",
+        "@babel/helper-module-transforms": "^7.20.11",
         "@babel/helper-plugin-utils": "^7.20.2",
         "@babel/helper-simple-access": "^7.20.2"
       }
@@ -1019,13 +1018,13 @@
       }
     },
     "@babel/plugin-transform-runtime": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz",
-      "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==",
+      "version": "7.19.6",
+      "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz",
+      "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==",
       "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.20.2",
+        "@babel/helper-plugin-utils": "^7.19.0",
         "babel-plugin-polyfill-corejs2": "^0.3.3",
         "babel-plugin-polyfill-corejs3": "^0.6.0",
         "babel-plugin-polyfill-regenerator": "^0.4.1",
@@ -1216,9 +1215,9 @@
       "dev": true
     },
     "@babel/runtime": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz",
-      "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
+      "version": "7.20.13",
+      "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.13.tgz",
+      "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
       "dev": true,
       "requires": {
         "regenerator-runtime": "^0.13.11"
@@ -1244,19 +1243,19 @@
       }
     },
     "@babel/traverse": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.21.2.tgz",
-      "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
+      "version": "7.20.13",
+      "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.13.tgz",
+      "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.21.1",
+        "@babel/generator": "^7.20.7",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.21.0",
+        "@babel/helper-function-name": "^7.19.0",
         "@babel/helper-hoist-variables": "^7.18.6",
         "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/parser": "^7.21.2",
-        "@babel/types": "^7.21.2",
+        "@babel/parser": "^7.20.13",
+        "@babel/types": "^7.20.7",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
@@ -1279,9 +1278,9 @@
       }
     },
     "@babel/types": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.21.2.tgz",
-      "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.20.7.tgz",
+      "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
       "dev": true,
       "requires": {
         "@babel/helper-string-parser": "^7.19.4",
@@ -1748,9 +1747,9 @@
       "dev": true
     },
     "@toast-ui/editor": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmmirror.com/@toast-ui/editor/-/editor-3.2.2.tgz",
-      "integrity": "sha512-ASX7LFjN2ZYQJrwmkUajPs7DRr9FsM1+RQ82CfTO0Y5ZXorBk1VZS4C2Dpxinx9kl55V4F8/A2h2QF4QMDtRbA==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/@toast-ui/editor/-/editor-3.2.1.tgz",
+      "integrity": "sha512-05nKfqK2n/6Mq8WpO1E7OnOjlhiFfxr1G2i/DpG/pFjKlY3E7uOtSAyuz7rybKWHgUzXRzRGv7MqDL6lXfqnWg==",
       "requires": {
         "dompurify": "^2.3.3",
         "prosemirror-commands": "^1.1.9",
@@ -1860,9 +1859,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "18.14.6",
-      "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.14.6.tgz",
-      "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==",
+      "version": "18.13.0",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.13.0.tgz",
+      "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==",
       "dev": true
     },
     "@types/normalize-package-data": {
@@ -3020,9 +3019,9 @@
       },
       "dependencies": {
         "readable-stream": {
-          "version": "3.6.1",
-          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.1.tgz",
-          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "version": "3.6.0",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
           "requires": {
             "inherits": "^2.0.3",
             "string_decoder": "^1.1.1",
@@ -3352,7 +3351,7 @@
     },
     "babel-eslint": {
       "version": "10.1.0",
-      "resolved": "https://registry.npmmirror.com/babel-eslint/-/babel-eslint-10.1.0.tgz",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
       "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
       "dev": true,
       "requires": {
@@ -4329,9 +4328,9 @@
       },
       "dependencies": {
         "readable-stream": {
-          "version": "3.6.1",
-          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.1.tgz",
-          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "version": "3.6.0",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
           "dev": true,
           "requires": {
             "inherits": "^2.0.3",
@@ -4658,9 +4657,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001462",
-      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001462.tgz",
-      "integrity": "sha512-PDd20WuOBPiasZ7KbFnmQRyuLE7cFXW2PVd7dmALzbkUXEP46upAuCDm9eY9vho8fgNMGmbAX92QBZHzcnWIqw==",
+      "version": "1.0.30001451",
+      "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz",
+      "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==",
       "dev": true
     },
     "canvas": {
@@ -4817,17 +4816,6 @@
           "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
           "dev": true
         },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
         "glob-parent": {
           "version": "3.1.0",
           "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
@@ -5852,12 +5840,12 @@
       "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
     },
     "core-js-compat": {
-      "version": "3.29.0",
-      "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.29.0.tgz",
-      "integrity": "sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==",
+      "version": "3.27.2",
+      "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.27.2.tgz",
+      "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.21.5"
+        "browserslist": "^4.21.4"
       }
     },
     "core-util-is": {
@@ -6849,9 +6837,9 @@
       }
     },
     "dompurify": {
-      "version": "2.4.5",
-      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-2.4.5.tgz",
-      "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA=="
+      "version": "2.4.3",
+      "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-2.4.3.tgz",
+      "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ=="
     },
     "domready": {
       "version": "1.0.8",
@@ -6950,6 +6938,16 @@
       "requires": {
         "tslib": "2.3.0",
         "zrender": "5.4.1"
+      },
+      "dependencies": {
+        "zrender": {
+          "version": "5.4.1",
+          "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.1.tgz",
+          "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==",
+          "requires": {
+            "tslib": "2.3.0"
+          }
+        }
       }
     },
     "editorconfig": {
@@ -7007,9 +7005,9 @@
       "dev": true
     },
     "electron-to-chromium": {
-      "version": "1.4.322",
-      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.322.tgz",
-      "integrity": "sha512-KovjizNC9XB7dno/2GjxX8VS0SlfPpCjtyoKft+bCO+UfD8bFy16hY4Sh9s0h9BDxbRH2U0zX5VBjpM1LTcNlg==",
+      "version": "1.4.295",
+      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz",
+      "integrity": "sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==",
       "dev": true
     },
     "elegant-spinner": {
@@ -7556,9 +7554,9 @@
       "dev": true
     },
     "esquery": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz",
-      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
       "dev": true,
       "requires": {
         "estraverse": "^5.1.0"
@@ -8509,11 +8507,15 @@
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
       "dev": true,
-      "optional": true
+      "optional": true,
+      "requires": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      }
     },
     "function-bind": {
       "version": "1.1.1",
@@ -8986,9 +8988,9 @@
       },
       "dependencies": {
         "readable-stream": {
-          "version": "3.6.1",
-          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.1.tgz",
-          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "version": "3.6.0",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
           "dev": true,
           "requires": {
             "inherits": "^2.0.3",
@@ -9829,13 +9831,13 @@
       }
     },
     "is-array-buffer": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
-      "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+      "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
       "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.0",
+        "get-intrinsic": "^1.1.3",
         "is-typed-array": "^1.1.10"
       }
     },
@@ -10462,7 +10464,7 @@
       }
     },
     "janus-gateway": {
-      "version": "git+https://github.com/meetecho/janus-gateway.git#c3c7ffb61c46bedcd4008ac73de840b3ef415563",
+      "version": "git+https://github.com/meetecho/janus-gateway.git#83245f75986c3a46b13dca0a8939ea12b62afa64",
       "from": "git+https://github.com/meetecho/janus-gateway.git",
       "requires": {
         "webrtc-adapter": "8.2.0"
@@ -10800,17 +10802,6 @@
             "normalize-path": "^2.1.1"
           }
         },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
         "normalize-path": {
           "version": "2.1.1",
           "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz",
@@ -12486,9 +12477,9 @@
       "dev": true
     },
     "minipass": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmmirror.com/minipass/-/minipass-4.2.4.tgz",
-      "integrity": "sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ=="
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/minipass/-/minipass-4.0.3.tgz",
+      "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw=="
     },
     "minipass-collect": {
       "version": "1.0.2",
@@ -14830,9 +14821,9 @@
           }
         },
         "readable-stream": {
-          "version": "3.6.1",
-          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.1.tgz",
-          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "version": "3.6.0",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
           "dev": true,
           "requires": {
             "inherits": "^2.0.3",
@@ -15000,9 +14991,9 @@
       "dev": true
     },
     "prosemirror-commands": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmmirror.com/prosemirror-commands/-/prosemirror-commands-1.5.1.tgz",
-      "integrity": "sha512-ga1ga/RkbzxfAvb6iEXYmrEpekn5NCwTb8w1dr/gmhSoaGcQ0VPuCzOn5qDEpC45ql2oDkKoKQbRxLJwKLpMTQ==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/prosemirror-commands/-/prosemirror-commands-1.5.0.tgz",
+      "integrity": "sha512-zL0Fxbj3fh71GPNHn5YdYgYGX2aU2XLecZYk2ekEF0oOD259HcXtM+96VjPVi5o3h4sGUdDfEEhGiREXW6U+4A==",
       "requires": {
         "prosemirror-model": "^1.0.0",
         "prosemirror-state": "^1.0.0",
@@ -15029,9 +15020,9 @@
       }
     },
     "prosemirror-keymap": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmmirror.com/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz",
-      "integrity": "sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz",
+      "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==",
       "requires": {
         "prosemirror-state": "^1.0.0",
         "w3c-keyname": "^2.2.0"
@@ -15064,9 +15055,9 @@
       }
     },
     "prosemirror-view": {
-      "version": "1.30.2",
-      "resolved": "https://registry.npmmirror.com/prosemirror-view/-/prosemirror-view-1.30.2.tgz",
-      "integrity": "sha512-nTNzZvalQf9kHeEyO407LiV6DoOs/pXsid88UqW9Vvybo4ozJW2PJhkfZUxCUF1hR/9vJLdhxX84wuw9P9HsXA==",
+      "version": "1.30.1",
+      "resolved": "https://registry.npmmirror.com/prosemirror-view/-/prosemirror-view-1.30.1.tgz",
+      "integrity": "sha512-pZUfr7lICJkEY7XwzldAKrkflZDeIvnbfuu2RIS01N5NwJmR/dfZzDzJRzhb3SM2QtT/bM8b4Nnib8X3MGpAhA==",
       "requires": {
         "prosemirror-model": "^1.16.0",
         "prosemirror-state": "^1.0.0",
@@ -15345,9 +15336,9 @@
       }
     },
     "readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "version": "2.3.7",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
       "requires": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -15452,9 +15443,9 @@
       "dev": true
     },
     "regexpu-core": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.1.tgz",
-      "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.0.tgz",
+      "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==",
       "dev": true,
       "requires": {
         "@babel/regjsgen": "^0.8.0",
@@ -16047,9 +16038,9 @@
       }
     },
     "sdp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmmirror.com/sdp/-/sdp-3.2.0.tgz",
-      "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw=="
+      "version": "3.1.0",
+      "resolved": "https://registry.npmmirror.com/sdp/-/sdp-3.1.0.tgz",
+      "integrity": "sha512-YQ2+lulxfcPv5/3FsY9FR0F8r+qQngluz2L+YdR7S8mMiFFy3/6Cx9mzAL57Sbzgaj13Eaiq88rfQx7Wiik0qg=="
     },
     "select": {
       "version": "1.1.2",
@@ -16774,9 +16765,9 @@
       "dev": true
     },
     "spdx-correct": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz",
-      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
       "dev": true,
       "requires": {
         "spdx-expression-parse": "^3.0.0",
@@ -16865,9 +16856,9 @@
           "dev": true
         },
         "readable-stream": {
-          "version": "3.6.1",
-          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.1.tgz",
-          "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+          "version": "3.6.0",
+          "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
           "dev": true,
           "requires": {
             "inherits": "^2.0.3",
@@ -18965,6 +18956,13 @@
             "to-regex-range": "^5.0.1"
           }
         },
+        "fsevents": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+          "dev": true,
+          "optional": true
+        },
         "is-number": {
           "version": "7.0.0",
           "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
@@ -19045,17 +19043,6 @@
             "upath": "^1.1.1"
           }
         },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
         "glob-parent": {
           "version": "3.1.0",
           "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
@@ -19395,17 +19382,6 @@
             "ms": "2.1.2"
           }
         },
-        "fsevents": {
-          "version": "1.2.13",
-          "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
-          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
-        },
         "glob-parent": {
           "version": "3.1.0",
           "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz",
@@ -20031,14 +20007,6 @@
           "dev": true
         }
       }
-    },
-    "zrender": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.1.tgz",
-      "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==",
-      "requires": {
-        "tslib": "2.3.0"
-      }
     }
   }
 }

+ 1 - 2
package.json

@@ -93,8 +93,7 @@
     "serve-static": "1.13.2",
     "svg-sprite-loader": "4.1.3",
     "svgo": "1.2.0",
-    "vue-template-compiler": "2.6.10",
-    "exports-loader": "^1.1.0"
+    "vue-template-compiler": "2.6.10"
   },
   "browserslist": [
     "> 1%",

+ 7 - 1
src/api/ncs_device.js

@@ -245,4 +245,10 @@ export function update485s(data) {
     loading: true
   })
 }
-
+export function getCacheListByType(partId, deviceType) {
+  return request({
+    url: `/ncs/device/getCacheListByType/${partId}/${deviceType}`,
+    method: 'GET',
+    loading: true
+  })
+}

+ 1 - 1
src/router/index.js

@@ -615,7 +615,7 @@ export const partRoutes = [
         path: 'index',
         component: () => import('@/views/ncs-led/ledManager'),
         name: 'part_led',
-        meta: { title: i18n.t('tab.ledDevice'), icon: 'el-icon-message-solid', noCache: true }
+        meta: { title: i18n.t('tab.ledDevice'), icon: 'el-icon-message-solid', noCache: true } // LED点阵屏
       }
     ],
     hidden: uiVersion !== 1

+ 3 - 2
src/utils/enum/DeviceTypeEnum.js

@@ -42,7 +42,8 @@ export const DEVICE_TYPE = createEnum(
     HUMAN_DETECTION_RADAR: [37, i18n.t('deviceType.HUMAN_DETECTION_RADAR')], // 睡眠监测雷达
     ALARM_INFUSION: [38, i18n.t('deviceType.ALARM_INFUSION')], // 输液报警器
     ELECTRONIC_FENCE: [39, i18n.t('deviceType.ELECTRONIC_FENCE')], //电子围栏
-    WIRELESS_DOOR_LAMP: [40, i18n.t('deviceType.WIRELESS_DOOR_LAMP')], // 无线门灯
-    WIRELESS_CONVERSION_BOX: [41, i18n.t('deviceType.WIRELESS_CONVERSION_BOX')] //无线转换盒
+    S433_DOOR_LAMP: [40, i18n.t('deviceType.S433_DOOR_LAMP')], // 433无线门灯
+    S433_TRANSFER_BOX: [41, i18n.t('deviceType.S433_TRANSFER_BOX')], //433无线转换盒
+    S433_RECEIVER: [42, i18n.t('deviceType.S433_RECEIVER')] //433接收器
   }
 )

+ 14 - 0
src/utils/mixin.js

@@ -128,6 +128,20 @@ export default {
           return buf
         }
       }
+    },
+    //将秒转化为时分秒
+    formateSeconds(startTime, endTime){
+      if (!startTime) {
+        return 0
+      }
+      let secondTime = endTime - startTime//将传入的秒的值转化为Number
+      let min = 0// 初始化分
+      if(secondTime>1000){//如果秒数大于60,将秒数转换成整数
+        min=parseInt(secondTime/1000)//获取秒,除以1000取整数,得到整数秒
+        return min + this.$t('action.second')
+      } else {
+        return secondTime + this.$t('action.millisecond')
+      }
     }
   }
 }

+ 2 - 1
src/views/ncs-device/components/deviceManager.vue

@@ -1232,7 +1232,8 @@
                     val === DEVICE_TYPE.ENTRANCE_GUARD ||
                     val === DEVICE_TYPE.OWON_X5_GATEWAY ||
                     val === DEVICE_TYPE.HUMAN_DETECTION_RADAR ||
-                    val === DEVICE_TYPE.INFORMATION_BOARD;
+                    val === DEVICE_TYPE.INFORMATION_BOARD ||
+                    val === DEVICE_TYPE.S433_TRANSFER_BOX;
             },
           getDeviceType() {
               return DEVICE_TYPE;

+ 256 - 46
src/views/ncs-led/ledManager.vue

@@ -1,64 +1,151 @@
 <template>
   <div>
-    <el-card style="margin: 15px">
-      <el-form ref="editform" :rules="rules" label-width="140px" :model="formmodel">
-        <fieldset>
-          <legend>{{ this.$t('tab.ledDevice') }}</legend>
-
-          <el-row>
-            <el-form-item :label="this.$t('deviceManage.ledUpdateDefaultProgram')">
-              <el-radio v-model="isOnlyTime" :label="false">{{ this.$t('deviceManage.ledOnlyTime') }}</el-radio>
-              <el-radio v-model="isOnlyTime" :label="true">{{ this.$t('deviceManage.ledAddCustom') }}</el-radio>
+    <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
+      <el-tab-pane name="s433" label="无线点阵屏"></el-tab-pane>
+      <el-tab-pane name="led" label="LED点阵屏"></el-tab-pane>
+    </el-tabs>
+    <div v-if="activeName === 's433'">
+      <el-form ref="myForm" :rules="rules" label-width="90px" :model="s433FormModel">
+        <el-row>
+          <el-form-item label="模式">
+            <el-radio-group v-model="s433FormModel.type" size="mini" prop="unit">
+              <el-radio :label="4">校验时间</el-radio>
+              <el-radio :label="0">屏参</el-radio>
+              <el-radio :label="1">自定义数据</el-radio>
+              <el-radio :label="2">调试</el-radio>
+              <el-radio :label="3">清空显示</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-row>
+        <el-row v-if="s433FormModel.type === 0">
+          <el-col :span="8">
+            <el-form-item :label="this.$t('deviceManage.ledResolutionRatio')" prop="ledStyle">
+              <el-input v-model="s433FormModel.ledStyle" clearable placeholder="128*32" />
             </el-form-item>
-          </el-row>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item :label="this.$t('deviceManage.ledFontSize')" prop="ledSize">
+              <el-input-number v-model="s433FormModel.ledSize" controls-position="right" :min="0" :max="60" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-else-if="s433FormModel.type === 1">
+          <el-col :span="12">
+            <el-form-item label="自定义数据">
+              <el-input v-model="s433FormModel.title" placeholder="你好世界" :maxlength="50"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
 
-          <el-row v-if="isOnlyTime">
-<!--          <el-row>-->
-            <el-col :span="18">
-              <el-form-item :label="this.$t('deviceManage.ledAddCustom')">
-                <el-input v-model="formmodel.addCustom" :maxlength="50" />
+      <div class="table-wrapper" style="padding-bottom: 10px;padding-left: 10px">
+        <div style="padding: 5px;">
+          <el-select v-model="s433FormModel.boxMac" filterable style="margin-right: 10px;">
+            <el-option v-for="item in boxList" :key="item.eth_mac" :label="item.name" :value="item.eth_mac">
+              <span style="float: left">{{ item.name }}</span>
+              <span style="float: right; color: #8492a6; font-size: 13px">--{{ item.eth_mac }}</span>
+            </el-option>
+          </el-select>
+<!--          <el-button :disabled="multipleSelection.length === 0 && s433FormModel.boxMac != null" type="primary" @click="clickSend(4)">校验时间</el-button>-->
+          <el-button :disabled="multipleSelection.length === 0 && s433FormModel.boxMac != null" type="success" @click="sendChange">批量发送</el-button>
+<!--          <el-button :disabled="s433FormModel.boxMac != null" type="info" @click="clickSend">清空所有显示</el-button>-->
+        </div>
+        <el-table :data="s433DeviceList" id="myTableId" stripe border style="width: 100%" ref="refTable"
+                  @selection-change="selectFun" height="520">
+          <el-table-column type="selection" width="55"></el-table-column>
+          <el-table-column prop="name" label="设备名" min-width="130" align="center"/>
+          <el-table-column prop="eth_mac" label="Mac" min-width="130" align="center"/>
+          <!--        <el-table-column prop="send_time" label="发送时间" min-width="130" align="center" />-->
+          <el-table-column prop="receive_time" label="流程耗时" width="130" align="center"/>
+          <el-table-column prop="state" label="状态" width="140" align="center">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.state === 0" type="warning" disable-transitions>等待发送</el-tag>
+              <el-tag v-if="scope.row.state === 1" type="primary" disable-transitions>发送成功等待返回</el-tag>
+              <el-tag v-if="scope.row.state === 2" type="success" disable-transitions>已返回完成流程</el-tag>
+              <el-tag v-if="scope.row.state === -1" type="danger" disable-transitions>发送失败</el-tag>
+              <el-tag v-if="scope.row.state === -2" type="danger" disable-transitions>返回超时</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column style="text-align: left;" label="操作" width="120" fixed="right">
+            <template slot-scope="scope">
+              <el-button type="success" size="mini" @click="handlerEdit(scope.$index, scope.row)">
+                发送
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <div v-if="activeName === 'led'">
+      <el-card style="margin: 15px">
+        <el-form ref="editform" :rules="rules" label-width="140px" :model="formmodel">
+          <fieldset>
+            <legend>{{ this.$t('tab.ledDevice') }}</legend>
+
+            <el-row>
+              <el-form-item :label="this.$t('deviceManage.ledUpdateDefaultProgram')">
+                <el-radio v-model="isOnlyTime" :label="false">{{ this.$t('deviceManage.ledOnlyTime') }}</el-radio>
+                <el-radio v-model="isOnlyTime" :label="true">{{ this.$t('deviceManage.ledAddCustom') }}</el-radio>
               </el-form-item>
-            </el-col>
-          </el-row>
+            </el-row>
 
-          <el-row>
-            <el-form-item>
-              <el-col :span="4">
-                <el-button type="primary" @click="timing">{{ this.$t('deviceManage.ledTiming') }}</el-button>
+            <el-row v-if="isOnlyTime">
+              <!--          <el-row>-->
+              <el-col :span="18">
+                <el-form-item :label="this.$t('deviceManage.ledAddCustom')">
+                  <el-input v-model="formmodel.addCustom" :maxlength="50"/>
+                </el-form-item>
               </el-col>
+            </el-row>
 
-              <el-col :span="4">
-                <el-button type="primary" @click="updateDefaultProgram">{{ this.$t('deviceManage.ledUpdateDefaultProgram') }}</el-button>
-              </el-col>
+            <el-row>
+              <el-form-item>
+                <el-col :span="4">
+                  <el-button type="primary" @click="timing">{{ this.$t('deviceManage.ledTiming') }}</el-button>
+                </el-col>
 
-              <el-col :span="4">
-                <el-button type="primary" @click="deleteAllPrograms">{{ this.$t('deviceManage.ledRemoveAllProgram') }}</el-button>
-              </el-col>
+                <el-col :span="4">
+                  <el-button type="primary" @click="updateDefaultProgram">
+                    {{ this.$t('deviceManage.ledUpdateDefaultProgram') }}
+                  </el-button>
+                </el-col>
 
-              <el-col :span="4">
-                <el-button type="primary" @click="powerOn">{{ this.$t('deviceManage.ledPowerOn') }}</el-button>
-              </el-col>
+                <el-col :span="4">
+                  <el-button type="primary" @click="deleteAllPrograms">{{
+                      this.$t('deviceManage.ledRemoveAllProgram')
+                    }}
+                  </el-button>
+                </el-col>
 
-              <el-col :span="4">
-                <el-button type="primary" @click="powerOff">{{ this.$t('deviceManage.ledPowerOff') }}</el-button>
-              </el-col>
+                <el-col :span="4">
+                  <el-button type="primary" @click="powerOn">{{ this.$t('deviceManage.ledPowerOn') }}</el-button>
+                </el-col>
+
+                <el-col :span="4">
+                  <el-button type="primary" @click="powerOff">{{ this.$t('deviceManage.ledPowerOff') }}</el-button>
+                </el-col>
+
+                <el-col :span="4">
+                  <el-button type="primary" @click="powerRestart">{{ this.$t('deviceManage.ledRestart') }}</el-button>
+                </el-col>
+              </el-form-item>
+            </el-row>
+          </fieldset>
+        </el-form>
+      </el-card>
+    </div>
 
-              <el-col :span="4">
-                <el-button type="primary" @click="powerRestart">{{ this.$t('deviceManage.ledRestart') }}</el-button>
-              </el-col>
-            </el-form-item>
-          </el-row>
-        </fieldset>
-      </el-form>
-    </el-card>
   </div>
 </template>
 
 <script>
 
+import { DEVICE_TYPE } from '@/utils/enum/DeviceTypeEnum'
 import * as API_Led from '@/api/ncs_led'
+import { getCacheListByType } from '@/api/ncs_device'
+const DeviceUrl = domain.DeviceUrl
 export default {
-  name: "ledManager",
+  name: 'ledManager',
 
   data() {
     return {
@@ -66,15 +153,88 @@ export default {
       rules: {},
       isOnlyTime: false,
       // addCustom: '',
-      shop_id: this.$store.getters.partId
+      shop_id: this.$store.getters.partId,
+      activeName: 's433',
+      s433DeviceList: [],
+      boxList: [],
+      multipleSelection: [],
+      s433FormModel: {
+        type: 4,
+        ledStyle: '128*32',
+        ledSize: 16,
+        title: '你好世界',
+        boxMac: null,
+        macs: null,
+        partId: this.$store.getters.partId
+      },
+      boolDestroy: false
     }
   },
   async mounted() {
-    this.isOnlyTime === false
+    this.API_getList()
+    this.API_getList2()
+    this.initWebSocket()
+  },
+  beforeDestroy() {
+    this.boolDestroy = true
+    this.websock.close()
   },
   methods: {
+    initWebSocket: function() {
+      const time = Math.round(new Date()) + "" + Math.round(Math.random()*100)
+      let stockbase = DeviceUrl.replace('http', 'ws')
+      this.websock = new WebSocket(stockbase + '/s433/listening/'+ time + '/' + this.shop_id)
+      this.websock.onopen = this.websocketonopen
+      this.websock.onerror = this.websocketonerror
+      this.websock.onmessage = this.websocketonmessage
+      this.websock.onclose = this.websocketclose
+    },
+    websocketonopen: function() {
+      console.log(this.$t('deviceManage.webSocketSuccess'))
+    },
+    websocketonerror: function(e) {
+      console.log(this.$t('deviceManage.webSocketError'))
+    },
+    websocketonmessage: function(e) {
+      // console.log('收到消息:', e)
+      const data = JSON.parse(e.data)
+      console.log('收到消息:', data)
+      if (data.status === -1) {
+        this.$message.error('该转换盒不在线!')
+        return
+      }
+      const index = this.s433DeviceList.findIndex(p => p.eth_mac.toLowerCase() === data.mac.toLowerCase())
+      if (index === -1) {
+        return
+      }
+      const time = (new Date()).valueOf()
+      const item = this.s433DeviceList[index]
+      if (data.status === 1) { // 发送
+        // this.$set(this.s433DeviceList[index], 'send_time', time)
+        item.send_time = time
+      } else if (data.status === 2) { // 有返回
+        item.receive_time = this.formateSeconds(item.send_time, time)
+      } else { // 发送失败
+        item.receive_time = this.formateSeconds(item.send_time, time)
+      }
+
+      item.state = data.status
+      this.$set(this.s433DeviceList, index, item)
+    },
+    websocketclose: function(e) {
+      console.log('connection closed')
+      if (!this.boolDestroy) {
+        const _this = this
+        this.$alert('连接断开,是否重连', '提示', {
+          confirmButtonText: '确定',
+          callback: action => {
+            _this.initWebSocket()
+          }
+        })
+      }
+    },
     updateDefaultProgram() {
-      let text;
+      let text
       if (this.isOnlyTime) {
         text = this.formmodel.addCustom
       }
@@ -123,6 +283,56 @@ export default {
       API_Led.removeAllProgramByShopId(params).then(r => {
         this.$message.success(this.$t('action.saveSuccess'))
       })
+    },
+    handleClick(e) {
+      if (this.activeName === 's433') {
+        this.API_getList()
+      }
+    },
+    API_getList() {
+      getCacheListByType(this.shop_id, DEVICE_TYPE.S433_RECEIVER).then(res => {
+        res.forEach(item => {
+          item.state = null
+          item.send_time = ''
+          item.receive_time = ''
+        })
+        this.s433DeviceList = res
+      })
+    },
+    API_getList2() {
+      getCacheListByType(this.shop_id, DEVICE_TYPE.S433_TRANSFER_BOX).then(res => {
+        this.boxList = res
+        if (this.boxList.length > 0) {
+          this.s433FormModel.boxMac = this.boxList[0].eth_mac
+        } else {
+          this.$message.info('请先添加433转换盒!')
+        }
+      })
+    },
+    selectFun(val) {
+      this.multipleSelection = val
+    },
+    handlerEdit(index, row) {
+      row.state = 0
+      row.send_time = row.receive_time = ''
+      this.$set(this.s433DeviceList, index, row)
+      this.s433FormModel.macs = row.eth_mac
+      this.websock.send(JSON.stringify(this.s433FormModel))
+    },
+    sendChange() {
+      let list = []
+      const _this = this
+      this.s433FormModel.macs = null
+      _this.multipleSelection.forEach(item => {
+        const index = _this.s433DeviceList.indexOf(item)
+        item.state = 0
+        item.send_time = item.receive_time = ''
+        _this.$set(_this.s433DeviceList, index, item)
+        list.push(item.eth_mac)
+      })
+      this.s433FormModel.macs = list.join(',')
+      // this.multipleSelection = []
+      this.websock.send(JSON.stringify(this.s433FormModel))
     }
   }
 }
@@ -130,4 +340,4 @@ export default {
 
 <style scoped>
 
-</style>
+</style>