whychdw
2020-07-10 ecea5541abe3c9ddd8dcecd115b52f9897f54cdf
提交内容
8个文件已修改
2个文件已添加
679 ■■■■■ 已修改文件
package-lock.json 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/services/index.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/services/system/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/css/common.css 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/excel/Blob.js 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/excel/Export2Excel.js 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/batt-list/history-page.vue 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/batt-list/real-time-page.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/system/index.vue 177 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json
@@ -1894,6 +1894,15 @@
      "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=",
      "dev": true
    },
    "adler-32": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
      "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
      "requires": {
        "exit-on-epipe": "~1.0.1",
        "printj": "~1.1.0"
      }
    },
    "aggregate-error": {
      "version": "3.0.1",
      "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.0.1.tgz",
@@ -2913,6 +2922,16 @@
      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
      "dev": true
    },
    "cfb": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz",
      "integrity": "sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ==",
      "requires": {
        "adler-32": "~1.2.0",
        "crc-32": "~1.2.0",
        "printj": "~1.1.2"
      }
    },
    "chalk": {
      "version": "2.4.2",
      "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1585815676992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
@@ -3204,6 +3223,22 @@
        "@types/q": "^1.5.1",
        "chalk": "^2.4.1",
        "q": "^1.1.2"
      }
    },
    "codepage": {
      "version": "1.14.0",
      "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
      "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
      "requires": {
        "commander": "~2.14.1",
        "exit-on-epipe": "~1.0.1"
      },
      "dependencies": {
        "commander": {
          "version": "2.14.1",
          "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
          "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
        }
      }
    },
    "collection-visit": {
@@ -3578,6 +3613,15 @@
            "json-parse-better-errors": "^1.0.1"
          }
        }
      }
    },
    "crc-32": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
      "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
      "requires": {
        "exit-on-epipe": "~1.0.1",
        "printj": "~1.1.0"
      }
    },
    "create-ecdh": {
@@ -4819,6 +4863,11 @@
        "strip-eof": "^1.0.0"
      }
    },
    "exit-on-epipe": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
    },
    "expand-brackets": {
      "version": "2.1.4",
      "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
@@ -5137,6 +5186,11 @@
        "schema-utils": "^2.5.0"
      }
    },
    "file-saver": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
      "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw=="
    },
    "file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz",
@@ -5311,6 +5365,11 @@
      "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz",
      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
      "dev": true
    },
    "frac": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
    },
    "fragment-cache": {
      "version": "0.2.1",
@@ -8630,6 +8689,11 @@
        "utila": "~0.4"
      }
    },
    "printj": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
    },
    "private": {
      "version": "0.1.8",
      "resolved": "https://registry.npm.taobao.org/private/download/private-0.1.8.tgz",
@@ -8825,6 +8889,12 @@
        "iconv-lite": "0.4.24",
        "unpipe": "1.0.0"
      }
    },
    "raw-loader": {
      "version": "0.5.1",
      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
      "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
      "dev": true
    },
    "read-pkg": {
      "version": "5.2.0",
@@ -9252,6 +9322,15 @@
      "requires": {
        "ajv": "^6.12.0",
        "ajv-keywords": "^3.4.1"
      }
    },
    "script-loader": {
      "version": "0.7.2",
      "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
      "dev": true,
      "requires": {
        "raw-loader": "~0.5.1"
      }
    },
    "select-hose": {
@@ -9832,6 +9911,14 @@
      "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz",
      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
      "dev": true
    },
    "ssf": {
      "version": "0.11.2",
      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
      "requires": {
        "frac": "~1.1.2"
      }
    },
    "sshpk": {
      "version": "1.16.1",
@@ -11548,6 +11635,16 @@
      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
      "dev": true
    },
    "wmf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
    },
    "word": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
    },
    "word-wrap": {
      "version": "1.2.3",
      "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
@@ -11625,6 +11722,29 @@
        "async-limiter": "~1.0.0"
      }
    },
    "xlsx": {
      "version": "0.16.3",
      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.3.tgz",
      "integrity": "sha512-LInZ1OK6vpe+Em8XDZ5gDH3WixARwxI7UWc+3chLeafI6gUwECEgL43k4Tjbs1uRfkxpM7wQFy5DLE0hFBRqRw==",
      "requires": {
        "adler-32": "~1.2.0",
        "cfb": "^1.1.4",
        "codepage": "~1.14.0",
        "commander": "~2.17.1",
        "crc-32": "~1.2.0",
        "exit-on-epipe": "~1.0.1",
        "ssf": "~0.11.2",
        "wmf": "~1.0.1",
        "word": "~0.3.0"
      },
      "dependencies": {
        "commander": {
          "version": "2.17.1",
          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
        }
      }
    },
    "xtend": {
      "version": "4.0.2",
      "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz",
package.json
@@ -13,10 +13,12 @@
    "echarts": "^4.8.0",
    "el-tree-transfer": "^2.2.9",
    "element-ui": "^2.13.2",
    "file-saver": "^2.0.2",
    "vue": "^2.6.11",
    "vue-layer": "^1.2.0",
    "vue-router": "^3.3.1",
    "vuex": "^3.4.0"
    "vuex": "^3.4.0",
    "xlsx": "^0.16.3"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^4.4.0",
@@ -25,6 +27,7 @@
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.2.2",
    "script-loader": "^0.7.2",
    "vue-template-compiler": "^2.6.11"
  },
  "eslintConfig": {
src/api/services/index.js
@@ -4,6 +4,7 @@
import login from './login'
import power from './power'
import file from './file'
import system from './system'
export default {
    baoji,
@@ -12,4 +13,5 @@
    login,
    power,
    file,
    system,
}
src/api/services/system/index.js
@@ -8,7 +8,7 @@
    searchUserLog(data) {
        return axios({
            method: 'post',
            url: 'User_infAction!add',
            url: 'User_logAction!serchByCondition',
            data: 'json='+JSON.stringify(data),
        });
    },
src/assets/css/common.css
@@ -102,4 +102,21 @@
    -webkit-box-shadow: inset 0 0 0.05rem rgba(0,0,0,0.2);
    border-radius: 0.1rem;
    background: #003d64;
}
.page-tools {
    vertical-align: middle;
    padding-right: 0.08rem;
    user-select: none;
}
.page-tools .iconfont {
    margin-left: 0.08rem;
    font-size: 0.22rem;
}
.page-tools .iconfont:hover {
    cursor: pointer;
    color: #d8d3d3;
}
.page-tools .iconfont:active {
    color: #409EFF;
}
src/excel/Blob.js
New file
@@ -0,0 +1,180 @@
/* eslint-disable */
/* Blob.js
 * A Blob implementation.
 * 2014-05-27
 *
 * By Eli Grey, http://eligrey.com
 * By Devin Samarin, https://github.com/eboyjr
 * License: X11/MIT
 *   See LICENSE.md
 */
/*global self, unescape */
/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
 plusplus: true */
/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
const blob = function (view) {
    "use strict";
    view.URL = view.URL || view.webkitURL;
    if (view.Blob && view.URL) {
        try {
            new Blob;
            return;
        } catch (e) {}
    }
    // Internally we use a BlobBuilder implementation to base Blob off of
    // in order to support older browsers that only have BlobBuilder
    var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
            var
                get_class = function(object) {
                    return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
                }
                , FakeBlobBuilder = function BlobBuilder() {
                    this.data = [];
                }
                , FakeBlob = function Blob(data, type, encoding) {
                    this.data = data;
                    this.size = data.length;
                    this.type = type;
                    this.encoding = encoding;
                }
                , FBB_proto = FakeBlobBuilder.prototype
                , FB_proto = FakeBlob.prototype
                , FileReaderSync = view.FileReaderSync
                , FileException = function(type) {
                    this.code = this[this.name = type];
                }
                , file_ex_codes = (
                    "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
                    + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
                ).split(" ")
                , file_ex_code = file_ex_codes.length
                , real_URL = view.URL || view.webkitURL || view
                , real_create_object_URL = real_URL.createObjectURL
                , real_revoke_object_URL = real_URL.revokeObjectURL
                , URL = real_URL
                , btoa = view.btoa
                , atob = view.atob
                , ArrayBuffer = view.ArrayBuffer
                , Uint8Array = view.Uint8Array
                ;
            FakeBlob.fake = FB_proto.fake = true;
            while (file_ex_code--) {
                FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
            }
            if (!real_URL.createObjectURL) {
                URL = view.URL = {};
            }
            URL.createObjectURL = function(blob) {
                var
                    type = blob.type
                    , data_URI_header
                    ;
                if (type === null) {
                    type = "application/octet-stream";
                }
                if (blob instanceof FakeBlob) {
                    data_URI_header = "data:" + type;
                    if (blob.encoding === "base64") {
                        return data_URI_header + ";base64," + blob.data;
                    } else if (blob.encoding === "URI") {
                        return data_URI_header + "," + decodeURIComponent(blob.data);
                    } if (btoa) {
                        return data_URI_header + ";base64," + btoa(blob.data);
                    } else {
                        return data_URI_header + "," + encodeURIComponent(blob.data);
                    }
                } else if (real_create_object_URL) {
                    return real_create_object_URL.call(real_URL, blob);
                }
            };
            URL.revokeObjectURL = function(object_URL) {
                if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
                    real_revoke_object_URL.call(real_URL, object_URL);
                }
            };
            FBB_proto.append = function(data/*, endings*/) {
                var bb = this.data;
                // decode data to a binary string
                if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
                    var
                        str = ""
                        , buf = new Uint8Array(data)
                        , i = 0
                        , buf_len = buf.length
                        ;
                    for (; i < buf_len; i++) {
                        str += String.fromCharCode(buf[i]);
                    }
                    bb.push(str);
                } else if (get_class(data) === "Blob" || get_class(data) === "File") {
                    if (FileReaderSync) {
                        var fr = new FileReaderSync;
                        bb.push(fr.readAsBinaryString(data));
                    } else {
                        // async FileReader won't work as BlobBuilder is sync
                        throw new FileException("NOT_READABLE_ERR");
                    }
                } else if (data instanceof FakeBlob) {
                    if (data.encoding === "base64" && atob) {
                        bb.push(atob(data.data));
                    } else if (data.encoding === "URI") {
                        bb.push(decodeURIComponent(data.data));
                    } else if (data.encoding === "raw") {
                        bb.push(data.data);
                    }
                } else {
                    if (typeof data !== "string") {
                        data += ""; // convert unsupported types to strings
                    }
                    // decode UTF-16 to binary string
                    bb.push(unescape(encodeURIComponent(data)));
                }
            };
            FBB_proto.getBlob = function(type) {
                if (!arguments.length) {
                    type = null;
                }
                return new FakeBlob(this.data.join(""), type, "raw");
            };
            FBB_proto.toString = function() {
                return "[object BlobBuilder]";
            };
            FB_proto.slice = function(start, end, type) {
                var args = arguments.length;
                if (args < 3) {
                    type = null;
                }
                return new FakeBlob(
                    this.data.slice(start, args > 1 ? end : this.data.length)
                    , type
                    , this.encoding
                );
            };
            FB_proto.toString = function() {
                return "[object Blob]";
            };
            FB_proto.close = function() {
                this.size = this.data.length = 0;
            };
            return FakeBlobBuilder;
        }(view));
    view.Blob = function Blob(blobParts, options) {
        var type = options ? (options.type || "") : "";
        var builder = new BlobBuilder();
        if (blobParts) {
            for (var i = 0, len = blobParts.length; i < len; i++) {
                builder.append(blobParts[i]);
            }
        }
        return builder.getBlob(type);
    };
}
exports.blob = blob;
src/excel/Export2Excel.js
New file
@@ -0,0 +1,142 @@
/* eslint-disable */
require('script-loader!file-saver');
// require('script-loader!./Blob');
const {blob} = require('./Blob')
require('script-loader!xlsx/dist/xlsx.core.min');
function generateArray(table) {
    var out = [];
    var rows = table.querySelectorAll('tr');
    var ranges = [];
    for (var R = 0; R < rows.length; ++R) {
        var outRow = [];
        var row = rows[R];
        var columns = row.querySelectorAll('td');
        for (var C = 0; C < columns.length; ++C) {
            var cell = columns[C];
            var colspan = cell.getAttribute('colspan');
            var rowspan = cell.getAttribute('rowspan');
            var cellValue = cell.innerText;
            if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
            //Skip ranges
            ranges.forEach(function (range) {
                if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
                    for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
                }
            });
            //Handle Row Span
            if (rowspan || colspan) {
                rowspan = rowspan || 1;
                colspan = colspan || 1;
                ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
            }
            ;
            //Handle Value
            outRow.push(cellValue !== "" ? cellValue : null);
            //Handle Colspan
            if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
        }
        out.push(outRow);
    }
    return [out, ranges];
};
function datenum(v, date1904) {
    if (date1904) v += 1462;
    var epoch = Date.parse(v);
    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
    var ws = {};
    var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
    for (var R = 0; R != data.length; ++R) {
        for (var C = 0; C != data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            var cell = {v: data[R][C]};
            if (cell.v == null) continue;
            var cell_ref = XLSX.utils.encode_cell({c: C, r: R});
            if (typeof cell.v === 'number') cell.t = 'n';
            else if (typeof cell.v === 'boolean') cell.t = 'b';
            else if (cell.v instanceof Date) {
                cell.t = 'n';
                cell.z = XLSX.SSF._table[14];
                cell.v = datenum(cell.v);
            }
            else cell.t = 's';
            ws[cell_ref] = cell;
        }
    }
    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
    return ws;
}
function Workbook() {
    if (!(this instanceof Workbook)) return new Workbook();
    this.SheetNames = [];
    this.Sheets = {};
}
function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
}
export function export_table_to_excel(id) {
    var theTable = document.getElementById(id);
    console.log('a')
    var oo = generateArray(theTable);
    var ranges = oo[1];
    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";
    console.log(data);
    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
    /* add ranges to worksheet */
    // ws['!cols'] = ['apple', 'banan'];
    ws['!merges'] = ranges;
    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;
    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}
function formatJson(jsonData) {
    console.log(jsonData)
}
export function export_json_to_excel(th, jsonData, defaultTitle) {
    /* original data */
    var data = jsonData;
    data.unshift(th);
    var ws_name = "SheetJS";
    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);
    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;
    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
    var title = defaultTitle || '列表'
    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
}
src/pages/batt-list/history-page.vue
@@ -22,8 +22,20 @@
                    </el-form-item>
                </el-form>
                <div class="page-tools" slot="footer">
                    <i class="iconfont icon-daochu" @click="exportExcel"></i>
                    <i class="iconfont icon-peizhiguanli" @click="drawer=true"></i>
                    <el-tooltip
                    class="item"
                    effect="dark"
                    content="导出数据"
                    placement="top">
                        <i class="iconfont icon-daochu" @click="exportExcel"></i>
                    </el-tooltip>
                    <el-tooltip
                    class="item"
                    effect="dark"
                    content="图表配置"
                    placement="top">
                        <i class="iconfont icon-peizhiguanli" @click="drawer=true"></i>
                    </el-tooltip>
                </div>
            </flex-layout>
        </div>
@@ -56,6 +68,7 @@
        enctype="multipart/form-data">
            <input type="hidden" name="PageName" value="history"/>
            <input type="hidden" name="echart" v-model="base64" />
            <input type="hidden" name="dev_name" v-model="dev_name" />
            <input type="hidden" name="table_name" v-model="getTableName">
            <input type="hidden" name="dis" v-model="allData">
        </form>
@@ -101,6 +114,7 @@
                end: new Date().format('yyyy-MM-dd'),
            },
            base64: '',
            dev_name: '',
            allData: [],
        }
    },
@@ -126,7 +140,7 @@
            let configs  = this.$store.state.batt.configs;
            let pattern = this.$store.state.batt.pattern;
            let match_type = this.$store.state.batt.match_type;
            this.dev_name = this.$store.state.batt.dev_name;
            // 清空配置项
            this.clearOptions();
            this.$nextTick(function() {
@@ -175,7 +189,6 @@
            this.$api.batt.searchHistoryTimeRange(searchParams)
            .then(function(res) {
                res = JSON.parse(res.data.result);
                console.log(res);
                self.pickerRange.start = '2019-01-01';
                self.pickerRange.end = new Date().format('yyyy-MM-dd');
                if(res.code == 1) {
@@ -363,9 +376,12 @@
                backgroundColor: '#004F76'
            });
            this.base64 = base64;
            this.$nextTick(()=>{
                this.$refs.export.submit();
            })
            });
        }
    },
    computed: {
src/pages/batt-list/real-time-page.vue
@@ -1,7 +1,13 @@
<template>
    <flex-layout class="page-root">
        <div class="page-tools" slot="header">
            <i class="iconfont icon-peizhiguanli" @click="drawer=true"></i>
            <el-tooltip
            class="item"
            effect="dark"
            content="图表配置"
            placement="top">
                <i class="iconfont icon-peizhiguanli" @click="drawer=true"></i>
            </el-tooltip>
        </div>
        <div class="line-chart-group" v-if="show">
            <template v-for="(option, key) in options">
src/pages/system/index.vue
@@ -10,7 +10,8 @@
                                <el-select 
                                v-model="searchParams.uName" 
                                placeholder="请选择操作人名称"
                                size="small">
                                size="small"
                                @change="filterChange">
                                    <el-option
                                    value=""
                                    :label="getUserTotal"></el-option>
@@ -23,11 +24,12 @@
                            </el-form-item>
                            <el-form-item class="el-green" label="操作类型">
                                <el-select 
                                v-model="searchParams.uoprateType"
                                v-model="searchParams.uOprateType"
                                placeholder="请选择操作类型"
                                size="small">
                                size="small"
                                @change="filterChange">
                                    <el-option
                                    value=""
                                    value="0"
                                    :label="getOperationTotal"></el-option>
                                    <el-option
                                    v-for="item in operationList"
@@ -44,14 +46,20 @@
                                start-placeholder="开始日期"
                                end-placeholder="结束日期"
                                size="small"
                                :editable="false">
                                :editable="false"
                                @change="filterChange">
                                </el-date-picker>
                            </el-form-item>
                            <el-form-item>
                                <el-button type="primary" size="mini"
                                icon="el-icon-search">查询</el-button>
                            </el-form-item>
                        </el-form>
                        <div class="page-tools" slot="footer">
                            <el-tooltip
                            class="item"
                            effect="dark"
                            content="导出数据"
                            placement="top">
                                <i class="iconfont icon-daochu" @click="handleDownload"></i>
                            </el-tooltip>
                        </div>
                    </flex-layout>
                </div>
                <div class="el-table-container">
@@ -59,32 +67,28 @@
                    class="el-green"
                    :data="tableData"
                    border
                    size="small">
                    size="mini"
                    height="100%">
                        <el-table-column
                        prop="UId"
                        label="编号"
                        align="center"
                        width="180">
                        </el-table-column>
                        <el-table-column
                        prop="UName"
                        label="操作人名称"
                        align="center"
                        width="180">
                        </el-table-column>
                        <el-table-column
                        prop="UJobGroup"
                        align="center"
                        label="操作日期">
                        </el-table-column>
                        <el-table-column
                        prop="UNote"
                        align="center"
                        label="操作详情">
                        v-for="item in tbHeader" :key="item.prop"
                        :prop="item.prop"
                        :label="item.label"
                        :align="item.align"
                        :width="item.width">
                        </el-table-column>
                    </el-table>
                </div>
                <div slot="footer"></div>
                <div slot="footer" class="page-footer">
                    <el-pagination
                    class="content-center el-green"
                    @size-change="handleSizeChange"
                    @current-change="handleCurrentChange"
                    :current-page="searchParams.page.pageCurr"
                    :page-size="searchParams.page.pageSize"
                    layout="total, sizes, prev, pager, next, jumper"
                    :total="searchParams.page.pageAll">
                    </el-pagination>
                </div>
            </flex-layout>
        </content-box>
    </div>
@@ -93,6 +97,9 @@
<script>
import ContentBox from '@/components/ContentBox'
import FlexLayout from '@/components/FlexLayout'
import {
    export_json_to_excel
} from '../../excel/Export2Excel'
export default {
    name: 'PagesSystem',
    components: {
@@ -101,6 +108,32 @@
    },
    data() {
        return {
            tbHeader: [
                {
                    prop: 'uName',
                    label: '操作人名称',
                    align: 'center',
                    width: '180',
                },
                {
                    prop: 'uOprateDay',
                    label: '操作日期',
                    align: 'center',
                    width: '180',
                },
                {
                    prop: 'uTerminalIp',
                    label: '终端IP',
                    align: 'center',
                    width: '',
                },
                {
                    prop: 'uOprateMsg',
                    label: '操作详情',
                    align: 'center',
                    width: '',
                },
            ],
            tableData: [],
            dateRange: ['2000-01-01', new Date().format('yyyy-MM-dd')],
            operationList: [
@@ -130,7 +163,7 @@
                uName: '',
                uOprateDay: '',
                uOprateDay1: '',
                uoprateType: '',
                uOprateType: '0',
                page: {
                    pageCurr: 1,
                    pageSize: 20,
@@ -139,6 +172,7 @@
            },
        }
    },
    watch: {},
    methods: {
        searchAllUser() {
            let self = this;
@@ -146,14 +180,81 @@
            this.$api.user.searchAll()
            .then(function(res) {
                res = JSON.parse(res.data.result);
                console.log(res);
                let data = [];
                if(res.code == 1) {
                    data = res.data;
                }
                // 设置用户信息
                self.users = data;
            });
        },
        searchUserLog() {
            this.searchParams.uOprateDay = this.dateRange[0]+' 00:00:00';
            this.searchParams.uOprateDay1 = this.dateRange[1]+' 23:59:59';
            let self = this;
            // 查询后台
            this.$api.system.searchUserLog(this.searchParams)
            .then(function(res) {
                res = JSON.parse(res.data.result);
                let data = [];
                if(res.code == 1) {
                    data = res.data;
                    let page = data[data.length -1].page;
                    self.searchParams.page.pageAll = page.pageAll;
                }
                // 设置表格数据
                self.tableData = data;
            });
        },
        filterChange: function() {
            // 设置分页信息
            this.searchParams.page.pageCurr = 1;
            // 查询日志
            this.searchUserLog();
        },
        handleSizeChange(pageSize) {
            // 设置分页信息
            this.searchParams.page.pageCurr = 1;
            this.searchParams.page.pageSize = pageSize;
            // 查询日志
            this.searchUserLog();
        },
        handleCurrentChange(pageCurr) {
            // 设置分页信息
            this.searchParams.page.pageCurr = pageCurr;
            // 查询日志
            this.searchUserLog();
        },
        handleDownload(){
            const tblInfo = this.getTblInfo(this.tbHeader);
            const tHeader = tblInfo.labels;
            const filterVal = tblInfo.props;
            const list = this.tableData;
            const data = this.formatJson(filterVal, list);
            console.log(data);
            export_json_to_excel(tHeader, data, '系统日志');
        },
        formatJson(filterVal, jsonData) {
            return jsonData.map(v => filterVal.map(j => {
                return v[j]
            }));
        },
        getTblInfo(tbHeader) {
            let result = {
                labels: [],
                props: [],
            };
            // 遍历数据
            tbHeader.forEach(function(item) {
                result.labels.push(item.label);
                result.props.push(item.prop);
            });
            return result;
        }
    },
    computed: {
        getUserTotal() {
@@ -166,6 +267,8 @@
    mounted() {
        // 查询所有的用户
        this.searchAllUser();
        // 查询操作日志
        this.searchUserLog();
    }
}
</script>
@@ -177,4 +280,12 @@
    padding-top: 0.08rem;
    padding-bottom: 0.08rem;
}
.el-table-container {
    height: 100%;
    box-sizing: border-box;
}
.page-footer {
    padding-top: 0.08rem;
    padding-bottom: 0.08rem;
}
</style>