whychdw
2021-07-12 93b6df2e438900eee4ecf67fa7a74013b428ed98
添加版本号
1个文件已添加
7个文件已修改
798 ■■■■■ 已修改文件
src/assets/images/qwh-logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/js/config.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PageHeader.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/chart/BarChart.vue 539 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataMager/historyInfoMager.vue 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/dataTest/history.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/login.vue 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
基础算法.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/qwh-logo.png
src/assets/js/config.js
@@ -2,8 +2,8 @@
    logo: {
        label: '平台logo',
        des: '显示平台logo状态',
        fileName: 'gjdw',       // gjdw, nfdw, gjdx
        value: false,
        fileName: 'qwh',       // gjdw, nfdw, gjdx, qwh
        value: true,
    },
    uKey: {
        label: 'uKey',
@@ -30,4 +30,9 @@
        des: '启动充放电测试使用人脸识别',
        value: false,
    },
    copyRight: {
        label: '版权声明',
        des: '版权所有:北京清网华科技股份有限公司 ç”µè¯ï¼š021-75498(路电)',
        value: true,
    },
}
src/components/PageHeader.vue
@@ -127,6 +127,7 @@
    import nfdw from '@/assets/images/nfdw-log.png';
    import gjdw from '@/assets/images/gjdw-log.png';
    import gjdx from '@/assets/images/gjdx-log.png';
    import qwh from '@/assets/images/qwh-logo.png';
    import {
        Timeout
    } from '../assets/js/tools'
@@ -801,6 +802,9 @@
                    case "gjdx":
                        image = gjdx;
                        break;
                    case 'qwh':
                        image = qwh;
                        break;
                }
                return image;
            }
src/components/chart/BarChart.vue
@@ -1,12 +1,12 @@
<template>
  <div class="e-chart-root" @dblclick="fullScreen" :class="{'full-screen': fullScreenState}">
    <div class="e-chart-container">
      <div class="e-chart" :id="id" :ref="id"></div>
      <div class="e-chart-tools" v-if="showTools">
        <i class="iconfont el-icon-yanjingkejian" :class="eleClass" @click="changeEyeState"></i>
      </div>
    <div class="e-chart-root" @dblclick="fullScreen" :class="{'full-screen': fullScreenState}">
        <div class="e-chart-container">
            <div class="e-chart" :id="id" :ref="id"></div>
            <div class="e-chart-tools" v-if="showTools">
                <i class="iconfont el-icon-yanjingkejian" :class="eleClass" @click="changeEyeState"></i>
            </div>
        </div>
    </div>
  </div>
</template>
<script>
@@ -31,263 +31,264 @@
import "./theme/transparent"
export default {
  props: {
    id: {
      type: String,
      required: true,
    },
    unit: {
      type: String,
      default: '',
    },
    showTools: {
      type: Boolean,
      default: false,
    },
    showLabel: {
      type: Boolean,
      default: true,
    },
    maxColor: {
      type: String,
      default: 'green',
    },
    minColor: {
      type: String,
      default: 'red',
    },
    rightMenu: {
      type: Boolean,
      default: false,
    }
  },
  data() {
    return {
      fullScreenState: false,
      eye: true,
    }
  },
  methods: {
    getOption(opt) {
      let unit = this.unit;
      let alarmVol = this.getAlarmVal(opt);
      // æ•´ä½“配置项
      let option = {
        animation: false,
        color: this.getColor(opt),
        title: this.getTitle(opt),
        tooltip: {
          trigger: 'axis',
          axisPointer: {            // åæ ‡è½´æŒ‡ç¤ºå™¨ï¼Œåæ ‡è½´è§¦å‘有效
            type: 'shadow'        // é»˜è®¤ä¸ºç›´çº¿ï¼Œå¯é€‰ä¸ºï¼š'line' | 'shadow'
          },
          formatter(params) {
            var res = params[0].name + '<br/>';
            params.forEach(item => {
              res += item.marker;
              res += item.seriesName;
              res += ' : ' + item.data[1] + unit + '</br>';
            });
            return res;
          }
    props: {
        id: {
            type: String,
            required: true,
        },
        grid: {
          left: '1%',
          right: '1%',
          bottom: '2%',
          containLabel: true
        unit: {
            type: String,
            default: '',
        },
        xAxis: [
          {
            type: 'category',
          }
        ],
        yAxis: [
          {
            type: 'value',
            splitLine: {
              show: true,
            },
            min: function (data) {
              let min = data.min;
              if (min == Infinity) {
                return 0;
              }
              min = alarmVol.low == false ? min : alarmVol.low < min ? alarmVol.low : min;
              return Number((min - min * 0.2).toFixed(2));
            },
            max: function (data) {
              let max = data.max;
              if (max == -Infinity) {
                max = 1;
              }
              max = alarmVol.high == false ? max : alarmVol.high > max ? alarmVol.high : max;
              return Number((max + max * 0.2).toFixed(2));
            }
          }
        ],
        series: this.getSeries(opt),
      };
      return option;
    },
    setOption(opt) {
      let option = this.getOption(opt);
      // æ¸…理画布
      this.$G.chartManage.get(this.id).clear();
      // è®¾ç½®é…ç½®é¡¹
      this.$G.chartManage.get(this.id).setOption(option);
    },
    getAlarmVal(opt) {
      let result = {
        low: false,
        high: false
      };
      if (opt && opt.series) {
        let markLine = opt.series[0].markLine;
        if (opt.series && markLine && markLine.data) {
          result.low = markLine.data[0].yAxis;
          result.high = markLine.data[1].yAxis;
        showTools: {
            type: Boolean,
            default: false,
        },
        showLabel: {
            type: Boolean,
            default: true,
        },
        maxColor: {
            type: String,
            default: 'green',
        },
        minColor: {
            type: String,
            default: 'red',
        },
        rightMenu: {
            type: Boolean,
            default: false,
        }
      }
      return result;
    },
    getColor(opt) {     // é…ç½®è‡ªå®šä¹‰é¢œè‰²
      // æœªé…ç½®è‡ªå®šä¹‰é¢œè‰²
      if (!opt || !opt.color) {
        return []
      }
      // è¿”回颜色
      return opt.color;
    },
    getTitle(opt) {     // é…ç½®æ ‡é¢˜
      // æœªé…ç½®æ ‡é¢˜
      if (!opt || !opt.title) {
    data() {
        return {
          show: false,
        };
      }
      // è¿”回标题
      return opt.title;
            fullScreenState: false,
            eye: true,
        }
    },
    getSeries(opt) {    // è®¾ç½®series
      // æœªé…ç½®series
      if (!opt || !opt.series) {
        return [];
      }
      let minColor = this.minColor;
      let maxColor = this.maxColor;
      // è®¾ç½®é…ç½®é¡¹
      let series = opt.series.map(item => {
        let max = this.getMax(item.data);
        let min = this.getMin(item.data);
        item.type = "bar";
    methods: {
        getOption(opt) {
            let unit = this.unit;
            let alarmVol = this.getAlarmVal(opt);
            // æ•´ä½“配置项
            let option = {
                animation: false,
                color: this.getColor(opt),
                title: this.getTitle(opt),
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {            // åæ ‡è½´æŒ‡ç¤ºå™¨ï¼Œåæ ‡è½´è§¦å‘有效
                        type: 'shadow'        // é»˜è®¤ä¸ºç›´çº¿ï¼Œå¯é€‰ä¸ºï¼š'line' | 'shadow'
                    },
                    formatter(params) {
                        var res = params[0].name + '<br/>';
                        params.forEach(item => {
                            res += item.marker;
                            res += item.seriesName;
                            res += ' : ' + item.data[1] + unit + '</br>';
                        });
                        return res;
                    }
                },
                grid: {
                    left: '1%',
                    right: '1%',
                    bottom: '2%',
                    containLabel: true
                },
                xAxis: [
                    {
                        type: 'category',
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        splitLine: {
                            show: true,
                        },
                        min: function (data) {
                            let min = data.min;
                            if (min == Infinity) {
                                return 0;
                            }
                            min = alarmVol.low == false ? min : alarmVol.low < min ? alarmVol.low : min;
                            return Number((min - min * 0.2).toFixed(2));
                        },
                        max: function (data) {
                            let max = data.max;
                            if (max == -Infinity) {
                                max = 1;
                            }
                            max = alarmVol.high == false ? max : alarmVol.high > max ? alarmVol.high : max;
                            return Number((max + max * 0.2).toFixed(2));
                        }
                    }
                ],
                series: this.getSeries(opt),
            };
            return option;
        },
        setOption(opt) {
            let option = this.getOption(opt);
            // æ¸…理画布
            this.$G.chartManage.get(this.id).clear();
            // è®¾ç½®é…ç½®é¡¹
            this.$G.chartManage.get(this.id).setOption(option);
        },
        getAlarmVal(opt) {
            let result = {
                low: false,
                high: false
            };
            if (opt && opt.series && opt.series.length !=0 ) {
        // æ˜¾ç¤ºæ•°æ®
        item.label = {
          show: this.showChartLabel,
          position: 'top',
          color: '#fff',
        };
        // è®¾ç½®é¢œè‰²
        if (item.hColor) {
          // è®¾ç½®èƒŒæ™¯
          item.itemStyle = {
            color: item.hColor,
          };
        } else {
          // è®¾ç½®èƒŒæ™¯
          item.itemStyle = {
            color: function (value) {
              let val = value.value[1];
              if (val == max) {
                return maxColor;
              } else if (val == min) {
                return minColor;
              }
                let markLine = opt.series[0].markLine;
                if (opt.series && markLine && markLine.data) {
                    result.low = markLine.data[0].yAxis;
                    result.high = markLine.data[1].yAxis;
                }
            }
          };
            return result;
        },
        getColor(opt) {     // é…ç½®è‡ªå®šä¹‰é¢œè‰²
                            // æœªé…ç½®è‡ªå®šä¹‰é¢œè‰²
            if (!opt || !opt.color) {
                return []
            }
            // è¿”回颜色
            return opt.color;
        },
        getTitle(opt) {     // é…ç½®æ ‡é¢˜
                            // æœªé…ç½®æ ‡é¢˜
            if (!opt || !opt.title) {
                return {
                    show: false,
                };
            }
            // è¿”回标题
            return opt.title;
        },
        getSeries(opt) {    // è®¾ç½®series
            // æœªé…ç½®series
            if (!opt || !opt.series) {
                return [];
            }
            let minColor = this.minColor;
            let maxColor = this.maxColor;
            // è®¾ç½®é…ç½®é¡¹
            let series = opt.series.map(item => {
                let max = this.getMax(item.data);
                let min = this.getMin(item.data);
                item.type = "bar";
                // æ˜¾ç¤ºæ•°æ®
                item.label = {
                    show: this.showChartLabel,
                    position: 'top',
                    color: '#fff',
                };
                // è®¾ç½®é¢œè‰²
                if (item.hColor) {
                    // è®¾ç½®èƒŒæ™¯
                    item.itemStyle = {
                        color: item.hColor,
                    };
                } else {
                    // è®¾ç½®èƒŒæ™¯
                    item.itemStyle = {
                        color: function (value) {
                            let val = value.value[1];
                            if (val == max) {
                                return maxColor;
                            } else if (val == min) {
                                return minColor;
                            }
                        }
                    };
                }
                return item;
            });
            // è¿”回
            return series;
        },
        getMax(list) {
            let arr = list.map(item => {
                return item[1];
            });
            return Math.max.apply(null, arr);
        },
        getMin(list) {
            let arr = list.map(item => {
                return item[1];
            });
            return Math.min.apply(null, arr);
        },
        fullScreen() {
            this.fullScreenState = this.fullScreenState ? false : true;
            this.$nextTick(() => {
                // é‡ç½®å¤§å°
                this.$G.chartManage.get(this.id).resize();
            });
        },
        resize() {
            // é‡ç½®å¤§å°
            this.$G.chartManage.get(this.id).resize();
        },
        changeEyeState() {
            this.eye = this.eye ? false : true;
            let option = this.$G.chartManage.get(this.id).getOption();
            this.setOption(option);
        }
        return item;
      });
      // è¿”回
      return series;
    },
    getMax(list) {
      let arr = list.map(item => {
        return item[1];
      });
      return Math.max.apply(null, arr);
    },
    getMin(list) {
      let arr = list.map(item => {
        return item[1];
      });
      return Math.min.apply(null, arr);
    },
    fullScreen() {
      this.fullScreenState = this.fullScreenState ? false : true;
      this.$nextTick(() => {
        // é‡ç½®å¤§å°
        this.$G.chartManage.get(this.id).resize();
      });
    },
    resize() {
      // é‡ç½®å¤§å°
      this.$G.chartManage.get(this.id).resize();
    },
    changeEyeState() {
      this.eye = this.eye ? false : true;
      let option = this.$G.chartManage.get(this.id).getOption();
      this.setOption(option);
    }
  },
  computed: {
    eleClass() {
      return this.eye ? "el-icon-yanjingkejian" : "el-icon-yanjing-bukejian";
    },
    showChartLabel() {
      return this.showLabel && this.eye ? true : false;
    }
  },
  mounted() {
    let self = this;
    this.$refs[this.id].oncontextmenu = function() {
      return false;
    }
    // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
    let chart = ECharts.init(this.$refs[this.id], 'transparent');
    // å°†å›¾è¡¨æ·»åŠ åˆ°å›¾è¡¨ç®¡ç†
    this.$G.chartManage.set(this.id, chart);
    // è®¾ç½®é…ç½®é¡¹
    this.setOption();
    // ç‚¹å‡»äº‹ä»¶
    chart.getZr().on('mousedown', function(params) {
      if(params.which == 3) {
        let pointInPixel= [params.offsetX, params.offsetY];
        if (chart.containPixel('grid',pointInPixel)) {
          /*单击图标X轴数据,打开详情*/
          let xIndex = chart.convertFromPixel({seriesIndex:0},pointInPixel)[0];
          self.$emit('right-click', {
            x: params.event.clientX+16,
            y: params.event.clientY+16,
            xIndex: xIndex
          });
    computed: {
        eleClass() {
            return this.eye ? "el-icon-yanjingkejian" : "el-icon-yanjing-bukejian";
        },
        showChartLabel() {
            return this.showLabel && this.eye ? true : false;
        }
      }
    },
    mounted() {
        let self = this;
        this.$refs[this.id].oncontextmenu = function () {
            return false;
        }
        // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
        let chart = ECharts.init(this.$refs[this.id], 'transparent');
        // å°†å›¾è¡¨æ·»åŠ åˆ°å›¾è¡¨ç®¡ç†
        this.$G.chartManage.set(this.id, chart);
        // è®¾ç½®é…ç½®é¡¹
        this.setOption();
    });
        // ç‚¹å‡»äº‹ä»¶
        chart.getZr().on('mousedown', function (params) {
            if (params.which == 3) {
                let pointInPixel = [params.offsetX, params.offsetY];
                if (chart.containPixel('grid', pointInPixel)) {
                    /*单击图标X轴数据,打开详情*/
                    let xIndex = chart.convertFromPixel({seriesIndex: 0}, pointInPixel)[0];
                    self.$emit('right-click', {
                        x: params.event.clientX + 16,
                        y: params.event.clientY + 16,
                        xIndex: xIndex
                    });
                }
            }
    // æ ¹æ®åŠŸèƒ½å±è”½å³é”®èœå•
    if (this.rightMenu) {
      document.getElementById(this.id).oncontextmenu = function () {
        return false;
      };
        });
        // æ ¹æ®åŠŸèƒ½å±è”½å³é”®èœå•
        if (this.rightMenu) {
            document.getElementById(this.id).oncontextmenu = function () {
                return false;
            };
        }
    }
  }
}
</script>
@@ -295,39 +296,39 @@
.e-chart-root,
.e-chart-container,
.e-chart {
  height: 100%;
  box-sizing: border-box;
    height: 100%;
    box-sizing: border-box;
}
.e-chart-root.full-screen .e-chart-container {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-size: 100% 100%;
  z-index: 9999;
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-size: 100% 100%;
    z-index: 9999;
}
.e-chart-tools {
  position: absolute;
  top: 16px;
  right: 16px;
  z-index: 9;
    position: absolute;
    top: 16px;
    right: 16px;
    z-index: 9;
}
.e-chart-tools .iconfont {
  margin-left: 8px;
  font-size: 24px;
  cursor: pointer;
  color: #00fefe;
    margin-left: 8px;
    font-size: 24px;
    cursor: pointer;
    color: #00fefe;
}
.e-chart-tools .iconfont:hover {
  color: #04b1b1;
    color: #04b1b1;
}
.e-chart-tools .iconfont:active {
  color: #FF0000;
    color: #FF0000;
}
</style>
src/pages/dataMager/historyInfoMager.vue
@@ -292,6 +292,7 @@
            dataSeachroms(data)
                .then((res) => {
                    let result = JSON.parse(res.data.result);
                    console.log(result);
                    // å…³é—­ç­‰å¾…框
                    this.$layer.close(loading);
                    if (result.code == 1 || result.length > 0) {
@@ -313,6 +314,32 @@
                            } else if (binf != undefined) {
                                obj.category = 2;
                            }
                            // è®¾ç½®å……放电名称
                            if(tdata != undefined) {
                                if (item.test_type == 3) {
                                    // æµ‹è¯•类型为放电
                                    if (item.test_starttype == 3) {
                                        //  æ ¸å®¹æ”¾ç”µ
                                        obj.testLabel = 'herongDischarge';
                                    } else {
                                        // ç›‘测放电
                                        obj.testLabel = 'jianceDischarge';
                                    }
                                } else if (item.test_type == 2) {
                                    // æµ‹è¯•类型为充电
                                    if (item.test_starttype == 3) {
                                        //  æ ¸å®¹å……电
                                        obj.testLabel = 'herongCharge';
                                    } else {
                                        // ç›‘测充电
                                        obj.testLabel = 'jianceCharge';
                                    }
                                }
                            }else {
                                obj.testLabel = '';
                            }
                            if (item.smodel.code == 1) {
                                obj.sum = item.smodel.sum; //落后单体数量
@@ -469,7 +496,11 @@
                "&home=" +
                StationName[3] +
                "&batt=" +
                data.BattGroupId;
                data.BattGroupId+
                "&testLabel="+
                data.testLabel+
                "&testStartTime="+
                data.test_starttime;
            window.parent.postMessage(
                {
                    cmd: "syncPage",
src/pages/dataTest/history.vue
@@ -258,6 +258,7 @@
        baseURL = baseURL ? baseURL : "";
        return {
            loading: false,
            isNew: true,
            showComparison: false,
            data: [],
            batt: {},
@@ -392,6 +393,7 @@
            this.init();
            // èŽ·å–å……æ”¾ç”µè®°å½•
            this.searchBattTestData();
            this.isNew = false;
        },
        // åˆå§‹åŒ–页面数据
        init() {
src/pages/login.vue
@@ -1,82 +1,88 @@
<template>
    <div class="login_container">
        <div class="sliderCon">
            <div class="logo">
                <img src="../assets/images/yuanchang_logo2.png" class="logoImg">
                {{ platformName }}
    <div class="login-wrapper">
        <div class="login_container">
            <div class="sliderCon">
                <div class="logo">
                    <img :src="logoUrl" class="logoImg">
                    {{ platformName }}
                </div>
                <img src="../assets/images/login-img.png" class="picImg">
            </div>
            <img src="../assets/images/login-img.png" class="picImg">
            <div class="login_box">
                <div class="title">用户登录</div>
                <!--  ç™»å½•表单区 -->
                <el-form label-width="0px" class="login_from" :model="loginForm" ref="loginFormRef">
                    <!-- ç”¨æˆ·å -->
                    <el-form-item prop="username">
                        <el-input class="input" v-model="loginForm.username" prefix-icon="el-icon-user"
                                  @keyup.enter.native.stop="onSubmit"></el-input>
                    </el-form-item>
                    <!-- å¯†ç  -->
                    <el-form-item prop="password">
                        <el-input class="input" v-model="loginForm.password" prefix-icon="el-icon-lock" type="password"
                                  @keyup.enter.native.stop="onSubmit"></el-input>
                    </el-form-item>
                    <el-form-item class="btns">
                        <el-button :loading="loading" type="primary" @click="onSubmit" class="loginBtn">登录</el-button>
                    </el-form-item>
                    <el-form-item v-if="!register">
                        <a href="javascript:;" @click="license.show = true"
                           class="regBtn">平台注册</a>
                    </el-form-item>
                    <el-form-item v-else>
                        <a href="javascript:;" class="regBtn">已激活</a>
                    </el-form-item>
                </el-form>
            </div>
            <!-- license弹框输入面板 -->
            <el-dialog
                title="平台注册提示" width="600px"
                :visible.sync="license.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <add-license v-if="license.show" :visible.sync="license.show"></add-license>
            </el-dialog>
            <!-- äººè„¸ç™»é™† -->
            <el-dialog
                title="人脸登陆" width="480px"
                :visible.sync="face.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <face-login v-if="face.show" :visible.sync="face.show" @success="checkServeLicense"></face-login>
            </el-dialog>
            <!-- åŠŸèƒ½æè¿° -->
            <el-dialog
                title="配置清单" width="960px"
                :visible.sync="config.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <config-info></config-info>
            </el-dialog>
            <!--  uKey的验证 -->
            <el-dialog
                title="uKey绑定" width="750px"
                :visible.sync="uKey.show"
                :close-on-click-modal="false" top="0"
                class="dialog-center" :modal-append-to-body="false">
                <ukey-bind v-if="uKey.show" :visible.sync="uKey.show"></ukey-bind>
            </el-dialog>
            <div class="tools-container">
                <div class="tools-item" :class="uKeyState" v-if="$CFG.uKey.value" @click="uKey.show=true">
                    <span class="iconfont el-icon-CombinedShape"></span>
                </div>
                <div class="tools-item" v-if="$CFG.face.value" @click="face.show=true">
                    <span class="iconfont el-icon-renlianshibie"></span>
                </div>
                <div class="tools-item" @click="config.show=true">
                    <span class="iconfont el-icon-peizhi"></span>
                </div>
            </div>
        </div>
        <div class="login_box">
            <div class="title">用户登录</div>
            <!--  ç™»å½•表单区 -->
            <el-form label-width="0px" class="login_from" :model="loginForm" ref="loginFormRef">
                <!-- ç”¨æˆ·å -->
                <el-form-item prop="username">
                    <el-input class="input" v-model="loginForm.username" prefix-icon="el-icon-user"
                              @keyup.enter.native.stop="onSubmit"></el-input>
                </el-form-item>
                <!-- å¯†ç  -->
                <el-form-item prop="password">
                    <el-input class="input" v-model="loginForm.password" prefix-icon="el-icon-lock" type="password"
                              @keyup.enter.native.stop="onSubmit"></el-input>
                </el-form-item>
                <el-form-item class="btns">
                    <el-button :loading="loading" type="primary" @click="onSubmit" class="loginBtn">登录</el-button>
                </el-form-item>
                <el-form-item v-if="!register">
                    <a href="javascript:;" @click="license.show = true"
                       class="regBtn">平台注册</a>
                </el-form-item>
                <el-form-item v-else>
                    <a href="javascript:;" class="regBtn">已激活</a>
                </el-form-item>
            </el-form>
        </div>
        <!-- license弹框输入面板 -->
        <el-dialog
            title="平台注册提示" width="600px"
            :visible.sync="license.show"
            :close-on-click-modal="false" top="0"
            class="dialog-center" :modal-append-to-body="false">
            <add-license v-if="license.show" :visible.sync="license.show"></add-license>
        </el-dialog>
        <!-- äººè„¸ç™»é™† -->
        <el-dialog
            title="人脸登陆" width="480px"
            :visible.sync="face.show"
            :close-on-click-modal="false" top="0"
            class="dialog-center" :modal-append-to-body="false">
            <face-login v-if="face.show" :visible.sync="face.show" @success="checkServeLicense"></face-login>
        </el-dialog>
        <!-- åŠŸèƒ½æè¿° -->
        <el-dialog
            title="配置清单" width="960px"
            :visible.sync="config.show"
            :close-on-click-modal="false" top="0"
            class="dialog-center" :modal-append-to-body="false">
            <config-info></config-info>
        </el-dialog>
        <!--  uKey的验证 -->
        <el-dialog
            title="uKey绑定" width="750px"
            :visible.sync="uKey.show"
            :close-on-click-modal="false" top="0"
            class="dialog-center" :modal-append-to-body="false">
            <ukey-bind v-if="uKey.show" :visible.sync="uKey.show"></ukey-bind>
        </el-dialog>
        <div class="tools-container">
            <div class="tools-item" :class="uKeyState" v-if="$CFG.uKey.value" @click="uKey.show=true">
                <span class="iconfont el-icon-CombinedShape"></span>
            </div>
            <div class="tools-item" v-if="$CFG.face.value" @click="face.show=true">
                <span class="iconfont el-icon-renlianshibie"></span>
            </div>
            <div class="tools-item" @click="config.show=true">
                <span class="iconfont el-icon-peizhi"></span>
            </div>
        <div class="copy-right" v-if="copyRight.value">
            {{copyRight.des}}
        </div>
    </div>
</template>
<script>
@@ -89,6 +95,12 @@
} from "@/assets/js/api";
import ConfigInfo from "@/pages/configInfo";
import UkeyBind from "@/components/UKeyBind";
import nfdw from '@/assets/images/nfdw-log.png';
import gjdw from '@/assets/images/gjdw-log.png';
import gjdx from '@/assets/images/gjdx-log.png';
import qwh from '@/assets/images/qwh-logo.png';
import yuanchange from '@/assets/images/yuanchang_logo2.png';
import platform from "@/assets/js/config";
export default {
    components: {
@@ -125,6 +137,8 @@
                show: false,
            },
            platformName: "",
            logoConfig: platform.logo,
            copyRight: platform.copyRight,
        };
    },
    created() {
@@ -303,6 +317,25 @@
            }
            return cls;
        },
        logoUrl() {
            let logoConfig = this.logoConfig;
            let image = yuanchange;
            switch (logoConfig.fileName) {
                case "nfdw":
                    image = nfdw
                    break;
                case "gjdx":
                    image = gjdx;
                    break;
                case 'qwh':
                    image = qwh;
                    break;
                case 'gjdw':
                    image = gjdw;
                    break;
            }
            return image;
        }
    },
    mounted() {
        // åˆå§‹åŒ–user的信息
@@ -335,6 +368,11 @@
</style>
<style lang="less" scoped>
.login-wrapper {
    position: relative;
    width: 100%;
    height: 100%;
}
/* ç™»å½•大盒子背景 */
.login_container {
    width: 100%;
@@ -387,7 +425,7 @@
        font-weight: bold;
        .logoImg {
            height: 40px;
            height: 60px;
            margin-right: 14px;
        }
    }
@@ -489,5 +527,17 @@
        width: 416px;
        height: 376px;
    }
}
</style>
<style scoped>
.copy-right {
    position: absolute;
    width: 100%;
    text-align: center;
    bottom: 16px;
    z-index: 999;
    font-size: 12px;
}
</style>
»ù´¡Ëã·¨.md
@@ -7,4 +7,15 @@
```
公式:续航时长=最后一笔数据的实际容量/负载电流
保留位数:(需要转化为后备时间)
```
3.告警规则系数计算方式
```
告警类型          æ ¡å‡†å€¼
组端/在线电压    æ ‡ç§°ç”µåŽ‹*单体数量(48)
电流  æ ‡ç§°å®¹é‡/10
单体电压         æ ‡ç§°ç”µåŽ‹
单体温度   25
单体内阻         ï¼ˆ1*(标称电压/2)/(标称容量/100))
连接条阻抗  0.2
漏液电压  1
```