Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5ee7631d25 | ||
|
|
28c0b3aebf | ||
|
|
b178941f01 | ||
|
|
ecd82b08c7 | ||
|
|
23c88ae447 | ||
|
|
9b2f2f5e21 | ||
|
|
d8de1e5d69 | ||
|
|
502d098413 | ||
|
|
a8a84b6abb | ||
|
|
da9eeae556 | ||
|
|
4125a88bba | ||
|
|
317693e2da | ||
|
|
be79109487 | ||
|
|
b99a20725a | ||
|
|
c40941fa60 | ||
|
|
6fba2c6116 | ||
|
|
2609c2e721 | ||
|
|
158a143d76 |
Binary file not shown.
@@ -1,5 +1,4 @@
|
|||||||
const BASE_CONFIG = {
|
var BASE_CONFIG = {
|
||||||
baseUrl: 'http://192.168.44.54:8091/',
|
baseUrl: 'http://192.168.44.54:8090/',
|
||||||
version: '23.06',
|
version: '2.0.2021.05.11.19.43'
|
||||||
apiVersion: 'v1'
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<rect y="85.331" style="fill:#D80027;" width="512" height="341.337"/>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#FFDA44;" points="178.923,189.567 193.579,234.674 241.008,234.674 202.637,262.552 217.294,307.661
|
|
||||||
178.923,279.782 140.552,307.661 155.208,262.552 116.837,234.674 164.266,234.674 "/>
|
|
||||||
<polygon style="fill:#FFDA44;" points="271.3,339.593 256.91,329.138 242.522,339.592 248.017,322.678 233.628,312.223
|
|
||||||
251.414,312.223 256.91,295.307 262.408,312.223 280.193,312.223 265.804,322.677 "/>
|
|
||||||
<polygon style="fill:#FFDA44;" points="308.837,287.927 291.052,287.927 285.556,304.841 280.06,287.928 262.273,287.927
|
|
||||||
276.664,277.472 271.166,260.557 285.556,271.01 299.945,260.557 294.449,277.472 "/>
|
|
||||||
<polygon style="fill:#FFDA44;" points="308.837,224.063 294.449,234.518 299.944,251.432 285.556,240.979 271.166,251.434
|
|
||||||
276.664,234.517 262.273,224.065 280.061,224.063 285.556,207.147 291.052,224.063 "/>
|
|
||||||
<polygon style="fill:#FFDA44;" points="271.3,172.397 265.805,189.313 280.193,199.766 262.408,199.767 256.91,216.684
|
|
||||||
251.414,199.766 233.629,199.768 248.018,189.312 242.522,172.396 256.91,182.851 "/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,75 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<rect y="85.333" style="fill:#0052B4;" width="512" height="341.337"/>
|
|
||||||
<g>
|
|
||||||
<path style="fill:#F0F0F0;" d="M223.397,255.996c0.273-0.304,0.543-0.609,0.813-0.916c-0.27,0.308-0.546,0.61-0.82,0.916H223.397z"
|
|
||||||
/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="189.217,297.923 200.175,320.836 224.922,315.118 213.839,337.971 233.739,353.752
|
|
||||||
208.963,359.337 209.032,384.735 189.217,368.845 169.403,384.735 169.472,359.337 144.696,353.752 164.596,337.971
|
|
||||||
153.513,315.118 178.259,320.836 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="387.076,326.387 392.303,337.316 404.106,334.588 398.82,345.488 408.312,353.016
|
|
||||||
396.494,355.679 396.526,367.793 387.076,360.215 377.626,367.793 377.658,355.679 365.841,353.016 375.332,345.488
|
|
||||||
370.047,334.588 381.85,337.316 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="338.453,210.448 343.68,221.378 355.483,218.649 350.197,229.55 359.688,237.078
|
|
||||||
347.871,239.741 347.903,251.856 338.453,244.276 329.002,251.856 329.035,239.741 317.217,237.078 326.708,229.55
|
|
||||||
321.424,218.649 333.226,221.378 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="387.076,144.198 392.303,155.128 404.106,152.398 398.82,163.3 408.311,170.827
|
|
||||||
396.494,173.491 396.526,185.605 387.076,178.025 377.626,185.605 377.658,173.491 365.841,170.827 375.332,163.3 370.047,152.398
|
|
||||||
381.85,155.128 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="429.547,193.886 434.774,204.815 446.576,202.087 441.292,212.987 450.783,220.514
|
|
||||||
438.965,223.178 438.998,235.292 429.547,227.714 420.097,235.292 420.129,223.178 408.312,220.514 417.803,212.987
|
|
||||||
412.517,202.087 424.32,204.815 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="399.179,251.856 403.289,264.508 416.593,264.508 405.83,272.328 409.942,284.98
|
|
||||||
399.179,277.161 388.414,284.98 392.526,272.328 381.763,264.508 395.067,264.508 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="256,85.333 256,115.886 210.833,140.985 256,140.985 256,200.344 196.897,200.344
|
|
||||||
256,233.179 256,255.996 229.32,255.996 155.826,215.17 155.826,255.996 100.174,255.996 100.174,207.423 12.744,255.996
|
|
||||||
0,255.996 0,225.443 45.167,200.344 0,200.344 0,140.985 59.103,140.985 0,108.139 0,85.333 26.68,85.333 100.174,126.16
|
|
||||||
100.174,85.333 155.826,85.333 155.826,133.906 243.256,85.333 "/>
|
|
||||||
</g>
|
|
||||||
<polygon style="fill:#D80027;" points="144,85.33 112,85.33 112,154.662 0,154.662 0,186.662 112,186.662 112,255.996 144,255.996
|
|
||||||
144,186.662 256,186.662 256,154.662 144,154.662 "/>
|
|
||||||
<polygon style="fill:#0052B4;" points="155.826,200.344 256,255.996 256,240.259 184.153,200.344 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="155.826,200.344 256,255.996 256,240.259 184.153,200.344 "/>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#D80027;" points="155.826,200.344 256,255.996 256,240.259 184.153,200.344 "/>
|
|
||||||
<polygon style="fill:#D80027;" points="71.846,200.344 0,240.259 0,255.996 0,255.996 100.174,200.344 "/>
|
|
||||||
</g>
|
|
||||||
<polygon style="fill:#0052B4;" points="100.174,140.982 0,85.33 0,101.067 71.847,140.982 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="100.174,140.982 0,85.33 0,101.067 71.847,140.982 "/>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#D80027;" points="100.174,140.982 0,85.33 0,101.067 71.847,140.982 "/>
|
|
||||||
<polygon style="fill:#D80027;" points="184.154,140.982 256,101.067 256,85.33 256,85.33 155.826,140.982 "/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.6 KiB |
@@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<rect y="85.331" style="fill:#F0F0F0;" width="512" height="341.337"/>
|
|
||||||
<g>
|
|
||||||
<rect y="127.994" style="fill:#D80027;" width="512" height="42.663"/>
|
|
||||||
<rect y="213.331" style="fill:#D80027;" width="512" height="42.663"/>
|
|
||||||
<rect y="298.657" style="fill:#D80027;" width="512" height="42.663"/>
|
|
||||||
<rect y="383.994" style="fill:#D80027;" width="512" height="42.663"/>
|
|
||||||
</g>
|
|
||||||
<rect y="85.331" style="fill:#2E52B2;" width="256" height="183.797"/>
|
|
||||||
<g>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="99.822,160.624 95.699,173.308 82.363,173.308 93.154,181.143 89.031,193.826
|
|
||||||
99.822,185.991 110.606,193.826 106.484,181.143 117.275,173.308 103.938,173.308 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="103.938,219.08 99.822,206.397 95.699,219.08 82.363,219.08 93.154,226.916 89.031,239.599
|
|
||||||
99.822,231.763 110.606,239.599 106.484,226.916 117.275,219.08 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="47.577,219.08 43.46,206.397 39.337,219.08 26.001,219.08 36.792,226.916 32.669,239.599
|
|
||||||
43.46,231.763 54.245,239.599 50.123,226.916 60.912,219.08 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="43.46,160.624 39.337,173.308 26.001,173.308 36.792,181.143 32.669,193.826 43.46,185.991
|
|
||||||
54.245,193.826 50.123,181.143 60.912,173.308 47.577,173.308 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="99.822,114.85 95.699,127.535 82.363,127.535 93.154,135.371 89.031,148.054
|
|
||||||
99.822,140.218 110.606,148.054 106.484,135.371 117.275,127.535 103.938,127.535 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="43.46,114.85 39.337,127.535 26.001,127.535 36.792,135.371 32.669,148.054 43.46,140.218
|
|
||||||
54.245,148.054 50.123,135.371 60.912,127.535 47.577,127.535 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="156.183,160.624 152.061,173.308 138.725,173.308 149.515,181.143 145.394,193.826
|
|
||||||
156.183,185.991 166.969,193.826 162.846,181.143 173.637,173.308 160.301,173.308 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="160.301,219.08 156.183,206.397 152.061,219.08 138.725,219.08 149.515,226.916
|
|
||||||
145.394,239.599 156.183,231.763 166.969,239.599 162.846,226.916 173.637,219.08 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="216.663,219.08 212.546,206.397 208.423,219.08 195.088,219.08 205.877,226.916
|
|
||||||
201.755,239.599 212.546,231.763 223.331,239.599 219.208,226.916 229.999,219.08 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="212.546,160.624 208.423,173.308 195.088,173.308 205.877,181.143 201.755,193.826
|
|
||||||
212.546,185.991 223.331,193.826 219.208,181.143 229.999,173.308 216.663,173.308 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="156.183,114.85 152.061,127.535 138.725,127.535 149.515,135.371 145.394,148.054
|
|
||||||
156.183,140.218 166.969,148.054 162.846,135.371 173.637,127.535 160.301,127.535 "/>
|
|
||||||
<polygon style="fill:#F0F0F0;" points="212.546,114.85 208.423,127.535 195.088,127.535 205.877,135.371 201.755,148.054
|
|
||||||
212.546,140.218 223.331,148.054 219.208,135.371 229.999,127.535 216.663,127.535 "/>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,38 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<rect y="85.331" style="fill:#D80027;" width="512" height="341.337"/>
|
|
||||||
<rect y="85.331" width="512" height="113.775"/>
|
|
||||||
<rect y="312.882" style="fill:#FFDA44;" width="512" height="113.775"/>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 684 B |
@@ -1,57 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
|
||||||
<rect y="85.331" style="fill:#FFFFFF;" width="512" height="341.337"/>
|
|
||||||
<path style="fill:#D80027;" d="M318.33,255.994c0,15.583-27.906,54.539-62.33,54.539s-62.33-38.957-62.33-54.539
|
|
||||||
c0-34.424,27.906-62.33,62.33-62.33S318.33,221.57,318.33,255.994z"/>
|
|
||||||
<path style="fill:#0052B4;" d="M318.33,255.994c0,34.424-27.906,62.33-62.33,62.33s-62.33-27.906-62.33-62.33"/>
|
|
||||||
<rect x="324.205" y="300.55" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -119.6501 327.8224)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="296.657" y="328.085" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -147.1889 316.408)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="357.26" y="333.586" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -133.3277 360.8719)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="329.712" y="361.143" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -160.8823 349.464)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="340.732" y="317.068" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -126.4889 344.3472)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="313.185" y="344.614" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -154.0356 332.936)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="307.483" y="165.555" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 455.5344 535.3814)" width="62.33" height="15.582"/>
|
|
||||||
<rect x="296.656" y="168.315" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 401.8486 518.6624)" width="23.374" height="15.581"/>
|
|
||||||
<rect x="324.193" y="195.864" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 429.3763 585.1636)" width="23.374" height="15.581"/>
|
|
||||||
<rect x="329.693" y="135.257" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 481.6206 485.591)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="357.252" y="162.807" transform="matrix(-0.7071 -0.7071 0.7071 -0.7071 509.1863 552.108)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="125.671" y="347.369" transform="matrix(0.7071 0.7071 -0.7071 0.7071 297.0721 -6.8758)" width="62.33" height="15.582"/>
|
|
||||||
<rect x="175.435" y="344.62" transform="matrix(0.7071 0.7071 -0.7071 0.7071 303.9983 -29.0962)" width="23.374" height="15.581"/>
|
|
||||||
<rect x="147.898" y="317.072" transform="matrix(0.7071 0.7071 -0.7071 0.7071 276.4547 -17.6934)" width="23.374" height="15.582"/>
|
|
||||||
<rect x="158.724" y="314.322" transform="matrix(0.7071 0.7071 -0.7071 0.7071 283.386 -39.9269)" width="62.33" height="15.582"/>
|
|
||||||
<rect x="125.672" y="149.023" transform="matrix(-0.7071 0.7071 -0.7071 -0.7071 378.6212 156.7987)" width="62.33" height="15.582"/>
|
|
||||||
<rect x="142.182" y="165.56" transform="matrix(-0.7071 0.7071 -0.7071 -0.7071 418.4998 173.3536)" width="62.33" height="15.582"/>
|
|
||||||
<rect x="158.712" y="182.089" transform="matrix(-0.7071 0.7071 -0.7071 -0.7071 458.4043 189.8812)" width="62.33" height="15.581"/>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
<g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -40,7 +40,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { mapActions } from 'vuex'
|
import { mapActions } from 'vuex'
|
||||||
import { post, get } from '@/utils/http'
|
import { post, get } from '@/utils/http'
|
||||||
import axios from 'axios'
|
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
import { storageKey } from '@/utils/constants'
|
import { storageKey } from '@/utils/constants'
|
||||||
import { api } from '@/utils/api'
|
import { api } from '@/utils/api'
|
||||||
@@ -70,21 +69,21 @@ export default {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.loading = true
|
this.loading = true
|
||||||
axios.post(api.login, { username: this.username, pin: this.pin }).then(
|
post(api.login, { username: this.username, pin: this.pin }).then(
|
||||||
res => {
|
res => {
|
||||||
if (res.data.code === 200) {
|
if (res.code === 200) {
|
||||||
if (!_.isEmpty(res.data.data.lang)) {
|
if (!_.isEmpty(res.data.lang)) {
|
||||||
localStorage.setItem(storageKey.language, res.data.data.lang)
|
localStorage.setItem(storageKey.language, res.data.lang)
|
||||||
}
|
}
|
||||||
if (!_.isEmpty(res.data.data.theme)) {
|
if (!_.isEmpty(res.data.theme)) {
|
||||||
localStorage.setItem(storageKey.theme, res.data.data.theme)
|
localStorage.setItem(storageKey.theme, res.data.theme)
|
||||||
}
|
}
|
||||||
res.loginSuccessPath = this.$route.query.redirect
|
res.loginSuccessPath = this.$route.query.redirect
|
||||||
this.loginSuccess(res)
|
this.loginSuccess(res)
|
||||||
localStorage.setItem(storageKey.username, this.username)
|
localStorage.setItem(storageKey.username, this.username)
|
||||||
localStorage.setItem(storageKey.userId, res.data.data.userId)
|
localStorage.setItem(storageKey.userId, res.data.userId)
|
||||||
localStorage.setItem(storageKey.token, res.data.data.token)
|
localStorage.setItem(storageKey.token, res.data.token)
|
||||||
} else if (res.data.code === 518005) {
|
} else if (res.code === 518005) {
|
||||||
this.$message.error(this.$t('Incorrect username or password'))
|
this.$message.error(this.$t('Incorrect username or password'))
|
||||||
this.loading = false
|
this.loading = false
|
||||||
this.blockOperation.query = false
|
this.blockOperation.query = false
|
||||||
@@ -98,7 +97,7 @@ export default {
|
|||||||
console.error(e)
|
console.error(e)
|
||||||
this.loading = false
|
this.loading = false
|
||||||
this.blockOperation.query = false
|
this.blockOperation.query = false
|
||||||
this.$message.error(this.errorMsgHandler(e))
|
this.$message.error(this.$t('tip.unknownError'))
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
queryAppearance () {
|
queryAppearance () {
|
||||||
@@ -120,7 +119,7 @@ export default {
|
|||||||
window.$dayJs.tz.setDefault(data.timezone)
|
window.$dayJs.tz.setDefault(data.timezone)
|
||||||
localStorage.setItem(storageKey.timezoneOffset, window.$dayJs.tz().utcOffset() / 60)
|
localStorage.setItem(storageKey.timezoneOffset, window.$dayJs.tz().utcOffset() / 60)
|
||||||
localStorage.setItem(storageKey.timezoneLocalOffset, dayjs().utcOffset() / 60)
|
localStorage.setItem(storageKey.timezoneLocalOffset, dayjs().utcOffset() / 60)
|
||||||
localStorage.setItem(storageKey.dateFormat, data.date_format)
|
localStorage.setItem(storageKey.dateFormat, data.dateFormat)
|
||||||
localStorage.setItem(storageKey.sysName, data.system_name)
|
localStorage.setItem(storageKey.sysName, data.system_name)
|
||||||
localStorage.setItem(storageKey.sysLogo, data.system_logo)
|
localStorage.setItem(storageKey.sysLogo, data.system_logo)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,12 +60,3 @@ body {
|
|||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 表头单词换行不被拆开
|
|
||||||
.el-table th > .cell {
|
|
||||||
word-break: keep-all !important;
|
|
||||||
}
|
|
||||||
// 表格内容换行,不对中文生效,避免中文出现省略号
|
|
||||||
.el-table .cell {
|
|
||||||
word-break: break-word !important;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -42,10 +42,6 @@
|
|||||||
color: #A6AAAE;
|
color: #A6AAAE;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
}
|
}
|
||||||
.cn-icon-filter {
|
|
||||||
color: #A6AAAE;
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
.el-icon-search {
|
.el-icon-search {
|
||||||
color: #3976CB;
|
color: #3976CB;
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
@@ -68,10 +64,6 @@
|
|||||||
color: #A6AAAE;
|
color: #A6AAAE;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
.cn-icon-filter {
|
|
||||||
color: #A6AAAE;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
.el-icon-search {
|
.el-icon-search {
|
||||||
color: white;
|
color: white;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
|||||||
@@ -10,10 +10,9 @@
|
|||||||
right: 10px;
|
right: 10px;
|
||||||
|
|
||||||
.search__suffix {
|
.search__suffix {
|
||||||
margin-left: 8px; // 新版实体列表改版,后续记得解开
|
margin-left: 8px;
|
||||||
|
|
||||||
.cn-icon-search-advance, .cn-icon-search-normal {
|
.cn-icon-search-advance, .cn-icon-search-normal {
|
||||||
//.cn-icon-search-advance, .cn-icon-search-normal, .cn-icon-filter {
|
|
||||||
color: #A6AAAE;
|
color: #A6AAAE;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.date-range-box {
|
.date-range-box {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
//margin-right: 10px;
|
margin-right: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
@@ -204,11 +204,3 @@
|
|||||||
visibility: hidden !important;
|
visibility: hidden !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-date-picker {
|
|
||||||
.el-popper__arrow {
|
|
||||||
position: absolute;
|
|
||||||
top: 20px !important;
|
|
||||||
left: 642px !important; // element上样式设定是left,添加right不生效
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
.pop-custom {
|
.pop-custom {
|
||||||
padding: 12px;
|
padding: 0 12px 12px 12px;
|
||||||
border: 1px solid #EBEEF5;
|
border: 1px solid #EBEEF5;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 55px;
|
top: 55px;
|
||||||
@@ -103,54 +103,3 @@
|
|||||||
border-radius: 2px 0px 0px 2px;
|
border-radius: 2px 0px 0px 2px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.list {
|
|
||||||
list-style: none;
|
|
||||||
padding-inline-start: 0 !important;
|
|
||||||
max-height: 358px !important;
|
|
||||||
overflow: auto;
|
|
||||||
margin: 0 0;
|
|
||||||
|
|
||||||
.drag-move {
|
|
||||||
transition: transform 0.3s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-item:last-child {
|
|
||||||
margin-bottom: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-item {
|
|
||||||
width: 100%;
|
|
||||||
color: #575757;
|
|
||||||
margin-bottom: 0;
|
|
||||||
height: 24px;
|
|
||||||
line-height: 24px;
|
|
||||||
text-align: left;
|
|
||||||
font-weight: 400;
|
|
||||||
font-size: 12px;
|
|
||||||
|
|
||||||
.icon-drag {
|
|
||||||
cursor: move;
|
|
||||||
margin-left: 6px;
|
|
||||||
margin-right: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-checkbox__input.is-checked .el-checkbox__inner {
|
|
||||||
background-color: #38ACD2;
|
|
||||||
border-color: #38ACD2;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-checkbox__input .el-checkbox__inner {
|
|
||||||
background-color: #F2F7F9;
|
|
||||||
border: 1px solid rgba(0, 0, 0, 0.15);
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-checkbox__input.is-checked + .el-checkbox__label, .el-checkbox__input + .el-checkbox__label {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #575757;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -65,8 +65,6 @@
|
|||||||
@import './views/charts2/linkBlock';
|
@import './views/charts2/linkBlock';
|
||||||
@import './views/charts2/linkTrafficSankey';
|
@import './views/charts2/linkTrafficSankey';
|
||||||
@import './views/charts2/linkDirectionGrid';
|
@import './views/charts2/linkDirectionGrid';
|
||||||
@import './views/charts2/domainNameResolution.scss';
|
|
||||||
@import './views/charts2/informationAggregation.scss';
|
|
||||||
@import 'views/charts2/linkTrafficLine';
|
@import 'views/charts2/linkTrafficLine';
|
||||||
@import 'views/charts2/dnsTrafficLine';
|
@import 'views/charts2/dnsTrafficLine';
|
||||||
@import 'views/charts2/dnsRecentEvents';
|
@import 'views/charts2/dnsRecentEvents';
|
||||||
@@ -78,10 +76,5 @@
|
|||||||
@import './components/common/chart-tab';
|
@import './components/common/chart-tab';
|
||||||
|
|
||||||
@import 'views/administration/AdministrationTabs';
|
@import 'views/administration/AdministrationTabs';
|
||||||
@import 'views/administration/Appearance.scss';
|
|
||||||
|
|
||||||
@import 'views/setting/knowledgeBase';
|
@import 'views/setting/knowledgeBase';
|
||||||
@import 'views/charts2/entityDetailLine';
|
|
||||||
@import 'views/charts2/entityDetailTabs';
|
|
||||||
@import 'views/charts2/digitalCertificate';
|
|
||||||
@import 'views/charts2/entityDetailBasicInfo';
|
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
.appearance{
|
|
||||||
height: 100%;
|
|
||||||
display:flex;
|
|
||||||
flex-direction:column;
|
|
||||||
.appearance-form {
|
|
||||||
padding-top:40px;
|
|
||||||
padding-left:100px;
|
|
||||||
background-color: white;
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
height: 100%;
|
|
||||||
.el-input {
|
|
||||||
width:600px;
|
|
||||||
}
|
|
||||||
.el-form .el-form-item .el-form-item__label {
|
|
||||||
padding-bottom: 6px;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 16px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.edit-appearance-base__footer {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
height: 100px;
|
|
||||||
margin-top: 3px;
|
|
||||||
padding-left:200px;
|
|
||||||
|
|
||||||
.footer__btn {
|
|
||||||
margin: 0 10px;
|
|
||||||
height: 30px;
|
|
||||||
min-width: 74px;
|
|
||||||
padding: 0 15px;
|
|
||||||
color: white;
|
|
||||||
background-color: #38ACD2;
|
|
||||||
border: none;
|
|
||||||
border-radius: 4px;
|
|
||||||
outline: none;
|
|
||||||
font-size: 14px;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: background-color linear .2s, color linear .1s;
|
|
||||||
}
|
|
||||||
.footer__btn:hover:not(.footer__btn--disabled) {
|
|
||||||
background-color: lighten(#38ACD2, 10%);
|
|
||||||
}
|
|
||||||
.footer__btn--light {
|
|
||||||
background-color: #F5F6F7;
|
|
||||||
border: 1px solid $--border-color-primary;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
.footer__btn.footer__btn--light:hover:not(.footer__btn--disabled) {
|
|
||||||
background-color: white;
|
|
||||||
border-color: lighten(#38ACD2, 40%);
|
|
||||||
color: #38ACD2;
|
|
||||||
}
|
|
||||||
.footer__btn--disabled {
|
|
||||||
opacity: .6;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
.digital-certificate {
|
|
||||||
$font-family: NotoSansSChineseRegular;
|
|
||||||
|
|
||||||
.digital-certificate-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
.digital-certificate-header__icon {
|
|
||||||
width: 4px;
|
|
||||||
height: 16px;
|
|
||||||
background: #38ACD2;
|
|
||||||
border-radius: 1px;
|
|
||||||
margin-right: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.digital-certificate-header-name {
|
|
||||||
font-family: PingFangSC-Semibold;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #575757;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.digital-certificate-body {
|
|
||||||
height: auto;
|
|
||||||
min-height: 262px;
|
|
||||||
padding: 20px;
|
|
||||||
background: rgba(113, 113, 113, 0.04);
|
|
||||||
border: 1px solid #E2E5ECFF;
|
|
||||||
border-radius: 4px;
|
|
||||||
|
|
||||||
.digital-certificate-body-tags {
|
|
||||||
display: flex;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.certificate-list-list {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.certificate-list-item {
|
|
||||||
width: 50%;
|
|
||||||
display: flex;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
|
|
||||||
.certificate-list-item__label {
|
|
||||||
width: 176px;
|
|
||||||
font-family: $font-family;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #717171;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.certificate-list-item__value, .certificate-list-item__value1 {
|
|
||||||
width: calc(100% - 176px - 75px);
|
|
||||||
font-family: $font-family;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.certificate-list-item__value1 {
|
|
||||||
padding-bottom: 2px;
|
|
||||||
border-bottom: 1px #353636 solid;
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
.type-data__column {
|
|
||||||
display:flex;
|
|
||||||
flex-direction: column;
|
|
||||||
margin-left:5px;
|
|
||||||
margin-right:0px;
|
|
||||||
margin-top:0px;
|
|
||||||
.type-data {
|
|
||||||
display:flex;
|
|
||||||
flex-flow:row wrap;
|
|
||||||
margin-top:0px;
|
|
||||||
.type-title {
|
|
||||||
display:flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
margin-bottom:15px;
|
|
||||||
margin-right:10px;
|
|
||||||
font-family: PingFangSC-Semibold;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #575757;
|
|
||||||
line-height: 20px;
|
|
||||||
font-weight: 600;
|
|
||||||
.title-mark {
|
|
||||||
width: 4px;
|
|
||||||
height: 16px;
|
|
||||||
margin-left:0px;
|
|
||||||
margin-right: 6px;
|
|
||||||
background: #38ACD2;
|
|
||||||
border-radius: 1px;
|
|
||||||
}
|
|
||||||
.type-title-word {
|
|
||||||
margin-right: 6px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.type-content {
|
|
||||||
margin-bottom:15px;
|
|
||||||
display:flex;
|
|
||||||
flex-flow: row wrap;
|
|
||||||
width:100%;
|
|
||||||
.data-item {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
background: rgba(119,131,145,0.06);
|
|
||||||
border: 1px solid rgba(119,131,145,0.36);
|
|
||||||
border-radius: 2px;
|
|
||||||
height:28px;
|
|
||||||
padding:8px 15px;
|
|
||||||
margin-right:10px;
|
|
||||||
margin-bottom:15px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.type-error-content {
|
|
||||||
width:100%;
|
|
||||||
height: 40px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.type-error-content__block {
|
|
||||||
position: absolute;
|
|
||||||
left: -12px;
|
|
||||||
top: -12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
.el-popper.analysis-popper {
|
|
||||||
top: -5px !important;
|
|
||||||
padding: 0;
|
|
||||||
border: 1px solid #C5C5C5;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: -1px 1px 10px -1px rgba(205,205,205,0.85);
|
|
||||||
|
|
||||||
.el-popper__arrow {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
.analysis-entry {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
.analysis-entry__header {
|
|
||||||
height: 42px;
|
|
||||||
line-height: 42px;
|
|
||||||
background-color: #F7F7F7;
|
|
||||||
padding-left: 20px;
|
|
||||||
color: #353636;
|
|
||||||
border-radius: 4px 4px 0 0;
|
|
||||||
}
|
|
||||||
.analysis-entry__body {
|
|
||||||
display: flex;
|
|
||||||
height: 134px;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-around;
|
|
||||||
|
|
||||||
.analysis-entry-item {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
div i, span {
|
|
||||||
color: #046ECA;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
div {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
margin-bottom: 9px;
|
|
||||||
height: 46px;
|
|
||||||
width: 46px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: #F5F6F8;
|
|
||||||
|
|
||||||
i {
|
|
||||||
color: #353636;
|
|
||||||
font-size: 22px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
span {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #353636;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.entity-detail-basic-info {
|
|
||||||
position: relative;
|
|
||||||
padding: 35px 30px 0 30px;
|
|
||||||
height: 100%;
|
|
||||||
border: 1px solid #E2E5EC;
|
|
||||||
border-radius: 4px;
|
|
||||||
|
|
||||||
.dividing-line {
|
|
||||||
height: 1px;
|
|
||||||
width: calc(100% - 60px);
|
|
||||||
margin-top: 21px;
|
|
||||||
background-color: #EFF2F5;
|
|
||||||
}
|
|
||||||
.entity-type {
|
|
||||||
color: #717171;
|
|
||||||
}
|
|
||||||
.entity-basic-info {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
.entity-basic-info__name {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
span {
|
|
||||||
padding-right: 12px;
|
|
||||||
font-family: Helvetica-Bold;
|
|
||||||
font-size: 32px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
div {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
height: 28px;
|
|
||||||
width: 28px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: #EFF1F4;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
i {
|
|
||||||
color: #717171;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.analysis-btn {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
height: 24px;
|
|
||||||
padding: 0 10px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #046ECA;
|
|
||||||
cursor: pointer;
|
|
||||||
background-color: #FFF;
|
|
||||||
transition: background-color linear .2s;
|
|
||||||
|
|
||||||
&.analysis-btn--active {
|
|
||||||
background-color: #EBF7FA;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
i {
|
|
||||||
padding-right: 4px;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.entity-tags {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
align-items: center;
|
|
||||||
margin-top: 16px;
|
|
||||||
margin-bottom: -10px;
|
|
||||||
|
|
||||||
.entity-tag {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
margin-right: 10px;
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.entity-detail-info {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: row wrap;
|
|
||||||
align-content: space-around;
|
|
||||||
padding: 10px 0;
|
|
||||||
|
|
||||||
.detail-card {
|
|
||||||
display: flex;
|
|
||||||
padding: 0 12px;
|
|
||||||
width: 298px;
|
|
||||||
height: 83px;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
i {
|
|
||||||
font-size: 22px;
|
|
||||||
color: #353636;
|
|
||||||
margin-right: 14px;
|
|
||||||
}
|
|
||||||
.detail-card__text {
|
|
||||||
.detail-card__label {
|
|
||||||
margin-bottom: 6px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #717171;
|
|
||||||
}
|
|
||||||
.detail-card__value {
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 3;
|
|
||||||
overflow: hidden;
|
|
||||||
color: #222;
|
|
||||||
line-height: 18px;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
.entity-detail-line {
|
|
||||||
height: 100%;
|
|
||||||
border-radius: 4px;
|
|
||||||
|
|
||||||
.line-header-right {
|
|
||||||
.panel__tools {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
& > .el-select {
|
|
||||||
width: 162px;
|
|
||||||
margin-right: 10px;
|
|
||||||
|
|
||||||
.select-prefix {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #999;
|
|
||||||
padding: 0 6px 0 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-input__inner {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #353636;
|
|
||||||
}
|
|
||||||
|
|
||||||
.common-select {
|
|
||||||
top: 32px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel__time {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.line-select-metric {
|
|
||||||
margin-right: 20px;
|
|
||||||
|
|
||||||
.el-input__inner {
|
|
||||||
width: 127px;
|
|
||||||
height: 24px;
|
|
||||||
line-height: 24px;
|
|
||||||
padding-left: 4px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #2C72C6;
|
|
||||||
font-weight: 400;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-select-reference-line {
|
|
||||||
margin-left: 0 !important;
|
|
||||||
line-height: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-margin-right {
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.line-date-right {
|
|
||||||
margin-right: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entity-detail-date-time-range {
|
|
||||||
height: 24px;
|
|
||||||
line-height: 24px;
|
|
||||||
border: 1px solid #DCDFE6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
.entity-detail-tabs {
|
|
||||||
position: relative;
|
|
||||||
$tab-border-color: #E2E5EC;
|
|
||||||
$tab-border-radius: 4px;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.entity-detail-tabs__active-bar {
|
|
||||||
position: absolute;
|
|
||||||
height: 3px;
|
|
||||||
top: 1px;
|
|
||||||
background-color: #046EC9;
|
|
||||||
border-radius: 4px 4px 0 0;
|
|
||||||
transition: all linear .2s;
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-chart__tabs--border-card {
|
|
||||||
height: 100%;
|
|
||||||
border: none;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
& > .el-tabs__header {
|
|
||||||
background-color: #fff;
|
|
||||||
border-bottom: 1px solid $tab-border-color;
|
|
||||||
|
|
||||||
.el-tabs__item {
|
|
||||||
color: #353636;
|
|
||||||
user-select: none; // 避免鼠标框选文字
|
|
||||||
|
|
||||||
i {
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tabs__item:not(.is-disabled):not(.is-active):hover {
|
|
||||||
color: #353636;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tabs__item.is-active {
|
|
||||||
color: #046ECA;
|
|
||||||
background-color: #FFFFFF;
|
|
||||||
border-right-color: $tab-border-color;
|
|
||||||
border-left-color: $tab-border-color;
|
|
||||||
border-radius: 4px 4px 0 0;
|
|
||||||
box-shadow: 0 1px $tab-border-color inset;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: #046ECA;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tabs__item:first-of-type.is-active {
|
|
||||||
box-shadow: 1px 1px $tab-border-color inset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-tabs__content {
|
|
||||||
height: calc(100% - 39px);
|
|
||||||
border: 1px solid $tab-border-color;
|
|
||||||
border-top: none;
|
|
||||||
padding: 30px 20px 20px 20px; // 根据原型调整上边距为30px,但20px更协调
|
|
||||||
}
|
|
||||||
|
|
||||||
.tab-pane--border-card {
|
|
||||||
position: relative;
|
|
||||||
height: 100%;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
.tab-pane-warn--icon {
|
|
||||||
width: 16px;
|
|
||||||
color: #E48F3E;
|
|
||||||
margin-left: 10px;
|
|
||||||
margin-right: 0 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.entity-detail-event-border {
|
|
||||||
border: 1px solid #E2E5EC;
|
|
||||||
border-radius: $tab-border-radius;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entity-detail-event-block {
|
|
||||||
width: calc(100% - 2px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.entity-detail-event-error {
|
|
||||||
margin-top: 18px;
|
|
||||||
margin-left: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entity-detail-performance {
|
|
||||||
height: 46px;
|
|
||||||
border-radius: $tab-border-radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entity-detail-security {
|
|
||||||
height: 70px;
|
|
||||||
border-radius: $tab-border-radius;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
.information-aggregation__table {
|
|
||||||
.intelligence-content {
|
|
||||||
padding-top:10px !important;
|
|
||||||
padding-bottom:4px !important;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: flex-start;
|
|
||||||
.information-aggregation-tags {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: flex-start;
|
|
||||||
margin-bottom:6px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.information-aggregation__valid {
|
|
||||||
background: #eff3e9;
|
|
||||||
border-radius: 10px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #7E9F54;
|
|
||||||
font-weight: 500;
|
|
||||||
width:fit-content;
|
|
||||||
padding-left:10px;
|
|
||||||
padding-right:10px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
}
|
|
||||||
.information-aggregation__invalid {
|
|
||||||
background: #ededed;
|
|
||||||
border-radius: 10px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #717171;
|
|
||||||
font-weight: 500;
|
|
||||||
width:fit-content;
|
|
||||||
padding-left:10px;
|
|
||||||
padding-right:10px;
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
.el-table thead {
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 12px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 500;
|
|
||||||
height:32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table th {
|
|
||||||
padding: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table--border th, .el-table--border td {
|
|
||||||
border-right: 0px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-table--border {
|
|
||||||
//border: 1px solid #E2E5EC;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.margin-r-6{
|
|
||||||
margin-right: 6px;
|
|
||||||
}
|
|
||||||
.margin-b-6{
|
|
||||||
margin-bottom: 6px;
|
|
||||||
}
|
|
||||||
.padding-0{
|
|
||||||
padding:0px !important;
|
|
||||||
}
|
|
||||||
@@ -17,7 +17,8 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: calc(100% - 20px);
|
width: calc(100% - 20px);
|
||||||
height: calc(100% - 60px);
|
height: calc(100% - 60px);
|
||||||
margin-top: 50px;
|
margin-left: -12px;
|
||||||
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
.data-grid {
|
.data-grid {
|
||||||
height: 100px;
|
height: 100px;
|
||||||
|
|||||||
@@ -256,15 +256,7 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
.el-tabs__item.is-top {
|
.el-tabs__item.is-top {
|
||||||
height: 50px;
|
height: 32px;
|
||||||
line-height: 60px;
|
|
||||||
|
|
||||||
&.is-active {
|
|
||||||
color: #046eca;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-tabs__active-bar {
|
|
||||||
background-color: #306DC2;
|
|
||||||
}
|
}
|
||||||
.el-tabs__item.is-top:nth-child(2) {
|
.el-tabs__item.is-top:nth-child(2) {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -272,7 +264,7 @@
|
|||||||
.body__searcher {
|
.body__searcher {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 28px;
|
right: 28px;
|
||||||
top: 11px;
|
top: 9px;
|
||||||
width: 280px;
|
width: 280px;
|
||||||
.el-input.el-input--mini {
|
.el-input.el-input--mini {
|
||||||
.el-input__inner {
|
.el-input__inner {
|
||||||
@@ -290,9 +282,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*.el-tabs__nav-wrap::after {
|
.el-tabs__nav-wrap::after {
|
||||||
height: 0;
|
height: 0;
|
||||||
}*/
|
}
|
||||||
.el-tabs__header {
|
.el-tabs__header {
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
.line-header {
|
.line-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
height: 73px;
|
|
||||||
.line-select.line-header-right {
|
.line-select.line-header-right {
|
||||||
display: flex;
|
display: flex;
|
||||||
//flex: 1;
|
//flex: 1;
|
||||||
|
|||||||
@@ -123,7 +123,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
.el-table__header tr th:nth-of-type(1) .cell {
|
.el-table__header tr th:nth-of-type(1) .cell {
|
||||||
justify-content: flex-start;
|
justify-content: start;
|
||||||
}
|
}
|
||||||
.score-cell {
|
.score-cell {
|
||||||
display: flex !important;
|
display: flex !important;
|
||||||
|
|||||||
@@ -114,6 +114,6 @@
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 32px;
|
top: 68px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,3 @@
|
|||||||
.panel-box2.panel-box2--entity-detail {
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
.chart-list {
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
&>.vue-grid-layout {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.panel-box2 {
|
.panel-box2 {
|
||||||
height: calc(100% - 20px);
|
height: calc(100% - 20px);
|
||||||
.panel__header {
|
.panel__header {
|
||||||
|
|||||||
@@ -107,9 +107,6 @@
|
|||||||
letter-spacing: 0;
|
letter-spacing: 0;
|
||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
font-style: italic;
|
|
||||||
padding: 0 2px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
}
|
||||||
.detection-event-severity-color-block {
|
.detection-event-severity-color-block {
|
||||||
width: 5px;
|
width: 5px;
|
||||||
@@ -146,12 +143,12 @@
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
.basic-info__item {
|
.basic-info__item {
|
||||||
padding-right: 30px;
|
padding-right: 40px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
i {
|
i {
|
||||||
padding-right: 5px;
|
padding-right: 6px;
|
||||||
color: #8FA1BE;
|
color: #8FA1BE;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,5 +220,6 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
|
//todo 此处文字显示白色,暂时取消
|
||||||
//color: white;
|
//color: white;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content:space-between;
|
justify-content:space-between;
|
||||||
align-items:center;
|
align-items:center;
|
||||||
padding: 10px 20px 10px 0;
|
padding: 10px 20px 10px 0px;
|
||||||
flex: 0 0 40px;
|
flex: 0 0 40px;
|
||||||
|
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.chart-content {
|
.chart-content {
|
||||||
height: 147px;
|
height:calc(100% - 40px);
|
||||||
}
|
}
|
||||||
.statistics__severity {
|
.statistics__severity {
|
||||||
width: 33%;
|
width: 33%;
|
||||||
|
|||||||
@@ -1,67 +1,3 @@
|
|||||||
.entity-detail {
|
|
||||||
.entity-tag {
|
|
||||||
display: flex;
|
|
||||||
height: 28px;
|
|
||||||
padding: 0 12px;
|
|
||||||
justify-content: center;
|
|
||||||
line-height: 28px;
|
|
||||||
font-size: 14px;
|
|
||||||
border: 1px solid;
|
|
||||||
border-radius: 2px;
|
|
||||||
|
|
||||||
&.entity-tag--small {
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
padding: 0 6px;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
$normal-color: #778391;
|
|
||||||
$normal-light-color: #F7F8F9;
|
|
||||||
$negative-color: #E26154;
|
|
||||||
$negative-light-color: #FEF6F5;
|
|
||||||
$positive-color: #749F4D;
|
|
||||||
$positive-light-color: #F7FAF5;
|
|
||||||
&.entity-tag--level-one-normal {
|
|
||||||
border-color: $normal-color;
|
|
||||||
color: white;
|
|
||||||
background-color: $normal-color;
|
|
||||||
}
|
|
||||||
&.entity-tag--level-one-negative {
|
|
||||||
border-color: $negative-color;
|
|
||||||
color: white;
|
|
||||||
background-color: $negative-color;
|
|
||||||
}
|
|
||||||
&.entity-tag--level-one-positive {
|
|
||||||
border-color: $positive-color;
|
|
||||||
color: white;
|
|
||||||
background-color: $positive-color;
|
|
||||||
}
|
|
||||||
&.entity-tag--level-two-normal {
|
|
||||||
border-color: $normal-color;
|
|
||||||
color: $normal-color;
|
|
||||||
background-color: $normal-light-color;
|
|
||||||
}
|
|
||||||
&.entity-tag--level-two-negative {
|
|
||||||
border-color: $negative-color;
|
|
||||||
color: $negative-color;
|
|
||||||
background-color: $negative-light-color;
|
|
||||||
}
|
|
||||||
&.entity-tag--level-two-positive {
|
|
||||||
border-color: $positive-color;
|
|
||||||
color: $positive-color;
|
|
||||||
background-color: $positive-light-color;
|
|
||||||
}
|
|
||||||
&.entity-tag--level-two-negative-no-background {
|
|
||||||
border-color: $negative-color;
|
|
||||||
color: $negative-color;
|
|
||||||
}
|
|
||||||
&.entity-tag--level-two-positive-no-background {
|
|
||||||
border-color: $positive-color;
|
|
||||||
color: $positive-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
.entity-detail.cn-home {
|
.entity-detail.cn-home {
|
||||||
.panel-chart {
|
.panel-chart {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -169,4 +105,3 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
}
|
}
|
||||||
.el-button--mini{
|
.el-button--mini{
|
||||||
padding: 4px 6px !important;
|
padding: 4px 6px !important;
|
||||||
min-height: 28px !important;
|
min-height: 26px !important;
|
||||||
&.active i {
|
&.active i {
|
||||||
color: $--color-primary;
|
color: $--color-primary;
|
||||||
}
|
}
|
||||||
@@ -50,10 +50,6 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
.explorer-top-tools-new {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
.explorer-top-tools-title {
|
.explorer-top-tools-title {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
@@ -68,7 +64,7 @@
|
|||||||
color: #353636;
|
color: #353636;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
margin-right: 20px;
|
margin-right: 10px;
|
||||||
border: 1px solid #E2E5EC;
|
border: 1px solid #E2E5EC;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -81,13 +77,6 @@
|
|||||||
border: 1px solid #E2E5EC;
|
border: 1px solid #E2E5EC;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
.explorer-result {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 18px;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
.explorer-container {
|
.explorer-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
overflow: visible; /*overflow: hidden;*/
|
overflow: visible; /*overflow: hidden;*/
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
background: #FFFFFF;
|
background: #FFFFFF;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
transition: all .2s;
|
transition: all .2s;
|
||||||
//border: 1px solid #E2E5EC; 新版实体列表改版,后续记得解开
|
|
||||||
|
|
||||||
&:hover .cn-entity__header .header__content {
|
&:hover .cn-entity__header .header__content {
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
.cn-entity--list {
|
.cn-entity--list {
|
||||||
display: flex;
|
display: flex;
|
||||||
//border: 1px #E2E5EC solid;
|
|
||||||
//margin-bottom: 10px;
|
|
||||||
//border-radius: 4px;
|
|
||||||
// 新版实体列表改版,后续记得解开
|
|
||||||
|
|
||||||
.cn-entity__collapse {
|
.cn-entity__collapse {
|
||||||
margin-bottom: 1px;
|
margin-bottom: 1px;
|
||||||
@@ -13,8 +9,7 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
background-color: #F3F7FA;
|
background-color: #F3F7FA;
|
||||||
//border-radius: 4px 0 0 4px;
|
|
||||||
// 新版实体列表改版,后续记得解开
|
|
||||||
span {
|
span {
|
||||||
transform: rotate(0);
|
transform: rotate(0);
|
||||||
transition: all linear .2s;
|
transition: all linear .2s;
|
||||||
@@ -41,12 +36,10 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
//align-content: center;
|
|
||||||
padding: 16px 0;
|
padding: 16px 0;
|
||||||
margin-bottom: 1px;
|
margin-bottom: 1px;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
//border-radius: 0 4px 4px 0;
|
|
||||||
// 新版实体列表改版,后续记得解开
|
|
||||||
.cn-entity__icon {
|
.cn-entity__icon {
|
||||||
margin-left: 26px;
|
margin-left: 26px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
@@ -77,13 +70,6 @@
|
|||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
padding-bottom: 3px;
|
padding-bottom: 3px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
//.cn-entity__header-title {
|
|
||||||
// margin-right: 10px;
|
|
||||||
//}
|
|
||||||
//.cn-entity__header-tag {
|
|
||||||
//
|
|
||||||
//}
|
|
||||||
// 新版实体列表改版,后续记得解开
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.cn-entity__body {
|
.cn-entity__body {
|
||||||
@@ -101,7 +87,7 @@
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
.basic-info__item {
|
.basic-info__item {
|
||||||
padding-right: 30px;
|
padding-right: 40px;
|
||||||
|
|
||||||
.item__box {
|
.item__box {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -119,7 +105,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
i {
|
i {
|
||||||
padding-right: 5px;
|
padding-right: 6px;
|
||||||
color: #8FA1BE;
|
color: #8FA1BE;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
height: 13px;
|
height: 13px;
|
||||||
@@ -161,6 +147,8 @@
|
|||||||
span:last-of-type {
|
span:last-of-type {
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,19 +157,10 @@
|
|||||||
padding: 0 30px;
|
padding: 0 30px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #3976CB;
|
color: #3976CB;
|
||||||
//color: #2C72C6;
|
|
||||||
//font-weight: 400;
|
|
||||||
//margin-top: -17px;
|
|
||||||
// 新版实体列表改版,后续记得解开
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
//i {
|
|
||||||
// font-size: 12px;
|
|
||||||
// margin-right: 5px;
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,6 @@
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.list-desc{
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-title {
|
.top-title {
|
||||||
font-size: 24px;
|
font-size: 24px;
|
||||||
color: #353636;
|
color: #353636;
|
||||||
@@ -28,593 +22,6 @@
|
|||||||
padding-top: 20px;
|
padding-top: 20px;
|
||||||
margin-left:20px;
|
margin-left:20px;
|
||||||
}
|
}
|
||||||
.knowledge-base__content {
|
|
||||||
display:flex;
|
|
||||||
flex-direction:row;
|
|
||||||
padding:12px 20px 20px 20px;
|
|
||||||
height:calc(100% - 52px);
|
|
||||||
.left-filter {
|
|
||||||
margin-right:20px;
|
|
||||||
width:320px;
|
|
||||||
min-width:320px;
|
|
||||||
height:100%;
|
|
||||||
display:flex;
|
|
||||||
flex-direction:column;
|
|
||||||
background: #FFFFFF;
|
|
||||||
border: 1px solid rgba(226,229,236,1);
|
|
||||||
border-radius: 4px;
|
|
||||||
overflow: auto;
|
|
||||||
.filter-title {
|
|
||||||
height:32px;
|
|
||||||
padding-left:20px;
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
background: #F7F7F7;
|
|
||||||
box-shadow: 0 1px 0 0 rgba(226,229,236,1);
|
|
||||||
border-radius: 4px 4px 0 0;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 500;
|
|
||||||
//font-family: $fontFamily !important;
|
|
||||||
}
|
|
||||||
.knowledge-filter {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
margin-bottom: 0;
|
|
||||||
.filter__header {
|
|
||||||
display: flex;
|
|
||||||
flex: 0 0 32px;
|
|
||||||
align-items: center;
|
|
||||||
padding-left: 20px;
|
|
||||||
color: #666;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-top:15px;
|
|
||||||
span {
|
|
||||||
font-size: 14px;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
i {
|
|
||||||
font-size: 12px;
|
|
||||||
transition: all linear .1s;
|
|
||||||
transform: rotate(0) translate(0, 2px);
|
|
||||||
}
|
|
||||||
i.arrow-rotate {
|
|
||||||
transform: rotate(90deg) translate(2px, 3px);
|
|
||||||
}
|
|
||||||
.new-knowledge-filter-header-title {
|
|
||||||
//font-family: $fontFamily !important;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
.new-knowledge-filter-icon {
|
|
||||||
margin-left: 8px;
|
|
||||||
margin-bottom: 2px;
|
|
||||||
font-weight: bold !important;
|
|
||||||
color: #575757;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.filter__body {
|
|
||||||
padding: 3px 0 0 20px;
|
|
||||||
.el-tree {
|
|
||||||
font-size:14px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 400;
|
|
||||||
.el-tree-node {
|
|
||||||
.el-tree-node__content {
|
|
||||||
margin-bottom: 2px;
|
|
||||||
.custom-tree-node {
|
|
||||||
flex: 1;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding-right: 20px;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 400;
|
|
||||||
.count-tree-node {
|
|
||||||
color: #717171;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-checkbox-group {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.el-checkbox {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
padding: 5px 0;
|
|
||||||
margin-right: 5px;
|
|
||||||
.el-checkbox__input {
|
|
||||||
.el-checkbox__inner {
|
|
||||||
background: #F2F7F9;
|
|
||||||
border: 1px solid rgba(0,0,0,0.15);
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-indeterminate .el-checkbox__inner {
|
|
||||||
border-color: #38ACD2;
|
|
||||||
background: #38ACD2;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-indeterminate .el-checkbox__inner:before {
|
|
||||||
background: #FFFFFF;
|
|
||||||
border-radius: 1px;
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-checked {
|
|
||||||
.el-checkbox__inner {
|
|
||||||
border-color: #38ACD2;
|
|
||||||
background: #38ACD2;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-focus {
|
|
||||||
.el-checkbox__inner {
|
|
||||||
border-color: #38ACD2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-checkbox__label {
|
|
||||||
width: 100%;
|
|
||||||
padding-right:15px;
|
|
||||||
padding-left:7px;
|
|
||||||
}
|
|
||||||
.filter__checkbox-label {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
font-weight: 400;
|
|
||||||
//font-family: NotoSansSChineseRegular !important;
|
|
||||||
color: #353636;
|
|
||||||
font-size: 14px;
|
|
||||||
.filter-label {
|
|
||||||
display: flex;
|
|
||||||
//color: #353636;
|
|
||||||
}
|
|
||||||
.filter-count {
|
|
||||||
color: #717171 !important;
|
|
||||||
}
|
|
||||||
.severity-color-block {
|
|
||||||
width: 4px;
|
|
||||||
height: 15px;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:last-of-type {
|
|
||||||
padding-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.knowledge-filter:last-child {
|
|
||||||
.filter__header {
|
|
||||||
margin-top:10px !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.right-list-card {
|
|
||||||
display:flex;
|
|
||||||
flex-direction:column;
|
|
||||||
justify-content: space-between;
|
|
||||||
width: calc(100% - 340px);
|
|
||||||
max-width: calc(100% - 340px);
|
|
||||||
height:100%;
|
|
||||||
.top-tools {
|
|
||||||
display: flex;
|
|
||||||
align-items : center;
|
|
||||||
flex-direction:row;
|
|
||||||
justify-content: space-between ;
|
|
||||||
//height:28px;
|
|
||||||
width:100%;
|
|
||||||
margin-bottom:20px;
|
|
||||||
.top-tools__right {
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
align-items: center;
|
|
||||||
//padding-bottom: 18px;
|
|
||||||
|
|
||||||
&>div {
|
|
||||||
//padding: 0 0 0 10px;
|
|
||||||
}
|
|
||||||
.el-button {
|
|
||||||
color: #575757;
|
|
||||||
}
|
|
||||||
.el-button--mini{
|
|
||||||
padding: 7px 9px !important;
|
|
||||||
min-height: 28px !important;
|
|
||||||
&.active i {
|
|
||||||
color: #046ECA;
|
|
||||||
}
|
|
||||||
i {
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tools__left {
|
|
||||||
display: flex;
|
|
||||||
align-items : center;
|
|
||||||
flex-direction:row;
|
|
||||||
.top-tool-btn {
|
|
||||||
cursor: pointer;
|
|
||||||
height: 28px;
|
|
||||||
width: 28px;
|
|
||||||
border: 1px solid $--border-color-primary;
|
|
||||||
outline: none;
|
|
||||||
border-radius: $--button-border-radius;
|
|
||||||
background-color: $--button-gray-background-color;
|
|
||||||
transition: background-color linear .1s;
|
|
||||||
font-size:12px;
|
|
||||||
font-weight: 500;
|
|
||||||
//font-family: $fontFamily !important;
|
|
||||||
i {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #575757;
|
|
||||||
margin-right:4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn:disabled {
|
|
||||||
cursor: not-allowed;
|
|
||||||
opacity: 0.66;
|
|
||||||
i {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn:hover:not(.cn-btn-disabled) {
|
|
||||||
border: 1px solid $--border-color-primary;
|
|
||||||
background-color: $--button-gray-hover-background-color;
|
|
||||||
}
|
|
||||||
.top-tool-btn:focus:not(.cn-btn-disabled), .top-tool-btn.is-focus {
|
|
||||||
background-color: $--button-gray-active-background-color;
|
|
||||||
border: 1px solid $--border-color-primary;
|
|
||||||
i {
|
|
||||||
color: #575757;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn--delete.top-tool-btn:focus:not(.cn-btn-disabled) {
|
|
||||||
background-color: $--button-gray-hover-background-color;
|
|
||||||
border-color: #FFC4B9;
|
|
||||||
i {
|
|
||||||
color: #F0745A;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn--create {
|
|
||||||
background-color: #38ACD2 !important;
|
|
||||||
border-color: #2E88A6 !important;
|
|
||||||
color:#FFFFFF;
|
|
||||||
i {
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn--create:hover {
|
|
||||||
background-color: #57B8D9 !important;
|
|
||||||
border-color: #2E88A6 !important;
|
|
||||||
color:#FFFFFF;
|
|
||||||
i {
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn--create:focus {
|
|
||||||
background-color: #31A5CD !important;
|
|
||||||
border-color: #2E88A6 !important;
|
|
||||||
color:#FFFFFF !important;
|
|
||||||
i {
|
|
||||||
color: #FFFFFF !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn--create:disabled {
|
|
||||||
opacity: 0.66;
|
|
||||||
background-color: #38ACD2 !important;
|
|
||||||
border-color: #2E88A6 !important;
|
|
||||||
color:#FFFFFF;
|
|
||||||
i {
|
|
||||||
color: #FFFFFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-search {
|
|
||||||
display:flex;
|
|
||||||
width:242px;//calc(100% - 256px);
|
|
||||||
.el-input--small{
|
|
||||||
line-height: 27px;
|
|
||||||
.el-input__inner {
|
|
||||||
height: 28px;
|
|
||||||
border-radius: 2px 0 0 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-tool-btn {
|
|
||||||
border-left: none;
|
|
||||||
border-radius: 0 2px 2px 0 !important;
|
|
||||||
}
|
|
||||||
.top-tool-btn--search:hover {
|
|
||||||
border-left: none !important;
|
|
||||||
border-radius: 0 2px 2px 0 !important;
|
|
||||||
}
|
|
||||||
.top-tool-btn--search:focus {
|
|
||||||
border-left: none !important;
|
|
||||||
border-radius: 0 2px 2px 0 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.list-mode__row {
|
|
||||||
width: 100%;
|
|
||||||
height:calc(100% - 102px);
|
|
||||||
//overflow-y:auto;
|
|
||||||
margin-bottom:0px;
|
|
||||||
padding-bottom:30px;
|
|
||||||
.el-checkbox .el-checkbox__input.is-checked .el-checkbox__inner {
|
|
||||||
border-color: #38ACD2;
|
|
||||||
background: #38ACD2;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-indeterminate .el-checkbox__inner {
|
|
||||||
background-color: #38ACD2;
|
|
||||||
border-color: #38ACD2;
|
|
||||||
}
|
|
||||||
.el-table--border {
|
|
||||||
border: 1px solid rgba(226,229,236,1);
|
|
||||||
border-radius: 4px;
|
|
||||||
border-right:none;
|
|
||||||
border-bottom:none;
|
|
||||||
}
|
|
||||||
.el-table--border th ,.el-table--border td {
|
|
||||||
border-right: none;
|
|
||||||
}
|
|
||||||
.el-table {
|
|
||||||
th {
|
|
||||||
padding-top:6px;
|
|
||||||
padding-bottom:6px;
|
|
||||||
font-size:12px;
|
|
||||||
line-height:12px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding-top:8px;
|
|
||||||
padding-bottom:8px;
|
|
||||||
font-size:12px;
|
|
||||||
line-height:12px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
.cell {
|
|
||||||
height: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.list-mode__card {
|
|
||||||
width: 100%;
|
|
||||||
height:calc(100% - 134px);
|
|
||||||
overflow-y:auto;
|
|
||||||
padding-right: 2px;
|
|
||||||
margin-bottom:30px;
|
|
||||||
.table-no-data{
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
line-height: 60px;
|
|
||||||
color: #909399;
|
|
||||||
}
|
|
||||||
.el-checkbox-group {
|
|
||||||
display: grid;
|
|
||||||
grid-template-rows: repeat(auto-fill, 218px);
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(282px, 1fr));
|
|
||||||
grid-gap: 30px;
|
|
||||||
}
|
|
||||||
.card-selected{
|
|
||||||
box-shadow: 3px 3px 11px 0 rgba(0,0,0,0.1);
|
|
||||||
border: 1px solid rgba(197,197,197,1) !important;
|
|
||||||
}
|
|
||||||
.card-item {
|
|
||||||
background: #FFFFFF;
|
|
||||||
border: 1px solid rgba(226,229,236,1);
|
|
||||||
border-radius: 4px;
|
|
||||||
/*width:282px;
|
|
||||||
margin-bottom:30px;
|
|
||||||
margin-right:30px;*/
|
|
||||||
height:218px;
|
|
||||||
display:flex;
|
|
||||||
flex-direction:column;
|
|
||||||
|
|
||||||
.card-content {
|
|
||||||
height:calc(100% - 32px);
|
|
||||||
padding:16px;
|
|
||||||
display:flex;
|
|
||||||
flex-direction: column;
|
|
||||||
.card-title {
|
|
||||||
//font-family: NotoSansSC-Bold;
|
|
||||||
font-size: 16px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 700;
|
|
||||||
margin-bottom:6px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
.card-title-name {
|
|
||||||
width:210px;
|
|
||||||
overflow: hidden; //超出的文本隐藏
|
|
||||||
text-overflow: ellipsis; //溢出用省略号显示
|
|
||||||
white-space:nowrap;
|
|
||||||
word-break: break-all;
|
|
||||||
}
|
|
||||||
.card-title-more {
|
|
||||||
position: relative;
|
|
||||||
color:#575757;
|
|
||||||
.el-checkbox__input.is-checked .el-checkbox__inner {
|
|
||||||
background-color: #38ACD2;
|
|
||||||
border-color: #38ACD2;
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-checked .el-checkbox__inner::after {
|
|
||||||
left: 5px;
|
|
||||||
top: 2px;
|
|
||||||
}
|
|
||||||
.el-checkbox__inner {
|
|
||||||
border-radius: 50%;
|
|
||||||
width:16px;
|
|
||||||
height:16px;
|
|
||||||
background-color: #DEDEDE;
|
|
||||||
border-color: #DEDEDE;
|
|
||||||
z-index:1;
|
|
||||||
}
|
|
||||||
.el-checkbox__inner::after {
|
|
||||||
left: 5px;
|
|
||||||
top: 2px;
|
|
||||||
transform: rotate(45deg) scaleY(1);
|
|
||||||
}
|
|
||||||
.card-operate {
|
|
||||||
background: #FFFFFF;
|
|
||||||
border: 1px solid rgba(197,197,197,1);
|
|
||||||
box-shadow: -1px 1px 10px -1px rgba(205,205,205,0.85);
|
|
||||||
border-radius: 2px;
|
|
||||||
position: absolute;
|
|
||||||
top: 20px;
|
|
||||||
right: -10px;
|
|
||||||
height: 56px;
|
|
||||||
width: 80px;
|
|
||||||
display:flex;
|
|
||||||
flex-direction: column;
|
|
||||||
padding-top:4px;
|
|
||||||
padding-bottom:4px;
|
|
||||||
font-family: Helvetica;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 400;
|
|
||||||
.card-title-more-delete {
|
|
||||||
z-index: 1;
|
|
||||||
line-height: 24px;
|
|
||||||
height: 24px;
|
|
||||||
background: #FFFFFF;
|
|
||||||
//box-shadow: -1px 1px 10px -1px rgba(205,205,205,0.85);
|
|
||||||
//border-radius: 2px;
|
|
||||||
padding-left: 9px;
|
|
||||||
color: #666666;
|
|
||||||
}
|
|
||||||
.card-title-more-delete:hover {
|
|
||||||
//background: #EBF1F4;
|
|
||||||
background: #F7F7F7;
|
|
||||||
color: #046ECA;
|
|
||||||
//border: 1px solid rgba(0,0,0,0.15);
|
|
||||||
}
|
|
||||||
.card-title-more-delete:active {
|
|
||||||
background: #F7F7F7;
|
|
||||||
color: #046ECA;
|
|
||||||
//border: 1px solid rgba(0,0,0,0.15);
|
|
||||||
}
|
|
||||||
.card-title-more-edit {
|
|
||||||
z-index: 1;
|
|
||||||
line-height: 24px;
|
|
||||||
height: 24px;
|
|
||||||
background: #FFFFFF;
|
|
||||||
//box-shadow: -1px 1px 10px -1px rgba(205,205,205,0.85);
|
|
||||||
//border-radius: 2px;
|
|
||||||
padding-left: 9px;
|
|
||||||
color: #666666;
|
|
||||||
}
|
|
||||||
.card-title-more-edit:hover {
|
|
||||||
background: #F7F7F7;
|
|
||||||
color: #046ECA;
|
|
||||||
//border: 1px solid rgba(0,0,0,0.15);
|
|
||||||
}
|
|
||||||
.card-title-more-edit:active {
|
|
||||||
background: #F7F7F7;
|
|
||||||
color: #046ECA;
|
|
||||||
//border: 1px solid rgba(0,0,0,0.15);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.card-id {
|
|
||||||
//font-family: NotoSansSChineseRegular;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #999999;
|
|
||||||
font-weight: 400;
|
|
||||||
margin-bottom:16px;
|
|
||||||
line-height: 12px;
|
|
||||||
}
|
|
||||||
.card-desc {
|
|
||||||
//font-family: NotoSansSChineseRegular;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #717171;
|
|
||||||
line-height: 18px;
|
|
||||||
font-weight: 400;
|
|
||||||
margin-bottom:0px;
|
|
||||||
max-height:88px;
|
|
||||||
|
|
||||||
overflow: hidden;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-line-clamp: 5;
|
|
||||||
line-clamp: 5;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.card-operate__footer {
|
|
||||||
height:40px;
|
|
||||||
//border:1px solid #7E9F54;
|
|
||||||
display:flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content:space-between ;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 400;
|
|
||||||
align-items: center;
|
|
||||||
padding-left:16px;
|
|
||||||
padding-right:16px;
|
|
||||||
padding-bottom:20px;
|
|
||||||
.card-type {
|
|
||||||
display:flex;
|
|
||||||
flex-direction:row;
|
|
||||||
.card-category {
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 16px;
|
|
||||||
color: #38ACD2;
|
|
||||||
font-weight: 400;
|
|
||||||
border: 1px solid rgba(56,172,210,1);
|
|
||||||
height:20px;
|
|
||||||
width: fit-content;
|
|
||||||
padding-left:11px;
|
|
||||||
padding-right:11px;
|
|
||||||
box-shadow: 0 2px 4px 0 rgba(51,51,51,0.02);
|
|
||||||
border-radius: 10px;
|
|
||||||
margin-right:4px;
|
|
||||||
}
|
|
||||||
.card-source {
|
|
||||||
height:20px;
|
|
||||||
width: fit-content;
|
|
||||||
padding-left:11px;
|
|
||||||
padding-right:11px;
|
|
||||||
background: rgba(56,172,210,0.10);
|
|
||||||
box-shadow: 0 2px 4px 0 rgba(51,51,51,0.02);
|
|
||||||
border-radius: 10px;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #046ECA;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.card-enable {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.card-item:hover{
|
|
||||||
box-shadow: 3px 3px 11px 0 rgba(0,0,0,0.1);
|
|
||||||
}
|
|
||||||
.card-item__enable {
|
|
||||||
background: #FFFFFF;
|
|
||||||
border: 1px solid rgba(226,229,236,1);
|
|
||||||
box-shadow: 3px 3px 11px 0 rgba(0,0,0,0.1);
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.knowledge-pagination {
|
|
||||||
height:56px;
|
|
||||||
width:100%;
|
|
||||||
background: #FFFFFF;
|
|
||||||
box-shadow: 0 -1px 4px 0 rgba(0,0,0,0.07);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.edit-knowledge-base {
|
.edit-knowledge-base {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -632,12 +39,6 @@
|
|||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
.enable-form__mt {
|
|
||||||
.el-form {
|
|
||||||
margin-top:6px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-steps {
|
.el-steps {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
|
|
||||||
@@ -742,22 +143,11 @@
|
|||||||
.upload-tip {
|
.upload-tip {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
|
|
||||||
span {
|
|
||||||
padding-left: 6px;
|
|
||||||
color: #326EC3;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.el-upload-dragger {
|
.el-upload-dragger {
|
||||||
padding-top: 20px;
|
|
||||||
width: 320px;
|
width: 320px;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
|
transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
|
|
||||||
.cn-icon-upload2 {
|
|
||||||
font-size: 40px;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -858,7 +248,7 @@
|
|||||||
}
|
}
|
||||||
.imported-table-box {
|
.imported-table-box {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 394px !important;
|
height: 367px;
|
||||||
border: 1px solid #DEDEDE;
|
border: 1px solid #DEDEDE;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
|
transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
|
||||||
@@ -885,22 +275,8 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.imported-data-item-edit__input {
|
|
||||||
.el-input {
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-input__inner {
|
|
||||||
width: calc(100% - 50px);
|
|
||||||
height: 24px;
|
|
||||||
line-height: 0;
|
|
||||||
padding: 0 !important;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.imported-data-msg {
|
.imported-data-msg {
|
||||||
width: 200px;
|
width: 140px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-icon-close {
|
.el-icon-close {
|
||||||
@@ -918,49 +294,20 @@
|
|||||||
.el-icon-error {
|
.el-icon-error {
|
||||||
color: #E26154;
|
color: #E26154;
|
||||||
}
|
}
|
||||||
|
|
||||||
.imported-data-btn {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-end;
|
|
||||||
|
|
||||||
.imported-data-left-btn {
|
|
||||||
font-size: 14px;
|
|
||||||
margin: 0 7px;
|
|
||||||
color: #666;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.imported-data-back {
|
|
||||||
color: #666;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.imported-data-save {
|
|
||||||
color: #38ACD2;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.imported-pagination.pagination {
|
.imported-pagination.pagination {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 42px;
|
bottom: 0;
|
||||||
bottom: 42px !important;
|
|
||||||
margin-top: 4px;
|
margin-top: 4px;
|
||||||
padding-top: 10px;
|
padding-top: 8px;
|
||||||
|
height: 42px;
|
||||||
border-top: 1px solid #eee;
|
border-top: 1px solid #eee;
|
||||||
|
|
||||||
border-top: 0 !important;
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
margin-bottom: 0;
|
|
||||||
padding-bottom: 0;
|
|
||||||
|
|
||||||
.btn-prev, .btn-next, .number {
|
.btn-prev, .btn-next, .number {
|
||||||
margin: 0 2px;
|
margin: 0 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-pager li, .el-pagination .btn-next, .el-pagination .btn-prev {
|
.el-pager li, .el-pagination .btn-next, .el-pagination .btn-prev {
|
||||||
border: none;
|
border: none;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
@@ -973,23 +320,6 @@
|
|||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-form {
|
|
||||||
margin-top: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-input {
|
|
||||||
height: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-form-item__content {
|
|
||||||
margin-top: -16px;
|
|
||||||
margin-bottom: -17px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.el-form-item__error {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.edit-knowledge-base__footer {
|
.edit-knowledge-base__footer {
|
||||||
@@ -1006,7 +336,7 @@
|
|||||||
min-width: 74px;
|
min-width: 74px;
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #699DC9;
|
background-color: #38ACD2;
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
outline: none;
|
outline: none;
|
||||||
@@ -1015,7 +345,7 @@
|
|||||||
transition: background-color linear .2s, color linear .1s;
|
transition: background-color linear .2s, color linear .1s;
|
||||||
}
|
}
|
||||||
.footer__btn:hover:not(.footer__btn--disabled) {
|
.footer__btn:hover:not(.footer__btn--disabled) {
|
||||||
background-color: lighten(#699DC9, 10%);
|
background-color: lighten(#38ACD2, 10%);
|
||||||
}
|
}
|
||||||
.footer__btn--light {
|
.footer__btn--light {
|
||||||
background-color: #F5F6F7;
|
background-color: #F5F6F7;
|
||||||
@@ -1033,133 +363,3 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.addTagBtn {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 9px;
|
|
||||||
height:24px !important;
|
|
||||||
min-height: 24px !important;
|
|
||||||
font-size: 12px;
|
|
||||||
color: #353636;
|
|
||||||
font-weight: 500;
|
|
||||||
width: 598px;
|
|
||||||
margin-left: 10px;
|
|
||||||
background: rgb(245, 248, 250);
|
|
||||||
border: 1px #DEDEDE solid;
|
|
||||||
padding: 0 !important;
|
|
||||||
box-shadow: 0 2px 4px 0 rgba(51,51,51,0.02);
|
|
||||||
border-radius: 2px;
|
|
||||||
font-family:NotoSansHans-Medium !important;
|
|
||||||
|
|
||||||
.add-tag-btn {
|
|
||||||
color: #575757 !important;
|
|
||||||
font-size: 9px !important;
|
|
||||||
margin: 0 8px 2px 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
i {
|
|
||||||
color: #699DC9 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
span {
|
|
||||||
font-family:NotoSansHans-Medium !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.del-model-hint {
|
|
||||||
display:flex;
|
|
||||||
flex-direction: column;
|
|
||||||
padding-bottom:0px !important;
|
|
||||||
width:480px !important;
|
|
||||||
height:300px !important;
|
|
||||||
.el-dialog__header{
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
border-bottom:1px solid #eee;
|
|
||||||
height:42px;
|
|
||||||
min-height:42px;
|
|
||||||
background: #F7F7F7;
|
|
||||||
box-shadow: 0 1px 0 0 rgba(53,54,54,0.08);
|
|
||||||
padding-left:20px;
|
|
||||||
padding-top:14px;
|
|
||||||
padding-bottom:14px;
|
|
||||||
.el-dialog__headerbtn {
|
|
||||||
display: flex !important;
|
|
||||||
flex-direction: row-reverse;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
font-size: 10px;
|
|
||||||
line-height: 10px;
|
|
||||||
padding-right: 5px !important;
|
|
||||||
i {
|
|
||||||
width:10px;
|
|
||||||
height:10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-dialog__title {
|
|
||||||
font-size: 14px !important;
|
|
||||||
color: #353636;
|
|
||||||
letter-spacing: 0;
|
|
||||||
font-weight: 400;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-dialog__body {
|
|
||||||
height:206px;
|
|
||||||
min-height:206px;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #353636;
|
|
||||||
letter-spacing: 0;
|
|
||||||
line-height: 22px;
|
|
||||||
font-weight: 400;
|
|
||||||
padding-top:8px;
|
|
||||||
padding-right:20px;
|
|
||||||
padding-left:20px;
|
|
||||||
.dialog-message {
|
|
||||||
padding-left:0px !important;
|
|
||||||
padding-right:0px !important;
|
|
||||||
}
|
|
||||||
.dialog-table {
|
|
||||||
margin-top:10px;
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-checked .el-checkbox__inner {
|
|
||||||
background-color: #38ACD2;
|
|
||||||
border-color: #38ACD2;
|
|
||||||
}
|
|
||||||
.el-checkbox__input.is-indeterminate .el-checkbox__inner {
|
|
||||||
background-color: #38ACD2;
|
|
||||||
border-color: #38ACD2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.el-dialog__footer {
|
|
||||||
height:52px;
|
|
||||||
min-height:52px;
|
|
||||||
border-top:1px solid #eee;
|
|
||||||
box-shadow: inset 0 -1px 0 0 rgba(0,0,0,0.07);
|
|
||||||
padding:11px 0 12px!important;
|
|
||||||
.el-button {
|
|
||||||
padding:8px 21px !important;
|
|
||||||
line-height: 12px;
|
|
||||||
//font-family: NotoSansHans-Medium !important;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 500;
|
|
||||||
min-height: 28px;
|
|
||||||
}
|
|
||||||
.el-button:nth-child(1) {
|
|
||||||
margin-right:20px;
|
|
||||||
width:80px;
|
|
||||||
height:28px;
|
|
||||||
color: #353636;
|
|
||||||
background: #F5F6F7;
|
|
||||||
border: 1px solid rgba(215,215,215,1);
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
.el-button:nth-child(2) {
|
|
||||||
width:80px;
|
|
||||||
height:28px;
|
|
||||||
margin-right:20px;
|
|
||||||
margin-left:0px !important;
|
|
||||||
background-color:#2d8cf0;
|
|
||||||
border-color:#2d8cf0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: "cn-icon"; /* Project id 2614877 */
|
font-family: "cn-icon"; /* Project id 2614877 */
|
||||||
src: url('iconfont.woff2?t=1687167070241') format('woff2'),
|
src: url('iconfont.woff2?t=1670817031037') format('woff2'),
|
||||||
url('iconfont.woff?t=1687167070241') format('woff'),
|
url('iconfont.woff?t=1670817031037') format('woff'),
|
||||||
url('iconfont.ttf?t=1687167070241') format('truetype');
|
url('iconfont.ttf?t=1670817031037') format('truetype');
|
||||||
}
|
}
|
||||||
|
|
||||||
.cn-icon {
|
.cn-icon {
|
||||||
@@ -13,174 +13,6 @@
|
|||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cn-icon-expand-relationship:before {
|
|
||||||
content: "\e7f8";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-resolve-ip:before {
|
|
||||||
content: "\e7f9";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-subdomain:before {
|
|
||||||
content: "\e7fa";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-graph:before {
|
|
||||||
content: "\e7f5";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-detail:before {
|
|
||||||
content: "\e7f6";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-tag:before {
|
|
||||||
content: "\e7f7";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-upload2:before {
|
|
||||||
content: "\e7f4";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-warn:before {
|
|
||||||
content: "\e7f3";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-providers:before {
|
|
||||||
content: "\e7f2";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-configure-policies:before {
|
|
||||||
content: "\e7f1";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-dns-insight:before {
|
|
||||||
content: "\e7ef";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-network-performance:before {
|
|
||||||
content: "\e7f0";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-copy:before {
|
|
||||||
content: "\e7ee";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-analysis:before {
|
|
||||||
content: "\e7ed";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-duration:before {
|
|
||||||
content: "\e7ec";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-select:before {
|
|
||||||
content: "\e7eb";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-expire-date:before {
|
|
||||||
content: "\e7d4";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-registry-email:before {
|
|
||||||
content: "\e7d5";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-geo-location:before {
|
|
||||||
content: "\e7d6";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-credit-rating:before {
|
|
||||||
content: "\e7d7";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-registration-date:before {
|
|
||||||
content: "\e7d8";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-app-full-name:before {
|
|
||||||
content: "\e7d9";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-description:before {
|
|
||||||
content: "\e7da";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-technology:before {
|
|
||||||
content: "\e7db";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-registrar:before {
|
|
||||||
content: "\e7dc";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-registry:before {
|
|
||||||
content: "\e7dd";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-operator:before {
|
|
||||||
content: "\e7de";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-sub-type:before {
|
|
||||||
content: "\e7df";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-app-name:before {
|
|
||||||
content: "\e7e0";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-registration-country:before {
|
|
||||||
content: "\e7e1";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-as:before {
|
|
||||||
content: "\e7e2";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-as-subnet:before {
|
|
||||||
content: "\e7e3";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-category2:before {
|
|
||||||
content: "\e7e4";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-domain-name-resolution:before {
|
|
||||||
content: "\e7e5";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-open-port:before {
|
|
||||||
content: "\e7e6";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-security-event:before {
|
|
||||||
content: "\e7e7";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-dns-ptr:before {
|
|
||||||
content: "\e7e8";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-information-aggregation:before {
|
|
||||||
content: "\e7e9";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-digital-certificate:before {
|
|
||||||
content: "\e7ea";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-save:before {
|
|
||||||
content: "\e7d1";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-edit1:before {
|
|
||||||
content: "\e7d2";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-revoke:before {
|
|
||||||
content: "\e7d3";
|
|
||||||
}
|
|
||||||
|
|
||||||
.cn-icon-administrations:before {
|
.cn-icon-administrations:before {
|
||||||
content: "\e7be";
|
content: "\e7be";
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
0
src/assets/css/font/iconfont.scss
Normal file
0
src/assets/css/font/iconfont.scss
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -115,11 +115,11 @@ export default {
|
|||||||
},
|
},
|
||||||
setup (props) {
|
setup (props) {
|
||||||
// 默认为文本模式
|
// 默认为文本模式
|
||||||
const searchMode = ref('text')
|
let searchMode = ref('text')
|
||||||
if (props.defaultMode) {
|
if (props.defaultMode) {
|
||||||
switch (props.defaultMode) {
|
switch (props.defaultMode) {
|
||||||
case 'tag': {
|
case 'tag': {
|
||||||
searchMode.value = 'tag'
|
searchMode = 'tag'
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
<!-- 值 -->
|
<!-- 值 -->
|
||||||
<div class="condition__value">
|
<div class="condition__value">
|
||||||
<div v-if="meta.value.isEditing">
|
<div v-if="meta.value.isEditing">
|
||||||
<!--避免blur事件和keyup.enter重复执行-->
|
|
||||||
<el-input v-model="meta.value.value" size="mini" @blur="valueBlur(meta)" ref="valueInput" @keyup.enter="valueBlur(meta)"></el-input>
|
<el-input v-model="meta.value.value" size="mini" @blur="valueBlur(meta)" ref="valueInput" @keyup.enter="valueBlur(meta)"></el-input>
|
||||||
</div>
|
</div>
|
||||||
<span v-else @click="valueClick(meta)">{{meta.value.label}}</span>
|
<span v-else @click="valueClick(meta)">{{meta.value.label}}</span>
|
||||||
@@ -76,12 +75,9 @@
|
|||||||
<div class="tag-search__add" @click="addCondition">{{$t('entities.advancedSearch.add')}}</div>
|
<div class="tag-search__add" @click="addCondition">{{$t('entities.advancedSearch.add')}}</div>
|
||||||
<div class="search__suffixes search__suffixes--tag-mode">
|
<div class="search__suffixes search__suffixes--tag-mode">
|
||||||
<div class="search__suffix" @click="changeMode">
|
<div class="search__suffix" @click="changeMode">
|
||||||
<!-- 新版实体列表改版,后续记得解开-->
|
|
||||||
<!-- <div class="search__suffix" style="margin-right: 12px" @click="changeMode">-->
|
|
||||||
<i class="cn-icon cn-icon-search-normal"></i>
|
<i class="cn-icon cn-icon-search-normal"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="search__suffix" @click="search">
|
<div class="search__suffix" @click="search">
|
||||||
<!-- <div class="search__suffix new-search__suffix" @click="search">-->
|
|
||||||
<i class="el-icon-search"></i>
|
<i class="el-icon-search"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -93,7 +89,6 @@ import Meta, { connection, condition, columnType } from './meta/meta'
|
|||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
||||||
import Parser, { stringInQuot } from '@/components/advancedSearch/meta/parser'
|
import Parser, { stringInQuot } from '@/components/advancedSearch/meta/parser'
|
||||||
import { overwriteUrl, urlParamsHandler } from '@/utils/tools'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TagMode',
|
name: 'TagMode',
|
||||||
props: {
|
props: {
|
||||||
@@ -136,10 +131,7 @@ export default {
|
|||||||
this.metaList.push(newCondition)
|
this.metaList.push(newCondition)
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
const selectList = this.$refs.columnSelect
|
this.$refs.columnSelect.focus()
|
||||||
if (selectList && selectList.length > 0) {
|
|
||||||
this.$refs.columnSelect[selectList.length - 1].focus() // 在for循环里生成的dom,所以是数组
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -189,7 +181,7 @@ export default {
|
|||||||
columnClick (meta) {
|
columnClick (meta) {
|
||||||
meta.column.isEditing = true
|
meta.column.isEditing = true
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs.columnSelect[this.$refs.columnSelect.length - 1].focus()
|
this.$refs.columnSelect.focus()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
columnBlur (meta, index) {
|
columnBlur (meta, index) {
|
||||||
@@ -228,10 +220,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
const selectList = this.$refs.valueInput
|
this.$refs.valueInput.focus()
|
||||||
if (selectList && selectList.length > 0) {
|
|
||||||
this.$refs.valueInput[selectList.length - 1].focus() // 在for循环里生成的dom,所以是数组
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
operatorClick (meta) {
|
operatorClick (meta) {
|
||||||
@@ -256,8 +245,7 @@ export default {
|
|||||||
str = str.substring(1, str.length)
|
str = str.substring(1, str.length)
|
||||||
str = str.substring(0, str.length - 1)
|
str = str.substring(0, str.length - 1)
|
||||||
}
|
}
|
||||||
// 如果此时参数为xi'an,处理为xi''an,后一个条件避免若参数为xi''an,则不处理
|
if (str.indexOf("'") > -1) {
|
||||||
if (str.indexOf("'") > -1 && str.indexOf("''") === -1) {
|
|
||||||
str = str.replace(/'/g, "''")
|
str = str.replace(/'/g, "''")
|
||||||
}
|
}
|
||||||
return str
|
return str
|
||||||
@@ -276,8 +264,7 @@ export default {
|
|||||||
str = str.substring(1, str.length)
|
str = str.substring(1, str.length)
|
||||||
str = str.substring(0, str.length - 1)
|
str = str.substring(0, str.length - 1)
|
||||||
}
|
}
|
||||||
// 如果此时参数为xi'an,处理为xi''an,后一个条件避免若参数为xi''an,则不处理
|
if (str.indexOf("'") > -1) {
|
||||||
if (str.indexOf("'") > -1 && str.indexOf("''") === -1) {
|
|
||||||
str = str.replace(/'/g, "''")
|
str = str.replace(/'/g, "''")
|
||||||
}
|
}
|
||||||
meta.value.value = str
|
meta.value.value = str
|
||||||
@@ -289,7 +276,7 @@ export default {
|
|||||||
valueClick (meta) {
|
valueClick (meta) {
|
||||||
meta.value.isEditing = true
|
meta.value.isEditing = true
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs.valueInput[0].focus()
|
this.$refs.valueInput.focus()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
// 判断是否是用户自己添加的内容,用于判断是否是全局搜索
|
// 判断是否是用户自己添加的内容,用于判断是否是全局搜索
|
||||||
@@ -321,15 +308,13 @@ export default {
|
|||||||
const parser = new Parser(this.columnList)
|
const parser = new Parser(this.columnList)
|
||||||
const errorList = parser.validateMeta(this.metaList)
|
const errorList = parser.validateMeta(this.metaList)
|
||||||
if (_.isEmpty(errorList)) {
|
if (_.isEmpty(errorList)) {
|
||||||
this.reloadUrl({ mode: 'text' })
|
|
||||||
this.$emit('changeMode', 'text', parser.parseMeta(this.metaList))
|
this.$emit('changeMode', 'text', parser.parseMeta(this.metaList))
|
||||||
} else {
|
} else {
|
||||||
this.reloadUrl({ mode: 'text' })
|
|
||||||
this.$emit('changeMode', 'text', { metaList: [], str: '' })
|
this.$emit('changeMode', 'text', { metaList: [], str: '' })
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 处理value,例如转换IN的值
|
// 处理value,例如转换IN的值
|
||||||
handleValue (value, column, operator, flag) {
|
handleValue (value, column, operator) {
|
||||||
const isArray = ['IN', 'NOT IN'].indexOf(operator) > -1
|
const isArray = ['IN', 'NOT IN'].indexOf(operator) > -1
|
||||||
if (isArray) {
|
if (isArray) {
|
||||||
if (_.isArray(value)) {
|
if (_.isArray(value)) {
|
||||||
@@ -339,14 +324,7 @@ export default {
|
|||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let newValue = column.type === columnType.string ? stringInQuot(value) : value
|
return column.type === columnType.string ? stringInQuot(value) : value
|
||||||
if (flag) {
|
|
||||||
newValue = newValue.slice(1)
|
|
||||||
newValue = newValue.slice(0, newValue.length - 1)
|
|
||||||
return newValue
|
|
||||||
} else {
|
|
||||||
return newValue
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
addParams (params) {
|
addParams (params) {
|
||||||
@@ -360,7 +338,7 @@ export default {
|
|||||||
meta.column.label = column ? column.label : param.column
|
meta.column.label = column ? column.label : param.column
|
||||||
meta.operator.value = '='
|
meta.operator.value = '='
|
||||||
meta.operator.show = true
|
meta.operator.show = true
|
||||||
meta.value.value = this.handleValue(param.value, column, column.operator, 'noQuotes')
|
meta.value.value = this.handleValue(param.value, column, column.operator)
|
||||||
meta.value.show = true
|
meta.value.show = true
|
||||||
meta.value.label = meta.value.value
|
meta.value.label = meta.value.value
|
||||||
this.addCondition(meta)
|
this.addCondition(meta)
|
||||||
@@ -400,28 +378,10 @@ export default {
|
|||||||
this.metaList.splice(metaIndex, 2)
|
this.metaList.splice(metaIndex, 2)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 向地址栏添加/删除参数
|
|
||||||
*/
|
|
||||||
reloadUrl (newParam, clean) {
|
|
||||||
const { query } = this.$route
|
|
||||||
let newUrl = urlParamsHandler(window.location.href, query, newParam)
|
|
||||||
if (clean) {
|
|
||||||
newUrl = urlParamsHandler(window.location.href, query, newParam, clean)
|
|
||||||
}
|
|
||||||
overwriteUrl(newUrl)
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
const vm = this
|
const vm = this
|
||||||
// 如果地址栏包含参数q,则匹配出metaList到搜索栏回显使用
|
|
||||||
const { q } = this.$route.query
|
|
||||||
if (q) {
|
|
||||||
const parser = new Parser(this.columnList)
|
|
||||||
this.metaList = parser.parseStr(q).metaList
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emitter.on('advanced-search', function () {
|
this.emitter.on('advanced-search', function () {
|
||||||
vm.search()
|
vm.search()
|
||||||
})
|
})
|
||||||
@@ -439,21 +399,3 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!--// 新版实体列表改版,后续记得解开-->
|
|
||||||
<!--<style lang="scss">-->
|
|
||||||
<!--.new-search__suffix {-->
|
|
||||||
<!-- width: 41px;-->
|
|
||||||
<!-- height: 41px;-->
|
|
||||||
<!-- line-height: 41px;-->
|
|
||||||
<!-- background: #38ACD2;-->
|
|
||||||
<!-- text-align: center;-->
|
|
||||||
<!-- margin-top: -10px;-->
|
|
||||||
<!-- margin-right: -10px;-->
|
|
||||||
|
|
||||||
<!-- .el-icon-search {-->
|
|
||||||
<!-- color: #fff !important;-->
|
|
||||||
<!-- margin-top: 9px !important;-->
|
|
||||||
<!-- }-->
|
|
||||||
<!--}-->
|
|
||||||
<!--</style>-->
|
|
||||||
|
|||||||
@@ -6,10 +6,6 @@
|
|||||||
<div class="search__suffix" @click="changeMode">
|
<div class="search__suffix" @click="changeMode">
|
||||||
<i class="cn-icon cn-icon-search-advance"></i>
|
<i class="cn-icon cn-icon-search-advance"></i>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="search__suffix-close" @click="cleanParams">-->
|
|
||||||
<!-- <i class="el-icon-error"></i>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <div class="search__suffix new-search__suffix" @click="search">-->
|
|
||||||
<div class="search__suffix" @click="search">
|
<div class="search__suffix" @click="search">
|
||||||
<i class="el-icon-search"></i>
|
<i class="el-icon-search"></i>
|
||||||
</div>
|
</div>
|
||||||
@@ -28,7 +24,6 @@ import { toRaw } from 'vue'
|
|||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
import { columnType } from '@/components/advancedSearch/meta/meta'
|
import { columnType } from '@/components/advancedSearch/meta/meta'
|
||||||
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
|
||||||
import { overwriteUrl, urlParamsHandler } from '@/utils/tools'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TextMode',
|
name: 'TextMode',
|
||||||
@@ -43,9 +38,6 @@ export default {
|
|||||||
},
|
},
|
||||||
emits: ['changeMode', 'search'],
|
emits: ['changeMode', 'search'],
|
||||||
methods: {
|
methods: {
|
||||||
// cleanParams () {
|
|
||||||
// toRaw(this.codeMirror).setValue('')
|
|
||||||
// },
|
|
||||||
initCodeMirror () {
|
initCodeMirror () {
|
||||||
this.codeMirror = CodeMirror.fromTextArea(this.$refs.textSearch, {
|
this.codeMirror = CodeMirror.fromTextArea(this.$refs.textSearch, {
|
||||||
mode: {
|
mode: {
|
||||||
@@ -82,14 +74,11 @@ export default {
|
|||||||
const errorList = parser.validateStr(str)
|
const errorList = parser.validateStr(str)
|
||||||
if (_.isEmpty(errorList)) {
|
if (_.isEmpty(errorList)) {
|
||||||
const metaList = parser.parseStr(str)
|
const metaList = parser.parseStr(str)
|
||||||
this.reloadUrl({ mode: 'tag' })
|
|
||||||
this.$emit('changeMode', 'tag', metaList)
|
this.$emit('changeMode', 'tag', metaList)
|
||||||
} else {
|
} else {
|
||||||
this.reloadUrl({ mode: 'tag' })
|
|
||||||
this.$emit('changeMode', 'tag', { metaList: [], str: '' })
|
this.$emit('changeMode', 'tag', { metaList: [], str: '' })
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.reloadUrl({ mode: 'tag' })
|
|
||||||
this.$emit('changeMode', 'tag', { str: '', metaList: [] })
|
this.$emit('changeMode', 'tag', { str: '', metaList: [] })
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -139,17 +128,6 @@ export default {
|
|||||||
current = current.replace(oldSqlPiece, newSqlPiece)
|
current = current.replace(oldSqlPiece, newSqlPiece)
|
||||||
})
|
})
|
||||||
toRaw(this.codeMirror).setValue(current.trim())
|
toRaw(this.codeMirror).setValue(current.trim())
|
||||||
},
|
|
||||||
/**
|
|
||||||
* 向地址栏添加/删除参数
|
|
||||||
*/
|
|
||||||
reloadUrl (newParam, clean) {
|
|
||||||
const { query } = this.$route
|
|
||||||
let newUrl = urlParamsHandler(window.location.href, query, newParam)
|
|
||||||
if (clean) {
|
|
||||||
newUrl = urlParamsHandler(window.location.href, query, newParam, clean)
|
|
||||||
}
|
|
||||||
overwriteUrl(newUrl)
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -165,13 +143,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
// 如果地址栏包含参数q,则将参数q回显到搜索栏内
|
|
||||||
const { q } = this.$route.query
|
|
||||||
this.initCodeMirror()
|
this.initCodeMirror()
|
||||||
if (q) {
|
|
||||||
toRaw(this.codeMirror).setValue(q)
|
|
||||||
}
|
|
||||||
|
|
||||||
const vm = this
|
const vm = this
|
||||||
this.emitter.on('advanced-search', function () {
|
this.emitter.on('advanced-search', function () {
|
||||||
vm.search()
|
vm.search()
|
||||||
@@ -179,29 +151,3 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!--<style lang="scss">-->
|
|
||||||
<!--.search__suffix-close {-->
|
|
||||||
<!-- .el-icon-error {-->
|
|
||||||
<!-- font-size: 17px;-->
|
|
||||||
<!-- color: #C4C4C4;-->
|
|
||||||
<!-- margin: 0 12px;-->
|
|
||||||
<!-- cursor: pointer;-->
|
|
||||||
<!-- }-->
|
|
||||||
<!--}-->
|
|
||||||
|
|
||||||
<!--.new-search__suffix {-->
|
|
||||||
<!-- width: 41px;-->
|
|
||||||
<!-- height: 41px;-->
|
|
||||||
<!-- line-height: 41px;-->
|
|
||||||
<!-- background: #38ACD2;-->
|
|
||||||
<!-- text-align: center;-->
|
|
||||||
<!-- margin-top: -10px;-->
|
|
||||||
<!-- margin-right: -10px;-->
|
|
||||||
|
|
||||||
<!-- .el-icon-search {-->
|
|
||||||
<!-- color: #fff !important;-->
|
|
||||||
<!-- margin-top: 9px !important;-->
|
|
||||||
<!-- }-->
|
|
||||||
<!--}-->
|
|
||||||
<!--</style>-->
|
|
||||||
|
|||||||
@@ -751,10 +751,6 @@ export default class Parser {
|
|||||||
|
|
||||||
// 使用单引号包裹
|
// 使用单引号包裹
|
||||||
export function stringInQuot (value) {
|
export function stringInQuot (value) {
|
||||||
if (value.indexOf("'") > -1) {
|
|
||||||
value = value.split("'").join("''") // 如xi'an,多添加一个单引号,处理为xi''an
|
|
||||||
}
|
|
||||||
|
|
||||||
const match = `${value}`.match(/^'.+?'$/)
|
const match = `${value}`.match(/^'.+?'$/)
|
||||||
return match ? value : `'${value}'`
|
return match ? value : `'${value}'`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -250,10 +250,6 @@ function handleType (value) {
|
|||||||
|
|
||||||
// 使用单引号包裹
|
// 使用单引号包裹
|
||||||
export function stringInQuot (value) {
|
export function stringInQuot (value) {
|
||||||
if (value.indexOf("'") > -1) {
|
|
||||||
value = value.split("'").join("''") // 如xi'an,多添加一个单引号,处理为xi''an
|
|
||||||
}
|
|
||||||
|
|
||||||
const match = `${value}`.match(/^'.+?'$/)
|
const match = `${value}`.match(/^'.+?'$/)
|
||||||
return match ? value : `'${value}'`
|
return match ? value : `'${value}'`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="showDefault" class="error-component" :style="style" :class="myClass">
|
<div v-if="showDefault" class="error-component">
|
||||||
<div class="error-block" :style="{'max-width': localMaxWidth, 'width': localWidth}">
|
<div class="error-block" :style="{'max-width': localMaxWidth, 'width': localWidth}">
|
||||||
<svg class="icon error-icon-default" aria-hidden="true">
|
<svg class="icon error-icon-default" aria-hidden="true">
|
||||||
<use xlink:href="#cn-icon-baocuo"></use>
|
<use xlink:href="#cn-icon-baocuo"></use>
|
||||||
@@ -101,12 +101,6 @@ export default {
|
|||||||
// 自定义svg图标
|
// 自定义svg图标
|
||||||
svg: {
|
svg: {
|
||||||
type: String
|
type: String
|
||||||
},
|
|
||||||
style: {
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
class: {
|
|
||||||
type: String
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
@@ -115,8 +109,7 @@ export default {
|
|||||||
showSmall: false, // 显示错误的类型,true为图表模块内显示报错,false为标题后显示报错
|
showSmall: false, // 显示错误的类型,true为图表模块内显示报错,false为标题后显示报错
|
||||||
localWidth: '',
|
localWidth: '',
|
||||||
localMaxWidth: '',
|
localMaxWidth: '',
|
||||||
localPopoverWidth: '',
|
localPopoverWidth: ''
|
||||||
myClass: this.class
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="pagination" >
|
<div class="pagination">
|
||||||
<el-pagination
|
<el-pagination
|
||||||
ref="page"
|
ref="page"
|
||||||
@size-change="size"
|
@size-change="size"
|
||||||
@@ -60,6 +60,7 @@ export default {
|
|||||||
const { query } = useRoute()
|
const { query } = useRoute()
|
||||||
const pageSize = ref(defaultPageSize)
|
const pageSize = ref(defaultPageSize)
|
||||||
const currentPageNo = ref(props.storePageNoOnUrl ? (query.pageNo || (props.pageObj.pageNo || 1)) : (props.pageObj.pageNo || 1))
|
const currentPageNo = ref(props.storePageNoOnUrl ? (query.pageNo || (props.pageObj.pageNo || 1)) : (props.pageObj.pageNo || 1))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
pageSize,
|
pageSize,
|
||||||
currentPageNo
|
currentPageNo
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-ele-click-outside="changeDropdown" style="position: relative;" class="date-range-box">
|
<div v-ele-click-outside="changeDropdown" style="position: relative;z-index: 1" class="date-range-box">
|
||||||
<div @click="showDropdown" class="date-range-text" :class="myClass" :style="style">
|
<div @click="showDropdown" class="date-range-text">
|
||||||
<div class="calendar-popover-text"><i class="cn-icon cn-icon-Data"></i></div>
|
<div class="calendar-popover-text"><i class="cn-icon cn-icon-Data"></i></div>
|
||||||
<div class="calendar-popover-text" style="display: flex" v-if="isCustom">
|
<div class="calendar-popover-text" style="display: flex" v-if="isCustom">
|
||||||
<div class="calendar-popover-text">{{ dateFormatByAppearance(getMillisecond(startTime)) }}</div>
|
<div class="calendar-popover-text">{{ dateFormatByAppearance(getMillisecond(startTime)) }}</div>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<i class="cn-icon cn-icon-dropdown" :class="dropdownFlag ? 'cn-icon-up' : ''"></i>
|
<i class="cn-icon cn-icon-dropdown" :class="dropdownFlag ? 'cn-icon-up' : ''"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<transition name="el-zoom-in-top" style="z-index: 4;">
|
<transition name="el-zoom-in-top">
|
||||||
<div v-if="dropdownFlag" class="date-range-panel">
|
<div v-if="dropdownFlag" class="date-range-panel">
|
||||||
<el-row class="date-range-panel-top" style="position: relative">
|
<el-row class="date-range-panel-top" style="position: relative">
|
||||||
<el-col :span="16" class="date-range-panel-content date-range-panel-content-left">
|
<el-col :span="16" class="date-range-panel-content date-range-panel-content-left">
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="newDateValue"
|
v-model="newDateValue"
|
||||||
ref="newDatePicker"
|
ref="newDatePicker"
|
||||||
popper-class="my-date-picker"
|
class="date_style"
|
||||||
style="position: absolute;top: -53px;left: -536px;"
|
style="position: absolute;top: -53px;left: -536px;"
|
||||||
:clearable="false"
|
:clearable="false"
|
||||||
:default-time="defaultTime"
|
:default-time="defaultTime"
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { ref, computed, watch, reactive } from 'vue'
|
import { ref, computed, watch, reactive } from 'vue'
|
||||||
import { storageKey } from '@/utils/constants'
|
import { storageKey } from '@/utils/constants'
|
||||||
import { getMillisecond, millTimestampDiffFromTz, timestampToList } from '@/utils/date-util'
|
import { getMillisecond, timestampToList } from '@/utils/date-util'
|
||||||
import { useStore } from 'vuex'
|
import { useStore } from 'vuex'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -95,12 +95,6 @@ export default {
|
|||||||
},
|
},
|
||||||
dateRange: {
|
dateRange: {
|
||||||
type: Number
|
type: Number
|
||||||
},
|
|
||||||
class: {
|
|
||||||
type: String
|
|
||||||
},
|
|
||||||
style: {
|
|
||||||
type: String
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
emits: ['change'],
|
emits: ['change'],
|
||||||
@@ -109,7 +103,6 @@ export default {
|
|||||||
const store = useStore()
|
const store = useStore()
|
||||||
const myStartTime = ref(props.startTime)
|
const myStartTime = ref(props.startTime)
|
||||||
const myEndTime = ref(props.endTime)
|
const myEndTime = ref(props.endTime)
|
||||||
const myClass = ref(props.class)
|
|
||||||
// 时间选择器绑定的值
|
// 时间选择器绑定的值
|
||||||
const newDateValue = ref([
|
const newDateValue = ref([
|
||||||
new Date(...timestampToList(myStartTime.value)),
|
new Date(...timestampToList(myStartTime.value)),
|
||||||
@@ -124,14 +117,14 @@ export default {
|
|||||||
const dateRangeValue = props.dateRange ? ref(props.dateRange) : ref(60)
|
const dateRangeValue = props.dateRange ? ref(props.dateRange) : ref(60)
|
||||||
const isCustom = ref(dateRangeValue.value === -1)
|
const isCustom = ref(dateRangeValue.value === -1)
|
||||||
const dateRangeArr = [
|
const dateRangeArr = [
|
||||||
{ value: 5, name: 'last 5 mins' },
|
{ value: 5, name: 'last 5 Min' },
|
||||||
{ value: 15, name: 'last 15 mins' },
|
{ value: 15, name: 'last 15 Min' },
|
||||||
{ value: 30, name: 'last 30 mins' },
|
{ value: 30, name: 'last 30 Min' },
|
||||||
{ value: 60, name: 'last 1 hour' },
|
{ value: 60, name: 'last 1 hour' },
|
||||||
{ value: 180, name: 'last 3 hours' },
|
{ value: 180, name: 'last 3 hour' },
|
||||||
{ value: 360, name: 'last 6 hours' },
|
{ value: 360, name: 'last 6 hour' },
|
||||||
{ value: 720, name: 'last 12 hours' },
|
{ value: 720, name: 'last 12 hour' },
|
||||||
{ value: 1440, name: 'last 1 day' },
|
{ value: 1440, name: 'last 1 days' },
|
||||||
{ value: 2880, name: 'last 2 days' }
|
{ value: 2880, name: 'last 2 days' }
|
||||||
]
|
]
|
||||||
const dropdownFlag = ref(false)
|
const dropdownFlag = ref(false)
|
||||||
@@ -175,7 +168,7 @@ export default {
|
|||||||
value: computed(() => store.state.panel.rangeEchartsData)
|
value: computed(() => store.state.panel.rangeEchartsData)
|
||||||
})
|
})
|
||||||
|
|
||||||
watch(() => rangeEchartsData.value, (newVal) => {
|
watch(() => rangeEchartsData.value, (newVal, oldVal) => {
|
||||||
if (newVal) {
|
if (newVal) {
|
||||||
myStartTime.value = getMillisecond(newVal.startTime)
|
myStartTime.value = getMillisecond(newVal.startTime)
|
||||||
myEndTime.value = getMillisecond(newVal.endTime)
|
myEndTime.value = getMillisecond(newVal.endTime)
|
||||||
@@ -216,15 +209,19 @@ export default {
|
|||||||
new Date(...timestampToList(myEndTime.value))
|
new Date(...timestampToList(myEndTime.value))
|
||||||
]
|
]
|
||||||
newDatePicker.value.focus()
|
newDatePicker.value.focus()
|
||||||
|
|
||||||
|
// todo 此处为弹窗打开的方向标识,控制css的position修改其left与top属性未生效,只好隐藏,后续有更好的处理办法再修改
|
||||||
|
const dom = document.getElementsByClassName('el-picker__popper el-popper is-light is-pure')
|
||||||
|
const dom1 = dom[0].getElementsByClassName('el-popper__arrow')
|
||||||
|
dom1[0].style.display = 'none'
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 时间选择器,选择时间,点击OK后的回调
|
* 时间选择器,选择时间,点击OK后的回调
|
||||||
* @param val,开始/结束时间数组
|
* @param val,开始/结束时间数组
|
||||||
*/
|
*/
|
||||||
const timeArrChange = (val) => {
|
const timeArrChange = (val) => {
|
||||||
// 按服务器时区修正时间戳
|
myStartTime.value = getMillisecond(val[0])
|
||||||
myStartTime.value = getMillisecond(val[0]) + millTimestampDiffFromTz()
|
myEndTime.value = getMillisecond(val[1])
|
||||||
myEndTime.value = getMillisecond(val[1]) + millTimestampDiffFromTz()
|
|
||||||
isCustom.value = true
|
isCustom.value = true
|
||||||
dateRangeValue.value = -1
|
dateRangeValue.value = -1
|
||||||
returnValue()
|
returnValue()
|
||||||
@@ -278,7 +275,6 @@ export default {
|
|||||||
return {
|
return {
|
||||||
myStartTime,
|
myStartTime,
|
||||||
myEndTime,
|
myEndTime,
|
||||||
myClass,
|
|
||||||
dropdownFlag,
|
dropdownFlag,
|
||||||
utcStr,
|
utcStr,
|
||||||
rangeEchartsData,
|
rangeEchartsData,
|
||||||
|
|||||||
@@ -67,10 +67,9 @@ export default {
|
|||||||
if (refreshTime !== null) {
|
if (refreshTime !== null) {
|
||||||
// 此处是避免下钻后浏览器返回,获取不到url的refreshTime情况
|
// 此处是避免下钻后浏览器返回,获取不到url的refreshTime情况
|
||||||
// 以及重新加载后改变时间但url回退仍保留上次数据的情况
|
// 以及重新加载后改变时间但url回退仍保留上次数据的情况
|
||||||
refreshObj = refreshArr.find(item => item.value === refreshTime) || refreshArr[0]
|
refreshObj = refreshArr.find(item => item.value === refreshTime)
|
||||||
} else if (query.refreshTime !== undefined) {
|
} else if (query.refreshTime !== undefined) {
|
||||||
// 若地址栏的refreshTime不是数组里的值,直接关闭刷新
|
refreshObj = refreshArr.find(item => item.value === Number(query.refreshTime))
|
||||||
refreshObj = refreshArr.find(item => item.value === Number(query.refreshTime)) || refreshArr[0]
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 浏览器回退时,清除掉地址栏的refreshTime
|
// 浏览器回退时,清除掉地址栏的refreshTime
|
||||||
@@ -113,8 +112,6 @@ export default {
|
|||||||
this.$store.commit('setRefreshTime', val.value)
|
this.$store.commit('setRefreshTime', val.value)
|
||||||
this.$store.commit('setRefreshFlag', true)
|
this.$store.commit('setRefreshFlag', true)
|
||||||
|
|
||||||
// 在新的轮询开始前清除掉已经可能存在的定时器,避免新的刷新时间不生效
|
|
||||||
clearInterval(this.intervalTimer)
|
|
||||||
// 设置定时器
|
// 设置定时器
|
||||||
this.intervalTimer = setInterval(() => {
|
this.intervalTimer = setInterval(() => {
|
||||||
this.$emit('change')
|
this.$emit('change')
|
||||||
|
|||||||
@@ -20,9 +20,7 @@ export default {
|
|||||||
entityDetectionStyle () {
|
entityDetectionStyle () {
|
||||||
const route = this.$route.name !== undefined ? this.$route.name : this.$route
|
const route = this.$route.name !== undefined ? this.$route.name : this.$route
|
||||||
if (listScrollPath.indexOf(route.path) > -1) {
|
if (listScrollPath.indexOf(route.path) > -1) {
|
||||||
// 新版实体列表改版,后续记得解开
|
|
||||||
const style = route.path === listScrollPath[0] ? 'overflow:auto;background-color: #EFF2F5;' : 'overflow:auto;'
|
const style = route.path === listScrollPath[0] ? 'overflow:auto;background-color: #EFF2F5;' : 'overflow:auto;'
|
||||||
// const style = 'overflow:auto;'
|
|
||||||
return style
|
return style
|
||||||
} else {
|
} else {
|
||||||
return ''
|
return ''
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ export default {
|
|||||||
return this.$store.getters.menuList.find(menu => menu.code === 'networkAnalytics')
|
return this.$store.getters.menuList.find(menu => menu.code === 'networkAnalytics')
|
||||||
},
|
},
|
||||||
otherMenu () {
|
otherMenu () {
|
||||||
return this.$store.getters.menuList.filter(menu => ['networkAnalytics', 'chart', 'I18N', 'entityDetail', 'temp'].indexOf(menu.code) === -1)
|
return this.$store.getters.menuList.filter(menu => ['networkAnalytics', 'chart', 'I18N'].indexOf(menu.code) === -1)
|
||||||
|
|
||||||
/* function excludeButton (menu) {
|
/* function excludeButton (menu) {
|
||||||
for (let i = 0; i < menu.length; i++) {
|
for (let i = 0; i < menu.length; i++) {
|
||||||
@@ -392,23 +392,6 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
generateBreadcrumb (breadcrumb, menus) {
|
generateBreadcrumb (breadcrumb, menus) {
|
||||||
if (this.route === '/entityDetail') {
|
|
||||||
const entityMenu = menus.find(m => m.route === '/entityExplorer')
|
|
||||||
const entityDetailMenu = menus.find(m => m.route === '/entityDetail')
|
|
||||||
breadcrumb.push({
|
|
||||||
code: entityMenu.code,
|
|
||||||
value: entityMenu.i18n ? this.$t(entityMenu.i18n) : entityMenu.name,
|
|
||||||
route: entityMenu.route,
|
|
||||||
type: entityMenu.type
|
|
||||||
})
|
|
||||||
breadcrumb.push({
|
|
||||||
code: entityDetailMenu.code,
|
|
||||||
value: entityDetailMenu.i18n ? this.$t(entityDetailMenu.i18n) : entityDetailMenu.name,
|
|
||||||
route: entityDetailMenu.route,
|
|
||||||
type: entityDetailMenu.type
|
|
||||||
})
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
const menu = menus.find(m => m.route === this.route)
|
const menu = menus.find(m => m.route === this.route)
|
||||||
if (menu) {
|
if (menu) {
|
||||||
breadcrumb.unshift({
|
breadcrumb.unshift({
|
||||||
@@ -545,13 +528,13 @@ export default {
|
|||||||
changeValue (value) {
|
changeValue (value) {
|
||||||
// 设置面包屑显示的内容及hover时的title
|
// 设置面包屑显示的内容及hover时的title
|
||||||
let valName = value
|
let valName = value
|
||||||
if (this.curTabProp === 'qtype') {
|
if (this.tab === 'qtype') {
|
||||||
valName = this.dnsQtypeMapData.get(value)
|
valName = this.dnsQtypeMapData.get(value)
|
||||||
} else if (this.curTabProp === 'rcode') {
|
} else if (this.tab === 'rcode') {
|
||||||
valName = this.dnsRcodeMapData.get(value)
|
valName = this.dnsRcodeMapData.get(value)
|
||||||
}
|
}
|
||||||
this.curTabProp = this.$route.query.dimensionType ? this.$route.query.dimensionType : null
|
this.curTabProp = this.$route.query.dimensionType ? this.$route.query.dimensionType : null
|
||||||
document.getElementById('breadcrumbValue').innerText = valName
|
document.getElementById('breadcrumbValue').innerText = value
|
||||||
document.getElementById(this.valueMenuId).setAttribute('title', valName)
|
document.getElementById(this.valueMenuId).setAttribute('title', valName)
|
||||||
document.getElementById('breadcrumbButton').click()
|
document.getElementById('breadcrumbButton').click()
|
||||||
const columnName = this.getUrlParam(this.curTabState.thirdMenu, '')
|
const columnName = this.getUrlParam(this.curTabState.thirdMenu, '')
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="cn-home">
|
<div class="cn-home">
|
||||||
<cn-header @refresh="refresh"></cn-header>
|
<cn-header @refresh="refresh"></cn-header>
|
||||||
<suspense>
|
<cn-container v-if="containerShow" ref="container"></cn-container>
|
||||||
<cn-container v-if="containerShow" ref="container"></cn-container>
|
|
||||||
</suspense>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
show-word-limit size="small" type="text" v-model="editRole.name"></el-input>
|
show-word-limit size="small" type="text" v-model="editRole.name"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="$t('overall.remark')">
|
<el-form-item :label="$t('overall.remark')">
|
||||||
<el-input maxlength="255" show-word-limit :rows="2" size='mini' type="textarea" v-model="editRole.remark" id="role-box-input-remark"/>
|
<el-input maxlength="256" show-word-limit :rows="2" size='mini' type="textarea" v-model="editRole.remark" id="role-box-input-remark"/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item :label="$t('config.roles.permission')">
|
<el-form-item :label="$t('config.roles.permission')">
|
||||||
@@ -26,8 +26,8 @@
|
|||||||
<el-tree :data="menus" :default-expand-all="expandAllFlag" :props="{label:labelFormatter}" @check-change="selectChange" class="tree-border" node-key="id" ref="menuTree" show-checkbox id="role-box-input-menus">
|
<el-tree :data="menus" :default-expand-all="expandAllFlag" :props="{label:labelFormatter}" @check-change="selectChange" class="tree-border" node-key="id" ref="menuTree" show-checkbox id="role-box-input-menus">
|
||||||
<template #default="{ data }">
|
<template #default="{ data }">
|
||||||
<span>
|
<span>
|
||||||
<i v-if="data.type === '1'" class="el-icon-menu"></i>
|
<i v-if="data.type == '1'" class="el-icon-menu"></i>
|
||||||
<i v-if="data.type === '2'" class="el-icon-edit"></i>
|
<i v-if="data.type == '2'" class="el-icon-edit"></i>
|
||||||
</span>
|
</span>
|
||||||
{{$t(data.i18n)}}
|
{{$t(data.i18n)}}
|
||||||
</template>
|
</template>
|
||||||
@@ -70,8 +70,7 @@ export default {
|
|||||||
rightBox: { model: { show: false } },
|
rightBox: { model: { show: false } },
|
||||||
rules: { // 表单校验规则
|
rules: { // 表单校验规则
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' },
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
{ pattern: /^[a-zA-Z0-9]{2,64}$/, message: this.$t('validate.atLeastTwo') } // 目前仅对长度要求在2-64之间,后续有需求再添加
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
menus: [],
|
menus: [],
|
||||||
@@ -114,7 +113,7 @@ export default {
|
|||||||
self.menus = []
|
self.menus = []
|
||||||
if (self.editRole.id) {
|
if (self.editRole.id) {
|
||||||
get(api.menu + self.editRole.id).then(response => {
|
get(api.menu + self.editRole.id).then(response => {
|
||||||
if (response.code === 200) {
|
if (response.code == 200) {
|
||||||
self.menus = response.data.menus
|
self.menus = response.data.menus
|
||||||
self.selectedIds = response.data.selectedIds
|
self.selectedIds = response.data.selectedIds
|
||||||
} else {
|
} else {
|
||||||
@@ -124,7 +123,7 @@ export default {
|
|||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
get(api.sysMenu).then(response => {
|
get(api.sysMenu).then(response => {
|
||||||
if (response.code === 200) {
|
if (response.code == 200) {
|
||||||
self.menus = response.data.list
|
self.menus = response.data.list
|
||||||
} else {
|
} else {
|
||||||
self.$message.error('load menu faild')
|
self.$message.error('load menu faild')
|
||||||
@@ -162,7 +161,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
save () {
|
save () {
|
||||||
if (this.prevent_opt.save) { return }
|
if (this.prevent_opt.save) { return } ;
|
||||||
this.prevent_opt.save = true
|
this.prevent_opt.save = true
|
||||||
|
|
||||||
this.$refs.roleForm.validate((valid) => {
|
this.$refs.roleForm.validate((valid) => {
|
||||||
|
|||||||
@@ -12,30 +12,30 @@
|
|||||||
<!--name-->
|
<!--name-->
|
||||||
<el-form-item :label="$t('config.user.name')" prop="name">
|
<el-form-item :label="$t('config.user.name')" prop="name">
|
||||||
<el-input id="account-input-name" v-model="editObject.name" :disabled="editObject.username==='admin' && editObject.id === 1"
|
<el-input id="account-input-name" v-model="editObject.name" :disabled="editObject.username==='admin' && editObject.id === 1"
|
||||||
minlength="2" maxlength="64" placeholder="" show-word-limit size="small" type="text"></el-input>
|
maxlength="64" placeholder="" show-word-limit size="small" type="text"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!--username-->
|
<!--username-->
|
||||||
<el-form-item :label="$t('config.user.username')" prop="username">
|
<el-form-item :label="$t('config.user.username')" prop="username">
|
||||||
<el-input id="account-input-username" v-model="editObject.username" :disabled="editObject.username==='admin' && editObject.id === 1"
|
<el-input id="account-input-username" v-model="editObject.username" :disabled="editObject.username==='admin' && editObject.id === 1"
|
||||||
minlength="2" maxlength="64" placeholder="" show-word-limit size="small" type="text"></el-input>
|
maxlength="64" placeholder="" show-word-limit size="small" type="text"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!--password-->
|
<!--password-->
|
||||||
<el-form-item :label="$t('config.user.pin')" prop="pin">
|
<el-form-item :label="$t('config.user.pin')" prop="pin">
|
||||||
<el-input id="account-input-password" v-model="editObject.pin" minlength="5" maxlength="64" placeholder=""
|
<el-input id="account-input-password" v-model="editObject.pin" maxlength="64" placeholder=""
|
||||||
show-word-limit size="small" type="password" @blur="pinBlur" autocomplete="new-password"></el-input>
|
show-word-limit size="small" type="password" @blur="pinBlur" autocomplete="new-password"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!--pinChange-->
|
<!--pinChange-->
|
||||||
<el-form-item :label="$t('config.user.confirmPin')" label-width="200px" prop="pinChange">
|
<el-form-item :label="$t('config.user.confirmPin')" label-width="200px" prop="pinChange">
|
||||||
<el-input id="account-input-pinChange" v-model="editObject.pinChange" minlength="5" maxlength="64" placeholder=""
|
<el-input id="account-input-pinChange" v-model="editObject.pinChange" maxlength="64" placeholder=""
|
||||||
show-word-limit size="small" type="password"></el-input>
|
show-word-limit size="small" type="password"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!--email-->
|
<!--email-->
|
||||||
<el-form-item label="E-mail" prop="email">
|
<el-form-item label="E-mail" prop="email">
|
||||||
<el-input id="account-input-email" v-model="editObject.email" maxlength="35" show-word-limit placeholder="" size="small" type="text"></el-input>
|
<el-input id="account-input-email" v-model="editObject.email" maxlength="64" show-word-limit placeholder="" size="small" type="text"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!--mobile-->
|
<!--mobile-->
|
||||||
<el-form-item :label="$t('config.user.mobile')" prop="mobile">
|
<el-form-item :label="$t('config.user.mobile')" prop="mobile">
|
||||||
<el-input id="account-input-mobile" v-model.number="editObject.mobile" maxlength="11" show-word-limit placeholder="" size="small" type="text"></el-input>
|
<el-input id="account-input-mobile" v-model.number="editObject.mobile" maxlength="64" show-word-limit placeholder="" size="small" type="text"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!--roles-->
|
<!--roles-->
|
||||||
<el-form-item :label="$t('config.user.roles')" prop="roleIds">
|
<el-form-item :label="$t('config.user.roles')" prop="roleIds">
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
<el-switch
|
<el-switch
|
||||||
id="account-input-status"
|
id="account-input-status"
|
||||||
v-model="editObject.status"
|
v-model="editObject.status"
|
||||||
:disabled="(editObject.username === loginName) || (editObject.username === 'admin' && editObject.id === 1)"
|
:disabled="(editObject.username === loginName) || (editObject.username==='admin' && editObject.id==1)"
|
||||||
:active-value="1"
|
:active-value="1"
|
||||||
:inactive-value="0">
|
:inactive-value="0">
|
||||||
</el-switch>
|
</el-switch>
|
||||||
@@ -125,7 +125,7 @@ export default {
|
|||||||
data () {
|
data () {
|
||||||
const validatePin = (rule, value, callback) => { // 确认密码的二次校验
|
const validatePin = (rule, value, callback) => { // 确认密码的二次校验
|
||||||
if (value === '' && this.editObject.pin) {
|
if (value === '' && this.editObject.pin) {
|
||||||
callback(new Error(this.$t('config.user.confirmPin')))
|
callback(new Error(this.$t('config.user.inputConfirmPin')))
|
||||||
} else if (value !== this.editObject.pin) {
|
} else if (value !== this.editObject.pin) {
|
||||||
callback(new Error(this.$t('config.user.confirmPinErr')))
|
callback(new Error(this.$t('config.user.confirmPinErr')))
|
||||||
} else {
|
} else {
|
||||||
@@ -137,31 +137,23 @@ export default {
|
|||||||
loginName: localStorage.getItem(storageKey.username),
|
loginName: localStorage.getItem(storageKey.username),
|
||||||
rules: { // 表单校验规则
|
rules: { // 表单校验规则
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' },
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
{ pattern: /^[a-zA-Z0-9]{2,64}$/, message: this.$t('validate.atLeastTwo') }
|
|
||||||
],
|
],
|
||||||
username: [
|
username: [
|
||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' },
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
{ pattern: /^[a-zA-Z0-9]{2,64}$/, message: this.$t('validate.atLeastTwo') }
|
|
||||||
],
|
],
|
||||||
pin: [
|
pin: [
|
||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' },
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
{ pattern: /^[a-zA-Z0-9]{5,64}$/, message: this.$t('validate.atLeastFive') }
|
|
||||||
],
|
],
|
||||||
pinChange: [
|
pinChange: [
|
||||||
{ validator: validatePin, trigger: 'blur' },
|
{ validator: validatePin, trigger: 'blur' },
|
||||||
{ required: true, message: this.$t('validate.required') },
|
{ required: true, message: '', trigger: 'blur' }
|
||||||
{ pattern: /^[a-zA-Z0-9]{5,64}$/, message: this.$t('validate.atLeastFive') }
|
|
||||||
],
|
],
|
||||||
roleIds: [
|
roleIds: [
|
||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
],
|
],
|
||||||
email: [
|
email: [
|
||||||
{ type: 'email', message: this.$t('validate.email') }
|
{ type: 'email', message: this.$t('validate.email') }
|
||||||
],
|
|
||||||
mobile: [
|
|
||||||
{ required: false, message: this.$t('validate.required') },
|
|
||||||
{ pattern: /^(1[345678]\d{9})$/, message: this.$t('validate.mobile') }
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
rules2: { // 表单校验规则
|
rules2: { // 表单校验规则
|
||||||
@@ -169,19 +161,13 @@ export default {
|
|||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
],
|
],
|
||||||
pinChange: [
|
pinChange: [
|
||||||
{ validator: validatePin, trigger: 'blur' },
|
{ validator: validatePin, trigger: 'blur' }
|
||||||
{ required: true, message: this.$t('validate.required') },
|
|
||||||
{ pattern: /^[a-zA-Z0-9]{5,64}$/, message: this.$t('validate.atLeastFive') }
|
|
||||||
],
|
],
|
||||||
roleIds: [
|
roleIds: [
|
||||||
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
{ required: true, message: this.$t('validate.required'), trigger: 'blur' }
|
||||||
],
|
],
|
||||||
email: [
|
email: [
|
||||||
{ type: 'email', message: this.$t('validate.email') }
|
{ type: 'email', message: this.$t('validate.email') }
|
||||||
],
|
|
||||||
mobile: [
|
|
||||||
{ required: false, message: this.$t('validate.required') },
|
|
||||||
{ pattern: /^(1[345678]\d{9})$/, message: this.$t('validate.mobile') }
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
roleData: [],
|
roleData: [],
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ export default {
|
|||||||
tools: {
|
tools: {
|
||||||
showCustomTableTitle: false // 自定义列弹框是否显示
|
showCustomTableTitle: false // 自定义列弹框是否显示
|
||||||
},
|
},
|
||||||
showLayout: [],
|
showLayout: []
|
||||||
loading: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@@ -1,59 +1,39 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="pop-custom" v-ele-click-outside="esc">
|
<div class="pop-custom" v-ele-click-outside="esc">
|
||||||
<transition-group name="dragTabs" class="list" tag="ul" ref="tabs">
|
<div class="pop-title">{{$t('overall.select')}}</div>
|
||||||
<li v-for="(item, index) in custom"
|
<div class="pop-box custom-labels">
|
||||||
:key="item.label"
|
<div style="height: 100%; border-radius:2%; border:1px solid #DCDFE6; overflow: auto;">
|
||||||
class="list-item"
|
<!--NotSet 为true不可设置-->
|
||||||
@dragenter="dragenter($event, index)"
|
<div
|
||||||
@dragover="dragover($event, index)"
|
v-for="(item,index) in custom"
|
||||||
@dragstart="dragstart(index)"
|
:key="index"
|
||||||
:draggable="!item.sortable"
|
class="custom-label"
|
||||||
>
|
@click="handler(item,index)"
|
||||||
<i class="cn-icon-sort cn-icon icon-drag" :key="item.label"></i>
|
:id="'element-set-el-'+index"
|
||||||
<el-checkbox
|
>
|
||||||
@change="tabChange(index)"
|
<i class="cn-icon cn-icon-check" v-if="!allowedAll && !item.allowed && (index === 0 || index === 1 || item.visibility === 'disabled')"></i>
|
||||||
:disabled="item.disabled"
|
<i v-else class="cn-icon cn-icon-check" v-show="item.show"></i>
|
||||||
v-model="item.show"
|
<span>{{item.label}}</span>
|
||||||
:label="$t(item.label) "
|
</div>
|
||||||
size="small"
|
|
||||||
:key="item.label"/>
|
|
||||||
</li>
|
|
||||||
</transition-group>
|
|
||||||
<!--暂时保留之前代码-->
|
|
||||||
<!-- <div class="pop-title">{{$t('overall.select')}}</div>-->
|
|
||||||
<!-- <div class="pop-box custom-labels">-->
|
|
||||||
<!-- <div style="height: 100%; border-radius:2%; border:1px solid #DCDFE6; overflow: auto;">-->
|
|
||||||
<!-- <!–NotSet 为true不可设置–>-->
|
|
||||||
<!-- <div-->
|
|
||||||
<!-- v-for="(item,index) in custom"-->
|
|
||||||
<!-- :key="index"-->
|
|
||||||
<!-- class="custom-label"-->
|
|
||||||
<!-- @click="handler(item,index)"-->
|
|
||||||
<!-- :id="'element-set-el-'+index"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <i class="cn-icon cn-icon-check" v-if="!allowedAll && !item.allowed && (index === 0 || index === 1 || item.visibility === 'disabled')"></i>-->
|
|
||||||
<!-- <i v-else class="cn-icon cn-icon-check" v-show="item.show"></i>-->
|
|
||||||
<!-- <span>{{item.label}}</span>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
|
|
||||||
<!-- </div>-->
|
</div>
|
||||||
<!-- </div>-->
|
</div>
|
||||||
<!-- <div class="custom-bottom-btns">-->
|
<div class="custom-bottom-btns">
|
||||||
<!-- <el-button size="mini" v-if="isCancel" :id="tableId+'-element-set-none'" class="cn-btn cn-btn-size-small-new cn-btn-style-light-new is-cancel" @click="batchHandler(false)">-->
|
<el-button size="mini" v-if="isCancel" :id="tableId+'-element-set-none'" class="cn-btn cn-btn-size-small-new cn-btn-style-light-new is-cancel" @click="batchHandler(false)">
|
||||||
<!-- <span class="top-tool-btn-txt">{{$t('overall.clear')}}</span>-->
|
<span class="top-tool-btn-txt">{{$t('overall.clear')}}</span>
|
||||||
<!-- </el-button>-->
|
</el-button>
|
||||||
<!-- <el-button size="mini" v-if="!isCancel" :id="tableId+'-element-set-all'" class="cn-btn cn-btn-size-small-new cn-btn-style-light-new" @click="batchHandler(true)">-->
|
<el-button size="mini" v-if="!isCancel" :id="tableId+'-element-set-all'" class="cn-btn cn-btn-size-small-new cn-btn-style-light-new" @click="batchHandler(true)">
|
||||||
<!-- <span class="top-tool-btn-txt">{{$t('overall.all')}}</span>-->
|
<span class="top-tool-btn-txt">{{$t('overall.all')}}</span>
|
||||||
<!-- </el-button>-->
|
</el-button>
|
||||||
<!-- <div class="custom-bottom-btns-right">-->
|
<div class="custom-bottom-btns-right">
|
||||||
<!-- <el-button size="mini" :id="tableId+'-element-set-esc'" class="cn-btn cn-btn-size-small-new cn-btn-style-light-new" @click="esc">-->
|
<el-button size="mini" :id="tableId+'-element-set-esc'" class="cn-btn cn-btn-size-small-new cn-btn-style-light-new" @click="esc">
|
||||||
<!-- <span class="top-tool-btn-txt">{{$t('overall.cancel')}}</span>-->
|
<span class="top-tool-btn-txt">{{$t('overall.cancel')}}</span>
|
||||||
<!-- </el-button>-->
|
</el-button>
|
||||||
<!-- <el-button size="mini" :id="tableId+'-element-set-save'" class="cn-btn cn-btn-size-small-new cn-btn-style-normal-new" @click="save" style="background-color: #0091ff;color:#DCDFE6">-->
|
<el-button size="mini" :id="tableId+'-element-set-save'" class="cn-btn cn-btn-size-small-new cn-btn-style-normal-new" @click="save" style="background-color: #0091ff;color:#DCDFE6">
|
||||||
<!-- <span class="top-tool-btn-txt top-tool-btn-save">{{$t('overall.save')}}</span>-->
|
<span class="top-tool-btn-txt top-tool-btn-save">{{$t('overall.save')}}</span>
|
||||||
<!-- </el-button>-->
|
</el-button>
|
||||||
<!-- </div>-->
|
</div>
|
||||||
<!-- </div>-->
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -68,9 +48,7 @@ export default {
|
|||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
custom: [],
|
custom: []
|
||||||
dragIndex: -1,
|
|
||||||
selectList: []
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
@@ -85,43 +63,10 @@ export default {
|
|||||||
deep: true,
|
deep: true,
|
||||||
handler (n) {
|
handler (n) {
|
||||||
this.custom = JSON.parse(JSON.stringify(n))
|
this.custom = JSON.parse(JSON.stringify(n))
|
||||||
this.selectList = this.custom.filter(item => item.show)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
tabChange () {
|
|
||||||
this.selectList = this.custom.filter(item => item.show)
|
|
||||||
// 最少保留一个选项
|
|
||||||
if (this.selectList.length === 1) {
|
|
||||||
const obj = this.custom.find(item => item.prop === this.selectList[0].prop)
|
|
||||||
obj.disabled = true
|
|
||||||
} else if (this.selectList.length > 1) {
|
|
||||||
this.custom.forEach(item => {
|
|
||||||
// 该方案仅用于原始table列表无禁用的情况,目前无原始列表禁用的情况,后续有原始列表禁用的情况再修改
|
|
||||||
item.disabled = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
this.save()
|
|
||||||
},
|
|
||||||
/** 开始拖拽,获取键值 */
|
|
||||||
dragstart (index) {
|
|
||||||
this.dragIndex = index
|
|
||||||
},
|
|
||||||
/** 获取拖拽键值,修改数组,将数组保存到本地 */
|
|
||||||
dragenter (e, index) {
|
|
||||||
e.preventDefault()
|
|
||||||
if (this.dragIndex !== index) {
|
|
||||||
const moving = this.custom[this.dragIndex]
|
|
||||||
this.custom.splice(this.dragIndex, 1)
|
|
||||||
this.custom.splice(index, 0, moving)
|
|
||||||
this.dragIndex = index
|
|
||||||
this.save()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
dragover (e) {
|
|
||||||
e.preventDefault()
|
|
||||||
},
|
|
||||||
// 悬浮点击空白隐藏
|
// 悬浮点击空白隐藏
|
||||||
esc () {
|
esc () {
|
||||||
this.$emit('close')
|
this.$emit('close')
|
||||||
@@ -149,8 +94,9 @@ export default {
|
|||||||
// 点击第二个cancel
|
// 点击第二个cancel
|
||||||
save () {
|
save () {
|
||||||
this.$emit('update', this.custom)
|
this.$emit('update', this.custom)
|
||||||
localStorage.setItem(storageKey.tableTitle + '-' + localStorage.getItem(storageKey.username) + '-' + this.tableId, JSON.stringify(this.custom))
|
localStorage.setItem(storageKey.tableTitle + '-' + localStorage.getItem(storageKey.username) + '-' + this.tableId,
|
||||||
// this.esc()
|
JSON.stringify(this.custom))
|
||||||
|
this.esc()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
:data="tableData"
|
:data="tableData"
|
||||||
:height="height"
|
:height="height"
|
||||||
border
|
border
|
||||||
empty-text=" "
|
|
||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
@@ -17,8 +16,8 @@
|
|||||||
width="55">
|
width="55">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="item in customTableTitles"
|
v-for="(item, index) in customTableTitles"
|
||||||
:key="item.prop"
|
:key="`col-${index}`"
|
||||||
:fixed="item.fixed"
|
:fixed="item.fixed"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:min-width="`${item.minWidth}`"
|
:min-width="`${item.minWidth}`"
|
||||||
@@ -82,11 +81,29 @@
|
|||||||
<span v-else>{{scope.row[item.prop]}}</span>
|
<span v-else>{{scope.row[item.prop]}}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template v-slot:empty >
|
<el-table-column
|
||||||
<div class="table-no-data" v-if="isNoData">
|
:resizable="false"
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
:width="operationWidth"
|
||||||
</div>
|
fixed="right">
|
||||||
</template>
|
<template #header>
|
||||||
|
<div class="table-operation-title">{{$t('overall.option')}}</div>
|
||||||
|
</template>
|
||||||
|
<template #default="scope">
|
||||||
|
<div class="table-operation-items">
|
||||||
|
<button class="table-operation-item" @click="tableOperation(['edit', scope.row])"><i class="cn-icon cn-icon-edit"></i></button>
|
||||||
|
<el-dropdown size="medium" trigger="hover" @command="tableOperation">
|
||||||
|
<div class="table-operation-item table-operation-item--more">
|
||||||
|
<i class="cn-icon cn-icon-more-arrow-down"></i>
|
||||||
|
</div>
|
||||||
|
<template #dropdown>
|
||||||
|
<el-dropdown-menu >
|
||||||
|
<el-dropdown-item :command="['delete', scope.row]" :disabled="scope.row['buildIn'] === 1"><i class="cn-icon cn-icon-delete"></i><span class="operation-dropdown-text">{{$t('overall.delete')}}</span></el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -97,12 +114,6 @@ import { panelTypeAndRouteMapping } from '@/utils/constants'
|
|||||||
export default {
|
export default {
|
||||||
name: 'chartTable',
|
name: 'chartTable',
|
||||||
mixins: [table],
|
mixins: [table],
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
panelTypeAndRouteMapping: panelTypeAndRouteMapping,
|
panelTypeAndRouteMapping: panelTypeAndRouteMapping,
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
:height="height"
|
:height="height"
|
||||||
tooltip-effect="light"
|
tooltip-effect="light"
|
||||||
border
|
border
|
||||||
empty-text=" "
|
|
||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
@@ -19,8 +18,8 @@
|
|||||||
width="55">
|
width="55">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="item in customTableTitles"
|
v-for="(item, index) in customTableTitles"
|
||||||
:key="item.prop"
|
:key="`col-${index}`"
|
||||||
:fixed="item.fixed"
|
:fixed="item.fixed"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:min-width="`${item.minWidth}`"
|
:min-width="`${item.minWidth}`"
|
||||||
@@ -92,6 +91,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div class="table-operation-items">
|
<div class="table-operation-items">
|
||||||
|
<button class="table-operation-item" @click="tableOperation(['edit', scope.row])"><i class="cn-icon cn-icon-edit"></i></button>
|
||||||
<el-dropdown size="medium" trigger="hover" @command="tableOperation">
|
<el-dropdown size="medium" trigger="hover" @command="tableOperation">
|
||||||
<div class="table-operation-item table-operation-item--more">
|
<div class="table-operation-item table-operation-item--more">
|
||||||
<i class="cn-icon cn-icon-more-arrow-down"></i>
|
<i class="cn-icon cn-icon-more-arrow-down"></i>
|
||||||
@@ -99,6 +99,7 @@
|
|||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-menu >
|
<el-dropdown-menu >
|
||||||
<el-dropdown-item :command="['copy', scope.row]"><i class="cn-icon cn-icon-override"></i><span class="operation-dropdown-text">{{$t('overall.duplicate')}}</span></el-dropdown-item>
|
<el-dropdown-item :command="['copy', scope.row]"><i class="cn-icon cn-icon-override"></i><span class="operation-dropdown-text">{{$t('overall.duplicate')}}</span></el-dropdown-item>
|
||||||
|
<el-dropdown-item :command="['delete', scope.row]"><i class="cn-icon cn-icon-delete"></i><span class="operation-dropdown-text">{{$t('overall.delete')}}</span></el-dropdown-item>
|
||||||
<el-dropdown-item :command="['debug', scope.row]"><i class="cn-icon cn-icon-debug"></i><span class="operation-dropdown-text">{{$t('overall.debug')}}</span></el-dropdown-item>
|
<el-dropdown-item :command="['debug', scope.row]"><i class="cn-icon cn-icon-debug"></i><span class="operation-dropdown-text">{{$t('overall.debug')}}</span></el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</template>
|
</template>
|
||||||
@@ -106,11 +107,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template v-slot:empty >
|
|
||||||
<div class="table-no-data" v-if="isNoData">
|
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -121,12 +117,6 @@ import { copyValue } from '@/utils/tools'
|
|||||||
export default {
|
export default {
|
||||||
name: 'galaxyProxyTable',
|
name: 'galaxyProxyTable',
|
||||||
mixins: [table],
|
mixins: [table],
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
tableTitle: [ // 原始table列
|
tableTitle: [ // 原始table列
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
:data="tableData"
|
:data="tableData"
|
||||||
:height="height"
|
:height="height"
|
||||||
border
|
border
|
||||||
empty-text=" "
|
|
||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
@@ -17,8 +16,8 @@
|
|||||||
width="55">
|
width="55">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="item in customTableTitles"
|
v-for="(item, index) in customTableTitles"
|
||||||
:key="item.prop"
|
:key="`col-${index}`"
|
||||||
:fixed="item.fixed"
|
:fixed="item.fixed"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:min-width="`${item.minWidth}`"
|
:min-width="`${item.minWidth}`"
|
||||||
@@ -33,13 +32,32 @@
|
|||||||
<div class="col-resize-area"></div>
|
<div class="col-resize-area"></div>
|
||||||
</template>
|
</template>
|
||||||
<template #default="scope" :column="item">
|
<template #default="scope" :column="item">
|
||||||
<span>{{scope.row[item.prop] || '-'}}</span>
|
<span>{{scope.row[item.prop]}}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column><template v-slot:empty >
|
</el-table-column>
|
||||||
<div class="table-no-data" v-if="isNoData">
|
<el-table-column
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
:resizable="false"
|
||||||
</div>
|
:width="operationWidth"
|
||||||
</template>
|
fixed="right">
|
||||||
|
<template #header>
|
||||||
|
<div class="table-operation-title">{{$t('overall.option')}}</div>
|
||||||
|
</template>
|
||||||
|
<template #default="scope">
|
||||||
|
<div class="table-operation-items">
|
||||||
|
<button class="table-operation-item" @click="tableOperation(['edit', scope.row])"><i class="cn-icon cn-icon-edit"></i></button>
|
||||||
|
<el-dropdown size="medium" trigger="hover" @command="tableOperation">
|
||||||
|
<div class="table-operation-item table-operation-item--more">
|
||||||
|
<i class="cn-icon cn-icon-more-arrow-down"></i>
|
||||||
|
</div>
|
||||||
|
<template #dropdown>
|
||||||
|
<el-dropdown-menu >
|
||||||
|
<el-dropdown-item :command="['delete', scope.row]" :disabled="scope.row.id === 1"><i class="cn-icon cn-icon-delete"></i><span class="operation-dropdown-text">{{$t('overall.delete')}}</span></el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</template>
|
||||||
|
</el-dropdown>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -50,12 +68,6 @@ import { api } from '@/utils/api'
|
|||||||
export default {
|
export default {
|
||||||
name: 'I18nTable',
|
name: 'I18nTable',
|
||||||
mixins: [table],
|
mixins: [table],
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
url: api.i18nLang,
|
url: api.i18nLang,
|
||||||
|
|||||||
@@ -6,17 +6,20 @@
|
|||||||
:height="height"
|
:height="height"
|
||||||
tooltip-effect="light"
|
tooltip-effect="light"
|
||||||
border
|
border
|
||||||
empty-text=" "
|
|
||||||
class="no-operation"
|
class="no-operation"
|
||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
:cell-style="{paddingLeft: '20px'}"
|
|
||||||
:header-cell-style="{paddingLeft: '20px'}"
|
|
||||||
>
|
>
|
||||||
|
<el-table-column
|
||||||
|
:resizable="false"
|
||||||
|
align="center"
|
||||||
|
type="selection"
|
||||||
|
width="55">
|
||||||
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="(item, index) in customTableTitles"
|
v-for="(item, index) in customTableTitles"
|
||||||
:key="item.prop+index"
|
:key="`col-${index}`"
|
||||||
:fixed="item.fixed"
|
:fixed="item.fixed"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:min-width="`${item.minWidth}`"
|
:min-width="`${item.minWidth}`"
|
||||||
@@ -36,29 +39,24 @@
|
|||||||
{{scope.row[item.prop]}}ms
|
{{scope.row[item.prop]}}ms
|
||||||
</span>
|
</span>
|
||||||
<span v-else-if="item.prop === 'state'">
|
<span v-else-if="item.prop === 'state'">
|
||||||
<template v-if="scope.row[item.prop]===operationLogStateMapping.success">
|
<template v-if="scope.row[item.prop]==operationLogStateMapping.success">
|
||||||
{{$t('operationLog.state.success')}}
|
{{$t('operationLog.state.success')}}
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="scope.row[item.prop]===operationLogStateMapping.fail">
|
<template v-else-if="scope.row[item.prop]==operationLogStateMapping.fail">
|
||||||
{{$t('operationLog.state.fail')}}
|
{{$t('operationLog.state.fail')}}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
{{scope.row[item.prop] || '-'}}
|
{{scope.row[item.prop]}}
|
||||||
</template>
|
</template>
|
||||||
</span>
|
</span>
|
||||||
<span v-else-if="item.prop === 'username'">{{formatUsername(scope.row)}}</span>
|
<span v-else-if="item.prop === 'username'">{{formatUsername(scope.row)}}</span>
|
||||||
<span v-else-if="item.prop === 'ctime'">{{dateFormatByAppearance(scope.row[item.prop])}}</span>
|
<span v-else-if="item.prop === 'ctime'">{{dateFormatByAppearance(scope.row[item.prop])}}</span>
|
||||||
<template v-else-if="item.prop === 'params' || item.prop === 'response'">
|
<template v-else-if="item.prop === 'params' || item.prop === 'response'">
|
||||||
<span>{{scope.row[item.prop] || '-'}}</span>
|
<span>{{scope.row[item.prop]}}</span>
|
||||||
</template>
|
</template>
|
||||||
<span v-else>{{scope.row[item.prop] || '-'}}</span>
|
<span v-else>{{scope.row[item.prop]}}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template v-slot:empty >
|
|
||||||
<div class="table-no-data" v-if="isNoData">
|
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -69,12 +67,6 @@ import { operationLogStateMapping } from '@/utils/constants'
|
|||||||
export default {
|
export default {
|
||||||
name: 'roleTable',
|
name: 'roleTable',
|
||||||
mixins: [table],
|
mixins: [table],
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
operationLogStateMapping: operationLogStateMapping,
|
operationLogStateMapping: operationLogStateMapping,
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
:data="tableData"
|
:data="tableData"
|
||||||
:height="height"
|
:height="height"
|
||||||
border
|
border
|
||||||
empty-text=" "
|
|
||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@selection-change="selectionChange"
|
@selection-change="selectionChange"
|
||||||
@@ -14,13 +13,11 @@
|
|||||||
:resizable="false"
|
:resizable="false"
|
||||||
align="center"
|
align="center"
|
||||||
type="selection"
|
type="selection"
|
||||||
:selectable="checkSelectable"
|
|
||||||
width="55">
|
width="55">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!--key只使用item.prop的话,拖拽后,界面无响应,添加index后问题解决-->
|
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="(item, index) in customTableTitles"
|
v-for="(item, index) in customTableTitles"
|
||||||
:key="item.prop+index"
|
:key="`col-${index}`"
|
||||||
:fixed="item.fixed"
|
:fixed="item.fixed"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:min-width="`${item.minWidth}`"
|
:min-width="`${item.minWidth}`"
|
||||||
@@ -47,14 +44,9 @@
|
|||||||
<span>-</span>
|
<span>-</span>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<span v-else>{{scope.row[item.prop] || '-'}}</span>
|
<span v-else>{{scope.row[item.prop]}}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template v-slot:empty >
|
|
||||||
<div class="table-no-data" v-if="isNoData">
|
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -63,12 +55,6 @@ import table from '@/mixins/table'
|
|||||||
export default {
|
export default {
|
||||||
name: 'roleTable',
|
name: 'roleTable',
|
||||||
mixins: [table],
|
mixins: [table],
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
tableTitle: [ // 原table列
|
tableTitle: [ // 原table列
|
||||||
@@ -90,12 +76,6 @@ export default {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
// 禁止勾选buildIn为1的项,即禁止修改admin的权限
|
|
||||||
checkSelectable (row) {
|
|
||||||
return row.buildIn !== 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
ref="dataTable"
|
ref="dataTable"
|
||||||
:data="tableData"
|
:data="tableData"
|
||||||
:height="height"
|
:height="height"
|
||||||
empty-text=" "
|
empty-text=""
|
||||||
border
|
border
|
||||||
@header-dragend="dragend"
|
@header-dragend="dragend"
|
||||||
@sort-change="tableDataSort"
|
@sort-change="tableDataSort"
|
||||||
@@ -14,12 +14,11 @@
|
|||||||
:resizable="false"
|
:resizable="false"
|
||||||
align="center"
|
align="center"
|
||||||
type="selection"
|
type="selection"
|
||||||
:selectable="checkSelectable"
|
|
||||||
width="55">
|
width="55">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="(item, index) in customTableTitles"
|
v-for="(item, index) in customTableTitles"
|
||||||
:key="item.prop+index"
|
:key="`col-${index}`"
|
||||||
:fixed="item.fixed"
|
:fixed="item.fixed"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:min-width="`${item.minWidth}`"
|
:min-width="`${item.minWidth}`"
|
||||||
@@ -44,7 +43,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<template v-else-if="item.prop === 'lastLoginTime'">
|
<template v-else-if="item.prop === 'lastLoginTime'">
|
||||||
<template v-if="scope.row[item.prop]">
|
<template v-if="scope.row[item.prop]">
|
||||||
{{dateFormatByAppearance(scope.row[item.prop]) || '-'}}
|
{{dateFormatByAppearance(scope.row[item.prop])}}
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<span>-</span>
|
<span>-</span>
|
||||||
@@ -52,22 +51,17 @@
|
|||||||
</template>
|
</template>
|
||||||
<template v-else-if="item.prop === 'status'">
|
<template v-else-if="item.prop === 'status'">
|
||||||
<el-switch
|
<el-switch
|
||||||
v-if="scope.row.id"
|
v-if="scope.row.id"
|
||||||
v-model="scope.row.status"
|
v-model="scope.row.status"
|
||||||
active-value="1"
|
active-value="1"
|
||||||
:disabled="(scope.row.username === loginName) || (scope.row.username==='admin' && scope.row.id===1) || scope.row.buildIn === 1"
|
:disabled="(scope.row.username === loginName) || (scope.row.username==='admin' && scope.row.id==1) "
|
||||||
inactive-value="0"
|
inactive-value="0"
|
||||||
@change="()=>{statusChange(scope.row)}">
|
@change="()=>{statusChange(scope.row)}">
|
||||||
</el-switch>
|
</el-switch>
|
||||||
</template>
|
</template>
|
||||||
<span v-else>{{scope.row[item.prop] || '-'}}</span>
|
<span v-else>{{scope.row[item.prop]}}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template v-slot:empty >
|
|
||||||
<div class="table-no-data" v-if="isNoData">
|
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table>
|
</el-table>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -78,12 +72,6 @@ import { storageKey } from '@/utils/constants'
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'userTable',
|
name: 'userTable',
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mixins: [table],
|
mixins: [table],
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
@@ -156,10 +144,6 @@ export default {
|
|||||||
}
|
}
|
||||||
this.$emit('reload')
|
this.$emit('reload')
|
||||||
})
|
})
|
||||||
},
|
|
||||||
// 禁止勾选buildIn为1的项,即禁止修改、删除admin的账号
|
|
||||||
checkSelectable (row) {
|
|
||||||
return row.buildIn !== 1
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
:data="tableData"
|
:data="tableData"
|
||||||
:height="height"
|
:height="height"
|
||||||
:expand-row-keys="expandedIds"
|
:expand-row-keys="expandedIds"
|
||||||
|
:empty-text="$t('npm.noData')"
|
||||||
border
|
border
|
||||||
empty-text=" "
|
|
||||||
tooltip-effect="light"
|
tooltip-effect="light"
|
||||||
:row-key="(row) => { return row.id }"
|
:row-key="(row) => { return row.id }"
|
||||||
:reserve-selection="true"
|
:reserve-selection="true"
|
||||||
@@ -96,8 +96,8 @@
|
|||||||
width="30">
|
width="30">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="item in customTableTitles"
|
v-for="(item, index) in customTableTitles"
|
||||||
:key="item.prop"
|
:key="`col-${index}`"
|
||||||
:fixed="item.fixed"
|
:fixed="item.fixed"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:min-width="`${item.minWidth}`"
|
:min-width="`${item.minWidth}`"
|
||||||
@@ -117,7 +117,9 @@
|
|||||||
{{ handleTimeRange(scope.row) }}
|
{{ handleTimeRange(scope.row) }}
|
||||||
</span>
|
</span>
|
||||||
<span v-else-if="item.prop === 'categoryId'">
|
<span v-else-if="item.prop === 'categoryId'">
|
||||||
<span>{{ getCategoryName(scope.row.categoryId) }}</span>
|
<span v-for="(item, i) in categoryList" :key="i">
|
||||||
|
<span v-if="scope.row.categoryId === item.id">{{ item.name }}</span>
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<span v-else-if="item.prop === 'timePlan'">
|
<span v-else-if="item.prop === 'timePlan'">
|
||||||
<template v-if="scope.row.config && scope.row.config.isScheduler === 0">
|
<template v-if="scope.row.config && scope.row.config.isScheduler === 0">
|
||||||
@@ -186,11 +188,6 @@
|
|||||||
<span v-else>{{ scope.row[item.prop] || '-' }}</span>
|
<span v-else>{{ scope.row[item.prop] || '-' }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template v-slot:empty >
|
|
||||||
<div class="table-no-data" v-if="isNoData">
|
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table>
|
</el-table>
|
||||||
<!-- <div class="table-operation-all">
|
<!-- <div class="table-operation-all">
|
||||||
<el-checkbox v-model="checkboxAll" :indeterminate="isIndeterminate" @change="selectAll(tableData)"></el-checkbox>
|
<el-checkbox v-model="checkboxAll" :indeterminate="isIndeterminate" @change="selectAll(tableData)"></el-checkbox>
|
||||||
@@ -232,11 +229,7 @@ export default {
|
|||||||
props: {
|
props: {
|
||||||
categoryList: Array,
|
categoryList: Array,
|
||||||
toolsLoading: Boolean,
|
toolsLoading: Boolean,
|
||||||
categoryId: Number,
|
categoryId: Number
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
inject: ['reload'],
|
inject: ['reload'],
|
||||||
data () {
|
data () {
|
||||||
@@ -299,7 +292,7 @@ export default {
|
|||||||
loadingTableId: '',
|
loadingTableId: '',
|
||||||
loadingPreviewId: '',
|
loadingPreviewId: '',
|
||||||
downDataList: [],
|
downDataList: [],
|
||||||
disableEdit: false, // 编辑按钮是否不可用,当选择多条记录的时候你,编辑按钮不可用
|
disableEdit:false,//编辑按钮是否不可用,当选择多条记录的时候你,编辑按钮不可用
|
||||||
// pageObj: {
|
// pageObj: {
|
||||||
// pageNo: 1,
|
// pageNo: 1,
|
||||||
// pageSize: 20,
|
// pageSize: 20,
|
||||||
@@ -549,9 +542,9 @@ export default {
|
|||||||
// this.selectIds = selectIds
|
// this.selectIds = selectIds
|
||||||
}
|
}
|
||||||
this.batchDeleteObjs = objs
|
this.batchDeleteObjs = objs
|
||||||
if (objs.length > 1) {
|
if(objs.length > 1) {
|
||||||
this.disableEdit = true
|
this.disableEdit = true
|
||||||
} else {
|
}else {
|
||||||
this.disableEdit = false
|
this.disableEdit = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -573,9 +566,9 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.batchDeleteObjs = objs
|
this.batchDeleteObjs = objs
|
||||||
if (objs.length > 1) {
|
if(objs.length > 1) {
|
||||||
this.disableEdit = true
|
this.disableEdit = true
|
||||||
} else {
|
}else {
|
||||||
this.disableEdit = false
|
this.disableEdit = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -667,7 +660,7 @@ export default {
|
|||||||
this.$message.error(response.msg)
|
this.$message.error(response.msg)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}).catch(() => {})
|
})
|
||||||
},
|
},
|
||||||
pageJump (val) {
|
pageJump (val) {
|
||||||
this.pageObj.pageNo = val
|
this.pageObj.pageNo = val
|
||||||
@@ -766,16 +759,6 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.configCustom = str
|
this.configCustom = str
|
||||||
},
|
|
||||||
getCategoryName (id) {
|
|
||||||
let name = '-'
|
|
||||||
for (let i = 0; i < this.categoryList.length; i++) {
|
|
||||||
if (id === this.categoryList[i].id) {
|
|
||||||
name = this.categoryList[i].name
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return name
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
beforeUnmount () {
|
beforeUnmount () {
|
||||||
|
|||||||
135
src/components/table/setting/KnowledgeBaseTable.vue
Normal file
135
src/components/table/setting/KnowledgeBaseTable.vue
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<template>
|
||||||
|
<el-table
|
||||||
|
id="knowledgeBaseTable"
|
||||||
|
ref="dataTable"
|
||||||
|
:data="tableData"
|
||||||
|
:height="height"
|
||||||
|
border
|
||||||
|
@header-dragend="dragend"
|
||||||
|
@sort-change="tableDataSort"
|
||||||
|
@selection-change="selectionChange"
|
||||||
|
>
|
||||||
|
<el-table-column
|
||||||
|
:resizable="false"
|
||||||
|
align="center"
|
||||||
|
type="selection"
|
||||||
|
width="55">
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
v-for="(item, index) in customTableTitles"
|
||||||
|
:key="`col-${index}`"
|
||||||
|
:fixed="item.fixed"
|
||||||
|
:label="item.label"
|
||||||
|
:min-width="`${item.minWidth}`"
|
||||||
|
:prop="item.prop"
|
||||||
|
:resizable="true"
|
||||||
|
:sort-orders="['ascending', 'descending']"
|
||||||
|
:sortable="item.sortable"
|
||||||
|
:width="`${item.width}`"
|
||||||
|
class="data-column"
|
||||||
|
>
|
||||||
|
<template #header>
|
||||||
|
<span class="data-column__span">{{item.label}}</span>
|
||||||
|
<div class="col-resize-area"></div>
|
||||||
|
</template>
|
||||||
|
<template #default="scope" :column="item">
|
||||||
|
<template v-if="item.prop === 'name'">
|
||||||
|
<template v-if="scope.row.i18n">
|
||||||
|
<span>{{$t(scope.row.i18n)}}</span>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="scope.row.name">
|
||||||
|
<span>{{scope.row.name}}</span>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<span>-</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="item.prop === 'tagType'">
|
||||||
|
<span class="type-tag">{{tagTypeText(scope.row[item.prop])}}</span>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="item.prop === 'utime' || item.prop === 'ctime'">
|
||||||
|
<template v-if="scope.row[item.prop]">
|
||||||
|
{{dateFormatByAppearance(scope.row[item.prop])}}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<span>-</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="item.prop === 'cuser' || item.prop === 'uuser'">
|
||||||
|
<template v-if="scope.row[item.prop]">
|
||||||
|
{{scope.row[item.prop].username || '-'}}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<span>-</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<span v-else>{{scope.row[item.prop] || '-'}}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import table from '@/mixins/table'
|
||||||
|
import { knowledgeBaseType } from '@/utils/constants'
|
||||||
|
export default {
|
||||||
|
name: 'knowledgeBaseTable',
|
||||||
|
mixins: [table],
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
tableTitle: [ // 原table列
|
||||||
|
{
|
||||||
|
label: 'ID',
|
||||||
|
prop: 'id',
|
||||||
|
show: true,
|
||||||
|
width: 100,
|
||||||
|
sortable: 'custom'
|
||||||
|
}, {
|
||||||
|
label: this.$t('config.roles.name'),
|
||||||
|
prop: 'tagName',
|
||||||
|
show: true,
|
||||||
|
sortable: 'custom'
|
||||||
|
}, {
|
||||||
|
label: this.$t('overall.type'),
|
||||||
|
prop: 'tagType',
|
||||||
|
show: true
|
||||||
|
}, {
|
||||||
|
label: this.$t('overall.remark'),
|
||||||
|
prop: 'remark',
|
||||||
|
show: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$t('overall.createdBy'),
|
||||||
|
prop: 'cuser',
|
||||||
|
show: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$t('config.user.createTime'),
|
||||||
|
prop: 'ctime',
|
||||||
|
show: false,
|
||||||
|
sortable: 'custom'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$t('overall.updatedBy'),
|
||||||
|
prop: 'uuser',
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: this.$t('overall.updateTime'),
|
||||||
|
prop: 'utime',
|
||||||
|
show: false,
|
||||||
|
sortable: 'custom'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
tagTypeText () {
|
||||||
|
return function (type) {
|
||||||
|
const t = knowledgeBaseType.find(t => t.value === type)
|
||||||
|
return t ? t.name : ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-table
|
|
||||||
id="knowledgeBaseTable"
|
|
||||||
ref="dataTable"
|
|
||||||
:data="tableData"
|
|
||||||
:height="height"
|
|
||||||
border
|
|
||||||
empty-text=" "
|
|
||||||
@header-dragend="dragend"
|
|
||||||
@sort-change="tableDataSort"
|
|
||||||
@selection-change="selectionChange"
|
|
||||||
>
|
|
||||||
<el-table-column
|
|
||||||
:resizable="false"
|
|
||||||
align="center"
|
|
||||||
type="selection"
|
|
||||||
:selectable="selectable"
|
|
||||||
width="55">
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column
|
|
||||||
v-for="(item, index) in customTableTitles"
|
|
||||||
:key="`col-${index}`"
|
|
||||||
:fixed="item.fixed"
|
|
||||||
:label="item.label"
|
|
||||||
:min-width="`${item.minWidth}`"
|
|
||||||
:prop="item.prop"
|
|
||||||
:resizable="true"
|
|
||||||
:sort-orders="['ascending', 'descending']"
|
|
||||||
:sortable="item.sortable"
|
|
||||||
:width="`${item.width}`"
|
|
||||||
class="data-column"
|
|
||||||
>
|
|
||||||
<template #header>
|
|
||||||
<span class="data-column__span">{{item.label}}</span>
|
|
||||||
<div class="col-resize-area"></div>
|
|
||||||
</template>
|
|
||||||
<template #default="scope" :column="item">
|
|
||||||
<template v-if="item.prop === 'name'" >
|
|
||||||
<template v-if="scope.row.i18n">
|
|
||||||
<span :title="scope.row[item.prop]">{{$t(scope.row.i18n)}}</span>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="scope.row.name">
|
|
||||||
<span :title="scope.row[item.prop]">{{scope.row.name}}</span>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<span>-</span>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.prop === 'category'">
|
|
||||||
<span >{{tagCategoryText(scope.row[item.prop])}}</span>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.prop === 'source'">
|
|
||||||
<span class="type-tag">{{tagSourceText(scope.row[item.prop])}}</span>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.prop === 'opTime' || item.prop === 'ctime'">
|
|
||||||
<template v-if="scope.row[item.prop]">
|
|
||||||
{{dateFormatByAppearance(scope.row[item.prop])}}
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<span>-</span>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.prop === 'cuser' || item.prop === 'uuser'">
|
|
||||||
<template v-if="scope.row[item.prop]">
|
|
||||||
{{scope.row[item.prop].username || '-'}}
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<span>-</span>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.prop === 'description'">
|
|
||||||
<span class="list-desc" :title="scope.row[item.prop]">{{scope.row[item.prop]}}</span>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="item.prop === 'status'">
|
|
||||||
<el-switch class="card-enable"
|
|
||||||
v-model="scope.row.status"
|
|
||||||
active-color="#38ACD2"
|
|
||||||
inactive-color="#C0CEDB"
|
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
@change="changeStatus($event,scope.row.knowledgeId)"
|
|
||||||
>
|
|
||||||
</el-switch>
|
|
||||||
</template>
|
|
||||||
<span v-else>{{scope.row[item.prop] || '-'}}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<template v-slot:empty >
|
|
||||||
<div class="table-no-data" v-if="isNoData">
|
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</el-table>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import table from '@/mixins/table'
|
|
||||||
import { knowledgeBaseCategory, knowledgeBaseSource } from '@/utils/constants'
|
|
||||||
export default {
|
|
||||||
name: 'KnowledgeBaseTableForRow',
|
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mixins: [table],
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
tableTitle: [ // 原table列
|
|
||||||
{
|
|
||||||
label: 'ID',
|
|
||||||
prop: 'knowledgeId',
|
|
||||||
show: true,
|
|
||||||
width: 60,
|
|
||||||
sortable: 'custom'
|
|
||||||
}, {
|
|
||||||
label: this.$t('config.roles.name'),
|
|
||||||
prop: 'name',
|
|
||||||
minWidth: 100,
|
|
||||||
show: true,
|
|
||||||
sortable: 'custom'
|
|
||||||
}, {
|
|
||||||
label: this.$t('overall.category'),
|
|
||||||
prop: 'category',
|
|
||||||
width: 100,
|
|
||||||
show: true
|
|
||||||
}, {
|
|
||||||
label: this.$t('overall.source'),
|
|
||||||
prop: 'source',
|
|
||||||
width: 130,
|
|
||||||
show: true
|
|
||||||
}, {
|
|
||||||
label: this.$t('overall.remark'),
|
|
||||||
prop: 'description',
|
|
||||||
minWidth: 150,
|
|
||||||
show: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: this.$t('overall.createdBy'),
|
|
||||||
prop: 'opUser',
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: this.$t('config.user.createTime'),
|
|
||||||
prop: 'ctime',
|
|
||||||
show: false,
|
|
||||||
sortable: 'custom'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: this.$t('overall.updatedBy'),
|
|
||||||
prop: 'uuser',
|
|
||||||
show: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: this.$t('overall.updateTime'),
|
|
||||||
prop: 'opTime',
|
|
||||||
show: true,
|
|
||||||
sortable: 'custom'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: this.$t('knowledge.status'),
|
|
||||||
prop: 'status',
|
|
||||||
show: true,
|
|
||||||
minWidth: 40
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
tagCategoryText () {
|
|
||||||
return function (type) {
|
|
||||||
const t = knowledgeBaseCategory.find(t => t.value === type)
|
|
||||||
return t ? t.name : ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tagSourceText () {
|
|
||||||
return function (type) {
|
|
||||||
const t = knowledgeBaseSource.find(t => t.value === type)
|
|
||||||
return t ? t.name : ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-checkbox-group v-model="checkList" v-if="!isNoData">
|
|
||||||
<div @click="isSelectedStatus && data.isBuiltIn !== 1 && clickCard(data,$event)" @mouseenter="mouseenter(data)" @mouseleave="mouseleave(data)" v-for="data in tableData" :key="data.knowledgeId" class="card-item" :class="data.isSelected ? 'card-selected' : ''">
|
|
||||||
<div class="card-content">
|
|
||||||
<div class="card-title">
|
|
||||||
<div class="card-title-name" :title="data.name">{{data.name}}</div>
|
|
||||||
<div class="card-title-more">
|
|
||||||
<span v-show="!isSelectedStatus && data.showMore && data.isBuiltIn !== 1"><i class="cn-icon cn-icon-more-dark" @mouseenter="mouseenterMore(data)" test-id="mouseenter-dark"></i></span>
|
|
||||||
<div class="card-operate" v-show="!isSelectedStatus && data.moreOptions" @mouseleave="mouseleaveMore(data)">
|
|
||||||
<div class="card-title-more-edit" @click="edit(data.knowledgeId)" >{{$t('overall.edit')}}</div>
|
|
||||||
<div class="card-title-more-delete" @click="del(data)" >{{$t('overall.delete')}}</div>
|
|
||||||
</div>
|
|
||||||
<el-checkbox @click.stop="" :disabled="data.isBuiltIn === 1" @change="(val) => {checkboxStatusChange(val,data)}" style="position: absolute;right: -12px;" v-if="isSelectedStatus" :key="data.knowledgeId" :label="data"><br></el-checkbox>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-id">ID:{{data.knowledgeId}}</div>
|
|
||||||
<div class="card-desc" :title="data.description">{{data.description?data.description:'—'}}</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-operate__footer">
|
|
||||||
<div class="card-type">
|
|
||||||
<div class="card-category">{{tagCategoryText(data.category)}}</div>
|
|
||||||
<div class="card-source">{{tagSourceText(data.source)}}</div>
|
|
||||||
</div>
|
|
||||||
<el-switch class="card-enable"
|
|
||||||
v-model="data.status"
|
|
||||||
active-color="#38ACD2"
|
|
||||||
inactive-color="#C0CEDB"
|
|
||||||
:active-value="1"
|
|
||||||
:inactive-value="0"
|
|
||||||
@change="changeStatus($event,data.knowledgeId)"
|
|
||||||
>
|
|
||||||
</el-switch>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</el-checkbox-group>
|
|
||||||
<div class="table-no-data" v-else="isNoData">
|
|
||||||
<div class="table-no-data__title">{{ $t('npm.noData') }}</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import table from '@/mixins/table'
|
|
||||||
import { knowledgeBaseCategory, knowledgeBaseSource } from '@/utils/constants'
|
|
||||||
export default {
|
|
||||||
name: 'knowledgeBaseTableForCard',
|
|
||||||
mixins: [table],
|
|
||||||
props: {
|
|
||||||
isNoData: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
isSelectedStatus: {
|
|
||||||
type: Boolean
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
tableTitle: [],
|
|
||||||
checkList: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
clickCard (data, event) {
|
|
||||||
if (data.isSelected) { // 原来为选中,当前点击后未选中
|
|
||||||
const index = this.checkList.indexOf(data)
|
|
||||||
if (index > -1) {
|
|
||||||
this.checkList.splice(index, 1)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const index = this.checkList.indexOf(data)
|
|
||||||
if (index === -1) {
|
|
||||||
this.checkList.push(data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const val = !data.isSelected
|
|
||||||
data.isSelected = val
|
|
||||||
this.$emit('checkboxStatusChange', val, data)
|
|
||||||
},
|
|
||||||
checkboxStatusChange (val, data) {
|
|
||||||
data.isSelected = val
|
|
||||||
this.$emit('checkboxStatusChange', val, data)
|
|
||||||
},
|
|
||||||
showSelect () {
|
|
||||||
// this.isSelectedStatus = true
|
|
||||||
},
|
|
||||||
hideSelect () {
|
|
||||||
// this.isSelectedStatus = false
|
|
||||||
},
|
|
||||||
clearSelect () {
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.checkList = []
|
|
||||||
if (this.tableData && this.tableData.length > 0) {
|
|
||||||
this.tableData.forEach(data => {
|
|
||||||
data.isSelected = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
mouseenterMore (card) {
|
|
||||||
this.tableData.forEach(t => {
|
|
||||||
if (t.knowledgeId === card.knowledgeId) {
|
|
||||||
t.moreOptions = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
mouseleaveMore (card) {
|
|
||||||
this.tableData.forEach(t => {
|
|
||||||
if (t.knowledgeId === card.knowledgeId) {
|
|
||||||
t.moreOptions = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
mouseenter (card) {
|
|
||||||
this.tableData.forEach(t => {
|
|
||||||
if (t.knowledgeId === card.knowledgeId) {
|
|
||||||
t.showMore = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
mouseleave (card) {
|
|
||||||
this.tableData.forEach(t => {
|
|
||||||
if (t.knowledgeId === card.knowledgeId) {
|
|
||||||
t.showMore = false
|
|
||||||
t.moreOptions = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
del (data) {
|
|
||||||
this.$emit('delete', data)
|
|
||||||
},
|
|
||||||
edit (id) {
|
|
||||||
const pageNo = this.$router.currentRoute.value.query.pageNo
|
|
||||||
const listMode = this.$router.currentRoute.value.query.listMode
|
|
||||||
this.$router.push({
|
|
||||||
path: '/knowledgeBase/edit',
|
|
||||||
query: {
|
|
||||||
t: +new Date(),
|
|
||||||
pageNoForTable: pageNo || 1,
|
|
||||||
id: id,
|
|
||||||
listMode: listMode
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.tableData.forEach(item => {
|
|
||||||
item.showMore = false
|
|
||||||
item.moreOptions = false
|
|
||||||
})
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
tagCategoryText () {
|
|
||||||
return function (type) {
|
|
||||||
const t = knowledgeBaseCategory.find(t => t.value === type)
|
|
||||||
return t ? t.name : ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tagSourceText () {
|
|
||||||
return function (type) {
|
|
||||||
const t = knowledgeBaseSource.find(t => t.value === type)
|
|
||||||
return t ? t.name : ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import { hasButton } from '@/permission'
|
import { hasButton } from '@/permission'
|
||||||
import { dateFormatByAppearance } from '@/utils/date-util'
|
import { dateFormatByAppearance } from '@/utils/date-util'
|
||||||
import { commonErrorTip } from '@/utils/constants'
|
|
||||||
export default {
|
export default {
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
@@ -30,16 +29,6 @@ export default {
|
|||||||
hasButton (code) {
|
hasButton (code) {
|
||||||
return hasButton(this.$store.getters.buttonList, code)
|
return hasButton(this.$store.getters.buttonList, code)
|
||||||
},
|
},
|
||||||
errorMsgHandler (axiosError) {
|
|
||||||
if (axiosError.response) {
|
|
||||||
if (axiosError.response.data) {
|
|
||||||
return axiosError.response.data.message || commonErrorTip
|
|
||||||
}
|
|
||||||
} else if (axiosError.message) {
|
|
||||||
return axiosError.message
|
|
||||||
}
|
|
||||||
return commonErrorTip
|
|
||||||
},
|
|
||||||
isBuiltIn (row) {
|
isBuiltIn (row) {
|
||||||
return (row.buildIn && row.buildIn === 1) || (row.builtIn && row.builtIn === 1)
|
return (row.buildIn && row.buildIn === 1) || (row.builtIn && row.builtIn === 1)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,12 +5,10 @@ import { ref } from 'vue'
|
|||||||
import pagination from '@/components/common/Pagination'
|
import pagination from '@/components/common/Pagination'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { api } from '@/utils/api'
|
import { api } from '@/utils/api'
|
||||||
import Loading from '@/components/common/Loading'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
pagination,
|
pagination
|
||||||
Loading
|
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
@@ -22,11 +20,11 @@ export default {
|
|||||||
pageObj: { // 分页对象
|
pageObj: { // 分页对象
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: defaultPageSize,
|
pageSize: defaultPageSize,
|
||||||
total: null// total为0时,elment分页组件pagination,修改当前页无效。修改为null即可解决此问题
|
total: 0
|
||||||
},
|
},
|
||||||
/* 工具参数 */
|
/* 工具参数 */
|
||||||
tools: {
|
tools: {
|
||||||
// loading: true, // 是否显示table加载动画
|
loading: true, // 是否显示table加载动画
|
||||||
customTableTitle: [] // 自定义列工具的数据
|
customTableTitle: [] // 自定义列工具的数据
|
||||||
},
|
},
|
||||||
mainTableHeight: position.tableHeight.normal, // 主列表table高度
|
mainTableHeight: position.tableHeight.normal, // 主列表table高度
|
||||||
@@ -39,11 +37,8 @@ export default {
|
|||||||
tableData: [],
|
tableData: [],
|
||||||
scrollbarWrap: null,
|
scrollbarWrap: null,
|
||||||
delFlag: false,
|
delFlag: false,
|
||||||
disableEdit: true, // 编辑按钮是否不可用,当选择多条记录的时候,编辑按钮不可用
|
disableEdit:false,//编辑按钮是否不可用,当选择多条记录的时候你,编辑按钮不可用
|
||||||
disableDelete: true,
|
operationWidth: '165' // 操作列宽
|
||||||
operationWidth: '165', // 操作列宽
|
|
||||||
loading: true,
|
|
||||||
isNoData: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -78,67 +73,42 @@ export default {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
toggleLoading (loading) {
|
|
||||||
this.loading = loading
|
|
||||||
},
|
|
||||||
selectionChange (objs) {
|
selectionChange (objs) {
|
||||||
this.batchDeleteObjs = []
|
this.batchDeleteObjs = objs
|
||||||
objs.forEach(obj => {
|
if(this.batchDeleteObjs.length > 1) {
|
||||||
const delObj = this.batchDeleteObjs.find(item => item.id === obj.id)
|
|
||||||
if (delObj === undefined) {
|
|
||||||
this.batchDeleteObjs.push(obj)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (this.batchDeleteObjs.length == 1) {
|
|
||||||
this.disableEdit = false
|
|
||||||
} else {
|
|
||||||
this.disableEdit = true
|
this.disableEdit = true
|
||||||
}
|
}else {
|
||||||
if (this.batchDeleteObjs.length >= 1) {
|
this.disableEdit = false
|
||||||
this.disableDelete = false
|
|
||||||
} else {
|
|
||||||
this.disableDelete = true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getTableData (params, isAll, isClearType) {
|
getTableData (params) {
|
||||||
if (isAll) {
|
|
||||||
this.searchLabel = null
|
|
||||||
} else if (isClearType) {
|
|
||||||
// this.searchLabel.tagType = ''
|
|
||||||
this.searchLabel.type = ''// 换新接口需要修改的属性名称
|
|
||||||
}
|
|
||||||
if (params) {
|
if (params) {
|
||||||
this.searchLabel = { ...this.searchLabel, ...params }
|
this.searchLabel = { ...this.searchLabel, ...params }
|
||||||
}
|
}
|
||||||
this.searchLabel = { ...this.searchLabel, ...this.pageObj }
|
this.searchLabel = { ...this.searchLabel, ...this.pageObj }
|
||||||
//this.tableData = []
|
this.tools.loading = true
|
||||||
this.isNoData = false
|
|
||||||
this.toggleLoading(true)
|
|
||||||
delete this.searchLabel.total
|
delete this.searchLabel.total
|
||||||
let listUrl = this.url
|
let listUrl = this.url
|
||||||
if (this.listUrl) {
|
if (this.listUrl) {
|
||||||
listUrl = this.listUrl
|
listUrl = this.listUrl
|
||||||
}
|
}
|
||||||
get(listUrl, this.searchLabel).then(response => {
|
get(listUrl, this.searchLabel).then(response => {
|
||||||
|
this.tools.loading = false
|
||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
|
for (let i = 0; i < response.data.list.length; i++) {
|
||||||
|
response.data.list[i].status = response.data.list[i].status + ''
|
||||||
|
}
|
||||||
this.tableData = response.data.list
|
this.tableData = response.data.list
|
||||||
this.pageObj.total = response.data.total
|
this.pageObj.total = response.data.total
|
||||||
|
// TODO 回到顶部
|
||||||
} else {
|
} else {
|
||||||
console.error(response)
|
console.error(response)
|
||||||
this.isNoData = true
|
|
||||||
if (response.message) {
|
if (response.message) {
|
||||||
this.$message.error(response.message)
|
this.$message.error(response.message)
|
||||||
} else {
|
} else {
|
||||||
this.$message.error('Something went wrong...')
|
this.$message.error('Something went wrong...')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).finally(() => {
|
|
||||||
this.toggleLoading(false)
|
|
||||||
if (!this.tableData || this.tableData.length === 0) {
|
|
||||||
this.isNoData = true
|
|
||||||
} else {
|
|
||||||
this.isNoData = false
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
del (row) {
|
del (row) {
|
||||||
@@ -156,29 +126,27 @@ export default {
|
|||||||
this.$message.error(response.msg)
|
this.$message.error(response.msg)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}).catch(e => {})
|
})
|
||||||
},
|
|
||||||
delSelectionChange () {
|
|
||||||
},
|
},
|
||||||
delBatch () {
|
delBatch () {
|
||||||
const ids = []
|
let ids = []
|
||||||
if (this.batchDeleteObjs && this.batchDeleteObjs.length > 0) {
|
if(this.batchDeleteObjs && this.batchDeleteObjs.length > 0){
|
||||||
this.batchDeleteObjs.forEach(item => {
|
this.batchDeleteObjs.forEach(item =>{
|
||||||
ids.push(item.id)
|
ids.push(item.id)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if (ids.length === 0) {
|
if(ids.length === 0){
|
||||||
this.$alert(this.$t('tip.pleaseSelect'), {
|
this.$alert(this.$t('tip.pleaseSelect'),{
|
||||||
confirmButtonText: this.$t('tip.yes'),
|
confirmButtonText: this.$t('tip.yes'),
|
||||||
type: 'warning'
|
type:'warning'
|
||||||
}).catch(() => {})
|
})
|
||||||
} else {
|
}else {
|
||||||
this.$confirm(this.$t('tip.confirmDelete'), {
|
this.$confirm(this.$t('tip.confirmDelete'), {
|
||||||
confirmButtonText: this.$t('tip.yes'),
|
confirmButtonText: this.$t('tip.yes'),
|
||||||
cancelButtonText: this.$t('tip.no'),
|
cancelButtonText: this.$t('tip.no'),
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.toggleLoading(true)
|
this.tools.loading = true
|
||||||
axios.delete(this.url + '?ids=' + ids).then(response => {
|
axios.delete(this.url + '?ids=' + ids).then(response => {
|
||||||
if (response.data.code === 200) {
|
if (response.data.code === 200) {
|
||||||
this.delFlag = true
|
this.delFlag = true
|
||||||
@@ -188,16 +156,9 @@ export default {
|
|||||||
this.$message.error(response.data.message)
|
this.$message.error(response.data.message)
|
||||||
}
|
}
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
this.toggleLoading(false)
|
this.tools.loading = false
|
||||||
})
|
|
||||||
}).catch(() => {})
|
|
||||||
.finally(() => {
|
|
||||||
if (this.isSelectedStatus != undefined) {
|
|
||||||
this.isSelectedStatus = false
|
|
||||||
this.disableDelete = true
|
|
||||||
this.batchDeleteObjs = []
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
newObject () {
|
newObject () {
|
||||||
@@ -238,13 +199,13 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
editSelectRecord () {
|
editSelectRecord(){
|
||||||
if (this.batchDeleteObjs.length === 0) {
|
if(this.batchDeleteObjs.length === 0){
|
||||||
this.$alert(this.$t('tip.pleaseSelectForEdit'), {
|
this.$alert(this.$t('tip.pleaseSelectForEdit'),{
|
||||||
confirmButtonText: this.$t('tip.yes'),
|
confirmButtonText: this.$t('tip.yes'),
|
||||||
type: 'warning'
|
type:'warning'
|
||||||
}).catch(() => {})
|
})
|
||||||
} else {
|
}else {
|
||||||
get(`${this.url}/${this.batchDeleteObjs[0].id}`).then(response => {
|
get(`${this.url}/${this.batchDeleteObjs[0].id}`).then(response => {
|
||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
this.object = response.data
|
this.object = response.data
|
||||||
@@ -261,8 +222,14 @@ export default {
|
|||||||
if (this.$refs.dataTable.loadingTableId === u.id) { // 列表单个下载
|
if (this.$refs.dataTable.loadingTableId === u.id) { // 列表单个下载
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (u.state !== 1 || u.upload !== 1) {
|
if (localStorage.getItem(storageKey.s3Enable) == 1) {
|
||||||
return
|
if (u.state !== 1 || u.upload !== 1) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (u.state !== 1) {
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let fileName = ''
|
let fileName = ''
|
||||||
let url = ''
|
let url = ''
|
||||||
@@ -323,8 +290,14 @@ export default {
|
|||||||
if (this.$refs.dataTable.loadingPreviewId === u.id) { // 列表单个下载
|
if (this.$refs.dataTable.loadingPreviewId === u.id) { // 列表单个下载
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (u.state !== 1 || u.upload !== 1) {
|
if (localStorage.getItem(storageKey.s3Enable) == 1) {
|
||||||
return
|
if (u.state !== 1 || u.upload !== 1) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (u.state !== 1) {
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const params = {
|
const params = {
|
||||||
id: u.id
|
id: u.id
|
||||||
@@ -348,9 +321,7 @@ export default {
|
|||||||
},
|
},
|
||||||
dragend () {
|
dragend () {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
if (this.$refs.dataTable && this.$refs.dataTable.$refs.dataTable) {
|
this.$refs.dataTable.$refs.dataTable.doLayout()
|
||||||
this.$refs.dataTable.$refs.dataTable.doLayout()
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
tableDataSort (orderBy) {
|
tableDataSort (orderBy) {
|
||||||
@@ -359,8 +330,6 @@ export default {
|
|||||||
},
|
},
|
||||||
search (params) {
|
search (params) {
|
||||||
this.pageObj.pageNo = 1
|
this.pageObj.pageNo = 1
|
||||||
delete this.searchLabel.category
|
|
||||||
delete this.searchLabel.source
|
|
||||||
this.getTableData(params)
|
this.getTableData(params)
|
||||||
},
|
},
|
||||||
getTimeString () {
|
getTimeString () {
|
||||||
@@ -402,31 +371,16 @@ export default {
|
|||||||
}
|
}
|
||||||
let localStorageTableTitle = localStorage.getItem(storageKey.tableTitle + '-' + localStorage.getItem(storageKey.username) + '-' + this.tableId)
|
let localStorageTableTitle = localStorage.getItem(storageKey.tableTitle + '-' + localStorage.getItem(storageKey.username) + '-' + this.tableId)
|
||||||
localStorageTableTitle = localStorageTableTitle ? JSON.parse(localStorageTableTitle) : this.$refs.dataTable.tableTitle
|
localStorageTableTitle = localStorageTableTitle ? JSON.parse(localStorageTableTitle) : this.$refs.dataTable.tableTitle
|
||||||
// this.tools.customTableTitle = this.$refs.dataTable.tableTitle.map((item, index) => { // 修复切换中英文的问题
|
this.tools.customTableTitle = this.$refs.dataTable.tableTitle.map((item, index) => { // 修复切换中英文的问题
|
||||||
// if (localStorageTableTitle[index]) {
|
if (localStorageTableTitle[index]) {
|
||||||
// item.show = localStorageTableTitle[index].show
|
item.show = localStorageTableTitle[index].show
|
||||||
// }
|
|
||||||
// return item
|
|
||||||
// })
|
|
||||||
|
|
||||||
// 不够优美,后续修改
|
|
||||||
// 为了避免缓存里的label在切换中英文时不一致,因为在拖拽后,键值不一致了,故根据prop匹配来修改label
|
|
||||||
for (let i = 0; i < localStorageTableTitle.length; i++) {
|
|
||||||
for (let j = 0; j < this.tools.customTableTitle.length; j++) {
|
|
||||||
if (localStorageTableTitle[i].prop === this.tools.customTableTitle.prop) {
|
|
||||||
localStorageTableTitle[i].label = this.tools.customTableTitle.label
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
return item
|
||||||
this.tools.customTableTitle = localStorageTableTitle
|
})
|
||||||
if (localStorageTableTitle && (localStorageTableTitle.length > this.$refs.dataTable.tableTitle.length)) {
|
if (localStorageTableTitle && (localStorageTableTitle.length > this.$refs.dataTable.tableTitle.length)) {
|
||||||
const arr = localStorageTableTitle.splice(this.$refs.dataTable.tableTitle.length, localStorageTableTitle.length)
|
const arr = localStorageTableTitle.splice(this.$refs.dataTable.tableTitle.length, localStorageTableTitle.length)
|
||||||
this.tools.customTableTitle = this.tools.customTableTitle.concat(arr)
|
this.tools.customTableTitle = this.tools.customTableTitle.concat(arr)
|
||||||
}
|
}
|
||||||
// this.getTableData()
|
// this.getTableData()
|
||||||
},
|
|
||||||
unmounted () {
|
|
||||||
this.isNoData = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
import { chartTableOrderOptionsMapping, storageKey } from '@/utils/constants'
|
import { chartTableOrderOptionsMapping } from '@/utils/constants'
|
||||||
import { getWidthByLanguage } from '@/utils/tools'
|
|
||||||
import { put, patch } from '@/utils/http'
|
|
||||||
import { api } from '@/utils/api'
|
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
tableData: {
|
tableData: {
|
||||||
@@ -23,11 +20,6 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
customTableTitles () {
|
customTableTitles () {
|
||||||
if (this.customTableTitle) {
|
|
||||||
// 设置列宽,避免分辨率过小时,文本显示省略号
|
|
||||||
this.getTableWidth(this.customTableTitle)
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.customTableTitle.filter(item => item.show)
|
return this.customTableTitle.filter(item => item.show)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -35,107 +27,18 @@ export default {
|
|||||||
customTableTitle (n) {
|
customTableTitle (n) {
|
||||||
if (n) {
|
if (n) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
if (this.$refs.dataTable) {
|
this.$refs.dataTable.doLayout()
|
||||||
this.$refs.dataTable.doLayout()
|
|
||||||
}
|
|
||||||
}, 200)
|
}, 200)
|
||||||
}
|
}
|
||||||
},
|
|
||||||
tableData: {
|
|
||||||
handler (n) {
|
|
||||||
if (this.tableData && this.tableData.length > 0) {
|
|
||||||
// this.isInit = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
operationWidth: '165', // 操作列宽
|
operationWidth: '165', // 操作列宽
|
||||||
show: true,
|
show: true
|
||||||
isNoData: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
toggleLoading (loading) {
|
|
||||||
this.$emit('toggleLoading', loading)
|
|
||||||
},
|
|
||||||
getTableWidth (list) {
|
|
||||||
if (list && list.length > 0) {
|
|
||||||
const language = localStorage.getItem(storageKey.language)
|
|
||||||
// 文字所占宽度,一个英文字母占7px,中文16px
|
|
||||||
let num = getWidthByLanguage(language) || 7
|
|
||||||
if (language !== 'cn') {
|
|
||||||
num = num + 1 // 最后一位加空格
|
|
||||||
}
|
|
||||||
|
|
||||||
list.forEach((item, index) => {
|
|
||||||
if (item.label && item.label !== 'IP') {
|
|
||||||
let tempLength = 0
|
|
||||||
|
|
||||||
if (item.label.indexOf(' ') > -1) {
|
|
||||||
let tempArr = []
|
|
||||||
tempArr = item.label.split(' ')
|
|
||||||
tempLength = Math.max(...tempArr.map(el => el.length))
|
|
||||||
} else {
|
|
||||||
tempLength = item.label.length
|
|
||||||
}
|
|
||||||
|
|
||||||
// 宽度 = 最小不可拆分单词文字宽度 + 22的padding边距
|
|
||||||
const newWidth = (num * tempLength) + 22
|
|
||||||
|
|
||||||
// 为了避免没有minWidth这种情况
|
|
||||||
if (!item.minWidth) {
|
|
||||||
item.minWidth = newWidth
|
|
||||||
}
|
|
||||||
|
|
||||||
// 排序最后一位一般是'操作',或者是较长的字符,故不让其换行,宽度直接为字符宽度
|
|
||||||
if (index === list.length - 1) {
|
|
||||||
item.minWidth = (num * item.label.length) + 22
|
|
||||||
}
|
|
||||||
|
|
||||||
// 有排序的,额外添加24px的排序图标宽度
|
|
||||||
if (item.sortable) {
|
|
||||||
if (!item.initFlag) {
|
|
||||||
item.minWidth = item.minWidth + 32
|
|
||||||
}
|
|
||||||
// 避免customize多次点击save生成表格,导致width越来越大,保证初始化一次就确定宽度
|
|
||||||
item.initFlag = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.minWidth < newWidth) {
|
|
||||||
item.minWidth = newWidth
|
|
||||||
} else if (item.width < item.minWidth) {
|
|
||||||
item.width = item.minWidth
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
changeStatus (status, id) {
|
|
||||||
if (id) {
|
|
||||||
patch(api.knowledgeBaseEnable, { list: [{ knowledgeId: id, status: status }] }).then(response => {
|
|
||||||
if (response.code === 200) {
|
|
||||||
this.$message({ duration: 1000, type: 'success', message: this.$t('tip.saveSuccess') })
|
|
||||||
} else {
|
|
||||||
console.error(response)
|
|
||||||
if (response.message) {
|
|
||||||
this.$message.error(response.message)
|
|
||||||
} else {
|
|
||||||
this.$message.error('Something went wrong...')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.$emit('reload')
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
selectable (row, rowIndex) {
|
|
||||||
if (row.isBuiltIn === 1) {
|
|
||||||
return false
|
|
||||||
} else {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
tableOperation ([command, row]) {
|
tableOperation ([command, row]) {
|
||||||
switch (command) {
|
switch (command) {
|
||||||
default:
|
default:
|
||||||
@@ -146,9 +49,6 @@ export default {
|
|||||||
selectionChange (objs) {
|
selectionChange (objs) {
|
||||||
this.$emit('selectionChange', objs)
|
this.$emit('selectionChange', objs)
|
||||||
},
|
},
|
||||||
checkboxStatusChange (isCheck, data) {
|
|
||||||
this.$emit('checkboxStatusChange', isCheck, data)
|
|
||||||
},
|
|
||||||
dragend () {
|
dragend () {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs.dataTable.doLayout()
|
this.$refs.dataTable.doLayout()
|
||||||
|
|||||||
@@ -1,469 +0,0 @@
|
|||||||
import Mock from 'mockjs'
|
|
||||||
const urlAndVersion = BASE_CONFIG.baseUrl + BASE_CONFIG.apiVersion
|
|
||||||
const openMock = true
|
|
||||||
if (openMock) {
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/traffic/throughput.*'), 'get', function (requestObj) {
|
|
||||||
const titleList = ['totalBitsRate', 'inboundBitsRate', 'outboundBitsRate', 'internalBitsRate', 'throughBitsRate', 'other']
|
|
||||||
const arr = [{ type: 'Bits/s' }, { type: 'Packets/s' }, { type: 'Sessions/s' }]
|
|
||||||
|
|
||||||
const endTime = JSON.parse(getQuery(requestObj.url).endTime)
|
|
||||||
let step = 0
|
|
||||||
for (let i = 0; i < arr.length; i++) {
|
|
||||||
for (const j in titleList) {
|
|
||||||
let startTime = JSON.parse(getQuery(requestObj.url).startTime)
|
|
||||||
step = (endTime - startTime) / 100 // 每条数据的时间间隔
|
|
||||||
|
|
||||||
const values = []
|
|
||||||
let max = 2975
|
|
||||||
let min = 0
|
|
||||||
if (titleList[j] === 'totalBitsRate') {
|
|
||||||
max = 4462975
|
|
||||||
min = 1162975
|
|
||||||
}
|
|
||||||
for (let i = 0; i < 101; i++) {
|
|
||||||
const random = Math.floor(Math.random() * (max - min) + min)
|
|
||||||
values.push([startTime, random])
|
|
||||||
startTime += step
|
|
||||||
}
|
|
||||||
|
|
||||||
const newValues = JSON.parse(JSON.stringify(values))
|
|
||||||
const sortArr = newValues.sort((a, b) => a[1] - b[1])
|
|
||||||
const maxAnalysis = Math.floor(sortArr[sortArr.length - 1][1])
|
|
||||||
let avg = 0
|
|
||||||
let sum = 0
|
|
||||||
newValues.forEach((item) => {
|
|
||||||
sum += item[1]
|
|
||||||
})
|
|
||||||
avg = JSON.parse(sum / newValues.length)
|
|
||||||
|
|
||||||
const analysis = {
|
|
||||||
avg: avg,
|
|
||||||
max: maxAnalysis,
|
|
||||||
min: Math.floor(sortArr[0][1]),
|
|
||||||
p95: maxAnalysis * 0.95 // 模拟值,p95并未最大值的95%
|
|
||||||
}
|
|
||||||
|
|
||||||
// Metric为Packets/s时,没有other的tab选项
|
|
||||||
if (arr[i].type === 'Packets/s' && titleList[j] === 'other') {
|
|
||||||
analysis.avg = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arr[i].type === 'Sessions/s') {
|
|
||||||
// Metric为Sessions/s时,只有total选项,故total填充数据完毕终止循环,节省性能
|
|
||||||
arr[i].totalBitsRate = { values: values, analysis: analysis }
|
|
||||||
break
|
|
||||||
} else {
|
|
||||||
arr[i][titleList[j]] = { values: values, analysis: analysis }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: arr
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/event/security.*'), 'get', function (requestObj) {
|
|
||||||
const result = [
|
|
||||||
{
|
|
||||||
eventId: '1298414830886991872',
|
|
||||||
securityType: 'command and control',
|
|
||||||
domain: null,
|
|
||||||
offenderIp: '213.186.33.5',
|
|
||||||
victimIp: '116.178.217.92',
|
|
||||||
offenderDomain: 'baidu.com',
|
|
||||||
victimDomain: 'mi.com',
|
|
||||||
eventSeverity: 'critical',
|
|
||||||
malwareName: 'NetWire RC',
|
|
||||||
cryptominingPool: null,
|
|
||||||
startTime: 1683186600,
|
|
||||||
durationMs: 300000,
|
|
||||||
endTime: 1683186900
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventId: '1298414830886991873',
|
|
||||||
securityType: 'command and control',
|
|
||||||
domain: null,
|
|
||||||
offenderIp: '213.186.33.5',
|
|
||||||
victimIp: '116.178.217.93',
|
|
||||||
offenderDomain: 'baidu.com',
|
|
||||||
victimDomain: 'mi.com',
|
|
||||||
eventSeverity: 'low',
|
|
||||||
malwareName: 'NetWire RC',
|
|
||||||
cryptominingPool: null,
|
|
||||||
startTime: 1683186600,
|
|
||||||
durationMs: 300000,
|
|
||||||
endTime: 1683186900
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventId: '1298414830886991873',
|
|
||||||
securityType: 'command and control',
|
|
||||||
domain: null,
|
|
||||||
offenderIp: '213.186.33.5',
|
|
||||||
victimIp: '116.178.217.93',
|
|
||||||
offenderDomain: 'baidu.com',
|
|
||||||
victimDomain: 'mi.com',
|
|
||||||
eventSeverity: 'low',
|
|
||||||
malwareName: 'NetWire RC',
|
|
||||||
cryptominingPool: null,
|
|
||||||
startTime: 1683186600,
|
|
||||||
durationMs: 300000,
|
|
||||||
endTime: 1683186900
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventId: '1298414830886991873',
|
|
||||||
securityType: 'command and control',
|
|
||||||
domain: null,
|
|
||||||
offenderIp: '213.186.33.5',
|
|
||||||
victimIp: '116.178.217.93',
|
|
||||||
offenderDomain: 'baidu.com',
|
|
||||||
victimDomain: 'mi.com',
|
|
||||||
eventSeverity: 'low',
|
|
||||||
malwareName: 'NetWire RC',
|
|
||||||
cryptominingPool: null,
|
|
||||||
startTime: 1683186600,
|
|
||||||
durationMs: 300000,
|
|
||||||
endTime: 1683186900
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventId: '1298414830886991873',
|
|
||||||
securityType: 'command and control',
|
|
||||||
domain: null,
|
|
||||||
offenderIp: '213.186.33.5',
|
|
||||||
victimIp: '116.178.217.93',
|
|
||||||
offenderDomain: 'baidu.com',
|
|
||||||
victimDomain: 'mi.com',
|
|
||||||
eventSeverity: 'low',
|
|
||||||
malwareName: 'NetWire RC',
|
|
||||||
cryptominingPool: null,
|
|
||||||
startTime: 1683186600,
|
|
||||||
durationMs: 300000,
|
|
||||||
endTime: 1683186900
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventId: '1298414830886991873',
|
|
||||||
securityType: 'command and control',
|
|
||||||
domain: null,
|
|
||||||
offenderIp: '213.186.33.5',
|
|
||||||
victimIp: '116.178.217.93',
|
|
||||||
offenderDomain: 'baidu.com',
|
|
||||||
victimDomain: 'mi.com',
|
|
||||||
eventSeverity: 'low',
|
|
||||||
malwareName: 'NetWire RC',
|
|
||||||
cryptominingPool: null,
|
|
||||||
startTime: 1683186600,
|
|
||||||
durationMs: 300000,
|
|
||||||
endTime: 1683186900
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventId: '1298414830886991873',
|
|
||||||
securityType: 'command and control',
|
|
||||||
domain: null,
|
|
||||||
offenderIp: '213.186.33.5',
|
|
||||||
victimIp: '116.178.217.93',
|
|
||||||
offenderDomain: 'baidu.com',
|
|
||||||
victimDomain: 'mi.com',
|
|
||||||
eventSeverity: 'low',
|
|
||||||
malwareName: 'NetWire RC',
|
|
||||||
cryptominingPool: null,
|
|
||||||
startTime: 1683186600,
|
|
||||||
durationMs: 300000,
|
|
||||||
endTime: 1683186900
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/event/performance.*'), 'get', function (requestObj) {
|
|
||||||
const result = [
|
|
||||||
{
|
|
||||||
eventId: '1308078720390412288',
|
|
||||||
entityType: 'ip',
|
|
||||||
serverIp: '116.178.78.180',
|
|
||||||
domain: null,
|
|
||||||
appName: null,
|
|
||||||
eventSeverity: 'critical',
|
|
||||||
eventType: 'Http error',
|
|
||||||
startTime: 1683250500,
|
|
||||||
durationMs: 900000,
|
|
||||||
endTime: 1683251400
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventId: '1308078720390412289',
|
|
||||||
entityType: 'ip',
|
|
||||||
serverIp: '116.178.78.180',
|
|
||||||
domain: null,
|
|
||||||
appName: null,
|
|
||||||
eventSeverity: 'info',
|
|
||||||
eventType: 'Http error',
|
|
||||||
startTime: 1683250500,
|
|
||||||
durationMs: 900000,
|
|
||||||
endTime: 1683251400
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(`${BASE_CONFIG.baseUrl}${BASE_CONFIG.apiVersion}/entity/detail/basic.*`), 'get', function (requestObj) {
|
|
||||||
const result = {
|
|
||||||
asn: {
|
|
||||||
asn: 'ASN',
|
|
||||||
organization: 'AS org'
|
|
||||||
},
|
|
||||||
location: {
|
|
||||||
country: 'China',
|
|
||||||
province: 'Hebei',
|
|
||||||
city: 'Langfang',
|
|
||||||
isp: 'an ISP'
|
|
||||||
},
|
|
||||||
categories: {
|
|
||||||
categoryName: '类别1',
|
|
||||||
categoryGroup: '类别组1',
|
|
||||||
reputationLevel: '1',
|
|
||||||
appCategory: '类别1',
|
|
||||||
appSubcategory: '子类别1',
|
|
||||||
appTechnology: '技术1',
|
|
||||||
appName: '名称1',
|
|
||||||
appRisk: '风险等级1',
|
|
||||||
appLongname: '全称1',
|
|
||||||
appDescription: '这是描述'
|
|
||||||
},
|
|
||||||
whois: {
|
|
||||||
expireDate: '23-12',
|
|
||||||
registrarName: '注册商',
|
|
||||||
registrantOrg: '注册机构',
|
|
||||||
registrantCountry: 'China',
|
|
||||||
createDate: '22-12',
|
|
||||||
email: '1@2.3'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(`${BASE_CONFIG.baseUrl}${BASE_CONFIG.apiVersion}/entity/detail/kb/intelligence/tag.*`), 'get', function (requestObj) {
|
|
||||||
const result = {
|
|
||||||
malware: {
|
|
||||||
malwareName: 'malware'
|
|
||||||
},
|
|
||||||
darkweb: {
|
|
||||||
nodeType: 'nodeType'
|
|
||||||
},
|
|
||||||
psiphon3Ip: {
|
|
||||||
type: 1
|
|
||||||
},
|
|
||||||
userDefinedTags: [
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
tagValue: 'userTag1'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
tagValue: 'userTag2'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
tagValue: 'userTag3'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: result
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(`${BASE_CONFIG.baseUrl}${BASE_CONFIG.apiVersion}/entity/detail/kb/intelligence/list.*`), 'get', function (requestObj) {
|
|
||||||
const result = [
|
|
||||||
{
|
|
||||||
location: {
|
|
||||||
isp: 'dba Omsoft',
|
|
||||||
updateTime: 1685696510,
|
|
||||||
createTime: 1685696510,
|
|
||||||
isValid: 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
malware: {
|
|
||||||
threatType: 'command and control',
|
|
||||||
malwareName: 'IcedID',
|
|
||||||
malwareAlias: 'BokBot,IceID',
|
|
||||||
updateTime: 1685696510,
|
|
||||||
createTime: 1685696510,
|
|
||||||
isValid: 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
darkweb: {
|
|
||||||
nodeType: 'i2p',
|
|
||||||
updateTime: 1685696510,
|
|
||||||
createTime: 1685696510,
|
|
||||||
isValid: 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
psiphon3Ip: {
|
|
||||||
type: 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
userDefinedTag: {
|
|
||||||
id: 1,
|
|
||||||
tagValue: '门户网站',
|
|
||||||
updateTime: 1685696500,
|
|
||||||
createTime: 1685696500,
|
|
||||||
isValid: 1
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
userDefinedTag: {
|
|
||||||
id: 1,
|
|
||||||
tagValue: '用户tag',
|
|
||||||
updateTime: 1685696500,
|
|
||||||
createTime: 1685696500,
|
|
||||||
isValid: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/ip/relate/ports.*'), 'get', function (requestObj) {
|
|
||||||
const result = [
|
|
||||||
{
|
|
||||||
port: 80,
|
|
||||||
l7Protocol: 'HTTP'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
port: 443,
|
|
||||||
l7Protocol: 'HTTPS'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
port: 53,
|
|
||||||
l7Protocol: 'DNS'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/ip/relate/apps.*'), 'get', function (requestObj) {
|
|
||||||
const result = ['Wechat', 'baidu', 'Wechat', 'baidu', 'Wechat', 'baidu', 'Wechat']
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/ip/relate/domains.*'), 'get', function (requestObj) {
|
|
||||||
const result = ['-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com']
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/app/relate/ips.*'), 'get', function (requestObj) {
|
|
||||||
const result = ['116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242']
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/app/relate/domains.*'), 'get', function (requestObj) {
|
|
||||||
const result = ['-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com']
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/domain/relate/ips.*'), 'get', function (requestObj) {
|
|
||||||
const result = ['116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242', '116.178.70.242']
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/domain/relate/apps.*'), 'get', function (requestObj) {
|
|
||||||
const result = ['Wechat', 'baidu', 'Wechat', 'baidu', 'Wechat', 'baidu', 'Wechat']
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
Mock.mock(new RegExp(urlAndVersion + '/entity/detail/domain/relate/fqdns.*'), 'get', function (requestObj) {
|
|
||||||
const result = ['-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com', '-*.pangolin-sdk-toutiao.com']
|
|
||||||
|
|
||||||
return {
|
|
||||||
msg: 'success',
|
|
||||||
code: 200,
|
|
||||||
data: {
|
|
||||||
result: result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const getQuery = (url) => {
|
|
||||||
// str为?之后的参数部分字符串
|
|
||||||
const str = url.substr(url.indexOf('?') + 1)
|
|
||||||
// arr每个元素都是完整的参数键值
|
|
||||||
const arr = str.split('&')
|
|
||||||
// result为存储参数键值的集合
|
|
||||||
const result = {}
|
|
||||||
for (let i = 0; i < arr.length; i++) {
|
|
||||||
// item的两个元素分别为参数名和参数值
|
|
||||||
const item = arr[i].split('=')
|
|
||||||
result[item[0]] = item[1]
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import './npm'
|
import './npm'
|
||||||
import './linkMonitor'
|
import './linkMonitor'
|
||||||
import './dns'
|
import './dns'
|
||||||
import './entity'
|
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ if (openMock) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/bigramAnalysis.*'), 'get', function (requestObj) {
|
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/bigramAnalysis1.*'), 'get', function (requestObj) {
|
||||||
const data = []
|
const data = []
|
||||||
const ingressLinkIds = ['256', '512', '768', '1024', '1280', '1536', '1792', '2048', '2304', '2816']
|
const ingressLinkIds = ['256', '512', '768', '1024', '1280', '1536', '1792', '2048', '2304', '2816']
|
||||||
const egressLinkIds = ['257', '513', '769', '1025', '1281', '1537', '1793', '2049', '2305', '2817']
|
const egressLinkIds = ['257', '513', '769', '1025', '1281', '1537', '1793', '2049', '2305', '2817']
|
||||||
@@ -132,7 +132,7 @@ if (openMock) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/bigramNextHopAnalysis.*'), 'get', function (requestObj) {
|
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/bigramNextHopAnalysis1.*'), 'get', function (requestObj) {
|
||||||
const data = []
|
const data = []
|
||||||
const ingressLinkIds = ['西安', '太原', '西宁']
|
const ingressLinkIds = ['西安', '太原', '西宁']
|
||||||
const egressLinkIds = ['西安', '太原', '西宁']
|
const egressLinkIds = ['西安', '太原', '西宁']
|
||||||
@@ -150,7 +150,7 @@ if (openMock) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/analysis.*'), 'get', function (requestObj) {
|
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/analysis1.*'), 'get', function (requestObj) {
|
||||||
const linkData = []
|
const linkData = []
|
||||||
for (let i = 0; i < 10; i++) {
|
for (let i = 0; i < 10; i++) {
|
||||||
linkData.push({ linkId: 'Hundredgige' + (i + 1), egressBytes: Math.floor(Math.pow(1.3, i) * 1000000000), ingressBytes: Math.floor(Math.pow(1.5, i) * 1000000000) })
|
linkData.push({ linkId: 'Hundredgige' + (i + 1), egressBytes: Math.floor(Math.pow(1.3, i) * 1000000000), ingressBytes: Math.floor(Math.pow(1.5, i) * 1000000000) })
|
||||||
@@ -164,7 +164,7 @@ if (openMock) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/nextHopAnalysis.*'), 'get', function (requestObj) {
|
Mock.mock(new RegExp(BASE_CONFIG.baseUrl + 'interface/linkMonitor/nextHopAnalysis1.*'), 'get', function (requestObj) {
|
||||||
const linkData = [
|
const linkData = [
|
||||||
{ linkDirection: '西安', egressBytes: 1024000000000, ingressBytes: 1224000000000 },
|
{ linkDirection: '西安', egressBytes: 1024000000000, ingressBytes: 1224000000000 },
|
||||||
{ linkDirection: '太原', egressBytes: 102400000000, ingressBytes: 142400000000 },
|
{ linkDirection: '太原', egressBytes: 102400000000, ingressBytes: 142400000000 },
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { storageKey } from '@/utils/constants'
|
|||||||
import { loadI18n } from '@/i18n'
|
import { loadI18n } from '@/i18n'
|
||||||
|
|
||||||
const loginWhiteList = ['/login', '/'] // 免登陆白名单
|
const loginWhiteList = ['/login', '/'] // 免登陆白名单
|
||||||
const permissionWhiteList = [...loginWhiteList] // 权限白名单
|
const permissionWhiteList = [...loginWhiteList, '/entityDetail'] // 权限白名单
|
||||||
|
|
||||||
router.beforeEach(async (to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
if (to.path.indexOf('/login') == -1) {
|
if (to.path.indexOf('/login') == -1) {
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ const routes = [
|
|||||||
path: '/login',
|
path: '/login',
|
||||||
component: () => import('@/Login')
|
component: () => import('@/Login')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/entityDetail',
|
||||||
|
component: () => import('@/views/entityExplorer/EntityDetail')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
component: () => import('@/components/layout/Home'),
|
component: () => import('@/components/layout/Home'),
|
||||||
@@ -23,14 +27,6 @@ const routes = [
|
|||||||
path: '/entityExplorer',
|
path: '/entityExplorer',
|
||||||
component: () => import('@/views/entityExplorer/EntityExplorer')
|
component: () => import('@/views/entityExplorer/EntityExplorer')
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: '/entityDetail',
|
|
||||||
component: () => import('@/views/entityExplorer/EntityDetail')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/entityGraph',
|
|
||||||
component: () => import('@/views/entityExplorer/EntityGraph')
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: '/detection',
|
path: '/detection',
|
||||||
redirect: '/detection/securityEvent'
|
redirect: '/detection/securityEvent'
|
||||||
@@ -48,11 +44,7 @@ const routes = [
|
|||||||
component: () => import('@/views/setting/KnowledgeBase')
|
component: () => import('@/views/setting/KnowledgeBase')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/knowledgeBase/create',
|
path: '/knowledgeBase/form',
|
||||||
component: () => import('@/views/setting/KnowledgeBaseForm')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: '/knowledgeBase/edit',
|
|
||||||
component: () => import('@/views/setting/KnowledgeBaseForm')
|
component: () => import('@/views/setting/KnowledgeBaseForm')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -75,11 +67,6 @@ const routes = [
|
|||||||
name: 'OperationLog',
|
name: 'OperationLog',
|
||||||
path: '/administration/operationLog',
|
path: '/administration/operationLog',
|
||||||
component: () => import('@/views/administration/OperationLog')
|
component: () => import('@/views/administration/OperationLog')
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Appearance',
|
|
||||||
path: '/administration/appearance',
|
|
||||||
component: () => import('@/views/administration/Appearance')
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { createStore } from 'vuex'
|
import { createStore } from 'vuex'
|
||||||
import user from './modules/user'
|
import user from './modules/user'
|
||||||
import panel from './modules/panel'
|
import panel from './modules/panel'
|
||||||
|
import { storageKey } from '@/utils/constants'
|
||||||
|
|
||||||
const store = createStore({
|
const store = createStore({
|
||||||
modules: {
|
modules: {
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import { get, post } from '@/utils/http'
|
|||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { sortByOrderNum } from '@/permission'
|
import { sortByOrderNum } from '@/permission'
|
||||||
import { storageKey } from '@/utils/constants'
|
import { storageKey } from '@/utils/constants'
|
||||||
const apiVersion = BASE_CONFIG.apiVersion
|
|
||||||
|
|
||||||
export const api = {
|
export const api = {
|
||||||
// 系统相关
|
// 系统相关
|
||||||
@@ -21,7 +20,6 @@ export const api = {
|
|||||||
login: '/sys/login',
|
login: '/sys/login',
|
||||||
// user
|
// user
|
||||||
user: '/sys/user',
|
user: '/sys/user',
|
||||||
timezone: '/sys/timezones',
|
|
||||||
// 获取配置
|
// 获取配置
|
||||||
config: '/sys/config',
|
config: '/sys/config',
|
||||||
// role
|
// role
|
||||||
@@ -36,10 +34,7 @@ export const api = {
|
|||||||
// galaxyProxy
|
// galaxyProxy
|
||||||
galaxyProxy: '/galaxy/setting',
|
galaxyProxy: '/galaxy/setting',
|
||||||
// 知识库
|
// 知识库
|
||||||
knowledgeBase: BASE_CONFIG.apiVersion + '/knowledgeBase',
|
knowledgeBase: '/knowledge',
|
||||||
knowledgeBaseList: BASE_CONFIG.apiVersion + '/knowledgeBase/list',
|
|
||||||
knowledgeBaseEnable: BASE_CONFIG.apiVersion + '/knowledgeBase/status',
|
|
||||||
knowledgeBaseStatistics: BASE_CONFIG.apiVersion + '/knowledgeBase/statistics',
|
|
||||||
|
|
||||||
// 报告相关
|
// 报告相关
|
||||||
reportJob: '/report/job',
|
reportJob: '/report/job',
|
||||||
@@ -222,8 +217,13 @@ export const api = {
|
|||||||
bigramNextHopAnalysis: '/interface/link/overview/bigramNextHopAnalysis',
|
bigramNextHopAnalysis: '/interface/link/overview/bigramNextHopAnalysis',
|
||||||
analysis: '/interface/link/overview/analysis',
|
analysis: '/interface/link/overview/analysis',
|
||||||
nextHopAnalysis: '/interface/link/overview/nextHopAnalysis',
|
nextHopAnalysis: '/interface/link/overview/nextHopAnalysis',
|
||||||
|
// todo 以下几个接口因接口返回数据为空,故造模拟接口平替
|
||||||
|
bigramAnalysis1: 'interface/linkMonitor/bigramAnalysis1',
|
||||||
|
bigramNextHopAnalysis1: '/interface/linkMonitor/bigramNextHopAnalysis1',
|
||||||
drilldownQuadrupleIngressAnalysis: '/interface/link/overview/drilldown/quadrupleIngressAnalysis',
|
drilldownQuadrupleIngressAnalysis: '/interface/link/overview/drilldown/quadrupleIngressAnalysis',
|
||||||
drilldownQquadrupleEgressAnalysis: '/interface/link/overview/drilldown/quadrupleEgressAnalysis'
|
drilldownQquadrupleEgressAnalysis: '/interface/link/overview/drilldown/quadrupleEgressAnalysis',
|
||||||
|
analysis1: '/interface/linkMonitor/analysis1',
|
||||||
|
nextHopAnalysis1: '/interface/linkMonitor/nextHopAnalysis1'
|
||||||
},
|
},
|
||||||
dnsInsight: {
|
dnsInsight: {
|
||||||
recentEvents: '/interface/dnsInsight/recentEvents',
|
recentEvents: '/interface/dnsInsight/recentEvents',
|
||||||
@@ -231,28 +231,6 @@ export const api = {
|
|||||||
totalTrafficAnalysis: '/interface/dns/overview/totalTrafficAnalysis',
|
totalTrafficAnalysis: '/interface/dns/overview/totalTrafficAnalysis',
|
||||||
eventChart: '/interface/dnsInsight/eventChart',
|
eventChart: '/interface/dnsInsight/eventChart',
|
||||||
drilldownTrafficAnalysis: '/interface/dns/overview/drilldown/trafficAnalysis'
|
drilldownTrafficAnalysis: '/interface/dns/overview/drilldown/trafficAnalysis'
|
||||||
},
|
|
||||||
entity: {
|
|
||||||
throughput: apiVersion + '/entity/detail/traffic/throughput',
|
|
||||||
security: apiVersion + '/entity/detail/event/security',
|
|
||||||
performance: apiVersion + '/entity/detail/event/performance',
|
|
||||||
// 域名解析:ip相关app、domain
|
|
||||||
domainNameResolutionAboutAppsOfIp: apiVersion + '/entity/detail/ip/relate/apps',
|
|
||||||
domainNameResolutionAboutDomainsOfIp: apiVersion + '/entity/detail/ip/relate/domains',
|
|
||||||
// 域名解析:app相关ip、domain
|
|
||||||
domainNameResolutionAboutIpsOfApp: apiVersion + '/entity/detail/app/relate/ips',
|
|
||||||
domainNameResolutionAboutDomainsOfApp: apiVersion + '/entity/detail/app/relate/domains',
|
|
||||||
// 域名解析:domain相关ip、app、fqdn
|
|
||||||
domainNameResolutionAboutAppsOfDomain: apiVersion + '/entity/detail/domain/relate/apps',
|
|
||||||
domainNameResolutionAboutIpsOfDomain: apiVersion + '/entity/detail/domain/relate/ips',
|
|
||||||
domainNameResolutionAboutFQDNsOfDomain: apiVersion + '/entity/detail/domain/relate/fqdns',
|
|
||||||
// 开放端口:ip、domain、app相关
|
|
||||||
openPortOfIp: apiVersion + '/entity/detail/ip/relate/ports',
|
|
||||||
openPortOfDomain: apiVersion + '/entity/detail/domain/relate/ports',
|
|
||||||
openPortOfApp: apiVersion + '/entity/detail/app/relate/ports',
|
|
||||||
basicInfo: apiVersion + '/entity/detail/basic',
|
|
||||||
tags: apiVersion + '/entity/detail/kb/intelligence/tag',
|
|
||||||
informationAggregation: apiVersion + '/entity/detail/kb/intelligence/list'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -41,13 +41,9 @@ export function getNowTime (interval) {
|
|||||||
export function rTime (date) {
|
export function rTime (date) {
|
||||||
return window.$dayJs.tz(new Date(date)).format('MM-DD HH:mm')
|
return window.$dayJs.tz(new Date(date)).format('MM-DD HH:mm')
|
||||||
}
|
}
|
||||||
// 日期转换为时间戳
|
|
||||||
export function toTime (date) {
|
|
||||||
return new Date(date).getTime()
|
|
||||||
}
|
|
||||||
// 时间格式转换
|
// 时间格式转换
|
||||||
export function dateFormat (date, format = 'YYYY-MM-DD HH:mm:ss') {
|
export function dateFormat (date, format = 'YYYY-MM-DD HH:mm:ss') {
|
||||||
let d
|
let d = date
|
||||||
// date不是数字,则视为utc时区的时间字符串,例如2022-02-22 22:22
|
// date不是数字,则视为utc时区的时间字符串,例如2022-02-22 22:22
|
||||||
if (isNaN(date)) {
|
if (isNaN(date)) {
|
||||||
d = window.$dayJs(date).valueOf() + parseInt(localStorage.getItem(storageKey.timezoneLocalOffset)) * 3600000
|
d = window.$dayJs(date).valueOf() + parseInt(localStorage.getItem(storageKey.timezoneLocalOffset)) * 3600000
|
||||||
@@ -93,47 +89,6 @@ export function timestampToList (time) {
|
|||||||
const m = date.getMinutes()
|
const m = date.getMinutes()
|
||||||
const s = date.getSeconds()
|
const s = date.getSeconds()
|
||||||
|
|
||||||
return [Y, M, D, H, m, s]
|
const arr = [Y, M, D, H, m, s]
|
||||||
}
|
return arr
|
||||||
/**
|
|
||||||
* 返回浏览器本地时区和服务器时区的毫秒差
|
|
||||||
* @returns {number}
|
|
||||||
*/
|
|
||||||
export function millTimestampDiffFromTz () {
|
|
||||||
return parseInt(localStorage.getItem(storageKey.timezoneLocalOffset)) * 3600 * 1000 - window.$dayJs.tz().utcOffset() * 60 * 1000
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* echarts时间类型横坐标formatter
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
|
||||||
export function xAxisTimeFormatter (value) {
|
|
||||||
const date = new Date(value - millTimestampDiffFromTz())
|
|
||||||
const dayStart = new Date(value - millTimestampDiffFromTz())
|
|
||||||
dayStart.setHours(0)
|
|
||||||
dayStart.setMinutes(0)
|
|
||||||
dayStart.setSeconds(0)
|
|
||||||
dayStart.setMilliseconds(0)
|
|
||||||
const hourStart = new Date(value - millTimestampDiffFromTz())
|
|
||||||
hourStart.setMinutes(0)
|
|
||||||
hourStart.setSeconds(0)
|
|
||||||
hourStart.setMilliseconds(0)
|
|
||||||
const HHmm = (date.getHours() < 10 ? `0${date.getHours()}` : date.getHours()) +
|
|
||||||
':' +
|
|
||||||
(date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes())
|
|
||||||
// 如果是一天的开始
|
|
||||||
if (date.getTime() === dayStart.getTime()) {
|
|
||||||
return '{day|' + dayStart.getDate() + '}'
|
|
||||||
} else if (date.getTime() === hourStart.getTime()) {
|
|
||||||
return '{hour|' + HHmm + '}'
|
|
||||||
} else {
|
|
||||||
return HHmm
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export const xAxisTimeRich = {
|
|
||||||
day: {
|
|
||||||
fontWeight: 'bold'
|
|
||||||
},
|
|
||||||
hour: {
|
|
||||||
fontWeight: 'bold'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,21 +142,6 @@ export function put (url, params, headers) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function patch (url, params, headers) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
axios.patch(url, params, { headers: headers }).then(response => {
|
|
||||||
resolve(response.data, response)
|
|
||||||
}).catch(err => {
|
|
||||||
if (err.response) {
|
|
||||||
resolve(err.response.data)
|
|
||||||
console.error(err)
|
|
||||||
} else if (err.message) {
|
|
||||||
resolve(err.message)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export function del (url, params) {
|
export function del (url, params) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
axios.delete(url, params).then(response => {
|
axios.delete(url, params).then(response => {
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
// 正则表达式
|
|
||||||
const regular = {
|
|
||||||
ipv4CIDR: /^(?:(?:[0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\/([1-9]|[1-2]\d|3[0-2])$/,
|
|
||||||
ipv4CIDRMask: /^(?:(?:[0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\/([0-9]|[1-2]\d|3[0-2])$/, // 掩码可以为0
|
|
||||||
|
|
||||||
// ipv6CIDR并可以配置任意范围 如ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0和::/0
|
|
||||||
ipv6CIDRA: /^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\/([0-9]|[1-9]\d|1[01]\d|12[0-8])$/,
|
|
||||||
ipv6CIDRB: /^((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\/([0-9]|[1-9]\d|1[01]\d|12[0-8])$/,
|
|
||||||
ipv6CIDRC: /^(([\d|a-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|::([\d|a−fA−F]1,4:)0,4((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\d|a-fA-F]{1,4}:):([\d|a-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|([\d|a−fA−F]1,4:)2:([\d|a−fA−F]1,4:)0,2((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\d|a-fA-F]{1,4}:){3}:([\d|a-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|([\d|a−fA−F]1,4:)4:((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\d|a-fA-F]{1,4}:){7}[\d|a-fA-F]{1,4}|:((:[\d|a−fA−F]1,4)1,6|:)|^[\d|a-fA-F]{1,4}:((:[\d|a-fA-F]{1,4}){1,5}|:)|([\d|a−fA−F]1,4:)2((:[\d|a−fA−F]1,4)1,4|:)|^([\d|a-fA-F]{1,4}:){3}((:[\d|a-fA-F]{1,4}){1,3}|:)|([\d|a−fA−F]1,4:)4((:[\d|a−fA−F]1,4)1,2|:)|^([\d|a-fA-F]{1,4}:){5}:([\d|a-fA-F]{1,4})?|([\d|a−fA−F]1,4:)6:)\/([0-9]|[1-9]\d|1[01]\d|120-8])/,
|
|
||||||
|
|
||||||
ipv6CIDR: /^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*\/([1-9]{1}|[1-9]{1}[0-9]{1}|1[01][0-9]{1}|12[0-8]|128)$/,
|
|
||||||
ipv6Range: /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/,
|
|
||||||
ipv4Range: /^(\d{1}|[1-9]{1}\d{1}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]{1}\d{1}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]{1}\d{1}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1}|[1-9]{1}\d{1}|1\d\d|2[0-4]\d|25[0-5])$/,
|
|
||||||
ipv4: /^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$/,
|
|
||||||
ipv6: /^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$|^:((:[\da-fA-F]{1,4}){1,6}|:)$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?$|^([\da-fA-F]{1,4}:){6}:$/,
|
|
||||||
// ipv4/ipv6
|
|
||||||
ip: /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$|^:((:[\da-fA-F]{1,4}){1,6}|:)$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?$|^([\da-fA-F]{1,4}:){6}:$/,
|
|
||||||
port: /^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/,
|
|
||||||
ipv6Serialize: function (ipv6) {
|
|
||||||
let splited = ipv6.split(':')
|
|
||||||
if (splited.length < 8) {
|
|
||||||
// 将""替换成对应数量的"0000"
|
|
||||||
const index = splited.indexOf('')
|
|
||||||
const temp = splited.slice(index + 1, splited.length)
|
|
||||||
const zero = []
|
|
||||||
for (let i = 0; i < (8 - splited.length + 1); i++) {
|
|
||||||
// 8-去掉""之后的长度,得到需要补齐的元素数量
|
|
||||||
zero.push('0000')
|
|
||||||
}
|
|
||||||
return splited = splited.slice(0, index).concat(zero).concat(temp)// 空间复杂度比较大了,
|
|
||||||
} else {
|
|
||||||
return ipv6
|
|
||||||
}
|
|
||||||
},
|
|
||||||
trans: function (ip) {
|
|
||||||
if (this.ipv6Serialize(ip) instanceof Array) {
|
|
||||||
const arr1 = this.ipv6Serialize(ip)
|
|
||||||
// 找到数组最后一项,然后转化为16进制的
|
|
||||||
const num = arr1[arr1.length - 1]
|
|
||||||
return parseInt((num), 16)
|
|
||||||
} else {
|
|
||||||
const arr1 = this.ipv6Serialize(ip).toUpperCase().split(':')
|
|
||||||
// 找到数组最后一项,然后转化为16进制的
|
|
||||||
const num = arr1[arr1.length - 1]
|
|
||||||
return parseInt((num), 16)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ipv6Reg: function (start, end) {
|
|
||||||
return this.trans(start) <= this.trans(end)
|
|
||||||
},
|
|
||||||
|
|
||||||
// ipv4对比大小 结束ip不能小于开始ip
|
|
||||||
// 比较两个ip的大小,如果大于,返回1,等于返回0,小于返回-1
|
|
||||||
compareIP4: function (ip) {
|
|
||||||
let e = ip; const t = /^[0-9]([0-9\.]+\d)?$/
|
|
||||||
let c
|
|
||||||
let num
|
|
||||||
e ? true ? (e = e.split('.'), e.length !== 4 ? (msgError('IP格式错误'), void 0) : (num = 256 * 256 * 256 * Number(e[0]) + 256 * 256 * Number(e[1]) + 256 * Number(e[2]) + Number(e[3]), num >>>= 0, c = num, void 0)) : (msgError('IP格式错误'), void 0) : (msgError('请输入IP'), void 0)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export {
|
|
||||||
regular
|
|
||||||
}
|
|
||||||
@@ -1,460 +0,0 @@
|
|||||||
/**
|
|
||||||
* @name: 静态数据模板
|
|
||||||
* @description: 用于存放引用到的静态数据,如表格列名称、echarts的legend名称等
|
|
||||||
* 如有使用 this 的,js文件里不识别 this,需要引入对应方法,如this.$t引入i18n,this.$route 引入route
|
|
||||||
* @author: newhome
|
|
||||||
* @date: 2023-03-16 17:26:49
|
|
||||||
*/
|
|
||||||
// 如有使用this的
|
|
||||||
import i18n from '@/i18n'
|
|
||||||
import { unitTypes } from '@/utils/constants'
|
|
||||||
const _this = i18n.global
|
|
||||||
_this.$t = _this.t
|
|
||||||
|
|
||||||
// NpmTrafficLine折线图数据
|
|
||||||
export const dataForNpmTrafficLine = {
|
|
||||||
tabs: [
|
|
||||||
{
|
|
||||||
name: _this.$t('network.total'),
|
|
||||||
show: true,
|
|
||||||
positioning: 0,
|
|
||||||
data: [],
|
|
||||||
unitType: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: _this.$t('network.inbound'),
|
|
||||||
show: true,
|
|
||||||
positioning: 1,
|
|
||||||
data: [],
|
|
||||||
unitType: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: _this.$t('network.outbound'),
|
|
||||||
show: true,
|
|
||||||
positioning: 2,
|
|
||||||
data: [],
|
|
||||||
unitType: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: _this.$t('network.internal'),
|
|
||||||
show: true,
|
|
||||||
positioning: 3,
|
|
||||||
data: [],
|
|
||||||
unitType: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: _this.$t('network.through'),
|
|
||||||
show: true,
|
|
||||||
positioning: 4,
|
|
||||||
data: [],
|
|
||||||
unitType: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: _this.$t('network.other'),
|
|
||||||
show: true,
|
|
||||||
positioning: 5,
|
|
||||||
data: [],
|
|
||||||
unitType: 'number'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
npmQuantity: [
|
|
||||||
{ name: _this.$t('networkAppPerformance.tcpConnectionEstablishLatency'), show: true, positioning: 0, data: [], unitType: unitTypes.time, index: 0 },
|
|
||||||
{ name: _this.$t('networkAppPerformance.httpResponse'), show: true, positioning: 0, data: [], unitType: unitTypes.time, index: 1 },
|
|
||||||
{ name: _this.$t('networkAppPerformance.sslResponseLatency'), show: true, positioning: 0, data: [], unitType: unitTypes.time, index: 2 },
|
|
||||||
{ name: _this.$t('networkAppPerformance.packetLoss'), show: true, positioning: 0, data: [], unitType: unitTypes.percent, index: 3 },
|
|
||||||
{ name: _this.$t('overall.packetRetrans'), show: true, positioning: 0, data: [], unitType: unitTypes.percent, index: 4 }
|
|
||||||
],
|
|
||||||
metricOptions: [
|
|
||||||
{ value: 'Bits/s', label: 'Bits/s' },
|
|
||||||
{ value: 'Packets/s', label: 'Packets/s' },
|
|
||||||
{ value: 'Sessions/s', label: 'Sessions/s' },
|
|
||||||
{ value: 'establishLatencyMs', label: _this.$t('networkAppPerformance.tcpConnectionEstablishLatency') },
|
|
||||||
{ value: 'httpResponseLatency', label: _this.$t('networkAppPerformance.httpResponse') },
|
|
||||||
{ value: 'sslConLatency', label: _this.$t('networkAppPerformance.sslResponseLatency') },
|
|
||||||
{ value: 'tcpLostlenPercent', label: _this.$t('networkAppPerformance.packetLoss') },
|
|
||||||
{ value: 'pktRetransPercent', label: _this.$t('overall.packetRetrans') }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const dataForNetworkOverviewLine = {
|
|
||||||
options2: [
|
|
||||||
{
|
|
||||||
value: 'Average',
|
|
||||||
label: 'Average'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: '95th Percentile',
|
|
||||||
label: '95th Percentile'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'Maximum',
|
|
||||||
label: 'Maximum'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
tabsTemplate: [
|
|
||||||
{
|
|
||||||
analysis: {},
|
|
||||||
name: 'network.total',
|
|
||||||
class: 'total',
|
|
||||||
show: true,
|
|
||||||
invertTab: true,
|
|
||||||
positioning: 0,
|
|
||||||
data: [],
|
|
||||||
unitType: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
analysis: {},
|
|
||||||
name: 'network.inbound',
|
|
||||||
class: 'inbound',
|
|
||||||
show: true,
|
|
||||||
invertTab: true,
|
|
||||||
positioning: 1,
|
|
||||||
data: [],
|
|
||||||
unitType: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
analysis: {},
|
|
||||||
name: 'network.outbound',
|
|
||||||
class: 'outbound',
|
|
||||||
show: true,
|
|
||||||
invertTab: true,
|
|
||||||
positioning: 2,
|
|
||||||
data: [],
|
|
||||||
unitType: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
analysis: {},
|
|
||||||
name: 'network.internal',
|
|
||||||
class: 'internal',
|
|
||||||
show: true,
|
|
||||||
invertTab: true,
|
|
||||||
positioning: 3,
|
|
||||||
data: [],
|
|
||||||
unitType: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
analysis: {},
|
|
||||||
name: 'network.through',
|
|
||||||
class: 'through',
|
|
||||||
show: true,
|
|
||||||
invertTab: true,
|
|
||||||
positioning: 4,
|
|
||||||
data: [],
|
|
||||||
unitType: ''
|
|
||||||
},
|
|
||||||
{
|
|
||||||
analysis: {},
|
|
||||||
name: 'network.other',
|
|
||||||
class: 'other',
|
|
||||||
show: true,
|
|
||||||
invertTab: true,
|
|
||||||
positioning: 5,
|
|
||||||
data: [],
|
|
||||||
unitType: ''
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const dataForLinkTrafficLine = {
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
value: 'Bits/s',
|
|
||||||
label: 'Bits/s'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'Packets/s',
|
|
||||||
label: 'Packets/s'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
tabs: [
|
|
||||||
{ analysis: {}, name: 'network.total', class: 'total', show: true, invertTab: true, positioning: 0, data: [], unitType: '' },
|
|
||||||
{ analysis: {}, name: 'linkMonitor.ingress', class: 'ingress', show: true, invertTab: true, positioning: 1, data: [], unitType: '' },
|
|
||||||
{ analysis: {}, name: 'linkMonitor.egress', class: 'egress', show: true, invertTab: true, positioning: 2, data: [], unitType: '' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const dataForNpmLine = {
|
|
||||||
chartOptionLineData: [
|
|
||||||
{ legend: _this.$t('network.total'), index: 0, invertTab: true, show: false, color: '#749F4D' },
|
|
||||||
{ legend: _this.$t('network.inbound'), index: 1, invertTab: true, show: false, color: '#98709B' },
|
|
||||||
{ legend: _this.$t('network.outbound'), index: 2, invertTab: true, show: false, color: '#E5A219' }
|
|
||||||
],
|
|
||||||
npmLineColor: [
|
|
||||||
{ legend: '', color: '#749F4D' },
|
|
||||||
{ legend: '', color: '#98709B' },
|
|
||||||
{ legend: '', color: '#E5A219' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const dataForDnsTrafficLine = {
|
|
||||||
options1: [
|
|
||||||
{
|
|
||||||
value: 'Bits/s',
|
|
||||||
label: 'Bits/s'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'Queries/s',
|
|
||||||
label: 'Queries/s'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
options2: [
|
|
||||||
{
|
|
||||||
value: 'Average',
|
|
||||||
label: 'Average'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: '95th Percentile',
|
|
||||||
label: '95th Percentile'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'Maximum',
|
|
||||||
label: 'Maximum'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
tabs: [
|
|
||||||
{ analysis: {}, name: 'network.total', class: 'total', show: true, invertTab: true, positioning: 0, data: [], unitType: '' },
|
|
||||||
{ analysis: {}, name: 'network.inbound', class: 'inbound', show: true, invertTab: true, positioning: 1, data: [], unitType: '' },
|
|
||||||
{ analysis: {}, name: 'network.outbound', class: 'outbound', show: true, invertTab: true, positioning: 2, data: [], unitType: '' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const dataForNpmEventsHeader = {
|
|
||||||
chartData: [
|
|
||||||
{
|
|
||||||
eventSeverity: 'critical',
|
|
||||||
count: '-',
|
|
||||||
index: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventSeverity: 'high',
|
|
||||||
count: '-',
|
|
||||||
index: 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventSeverity: 'medium',
|
|
||||||
count: '-',
|
|
||||||
index: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventSeverity: 'low',
|
|
||||||
count: '-',
|
|
||||||
index: 3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
eventSeverity: 'info',
|
|
||||||
count: '-',
|
|
||||||
index: 4
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
export const dataForNpmRecentEvents = {
|
|
||||||
customTableTitles: [
|
|
||||||
{ label: 'network.severity', prop: 'eventSeverity' },
|
|
||||||
{ label: 'network.entity', prop: 'eventKey' },
|
|
||||||
{ label: 'detections.eventType', prop: 'eventType' }
|
|
||||||
],
|
|
||||||
// 下钻后
|
|
||||||
customTableTitles1: [
|
|
||||||
{ label: 'network.severity', prop: 'eventSeverity' },
|
|
||||||
{ label: 'detections.eventType', prop: 'eventType' },
|
|
||||||
{ label: 'detection.list.startTime', prop: 'startTime' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
export const dataForNpmNetworkQuantity = {
|
|
||||||
npmNetworkName: [
|
|
||||||
{ name: 'networkAppPerformance.tcpConnectionEstablishLatency' },
|
|
||||||
{ name: 'networkAppPerformance.httpResponse' },
|
|
||||||
{ name: 'networkAppPerformance.sslResponseLatency' },
|
|
||||||
{ name: 'networkAppPerformance.packetLoss' },
|
|
||||||
{ name: 'overall.packetRetrans' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
export const columnList = [
|
|
||||||
{
|
|
||||||
name: 'entity_type',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Entity type'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ip_addr',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.Address'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ip_location_country',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.Country'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ip_location_province',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.Province'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ip_location_city',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.City'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'ip_asn',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.ASN'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'dns_server_role',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.DNS server role'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'dns_server_org',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.DNS server organization'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'dns_server_os',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.Operating system'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'dns_server_software',
|
|
||||||
type: 'string',
|
|
||||||
label: 'IP.DNS server software'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_name',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_category',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Category'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_category_group',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Category group'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_reputation_level',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Reputation'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_email',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois email'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_name_servers',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois nameserver'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_registrar',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois registrar'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_org',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois organization'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_address',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois address'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_city',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois city'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_state',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois state'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_whois_country',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.Whois country'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_icp_owner',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.ICP owner'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_icp_company_name',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.ICP company'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_icp_company_type',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.ICP company type'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_icp_site_license',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.ICP site license'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'domain_icp_site_name',
|
|
||||||
type: 'string',
|
|
||||||
label: 'Domain.ICP site'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_name',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.Name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_id',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.ID'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_category',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.Category'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_subcategory',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.Subcategory'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_risk',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.Risk'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_description',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.Description'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_longname',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.Long name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'app_technology',
|
|
||||||
type: 'string',
|
|
||||||
label: 'APP.Technology'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
export const operatorList = ['=', '!=', /* '>', '<', '>=', '<=', */'IN', 'NOT IN', 'LIKE', 'NOT LIKE']
|
|
||||||
export const connectionList = [
|
|
||||||
{
|
|
||||||
value: 'AND',
|
|
||||||
label: 'AND'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'OR',
|
|
||||||
label: 'OR'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -878,9 +878,9 @@ export async function getDnsMapData (type) {
|
|||||||
}
|
}
|
||||||
export function handleSpecialValue (value) {
|
export function handleSpecialValue (value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
value = value.replace(/\'/g, "\\'\\'") // Xi'an -> Xi''an
|
value = value.replace(/\'/g, "\\\\'")
|
||||||
.replace(/\"/g, '\\"') // ISP中可能有带双引号的数据
|
.replace(/\"/g, '\\"')
|
||||||
.replace(/\&/g, '%26') // ISP中可能有带&的数据
|
.replace(/\&/g, '%26')
|
||||||
}
|
}
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
@@ -1163,136 +1163,3 @@ export function getLineIndexUnit2 (type) {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
通过lineRefer切换来选择markLine对应的值
|
|
||||||
*/
|
|
||||||
export function getMarkLineByLineRefer (data) {
|
|
||||||
switch (data) {
|
|
||||||
case 'Average': {
|
|
||||||
return 'avg'
|
|
||||||
}
|
|
||||||
case '95th Percentile': {
|
|
||||||
return 'p95'
|
|
||||||
}
|
|
||||||
case 'Maximum': {
|
|
||||||
return 'max'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
通过 type 判断参数q的值
|
|
||||||
*/
|
|
||||||
export function getQueryByType (type, condition) {
|
|
||||||
switch (type) {
|
|
||||||
case 'clientIp':
|
|
||||||
case 'serverIp': {
|
|
||||||
return `ip='${condition.split(/'(.*?)'/)[1]}'`
|
|
||||||
}
|
|
||||||
case 'clientCity': {
|
|
||||||
return `client_city='${condition.split(/'(.*?)'/)[1]}'`
|
|
||||||
}
|
|
||||||
case 'serverCity': {
|
|
||||||
return `server_city='${condition.split(/'(.*?)'/)[1]}'`
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
return condition
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
根据EventSeverity获取对应的键值index
|
|
||||||
*/
|
|
||||||
export function getIndexByEventSeverity (type) {
|
|
||||||
switch (type) {
|
|
||||||
case 'critical': {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
case 'high': {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
case 'medium': {
|
|
||||||
return 2
|
|
||||||
}
|
|
||||||
case 'low': {
|
|
||||||
return 3
|
|
||||||
}
|
|
||||||
case 'info': {
|
|
||||||
return 4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getQueryByFlag2 (type, condition) {
|
|
||||||
switch (type) {
|
|
||||||
case 'country':
|
|
||||||
case 'asn':
|
|
||||||
case 'province':
|
|
||||||
case 'city':
|
|
||||||
case 'isp': {
|
|
||||||
return `${type}='${condition[1]}'`
|
|
||||||
}
|
|
||||||
case 'idcRenter': {
|
|
||||||
return `idc_renter='${condition[1]}'`
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
return `${condition[0]}'${condition[1]}'`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
根据语言环境获取字符所占像素px
|
|
||||||
*/
|
|
||||||
export function getWidthByLanguage (language) {
|
|
||||||
switch (language) {
|
|
||||||
case 'en': {
|
|
||||||
return 7
|
|
||||||
}
|
|
||||||
case 'cn': {
|
|
||||||
return 16
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function selectElementText (el) {
|
|
||||||
const range = document.createRange() // create new range object
|
|
||||||
range.selectNodeContents(el) // set range to encompass desired element text
|
|
||||||
const selection = window.getSelection() // get Selection object from currently user selected text
|
|
||||||
selection.removeAllRanges() // unselect any user selected text (if any)
|
|
||||||
selection.addRange(range) // add range to Selection object to select it
|
|
||||||
}
|
|
||||||
|
|
||||||
export function copySelectionText () {
|
|
||||||
let copySuccess // var to check whether execCommand successfully executed
|
|
||||||
try {
|
|
||||||
copySuccess = document.execCommand('copy') // run command to copy selected text to clipboard
|
|
||||||
} catch (e) {
|
|
||||||
copySuccess = false
|
|
||||||
}
|
|
||||||
return copySuccess
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 字符串首字母转大写
|
|
||||||
* @param str
|
|
||||||
* @returns {*}
|
|
||||||
*/
|
|
||||||
export function toUpperCaseByString (str) {
|
|
||||||
if (str) {
|
|
||||||
str = str.slice(0, 1).toUpperCase() + str.slice(1).toLowerCase()
|
|
||||||
}
|
|
||||||
return str
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 数字满1000逗号分隔,如99999转变为99,999
|
|
||||||
* 小数点后保留原状,不做逗号分隔,也不进行四舍五入
|
|
||||||
* @param num
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export function numberWithCommas (num) {
|
|
||||||
if (typeof num === 'number') {
|
|
||||||
return num.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ',')
|
|
||||||
} else {
|
|
||||||
return num
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,192 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="appearance" :class="from">
|
|
||||||
<div class="appearance-form">
|
|
||||||
<el-form ref="appearanceForm" :model="appearanceObject" label-position="top" label-width="120px">
|
|
||||||
<el-form-item :label="$t('config.appearance.dateFormat')" prop="date_format">
|
|
||||||
<el-select id="appearance-dateFormat"
|
|
||||||
v-model="appearanceObject.date_format"
|
|
||||||
collapse-tags
|
|
||||||
placeholder=" "
|
|
||||||
popper-class="right-box-select-dropdown right-box-select-report "
|
|
||||||
size="small">
|
|
||||||
<template v-for="dateFormat in dateFormatList" :key="dateFormat.id">
|
|
||||||
<el-option :label="dateFormat.label" :value="dateFormat.value">
|
|
||||||
<span style="float: left">{{ dateFormat.label }}</span>
|
|
||||||
<span style="float: right;">{{ dateFormat.example }}</span>
|
|
||||||
</el-option>
|
|
||||||
</template>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item :label="$t('config.appearance.lang')" prop="lang">
|
|
||||||
<el-select id="appearance-lang"
|
|
||||||
v-model="appearanceObject.lang"
|
|
||||||
collapse-tags
|
|
||||||
placeholder=" "
|
|
||||||
popper-class="right-box-select-dropdown right-box-select-report "
|
|
||||||
size="small">
|
|
||||||
<template v-for="lang in langList" :key="lang.id">
|
|
||||||
<el-option :label="lang.label" :value="lang.value"></el-option>
|
|
||||||
</template>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item :label="$t('config.appearance.timezone')" prop="timezone">
|
|
||||||
<el-select id="appearance-timezone"
|
|
||||||
v-model="appearanceObject.timezone"
|
|
||||||
collapse-tags
|
|
||||||
filterable
|
|
||||||
placeholder=" "
|
|
||||||
popper-class="right-box-select-dropdown right-box-select-report "
|
|
||||||
size="small">
|
|
||||||
<template v-for="timezone in timezoneList" :key="timezone.id">
|
|
||||||
<el-option :label="timezone.name" :value="timezone.name">
|
|
||||||
<span style="float: left">{{ timezone.name }}</span>
|
|
||||||
<span style="float: right;">{{ timezone.offset}}</span>
|
|
||||||
</el-option>
|
|
||||||
</template>
|
|
||||||
</el-select>
|
|
||||||
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
<div class="edit-appearance-base__footer">
|
|
||||||
<button style="position: relative;" :class="{'footer__btn--disabled': blockOperation.save}" :disabled="blockOperation.save" class="footer__btn" @click="save">
|
|
||||||
<loading size="small" :loading="blockOperation.save"></loading>
|
|
||||||
<span>{{$t('overall.save')}}</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script>
|
|
||||||
import { api } from '@/utils/api'
|
|
||||||
import { storageKey } from '@/utils/constants'
|
|
||||||
import axios from 'axios'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Appearance',
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
url: api.appearance,
|
|
||||||
appearanceObject: { // 空白对象
|
|
||||||
date_format: '',
|
|
||||||
lang: '',
|
|
||||||
timezone: ''
|
|
||||||
},
|
|
||||||
timezoneList: [],
|
|
||||||
dateFormatList: [
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
label: 'DD/MM/YYYY HH:mm:ss',
|
|
||||||
value: 'DD/MM/YYYY HH:mm:ss',
|
|
||||||
example: '20/03/2023 09:30:38'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
label: 'MM/DD/YYYY HH:mm:ss',
|
|
||||||
value: 'MM/DD/YYYY HH:mm:ss',
|
|
||||||
example: '03/20/2023 09:30:38'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
label: 'YYYY-MM-DD HH:mm:ss',
|
|
||||||
value: 'YYYY-MM-DD HH:mm:ss',
|
|
||||||
example: '2023-03-20 09:30:38'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
langList: [
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
label: 'English',
|
|
||||||
value: 'en'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
label: '中文',
|
|
||||||
value: 'zh'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.initData()
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
initData () {
|
|
||||||
this.dateFormatList.forEach(date => {
|
|
||||||
date.example = window.$dayJs(new Date()).tz().format(date.value)
|
|
||||||
})
|
|
||||||
|
|
||||||
axios.get(api.timezone).then(response => {
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.timezoneList = response.data.data
|
|
||||||
if (this.timezoneList && this.timezoneList.length > 0) {
|
|
||||||
this.timezoneList.forEach(mapData => {
|
|
||||||
const offset = Number(mapData.offset) / 3600000 // 转换为小
|
|
||||||
mapData.timezoneOffset = offset
|
|
||||||
const hour = Math.abs(parseInt(offset))
|
|
||||||
const offsetStr = offset.toString()
|
|
||||||
let minute = 0
|
|
||||||
if (offsetStr.indexOf('.') > -1) {
|
|
||||||
minute = Math.abs(Number(offsetStr.substring(offsetStr.indexOf('.'))) * 60)
|
|
||||||
}
|
|
||||||
let str = ''
|
|
||||||
if (hour < 10) {
|
|
||||||
str = '0' + hour
|
|
||||||
} else {
|
|
||||||
str = hour
|
|
||||||
}
|
|
||||||
str += ':'
|
|
||||||
if (minute < 10) {
|
|
||||||
str += '0' + minute
|
|
||||||
} else {
|
|
||||||
str += minute
|
|
||||||
}
|
|
||||||
if (offset > 0) {
|
|
||||||
mapData.offset = 'UTC+' + str
|
|
||||||
} else if (offset === 0) {
|
|
||||||
mapData.offset = 'UTC'
|
|
||||||
} else {
|
|
||||||
mapData.offset = 'UTC-' + str
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
axios.get(this.url, { pageSize: -1 }).then(response => {
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.appearanceObject = response.data.data
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
save () {
|
|
||||||
if (this.blockOperation.save) { return }
|
|
||||||
this.blockOperation.save = true
|
|
||||||
axios.put(this.url, this.appearanceObject).then(response => {
|
|
||||||
if (response.data.code === 200) {
|
|
||||||
this.$message({ duration: 2000, type: 'success', message: this.$t('tip.saveSuccess') })
|
|
||||||
if (this.appearanceObject.date_format !== localStorage.getItem(storageKey.dateFormat)) {
|
|
||||||
localStorage.setItem(storageKey.dateFormat, this.appearanceObject.date_format)
|
|
||||||
}
|
|
||||||
if (this.appearanceObject.timezone !== localStorage.getItem(storageKey.sysTimezone)) {
|
|
||||||
localStorage.setItem(storageKey.sysTimezone, this.appearanceObject.timezone)
|
|
||||||
window.$dayJs.tz.setDefault(this.appearanceObject.timezone)
|
|
||||||
localStorage.setItem(storageKey.timezoneOffset, window.$dayJs.tz().utcOffset() / 60)
|
|
||||||
localStorage.setItem(storageKey.timezoneLocalOffset, dayjs().utcOffset() / 60)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.$message.error(response.message)
|
|
||||||
}
|
|
||||||
}).catch(e => {
|
|
||||||
console.error(e)
|
|
||||||
if (e.response && e.response.message) {
|
|
||||||
this.$message.error(e.response.message)
|
|
||||||
} else {
|
|
||||||
this.$message.error('Something went wrong...')
|
|
||||||
}
|
|
||||||
}).finally(() => {
|
|
||||||
this.blockOperation.save = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -9,30 +9,21 @@
|
|||||||
:layout="['columnCustomize','elementSet','search']"
|
:layout="['columnCustomize','elementSet','search']"
|
||||||
@search="search"
|
@search="search"
|
||||||
>
|
>
|
||||||
<template #top-tool-left>
|
<template #top-tool-right>
|
||||||
<button id="chart-add"
|
<button
|
||||||
class="top-tool-btn margin-r-10 top-tool-btn--create"
|
id="account-add"
|
||||||
@click="add">
|
class="top-tool-btn margin-r-10"
|
||||||
<i class="cn-icon-xinjian cn-icon"></i>
|
type="button"
|
||||||
<span>{{$t('overall.create')}}</span>
|
@click="add"
|
||||||
</button>
|
>
|
||||||
<button id="chart-edit" class="top-tool-btn margin-r-10" :disabled="disableEdit"
|
<i class="cn-icon-add cn-icon"/>
|
||||||
@click="editSelectRecord">
|
|
||||||
<i class="cn-icon-edit cn-icon"></i>
|
|
||||||
<span>{{$t('overall.edit')}}</span>
|
|
||||||
</button>
|
|
||||||
<button id="chart-delete" class="top-tool-btn margin-r-10" :disabled="disableDelete"
|
|
||||||
@click="delBatch">
|
|
||||||
<i class="cn-icon-delete cn-icon"></i>
|
|
||||||
<span>{{$t('overall.delete')}}</span>
|
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
<template #default>
|
<template #default>
|
||||||
<loading :loading="loading"></loading>
|
|
||||||
<chart-table
|
<chart-table
|
||||||
ref="dataTable"
|
ref="dataTable"
|
||||||
|
v-loading="tools.loading"
|
||||||
:api="url"
|
:api="url"
|
||||||
:isNoData="isNoData"
|
|
||||||
:custom-table-title="tools.customTableTitle"
|
:custom-table-title="tools.customTableTitle"
|
||||||
:height="mainTableHeight"
|
:height="mainTableHeight"
|
||||||
:table-data="tableData"
|
:table-data="tableData"
|
||||||
|
|||||||
@@ -9,26 +9,14 @@
|
|||||||
:layout="['columnCustomize','elementSet','search']"
|
:layout="['columnCustomize','elementSet','search']"
|
||||||
@search="search"
|
@search="search"
|
||||||
>
|
>
|
||||||
<template v-slot:top-tool-left>
|
<template v-slot:top-tool-right>
|
||||||
<button id="galaxy-proxy-clear-cache" class="top-tool-btn margin-r-10" :title="$t('overall.clearCache')"
|
<button id="galaxy-proxy-clear-cache" class="top-tool-btn margin-r-10" :title="$t('overall.clearCache')"
|
||||||
type="button" @click="clearCache">
|
type="button" @click="clearCache">
|
||||||
<i class="cn-icon cn-icon-clear-cache"></i>
|
<i class="cn-icon cn-icon-clear-cache"></i>
|
||||||
</button>
|
</button>
|
||||||
<button id="galaxy-proxy-add"
|
<button id="galaxy-proxy-add" class="top-tool-btn margin-r-10"
|
||||||
class="top-tool-btn margin-r-10 top-tool-btn--create"
|
type="button" @click="add">
|
||||||
@click="add">
|
<i class="cn-icon-add cn-icon"></i>
|
||||||
<i class="cn-icon-xinjian cn-icon"></i>
|
|
||||||
<span>{{$t('overall.create')}}</span>
|
|
||||||
</button>
|
|
||||||
<button id="galaxy-edit" class="top-tool-btn margin-r-10" :disabled="disableEdit"
|
|
||||||
@click="editSelectRecord">
|
|
||||||
<i class="cn-icon-edit cn-icon"></i>
|
|
||||||
<span>{{$t('overall.edit')}}</span>
|
|
||||||
</button>
|
|
||||||
<button id="galaxy-delete" class="top-tool-btn margin-r-10"
|
|
||||||
@click="delBatch">
|
|
||||||
<i class="cn-icon-delete cn-icon"></i>
|
|
||||||
<span>{{$t('overall.delete')}}</span>
|
|
||||||
</button>
|
</button>
|
||||||
<button id="galaxy-proxy-debug" class="top-tool-btn margin-r-10" :title="$t('overall.debug')"
|
<button id="galaxy-proxy-debug" class="top-tool-btn margin-r-10" :title="$t('overall.debug')"
|
||||||
type="button" @click="debug(true,{})">
|
type="button" @click="debug(true,{})">
|
||||||
@@ -49,11 +37,10 @@
|
|||||||
</top-tool-more-options>
|
</top-tool-more-options>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:default>
|
<template v-slot:default>
|
||||||
<loading :loading="loading"></loading>
|
|
||||||
<galaxy-proxy-table
|
<galaxy-proxy-table
|
||||||
ref="dataTable"
|
ref="dataTable"
|
||||||
|
v-loading="tools.loading"
|
||||||
:api="url"
|
:api="url"
|
||||||
:isNoData="isNoData"
|
|
||||||
:custom-table-title="tools.customTableTitle"
|
:custom-table-title="tools.customTableTitle"
|
||||||
:height="mainTableHeight"
|
:height="mainTableHeight"
|
||||||
:table-data="tableData"
|
:table-data="tableData"
|
||||||
|
|||||||
@@ -9,30 +9,22 @@
|
|||||||
:layout="['columnCustomize','elementSet','search']"
|
:layout="['columnCustomize','elementSet','search']"
|
||||||
@search="search"
|
@search="search"
|
||||||
>
|
>
|
||||||
<template #top-tool-left>
|
<template #top-tool-right>
|
||||||
<button id="i18n-add"
|
<button
|
||||||
class="top-tool-btn margin-r-10 top-tool-btn--create"
|
id="account-add"
|
||||||
@click="add">
|
v-has="'user_add'"
|
||||||
<i class="cn-icon-xinjian cn-icon"></i>
|
class="top-tool-btn margin-r-10"
|
||||||
<span>{{$t('overall.create')}}</span>
|
type="button"
|
||||||
</button>
|
@click="add"
|
||||||
<button id="i18n-edit" class="top-tool-btn margin-r-10" :disabled="disableEdit"
|
>
|
||||||
@click="editSelectRecord">
|
<i class="cn-icon-add cn-icon"/>
|
||||||
<i class="cn-icon-edit cn-icon"></i>
|
|
||||||
<span>{{$t('overall.edit')}}</span>
|
|
||||||
</button>
|
|
||||||
<button id="i18n-delete" class="top-tool-btn margin-r-10" :disabled="disableDelete"
|
|
||||||
@click="delBatch">
|
|
||||||
<i class="cn-icon-delete cn-icon"></i>
|
|
||||||
<span>{{$t('overall.delete')}}</span>
|
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
<template #default>
|
<template #default>
|
||||||
<loading :loading="loading"></loading>
|
|
||||||
<i18n-table
|
<i18n-table
|
||||||
ref="dataTable"
|
ref="dataTable"
|
||||||
|
v-loading="tools.loading"
|
||||||
:api="url"
|
:api="url"
|
||||||
:isNoData="isNoData"
|
|
||||||
:custom-table-title="tools.customTableTitle"
|
:custom-table-title="tools.customTableTitle"
|
||||||
:height="mainTableHeight"
|
:height="mainTableHeight"
|
||||||
:table-data="tableData"
|
:table-data="tableData"
|
||||||
|
|||||||
@@ -9,11 +9,10 @@
|
|||||||
:from="fromRoute.operationLog"
|
:from="fromRoute.operationLog"
|
||||||
@search="search">
|
@search="search">
|
||||||
<template v-slot:default>
|
<template v-slot:default>
|
||||||
<loading :loading="loading"></loading>
|
|
||||||
<operation-log-table
|
<operation-log-table
|
||||||
ref="dataTable"
|
ref="dataTable"
|
||||||
|
v-loading="tools.loading"
|
||||||
:api="url"
|
:api="url"
|
||||||
:isNoData="isNoData"
|
|
||||||
:custom-table-title="tools.customTableTitle"
|
:custom-table-title="tools.customTableTitle"
|
||||||
:height="mainTableHeight"
|
:height="mainTableHeight"
|
||||||
:table-data="tableData"
|
:table-data="tableData"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<i class="cn-icon-edit cn-icon"></i>
|
<i class="cn-icon-edit cn-icon"></i>
|
||||||
<span>{{$t('overall.edit')}}</span>
|
<span>{{$t('overall.edit')}}</span>
|
||||||
</button>
|
</button>
|
||||||
<button id="roles-delete" class="top-tool-btn margin-r-10" :disabled="disableDelete"
|
<button id="roles-delete" class="top-tool-btn margin-r-10"
|
||||||
@click="delBatch">
|
@click="delBatch">
|
||||||
<i class="cn-icon-delete cn-icon"></i>
|
<i class="cn-icon-delete cn-icon"></i>
|
||||||
<span>{{$t('overall.delete')}}</span>
|
<span>{{$t('overall.delete')}}</span>
|
||||||
@@ -29,11 +29,10 @@
|
|||||||
<delete-button id="role-list-batch-delete" :api="url" :delete-objs="batchDeleteObjs" @after="getTableData" @before="delFlag=true"></delete-button>
|
<delete-button id="role-list-batch-delete" :api="url" :delete-objs="batchDeleteObjs" @after="getTableData" @before="delFlag=true"></delete-button>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:default>
|
<template v-slot:default>
|
||||||
<loading :loading="loading"></loading>
|
|
||||||
<roles-table
|
<roles-table
|
||||||
ref="dataTable"
|
ref="dataTable"
|
||||||
|
v-loading="tools.loading"
|
||||||
:api="url"
|
:api="url"
|
||||||
:isNoData="isNoData"
|
|
||||||
:custom-table-title="tools.customTableTitle"
|
:custom-table-title="tools.customTableTitle"
|
||||||
:height="mainTableHeight"
|
:height="mainTableHeight"
|
||||||
:table-data="tableData"
|
:table-data="tableData"
|
||||||
@@ -92,12 +91,12 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
edit () {
|
edit () {
|
||||||
if (this.batchDeleteObjs.length === 0) {
|
if(this.batchDeleteObjs.length === 0){
|
||||||
this.$alert(this.$t('tip.pleaseSelectForEdit'), {
|
this.$alert(this.$t('tip.pleaseSelectForEdit'),{
|
||||||
confirmButtonText: this.$t('tip.yes'),
|
confirmButtonText: this.$t('tip.yes'),
|
||||||
type: 'warning'
|
type:'warning'
|
||||||
}).catch(() => {})
|
})
|
||||||
} else {
|
}else {
|
||||||
get(`${this.url}`, { ids: this.batchDeleteObjs[0].id }).then(response => {
|
get(`${this.url}`, { ids: this.batchDeleteObjs[0].id }).then(response => {
|
||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
this.object = response.data.list[0]
|
this.object = response.data.list[0]
|
||||||
|
|||||||
@@ -20,18 +20,17 @@
|
|||||||
<i class="cn-icon-edit cn-icon"></i>
|
<i class="cn-icon-edit cn-icon"></i>
|
||||||
<span>{{$t('overall.edit')}}</span>
|
<span>{{$t('overall.edit')}}</span>
|
||||||
</button>
|
</button>
|
||||||
<button id="account-delete" class="top-tool-btn margin-r-10" :disabled="disableDelete"
|
<button id="account-delete" class="top-tool-btn margin-r-10"
|
||||||
@click="delBatch">
|
@click="delBatch">
|
||||||
<i class="cn-icon-delete cn-icon"></i>
|
<i class="cn-icon-delete cn-icon"></i>
|
||||||
<span>{{$t('overall.delete')}}</span>
|
<span>{{$t('overall.delete')}}</span>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
<template #default>
|
<template #default>
|
||||||
<loading :loading="loading"></loading>
|
|
||||||
<user-table
|
<user-table
|
||||||
ref="dataTable"
|
ref="dataTable"
|
||||||
|
v-loading="tools.loading"
|
||||||
:api="url"
|
:api="url"
|
||||||
:isNoData="isNoData"
|
|
||||||
:custom-table-title="tools.customTableTitle"
|
:custom-table-title="tools.customTableTitle"
|
||||||
:height="mainTableHeight"
|
:height="mainTableHeight"
|
||||||
:table-data="tableData"
|
:table-data="tableData"
|
||||||
@@ -64,7 +63,6 @@ import dataListMixin from '@/mixins/data-list'
|
|||||||
import userTable from '@/components/table/administration/UserTable'
|
import userTable from '@/components/table/administration/UserTable'
|
||||||
import userBox from '@/components/rightBox/settings/UserBox'
|
import userBox from '@/components/rightBox/settings/UserBox'
|
||||||
import { api } from '@/utils/api'
|
import { api } from '@/utils/api'
|
||||||
import { get } from '@/utils/http'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'User',
|
name: 'User',
|
||||||
@@ -90,55 +88,6 @@ export default {
|
|||||||
},
|
},
|
||||||
tableId: 'userTable'
|
tableId: 'userTable'
|
||||||
}
|
}
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
getTableData (params, isAll, isClearType) {
|
|
||||||
if (isAll) {
|
|
||||||
this.searchLabel = null
|
|
||||||
} else if (isClearType) {
|
|
||||||
// this.searchLabel.tagType = ''
|
|
||||||
this.searchLabel.type = ''// 换新接口需要修改的属性名称
|
|
||||||
}
|
|
||||||
if (params) {
|
|
||||||
this.searchLabel = { ...this.searchLabel, ...params }
|
|
||||||
}
|
|
||||||
this.searchLabel = { ...this.searchLabel, ...this.pageObj }
|
|
||||||
this.isNoData = false
|
|
||||||
//this.tableData = []
|
|
||||||
this.toggleLoading(true)
|
|
||||||
delete this.searchLabel.total
|
|
||||||
let listUrl = this.url
|
|
||||||
if (this.listUrl) {
|
|
||||||
listUrl = this.listUrl
|
|
||||||
}
|
|
||||||
get(listUrl, this.searchLabel).then(response => {
|
|
||||||
if (response.code === 200) {
|
|
||||||
for (let i = 0; i < response.data.list.length; i++) {
|
|
||||||
response.data.list[i].status = response.data.list[i].status + ''
|
|
||||||
}
|
|
||||||
this.tableData = response.data.list
|
|
||||||
this.pageObj.total = response.data.total
|
|
||||||
} else {
|
|
||||||
console.error(response)
|
|
||||||
this.isNoData = true
|
|
||||||
if (response.message) {
|
|
||||||
this.$message.error(response.message)
|
|
||||||
} else {
|
|
||||||
this.$message.error('Something went wrong...')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).finally(() => {
|
|
||||||
this.toggleLoading(false)
|
|
||||||
if (!this.tableData || this.tableData.length === 0) {
|
|
||||||
this.isNoData = true
|
|
||||||
} else {
|
|
||||||
this.isNoData = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
unmounted () {
|
|
||||||
this.isNoData = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -25,9 +25,9 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="c in table.tableColumns"
|
v-for="(c, i) in table.tableColumns"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
:key="c"
|
:key="i"
|
||||||
:label="c"
|
:label="c"
|
||||||
:prop="c"
|
:prop="c"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
:size="'mini'"
|
:size="'mini'"
|
||||||
:height="'100%'">
|
:height="'100%'">
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="item in tableKey"
|
v-for="(item,index) in tableKey"
|
||||||
:key="item.prop"
|
:key="index"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:prop="item.prop"
|
:prop="item.prop"
|
||||||
:min-width="item.width"
|
:min-width="item.width"
|
||||||
|
|||||||
@@ -9,17 +9,17 @@
|
|||||||
<el-table-column :width="60" v-if="table.currentPageData.length" type="index" label="#">
|
<el-table-column :width="60" v-if="table.currentPageData.length" type="index" label="#">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="c in table.tableColumns.common"
|
v-for="(c, i) in table.tableColumns.common"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
:key="c"
|
:key="i"
|
||||||
:label="$t(chartTableColumnMapping[c] || c)"
|
:label="$t(chartTableColumnMapping[c] || c)"
|
||||||
:prop="c"
|
:prop="c"
|
||||||
>
|
>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="c in table.tableColumns.order"
|
v-for="(c, i) in table.tableColumns.order"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
:key="c"
|
:key="i"
|
||||||
:label="$t(chartTableColumnMapping[c] || c)"
|
:label="$t(chartTableColumnMapping[c] || c)"
|
||||||
:prop="c"
|
:prop="c"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -27,8 +27,8 @@
|
|||||||
width="48">
|
width="48">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="item in tableTitlesOther"
|
v-for="(item, index) in tableTitlesOther"
|
||||||
:key="item.prop"
|
:key="index"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
:min-width="item.width"
|
:min-width="item.width"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
@@ -55,8 +55,8 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
v-for="item in tableTitles"
|
v-for="(item, index) in tableTitles"
|
||||||
:key="item.prop"
|
:key="index"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
:min-width="item.width"
|
:min-width="item.width"
|
||||||
:label="(tableNameColumn === 'appName'&& item.prop === 'tableNameColumn')? $t('overall.appName'):item.label"
|
:label="(tableNameColumn === 'appName'&& item.prop === 'tableNameColumn')? $t('overall.appName'):item.label"
|
||||||
|
|||||||
@@ -514,24 +514,3 @@ export function appStackedLineTooltipFormatter (params) {
|
|||||||
str += '</div>'
|
str += '</div>'
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
export function detectionTooltipFormatter (params) {
|
|
||||||
let str = '<div>'
|
|
||||||
const tData = params.data[0]
|
|
||||||
str += '<div style="margin-bottom: 5px">'
|
|
||||||
str += dateFormatByAppearance(tData)
|
|
||||||
str += '</div>'
|
|
||||||
str += '<div class="cn-chart-tooltip">'
|
|
||||||
str += '<span class="cn-chart-tooltip-box">'
|
|
||||||
str += params.marker
|
|
||||||
str += `<span class="cn-chart-tooltip-content">
|
|
||||||
${params.seriesName}
|
|
||||||
</span>`
|
|
||||||
str += '</span>'
|
|
||||||
str += `<span class="cn-chart-tooltip-value cn-chart-tooltip__color" style="position: absolute;right: 10px">
|
|
||||||
${params.data[1]}
|
|
||||||
</span>`
|
|
||||||
str += '</div>'
|
|
||||||
str += '</div>'
|
|
||||||
return str
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -160,24 +160,6 @@
|
|||||||
:chart="chart"
|
:chart="chart"
|
||||||
@toggleLoading="toggleLoading"
|
@toggleLoading="toggleLoading"
|
||||||
></dns-traffic-line>
|
></dns-traffic-line>
|
||||||
<entity-detail-basic-info
|
|
||||||
v-else-if="chart.type === typeMapping.entityDetail.basicInfo"
|
|
||||||
:chart="chart"
|
|
||||||
:entity="entity"
|
|
||||||
@toggleLoading="toggleLoading"
|
|
||||||
></entity-detail-basic-info>
|
|
||||||
<entity-detail-line
|
|
||||||
v-else-if="chart.type === typeMapping.entityDetail.line"
|
|
||||||
:chart="chart"
|
|
||||||
:entity="entity"
|
|
||||||
@toggleLoading="toggleLoading"
|
|
||||||
></entity-detail-line>
|
|
||||||
<entity-detail-tabs-chart
|
|
||||||
v-else-if="chart.type === typeMapping.entityDetail.tabsChart"
|
|
||||||
:chart="chart"
|
|
||||||
:entity="entity"
|
|
||||||
@toggleLoading="toggleLoading"
|
|
||||||
></entity-detail-tabs-chart>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -208,9 +190,6 @@ import DnsActiveMaliciousDomain from '@/views/charts2/charts/dnsInsight/DnsActiv
|
|||||||
import DnsEventChart from '@/views/charts2/charts/dnsInsight/DnsEventChart'
|
import DnsEventChart from '@/views/charts2/charts/dnsInsight/DnsEventChart'
|
||||||
import DnsRecentEvents from '@/views/charts2/charts/dnsInsight/DnsRecentEvents'
|
import DnsRecentEvents from '@/views/charts2/charts/dnsInsight/DnsRecentEvents'
|
||||||
import DnsTrafficLine from '@/views/charts2/charts/dnsInsight/DnsTrafficLine'
|
import DnsTrafficLine from '@/views/charts2/charts/dnsInsight/DnsTrafficLine'
|
||||||
import EntityDetailBasicInfo from '@/views/charts2/charts/entityDetail/EntityDetailBasicInfo'
|
|
||||||
import EntityDetailLine from '@/views/charts2/charts/entityDetail/EntityDetailLine'
|
|
||||||
import EntityDetailTabsChart from '@/views/charts2/charts/entityDetail/EntityDetailTabs'
|
|
||||||
|
|
||||||
import { getNowTime } from '@/utils/date-util'
|
import { getNowTime } from '@/utils/date-util'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
@@ -243,17 +222,13 @@ export default {
|
|||||||
DnsActiveMaliciousDomain,
|
DnsActiveMaliciousDomain,
|
||||||
DnsEventChart,
|
DnsEventChart,
|
||||||
DnsRecentEvents,
|
DnsRecentEvents,
|
||||||
DnsTrafficLine,
|
DnsTrafficLine
|
||||||
EntityDetailBasicInfo,
|
|
||||||
EntityDetailLine,
|
|
||||||
EntityDetailTabsChart
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
chart: Object,
|
chart: Object,
|
||||||
metric: String,
|
metric: String,
|
||||||
timeFilter: Object,
|
timeFilter: Object,
|
||||||
extraParams: Object,
|
extraParams: Object
|
||||||
entity: Object
|
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
:metric="metric"
|
:metric="metric"
|
||||||
:extra-params="extraParams"
|
:extra-params="extraParams"
|
||||||
:id="item.id"
|
:id="item.id"
|
||||||
:entity="entity"
|
|
||||||
ref="chartGrid"
|
ref="chartGrid"
|
||||||
@npmTabChange="npmTabChange"
|
@npmTabChange="npmTabChange"
|
||||||
:chart="item"
|
:chart="item"
|
||||||
@@ -61,22 +60,7 @@ export default {
|
|||||||
rowHeight: 40,
|
rowHeight: 40,
|
||||||
rowMargin: 20,
|
rowMargin: 20,
|
||||||
colMargin: 20,
|
colMargin: 20,
|
||||||
debounceFunc: null,
|
debounceFunc: null
|
||||||
timeoutFunc: null,
|
|
||||||
// 需要动态处理高度的chart
|
|
||||||
dynamicHeightCharts: [
|
|
||||||
{
|
|
||||||
selector: '.app-cards',
|
|
||||||
// 需要额外修正的值
|
|
||||||
correctionHeight: 24,
|
|
||||||
chartType: typeMapping.networkOverview.appList
|
|
||||||
}/*,
|
|
||||||
{
|
|
||||||
selector: '.entity-detail-info',
|
|
||||||
correctionHeight: 161,
|
|
||||||
chartType: typeMapping.entityDetail.basicInfo
|
|
||||||
}*/
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
@@ -119,7 +103,7 @@ export default {
|
|||||||
const overviewAppChart = layout.find(c => c.type === typeMapping.networkOverview.appList)
|
const overviewAppChart = layout.find(c => c.type === typeMapping.networkOverview.appList)
|
||||||
if (overviewAppChart) {
|
if (overviewAppChart) {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.handleDynamicChartHeight()
|
this.resizeAppChart()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,53 +122,26 @@ export default {
|
|||||||
resizeLine () {
|
resizeLine () {
|
||||||
this.$refs.chartGrid.resizeLine()
|
this.$refs.chartGrid.resizeLine()
|
||||||
},
|
},
|
||||||
// 动态处理chart高度
|
resizeAppChart () {
|
||||||
handleDynamicChartHeight () {
|
const appCardsDom = document.querySelector('.app-cards')
|
||||||
this.dynamicHeightCharts.forEach(chart => {
|
|
||||||
const dom = document.querySelector(chart.selector)
|
|
||||||
if (dom) {
|
|
||||||
const layout = _.cloneDeep(this.layout)
|
|
||||||
const destinationChart = layout.find(c => c.type === chart.chartType)
|
|
||||||
const domHeight = dom.offsetHeight
|
|
||||||
if (domHeight) {
|
|
||||||
destinationChart.h = (domHeight + chart.correctionHeight + this.rowMargin) / (this.rowHeight + this.rowMargin)
|
|
||||||
this.layout = layout
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
// 实体详情基础信息的特殊处理:tag动态高度、底部详情动态高度
|
|
||||||
// 顶部padding+entityType+entityName高度94,tag高度实时获取,空隙6,分割线22,底下信息实时获取
|
|
||||||
handleEntityDetailBasicInfoHeight () {
|
|
||||||
const tagsDom = document.querySelector('.entity-tags')
|
|
||||||
const detailInfoDom = document.querySelector('.entity-detail-info')
|
|
||||||
let height = 94 + 6 + 22
|
|
||||||
if (tagsDom) {
|
|
||||||
height += tagsDom.offsetHeight
|
|
||||||
}
|
|
||||||
if (detailInfoDom) {
|
|
||||||
height += detailInfoDom.offsetHeight
|
|
||||||
}
|
|
||||||
const layout = _.cloneDeep(this.layout)
|
const layout = _.cloneDeep(this.layout)
|
||||||
const destinationChart = layout.find(c => c.type === typeMapping.entityDetail.basicInfo)
|
const overviewAppChart = layout.find(c => c.type === typeMapping.networkOverview.appList)
|
||||||
destinationChart.h = (height + this.rowMargin) / (this.rowHeight + this.rowMargin)
|
if (appCardsDom) {
|
||||||
this.layout = layout
|
const cardsHeight = appCardsDom.offsetHeight
|
||||||
|
if (cardsHeight) {
|
||||||
|
const headerHeight = 24
|
||||||
|
overviewAppChart.h = (cardsHeight + headerHeight + this.rowMargin) / (this.rowHeight + this.rowMargin)
|
||||||
|
this.layout = layout
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
this.timeoutFunc = setTimeout(() => {
|
this.debounceFunc = _.debounce(this.resizeAppChart, 400)
|
||||||
this.handleDynamicChartHeight()
|
|
||||||
}, 500)
|
|
||||||
this.handleDynamicChartHeight()
|
|
||||||
this.debounceFunc = _.debounce(this.handleDynamicChartHeight, 500)
|
|
||||||
window.addEventListener('resize', this.debounceFunc)
|
window.addEventListener('resize', this.debounceFunc)
|
||||||
|
|
||||||
this.emitter.on('entity-detail-hide-tag-area', this.handleEntityDetailBasicInfoHeight)
|
|
||||||
},
|
},
|
||||||
beforeUnmount () {
|
beforeUnmount () {
|
||||||
window.removeEventListener('resize', this.debounceFunc)
|
window.removeEventListener('resize', this.debounceFunc)
|
||||||
clearTimeout(this.timeoutFunc)
|
|
||||||
this.emitter.off('entity-detail-hide-tag-area')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="panel-box2" :class="{'panel-box2--entity-detail': entity && entity.entityType}">
|
<div class="panel-box2">
|
||||||
<div class="panel__header" v-if="!entity">
|
<div class="panel__header">
|
||||||
<div class="panel__title">{{panelName?panelName:(panel.i18n ? $t(panel.i18n) : panel.name)}}
|
<div class="panel__title">{{panelName?panelName:(panel.i18n ? $t(panel.i18n) : panel.name)}}
|
||||||
<div v-if="showScore" class="score">
|
<div v-if="showScore" class="score">
|
||||||
<div class="circle-icon" v-if="score <= 2 || score === '-'" :class="{'data-score-red': score <= 2 || score === '-'}" ></div>
|
<div class="circle-icon" v-if="score <= 2 || score === '-'" :class="{'data-score-red': score <= 2 || score === '-'}" ></div>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
v-model="metric"
|
v-model="metric"
|
||||||
placeholder=""
|
placeholder=""
|
||||||
popper-class="common-select"
|
popper-class="common-select"
|
||||||
v-if="showMetric"
|
v-if="panelType === panelTypeAndRouteMapping.networkOverview"
|
||||||
:popper-append-to-body="false"
|
:popper-append-to-body="false"
|
||||||
@change="metricChange"
|
@change="metricChange"
|
||||||
>
|
>
|
||||||
@@ -99,10 +99,6 @@ export default {
|
|||||||
// npmThirdLevelMenuScore () {
|
// npmThirdLevelMenuScore () {
|
||||||
// return this.$store.getters.getNpmThirdLevelMenuScore
|
// return this.$store.getters.getNpmThirdLevelMenuScore
|
||||||
// }
|
// }
|
||||||
// 显示顶部的Metric单位选项标识
|
|
||||||
showMetric () {
|
|
||||||
return this.panelType === panelTypeAndRouteMapping.networkOverview || this.panelType === panelTypeAndRouteMapping.networkOverviewDrillDown
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
// npmThirdLevelMenuScore: {
|
// npmThirdLevelMenuScore: {
|
||||||
@@ -205,7 +201,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
setup (props) {
|
setup (props) {
|
||||||
// router引入store会报错,故在panel里调用
|
// todo 目前在panel页面测试,后续会挪到router里
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const cancelList = store.state.panel.httpCancel
|
const cancelList = store.state.panel.httpCancel
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
chart: Object,
|
chart: Object,
|
||||||
timeFilter: Object,
|
timeFilter: Object
|
||||||
entity: Object
|
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
isNoData: false,
|
isNoData: false
|
||||||
showError: false,
|
|
||||||
errorMsg: ''
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
emits: ['toggleLoading'],
|
emits: ['toggleLoading'],
|
||||||
|
|||||||
@@ -31,10 +31,5 @@ export const typeMapping = {
|
|||||||
dnsEventChart: 711,
|
dnsEventChart: 711,
|
||||||
dnsRecentEvents: 605,
|
dnsRecentEvents: 605,
|
||||||
dnsActiveMaliciousDomain: 604
|
dnsActiveMaliciousDomain: 604
|
||||||
},
|
|
||||||
entityDetail: {
|
|
||||||
basicInfo: 712,
|
|
||||||
line: 107,
|
|
||||||
tabsChart: 713
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user