Browse Source

文件管理-提交

lxh 1 year ago
parent
commit
1768657306

+ 1 - 0
package.json

@@ -92,6 +92,7 @@
     "vue-json-pretty": "^2.0.6",
     "vue-print-nb-jeecg": "^1.0.10",
     "vue-router": "^4.0.14",
+    "vue-tree-list": "^1.5.0",
     "vue-types": "^4.1.1",
     "vuedraggable": "^4.1.0",
     "vxe-table": "4.1.0",

+ 57 - 0
public/fileEdit.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title th:text="文件管理"></title>
+</head>
+<body>
+
+<div id="fileEdit"></div>
+<!--// 页面引入document的api.js-->
+<script type="text/javascript" src="http://47.94.222.6:9050/web-apps/apps/api/documents/api.js"></script>
+<script>
+
+    //office文件在线编辑、预览
+    new DocsAPI.DocEditor("fileEdit", // 元素id
+        {
+            type: "desktop",
+            width: "100%",
+            height: "1000px",
+            document: {
+                title: "文档管理",
+                url: "http://192.168.187.1:9999/ventanaly-sharefile/fileServer/onlyOffice/read?id=[[${id}]]",//id表示文件id,后端接口用这个id来加载文件
+                fileType:"docx",//当文件类型为doc、xls、ppt时,对应用docx、xlsx、pptx否则会保存异常。
+                key: "",
+                lang: "zh-CN",
+                permissions: {
+                    "download": true,//是否可下载
+                    "edit": true,
+                    "fillForms": true,
+                    "print": true,//是否可打印
+                }
+            },
+            editorConfig: {
+                "lang": "zh-CN",
+                mode: "edit",//view:只读且可复制内容,edit:可编辑
+                "callbackUrl": "http://192.168.187.1:9999/ventanaly-sharefile/fileServer/onlyOffice/save?id=[[${id}]]",//id表示文件id,后端接口用这个id来加载文件
+                "coEditing": {
+                    "mode": "fast",
+                    "change": true
+                },
+                "customization": {
+                    "toolbarNoTabs": true,
+                    "autosave": false,//是否自动保存
+                    "forcesave": true,//定义保存按钮是否显示
+                    "hideRightMenu": true,
+                },
+                //用户信息
+                "user": {
+                    "id": "857857", //用户ID
+                    "name": "小陈" //用户名称
+                }
+            }
+        });
+
+</script>
+</body>
+</html>

+ 539 - 0
src/assets/iconfong/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 1154 - 0
src/assets/iconfong/demo_index.html

@@ -0,0 +1,1154 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i2/O1CN01ZyAlrn1MwaMhqz36G_!!6000000001499-73-tps-64-64.ico" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01EYTRnJ297D6vehehJ_!!6000000008020-55-tps-64-64.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3462405" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe62d;</span>
+                <div class="name">babel</div>
+                <div class="code-name">&amp;#xe62d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe691;</span>
+                <div class="name">上传</div>
+                <div class="code-name">&amp;#xe691;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe600;</span>
+                <div class="name">编辑</div>
+                <div class="code-name">&amp;#xe600;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xeb6a;</span>
+                <div class="name">关闭</div>
+                <div class="code-name">&amp;#xeb6a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a4;</span>
+                <div class="name">新增</div>
+                <div class="code-name">&amp;#xe6a4;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe663;</span>
+                <div class="name">add_file,新建,新增,文件夹</div>
+                <div class="code-name">&amp;#xe663;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xeac5;</span>
+                <div class="name">24gf-folderOpen</div>
+                <div class="code-name">&amp;#xeac5;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe648;</span>
+                <div class="name">bg-folder</div>
+                <div class="code-name">&amp;#xe648;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe601;</span>
+                <div class="name">word</div>
+                <div class="code-name">&amp;#xe601;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60a;</span>
+                <div class="name">powerpoint</div>
+                <div class="code-name">&amp;#xe60a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe613;</span>
+                <div class="name">word</div>
+                <div class="code-name">&amp;#xe613;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe61c;</span>
+                <div class="name">excel</div>
+                <div class="code-name">&amp;#xe61c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe623;</span>
+                <div class="name">audio</div>
+                <div class="code-name">&amp;#xe623;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe625;</span>
+                <div class="name">angular-resolver</div>
+                <div class="code-name">&amp;#xe625;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe634;</span>
+                <div class="name">ejs</div>
+                <div class="code-name">&amp;#xe634;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe636;</span>
+                <div class="name">favicon</div>
+                <div class="code-name">&amp;#xe636;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe635;</span>
+                <div class="name">eslint</div>
+                <div class="code-name">&amp;#xe635;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe637;</span>
+                <div class="name">file</div>
+                <div class="code-name">&amp;#xe637;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe639;</span>
+                <div class="name">contributing</div>
+                <div class="code-name">&amp;#xe639;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe63a;</span>
+                <div class="name">css</div>
+                <div class="code-name">&amp;#xe63a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe63d;</span>
+                <div class="name">document</div>
+                <div class="code-name">&amp;#xe63d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe656;</span>
+                <div class="name">html</div>
+                <div class="code-name">&amp;#xe656;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe658;</span>
+                <div class="name">git</div>
+                <div class="code-name">&amp;#xe658;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe65e;</span>
+                <div class="name">javascript-map</div>
+                <div class="code-name">&amp;#xe65e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe65f;</span>
+                <div class="name">json</div>
+                <div class="code-name">&amp;#xe65f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe662;</span>
+                <div class="name">less</div>
+                <div class="code-name">&amp;#xe662;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe666;</span>
+                <div class="name">mdx</div>
+                <div class="code-name">&amp;#xe666;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe669;</span>
+                <div class="name">image</div>
+                <div class="code-name">&amp;#xe669;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66b;</span>
+                <div class="name">javascript</div>
+                <div class="code-name">&amp;#xe66b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe683;</span>
+                <div class="name">nodejs</div>
+                <div class="code-name">&amp;#xe683;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe685;</span>
+                <div class="name">npm</div>
+                <div class="code-name">&amp;#xe685;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe686;</span>
+                <div class="name">nuxt</div>
+                <div class="code-name">&amp;#xe686;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe687;</span>
+                <div class="name">pdf</div>
+                <div class="code-name">&amp;#xe687;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe689;</span>
+                <div class="name">react</div>
+                <div class="code-name">&amp;#xe689;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe68a;</span>
+                <div class="name">react_ts</div>
+                <div class="code-name">&amp;#xe68a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe690;</span>
+                <div class="name">python</div>
+                <div class="code-name">&amp;#xe690;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe69a;</span>
+                <div class="name">sass</div>
+                <div class="code-name">&amp;#xe69a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6a3;</span>
+                <div class="name">typescript</div>
+                <div class="code-name">&amp;#xe6a3;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6b2;</span>
+                <div class="name">xml</div>
+                <div class="code-name">&amp;#xe6b2;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6b4;</span>
+                <div class="name">video</div>
+                <div class="code-name">&amp;#xe6b4;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6b9;</span>
+                <div class="name">vue</div>
+                <div class="code-name">&amp;#xe6b9;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6be;</span>
+                <div class="name">zip</div>
+                <div class="code-name">&amp;#xe6be;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1656663119632') format('woff2'),
+       url('iconfont.woff?t=1656663119632') format('woff'),
+       url('iconfont.ttf?t=1656663119632') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-babel"></span>
+            <div class="name">
+              babel
+            </div>
+            <div class="code-name">.icon-babel
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-shangchuan1"></span>
+            <div class="name">
+              上传
+            </div>
+            <div class="code-name">.icon-shangchuan1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-bianji"></span>
+            <div class="name">
+              编辑
+            </div>
+            <div class="code-name">.icon-bianji
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-guanbi"></span>
+            <div class="name">
+              关闭
+            </div>
+            <div class="code-name">.icon-guanbi
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-xinzeng"></span>
+            <div class="name">
+              新增
+            </div>
+            <div class="code-name">.icon-xinzeng
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-add_file"></span>
+            <div class="name">
+              add_file,新建,新增,文件夹
+            </div>
+            <div class="code-name">.icon-add_file
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-24gf-folderOpen"></span>
+            <div class="name">
+              24gf-folderOpen
+            </div>
+            <div class="code-name">.icon-24gf-folderOpen
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-bg-folder"></span>
+            <div class="name">
+              bg-folder
+            </div>
+            <div class="code-name">.icon-bg-folder
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-word"></span>
+            <div class="name">
+              word
+            </div>
+            <div class="code-name">.icon-word
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-powerpoint"></span>
+            <div class="name">
+              powerpoint
+            </div>
+            <div class="code-name">.icon-powerpoint
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-word1"></span>
+            <div class="name">
+              word
+            </div>
+            <div class="code-name">.icon-word1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-excel"></span>
+            <div class="name">
+              excel
+            </div>
+            <div class="code-name">.icon-excel
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-audio"></span>
+            <div class="name">
+              audio
+            </div>
+            <div class="code-name">.icon-audio
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-angular-resolver"></span>
+            <div class="name">
+              angular-resolver
+            </div>
+            <div class="code-name">.icon-angular-resolver
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-ejs"></span>
+            <div class="name">
+              ejs
+            </div>
+            <div class="code-name">.icon-ejs
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-favicon"></span>
+            <div class="name">
+              favicon
+            </div>
+            <div class="code-name">.icon-favicon
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-eslint"></span>
+            <div class="name">
+              eslint
+            </div>
+            <div class="code-name">.icon-eslint
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-file"></span>
+            <div class="name">
+              file
+            </div>
+            <div class="code-name">.icon-file
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-contributing"></span>
+            <div class="name">
+              contributing
+            </div>
+            <div class="code-name">.icon-contributing
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-css"></span>
+            <div class="name">
+              css
+            </div>
+            <div class="code-name">.icon-css
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-document"></span>
+            <div class="name">
+              document
+            </div>
+            <div class="code-name">.icon-document
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-html"></span>
+            <div class="name">
+              html
+            </div>
+            <div class="code-name">.icon-html
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-git"></span>
+            <div class="name">
+              git
+            </div>
+            <div class="code-name">.icon-git
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-javascript-map"></span>
+            <div class="name">
+              javascript-map
+            </div>
+            <div class="code-name">.icon-javascript-map
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-json"></span>
+            <div class="name">
+              json
+            </div>
+            <div class="code-name">.icon-json
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-less"></span>
+            <div class="name">
+              less
+            </div>
+            <div class="code-name">.icon-less
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-mdx"></span>
+            <div class="name">
+              mdx
+            </div>
+            <div class="code-name">.icon-mdx
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-image"></span>
+            <div class="name">
+              image
+            </div>
+            <div class="code-name">.icon-image
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-javascript"></span>
+            <div class="name">
+              javascript
+            </div>
+            <div class="code-name">.icon-javascript
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-nodejs"></span>
+            <div class="name">
+              nodejs
+            </div>
+            <div class="code-name">.icon-nodejs
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-npm"></span>
+            <div class="name">
+              npm
+            </div>
+            <div class="code-name">.icon-npm
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-nuxt"></span>
+            <div class="name">
+              nuxt
+            </div>
+            <div class="code-name">.icon-nuxt
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-pdf"></span>
+            <div class="name">
+              pdf
+            </div>
+            <div class="code-name">.icon-pdf
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-react1"></span>
+            <div class="name">
+              react
+            </div>
+            <div class="code-name">.icon-react1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-react_ts"></span>
+            <div class="name">
+              react_ts
+            </div>
+            <div class="code-name">.icon-react_ts
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-python"></span>
+            <div class="name">
+              python
+            </div>
+            <div class="code-name">.icon-python
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-sass"></span>
+            <div class="name">
+              sass
+            </div>
+            <div class="code-name">.icon-sass
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-typescript"></span>
+            <div class="name">
+              typescript
+            </div>
+            <div class="code-name">.icon-typescript
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-xml"></span>
+            <div class="name">
+              xml
+            </div>
+            <div class="code-name">.icon-xml
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-video"></span>
+            <div class="name">
+              video
+            </div>
+            <div class="code-name">.icon-video
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-vue"></span>
+            <div class="name">
+              vue
+            </div>
+            <div class="code-name">.icon-vue
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-zip"></span>
+            <div class="name">
+              zip
+            </div>
+            <div class="code-name">.icon-zip
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-babel"></use>
+                </svg>
+                <div class="name">babel</div>
+                <div class="code-name">#icon-babel</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-shangchuan1"></use>
+                </svg>
+                <div class="name">上传</div>
+                <div class="code-name">#icon-shangchuan1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-bianji"></use>
+                </svg>
+                <div class="name">编辑</div>
+                <div class="code-name">#icon-bianji</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-guanbi"></use>
+                </svg>
+                <div class="name">关闭</div>
+                <div class="code-name">#icon-guanbi</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-xinzeng"></use>
+                </svg>
+                <div class="name">新增</div>
+                <div class="code-name">#icon-xinzeng</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-add_file"></use>
+                </svg>
+                <div class="name">add_file,新建,新增,文件夹</div>
+                <div class="code-name">#icon-add_file</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-24gf-folderOpen"></use>
+                </svg>
+                <div class="name">24gf-folderOpen</div>
+                <div class="code-name">#icon-24gf-folderOpen</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-bg-folder"></use>
+                </svg>
+                <div class="name">bg-folder</div>
+                <div class="code-name">#icon-bg-folder</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-word"></use>
+                </svg>
+                <div class="name">word</div>
+                <div class="code-name">#icon-word</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-powerpoint"></use>
+                </svg>
+                <div class="name">powerpoint</div>
+                <div class="code-name">#icon-powerpoint</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-word1"></use>
+                </svg>
+                <div class="name">word</div>
+                <div class="code-name">#icon-word1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-excel"></use>
+                </svg>
+                <div class="name">excel</div>
+                <div class="code-name">#icon-excel</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-audio"></use>
+                </svg>
+                <div class="name">audio</div>
+                <div class="code-name">#icon-audio</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-angular-resolver"></use>
+                </svg>
+                <div class="name">angular-resolver</div>
+                <div class="code-name">#icon-angular-resolver</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-ejs"></use>
+                </svg>
+                <div class="name">ejs</div>
+                <div class="code-name">#icon-ejs</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-favicon"></use>
+                </svg>
+                <div class="name">favicon</div>
+                <div class="code-name">#icon-favicon</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-eslint"></use>
+                </svg>
+                <div class="name">eslint</div>
+                <div class="code-name">#icon-eslint</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-file"></use>
+                </svg>
+                <div class="name">file</div>
+                <div class="code-name">#icon-file</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-contributing"></use>
+                </svg>
+                <div class="name">contributing</div>
+                <div class="code-name">#icon-contributing</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-css"></use>
+                </svg>
+                <div class="name">css</div>
+                <div class="code-name">#icon-css</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-document"></use>
+                </svg>
+                <div class="name">document</div>
+                <div class="code-name">#icon-document</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-html"></use>
+                </svg>
+                <div class="name">html</div>
+                <div class="code-name">#icon-html</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-git"></use>
+                </svg>
+                <div class="name">git</div>
+                <div class="code-name">#icon-git</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-javascript-map"></use>
+                </svg>
+                <div class="name">javascript-map</div>
+                <div class="code-name">#icon-javascript-map</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-json"></use>
+                </svg>
+                <div class="name">json</div>
+                <div class="code-name">#icon-json</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-less"></use>
+                </svg>
+                <div class="name">less</div>
+                <div class="code-name">#icon-less</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-mdx"></use>
+                </svg>
+                <div class="name">mdx</div>
+                <div class="code-name">#icon-mdx</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-image"></use>
+                </svg>
+                <div class="name">image</div>
+                <div class="code-name">#icon-image</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-javascript"></use>
+                </svg>
+                <div class="name">javascript</div>
+                <div class="code-name">#icon-javascript</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-nodejs"></use>
+                </svg>
+                <div class="name">nodejs</div>
+                <div class="code-name">#icon-nodejs</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-npm"></use>
+                </svg>
+                <div class="name">npm</div>
+                <div class="code-name">#icon-npm</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-nuxt"></use>
+                </svg>
+                <div class="name">nuxt</div>
+                <div class="code-name">#icon-nuxt</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-pdf"></use>
+                </svg>
+                <div class="name">pdf</div>
+                <div class="code-name">#icon-pdf</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-react1"></use>
+                </svg>
+                <div class="name">react</div>
+                <div class="code-name">#icon-react1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-react_ts"></use>
+                </svg>
+                <div class="name">react_ts</div>
+                <div class="code-name">#icon-react_ts</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-python"></use>
+                </svg>
+                <div class="name">python</div>
+                <div class="code-name">#icon-python</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-sass"></use>
+                </svg>
+                <div class="name">sass</div>
+                <div class="code-name">#icon-sass</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-typescript"></use>
+                </svg>
+                <div class="name">typescript</div>
+                <div class="code-name">#icon-typescript</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-xml"></use>
+                </svg>
+                <div class="name">xml</div>
+                <div class="code-name">#icon-xml</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-video"></use>
+                </svg>
+                <div class="name">video</div>
+                <div class="code-name">#icon-video</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-vue"></use>
+                </svg>
+                <div class="name">vue</div>
+                <div class="code-name">#icon-vue</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-zip"></use>
+                </svg>
+                <div class="name">zip</div>
+                <div class="code-name">#icon-zip</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 183 - 0
src/assets/iconfong/iconfont.css

@@ -0,0 +1,183 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 3462405 */
+  src: url('iconfont.woff2?t=1656663119632') format('woff2'),
+       url('iconfont.woff?t=1656663119632') format('woff'),
+       url('iconfont.ttf?t=1656663119632') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-babel:before {
+  content: "\e62d";
+}
+
+.icon-shangchuan1:before {
+  content: "\e691";
+}
+
+.icon-bianji:before {
+  content: "\e600";
+}
+
+.icon-guanbi:before {
+  content: "\eb6a";
+}
+
+.icon-xinzeng:before {
+  content: "\e6a4";
+}
+
+.icon-add_file:before {
+  content: "\e663";
+}
+
+.icon-24gf-folderOpen:before {
+  content: "\eac5";
+}
+
+.icon-bg-folder:before {
+  content: "\e648";
+}
+
+.icon-word:before {
+  content: "\e601";
+}
+
+.icon-powerpoint:before {
+  content: "\e60a";
+}
+
+.icon-word1:before {
+  content: "\e613";
+}
+
+.icon-excel:before {
+  content: "\e61c";
+}
+
+.icon-audio:before {
+  content: "\e623";
+}
+
+.icon-angular-resolver:before {
+  content: "\e625";
+}
+
+.icon-ejs:before {
+  content: "\e634";
+}
+
+.icon-favicon:before {
+  content: "\e636";
+}
+
+.icon-eslint:before {
+  content: "\e635";
+}
+
+.icon-file:before {
+  content: "\e637";
+}
+
+.icon-contributing:before {
+  content: "\e639";
+}
+
+.icon-css:before {
+  content: "\e63a";
+}
+
+.icon-document:before {
+  content: "\e63d";
+}
+
+.icon-html:before {
+  content: "\e656";
+}
+
+.icon-git:before {
+  content: "\e658";
+}
+
+.icon-javascript-map:before {
+  content: "\e65e";
+}
+
+.icon-json:before {
+  content: "\e65f";
+}
+
+.icon-less:before {
+  content: "\e662";
+}
+
+.icon-mdx:before {
+  content: "\e666";
+}
+
+.icon-image:before {
+  content: "\e669";
+}
+
+.icon-javascript:before {
+  content: "\e66b";
+}
+
+.icon-nodejs:before {
+  content: "\e683";
+}
+
+.icon-npm:before {
+  content: "\e685";
+}
+
+.icon-nuxt:before {
+  content: "\e686";
+}
+
+.icon-pdf:before {
+  content: "\e687";
+}
+
+.icon-react1:before {
+  content: "\e689";
+}
+
+.icon-react_ts:before {
+  content: "\e68a";
+}
+
+.icon-python:before {
+  content: "\e690";
+}
+
+.icon-sass:before {
+  content: "\e69a";
+}
+
+.icon-typescript:before {
+  content: "\e6a3";
+}
+
+.icon-xml:before {
+  content: "\e6b2";
+}
+
+.icon-video:before {
+  content: "\e6b4";
+}
+
+.icon-vue:before {
+  content: "\e6b9";
+}
+
+.icon-zip:before {
+  content: "\e6be";
+}
+

File diff suppressed because it is too large
+ 0 - 0
src/assets/iconfong/iconfont.js


+ 303 - 0
src/assets/iconfong/iconfont.json

@@ -0,0 +1,303 @@
+{
+  "id": "3462405",
+  "name": "组件",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "13302950",
+      "name": "babel",
+      "font_class": "babel",
+      "unicode": "e62d",
+      "unicode_decimal": 58925
+    },
+    {
+      "icon_id": "17898907",
+      "name": "上传",
+      "font_class": "shangchuan1",
+      "unicode": "e691",
+      "unicode_decimal": 59025
+    },
+    {
+      "icon_id": "1264",
+      "name": "编辑",
+      "font_class": "bianji",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "4118038",
+      "name": "关闭",
+      "font_class": "guanbi",
+      "unicode": "eb6a",
+      "unicode_decimal": 60266
+    },
+    {
+      "icon_id": "6595567",
+      "name": "新增",
+      "font_class": "xinzeng",
+      "unicode": "e6a4",
+      "unicode_decimal": 59044
+    },
+    {
+      "icon_id": "11734501",
+      "name": "add_file,新建,新增,文件夹",
+      "font_class": "add_file",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "7594875",
+      "name": "24gf-folderOpen",
+      "font_class": "24gf-folderOpen",
+      "unicode": "eac5",
+      "unicode_decimal": 60101
+    },
+    {
+      "icon_id": "11882917",
+      "name": "bg-folder",
+      "font_class": "bg-folder",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "13301799",
+      "name": "word",
+      "font_class": "word",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "13301840",
+      "name": "powerpoint",
+      "font_class": "powerpoint",
+      "unicode": "e60a",
+      "unicode_decimal": 58890
+    },
+    {
+      "icon_id": "13301856",
+      "name": "word",
+      "font_class": "word1",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "13301872",
+      "name": "excel",
+      "font_class": "excel",
+      "unicode": "e61c",
+      "unicode_decimal": 58908
+    },
+    {
+      "icon_id": "13302908",
+      "name": "audio",
+      "font_class": "audio",
+      "unicode": "e623",
+      "unicode_decimal": 58915
+    },
+    {
+      "icon_id": "13302915",
+      "name": "angular-resolver",
+      "font_class": "angular-resolver",
+      "unicode": "e625",
+      "unicode_decimal": 58917
+    },
+    {
+      "icon_id": "13303086",
+      "name": "ejs",
+      "font_class": "ejs",
+      "unicode": "e634",
+      "unicode_decimal": 58932
+    },
+    {
+      "icon_id": "13303092",
+      "name": "favicon",
+      "font_class": "favicon",
+      "unicode": "e636",
+      "unicode_decimal": 58934
+    },
+    {
+      "icon_id": "13303093",
+      "name": "eslint",
+      "font_class": "eslint",
+      "unicode": "e635",
+      "unicode_decimal": 58933
+    },
+    {
+      "icon_id": "13303095",
+      "name": "file",
+      "font_class": "file",
+      "unicode": "e637",
+      "unicode_decimal": 58935
+    },
+    {
+      "icon_id": "13303102",
+      "name": "contributing",
+      "font_class": "contributing",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "13303106",
+      "name": "css",
+      "font_class": "css",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "13303116",
+      "name": "document",
+      "font_class": "document",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "13303484",
+      "name": "html",
+      "font_class": "html",
+      "unicode": "e656",
+      "unicode_decimal": 58966
+    },
+    {
+      "icon_id": "13303493",
+      "name": "git",
+      "font_class": "git",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "13303525",
+      "name": "javascript-map",
+      "font_class": "javascript-map",
+      "unicode": "e65e",
+      "unicode_decimal": 58974
+    },
+    {
+      "icon_id": "13303526",
+      "name": "json",
+      "font_class": "json",
+      "unicode": "e65f",
+      "unicode_decimal": 58975
+    },
+    {
+      "icon_id": "13303535",
+      "name": "less",
+      "font_class": "less",
+      "unicode": "e662",
+      "unicode_decimal": 58978
+    },
+    {
+      "icon_id": "13303547",
+      "name": "mdx",
+      "font_class": "mdx",
+      "unicode": "e666",
+      "unicode_decimal": 58982
+    },
+    {
+      "icon_id": "13303553",
+      "name": "image",
+      "font_class": "image",
+      "unicode": "e669",
+      "unicode_decimal": 58985
+    },
+    {
+      "icon_id": "13303558",
+      "name": "javascript",
+      "font_class": "javascript",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "13303942",
+      "name": "nodejs",
+      "font_class": "nodejs",
+      "unicode": "e683",
+      "unicode_decimal": 59011
+    },
+    {
+      "icon_id": "13303947",
+      "name": "npm",
+      "font_class": "npm",
+      "unicode": "e685",
+      "unicode_decimal": 59013
+    },
+    {
+      "icon_id": "13303949",
+      "name": "nuxt",
+      "font_class": "nuxt",
+      "unicode": "e686",
+      "unicode_decimal": 59014
+    },
+    {
+      "icon_id": "13303952",
+      "name": "pdf",
+      "font_class": "pdf",
+      "unicode": "e687",
+      "unicode_decimal": 59015
+    },
+    {
+      "icon_id": "13304019",
+      "name": "react",
+      "font_class": "react1",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "13304020",
+      "name": "react_ts",
+      "font_class": "react_ts",
+      "unicode": "e68a",
+      "unicode_decimal": 59018
+    },
+    {
+      "icon_id": "13304033",
+      "name": "python",
+      "font_class": "python",
+      "unicode": "e690",
+      "unicode_decimal": 59024
+    },
+    {
+      "icon_id": "13304056",
+      "name": "sass",
+      "font_class": "sass",
+      "unicode": "e69a",
+      "unicode_decimal": 59034
+    },
+    {
+      "icon_id": "13304114",
+      "name": "typescript",
+      "font_class": "typescript",
+      "unicode": "e6a3",
+      "unicode_decimal": 59043
+    },
+    {
+      "icon_id": "13304136",
+      "name": "xml",
+      "font_class": "xml",
+      "unicode": "e6b2",
+      "unicode_decimal": 59058
+    },
+    {
+      "icon_id": "13304139",
+      "name": "video",
+      "font_class": "video",
+      "unicode": "e6b4",
+      "unicode_decimal": 59060
+    },
+    {
+      "icon_id": "13304145",
+      "name": "vue",
+      "font_class": "vue",
+      "unicode": "e6b9",
+      "unicode_decimal": 59065
+    },
+    {
+      "icon_id": "13304154",
+      "name": "zip",
+      "font_class": "zip",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    }
+  ]
+}

BIN
src/assets/iconfong/iconfont.ttf


BIN
src/assets/iconfong/iconfont.woff


BIN
src/assets/iconfong/iconfont.woff2


+ 4 - 0
src/main.ts

@@ -1,4 +1,8 @@
 import '/@/design/index.less';
+
+//lxh
+import './assets/iconfong/iconfont.css';
+import './assets/iconfong/iconfont.js';
 // 注册 windi
 import 'virtual:windi-base.css';
 import 'virtual:windi-components.css';

+ 4 - 3
src/views/vent/performance/comment/DeviceModal.vue

@@ -9,15 +9,16 @@
     :footer="null"
     destroyOnClose
   >
-    <FormModal :record="record" @saveOrUpdate="(values) => emit('saveOrUpdate', values)" />
+    <iframe width="100%" height="100%" src="/fileEdit.html" frameborder="0" scrolling="no"></iframe>
+    <!-- <FormModal :record="record" @saveOrUpdate="(values) => emit('saveOrUpdate', values)" /> -->
   </BasicModal>
 </template>
 <script lang="ts" setup>
   import { computed, unref, inject, reactive } from 'vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
-  import FormModal from './FormModal.vue';
+  // import FormModal from './FormModal.vue';
   // 声明Emits
-  const emit = defineEmits(['saveOrUpdate', 'register']);
+  // const emit = defineEmits(['saveOrUpdate', 'register']);
   const isUpdate = inject('isUpdate');
   const record = reactive({ strtype: '', strname: '' });
 

+ 60 - 13
src/views/vent/performance/comment/NormalTable.vue

@@ -25,6 +25,18 @@
   import { useListPage } from '/@/hooks/system/useListPage';
 
   const props = defineProps({
+    //查询参数
+    searchParam: {
+      type: String,
+      default: '',
+    },
+    //菜单树传递参数
+    nodeParam: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
     columnsType: {
       type: String,
       // required: true,
@@ -47,6 +59,11 @@
       type: Function,
       required: true,
     },
+    //下载文件接口
+    downLoad: {
+      type: Function,
+      required: true,
+    },
 
     deleteById: {
       type: Function,
@@ -114,9 +131,9 @@
       useSearchForm: false, //不使用查询条件
       pagination: false, //不使用分页组件
       beforeFetch: (params) => {
-        params.parentId = '';
-        params.selectFlag = true;
-        params.likeFileName = '';
+        params.parentId = props.nodeParam.id ? props.nodeParam.id : '';
+        params.selectFlag = props.nodeParam.id ? false : true;
+        params.likeFileName = props.searchParam ? props.searchParam : '';
         // return Object.assign({ column: '111', order: 'd11' }, params);
         // return Object.assign({ parentId: '', selectFlag: true, likeFileName: '' }, params);
       },
@@ -162,7 +179,37 @@
    * 删除事件
    */
   async function handleDelete(record) {
-    await props.deleteById({ id: record }, reload);
+    await props.deleteById({ id: record.id }, reload);
+  }
+
+  //下载文件
+  function handleDownLoad(record) {
+    console.log(record, '下载');
+    props.downLoad({ id: record.id }).then((res) => {
+      console.log(res, '文件下载成功');
+      let filename = `${record.fileName}`;
+      downFilePublic(res, filename);
+    });
+  }
+  // 下载公用方法
+  function downFilePublic(content, fileName) {
+    const blob = new Blob([content], { type: 'application/xlsx;charset=UTF-8' }); // 构造一个blob对象来处理数据
+    // 对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
+    // IE10以上支持blob但是依然不支持download
+    if ('download' in document.createElement('a')) {
+      // 支持a标签download的浏览器
+      const link = document.createElement('a'); // 创建a标签
+      link.download = fileName; // a标签添加属性
+      link.style.display = 'none';
+      link.href = URL.createObjectURL(blob);
+      document.body.appendChild(link);
+      link.click(); // 执行下载
+      URL.revokeObjectURL(link.href); // 释放url
+      document.body.removeChild(link); // 释放标签
+    } else {
+      // 其他浏览器
+      navigator.msSaveBlob(blob, fileName);
+    }
   }
 
   /**
@@ -178,10 +225,10 @@
    */
   function getActions(record) {
     return [
-      {
-        label: '详情',
-        onClick: handleEdit.bind(null, record),
-      },
+      // {
+      //   label: '详情',
+      //   onClick: handleEdit.bind(null, record),
+      // },
       {
         label: '编辑',
         onClick: handleEdit.bind(null, record),
@@ -195,13 +242,13 @@
       },
       {
         label: '下载',
-        onClick: handleEdit.bind(null, record),
-      },
-      {
-        label: '审批',
-        onClick: handleEdit.bind(null, record),
+        onClick: handleDownLoad.bind(null, record),
       },
       // {
+      //   label: '审批',
+      //   onClick: handleEdit.bind(null, record),
+      // },
+      // {
       //   label: '查看',
       //   onClick: handleDetail.bind(null, record),
       // },

+ 12 - 0
src/views/vent/performance/fileDetail/commen/Icon/index.vue

@@ -0,0 +1,12 @@
+<template>
+  <svg aria-hidden="true">
+    <use :xlink:href="name" />
+  </svg>
+</template>
+<script setup lang="ts">
+  import { computed } from 'vue';
+  const props = defineProps<{
+    iconName: string;
+  }>();
+  const name = computed(() => `#${props.iconName}`);
+</script>

+ 42 - 0
src/views/vent/performance/fileDetail/commen/Icon/treeIcon.vue

@@ -0,0 +1,42 @@
+<template>
+  <icon class="iconfont" :iconName="iconNam" />
+</template>
+<script setup lang="ts">
+  import icon from './index.vue';
+  import { computed } from 'vue';
+  const type = {
+    file: 'icon-document',
+    // js: 'icon-javascript',
+    // json: 'icon-json',
+    // vue: 'icon-vue',
+    // scss: 'icon-sass',
+    // file: 'icon-file',
+    // md: 'icon-mdx',
+    // tsx: 'icon-react1',
+    // ts: 'icon-typescript',
+    // css: 'icon-css',
+    // png: 'icon-image',
+    // jpg: 'icon-image',
+    // jpeg: 'icon-image',
+    // webp: 'icon-image',
+    // gif: 'icon-image',
+    // html: 'icon-html',
+    // babelrc: 'icon-babel',
+  };
+  const props = defineProps({
+    title: String,
+  });
+  const iconNam = computed(() => {
+    // const suffix = (props.title || '.file').split('.').pop().toLowerCase();
+    // console.log(suffix, 'suffix');
+    // if (props.title == 'package.json') return 'icon-npm';
+    // return type[suffix];
+    return type['file'];
+  });
+</script>
+<style lang="less" scoped>
+  .iconfont {
+    width: 16px;
+    height: 16px;
+  }
+</style>

+ 120 - 0
src/views/vent/performance/fileDetail/commen/fileSystem.vue

@@ -0,0 +1,120 @@
+<template>
+  <treeList
+    v-for="model in list"
+    v-bind="$attrs"
+    :model="model"
+    :key="model.id"
+    @delete-node="onDeltet"
+    @add-node="onAddNode"
+    @on-drop="drop"
+    @add-folder="onAddFolder"
+    @dragStart="dragStart"
+  >
+    <template #icon="slotProps">
+      <slot name="icon" v-bind="slotProps"></slot>
+    </template>
+    <template #operation="slotProps">
+      <slot name="operation" v-bind="slotProps"></slot>
+    </template>
+  </treeList>
+</template>
+<script setup lang="ts">
+  import { ref } from 'vue';
+  import treeList from './treeList.vue';
+  const emit = defineEmits(['onDrop', 'deleteNode']);
+  interface IFileSystem {
+    id: string;
+    title: string;
+    pid: string;
+    isFolder: boolean;
+    isAdd: boolean;
+    children?: IFileSystem[];
+  }
+  const compInOperation = ref(null);
+  const props = withDefaults(
+    defineProps<{
+      list: IFileSystem[];
+    }>(),
+    {}
+  );
+  // 递归寻找父组件
+  function findParent(pid, Tree) {
+    let targetNode = null;
+    function find(item, flattenTree) {
+      flattenTree.find((ele) => {
+        if (ele.id == pid) {
+          targetNode = ele;
+          return true;
+        } else {
+          if (ele.children) {
+            find(pid, ele.children);
+          }
+        }
+      });
+    }
+    find(pid, Tree);
+    return targetNode.children;
+  }
+  // 删除
+  const onDeltet = (node) => {
+    const pid = node.pid;
+    if (pid) {
+      const parent = findParent(pid, props.list);
+      parent.splice(
+        parent.findIndex((item) => item.id == node.id),
+        1
+      );
+    } else {
+      props.list.splice(
+        props.list.findIndex((item) => item.id == node.id),
+        1
+      );
+    }
+
+    emit('deleteNode', {
+      ...node,
+      eventType: 'delete',
+    });
+  };
+  // // 添加
+  // const onAddNode = (node) => {
+  //   console.log(node);
+  // };
+  // 拖拽
+  const drop = (node) => {
+    const pid = compInOperation.value.pid;
+    if (pid) {
+      const parent: any = findParent(pid, props.list);
+      parent.splice(
+        parent.findIndex((item) => item.id == compInOperation.value.id),
+        1
+      );
+    } else {
+      props.list.splice(
+        props.list.findIndex((item) => item.id == compInOperation.value.id),
+        1
+      );
+    }
+    console.log(node);
+    if (node.isFolder) {
+      compInOperation.value.pid = node.id;
+      node.children.push(compInOperation.value);
+    } else {
+      compInOperation.value.pid = null;
+      props.list.push(compInOperation.value);
+    }
+    emit('onDrop', {
+      target: node,
+      node: compInOperation.value,
+    });
+  };
+  // // 添加文件
+  // const onAddFolder = (node) => {
+  //   console.log(node);
+  // };
+  // 拖拽开始选中node
+  const dragStart = (node) => {
+    compInOperation.value = node;
+  };
+</script>
+<style scoped></style>

+ 99 - 0
src/views/vent/performance/fileDetail/commen/list.ts

@@ -0,0 +1,99 @@
+export const list = [
+  {
+    id: 1,
+    isFolder: true,
+    title: '全部',
+    pid: null,
+    fileNameArr: ['全部'],
+    children: [
+      {
+        id: 7,
+        pid: 1,
+        isFolder: false,
+        fileNameArr: ['审批流文件', '文件共享中心'],
+        title: '审批流文件',
+      },
+      {
+        id: 8,
+        pid: 1,
+        isFolder: true,
+        fileNameArr: ['审批流文件', '文件共享中心'],
+        title: '文件共享中心',
+        children: [
+          {
+            id: 9,
+            pid: 8,
+            isFolder: false,
+            fileNameArr: ['台账类文件', '法律法规文件', '基础资料', '检验报告', '其他'],
+            title: '台账类文件',
+          },
+          {
+            id: 10,
+            pid: 8,
+            isFolder: false,
+            fileNameArr: ['台账类文件', '法律法规文件', '基础资料', '检验报告', '其他'],
+            title: '法律法规文件',
+          },
+          {
+            id: 11,
+            pid: 8,
+            isFolder: false,
+            fileNameArr: ['台账类文件', '法律法规文件', '基础资料', '检验报告', '其他'],
+            title: '基础资料',
+          },
+          {
+            id: 12,
+            pid: 8,
+            isFolder: false,
+            fileNameArr: ['台账类文件', '法律法规文件', '基础资料', '检验报告', '其他'],
+            title: '检验报告',
+          },
+          {
+            id: 13,
+            pid: 8,
+            isFolder: false,
+            fileNameArr: ['台账类文件', '法律法规文件', '基础资料', '检验报告', '其他'],
+            title: '其他',
+          },
+        ],
+      },
+    ],
+  },
+  // {
+  //   id: 2,
+  //   isFolder: true,
+  //   title: 'dist',
+  //   pid: null,
+  //   fileNameArr: ['src', 'dist', 'package.json', 'README.md'],
+  //   children: [
+  //     {
+  //       id: 5,
+  //       pid: 2,
+  //       isFolder: false,
+  //       fileNameArr: ['index.html', 'index.js'],
+  //       title: 'index.html',
+  //     },
+  //     {
+  //       id: 6,
+  //       pid: 2,
+  //       isFolder: false,
+  //       fileNameArr: ['index.html', 'index.js'],
+  //       title: 'index.js',
+  //     },
+  //   ],
+  // },
+  // {
+  //   id: 3,
+  //   pid: null,
+  //   title: 'package.json',
+  //   fileNameArr: ['src', 'dist', 'package.json', 'README.md'],
+  //   isFolder: false,
+  // },
+  // {
+  //   id: 4,
+  //   pid: null,
+  //   title: 'README.md',
+  //   fileNameArr: ['src', 'dist', 'package.json', 'README.md'],
+  //   isFolder: false,
+  // },
+];

+ 358 - 0
src/views/vent/performance/fileDetail/commen/treeList.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="vtl-node" :id="model.id" :class="{ 'vtl-leaf-node': !isFolder, 'vtl-tree-node': isFolder }">
+    <div
+      :class="treeNodeClass"
+      :draggable="draggable"
+      @dragover="dragOver"
+      @drop="drop"
+      @dragstart="dragStart"
+      @mouseover="mouseOver"
+      @dragenter="dragEnter"
+      @dragleave="dragLeave"
+      @mouseout="mouseOut"
+      @click.stop="toggle"
+    >
+      <div class="vtl-border-text">
+        <template v-if="isFolder">
+          <slot v-if="expanded" :item="{ title: model.title, isFolder: true, expanded: true }" name="icon"> </slot>
+          <slot v-else :item="{ title: model.title, isFolder: true, expanded: false }" name="icon"></slot>
+        </template>
+        <slot v-else :item="{ title: model.title, isFolder: false }" name="icon"></slot>
+        <span class="vtl-node-content ellipsis" v-if="!editable && !model.isAdd">
+          {{ model.title }}
+        </span>
+        <input v-else class="vtl-input" type="text" ref="nodeInput" v-model="model.title" @blur="setUnEditable" />
+      </div>
+      <div class="vtl-operation" v-show="isHover && !editable && !model.isAdd">
+        <!-- <span @click.stop.prevent="addChildFolder" v-if="isFolder">
+          <slot name="operation" type="addFolder"></slot>
+        </span> -->
+        <span @click.stop.prevent="addChildDocument" v-if="isFolder">
+          <slot name="operation" type="addDocument"></slot>
+        </span>
+        <span @click.stop.prevent="setEditable">
+          <slot name="operation" type="Editable"></slot>
+        </span>
+        <span @click.stop.prevent="delNode">
+          <slot name="operation" type="deleteNode"></slot>
+        </span>
+      </div>
+    </div>
+  </div>
+  <div class="vtl-tree-margin" v-show="expanded" v-if="isFolder">
+    <!-- 这里无法使用$attr来透传属性官方还未解决此bug -->
+    <treeList
+      @on-click="(depth) => $emit('onClick', depth)"
+      @change-name="(depth) => $emit('changeName', depth)"
+      @delete-node="(depth) => $emit('deleteNode', depth)"
+      @add-node="(depth) => $emit('addNode', depth)"
+      @on-drop="(depth) => $emit('onDrop', depth)"
+      @add-folder="(depth) => $emit('addFolder', depth)"
+      @dragStart="(depth) => $emit('dragStart', depth)"
+      @setDragEnterNode="setDragEnterNode"
+      @setDragFile="setDragFile"
+      @setDragFolder="setDragFolder"
+      v-for="newmodel in model.children"
+      :selected="selected"
+      :model="newmodel"
+      :key="newmodel.id"
+    >
+      <template #icon="slotProps">
+        <slot name="icon" v-bind="slotProps"></slot>
+      </template>
+      <template #operation="slotProps">
+        <slot name="operation" v-bind="slotProps"></slot>
+      </template>
+    </treeList>
+  </div>
+</template>
+<script setup lang="ts">
+  import { computed, ref, watchEffect } from 'vue';
+  interface IFileSystem {
+    id: string;
+    title: string;
+    pid: string;
+    isFolder: boolean;
+    isAdd: boolean;
+    children?: IFileSystem[];
+  }
+  // 吐出去的事件
+  const emit = defineEmits([
+    'onClick',
+    'changeName',
+    'deleteNode',
+    'addNode',
+    'addFolder',
+    'onDrop',
+    'setDragEnterNode',
+    'setDragFile',
+    'setDragFolder',
+    'dragStart',
+  ]);
+  // 拿到传入的值
+  const props = withDefaults(
+    defineProps<{
+      model: IFileSystem;
+      draggable?: boolean;
+      selected?: IFileSystem;
+    }>(),
+    {
+      draggable: true,
+    }
+  );
+  //是否移入
+  const isHover = ref(false);
+  // 修改目录名字
+  const editable = ref(false);
+  // 拖拽移入
+  const isDragEnterNode = ref(false);
+  // 是否拖拽文件
+  const isDragFile = ref(false);
+  // 是否展开
+  const expanded = ref(true);
+  // inputRef
+  const nodeInput = ref(null);
+  // 是否是文件夹
+  const isFolder = computed(() => {
+    return props.model.isFolder;
+  });
+  const isSelected = computed(() => props.selected.id === props.model.id);
+  // 拖拽样式
+  const treeNodeClass = computed(() => {
+    return {
+      'vtl-node-main': true,
+      'vtl-active': isDragEnterNode.value,
+      'vtl-active-file': isDragFile.value,
+      selected: isSelected.value,
+    };
+  });
+  // 最后一个移入的内容保存为了防止重复移入
+  let lastenter = null;
+  // 删除目录
+  const delNode = () => {
+    emit('deleteNode', {
+      ...props.model,
+      eventType: 'delete',
+    });
+  };
+  // 选中effect
+  watchEffect(() => {
+    const $input = nodeInput.value;
+    if ($input) {
+      // 获取焦点
+      $input.focus();
+      // 设置光标位置
+      $input.setSelectionRange(0, $input.value.length);
+    }
+  });
+  // 编辑目录名字
+  const setEditable = () => {
+    editable.value = true;
+    props.model.isAdd = false; //lxh
+  };
+  // 修改目录名字
+  const setUnEditable = (e) => {
+    if (props.model.isAdd) {
+      console.log('新增文档失去焦点');
+      props.model.isAdd = false;
+      emit('addNode', {
+        id: props.model.id,
+        isFolder: false,
+        newName: props.model.title,
+      });
+    } else if (editable.value) {
+      console.log('编辑文档失去焦点');
+      editable.value = false;
+      props.model.title = e.target.value;
+      emit('changeName', {
+        id: props.model.id,
+        pid: props.model.pid,
+        isAdd: props.model.isAdd,
+        newName: e.target.value,
+        eventType: 'blur',
+        isFolder: isFolder.value,
+      });
+    }
+  };
+  // 展开收起
+  const toggle = () => {
+    if (isFolder.value) {
+      expanded.value = !expanded.value;
+      emit('onClick', {
+        ...props.model,
+      }); //lxh
+    } else {
+      emit('onClick', {
+        ...props.model,
+      });
+    }
+  };
+  // 拖拽结束
+  const mouseOver = () => {
+    isHover.value = true;
+  };
+  // 移出
+  const mouseOut = () => {
+    isHover.value = false;
+  };
+  // // 添加目录
+  // const addChildFolder = () => {
+  //   props.model.isAdd = true; //lxh
+  //   props.model.title = '';//lxh
+  //   emit('addFolder', {
+  //     id: props.model.id,
+  //     isFolder: true,
+  //   });
+  // };
+  // 添加文件
+  const addChildDocument = (node) => {
+    props.model.title = ''; //lxh
+    props.model.isAdd = true; //lxh
+    editable.value = false; //
+  };
+  // 拖拽开始
+  const dragStart = () => {
+    console.log(0);
+    emit('dragStart', {
+      ...props.model,
+    });
+  };
+  const dragOver = (e) => {
+    e.preventDefault();
+    return true;
+  };
+
+  const dragEnter = (e) => {
+    lastenter = e.target;
+    console.log('进入', props.model.id);
+    // 由于 dragEnter 发生在 dragLeave 之前,导致必须要使用定时器做一个延时
+    setTimeout(() => {
+      if (isFolder.value) {
+        expanded.value = true;
+        isDragFile.value = true;
+      } else {
+        emit('setDragFile', true);
+      }
+      isDragEnterNode.value = true;
+      emit('setDragEnterNode', true);
+    });
+  };
+  const dragLeave = (e) => {
+    // 为了防止多次选中问题
+    if (lastenter == e.target) {
+      console.log('离开', props.model.id);
+      if (isFolder.value) {
+        isDragFile.value = false;
+      } else {
+        emit('setDragFile', false);
+      }
+      emit('setDragEnterNode', false);
+      isDragEnterNode.value = false;
+    }
+  };
+  const drop = (e) => {
+    isDragFile.value = false;
+    isDragEnterNode.value = false;
+    emit('setDragEnterNode', false);
+    emit('setDragFile', false);
+    // 为了获取路径需要判断是不是文件夹,如果不是文件夹向上找
+    if (isFolder.value) {
+      emit('onDrop', props.model);
+    } else {
+      if (props.model.pid) {
+        emit('setDragFolder');
+      } else {
+        emit('onDrop', props.model);
+      }
+    }
+  };
+  const setDragEnterNode = (bol) => {
+    isDragEnterNode.value = bol;
+  };
+  const setDragFile = (bol) => {
+    isDragFile.value = bol;
+  };
+  // 找到文件夹
+  const setDragFolder = () => {
+    emit('onDrop', props.model);
+  };
+</script>
+<style lang="less">
+  .vtl-node {
+    .vtl-node-main {
+      display: flex;
+      align-items: center;
+      padding: 2px 0 2px 1rem;
+      cursor: pointer;
+
+      &:hover {
+        .vtl-border-text {
+          width: 80%;
+        }
+      }
+
+      .vtl-border-text {
+        display: flex; //lxh
+        flex: 1;
+        align-items: center; //lxh
+        width: 100%;
+
+        .iconfont {
+          width: 16px;
+          height: 16px;
+          vertical-align: text-bottom;
+        }
+      }
+
+      &.selected {
+        background-color: rgb(36, 36, 36);
+      }
+
+      .vtl-input {
+        border: none;
+        max-width: 150px;
+        padding: 5px 0;
+        padding-left: 5px;
+        margin-left: 5px;
+
+        &:focus {
+          outline: none;
+        }
+      }
+
+      .vtl-node-content {
+        color: #fff;
+        padding-left: 5px;
+        font-size: 14px;
+        width: 80%;
+        display: inline-block;
+        vertical-align: bottom;
+      }
+
+      &:hover {
+        .vtl-node-content {
+          color: #fff;
+          overflow: hidden;
+        }
+      }
+
+      &.vtl-active {
+        * {
+          pointer-events: none;
+        }
+      }
+
+      &.vtl-active-file {
+        outline: 2px dashed #353f51;
+      }
+
+      .vtl-operation {
+        padding-right: 10px;
+      }
+    }
+  }
+
+  .vtl-tree-margin {
+    padding-left: 1em;
+  }
+</style>

+ 70 - 44
src/views/vent/performance/fileDetail/fileDetail.api.ts

@@ -4,14 +4,18 @@ import { Modal } from 'ant-design-vue';
 enum Api {
   getTree = '/ventanaly-sharefile/fileServer/list',
   createFile = '/ventanaly-sharefile/fileServer/add',
-  deleteById = '/ventanaly-sharefile/fileServer/delete',
-  save = '/safety/ventanalyMonitorParams/add',
-  edit = '/safety/ventanalyMonitorParams/edit',
-  selectDevice = '/jeecg-system/sys/dict/DeviceKind/query',
-  deleteBatch = '/sys/user/deleteBatch',
-  importExcel = '/sys/user/importExcel',
-  exportXls = '/sys/user/exportXls',
-  queryDevice = '/sys/dict/DeviceKind/query',
+  editMenu = '/ventanaly-sharefile/fileServer/edit',
+  delMenu = '/ventanaly-sharefile/fileServer/delete?id=',
+  uploadApi = '/ventanaly-sharefile/fileServer/upload',
+  downLoad = '/ventanaly-sharefile/fileServer/download',
+  deleteById = '/ventanaly-sharefile/fileServer/delete?id=',
+  // save = '/safety/ventanalyMonitorParams/add',
+  // edit = '/safety/ventanalyMonitorParams/edit',
+  // selectDevice = '/jeecg-system/sys/dict/DeviceKind/query',
+  // deleteBatch = '/sys/user/deleteBatch',
+  // importExcel = '/sys/user/importExcel',
+  // exportXls = '/sys/user/exportXls',
+  // queryDevice = '/sys/dict/DeviceKind/query',
 }
 
 /**
@@ -20,33 +24,55 @@ enum Api {
  */
 export const getTree = (params) => defHttp.post({ url: Api.getTree, params });
 
+// /**
+//  * 导出api
+//  * @param params
+//  */
+// export const getExportUrl = Api.exportXls;
+// /**
+//  * 导入api
+//  */
+// export const getImportUrl = Api.importExcel;
+
+// /**
+//  * 列表接口
+//  * @param params
+//  */
+// export const queryDeviceList = (params) => defHttp.get({ url: Api.queryDevice, params });
+
 /**
- * 导出api
+ * 创建文件夹接口
  * @param params
  */
-export const getExportUrl = Api.exportXls;
+export const createFile = (params) => defHttp.post({ url: Api.createFile, params });
 /**
- * 导入api
+ * 上传文件接口
+ * @param params
  */
-export const getImportUrl = Api.importExcel;
+export const uploadApi = (params) => defHttp.post({ url: Api.uploadApi, params });
 
 /**
- * 列表接口
+ * 修改文件夹名称接口
  * @param params
  */
-export const queryDeviceList = (params) => defHttp.get({ url: Api.queryDevice, params });
-
+export const editMenu = (params) => defHttp.post({ url: Api.editMenu, params });
 /**
- * 创建文件夹接口
+ * 删除文件夹接口
  * @param params
  */
-export const createFile = (params) => defHttp.post({ url: Api.createFile, params });
+export const delMenu = (params) => defHttp.delete({ url: Api.delMenu + params.id });
 
 /**
- * 设备类型查询接口
+ * 下载文件接口
  * @param params
  */
-export const selectDevice = (params) => defHttp.get({ url: Api.selectDevice, params });
+export const downLoad = (params) => defHttp.post({ url: Api.downLoad, params });
+
+// /**
+//  * 设备类型查询接口
+//  * @param params
+//  */
+// export const selectDevice = (params) => defHttp.get({ url: Api.selectDevice, params });
 
 /**
  * 删除文件/文件夹
@@ -56,28 +82,28 @@ export const deleteById = (params, handleSuccess) => {
     handleSuccess();
   });
 };
-/**
- * 批量删除用户
- * @param params
- */
-export const batchDeleteById = (params, handleSuccess) => {
-  Modal.confirm({
-    title: '确认删除',
-    content: '是否删除选中数据',
-    okText: '确认',
-    cancelText: '取消',
-    onOk: () => {
-      return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
-        handleSuccess();
-      });
-    },
-  });
-};
-/**
- * 保存或者更新用户
- * @param params
- */
-export const saveOrUpdate = (params, isUpdate) => {
-  const url = isUpdate ? Api.edit : Api.save;
-  return isUpdate ? defHttp.put({ url: url, params }) : defHttp.post({ url: url, params });
-};
+// /**
+//  * 批量删除用户
+//  * @param params
+//  */
+// export const batchDeleteById = (params, handleSuccess) => {
+//   Modal.confirm({
+//     title: '确认删除',
+//     content: '是否删除选中数据',
+//     okText: '确认',
+//     cancelText: '取消',
+//     onOk: () => {
+//       return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
+//         handleSuccess();
+//       });
+//     },
+//   });
+// };
+// /**
+//  * 保存或者更新用户
+//  * @param params
+//  */
+// export const saveOrUpdate = (params, isUpdate) => {
+//   const url = isUpdate ? Api.edit : Api.save;
+//   return isUpdate ? defHttp.put({ url: url, params }) : defHttp.post({ url: url, params });
+// };

+ 170 - 47
src/views/vent/performance/fileDetail/index.vue

@@ -1,25 +1,52 @@
 <template>
   <div class="file-details">
-    <!-- <div class="title">文件共享中心</div> -->
     <div class="content">
       <div class="left-box">
-        <a-button type="primary" preIcon="ant-design:form-outlined" style="margin-bottom: 15px" @click="editMenu">编辑目录</a-button>
-        <BasicTree :expandedKeys="expandedKeys" :treeData="treeData" :showLine="showLine" />
+        <!-- 左侧树菜单 -->
+        <fileSystem
+          :selected="selected"
+          :list="listArr"
+          :draggable="true"
+          @delete-node="onDeltet"
+          @on-click="onClick"
+          @change-name="onChangeName"
+          @addNode="onAddNode"
+        >
+          <template #icon="{ item }">
+            <template v-if="item.isFolder">
+              <icon v-if="item.expanded" class="iconfont" iconName="icon-24gf-folderOpen" />
+              <icon v-else class="iconfont" iconName="icon-bg-folder" />
+            </template>
+            <treeIcon class="iconfont" :title="item.title" v-else />
+          </template>
+          <template #operation="{ type }">
+            <!-- <i class="iconfont icon-add_file" v-if="type == 'addFolder'"></i> -->
+            <i class="iconfont icon-xinzeng" v-if="type == 'addDocument'"></i>
+            <i class="iconfont icon-bianji" v-if="type == 'Editable'"></i>
+            <i class="iconfont icon-guanbi" v-if="type == 'deleteNode'"></i>
+          </template>
+        </fileSystem>
       </div>
       <div class="right-box">
         <div class="search">
           <a-input v-model:value="fileName" placeholder="请输入文件名称" />
-          <a-button type="primary" preIcon="ant-design:search-outlined">查询</a-button>
-          <a-button type="primary" style="float: right; right: 15px" preIcon="ant-design:cloud-upload-outlined">文件上传</a-button>
+          <a-button type="primary" preIcon="ant-design:search-outlined" @click="onSearch">查询</a-button>
+          <!-- <a-button type="primary" style="float: right; right: 15px" preIcon="ant-design:cloud-upload-outlined">文件上传</a-button> -->
+          <a-upload :before-upload="beforeUpload" :remove="handleRemove" :multiple="false" :file-list="fileList">
+            <a-button type="primary" preIcon="ant-design:cloud-upload-outlined">文件上传</a-button>
+          </a-upload>
         </div>
         <div class="list">
           <div class="bd-t"></div>
           <NormalTable
+            v-if="alive"
+            :searchParam="fileName"
+            :nodeParam="nodeParam"
             :columns="columns"
             :list="getTree"
             :formSchema="formSchema"
             :deleteById="deleteById"
-            :saveOrUpdate="saveOrUpdate"
+            :downLoad="downLoad"
             designScope="file-detail"
             title="文件详情"
             :showTab="false"
@@ -28,61 +55,143 @@
         </div>
       </div>
     </div>
-    <!-- 编辑目录 -->
-    <fileMenuDialog @register="registerModal" @saveOrUpdate="saveOrUpdateHandler" />
   </div>
 </template>
 <script lang="ts" setup name="system-user">
-  import { useModal } from '/@/components/Modal';
-  import fileMenuDialog from '../comment/fileMenuModal.vue';
-  import { ref, onMounted, reactive, provide } from 'vue';
-  import { BasicTree } from '/@/components/Tree/index';
-  import { CollapseContainer } from '/@/components/Container/index';
+  import fileSystem from './commen/fileSystem.vue';
+  import icon from './commen/Icon/index.vue';
+  import treeIcon from './commen/Icon/treeIcon.vue';
+  import { ref, onMounted, reactive, provide, nextTick } from 'vue';
   import NormalTable from '../comment/NormalTable.vue';
   import { columns, formSchema } from './fileDetail.data';
-  import { getTree, deleteById, saveOrUpdate } from './fileDetail.api';
-  import { TreeItem } from '/@/components/Tree/index';
-
+  import { getTree, createFile, editMenu, delMenu, uploadApi, downLoad, deleteById } from './fileDetail.api';
   components: {
-    CollapseContainer;
+    fileSystem;
   }
-  let showLine = ref(true);
-  const expandedKeys = ref<string[]>(['0-0']); //默认展开树节点
   let fileName = ref('');
-  //tree
-  let treeData = reactive<TreeItem[]>([
-    {
-      title: '全部',
-      key: '0-0',
-      icon: 'file1|svg',
-      children: [],
-    },
-  ]);
-  provide('treeData', treeData);
+  let fileList = reactive<any[]>([]); //上传文件列表
+  // let uploadParam = reactive({}); //上传文件参数
+  let nodeParam = reactive({}); //点击树节点时传递的参数
+  let alive = ref(true); //点击树节点刷新表格数据
+
+  //lxh tree
+  let selected = reactive<any>({
+    id: null,
+    pid: null,
+    title: '',
+    isFolder: false,
+  });
+  //左侧菜单列表
+  // const listArr = reactive(list);
+  let listArr = reactive<any[]>([]);
+
+  //递归遍历左侧菜单数据
+  let list2tree = (list) => {
+    let flag = false;
+    list.forEach((child) => {
+      const pid = child.parentId;
+      if (pid && pid !== 'root') {
+        list.forEach((parent) => {
+          if (parent.id === pid) {
+            parent.children = parent.children || [];
+            parent.isFolder = true;
+            parent.title = parent.fileName;
+            parent.pid = parent.parentId;
+            parent.children.push({ id: child.id, isFolder: true, title: child.fileName, pid: child.parentId });
+          }
+        });
+      } else if (pid == 'root') {
+        flag = true;
+        child.isFolder = true;
+        child.title = child.fileName;
+        child.pid = child.parentId;
+      }
+    });
+
+    return flag ? list : list.filter((n) => !n.parentId);
+  };
+  //获取左侧菜单树数据
   let getTreeList = async () => {
     let data = await getTree({ parentId: '' });
-    console.log(data, '树节点数据');
-    let child = data.records.map((el, index) => {
-      return {
-        id: el.id,
-        title: el.fileName,
-        key: index,
-        icon: 'file2|svg',
-      };
-    });
-    treeData[0].children?.push(...child);
+    let list = list2tree(data.records);
+    listArr.push(...list);
+    console.log(listArr, '树节点数据');
   };
 
-  //注册弹窗
-  const [registerModal, { openModal, closeModal }] = useModal();
-  //编辑目录
-  let editMenu = () => {
-    openModal(true);
+  //点击目录
+  const onClick = (node) => {
+    selected = node;
+    console.log(node, '点击树节点');
+    alive.value = false;
+    nextTick(() => {
+      alive.value = true;
+      nodeParam = node;
+    });
+  };
+  // // 拖拽结束
+  // const drop = (node) => {
+  //   console.log(node);
+  // };
+  //添加文件
+  let onAddNode = async (node) => {
+    console.log('新增111', node);
+    let data = await createFile({ fileName: node.newName, type: 'FOL', parentId: node.id });
+    console.log(data, '新增文件返回');
+    getTreeList();
   };
-  //关闭目录弹窗
-  let saveOrUpdateHandler = () => {
-    closeModal();
+  //  修改名字
+  const onChangeName = (node) => {
+    console.log(node, '修改菜单名称');
+    editMenu({
+      id: node.id,
+      fileName: node.newName,
+      parentId: node.pid,
+    }).then((res) => {
+      console.log(res, '修改文件返回');
+      getTreeList();
+    });
+  };
+  // 删除
+  const onDeltet = (node) => {
+    console.log(node, '删除菜单');
+    delMenu({ id: node.id }).then((res) => {
+      console.log(res, '删除文件');
+      getTreeList();
+    });
+  };
+  //查询列表
+  let onSearch = () => {
+    console.log(fileName.value, '查询参数');
+    alive.value = false;
+    nextTick(() => {
+      alive.value = true;
+    });
+  };
+  //上传文件
+  let beforeUpload = (file) => {
+    console.log(file, '选中文件');
+    fileList = [...fileList, file];
+    const formData = new FormData();
+    formData.append('file', file);
+    formData.append('parentId', selected.id);
+    formData.append('isApprove', false);
+    formData.append('fileType', '');
+    uploadApi(formData).then((res) => {
+      console.log(res, '上传文件');
+      alive.value = false;
+      nextTick(() => {
+        alive.value = true;
+      });
+    });
+  };
+  // 文件移除
+  let handleRemove = (file) => {
+    const index = fileList.indexOf(file);
+    const newFileList = fileList.slice();
+    newFileList.splice(index, 1);
+    fileList = newFileList;
   };
+
   onMounted(() => {
     getTreeList();
   });
@@ -111,6 +220,12 @@
         box-shadow: 0px 0px 20px 7px rgba(30, 119, 186, 0.7) inset;
         -moz-box-shadow: 0px 0px 20px 7px rgba(30, 119, 186, 0.7) inset;
         -webkit-box-shadow: 0px 0px 20px 7px rgba(30, 119, 186, 0.7) inset;
+        // lxh
+        .iconfont {
+          color: #fff;
+          font-size: 12px;
+          margin-left: 5px;
+        }
       }
       .right-box {
         width: 85%;
@@ -167,7 +282,15 @@
     height: 28px;
     background: transparent;
     border: 1px solid #31bccc;
+    color: #fff;
     margin: 0px 20px;
     border-radius: 5px;
   }
+  ::v-deep .zxm-btn-group {
+    margin-right: 25px;
+  }
+  ::v-deep .zxm-upload {
+    float: right;
+    margin-right: 10px;
+  }
 </style>

Some files were not shown because too many files changed in this diff