diff --git a/BackToTop/README.md b/BackToTop/README.md
new file mode 100644
index 0000000..0ea3a1e
--- /dev/null
+++ b/BackToTop/README.md
@@ -0,0 +1,66 @@
+# 介绍
+
+这是一个可以快速回到页面顶部的组件,当用户浏览到页面底部的时候,通过点击按钮,可快速回到页面顶部。
+
+# 使用方法
+
+由于该组件是基于`element-UI`进行二次封装的,所以在使用该组件时请务必安装`element-UI`([安装方式猛戳这里](http://element-cn.eleme.io/#/zh-CN/component/installation)),安装好`element-UI`后,只需将该组件文件夹`BackToTop`导入到现有项目中即可使用。
+
+# 使用示例
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+# 选项
+
+| 属性 | 描述 | 类型 | 是否必须 | 默认值 |
+| :--------------: | :-----------------------------------------------: | :----: | :------: | :----: |
+| visibilityHeight | 当页面卷曲到多少高度时显示按钮 | Number | 否 | 400 |
+| backPosition | 点击按钮后回到页面顶部的高度 | Number | 否 | 0 |
+| customStyle | 自定义按钮样式 | Object | 否 | |
+| transitionName | 回到顶部时的动画效果,具体参考elementUI的动画效果 | String | 否 | fade |
+
+
+
+# 效果图
+
+
+
+
+# 组件代码
+
+完整代码请戳☞[Vue-Components-Library/BackToTop](https://github.com/wangjiachen199366/Vue-Components-Library/tree/master/BackToTop)
+
+(完)
\ No newline at end of file
diff --git a/BackToTop/index.vue b/BackToTop/index.vue
new file mode 100644
index 0000000..3997717
--- /dev/null
+++ b/BackToTop/index.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
diff --git a/Empty/1.png b/Empty/1.png
new file mode 100644
index 0000000..b5a5255
Binary files /dev/null and b/Empty/1.png differ
diff --git a/Empty/2.png b/Empty/2.png
new file mode 100644
index 0000000..ae3cba2
Binary files /dev/null and b/Empty/2.png differ
diff --git a/Empty/3.png b/Empty/3.png
new file mode 100644
index 0000000..5b27de7
Binary files /dev/null and b/Empty/3.png differ
diff --git a/Empty/4.png b/Empty/4.png
new file mode 100644
index 0000000..98d9b0e
Binary files /dev/null and b/Empty/4.png differ
diff --git a/Empty/README.md b/Empty/README.md
new file mode 100644
index 0000000..dd1c3a7
--- /dev/null
+++ b/Empty/README.md
@@ -0,0 +1,91 @@
+# 1. 前言
+
+在日常开发中,页面上肯定有展示数据的需求,但是当某些时候该展示数据的地方此时数据为空时,就会留下一片空白,对用户体验不是很好,那么接下来我们就封装一个空数据时的占位展示图,告诉用户此时用户为空,并非数据没有加载出来,不用让用户盲目的等待。
+
+# 2. 使用示例
+
+该组件可以直接引入到项目中使用,示例如下:
+
+```vue
+
+
+
+
+
+
+```
+
+在上面代码中,假设你需要展示的内容是`content`,那么你就可以判断当内容有值时展示内容,当内容为空时展示空数据时的占位展示图。效果如下:
+
+# 3. 组件可选属性
+
+该组件除了可以直接使用外,还提供过了一些可选属性供个性化配置,提供可选属性如下:
+
+| 属性名称 | 描述 | 类型 | 是否必须 | 默认值 |
+| :---------: | :------------------: | :----: | :------: | :------: |
+| description | 自定义描述内容 | String | 否 | 暂无数据 |
+| image | 自定义显示图片的路径 | String | 否 | 默认图片 |
+| imageStyle | 自定义显示图片的样式 | Object | 否 | - |
+
+组件提供了3个可选属性,你可以这样去使用它们:
+
+- 自定义描述内容
+
+ ```html
+
+ ```
+
+- 显示自定义图片
+
+ ```html
+
+ ```
+ 
+
+
+
+ ```javascript
+
+ ```
+ 
+
+- 自定义显示图片样式
+
+ ```html
+
+
+
+
+
+ ```
+
+# 4. 组件代码
+
+完整代码请戳☞[Vue-Components-Library/Empty](https://github.com/NLRX/Vue-Components-Library/tree/master/Empty)
+
+(完)
+
diff --git a/Empty/index.vue b/Empty/index.vue
new file mode 100644
index 0000000..9e976f7
--- /dev/null
+++ b/Empty/index.vue
@@ -0,0 +1,90 @@
+
+
+
+
![]()
+
+
+
{{description}}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExportExcel/Export2Excel.js b/ExportExcel/Export2Excel.js
new file mode 100644
index 0000000..e26831b
--- /dev/null
+++ b/ExportExcel/Export2Excel.js
@@ -0,0 +1,206 @@
+/* eslint-disable */
+require('file-saver');
+import XLSX from 'xlsx'
+
+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);
+ var oo = generateArray(theTable);
+ var ranges = oo[1];
+
+ /* original data */
+ var data = oo[0];
+ var ws_name = "SheetJS";
+
+ 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")
+}
+
+export function export_json_to_excel({
+ header,
+ data,
+ filename,
+ autoWidth = true,
+ bookType= 'xlsx'
+} = {}) {
+ /* original data */
+ filename = filename || 'excel-list'
+ data = [...data]
+ data.unshift(header);
+ var ws_name = "SheetJS";
+ var wb = new Workbook(),
+ ws = sheet_from_array_of_arrays(data);
+
+ if (autoWidth) {
+ /*设置worksheet每列的最大宽度*/
+ const colWidth = data.map(row => row.map(val => {
+ /*先判断是否为null/undefined*/
+ if (val == null) {
+ return {
+ 'wch': 10
+ };
+ }
+ /*再判断是否为中文*/
+ else if (val.toString().charCodeAt(0) > 255) {
+ return {
+ 'wch': val.toString().length * 2
+ };
+ } else {
+ return {
+ 'wch': val.toString().length
+ };
+ }
+ }))
+ /*以第一行为初始值*/
+ let result = colWidth[0];
+ for (let i = 1; i < colWidth.length; i++) {
+ for (let j = 0; j < colWidth[i].length; j++) {
+ if (result[j]['wch'] < colWidth[i][j]['wch']) {
+ result[j]['wch'] = colWidth[i][j]['wch'];
+ }
+ }
+ }
+ ws['!cols'] = result;
+ }
+
+ /* add worksheet to workbook */
+ wb.SheetNames.push(ws_name);
+ wb.Sheets[ws_name] = ws;
+
+ var wbout = XLSX.write(wb, {
+ bookType: bookType,
+ bookSST: false,
+ type: 'binary'
+ });
+ saveAs(new Blob([s2ab(wbout)], {
+ type: "application/octet-stream"
+ }), `${filename}.${bookType}`);
+}
diff --git a/ExportExcel/README.md b/ExportExcel/README.md
new file mode 100644
index 0000000..74d840f
--- /dev/null
+++ b/ExportExcel/README.md
@@ -0,0 +1,120 @@
+# 介绍
+
+这是一个可以将页面中的表格数据导出为`Excel`文件的功能组件,该组件一般与表格一起使用,将表格数据传给组件,然后通过点击组件按钮可将表格中的数据导出成`Excel`文件。
+
+# 使用方法
+
+由于封装该组件内部引用了`xlsx.js`,`file-saver.js`和`elementUI`,因此在使用该组件时,请先安装如下依赖:
+
+```shell
+npm install xlsx file-saver element-ui --save
+```
+
+安装好依赖后,只需将该组件文件夹`ExportExcel`导入到现有项目中即可使用。
+
+
+# 使用示例
+
+```html
+
+
+
+
+
+
+
+
+```
+
+# 选项
+
+| 属性 | 描述 | 类型 | 是否必须 |
+| :------: | :------------------: | :---: | :------: |
+| list | 由后端返回的表格数据 | Array | 是 |
+| tHeader | 导出的Excel文件表头标题 | Array | 是 |
+| tValue | 要将表格数据中的哪些字段作为数据导出至Excel,与表头一一对应 | Array | 是 |
+| filename | 导出的Excel文件名,默认为“导出数据.xlsx” | String | 否 |
+
+# 选项说明
+
+**关于选项中的`tHeader`和`tValue`说明如下:**
+
+例如将如下表格数据导出成Exlcel:
+
+
+
+其中表头数据为:
+
+
+
+所以`tHeader`为:
+
+```javascript
+tHeader:['Id', '告警类型', '告警内容', '告警时间(段)', '告警次数']
+```
+
+后端返回的表格数据`list`为:
+
+```json
+[
+ {
+ "id":1,
+ "type":"",
+ "content":"",
+ "time":"",
+ "count":"",
+ },
+ {
+ "id":2,
+ "type":"",
+ "content":"",
+ "time":"",
+ "count":"",
+ },
+ //....
+]
+```
+
+其中:
+
+- list中的id------->表头的ID
+
+- list中的type------->表头的'告警类型'
+
+- list中的content------->表头的'告警内容'
+
+- list中的time------->表头的'告警时间(段)'
+
+- list中的count------->表头的'告警次数'
+
+所有`tValue`为:
+
+```javascript
+tValue:['id', 'type', 'content', 'time', 'count']
+```
+
+
+
+# 效果图
+
+
+
+
+# 组件代码
+
+完整代码请戳☞[Vue-Components-Library/ExportExcel](https://github.com/wangjiachen199366/Vue-Components-Library/tree/master/ExportExcel)
+
+(完)
\ No newline at end of file
diff --git a/ExportExcel/index.vue b/ExportExcel/index.vue
new file mode 100644
index 0000000..c01fce3
--- /dev/null
+++ b/ExportExcel/index.vue
@@ -0,0 +1,58 @@
+
+ 导出 Excel
+
+
+
+
+
diff --git a/JTopoInVue/App.vue b/JTopoInVue/App.vue
new file mode 100644
index 0000000..4156fb4
--- /dev/null
+++ b/JTopoInVue/App.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/JTopoInVue/README.md b/JTopoInVue/README.md
new file mode 100644
index 0000000..f10f70c
--- /dev/null
+++ b/JTopoInVue/README.md
@@ -0,0 +1,44 @@
+# 1.前言
+
+[jTopo(Javascript Topology library)]([http://www.jtopo.com](http://www.jtopo.com/)) 是一款完全基于HTML5 Canvas的关系、拓扑图形化界面开发工具包。其体积小,性能优异,由一群开发爱好者来维护。唯一感觉不足的是它是一个纯`js`库,没有像使用`ES6`语法,不能像模块化开发那样使用`import`导入,
+
+由于博主的项目是使用vue-cli搭建的模块化开发项目,想要使用第三方库最好的方式是通过`npm install xxx`安装,然后在项目里`import xxx`来使用。但是在`JTopo`官网上并没有发现有该库的`npm`包,在`www.npmjs.com`上搜索`JTopo`,虽然找到了该库的`npm`包,但是这些包都是由一些个人开发者通过修改源码上传的,并且年限过久,博主担心直接使用的话可能会有一些诡异的`bug`,所以博主研究了一下,如何在`vue-cli`项目中直接导入第三方`js`库,幸运的是,很快就找到了办法,并且很容易哈,现将方法记录下来,并提供demo,供大家参考。
+
+# 2.解决办法
+
+我们知道,无论是什么项目,最终通过打包后跑在浏览器上的肯定是一个`html`文件,在`Vue`中就是根目录下的`index.html`,在该文件中会将`webpack`打包后的`build.js`文件通过`
+
+