合并代码

This commit is contained in:
ym1026
2025-09-11 19:08:47 +08:00
270 changed files with 13926 additions and 2814 deletions

View File

@@ -1,9 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 4945642 */
src: url('iconfont.woff2?t=1756516508134') format('woff2'),
url('iconfont.woff?t=1756516508134') format('woff'),
url('iconfont.ttf?t=1756516508134') format('truetype'),
url('iconfont.svg?t=1756516508134#iconfont') format('svg');
font-family: "iconfont"; /* Project id 5010233 */
src: url('iconfont.woff2?t=1757574994185') format('woff2'),
url('iconfont.woff?t=1757574994185') format('woff'),
url('iconfont.ttf?t=1757574994185') format('truetype');
}
.iconfont {
@@ -14,455 +13,151 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-full:before {
content: "\e651";
.icon-chunengguankong:before {
content: "\e60c";
}
.icon-exit:before {
content: "\e652";
.icon-bianyaqi1:before {
content: "\e60b";
}
.icon-a-qiyong:before {
content: "\e64e";
.icon-tuichu:before {
content: "\e7ed";
}
.icon-a-jinyong:before {
content: "\e64f";
.icon-bianyaqi:before {
content: "\e62f";
}
.icon-tuihuishenqing:before {
content: "\e64d";
.icon-jizhuangxiang:before {
content: "\e60a";
}
.icon-mti-loudianjiance:before {
content: "\e64c";
.icon-nengyuanguanli:before {
content: "\e67d";
}
.icon-guanbi:before {
content: "\e64b";
}
.icon-a-fenzu1411:before {
content: "\e649";
}
.icon-a-fenzu1409:before {
content: "\e64a";
}
.icon-xianlu:before {
content: "\e647";
}
.icon-jizhongqi:before {
content: "\e648";
}
.icon-a-lujing41:before {
content: "\e646";
}
.icon-a-lujing4:before {
.icon-quexianguanli:before {
content: "\e645";
}
.icon-Electrocardiogram:before {
content: "\e644";
.icon-L-chunengdianchicu:before {
content: "\e698";
}
.icon-hezha:before {
content: "\e642";
.icon-jizhongqi:before {
content: "\e607";
}
.icon-bisuo:before {
content: "\e643";
.icon-chongdianqiang:before {
content: "\e650";
}
.icon-lixian:before {
content: "\e63b";
.icon-guangfuban:before {
content: "\e609";
}
.icon-dengpao:before {
content: "\e63c";
.icon-zhuangjirongliang:before {
content: "\e683";
}
.icon-daunlu:before {
content: "\e63e";
.icon-charging-pile-line:before {
content: "\e83c";
}
.icon-loudianjiance:before {
content: "\e63f";
.icon-dianbiao:before {
content: "\ec4d";
}
.icon-guozai:before {
content: "\e641";
.icon-shuijinchuanganqiicon:before {
content: "\e605";
}
.icon-a-fenzu92:before {
content: "\e63a";
.icon-menjin:before {
content: "\e637";
}
.icon-yonghu2:before {
content: "\e68d";
.icon-fengsujiance:before {
content: "\e628";
}
.icon-guzhang:before {
content: "\e632";
.icon-xiaofang:before {
content: "\e60e";
}
.icon-leijishouyi:before {
content: "\e631";
.icon-guangzhaojianceshebei:before {
content: "\e608";
}
.icon-fadianliang:before {
content: "\e63d";
.icon-shipinjiankong:before {
content: "\e638";
}
.icon-fengji:before {
content: "\e661";
.icon-yanganjiance:before {
content: "\e6a8";
}
.icon-guangfu:before {
content: "\e633";
.icon-peidiangui:before {
content: "\e7bf";
}
.icon-jiantanpaifang:before {
content: "\e67d";
.icon-transformer:before {
content: "\e6ae";
}
.icon-zhaomingdeng:before {
content: "\e993";
}
.icon-wenshidujiance:before {
content: "\e6c8";
}
.icon-add:before {
content: "\e604";
}
.icon-shidu:before {
content: "\e60d";
}
.icon-wenduji:before {
content: "\e6de";
}
.icon-kongdiaogongcheng:before {
content: "\e62e";
}
.icon-lengji:before {
content: "\e639";
}
.icon-guanbi:before {
content: "\e606";
}
.icon-a-fenzu3:before {
content: "\e602";
}
.icon-nibianqi:before {
content: "\e603";
}
.icon-battery-charge-line:before {
content: "\e601";
}
.icon-a-fenzu13:before {
content: "\e600";
}
.icon-hebing:before {
content: "\e630";
}
.icon-a-fenzu2:before {
content: "\e62e";
}
.icon-jiantou:before {
content: "\e62d";
}
.icon-a-fenzu549:before {
content: "\e62c";
}
.icon-guanbi1:before {
content: "\e62a";
}
.icon-baohuzhuangzhi:before {
content: "\e704";
}
.icon-peidianfang:before {
content: "\e6ae";
}
.icon-map-mark0:before {
content: "\e6ba";
}
.icon-caokongguanli:before {
content: "\e62b";
}
.icon-a-CyberMonitoring:before {
content: "\e640";
}
.icon-a-GrowthChart:before {
content: "\e650";
}
.icon-a-SalesGrowth:before {
content: "\e668";
}
.icon-a-TrendChat:before {
content: "\e673";
}
.icon-a-CloudComputer:before {
content: "\e683";
}
.icon-a-CloudInfrastructure:before {
content: "\e687";
}
.icon-a-CloudManagement:before {
content: "\e689";
}
.icon-a-CloudSecurity:before {
content: "\e68e";
}
.icon-Dataserver:before {
content: "\e693";
}
.icon-a-VolumeEqualizer:before {
content: "\e6c0";
}
.icon-a-ResourceManagement1:before {
content: "\e808";
}
.icon-a-GraphUp:before {
content: "\e859";
}
.icon-a-FileCabinet:before {
content: "\e97d";
}
.icon-a-SystemSetting:before {
content: "\ee41";
}
.icon-map-mark1:before {
content: "\ee42";
}
.icon-map-mark2-copy:before {
content: "\ee43";
}
.icon-shouye:before {
content: "\e625";
}
.icon-dingwei:before {
content: "\e8c4";
}
.icon-guanbi2:before {
content: "\e62f";
}
.icon-chulizhuangtai:before {
content: "\e684";
}
.icon-a-fenzu302:before {
content: "\e629";
}
.icon-a-fenzu1163:before {
content: "\e605";
}
.icon-tuichu:before {
content: "\e627";
}
.icon-yonghu-yuan:before {
content: "\e628";
}
.icon-mima:before {
content: "\e8b2";
}
.icon-tuichu3:before {
content: "\e624";
}
.icon-yueliang:before {
content: "\e656";
}
.icon-tongzhi:before {
content: "\e674";
}
.icon-tongzhi1:before {
content: "\e9cd";
}
.icon-tongzhi2:before {
content: "\101d4";
}
.icon-xingzhuangjiehe:before {
content: "\e623";
}
.icon-xitongguanli:before {
content: "\e672";
}
.icon-pingtaiguanli:before {
content: "\e619";
}
.icon-shidu:before {
content: "\e635";
}
.icon-dingdan-quanbudingdan:before {
content: "\e626";
}
.icon-wendu:before {
content: "\e80f";
}
.icon-fengtian-guangzhao:before {
content: "\e636";
}
.icon-fengsu:before {
content: "\ea32";
}
.icon-wulianzhongxin_normal:before {
content: "\e620";
}
.icon-icon-1:before {
content: "\e621";
}
.icon-fengexian:before {
content: "\e634";
}
.icon-quxiao:before {
content: "\e637";
}
.icon-a-xingzhuangjiehe1x:before {
content: "\e638";
}
.icon-a-xingzhuangjiehe1x1:before {
content: "\e639";
}
.icon-xingzhuang1:before {
content: "\e622";
}
.icon-xingzhuang:before {
content: "\e604";
}
.icon-a-fenzu1865:before {
content: "\e61f";
}
.icon-confirm:before {
content: "\e61a";
}
.icon-a-fenzu412:before {
content: "\e61b";
}
.icon-shuaxin:before {
content: "\e61c";
}
.icon-download:before {
content: "\e61d";
}
.icon-upload:before {
.icon-quanpingmu:before {
content: "\e61e";
}
.icon-add:before {
content: "\e616";
}
.icon-chongzhi:before {
content: "\e617";
}
.icon-setProtectControl:before {
content: "\e618";
}
.icon-export:before {
content: "\e613";
}
.icon-import:before {
content: "\e614";
}
.icon-del:before {
content: "\e615";
}
.icon-setProtectValue:before {
content: "\e60e";
}
.icon-setLightMode:before {
content: "\e60f";
}
.icon-setTimeMode:before {
content: "\e610";
}
.icon-switchMode:before {
content: "\e611";
}
.icon-setTime:before {
content: "\e612";
}
.icon-sousu:before {
content: "\e60c";
}
.icon-a-fenzu2241:before {
content: "\e60d";
}
.icon-openOrClose:before {
content: "\e60b";
}
.icon-zhaoce:before {
content: "\e60a";
}
.icon-send:before {
content: "\e609";
}
.icon-a-fenzu5:before {
content: "\e608";
}
.icon-shezhi:before {
content: "\e607";
}
.icon-touxiang:before {
content: "\e606";
}
.icon-jiaoyizhanghuguanli:before {
content: "\e602";
}
.icon-yingxiaoxuanzhong:before {
content: "\e603";
}
.icon-a-lujing1:before {
content: "\e600";
}
.icon-a-lujing11:before {
content: "\e601";
}

File diff suppressed because one or more lines are too long

View File

@@ -1,212 +1,254 @@
{
"id": "4945642",
"name": "海达普平台3.0",
"id": "5010233",
"name": "光储充",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "44946071",
"name": "full",
"font_class": "full",
"unicode": "e651",
"unicode_decimal": 58961
"icon_id": "34089819",
"name": "BMS",
"font_class": "chunengguankong",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "44946066",
"name": "exit",
"font_class": "exit",
"unicode": "e652",
"unicode_decimal": 58962
"icon_id": "25725466",
"name": "变压器",
"font_class": "bianyaqi1",
"unicode": "e60b",
"unicode_decimal": 58891
},
{
"icon_id": "44797354",
"name": "qiyong",
"font_class": "a-qiyong",
"unicode": "e64e",
"unicode_decimal": 58958
"icon_id": "16921565",
"name": "退出",
"font_class": "tuichu",
"unicode": "e7ed",
"unicode_decimal": 59373
},
{
"icon_id": "44797352",
"name": "jinyong",
"font_class": "a-jinyong",
"unicode": "e64f",
"unicode_decimal": 58959
"icon_id": "6953156",
"name": "PCU",
"font_class": "bianyaqi",
"unicode": "e62f",
"unicode_decimal": 58927
},
{
"icon_id": "41945643",
"name": "退回申请",
"font_class": "tuihuishenqing",
"unicode": "e64d",
"unicode_decimal": 58957
"icon_id": "14515201",
"name": "预制舱",
"font_class": "jizhuangxiang",
"unicode": "e60a",
"unicode_decimal": 58890
},
{
"icon_id": "44643473",
"name": "mti-漏电监测",
"font_class": "mti-loudianjiance",
"unicode": "e64c",
"unicode_decimal": 58956
"icon_id": "18853254",
"name": "PCS",
"font_class": "nengyuanguanli",
"unicode": "e67d",
"unicode_decimal": 59005
},
{
"icon_id": "44642653",
"name": "关闭",
"font_class": "guanbi",
"unicode": "e64b",
"unicode_decimal": 58955
},
{
"icon_id": "44628330",
"name": "启用",
"font_class": "a-fenzu1411",
"unicode": "e649",
"unicode_decimal": 58953
},
{
"icon_id": "44628328",
"name": "禁用",
"font_class": "a-fenzu1409",
"unicode": "e64a",
"unicode_decimal": 58954
},
{
"icon_id": "44626923",
"name": "线路",
"font_class": "xianlu",
"unicode": "e647",
"unicode_decimal": 58951
},
{
"icon_id": "44626921",
"name": "集中器",
"font_class": "jizhongqi",
"unicode": "e648",
"unicode_decimal": 58952
},
{
"icon_id": "44626922",
"name": "路径 4 (1)",
"font_class": "a-lujing41",
"unicode": "e646",
"unicode_decimal": 58950
},
{
"icon_id": "44626457",
"name": "路径 4",
"font_class": "a-lujing4",
"icon_id": "22187612",
"name": "EMS",
"font_class": "quexianguanli",
"unicode": "e645",
"unicode_decimal": 58949
},
{
"icon_id": "40668428",
"name": "Electrocardiogram",
"font_class": "Electrocardiogram",
"unicode": "e644",
"unicode_decimal": 58948
"icon_id": "30628754",
"name": "BCU",
"font_class": "L-chunengdianchicu",
"unicode": "e698",
"unicode_decimal": 59032
},
{
"icon_id": "44621269",
"name": "分组 10",
"font_class": "hezha",
"unicode": "e642",
"unicode_decimal": 58946
"icon_id": "8634414",
"name": "集中器",
"font_class": "jizhongqi",
"unicode": "e607",
"unicode_decimal": 58887
},
{
"icon_id": "44621265",
"name": "路径 1 (1)",
"font_class": "bisuo",
"unicode": "e643",
"unicode_decimal": 58947
"icon_id": "10074608",
"name": "充电枪",
"font_class": "chongdianqiang",
"unicode": "e650",
"unicode_decimal": 58960
},
{
"icon_id": "44621293",
"name": "离线",
"font_class": "lixian",
"unicode": "e63b",
"unicode_decimal": 58939
"icon_id": "11464298",
"name": "光伏板",
"font_class": "guangfuban",
"unicode": "e609",
"unicode_decimal": 58889
},
{
"icon_id": "44621290",
"name": "49",
"font_class": "dengpao",
"unicode": "e63c",
"unicode_decimal": 58940
"icon_id": "23266155",
"name": "装机容量",
"font_class": "zhuangjirongliang",
"unicode": "e683",
"unicode_decimal": 59011
},
{
"icon_id": "44621289",
"name": "路径 6",
"font_class": "daunlu",
"unicode": "e63e",
"unicode_decimal": 58942
"icon_id": "42232081",
"name": "charging-pile-line",
"font_class": "charging-pile-line",
"unicode": "e83c",
"unicode_decimal": 59452
},
{
"icon_id": "44621287",
"name": "mti-漏电监测",
"font_class": "loudianjiance",
"unicode": "e63f",
"unicode_decimal": 58943
"icon_id": "5961298",
"name": "电表",
"font_class": "dianbiao",
"unicode": "ec4d",
"unicode_decimal": 60493
},
{
"icon_id": "44621285",
"name": "路径 1",
"font_class": "guozai",
"unicode": "e641",
"unicode_decimal": 58945
"icon_id": "11096116",
"name": "flooding",
"font_class": "shuijinchuanganqiicon",
"unicode": "e605",
"unicode_decimal": 58885
},
{
"icon_id": "44613655",
"name": "分组 92",
"font_class": "a-fenzu92",
"unicode": "e63a",
"unicode_decimal": 58938
"icon_id": "11183352",
"name": "门禁",
"font_class": "menjin",
"unicode": "e637",
"unicode_decimal": 58935
},
{
"icon_id": "8998607",
"name": "用户",
"font_class": "yonghu2",
"unicode": "e68d",
"unicode_decimal": 59021
"icon_id": "11343949",
"name": "风速监测",
"font_class": "fengsujiance",
"unicode": "e628",
"unicode_decimal": 58920
},
{
"icon_id": "17398117",
"name": "故障",
"font_class": "guzhang",
"unicode": "e632",
"unicode_decimal": 58930
"icon_id": "11859279",
"name": "消防",
"font_class": "xiaofang",
"unicode": "e60e",
"unicode_decimal": 58894
},
{
"icon_id": "683410",
"name": "累计收益",
"font_class": "leijishouyi",
"unicode": "e631",
"unicode_decimal": 58929
"icon_id": "11894140",
"name": "光照监测设备",
"font_class": "guangzhaojianceshebei",
"unicode": "e608",
"unicode_decimal": 58888
},
{
"icon_id": "6943378",
"name": "发电量",
"font_class": "fadianliang",
"unicode": "e63d",
"unicode_decimal": 58941
"icon_id": "17654833",
"name": "视频监控",
"font_class": "shipinjiankong",
"unicode": "e638",
"unicode_decimal": 58936
},
{
"icon_id": "31328216",
"name": "风机",
"font_class": "fengji",
"unicode": "e661",
"unicode_decimal": 58977
"icon_id": "18636600",
"name": "烟感监测",
"font_class": "yanganjiance",
"unicode": "e6a8",
"unicode_decimal": 59048
},
{
"icon_id": "37843318",
"name": "光伏-copy",
"font_class": "guangfu",
"unicode": "e633",
"unicode_decimal": 58931
"icon_id": "18799877",
"name": "配电柜",
"font_class": "peidiangui",
"unicode": "e7bf",
"unicode_decimal": 59327
},
{
"icon_id": "39630640",
"name": "减碳排放",
"font_class": "jiantanpaifang",
"unicode": "e67d",
"unicode_decimal": 59005
"icon_id": "25891413",
"name": "变压器",
"font_class": "transformer",
"unicode": "e6ae",
"unicode_decimal": 59054
},
{
"icon_id": "34248516",
"name": "照明灯",
"font_class": "zhaomingdeng",
"unicode": "e993",
"unicode_decimal": 59795
},
{
"icon_id": "41574592",
"name": "温湿度监测",
"font_class": "wenshidujiance",
"unicode": "e6c8",
"unicode_decimal": 59080
},
{
"icon_id": "9027941",
"name": "add",
"font_class": "add",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "6677873",
"name": "湿度",
"font_class": "shidu",
"unicode": "e60d",
"unicode_decimal": 58893
},
{
"icon_id": "16562592",
"name": "温度计",
"font_class": "wenduji",
"unicode": "e6de",
"unicode_decimal": 59102
},
{
"icon_id": "1132463",
"name": "空调工程",
"font_class": "kongdiaogongcheng",
"unicode": "e62e",
"unicode_decimal": 58926
},
{
"icon_id": "8852945",
"name": "冷机",
"font_class": "lengji",
"unicode": "e639",
"unicode_decimal": 58937
},
{
"icon_id": "5800409",
"name": "关闭",
"font_class": "guanbi",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "45407305",
"name": "分组 3",
"font_class": "a-fenzu3",
"unicode": "e602",
"unicode_decimal": 58882
},
{
"icon_id": "45407301",
"name": "逆变器",
"font_class": "nibianqi",
"unicode": "e603",
"unicode_decimal": 58883
},
{
"icon_id": "45407312",
"name": "battery-charge-line",
"font_class": "battery-charge-line",
"unicode": "e601",
"unicode_decimal": 58881
},
{
"icon_id": "45401862",
"name": "分组 13",
"font_class": "a-fenzu13",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "44416323",
@@ -216,585 +258,11 @@
"unicode_decimal": 58928
},
{
"icon_id": "44603155",
"name": "分组 2",
"font_class": "a-fenzu2",
"unicode": "e62e",
"unicode_decimal": 58926
},
{
"icon_id": "19877417",
"name": "箭头",
"font_class": "jiantou",
"unicode": "e62d",
"unicode_decimal": 58925
},
{
"icon_id": "44581189",
"name": "分组 549",
"font_class": "a-fenzu549",
"unicode": "e62c",
"unicode_decimal": 58924
},
{
"icon_id": "4880431",
"name": "关闭",
"font_class": "guanbi1",
"unicode": "e62a",
"unicode_decimal": 58922
},
{
"icon_id": "27326599",
"name": "保护装置",
"font_class": "baohuzhuangzhi",
"unicode": "e704",
"unicode_decimal": 59140
},
{
"icon_id": "32257173",
"name": "配电房",
"font_class": "peidianfang",
"unicode": "e6ae",
"unicode_decimal": 59054
},
{
"icon_id": "35105134",
"name": "同心圆",
"font_class": "map-mark0",
"unicode": "e6ba",
"unicode_decimal": 59066
},
{
"icon_id": "40458894",
"name": "操控管理",
"font_class": "caokongguanli",
"unicode": "e62b",
"unicode_decimal": 58923
},
{
"icon_id": "40668708",
"name": "Cyber Monitoring",
"font_class": "a-CyberMonitoring",
"unicode": "e640",
"unicode_decimal": 58944
},
{
"icon_id": "40668774",
"name": "Growth Chart",
"font_class": "a-GrowthChart",
"unicode": "e650",
"unicode_decimal": 58960
},
{
"icon_id": "40668863",
"name": "Sales Growth",
"font_class": "a-SalesGrowth",
"unicode": "e668",
"unicode_decimal": 58984
},
{
"icon_id": "40668908",
"name": "Trend Chat",
"font_class": "a-TrendChat",
"unicode": "e673",
"unicode_decimal": 58995
},
{
"icon_id": "40668959",
"name": "Cloud Computer",
"font_class": "a-CloudComputer",
"unicode": "e683",
"unicode_decimal": 59011
},
{
"icon_id": "40668971",
"name": "Cloud Infrastructure",
"font_class": "a-CloudInfrastructure",
"unicode": "e687",
"unicode_decimal": 59015
},
{
"icon_id": "40668978",
"name": "Cloud Management",
"font_class": "a-CloudManagement",
"unicode": "e689",
"unicode_decimal": 59017
},
{
"icon_id": "40668994",
"name": "Cloud Security",
"font_class": "a-CloudSecurity",
"unicode": "e68e",
"unicode_decimal": 59022
},
{
"icon_id": "40669013",
"name": "Dataserver",
"font_class": "Dataserver",
"unicode": "e693",
"unicode_decimal": 59027
},
{
"icon_id": "40669125",
"name": "Volume Equalizer",
"font_class": "a-VolumeEqualizer",
"unicode": "e6c0",
"unicode_decimal": 59072
},
{
"icon_id": "40669723",
"name": "Resource Management",
"font_class": "a-ResourceManagement1",
"unicode": "e808",
"unicode_decimal": 59400
},
{
"icon_id": "40669819",
"name": "Graph Up",
"font_class": "a-GraphUp",
"unicode": "e859",
"unicode_decimal": 59481
},
{
"icon_id": "40670170",
"name": "File Cabinet",
"font_class": "a-FileCabinet",
"unicode": "e97d",
"unicode_decimal": 59773
},
{
"icon_id": "40671533",
"name": "System Setting",
"font_class": "a-SystemSetting",
"unicode": "ee41",
"unicode_decimal": 60993
},
{
"icon_id": "41578337",
"name": "同心圆-copy",
"font_class": "map-mark1",
"unicode": "ee42",
"unicode_decimal": 60994
},
{
"icon_id": "41578361",
"name": "同心圆-copy-copy",
"font_class": "map-mark2-copy",
"unicode": "ee43",
"unicode_decimal": 60995
},
{
"icon_id": "1228",
"name": "首页",
"font_class": "shouye",
"unicode": "e625",
"unicode_decimal": 58917
},
{
"icon_id": "11372763",
"name": "定位",
"font_class": "dingwei",
"unicode": "e8c4",
"unicode_decimal": 59588
},
{
"icon_id": "21164164",
"name": "关闭",
"font_class": "guanbi2",
"unicode": "e62f",
"unicode_decimal": 58927
},
{
"icon_id": "35113133",
"name": "处理状态",
"font_class": "chulizhuangtai",
"unicode": "e684",
"unicode_decimal": 59012
},
{
"icon_id": "44573704",
"name": "分组 302",
"font_class": "a-fenzu302",
"unicode": "e629",
"unicode_decimal": 58921
},
{
"icon_id": "44573686",
"name": "分组 1163",
"font_class": "a-fenzu1163",
"unicode": "e605",
"unicode_decimal": 58885
},
{
"icon_id": "44573683",
"name": "分组 449",
"font_class": "tuichu",
"unicode": "e627",
"unicode_decimal": 58919
},
{
"icon_id": "44573677",
"name": "分组 1565",
"font_class": "yonghu-yuan",
"unicode": "e628",
"unicode_decimal": 58920
},
{
"icon_id": "11372676",
"name": "密码",
"font_class": "mima",
"unicode": "e8b2",
"unicode_decimal": 59570
},
{
"icon_id": "28622327",
"name": "退出",
"font_class": "tuichu3",
"unicode": "e624",
"unicode_decimal": 58916
},
{
"icon_id": "35972990",
"name": "icon_夜间-月亮",
"font_class": "yueliang",
"unicode": "e656",
"unicode_decimal": 58966
},
{
"icon_id": "16388270",
"name": "通知",
"font_class": "tongzhi",
"unicode": "e674",
"unicode_decimal": 58996
},
{
"icon_id": "32538041",
"name": "通知",
"font_class": "tongzhi1",
"unicode": "e9cd",
"unicode_decimal": 59853
},
{
"icon_id": "42794618",
"name": "通知",
"font_class": "tongzhi2",
"unicode": "101d4",
"unicode_decimal": 66004
},
{
"icon_id": "44572036",
"name": "形状结合",
"font_class": "xingzhuangjiehe",
"unicode": "e623",
"unicode_decimal": 58915
},
{
"icon_id": "4138428",
"name": "系统管理",
"font_class": "xitongguanli",
"unicode": "e672",
"unicode_decimal": 58994
},
{
"icon_id": "5093337",
"name": "平台管理",
"font_class": "pingtaiguanli",
"unicode": "e619",
"unicode_decimal": 58905
},
{
"icon_id": "6677873",
"name": "湿度",
"font_class": "shidu",
"unicode": "e635",
"unicode_decimal": 58933
},
{
"icon_id": "17541547",
"name": "订单-全部订单",
"font_class": "dingdan-quanbudingdan",
"unicode": "e626",
"unicode_decimal": 58918
},
{
"icon_id": "17605421",
"name": "温度",
"font_class": "wendu",
"unicode": "e80f",
"unicode_decimal": 59407
},
{
"icon_id": "21135941",
"name": "光照",
"font_class": "fengtian-guangzhao",
"unicode": "e636",
"unicode_decimal": 58934
},
{
"icon_id": "25716499",
"name": "风速",
"font_class": "fengsu",
"unicode": "ea32",
"unicode_decimal": 59954
},
{
"icon_id": "35264434",
"name": "物联中心_normal",
"font_class": "wulianzhongxin_normal",
"unicode": "e620",
"unicode_decimal": 58912
},
{
"icon_id": "39347276",
"name": "icon-home",
"font_class": "icon-1",
"unicode": "e621",
"unicode_decimal": 58913
},
{
"icon_id": "41233755",
"name": "分割线",
"font_class": "fengexian",
"unicode": "e634",
"unicode_decimal": 58932
},
{
"icon_id": "44546776",
"name": "取消-抽屉",
"font_class": "quxiao",
"unicode": "e637",
"unicode_decimal": 58935
},
{
"icon_id": "44565750",
"name": "user_login",
"font_class": "a-xingzhuangjiehe1x",
"unicode": "e638",
"unicode_decimal": 58936
},
{
"icon_id": "44565801",
"name": "passwd_login",
"font_class": "a-xingzhuangjiehe1x1",
"unicode": "e639",
"unicode_decimal": 58937
},
{
"icon_id": "44572019",
"name": "形状",
"font_class": "xingzhuang1",
"unicode": "e622",
"unicode_decimal": 58914
},
{
"icon_id": "44572020",
"name": "形状",
"font_class": "xingzhuang",
"unicode": "e604",
"unicode_decimal": 58884
},
{
"icon_id": "44571957",
"name": "分组 1865",
"font_class": "a-fenzu1865",
"unicode": "e61f",
"unicode_decimal": 58911
},
{
"icon_id": "44571956",
"name": "分组 929",
"font_class": "confirm",
"unicode": "e61a",
"unicode_decimal": 58906
},
{
"icon_id": "44571953",
"name": "分组 412",
"font_class": "a-fenzu412",
"unicode": "e61b",
"unicode_decimal": 58907
},
{
"icon_id": "44571951",
"name": "分组 1753",
"font_class": "shuaxin",
"unicode": "e61c",
"unicode_decimal": 58908
},
{
"icon_id": "44571950",
"name": "分组 2121",
"font_class": "download",
"unicode": "e61d",
"unicode_decimal": 58909
},
{
"icon_id": "44571949",
"name": "分组 204",
"font_class": "upload",
"icon_id": "29049773",
"name": "全屏幕",
"font_class": "quanpingmu",
"unicode": "e61e",
"unicode_decimal": 58910
},
{
"icon_id": "44571900",
"name": "分组 463",
"font_class": "add",
"unicode": "e616",
"unicode_decimal": 58902
},
{
"icon_id": "44571899",
"name": "分组 423",
"font_class": "chongzhi",
"unicode": "e617",
"unicode_decimal": 58903
},
{
"icon_id": "44571892",
"name": "分组 1977",
"font_class": "setProtectControl",
"unicode": "e618",
"unicode_decimal": 58904
},
{
"icon_id": "44571905",
"name": "分组 610",
"font_class": "export",
"unicode": "e613",
"unicode_decimal": 58899
},
{
"icon_id": "44571903",
"name": "分组 614",
"font_class": "import",
"unicode": "e614",
"unicode_decimal": 58900
},
{
"icon_id": "44571902",
"name": "分组 249",
"font_class": "del",
"unicode": "e615",
"unicode_decimal": 58901
},
{
"icon_id": "44571893",
"name": "分组 1237",
"font_class": "setProtectValue",
"unicode": "e60e",
"unicode_decimal": 58894
},
{
"icon_id": "44571891",
"name": "分组 2237",
"font_class": "setLightMode",
"unicode": "e60f",
"unicode_decimal": 58895
},
{
"icon_id": "44571888",
"name": "分组 2085",
"font_class": "setTimeMode",
"unicode": "e610",
"unicode_decimal": 58896
},
{
"icon_id": "44571885",
"name": "分组 1739",
"font_class": "switchMode",
"unicode": "e611",
"unicode_decimal": 58897
},
{
"icon_id": "44571884",
"name": "分组 1375",
"font_class": "setTime",
"unicode": "e612",
"unicode_decimal": 58898
},
{
"icon_id": "44571897",
"name": "分组 403",
"font_class": "sousu",
"unicode": "e60c",
"unicode_decimal": 58892
},
{
"icon_id": "44571896",
"name": "分组 2241",
"font_class": "a-fenzu2241",
"unicode": "e60d",
"unicode_decimal": 58893
},
{
"icon_id": "44567819",
"name": "分组 1067",
"font_class": "openOrClose",
"unicode": "e60b",
"unicode_decimal": 58891
},
{
"icon_id": "44567629",
"name": "分组 1928",
"font_class": "zhaoce",
"unicode": "e60a",
"unicode_decimal": 58890
},
{
"icon_id": "44567660",
"name": "分组 342",
"font_class": "send",
"unicode": "e609",
"unicode_decimal": 58889
},
{
"icon_id": "44567617",
"name": "分组 5",
"font_class": "a-fenzu5",
"unicode": "e608",
"unicode_decimal": 58888
},
{
"icon_id": "44567394",
"name": "设置",
"font_class": "shezhi",
"unicode": "e607",
"unicode_decimal": 58887
},
{
"icon_id": "44567418",
"name": "分组 1565",
"font_class": "touxiang",
"unicode": "e606",
"unicode_decimal": 58886
},
{
"icon_id": "44567099",
"name": "交易账户",
"font_class": "jiaoyizhanghuguanli",
"unicode": "e602",
"unicode_decimal": 58882
},
{
"icon_id": "44567095",
"name": "营销选中",
"font_class": "yingxiaoxuanzhong",
"unicode": "e603",
"unicode_decimal": 58883
},
{
"icon_id": "44567155",
"name": "可视化",
"font_class": "a-lujing1",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "44567153",
"name": "用户",
"font_class": "a-lujing11",
"unicode": "e601",
"unicode_decimal": 58881
}
]
}

Binary file not shown.

View File

@@ -17,7 +17,7 @@
selectedRowKeys: data.selectedRowKeys,
onChange: onSelectChange
}
: false
: {}
"
:expanded-row-keys="data.newTableOpt.expand ? data.expandedKeys : null"
size="middle"
@@ -161,8 +161,11 @@ const scroll = ref({})
onMounted(async () => {
data.newColumns = [...props.columns]
data.realTableData = [...props.tableData]
await nextTick()
// console.log(props.tableH, 'props.tableH');
console.log(comtable.value.offsetHeight,'comtable.value.offsetHeight');
scroll.value = { y: comtable.value.offsetHeight - 56 }
})
@@ -220,10 +223,11 @@ defineExpose({ ...toRefs(data), loading, mountedScroll, scroll: data.scroll })
<style lang="scss" scoped>
.comtable {
border-radius: 8px;
font-size: 14px;
width: 100%;
height: 100%;
border-radius: 8px;
font-size: 14px;
display: flex;
flex-direction: column;
justify-content: space-between;
@@ -261,6 +265,10 @@ defineExpose({ ...toRefs(data), loading, mountedScroll, scroll: data.scroll })
background: transparent;
color: #fff !important;
border-bottom: none !important; /* 可选:去除底部边框 */
&.ant-table-cell-fix-right{
background: #10687d !important;
}
}
}
@@ -339,19 +347,22 @@ defineExpose({ ...toRefs(data), loading, mountedScroll, scroll: data.scroll })
top: -210px !important;
}
.ant-pagination-item {
border: 1px solid #fff;
&:not(.ant-pagination-item-active):hover {
background: #1c797a !important;
}
a {
color: #fff;
border-radius: 2px;
background: #1c797a !important;
}
}
:deep(.ant-pagination-item-ellipsis){
color: rgb(255 255 255 / 25%) !important;
}
.ant-pagination-item-active {
border: 1px solid transparent;
color: #fff;
border: none !important;
background: #1c797a !important;
}
}
@@ -369,6 +380,12 @@ defineExpose({ ...toRefs(data), loading, mountedScroll, scroll: data.scroll })
}
}
}
:deep(.ant-table-body .ant-table-cell-fix-right.ant-table-cell-fix-right-first){
background: #082e4a !important;
}
:deep(.ant-table-body) {
color:#fff;
@@ -416,4 +433,9 @@ defineExpose({ ...toRefs(data), loading, mountedScroll, scroll: data.scroll })
:deep(.ant-table-wrapper .ant-table-thead th.ant-table-column-has-sorters:hover) {
background: var(--table-select) !important;
}
:deep(.ant-table-cell-fix-right){
&::after{
border-inline-end:none !important
}
}
</style>

View File

@@ -371,7 +371,7 @@ import {
onMounted,
defineExpose
} from 'vue'
import { TreeSelect } from 'ant-design-vue'
import iconfonts from '../assets/iconfont/iconfont.json'
import validateRulesObj from '../utils/decorator'
@@ -420,7 +420,7 @@ const data = reactive({
],
treeCheckValue: null,
SHOW_PARENT: TreeSelect.SHOW_PARENT,
// SHOW_PARENT: TreeSelect.SHOW_PARENT,
loading: false,
imageUrl: ''
@@ -641,7 +641,7 @@ defineExpose({
}
.form-item {
width: 320px !important;
// width: 320px !important;
}
}
}

View File

@@ -154,8 +154,7 @@ export default {
// this.formRules = menuFormRules
break
case 'permission':
// this.detailInfos = permissionOptions
// this.formRules = permissionFormRules
break
case 'role':
@@ -175,6 +174,7 @@ export default {
case 'alarmLog':
this.detailInfos = alarmlogOptions
this.formRules = {}
break
case 'serviceApi':
this.detailInfos = serviceApiOptions
this.formRules = serviceApiFormRules

View File

@@ -35,43 +35,62 @@
<span class="value">{{ info.v }}</span>
</div>
</div>
<div v-if="item.view == 1" class="item-button">
<span class="text">实时数据</span>
<a-button type="primary" size="small" @click="openModal(item)">查看</a-button>
<div class="item-button">
<div v-if="item.view == 1">
<span class="text">实时数据</span>
<a-button type="primary" size="small" @click="openModal(item, 1)">查看</a-button>
</div>
<div v-if="item.type == 105">
<span class="text">单体信息</span>
<a-button type="primary" size="small" @click="openModal(item, 2)">查看</a-button>
</div>
</div>
</div>
<a-modal
v-model:open="modalOpen"
@ok="handleOk"
width="90%"
width="60%"
class="modal-device"
:get-container="() => $refs.device"
>
<div>
<div class="title">
<div>电流电压</div>
<img src="@/assets/images/titleLine.png" alt="" />
<div v-if="modalComponent == 1" class="modal-content">
<div class="item">
<div class="title">
电流电压
<!-- <div>电流电压</div>
<img src="@/assets/images/titleLine.png" alt="" /> -->
</div>
<div class="echarts">
<predictEcharts
:chart-options="chartOptions[0]"
:chart-data="chartData"
ref="chartRef1"
/>
</div>
</div>
<div class="echarts">
<predictEcharts
:chart-options="chartOptions[0]"
:chart-data="chartData"
ref="chartRef1"
/>
<div class="item">
<div class="title">功率</div>
<div class="echarts">
<predictEcharts
:chart-options="chartOptions[1]"
:chart-data="chartData"
ref="chartRef2"
/>
</div>
</div>
</div>
<div>
<div class="title">
<div>功率</div>
<img src="@/assets/images/titleLine.png" alt="" />
</div>
<div class="echarts">
<predictEcharts
:chart-options="chartOptions[1]"
:chart-data="chartData"
ref="chartRef2"
/>
</div>
<div class="content-table" style="height: 600px" v-else>
<a-table
:columns="columns"
:data-source="tableData"
size="small"
:scroll="{ y: 500 }"
:pagination="false"
row-class-name="no-hover-row"
row-key="id"
>
</a-table>
</div>
</a-modal>
</div>
@@ -98,19 +117,7 @@ export default {
return {
modalOpen: false,
deviceList: [],
chunengInfo: [
{ label: '运行模式', key: 'operationMode', value: '并网运行' },
{ label: '电池储能容量', key: 'batteryCapacity', value: '100kWh' },
{ label: '实时电压', key: 'voltage', value: '232.5V' },
{ label: '功率因数', key: 'powerFactor', value: '0.95' },
{ label: '实时电流', key: 'current', value: '0.01A' },
{ label: '额定电压', key: 'ratedVoltage', value: '232.5V' },
{ label: '实时功率', key: 'power', value: '0.01kW' },
{ label: '额定电流', key: 'ratedCurrent', value: '0.01A' },
{ label: '实时数据', key: 'realTimeData', value: '0.01kWh' },
{ label: '额定功率', key: 'ratedPower', value: '0.01kW' },
{ label: '冷却方式', key: 'coolingMethod', value: '风冷' }
],
chartOptions: [
{
type: 'line',
@@ -173,6 +180,52 @@ export default {
chartData: {
xdata: [],
ydata: {}
},
modalComponent: 1,
columns: [
{
title: '序号',
dataIndex: 'id',
key: 'id',
ellipsis: true,
fixed: 'left'
},
{
title: '单体SOC%',
dataIndex: 'SOC',
key: 'SOC'
},
{
title: '单体SOH%',
dataIndex: 'SOH',
key: 'SOH'
},
{
title: '单体电压V',
dataIndex: 'V',
key: 'V'
},
{
title: '单体温度(℃)',
dataIndex: 'T',
key: 'T'
},
{
title: '单体内阻(Ω)',
dataIndex: 'R_i',
key: 'R_i'
}
],
tableData: [],
pageOption: {
// pageSize: 1000,
// page: 1
},
tableOption: {
scroll: {
y: 500
},
page: false
}
}
},
@@ -191,8 +244,15 @@ export default {
},
mounted() {
this.getDeviceList()
},
methods: {
handlePagesizeChange(pageOption) {
this.pageOption.pageSize = pageOption.pageSize
this.pageOption.page = pageOption.page
this.getList()
},
getIcongont(ele) {
return deviceTypeList.find((item) => item.value == ele.type).iconfont || ''
},
@@ -226,9 +286,32 @@ export default {
})
this.chartData.ydata = res.data
this.chartData.xdata = this.generateTimePoints()
this.$refs.chartRef1.initCharts()
this.$refs.chartRef2.initCharts()
this.$nextTick(() => {
if (this.$refs.chartRef1) {
this.$refs.chartRef1.initCharts()
}
if (this.$refs.chartRef2) {
this.$refs.chartRef2.initCharts()
}
})
// this.$refs.chartRef1.initCharts()
// this.$refs.chartRef2.initCharts()
} catch (error) {
console.log(error)
}
},
//查询BCU单体信息
async getDeviceBCUDetail(item) {
try {
const res = await getReq('/queryDeviceBCUDetail', {
station_id: this.stationId,
device_id: item.device_id
})
this.tableData = res.data.map((item, index) => {
item.id = index + 1
return item
})
} catch (error) {
console.log(error)
}
@@ -249,10 +332,15 @@ export default {
console.log(error)
}
},
async openModal(item) {
await this.getDevicCharts(item)
async openModal(item, val) {
console.log(item, '=============')
this.modalComponent = val
this.modalOpen = true
if (val == 1) {
await this.getDevicCharts(item)
} else {
await this.getDeviceBCUDetail(item)
}
},
handleOk() {
this.modalOpen = false
@@ -266,15 +354,20 @@ export default {
width: 100%;
height: 100%;
margin-left: 20px;
display: grid;
display: flex;
flex-wrap: wrap;
grid-gap: 20px;
grid-template-columns: 1fr 1fr 1fr;
overflow-y: auto;
align-content: flex-start;
// grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
.device-item {
border-radius: 15px;
background: $bg2-color;
padding: 15px;
min-width: 340px;
max-width: 430px;
height: 260px;
flex: 1;
.item-header {
display: flex;
align-items: center;
@@ -290,7 +383,7 @@ export default {
background: linear-gradient(90deg, #3dfefa 0%, #2a82e4 2.96%, #27a188 100%),
linear-gradient(90deg, #3dfefa 0%, #01dfef 2.96%, #08a5ff 100%);
.iconfont {
font-size: 50px;
font-size: 45px;
}
}
.title {
@@ -332,8 +425,8 @@ export default {
grid-template-columns: 1fr 1fr;
color: #fff;
display: grid;
// line-height: 45px;
margin-top: 15px;
margin-bottom: 3px;
padding: 0 10px;
height: 120px;
overflow-y: auto;
@@ -345,7 +438,12 @@ export default {
}
}
.item-button {
width: 100%;
padding-left: 10px;
display: flex;
div {
width: calc(50% - 10px);
}
}
.text {
color: $text-color;
@@ -354,26 +452,66 @@ export default {
margin-top: 10px;
}
}
.content-table {
height: 700px;
margin-top: 40px;
:deep(.ant-table-header tr th) {
background: $table-border !important;
color: #fff;
}
:deep(.ant-table-body tr td, .ant-table-cell) {
background: $table-bg !important;
color: #fff;
}
}
}
.environment {
width: 200px;
}
:deep(.modal-device) {
.modal-device {
color: #fff;
.title {
display: flex;
font-weight: 700;
flex-direction: column;
.modal-content {
height: 700px;
.item {
// height: 300px;
.title {
color: #fff;
width: 230px;
border-bottom: 5px solid transparent;
border-image: url('@/assets/boxBottom.png') 0 0 100% 0 stretch;
}
img {
width: 232px;
height: 6px;
margin-top: 10px;
.echarts {
height: 300px;
}
}
}
.echarts {
width: 100%;
height: 280px;
}
:deep(.ant-modal-body) {
:deep(.ant-table-wrapper .ant-table-row-expand-icon) {
color: $green !important;
}
//表格行悬浮样式
.no-hover-row:hover > td {
// background-color: transparent !important;
background-color: #f0f8ff !important;
}
}
:deep(.ant-table-cell) {
&::before {
width: 0 !important;
}
}
:deep(.ant-table-thead > tr > td) {
border-bottom: none !important;
border-top: none !important;
}
:deep(.ant-table-wrapper .ant-table-tbody > tr > td) {
border-top: none !important;
}
:deep(.ant-table-wrapper .ant-table-thead > tr > th) {
border-bottom: none !important;
}
</style>

View File

@@ -0,0 +1,167 @@
<template>
<div class="title" >
<span>{{ item.name }}</span>
<img
src="@/assets/images/fillScreen.png"
alt=""
width="23px"
style="margin-left: 10px; cursor: pointer"
/>
</div>
<div :id="'divPlugin_' + index" class="plugin"></div>
<!-- <a-button @click="clickLogin">开始登录</a-button>
<a-button @click="clickStartRealPlay">开始预览</a-button> -->
</template>
<script>
export default {
props:{
index: {
type: Number,
default: 0
},
item: {
type: Object,
default: () => {}
}
},
data() {
return {
g_iWndIndex: 0,
szDeviceIdentify: '',
deviceport: '',
channels: [],
ip: '',
port: '',
username: '',
password: '',
iRtspPort: ''
}
},
mounted() {
// this.init()
},
methods: {
// 初始化
init() {
let that = this;
// 初始化插件参数及插入插件
this.$nextTick(() => {
window.WebVideoCtrl.I_InitPlugin('100%', '100%', {
bWndFull: true, // 但窗口双击全屏
iPackageType: 2, // 封装格式 无插件只能是2
iWndowType: 1, // 分屏类型 1*1 2*2 ....
bNoPlugin: true, // 开启无插件模式
cbInitPluginComplete: function () {
console.log("初始化成功!");
window.WebVideoCtrl.I_InsertOBJECTPlugin('divPlugin_' + that.index);
}
});
})
},
// 登录
clickLogin() {
if (!this.ip || !this.port) {
return
}
this.szDeviceIdentify = this.ip+"_"+this.port
WebVideoCtrl.I_Login(this.ip, 1, this.port, this.username, this.password,
{
success: function(xmlDoc) {
this.getChannelInfo() // 获取模拟通道
this.getDevicePort() // 获取端口 (影响不大)
}
})
},
// 获取模拟媒体通道
getChannelInfo() {
let self = this
if (!this.szDeviceIdentify) {
return
}
WebVideoCtrl.I_GetAnalogChannelInfo(self.szDeviceIdentify, {
async: false,
success: function (xmlDoc) {
let oChannels = $(xmlDoc).find("VideoInputChannel");
console.log('获取模拟通道成功', oChannels)
$.each(oChannels, function (i) {
let id = $(this).find("id").eq(0).text(),
name = $(this).find("name").eq(0).text();
if (!name) {
name = "Camera " + (i < 9 ? "0" + (i + 1) : (i + 1));
}
self.channels.push({
id: id,
name: name
})
});
},
error: function (status, xmlDoc) {
console.log('获取模拟通道失败', status, xmlDoc)
}
});
},
// 获取端口 不会对预览效果造成影响
getDevicePort() {
if (!this.szDeviceIdentify) {
return
}
let oPort = WebVideoCtrl.I_GetDevicePort(this.szDeviceIdentify);
console.log('获取通道端口号', oPort)
if (oPort != null) {
this.deviceport = oPort.iDevicePort;
this.iRtspPort= oPort.iRtspPort;
}
},
// 开始预览
clickStartRealPlay() {
let self = this
let oWndInfo = WebVideoCtrl.I_GetWindowStatus(self.g_iWndIndex),
iChannelID = self.channels[0].id
if (!this.szDeviceIdentify) {
return;
}
let startRealPlay = function () {
WebVideoCtrl.I_StartRealPlay(self.szDeviceIdentify, {
iRtspPort: parseInt(self.deviceport, 10), // RTSP端口必须是int
iStreamType: 1, // 码流类型1-主码流 必须int
iChannelID: parseInt(iChannelID, 10), // 播放通道 必须int
bZeroChannel: false, // 是否播放零通道 默认false
success: function () {
console.log("预览成功")
},
error: function (status, xmlDoc) {
console.log("预览失败", status, xmlDoc)
}
});
};
if (oWndInfo != null) {// 已经在播放了,先停止
WebVideoCtrl.I_Stop({
success: function () {
startRealPlay();
}
});
} else {
startRealPlay();
}
}
}
}
</script>
<style lang="scss" scoped>
.plugin{
width:100%;
height:calc(100% - 40px)
}
.title {
display: flex;
align-items: center;
font-size: 24px;
font-weight: 700;
margin-bottom: 10px;
color: #fff;
height: 30px;
}
</style>

View File

@@ -1,24 +1,14 @@
<template>
<div class="videos">
<div class="video-item" v-for="item in 8" :key="item">
<div class="title">
<span>xxxxz监控点</span>
<img
src="@/assets/images/fillScreen.png"
alt=""
width="23px"
style="margin-left: 10px; cursor: pointer"
/>
</div>
<div class="video">
<video
src="https://media.w3.org/2010/05/sintel/trailer_hd.mp4"
controls="controls"
width="100%"
height="100%"
></video>
</div>
<div class="videosPage" id="videosPage">
<div
class="content"
:class="videosPageWidth < 900 ? 'con-w2' : 'con-w1'"
v-for="(item, index) in videoList"
:key="item"
>
<haikang :index="index" :item="item" class="video"></haikang>
</div>
</div>
<div class="environment">
<div class="tab-header">
@@ -34,10 +24,8 @@
<ComTable
:columns="columns[activeTab]"
:table-data="tableDatas[activeTab]"
@handlePagesizeChange="handlePagesizeChange"
ref="comTable"
:table-option="tableOption"
:page-option="pageOption"
:table-option="{ page: false }"
>
</ComTable>
</div>
@@ -46,17 +34,14 @@
<script>
import { postReq, getReq } from '@/request/api'
import haikang from './haikang.vue'
export default {
name: '',
components: {},
components: { haikang },
props: {
stationId: {
type: String,
default: ''
},
systemType: {
type: Number,
default: 1
}
},
data() {
@@ -111,7 +96,7 @@ export default {
align: 'center'
}
],
'temp_hum': [
temp_hum: [
{
title: '点位',
dataIndex: 'pos',
@@ -158,20 +143,54 @@ export default {
tableOption: {
select: false,
page: false
}
},
//
videoList: [],
g_iWndIndex: 0,
szDeviceIdentify: '',
deviceport: '',
channels: [],
ip: '',
port: '',
username: '',
password: '',
iRtspPort: '',
videosPageWidth: ''
}
},
mounted() {
this.$nextTick(() => {
const div = document.getElementById('videosPage')
const width = div.offsetWidth
this.videosPageWidth = width
})
this.getEnvironment()
this.getDeviceList()
},
methods: {
async getEnvironment() {
try {
const res = await getReq('/queryEnvironment', { station_id: this.stationId })
console.log(res, '==============')
this.tableDatas = res.data
// this.deviceList=res.data
} catch (error) {
this.tableDatas = {}
console.log(error)
}
},
//请求运行监控系统设备信息
async getDeviceList() {
try {
const res = await getReq('/queryDevicByCategory', {
station_id: this.stationId,
category: 4
})
this.videoList = res.data.concat(res.data)
this.videoList = this.videoList.concat(this.videoList)
} catch (error) {
this.videoList = []
console.log(error)
}
}
@@ -180,30 +199,27 @@ export default {
</script>
<style lang="scss" scoped>
.videos {
.videosPage {
width: calc(100% - 470px);
height: 100%;
margin-left: 20px;
display: grid;
display: flex;
flex-wrap: wrap;
grid-gap: 20px;
grid-template-columns: 1fr 1fr;
overflow-y: auto;
.video-item {
// width: 410px;
// height: 340px;
align-content: flex-start;
justify-content: flex-start;
.content {
border-radius: 15px;
background: $bg2-color;
padding: 10px;
.title {
display: flex;
align-items: center;
font-size: 24px;
font-weight: 700;
color: #fff;
}
.video {
margin-top: 10px;
}
padding: 15px;
height: 280px;
}
.con-w1 {
width: calc((100% - 40px) / 3);
}
.con-w2 {
width: calc((100% - 20px) / 2);
}
}
.environment {
@@ -250,6 +266,7 @@ export default {
cursor: pointer;
border: 1px solid $tab-border;
border-radius: 4px;
text-align: center;
}
}
.actived {

View File

@@ -81,7 +81,7 @@ export default {
show: true,
xAxisIndex: 0, // 控制第一个X轴
start: 0, // 初始显示范围起点(百分比)
end: 20, // 初始显示范围终点(百分比)
end: 100, // 初始显示范围终点(百分比)
height: 20, // 滑动条高度
bottom: 10 // 距离底部距离
},
@@ -89,7 +89,7 @@ export default {
type: 'inside', // 内置型(鼠标滚轮/拖拽交互)
xAxisIndex: 0,
start: 0,
end: 20
end: 100
}
],
xAxis: {

View File

@@ -1,13 +1,12 @@
<!-- eslint-disable camelcase -->
<template>
<div class="policyForm">
<div class="policyForm" ref="policyForm">
<div class="title">
<div>基础信息{{ formStatus }}</div>
<div>基础信息</div>
<img src="@/assets/images/titleLine.png" alt="" />
</div>
<a-form
:model="formData"
layout="inline"
label-align="left"
:label-col="{ style: { width: '85px' } }"
:rules="rules"
@@ -30,7 +29,7 @@
</a-select>
</a-form-item>
<a-form-item label="低谷电价" class="col4" required>
<a-form-item label="低谷电价" class="col2" required>
<a-input-number
:precision="2"
v-model:value="formData.price[0]"
@@ -39,7 +38,7 @@
/>
</a-form-item>
<a-form-item label="平段电价" class="col4" required>
<a-form-item label="平段电价" class="col2" required>
<a-input-number
:precision="2"
v-model:value="formData.price[1]"
@@ -48,7 +47,7 @@
/>
</a-form-item>
<a-form-item label="高峰电价" class="col4" required>
<a-form-item label="高峰电价" class="col2" required>
<a-input-number
:precision="2"
v-model:value="formData.price[2]"
@@ -57,7 +56,7 @@
/>
</a-form-item>
<a-form-item label="尖峰电价" class="col4" required>
<a-form-item label="尖峰电价" class="col2" required>
<a-input-number
:precision="2"
v-model:value="formData.price[3]"
@@ -179,7 +178,7 @@
</a-form-item>
</div>
<a-form-item label="策略描述" class="col2">
<a-form-item label="策略描述" class="col1">
<a-textarea v-model:value="formData.describe" :disabled="formStatus == 'read'" />
</a-form-item>
<a-form-item label="是否启用" class="col2">
@@ -193,7 +192,8 @@
</a-form-item>
</a-form>
</div>
<a-modal v-model:open="periodModal" @ok="handlePeriodModalOk">
<a-modal
v-model:open="periodModal" @ok="handlePeriodModalOk" :get-container="()=>$refs.policyForm">
<a-form
ref="periodRef"
:model="periodForm"
@@ -240,6 +240,7 @@ export default {
default: 'add'
}
},
emits:['closeModal'],
data() {
return {
data: [],
@@ -308,8 +309,8 @@ export default {
handler(newVal) {
if (this.formStatus == 'add') {
this.formData = {
type: '5',
name: '测试',
type: '',
name: '',
price: [0, 0, 0, 0],
period1: [],
period5: [
@@ -321,14 +322,7 @@ export default {
chargeType: null,
dischargeType: null
}
// {
// charge_time: [],
// discharge_time: [],
// charge_power: '',
// discharge_power: '',
// chargeType: 1,
// dischargeType:1
// }
],
is_open: false,
chargePolicy: 1
@@ -474,6 +468,7 @@ export default {
console.log(this.formData)
},
handleAdd() {
if(this.formStatus=='read') return
this.periodModal = true
this.periodForm = {}
},
@@ -481,7 +476,6 @@ export default {
this.$refs.periodRef
.validateFields()
.then((res) => {
console.log(this.formData.period1,'=============')
const target = this.formData.period1.find((item) => item.month == this.periodForm.month)
if (target) {
@@ -574,15 +568,18 @@ export default {
img {
width: 232px;
height: 6px;
margin-top: 10px;
// margin-top: 10px;
}
}
}
.ant-form {
display: flex;
flex-wrap:wrap ;
.charge {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
// display: grid;
// grid-template-columns: 1fr 1fr;
// gap: 10px;
.box {
border: 1px solid $table-border;
padding-left: 10px;
@@ -590,6 +587,7 @@ export default {
padding-bottom: 10px;
border-radius: 10px;
color: #fff;
margin-bottom: 10px;
}
}
}
@@ -615,7 +613,7 @@ export default {
.ant-select,
.ant-input-affix-wrapper,
.ant-input-number {
width: 150px;
width: 200px;
}
textarea {
.ant-input {
@@ -627,6 +625,7 @@ export default {
}
.col4 {
width: 25%;
min-width: 270px;
}
.col1 {
width: 100%;
@@ -645,32 +644,10 @@ export default {
:deep(.ant-table-wrapper .ant-table-cell){
background:none!important;
}
// /* 禁用行的 hover 过渡动画 */
// .ant-table-tbody > tr.ant-table-row {
// transition: none !important;
// }
:deep(.ant-table-cell){
&::before{
width: 0 !important;
}
}
// /* 确保 hover 背景色完全透明 */
// .ant-table-tbody > tr.ant-table-row:hover > td {
// background-color: transparent !important;
// }
// .ant-table-wrapper .ant-table-tbody > tr.ant-table-row:hover > td {
// background-color: transparent !important;
// }
// :deep(.ant-table-tbody > tr.ant-table-row:hover > td) {
// background-color: transparent !important;
// }
// :deep(.ant-table-tbody) {
// color: var(--theme-text-default) !important;
// > tr {
// &:hover {
// > .ant-table-cell {
// background: none !important;
// }
// }
// }
// }
</style>

View File

@@ -3,21 +3,52 @@ import App from './App.vue'
import router from './router'
import store from './store'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/reset.css'
import '@/style/index.scss'
// import '@/assets/iconfont/iconfont.css'
import * as echarts from 'echarts'
// import 'ant-design-vue/dist/reset.css'
import 'ant-design-vue/dist/reset.css'
import '@/assets/iconfont/iconfont.css'
import * as echarts from 'echarts/core'
import { BarChart, LineChart } from 'echarts/charts'
import {
TitleComponent,
TooltipComponent,
GridComponent,
DatasetComponent,
LegendComponent,
TransformComponent,
DataZoomComponent
} from 'echarts/components'
// 标签自动布局、全局过渡动画等特性
import { LabelLayout, UniversalTransition } from 'echarts/features'
// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { CanvasRenderer } from 'echarts/renderers'
import { setWidth } from '@/utils/column'
import { getBtns } from '@/utils/btnList'
import { message, Modal } from 'ant-design-vue'
import VueTianditu from 'vue-tianditu'
import SearchBox from '@/components/SearchBox.vue'
import ComTable from '@/components/ComTable.vue'
import OperateCom from '@/components/OperateCom'
import TreeTable from '@/components/TreeTable.vue'
// 注册必须的组件
echarts.use([
TitleComponent,
TooltipComponent,
GridComponent,
DatasetComponent,
TransformComponent,
DataZoomComponent,
BarChart,
LineChart,
LabelLayout,
UniversalTransition,
CanvasRenderer,
LegendComponent
])
const app = createApp(App)
app.component('SearchBox', SearchBox)
@@ -31,4 +62,6 @@ app.config.globalProperties.$getBtns = getBtns
app.config.globalProperties.$message = message
app.config.globalProperties.$Modal = Modal
app.use(store).use(router).use(Antd).use(VueTianditu).mount('#app')
app.use(store).use(router)
app.use(VueTianditu).mount('#app')

View File

@@ -1,6 +1,6 @@
import axios from 'axios'
import openNotification from '../utils/notification'
import { message } from 'ant-design-vue'
// import { message } from 'ant-design-vue'
const service = axios.create({
baseURL: '/api',

View File

@@ -89,13 +89,13 @@ export const routes = [
component: () => import(/* webpackChunkName: "system" */ '@/views/system/device.vue')
},
{
name: 'alarmLog',
path: 'log',
name: 'alarmlog',
path: 'alarmlog',
title: '告警日志',
component: () => import(/* webpackChunkName: "system" */ '@/views/system/alarmLog.vue')
},
{
name: 'sylog',
name: 'syslog',
path: 'syslog',
title: '系统日志',
component: () => import(/* webpackChunkName: "system" */ '@/views/system/log.vue')

View File

@@ -16,7 +16,10 @@ $table-bg: #072e4a;
$page-border: #cad2dd;
//级联器样式,下拉选择器样式输入框等。。。
.ant-switch {
background: #00fffb;
background: #b1c4c4;
}
.ant-switch.ant-switch-checked{
background: #00fffb
}
.ant-switch .ant-switch-handle::before {
@@ -52,9 +55,13 @@ $page-border: #cad2dd;
.ant-picker-separator {
color: #fff !important;
}
.ant-picker-input::placeholder {
.ant-picker-input input::placeholder {
color: #ffffff3b !important;
}
.ant-picker-suffix{
color: #ffffff !important;
}
}
.ant-input-affix-wrapper {
.ant-input {
@@ -90,7 +97,8 @@ $page-border: #cad2dd;
&:disabled {
border: none;
color: #fff;
// color: #fff;
background: $btn-confirm;
}
}
.btn-del {

View File

@@ -16,123 +16,123 @@ export const policyTypes = [
export const deviceTypeList = [
{
value: 1,
value: '1',
label: '变压器',
iconfont: 'icon-transformer'
},
{
value: 2,
value: '2',
label: '配电柜',
iconfont: 'icon-dianpingcai'
},
{
value: 3,
value: '3',
label: '电表',
iconfont: 'icon-dianbiao'
},
{
value: 4,
value: '4',
label: '门禁',
iconfont: 'icon-menjin'
},
{
value: 5,
value: '5',
label: '空调',
iconfont: 'icon-kongdiaogongcheng'
},
{
value: 6,
value: '6',
label: '照明',
iconfont: 'icon-zhaomingdeng'
},
{
value: 7,
value: '7',
label: '消防',
iconfont: 'icon-xiaofang'
},
{
value: 8,
value: '8',
label: '光照监测设备',
iconfont: 'icon-guangzhaojianceshebei'
},
{
value: 9,
value: '9',
label: '风速监测设备',
iconfont: 'icon-fengsujiance'
},
{
value: 10,
value: '10',
label: '温湿度监测设备',
iconfont: 'icon-wenshidujiance'
},
{
value: 11,
value: '11',
label: '烟感监测设备',
iconfont: 'icon-yanganjiance'
},
{
value: 12,
value: '12',
label: '水浸传感器',
iconfont: 'icon-shuijinchuanganqiicon'
},
{
value: 13,
value: '13',
label: '视频监控',
iconfont: 'icon-shipinjiankong'
},
{
value: 100,
value: '100',
label: '储能预制舱',
iconfont: 'icon-jizhuangxiang'
},
{
value: 101,
value: '101',
label: 'EMS',
iconfont: 'icon-quexianguanli'
},
{
value: 102,
value: '102',
label: 'PCS',
iconfont: 'icon-nengyuanguanli'
},
{
value: 103,
value: '103',
label: 'PCU',
iconfont: 'icon-bianyaqi'
},
{
value: 104,
value: '104',
label: 'BMS',
iconfont: 'icon-BMSchunengdianchi'
iconfont: 'icon-chunengguankong'
},
{
value: 105,
value: '105',
label: 'BCU',
iconfont: 'icon-L-chunengdianchicu'
},
{
value: 106,
value: '106',
label: '充电桩',
iconfont: 'icon-charging-pile-line'
},
{
value: 107,
value: '107',
label: '充电枪',
iconfont: 'icon-chongdianqiang'
},
{
value: 108,
value: '108',
label: '集中器',
iconfont: 'icon-jizhongqi'
},
{
value: 109,
value: '109',
label: '光伏板',
iconfont: 'icon-guangfuban'
},
{
value: 110,
label: '风力发电机光感',
value: '110',
label: '风力发电机',
iconfont: 'icon-zhuangjirongliang'
}
]

View File

@@ -1,4 +1,4 @@
import { notification } from 'ant-design-vue'
// import { notification } from 'ant-design-vue'
import { h } from 'vue'
import {
CheckCircleFilled,
@@ -41,7 +41,7 @@ const notiInfo = {
}
}
const openNotification = ({ name, type, status, desc = '' }) => {
notification[status]({
this.$notification[status]({
placement: 'bottomRight',
message: notiInfo[status].iconMessage,
description: desc || option.names[name] + option.types[type] + option.status[status],

View File

@@ -82,6 +82,8 @@ export default {
this.$message.success('登录成功')
localStorage.setItem('token', res.token)
localStorage.setItem('permission',JSON.stringify( res.permission) )
localStorage.setItem('account',JSON.stringify( res.account) )
this.$router.push('/')
}

View File

@@ -1,6 +1,18 @@
<template>
<div class="main">
<div class="header"></div>
<div class="header">
<span class="time">
<span class="text" style="margin-right: 15px"> {{ dateVal }} </span>
<span class="text" style="width: 80px;">{{ currentTime }}</span>
<span class="text">{{ weekVal }}</span>
</span>
<span class="title text"> 能源站监控与运行管理系统 </span>
<span class="user">
<span style="margin-right: 15px"> {{ user }}</span>
<span class="iconfont icon-tuichu" @click="logout"></span>
</span>
</div>
<div class="page">
<div class="subMenu" v-if="subMenu.length > 0">
@@ -35,7 +47,9 @@
<script>
// @ is an alias to /src
import moment from 'moment'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
export default {
name: 'MainView',
components: {},
@@ -195,6 +209,44 @@ export default {
.header {
width: 100%;
height: 70px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
.text {
background: linear-gradient(
180deg,
rgb(255, 255, 255) 0%,
rgb(227, 254, 255) 33.17%,
rgb(35 190 195) 100%
);
-webkit-background-clip: text; /* 兼容 WebKit 浏览器 */
background-clip: text;
color: transparent; /* 必须设置为透明 */
display: inline-block; /* 确保背景裁剪生效 */
line-height: 80px;
font-size: 18px;
}
.title{
font-size: 40px;
position: absolute;
left: 50%;
transform: translateX(-50%);
margin-top: 10px;
}
.user{
font-weight: 700;
font-size: 18px;
.icon-tuichu{
cursor: pointer;
}
}
.time{
font-weight: 700;
}
}
.subMenu {
display: flex;
@@ -221,7 +273,7 @@ export default {
}
.page {
width: calc(100% - 20px);
height: calc(100% - 70px - 65px - 40px);
height: calc(100% - 70px - 60px - 40px);
margin: 20px 10px;
border-radius: 20px;
}
@@ -229,12 +281,13 @@ export default {
height: 100%;
}
.subcontent {
height: calc(100% - 46px);
height: calc(100% - 56px);
}
.menu {
position: absolute;
width: 100%;
bottom: 15px;
bottom: 10px;
height: 50px;
// height: 150px;
display: flex;
justify-content: center;
@@ -248,6 +301,7 @@ export default {
color: #fff;
font-size: 20px;
font-weight: 700;
border: 1px solid #ffffff00;
cursor: pointer;
margin: 0 35px;
}

View File

@@ -15,11 +15,13 @@
<div class="search-item">
<span>运行模式</span>
<a-select v-model:value="workMode" style="width: 220px">
<a-select-option :value="item.value" v-for="item in workModes">{{ item.label }}</a-select-option>
<a-select-option :value="item.value" v-for="item in workModes">{{
item.label
}}</a-select-option>
</a-select>
</div>
<div class="search-item">
<a-button type="primary">下发</a-button>
<a-button type="primary" @click="handleDispatch">下发</a-button>
</div>
</div>
</div>
@@ -33,13 +35,14 @@
:class="systemType == system.systemType ? 'active' : ''"
>
<span class="name">{{ system.name }}</span>
<span class="des">边缘网关{{ system.power }} W</span>
<span class="des">总有功功率(台区){{ system.num }}</span>
<span class="des" v-for="title in system.titles" :key="title.v"
>{{ title.v }}{{ system[title.key] }}{{ title.sufix }}
</span>
</div>
</div>
<div class="container">
<videos v-if="systemType == 4" :station-id="selectStationId"/>
<device v-else :station-id="selectStationId" :system-type="systemType"/>
<videos v-if="systemType == 4" :station-id="selectStationId" />
<device v-else :station-id="selectStationId" :system-type="systemType" />
</div>
</div>
</div>
@@ -62,10 +65,14 @@ export default {
systemType: 1,
value: [],
stations: [],
selectStationId:'',
selectStationId: '',
systems: [
{
name: '储能系统',
titles: [
{ v: '边缘网关', key: 'num' },
{ v: '总有功功率(台区)', key: 'power', sufix: 'kW' }
],
power: 60,
num: 62,
systemType: 1
@@ -74,99 +81,125 @@ export default {
name: '充电系统',
power: 60,
num: 62,
systemType: 2
systemType: 2,
titles: [
{ v: '总功率', key: 'power', sufix: 'kW' },
{ v: '数量', key: 'num' }
]
},
{
name: '光伏系统',
power: 60,
num: 62,
systemType: 3
systemType: 3,
titles: [
{ v: '总功率', key: 'power', sufix: 'kW' },
{ v: '数量', key: 'num' }
]
},
{
name: '安防系统',
power: 60,
num: 62,
systemType: 4
systemType: 4,
titles: [
{ v: '总功率', key: 'power', sufix: 'kW' },
{ v: '数量', key: 'num' }
]
}
// {
// name: "储能系统4",
// }
],
workMode:'',
workModes:[
workMode: '',
workModes: [
// 0手动1峰谷套利2增网配容3应急供电4并网保电5自定时段
{
value:0,
label:'手动'
value: 0,
label: '手动'
},
{
value:1,
label:'峰谷套利'
value: 1,
label: '峰谷套利'
},
{
value:2,
label:'增网配容'
value: 2,
label: '增网配容'
},
{
value:3,
label:'应急供电'
value: 3,
label: '应急供电'
},
{
value:4,
label:'并网保电'
value: 4,
label: '并网保电'
},
{
value:5,
label:'自定时段'
value: 5,
label: '自定时段'
}
],
deviceGroup:[]
deviceGroup: []
}
},
mounted() {
this.getStations()
},
methods: {
//下发
async handleDispatch() {
console.log(this.workMode)
try {
const res = await postReq('/updateStation', {
station_id: this.selectStationId,
work_mode: this.workMode
})
if (res.errcode == 0) {
this.$message.success('下发成功')
}
} catch (error) {
this.$message.error('下发失败')
}
},
//场站切换
getStationChange(val){
console.log(val);
getStationChange(val) {
console.log(val)
this.getStationAttr()
},
//查询场站列表
async getStations() {
try {
const res = await getReq('/queryStationList', { page: 0, 'page_size': 10000 })
const res = await getReq('/queryStationList', { page: 0, page_size: 10000 })
this.stations = res.data
this.selectStationId=this.stations[0]['station_id']
this.selectStationId = this.stations[0]['station_id']
this.getStationAttr()
} catch (error) {
this.stations = []
this.selectStationId=''
this.selectStationId = ''
this.$message.error(error.message)
}
},
// 查询场站的参数
async getStationAttr(){
async getStationAttr() {
try {
const res = await getReq('/queryStationOverview', { station_id: this.selectStationId })
res.data.device_group.forEach((Element,index) => {
this.systems[index].num=Element.count
this.systems[index].power=Element.power
});
this.workMode=res.data.work_mode
res.data.device_group.forEach((Element, index) => {
this.systems[index].num = Element.count
this.systems[index].power = Element.power
})
this.workMode = res.data.work_mode
} catch (error) {
this.deviceGroup = []
this.workMode=''
this.workMode = ''
// this.$message.error(error.errmsg)
}
},
chooseStation(system) {
console.log(system, 'system')
this.systemType = system.systemType
}
}
@@ -176,7 +209,8 @@ export default {
<style scoped lang="scss">
@import url(@/style/color.scss);
.monitor {
width: 100%;
// width: 100%;
// height: calc(100% - 40px);
height: 100%;
padding: 20px;
background: $bg1-color;
@@ -207,24 +241,20 @@ export default {
display: flex;
justify-content: space-between;
.stations {
min-width: 155px;
max-width: 235px;
width: 13%;
height: 100%;
display: grid;
border-radius: 12px;
background: $bg2-color;
padding: 15px 0;
overflow-y: auto;
padding-top: 15px;
grid-template-rows: repeat(auto-fit, minmax(140px, 4fr));
.station-item {
width: calc(100% - 30px);
flex: 1;
margin: 0 15px 15px 15px;
border-radius: 12px;
min-width: 150px;
width: 180px;
display: flex;
flex-direction: column;
color: #fff;
padding: 10px 15px;
padding: 10px 10px;
cursor: pointer;
.name {
@@ -236,6 +266,11 @@ export default {
font-size: 14px;
font-weight: 600;
line-height: 40px;
display: inline-block;
max-width: 160px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.active {
@@ -243,7 +278,7 @@ export default {
}
}
.container {
width: 100%;
width: calc(100% - 200px);
display: flex;
justify-content: space-between;
}

View File

@@ -1,9 +1,6 @@
<template>
<div class="alarmLog">
<searchBox
:btn-option-list="btnOptionList"
@operateForm="operateForm"
></searchBox>
<!-- <searchBox :btn-option-list="btnOptionList" @operateForm="operateForm"></searchBox> -->
<div class="content-table">
<ComTable
@@ -11,16 +8,17 @@
:table-data="tableData"
@handlePagesizeChange="handlePagesizeChange"
ref="comTable"
:table-option="tableOption"
:page-option="pageOption"
>
<template #type="record">
<span>{{ ['其它','系统日志','操作日志','设备日志'][record.type] }}</span>
<span>{{ ['其它', '系统日志', '操作日志', '设备日志'][record.type] }}</span>
</template>
<template #status="record">
<span><a-tag :color="record.status ? 'red' : 'green'">{{
record.status ? '异常' : '正常'
}}</a-tag></span>
<span
><a-tag :color="record.status==0 ? 'red' : 'green'">{{
record.status==0 ? '异常' : '正常'
}}</a-tag></span
>
</template>
<template #action="record">
@@ -28,7 +26,7 @@
</template>
</ComTable>
</div>
<a-modal v-model:open="formModal" width="750px" style="top: 20px" :footer="null">
<a-modal v-model:open="formModal" width="750px" style="top: 20px" :footer="null">
<!-- action:edit add -->
<EditCom
:record="formState"
@@ -46,11 +44,11 @@ import { getReq, postReq } from '@/request/api.js'
import EditCom from '@/components/EditCom.vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
import { Modal } from 'ant-design-vue'
export default {
name: '',
components: {
EditCom,
EditCom
},
props: {},
data() {
@@ -63,7 +61,8 @@ export default {
page: 1
},
btnOptionList: [],
paramsDate: {}
paramsDate: {},
tableData: []
}
},
computed: {},
@@ -79,7 +78,7 @@ export default {
},
mounted() {
this.operateList = this.$getBtns(['查看', '删除'])
this.operateList = this.$getBtns(['查看'])
// this.btnOptionList = this.$getBtns(['新增'])
this.getList()
},
@@ -118,22 +117,21 @@ export default {
},
async operateForm(type, record = {}) {
this.formStatus = type
if(type=='edit'||type=='read'){
if (type == 'edit' || type == 'read') {
await this.getRuleFormInfo(record)
this.formModal = true
this.formState = record
}else if(type=='del'){
this.handleDelete([record.device_id],this.getList)
}else if(type=='back'){
} else if (type == 'del') {
this.handleDelete([record.device_id], this.getList)
} else if (type == 'back') {
this.formModal = false
this.getList()
}
},
// 删除操作
async handleDelete(id,callback) {
async handleDelete(id, callback) {
const that = this
Modal.confirm({
title: '你确认删除数据吗?',
@@ -141,10 +139,10 @@ export default {
async onOk() {
try {
const res = await getReq('/deleteUser',{user_id:id})
const res = await getReq('/deleteUser', { user_id: id })
if (res.errcode === 0) {
this.$message.success(res.errmsg)
this.pageOption.page=1
this.pageOption.page = 1
callback()
} else {
throw res
@@ -160,8 +158,6 @@ export default {
})
},
async getRuleFormInfo(record) {
const row = record || {}
for (let e of alarmlogOptions) {
@@ -182,8 +178,6 @@ export default {
// const attrs=JSON.parse(row.attrs||"{}")
// e.ruleForm[i.key] = attrs[i.key]
// }
}
}
},
@@ -199,10 +193,10 @@ export default {
<style lang="scss" scoped>
.alarmLog {
height: 100%;
padding: 20px;
.content-table {
height: calc(100% - 70px);
padding: 10px;
height: 100%;
}
}
</style>

View File

@@ -18,8 +18,8 @@
<span>{{ getType(record.type) }}</span>
</template>
<template #isEnable="record">
<span><a-tag :color="record.is_open ? 'green' : 'red'">{{
record.is_open ? '启用' : '禁用'
<span><a-tag :color="record.is_open==1 ? 'green' : 'red'">{{
record.is_open==1 ? '启用' : '禁用'
}}</a-tag></span>
</template>
@@ -48,7 +48,7 @@ import OperateCom from '@/components/OperateCom'
import EditCom from '@/components/EditCom.vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
import { Modal } from 'ant-design-vue'
import searchBox from '@/components/SearchBox.vue'
import {deviceTypeList} from '@/utils/config'
export default {
@@ -170,7 +170,7 @@ export default {
// 删除操作
async handleDelete(id,callback) {
const that = this
Modal.confirm({
this.$Modal.confirm({
title: '你确认删除数据吗?',
icon: createVNode(ExclamationCircleOutlined),
@@ -203,7 +203,7 @@ export default {
if (i.key === 'id') {
e.ruleForm.id = row.id
} else if (i.key === 'is_open') {
e.ruleForm.is_open = Boolean(row.is_open)
e.ruleForm.is_open = Boolean(Number(row.is_open))
} else {
e.ruleForm[i.key] = row[i.key] || ''
}
@@ -232,10 +232,12 @@ export default {
<style lang="scss" scoped>
.device {
height: 100%;
padding: 0 10px;
.content-table {
height: calc(100% - 70px);
padding: 10px;
width: 100%;
height: calc(100% - 90px);
padding: 0 10px;
}
}
</style>

View File

@@ -1,9 +1,6 @@
<template>
<div class="alarmlog">
<searchBox
:btn-option-list="btnOptionList"
@operateForm="operateForm"
></searchBox>
<div class="syslog">
<!-- <searchBox :btn-option-list="btnOptionList" @operateForm="operateForm"></searchBox> -->
<div class="content-table">
<ComTable
@@ -11,12 +8,14 @@
:table-data="tableData"
@handlePagesizeChange="handlePagesizeChange"
ref="comTable"
:table-option="tableOption"
:page-option="pageOption"
>
<template #gender="record">
<!-- 0:; 1: -->
<span>{{ ['女', '男'][record.gender] }}</span>
<template #status="record">
<span>
<a-tag :color="record.status==0 ? 'red' : 'green'">{{
record.status==0 ? '异常' : '正常'
}}</a-tag>
</span>
</template>
<template #action="record">
@@ -37,7 +36,7 @@
</template>
<script>
import { columnList, userOptions } from '../../../public/config/columnList'
import { columnList, syslogOptions } from '../../../public/config/columnList'
import { getReq, postReq } from '@/request/api.js'
import EditCom from '@/components/EditCom.vue'
@@ -60,13 +59,14 @@ export default {
page: 1
},
btnOptionList: [],
paramsDate: {}
paramsDate: {},
tableData: []
}
},
computed: {},
created() {
let info = []
let col = columnList.find((i) => i.page == 'alarmlog').columns
let col = columnList.find((i) => i.page == 'syslog').columns
if (col.length) {
col.forEach((item) => {
info.push(this.$setWidth(item))
@@ -76,8 +76,8 @@ export default {
},
mounted() {
this.operateList = this.$getBtns(['查看', '修改', '删除'])
this.btnOptionList = this.$getBtns(['新增'])
this.operateList = this.$getBtns(['查看'])
// this.btnOptionList = this.$getBtns(['新增'])
this.getList()
},
@@ -94,7 +94,7 @@ export default {
}
try {
const res = await getReq('/queryUserList', params)
const res = await getReq('/querySystemLogList', params)
if (res.errcode === 0) {
this.$refs.comTable.loading = false
@@ -113,41 +113,25 @@ export default {
//统一处理报错提示
}
},
operateForm(type, record = {}) {
console.log(record, record.id, 'rrrrrrrrrr')
async operateForm(type, record = {}) {
this.formStatus = type
switch (type) {
case 'add':
this.formModal = true
this.formState = {}
this.getRuleFormInfo()
break
case 'edit':
case 'read':
if (type == 'edit' || type == 'read') {
await this.getRuleFormInfo(record)
this.formModal = true
this.formState = record
this.getRuleFormInfo(record)
break
case 'del':
this.handleDelete([record.user_id], this.getList)
break
case 'back':
} else if (type == 'del') {
this.handleDelete([record.device_id], this.getList)
} else if (type == 'back') {
this.formModal = false
this.getList()
break
default:
break
}
},
// 删除操作
async handleDelete(id, callback) {
const that = this
Modal.confirm({
this.$Modal.confirm({
title: '你确认删除数据吗?',
icon: createVNode(ExclamationCircleOutlined),
@@ -172,27 +156,13 @@ export default {
})
},
async getRuleFormInfo(record) {
function getInfo(data, url) {
return new Promise((reslove, reject) => {
getReq(data, url).then((res) => {
reslove(res.data)
})
})
}
const row = record || {}
let row = {}
if (record && record.user_id) {
// row = await getInfo({ id: record.id },'/queryUserList')
this.record = record
row = record
// this.type='edit'
for (let e of syslogOptions) {
for (let i of e.list) {
e.ruleForm[i.key] = row[i.key] || ''
}
}
userOptions.forEach((e, index) => {
e.list.forEach((i) => {
e.ruleForm[i.key] = row ? row[i.key] : ''
e.ruleForm.id = row.id
})
})
},
handlePagesizeChange(pageOption) {
this.pageOption.pageSize = pageOption.pageSize
@@ -204,12 +174,12 @@ export default {
</script>
<style lang="scss" scoped>
.user {
.syslog {
height: 100%;
padding: 20px;
.content-table {
height: calc(100% - 70px);
padding: 10px;
height: 100%;
}
}
</style>

View File

@@ -43,12 +43,12 @@
</template>
<script>
import { columnList, permissionOptions } from '../../../public/config/columnList'
import { columnList } from '../../../public/config/columnList'
import { getReq, postReq } from '@/request/api.js'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
import { Modal } from 'ant-design-vue'
export default {
name: '',
components: {
@@ -198,13 +198,7 @@ export default {
row = record
// this.type='edit'
}
permissionOptions.forEach((e, index) => {
e.list.forEach((i) => {
e.ruleForm[i.key] = row ? row[i.key] : ''
e.ruleForm.id = row.id
})
})
},
handlePagesizeChange(pageOption) {
this.pageOption.pageSize = pageOption.pageSize

View File

@@ -14,7 +14,7 @@
<div>{{ getPolicyType(record.type) }}</div>
</template>
<template #isOpen="record">
<a-tag :color="record.is_open == 1 ? '#2db7f5' : '#f50'">{{
<a-tag :color="record.is_open == 1 ? 'green' : 'red'">{{
record.is_open == 1 ? '启用' : '禁用'
}}</a-tag>
</template>
@@ -27,8 +27,8 @@
<div>
<a-modal
v-model:open="formModal"
width="70%"
style="top: 20px"
width="900px"
style="top: 20px;"
:footer="null"
:get-container="() => $refs.policy"
>
@@ -47,6 +47,7 @@ export default {
name: '',
components: { policyForm },
props: {},
data() {
return {
formModal: false,
@@ -57,21 +58,18 @@ export default {
title: '策略ID',
dataIndex: 'policy_id',
key: 'policyId',
width: 120,
ellipsis: true
},
{
title: '策略名称',
dataIndex: 'name',
key: 'name',
width: 120,
ellipsis: true
},
{
title: '策略类型',
dataIndex: 'type', //策略类型1削峰套利2需求响应3自发自用
key: 'type',
width: 120,
ellipsis: true,
scopedSlots: { customRender: 'type' }
},
@@ -79,7 +77,6 @@ export default {
title: '策略描述',
dataIndex: 'describe',
key: 'describe',
width: 120,
ellipsis: true
},
{
@@ -93,7 +90,6 @@ export default {
title: '是否启用',
dataIndex: 'is_open',
key: 'isOpen',
width: 120,
ellipsis: true,
scopedSlots: { customRender: 'isOpen' }
},
@@ -102,8 +98,8 @@ export default {
title: '操作',
dataIndex: 'action',
key: 'action',
width: 150,
ellipsis: true,
fixed:'right',
scopedSlots: { customRender: 'action' }
}
],
@@ -128,16 +124,18 @@ export default {
},
methods: {
async getTableList() {
this.$refs.comTable.loading = true
try {
this.$refs.comTable.loading = false
const res = await getReq('/queryPolicyList', {
page: this.pageOption.page,
page_size: this.pageOption.pageSize
})
console.log(res)
this.tableData = res.data
this.pageOption.count = res.count
} catch (error) {
console.log(error)
this.$refs.comTable.loading = false
}
},
getPolicyType(type) {
@@ -232,12 +230,13 @@ export default {
<style lang="scss" scoped>
.policy {
width: 100%;
// width: 100%;
height: 100%;
padding: 0 15px;
padding: 0 10px;
.content-table {
width: 100%;
height: calc(100% - 90px);
padding: 0 10px;
}
}
</style>

View File

@@ -51,7 +51,7 @@ import OperateCom from '@/components/OperateCom'
import EditCom from '@/components/EditCom.vue'
import { ConsoleSqlOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
import { Modal } from 'ant-design-vue'
import searchBox from '@/components/SearchBox.vue'
export default {
name: '',

View File

@@ -44,7 +44,7 @@ import { getReq, postReq } from '@/request/api.js'
import EditCom from '@/components/EditCom.vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
import { Modal } from 'ant-design-vue'
import searchBox from '@/components/SearchBox.vue'
export default {
name: '',

View File

@@ -51,7 +51,7 @@ import OperateCom from '@/components/OperateCom'
import EditCom from '@/components/EditCom.vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
import { Modal } from 'ant-design-vue'
import searchBox from '@/components/SearchBox.vue'
export default {
name: '',

View File

@@ -41,20 +41,14 @@
<script>
import { columnList, userOptions } from '../../../public/config/columnList'
import { getReq, postReq } from '@/request/api.js'
import ComTable from '@/components/ComTable'
import OperateCom from '@/components/OperateCom'
import EditCom from '@/components/EditCom.vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import { createVNode } from 'vue'
import { Modal } from 'ant-design-vue'
import searchBox from '@/components/SearchBox.vue'
import { createVNode } from 'vue'
export default {
name: '',
components: {
searchBox,
EditCom,
ComTable,
OperateCom
},
props: {},
data() {
@@ -157,7 +151,7 @@ export default {
// 删除操作
async handleDelete(id,callback) {
const that = this
Modal.confirm({
this.$Modal.confirm({
title: '你确认删除数据吗?',
icon: createVNode(ExclamationCircleOutlined),