ztxkui 2.6.8 → 2.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Demo.js CHANGED
@@ -15,7 +15,7 @@ function Demo() {
15
15
  console.log('rerender');
16
16
  var _a = useState([]), list = _a[0], setList = _a[1];
17
17
  var _b = useState([]), setDefaultList = _b[1];
18
- var _c = useState(''), value = _c[0], setValue = _c[1];
18
+ var _c = useState(), value = _c[0], setValue = _c[1];
19
19
  var params = useState({
20
20
  tenantId: '000000',
21
21
  isCreateUser: 0,
@@ -83,7 +83,10 @@ function Demo() {
83
83
  }), request: request, isCatch: true }),
84
84
  React.createElement("h2", null, "\u8FDC\u7A0B\u6A21\u7CCA\u641C\u7D22"),
85
85
  React.createElement("button", { onClick: function () { return setValue('1462433051208762629'); } }, "\u4FEE\u6539"),
86
- React.createElement(EnhanceSelect, { style: selectStyle, placeholder: "\u53EF\u8FDC\u7A0B\u6A21\u7CCA\u641C\u7D22", url: "http://192.168.0.83:8000/api/zmdms-system/employee/page", request: request, remoteSearch: true, dataKey: "id", titleKey: "empName", value: value, showAll: true, onChange: function (value, option, fullData) {
86
+ React.createElement(EnhanceSelect, { style: selectStyle, defaultList: [
87
+ { id: 1, empName: '21' },
88
+ { id: 2, empName: '33' },
89
+ ], placeholder: "\u53EF\u8FDC\u7A0B\u6A21\u7CCA\u641C\u7D22", url: "http://192.168.0.83:8000/api/zmdms-system/employee/page", request: request, remoteSearch: true, dataKey: "id", titleKey: "empName", value: value, showAll: true, onChange: function (value, option, fullData) {
87
90
  setValue(value);
88
91
  }, params: JSON.stringify(params),
89
92
  // value={value}
@@ -21,14 +21,14 @@ function CollapseDemo() {
21
21
  React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"))),
22
22
  React.createElement(Collapse.Panel, { key: "2", header: "22" },
23
23
  React.createElement(GridList, null,
24
+ React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5\u6D4B\u8BD5\u6D4B\u8BD5\u6D4B\u8BD5\u6D4B\u8BD5saasasass" }, "\u518D\u89C1"),
24
25
  React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
25
26
  React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
26
27
  React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
27
28
  React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
28
29
  React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
29
30
  React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
30
- React.createElement(GridList.FormItem, { span: 8, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
31
- React.createElement(GridList.FormItem, { span: 16, titleSpan: Math.floor(8 * 0.4), title: "\u6D4B\u8BD5" }, "\u518D\u89C1"))),
31
+ React.createElement(GridList.FormItem, { span: 16, titleSpan: 4, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"))),
32
32
  React.createElement(Collapse.Panel, { key: "3", header: "33" },
33
33
  React.createElement(GridList, { border: false, showBackground: false },
34
34
  React.createElement(GridList.FormItem, { span: 6, title: "\u6D4B\u8BD5" }, "\u518D\u89C1"),
@@ -43,6 +43,7 @@ function UploadDemo() {
43
43
  var _this = this;
44
44
  var _a = useState(originFileList), fileList = _a[0], setFileList = _a[1];
45
45
  var upload = useRef();
46
+ var uploadTableRef = useRef();
46
47
  useEffect(function () {
47
48
  setTimeout(function () {
48
49
  setFileList([
@@ -162,6 +163,9 @@ function UploadDemo() {
162
163
  }
163
164
  });
164
165
  }); };
166
+ var getHandle = function () {
167
+ console.log(uploadTableRef.current.getSelectedRows());
168
+ };
165
169
  return (React.createElement("div", null,
166
170
  React.createElement(Link, { to: "/test" }, "test"),
167
171
  React.createElement(Upload, { method: "post", headers: {
@@ -178,7 +182,7 @@ function UploadDemo() {
178
182
  system: '2',
179
183
  }, apiBaseUrl: "http://192.168.0.83:8888", fileBaseUrl: "http://192.168.0.83:88", originFileList: fileList, callback: uploadCallbackFn, onDeleteCallback: function (index, file) {
180
184
  console.log(index, file);
181
- }, upload: upload }),
185
+ }, upload: upload, rowSelection: "checkbox", uploadTableRef: uploadTableRef }),
182
186
  React.createElement(Upload, { maxSize: 200 * 1024, ztAccept: ['.jpg', '.jpeg', '.png', '.bmp', '.gif'], listType: "picture-card", method: "post", headers: {
183
187
  'Zmdms-Auth': token,
184
188
  }, showUploadList: {
@@ -188,6 +192,7 @@ function UploadDemo() {
188
192
  }, apiBaseUrl: "http://192.168.0.83:8888", fileBaseUrl: "http://192.168.0.83:88", showTable: false, showTip: false, originFileList: fileList, maxCount: 1, callback: uploadCallbackFn, onDeleteCallback: function (index, file) {
189
193
  console.log(index, file);
190
194
  }, authToken: token }),
191
- React.createElement("button", { onClick: checkHandle }, "\u68C0\u67E5")));
195
+ React.createElement("button", { onClick: checkHandle }, "\u68C0\u67E5"),
196
+ React.createElement("button", { onClick: getHandle }, "\u83B7\u53D6\u9009\u4E2D\u9879")));
192
197
  }
193
198
  export default UploadDemo;
@@ -77,6 +77,7 @@ function getData(request, options) {
77
77
  */
78
78
  function EnhanceSelect(_a) {
79
79
  var list = _a.list, defaultList = _a.defaultList, params = _a.params, url = _a.url, _b = _a.method, method = _b === void 0 ? 'GET' : _b, _c = _a.timeout, timeout = _c === void 0 ? 10000 : _c, _d = _a.dataKey, dataKey = _d === void 0 ? 'id' : _d, componentKey = _a.componentKey, _e = _a.titleKey, titleKey = _e === void 0 ? 'name' : _e, showAll = _a.showAll, isCatch = _a.isCatch, onCompleted = _a.onCompleted, onChange = _a.onChange, request = _a.request, remoteSearch = _a.remoteSearch, remoteSearchKey = _a.remoteSearchKey, remoteSearchDataKey = _a.remoteSearchDataKey, _f = _a.isRemoteSearchDataKey, isRemoteSearchDataKey = _f === void 0 ? true : _f, transformData = _a.transformData, joinKey = _a.joinKey, _g = _a.joinStr, joinStr = _g === void 0 ? '-' : _g, mustHasParams = _a.mustHasParams, disabledValues = _a.disabledValues, restProps = __rest(_a, ["list", "defaultList", "params", "url", "method", "timeout", "dataKey", "componentKey", "titleKey", "showAll", "isCatch", "onCompleted", "onChange", "request", "remoteSearch", "remoteSearchKey", "remoteSearchDataKey", "isRemoteSearchDataKey", "transformData", "joinKey", "joinStr", "mustHasParams", "disabledValues"]);
80
+ var currentClick = useRef(true);
80
81
  // 下拉数据源
81
82
  var _h = useFetchState([]), selectList = _h[0], setSelectList = _h[1];
82
83
  // 多选时,自己需要合并的数据
@@ -414,6 +415,12 @@ function EnhanceSelect(_a) {
414
415
  };
415
416
  // onChange 方法
416
417
  var onChangeHandle = function (value, option) {
418
+ if ((Array.isArray(value) && value.length === 0) || !value) {
419
+ currentClick.current = true;
420
+ }
421
+ else {
422
+ currentClick.current = false;
423
+ }
417
424
  setFirstLoading(true);
418
425
  if (((Array.isArray(value) && value.length === 0) || !value) &&
419
426
  remoteSearch &&
@@ -447,12 +454,41 @@ function EnhanceSelect(_a) {
447
454
  }
448
455
  };
449
456
  // 焦点事件
450
- var onFocusHandle = function () {
457
+ var onFocusHandle = function (e) {
458
+ // console.log('焦点事件');
451
459
  setIsOpen(true);
460
+ currentClick.current = false;
452
461
  };
453
462
  var onBlurHandle = function () {
463
+ // console.log('失去焦点事件');
454
464
  setIsOpen(false);
465
+ currentClick.current = false;
466
+ };
467
+ // 清空数据时
468
+ var onClearHandle = function () {
469
+ // console.log('清空数据事件');
470
+ setIsOpen(false);
471
+ };
472
+ // 选中时
473
+ var onSelectHandle = function () {
474
+ // console.log('选中数据事件');
475
+ if (!restProps.mode) {
476
+ setIsOpen(false);
477
+ }
478
+ };
479
+ // 点击时
480
+ var onClickHandle = function (e) {
481
+ // console.log('点击事件', currentClick.current);
482
+ if (currentClick.current) {
483
+ if (isOpen) {
484
+ setIsOpen(false);
485
+ }
486
+ else {
487
+ setIsOpen(true);
488
+ }
489
+ }
490
+ currentClick.current = true;
455
491
  };
456
- return (React.createElement(Select, __assign({ defaultValue: showAll ? '' : undefined, allowClear: true, showSearch: true, filterOption: remoteSearch ? false : filterOptionHandle, onSearch: remoteSearch ? onSearchHandle : undefined, onChange: onChangeHandle, optionLabelProp: "title", loading: loading, onFocus: onFocusHandle, onBlur: onBlurHandle, open: isOpen }, restProps, { disabled: remoteSearch ? restProps.disabled : loading || restProps.disabled }), renderSelectOption()));
492
+ return (React.createElement(Select, __assign({ defaultValue: showAll ? '' : undefined, allowClear: true, showSearch: true, filterOption: remoteSearch ? false : filterOptionHandle, onSearch: remoteSearch ? onSearchHandle : undefined, onChange: onChangeHandle, optionLabelProp: "title", loading: loading, onFocus: onFocusHandle, onBlur: onBlurHandle, onClear: onClearHandle, onSelect: onSelectHandle, onClick: onClickHandle, open: isOpen }, restProps, { disabled: remoteSearch ? restProps.disabled : loading || restProps.disabled }), renderSelectOption()));
457
493
  }
458
494
  export default memo(EnhanceSelect);
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import { TableRowSelection } from '../Table';
2
3
  import { UploadFile } from 'antd/lib/upload/interface';
3
4
  interface IProps {
4
5
  fileList?: UploadFile[];
@@ -26,6 +27,9 @@ interface IProps {
26
27
  startColumns?: any;
27
28
  otherColumns?: any;
28
29
  showUploadBtn?: boolean;
30
+ /**是否显示selection */
31
+ rowSelection?: TableRowSelection<any> | 'checkbox' | 'radio';
32
+ uploadTableRef?: any;
29
33
  }
30
34
  declare const _default: React.NamedExoticComponent<IProps>;
31
35
  export default _default;
@@ -61,7 +61,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from) {
61
61
  to[j] = from[i];
62
62
  return to;
63
63
  };
64
- import React, { useState, useEffect, memo } from 'react';
64
+ import React, { useState, useEffect, memo, useMemo, useImperativeHandle, } from 'react';
65
65
  import { Button, Progress, message, Popconfirm } from '../../index';
66
66
  import Table from '../Table';
67
67
  import dayjs from 'dayjs';
@@ -69,9 +69,13 @@ import { divide, round, times } from 'number-precision';
69
69
  import { downloadFileCallBack, downloadPublicFile, previewFile, } from 'ztxkutils/dist/fileOperation';
70
70
  import { transformFileSize } from 'ztxkutils/dist/tools';
71
71
  var UploadTable = function (_a) {
72
- var fileList = _a.fileList, action = _a.action, headers = _a.headers, authToken = _a.authToken, method = _a.method, apiBaseUrl = _a.apiBaseUrl, uploadUser = _a.uploadUser, _b = _a.fileBaseUrl, fileBaseUrl = _b === void 0 ? '' : _b, onDelete = _a.onDelete, onUpload = _a.onUpload, showDeleteBtn = _a.showDeleteBtn, isAutoDelete = _a.isAutoDelete, onDownLoadCallbackBefore = _a.onDownLoadCallbackBefore, showDownloadBtn = _a.showDownloadBtn, onDownLoadCallbackAfter = _a.onDownLoadCallbackAfter, onPreviewCallbackBefore = _a.onPreviewCallbackBefore, showPreviewBtn = _a.showPreviewBtn, isPublic = _a.isPublic, data = _a.data, _c = _a.startColumns, startColumns = _c === void 0 ? [] : _c, _d = _a.otherColumns, otherColumns = _d === void 0 ? [] : _d, showUploadBtn = _a.showUploadBtn;
72
+ var fileList = _a.fileList, action = _a.action, headers = _a.headers, authToken = _a.authToken, method = _a.method, apiBaseUrl = _a.apiBaseUrl, uploadUser = _a.uploadUser, _b = _a.fileBaseUrl, fileBaseUrl = _b === void 0 ? '' : _b, onDelete = _a.onDelete, onUpload = _a.onUpload, showDeleteBtn = _a.showDeleteBtn, isAutoDelete = _a.isAutoDelete, onDownLoadCallbackBefore = _a.onDownLoadCallbackBefore, showDownloadBtn = _a.showDownloadBtn, onDownLoadCallbackAfter = _a.onDownLoadCallbackAfter, onPreviewCallbackBefore = _a.onPreviewCallbackBefore, showPreviewBtn = _a.showPreviewBtn, isPublic = _a.isPublic, data = _a.data, _c = _a.startColumns, startColumns = _c === void 0 ? [] : _c, _d = _a.otherColumns, otherColumns = _d === void 0 ? [] : _d, showUploadBtn = _a.showUploadBtn, rowSelection = _a.rowSelection, uploadTableRef = _a.uploadTableRef;
73
73
  var _e = useState([]), dataSource = _e[0], setDataSource = _e[1];
74
74
  var _f = useState(false), loading = _f[0], setLoading = _f[1];
75
+ var _g = useState(), selectedRows = _g[0], setSelectedRows = _g[1];
76
+ useImperativeHandle(uploadTableRef, function () { return ({
77
+ getSelectedRows: function () { return selectedRows; },
78
+ }); }, [selectedRows]);
75
79
  var columns = showUploadBtn
76
80
  ? __spreadArray(__spreadArray(__spreadArray(__spreadArray([], startColumns), [
77
81
  {
@@ -401,6 +405,16 @@ var UploadTable = function (_a) {
401
405
  setDataSource(newDataSource);
402
406
  }
403
407
  }, [fileList, uploadUser]);
404
- return (React.createElement(Table, { columns: columns, dataSource: dataSource, rowKey: "id", loading: loading }));
408
+ var myRowSelection = useMemo(function () {
409
+ return rowSelection === 'checkbox' || rowSelection === 'radio'
410
+ ? {
411
+ type: rowSelection,
412
+ onChange: function (selectedRowKeys, selectedRows) {
413
+ setSelectedRows(selectedRows);
414
+ },
415
+ }
416
+ : rowSelection;
417
+ }, [rowSelection]);
418
+ return (React.createElement(Table, { columns: columns, dataSource: dataSource, rowKey: "id", loading: loading, rowSelection: myRowSelection }));
405
419
  };
406
420
  export default memo(UploadTable);
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { UploadProps } from 'antd/lib/upload';
3
3
  import { UploadFile } from './';
4
+ import { TableRowSelection } from '../Table';
4
5
  export interface IUploadRef {
5
6
  validate?: (info?: any) => any;
6
7
  }
@@ -62,6 +63,10 @@ export interface IProps extends UploadProps {
62
63
  isDirect?: boolean;
63
64
  /**附件上传对象 */
64
65
  upload?: any;
66
+ /**是否显示selection */
67
+ rowSelection?: TableRowSelection<any> | 'checkbox' | 'radio';
68
+ /**组件提供给外部调用的一些方法 */
69
+ uploadTableRef?: any;
65
70
  }
66
71
  declare const Upload: React.FC<IProps>;
67
72
  export default Upload;
@@ -81,7 +81,7 @@ var _accept = [
81
81
  ];
82
82
  var statusArr = ['error', 'success', 'done', 'uploading', 'removed'];
83
83
  var Upload = function (props) {
84
- var children = props.children, className = props.className, _a = props.showTip, showTip = _a === void 0 ? true : _a, _b = props.showUploadBtn, showUploadBtn = _b === void 0 ? true : _b, _c = props.showDeleteBtn, showDeleteBtn = _c === void 0 ? true : _c, onDownLoadCallbackBefore = props.onDownLoadCallbackBefore, _d = props.showDownloadBtn, showDownloadBtn = _d === void 0 ? true : _d, onDownLoadCallbackAfter = props.onDownLoadCallbackAfter, _e = props.showPreviewBtn, showPreviewBtn = _e === void 0 ? true : _e, onPreviewCallbackBefore = props.onPreviewCallbackBefore, _f = props.showTable, showTable = _f === void 0 ? true : _f, showUploadList = props.showUploadList, onChange = props.onChange, beforeUpload = props.beforeUpload, multiple = props.multiple, ztAccept = props.ztAccept, ztShowTipText = props.ztShowTipText, maxCount = props.maxCount, maxSize = props.maxSize, maxSizeStr = props.maxSizeStr, action = props.action, headers = props.headers, method = props.method, uploadUser = props.uploadUser, originFileList = props.originFileList, callback = props.callback, onDeleteCallback = props.onDeleteCallback, isAutoDelete = props.isAutoDelete, apiBaseUrl = props.apiBaseUrl, _g = props.fileBaseUrl, fileBaseUrl = _g === void 0 ? '' : _g, fileBtnText = props.fileBtnText, data = props.data, authToken = props.authToken, listType = props.listType, isPublic = props.isPublic, startColumns = props.startColumns, otherColumns = props.otherColumns, _h = props.isDirect, isDirect = _h === void 0 ? false : _h, upload = props.upload, restProps = __rest(props, ["children", "className", "showTip", "showUploadBtn", "showDeleteBtn", "onDownLoadCallbackBefore", "showDownloadBtn", "onDownLoadCallbackAfter", "showPreviewBtn", "onPreviewCallbackBefore", "showTable", "showUploadList", "onChange", "beforeUpload", "multiple", "ztAccept", "ztShowTipText", "maxCount", "maxSize", "maxSizeStr", "action", "headers", "method", "uploadUser", "originFileList", "callback", "onDeleteCallback", "isAutoDelete", "apiBaseUrl", "fileBaseUrl", "fileBtnText", "data", "authToken", "listType", "isPublic", "startColumns", "otherColumns", "isDirect", "upload"]);
84
+ var children = props.children, className = props.className, _a = props.showTip, showTip = _a === void 0 ? true : _a, _b = props.showUploadBtn, showUploadBtn = _b === void 0 ? true : _b, _c = props.showDeleteBtn, showDeleteBtn = _c === void 0 ? true : _c, onDownLoadCallbackBefore = props.onDownLoadCallbackBefore, _d = props.showDownloadBtn, showDownloadBtn = _d === void 0 ? true : _d, onDownLoadCallbackAfter = props.onDownLoadCallbackAfter, _e = props.showPreviewBtn, showPreviewBtn = _e === void 0 ? true : _e, onPreviewCallbackBefore = props.onPreviewCallbackBefore, _f = props.showTable, showTable = _f === void 0 ? true : _f, showUploadList = props.showUploadList, onChange = props.onChange, beforeUpload = props.beforeUpload, multiple = props.multiple, ztAccept = props.ztAccept, ztShowTipText = props.ztShowTipText, maxCount = props.maxCount, maxSize = props.maxSize, maxSizeStr = props.maxSizeStr, action = props.action, headers = props.headers, method = props.method, uploadUser = props.uploadUser, originFileList = props.originFileList, callback = props.callback, onDeleteCallback = props.onDeleteCallback, isAutoDelete = props.isAutoDelete, apiBaseUrl = props.apiBaseUrl, _g = props.fileBaseUrl, fileBaseUrl = _g === void 0 ? '' : _g, fileBtnText = props.fileBtnText, data = props.data, authToken = props.authToken, listType = props.listType, isPublic = props.isPublic, startColumns = props.startColumns, otherColumns = props.otherColumns, _h = props.isDirect, isDirect = _h === void 0 ? false : _h, upload = props.upload, rowSelection = props.rowSelection, uploadTableRef = props.uploadTableRef, restProps = __rest(props, ["children", "className", "showTip", "showUploadBtn", "showDeleteBtn", "onDownLoadCallbackBefore", "showDownloadBtn", "onDownLoadCallbackAfter", "showPreviewBtn", "onPreviewCallbackBefore", "showTable", "showUploadList", "onChange", "beforeUpload", "multiple", "ztAccept", "ztShowTipText", "maxCount", "maxSize", "maxSizeStr", "action", "headers", "method", "uploadUser", "originFileList", "callback", "onDeleteCallback", "isAutoDelete", "apiBaseUrl", "fileBaseUrl", "fileBtnText", "data", "authToken", "listType", "isPublic", "startColumns", "otherColumns", "isDirect", "upload", "rowSelection", "uploadTableRef"]);
85
85
  var _j = useState(originFileList || []), fileList = _j[0], setFileList = _j[1];
86
86
  var _k = useState('20M'), maxSizeTransStr = _k[0], setMaxSizeTransStr = _k[1];
87
87
  useEffect(function () {
@@ -305,6 +305,6 @@ var Upload = function (props) {
305
305
  ? ztShowTipText
306
306
  : 'PDF、Word、Excel、Txt、JPG、PNG、BMP、GIF、RAR、ZIP',
307
307
  ")")))),
308
- showTable && (React.createElement(UploadTable, { fileList: fileList, action: fileAction, apiBaseUrl: apiBaseUrl, fileBaseUrl: fileBaseUrl, headers: headers, method: method, uploadUser: uploadUser, onDelete: onDeleteHandle, onUpload: onUploadHandle, showDeleteBtn: showDeleteBtn, onDownLoadCallbackBefore: onDownLoadCallbackBefore, showDownloadBtn: showDownloadBtn, onDownLoadCallbackAfter: onDownLoadCallbackAfter, showPreviewBtn: showPreviewBtn, onPreviewCallbackBefore: onPreviewCallbackBefore, isAutoDelete: isAutoDelete, authToken: authToken, isPublic: isPublic, data: data, startColumns: startColumns, otherColumns: otherColumns, showUploadBtn: showUploadBtn }))));
308
+ showTable && (React.createElement(UploadTable, { fileList: fileList, action: fileAction, apiBaseUrl: apiBaseUrl, fileBaseUrl: fileBaseUrl, headers: headers, method: method, uploadUser: uploadUser, onDelete: onDeleteHandle, onUpload: onUploadHandle, showDeleteBtn: showDeleteBtn, onDownLoadCallbackBefore: onDownLoadCallbackBefore, showDownloadBtn: showDownloadBtn, onDownLoadCallbackAfter: onDownLoadCallbackAfter, showPreviewBtn: showPreviewBtn, onPreviewCallbackBefore: onPreviewCallbackBefore, isAutoDelete: isAutoDelete, authToken: authToken, isPublic: isPublic, data: data, startColumns: startColumns, otherColumns: otherColumns, showUploadBtn: showUploadBtn, rowSelection: rowSelection, uploadTableRef: uploadTableRef }))));
309
309
  };
310
310
  export default Upload;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ztxkui",
3
- "version": "2.6.8",
3
+ "version": "2.6.9",
4
4
  "private": false,
5
5
  "description": "React components library",
6
6
  "author": "zt-front-end",