Browse Source

添加标签页面及打包

yangg 8 months ago
parent
commit
ea13472b48
77 changed files with 1120 additions and 199 deletions
  1. 1 1
      .env.development
  2. 0 0
      dist/index.html
  3. 0 0
      dist/static/css/chunk-09f78c22.e30e9787.css
  4. 1 0
      dist/static/css/chunk-126245aa.641e9b71.css
  5. 1 0
      dist/static/css/chunk-13d43070.7e10a489.css
  6. 1 0
      dist/static/css/chunk-1b1358e5.03a06711.css
  7. 0 1
      dist/static/css/chunk-20bc854d.4e775eab.css
  8. 1 0
      dist/static/css/chunk-29d91702.6712b828.css
  9. 1 0
      dist/static/css/chunk-3f426cd0.d1f21e34.css
  10. 1 0
      dist/static/css/chunk-4552e990.8677f655.css
  11. 0 0
      dist/static/css/chunk-5d225980.01443ad7.css
  12. 1 0
      dist/static/css/chunk-708c45dc.b27c668a.css
  13. 1 0
      dist/static/css/chunk-77bc8fb9.b27c668a.css
  14. 0 0
      dist/static/css/chunk-7a449bba.8ae29168.css
  15. 0 1
      dist/static/css/chunk-994a158a.dddc02b6.css
  16. 0 0
      dist/static/css/chunk-c5d7799a.13a7e89e.css
  17. 0 0
      dist/static/css/chunk-d68c6fdc.81d362dc.css
  18. 0 0
      dist/static/css/chunk-e355d7b2.775a21e3.css
  19. 0 0
      dist/static/js/app.1c4c4616.js
  20. 0 0
      dist/static/js/chunk-09f78c22.b631aafb.js
  21. 0 0
      dist/static/js/chunk-0c6ee714.13219a14.js
  22. 0 0
      dist/static/js/chunk-0ec56e2a.882f74a6.js
  23. 0 0
      dist/static/js/chunk-10bfc27e.3daf87c2.js
  24. 0 0
      dist/static/js/chunk-11ff1a32.349e1f4a.js
  25. 0 0
      dist/static/js/chunk-126245aa.df34deaa.js
  26. 0 0
      dist/static/js/chunk-138f7583.d6989454.js
  27. 0 0
      dist/static/js/chunk-13d43070.65029c7a.js
  28. 0 0
      dist/static/js/chunk-1b1358e5.fce6ecd2.js
  29. 0 0
      dist/static/js/chunk-20bc854d.0ee0271d.js
  30. 0 0
      dist/static/js/chunk-23008ed8.1420b87a.js
  31. 0 0
      dist/static/js/chunk-29d91702.c33e6c76.js
  32. 0 0
      dist/static/js/chunk-2d0d3705.eefef99a.js
  33. 0 0
      dist/static/js/chunk-2d22d9b8.77252a61.js
  34. 0 0
      dist/static/js/chunk-35464144.31565a8d.js
  35. 0 0
      dist/static/js/chunk-386d37cb.39d608c5.js
  36. 0 0
      dist/static/js/chunk-3f426cd0.fb11fc95.js
  37. 0 0
      dist/static/js/chunk-43013872.27af98c7.js
  38. 0 0
      dist/static/js/chunk-44eee83d.716e73e5.js
  39. 0 0
      dist/static/js/chunk-4552e990.df35fa7b.js
  40. 0 0
      dist/static/js/chunk-4ac7f82e.d8e8dbbf.js
  41. 0 0
      dist/static/js/chunk-52f685c2.d8e526ce.js
  42. 0 0
      dist/static/js/chunk-5a3bdf57.d59f9cf1.js
  43. 0 0
      dist/static/js/chunk-5a750430.39aec23b.js
  44. 0 0
      dist/static/js/chunk-5d225980.5d204861.js
  45. 0 0
      dist/static/js/chunk-6a80e4ca.cd3066c1.js
  46. 0 0
      dist/static/js/chunk-6ddf6871.8c0ac814.js
  47. 0 0
      dist/static/js/chunk-708604c0.dec0f218.js
  48. 1 0
      dist/static/js/chunk-708c45dc.80486961.js
  49. 0 0
      dist/static/js/chunk-712c0160.77baeeba.js
  50. 1 0
      dist/static/js/chunk-77bc8fb9.5ce2c3e6.js
  51. 0 0
      dist/static/js/chunk-7a449bba.bd924dfa.js
  52. 0 0
      dist/static/js/chunk-7a88741c.2ff345bd.js
  53. 0 0
      dist/static/js/chunk-7dbc1954.7f7e5a40.js
  54. 0 0
      dist/static/js/chunk-7dbc1954.9d03f435.js
  55. 0 0
      dist/static/js/chunk-7dfdc0a0.a33b1d95.js
  56. 0 0
      dist/static/js/chunk-9235c1ae.86d79577.js
  57. 0 0
      dist/static/js/chunk-994a158a.bbddd770.js
  58. 1 1
      dist/static/js/chunk-c5d7799a.b9e6011b.js
  59. 0 0
      dist/static/js/chunk-cbf68ff6.82b0e925.js
  60. 0 0
      dist/static/js/chunk-d09dbc1a.2fe169db.js
  61. 0 0
      dist/static/js/chunk-d09dbc1a.74630db8.js
  62. 0 0
      dist/static/js/chunk-d4c547ca.d6c299dc.js
  63. 0 0
      dist/static/js/chunk-d68c6fdc.99c0cbc5.js
  64. 0 0
      dist/static/js/chunk-d91fed4e.a350b568.js
  65. 1 1
      dist/static/js/chunk-e355d7b2.6ed2fb55.js
  66. 0 0
      dist/static/js/chunk-ec55d346.0d0949d0.js
  67. 0 0
      dist/static/js/chunk-libs.04661dff.js
  68. 1 0
      package.json
  69. 80 0
      src/api/knowledge.js
  70. 10 3
      src/router/index.js
  71. 31 4
      src/views/dashboard/admin/components/LineChart.vue
  72. 147 2
      src/views/dashboard/admin/components/instruChart.vue
  73. 6 2
      src/views/dashboard/admin/index.vue
  74. 6 3
      src/views/knowledgeMenu/category/knowledgeSet.vue
  75. 53 72
      src/views/middPage/index.vue
  76. 493 108
      src/views/middPage/list.vue
  77. 280 0
      src/views/tags/index.vue

+ 1 - 1
.env.development

@@ -2,5 +2,5 @@
 ENV = 'development'
 port = 8080
 # base api
-VUE_APP_BASE_API = 'http://192.168.1.200:8084'
+VUE_APP_BASE_API = 'http://192.168.1.199:8084'
 #192.168.1.200

File diff suppressed because it is too large
+ 0 - 0
dist/index.html


+ 0 - 0
dist/static/css/chunk-a577192a.6044f932.css → dist/static/css/chunk-09f78c22.e30e9787.css


+ 1 - 0
dist/static/css/chunk-126245aa.641e9b71.css

@@ -0,0 +1 @@
+.sub-imgs{padding:0;margin:0}.sub-imgs li{float:left;margin-right:10px;width:100px;height:100px;list-style:none}.data-search{padding:20px 10px 0 10px}.com-data-view{width:100%;min-height:500px;position:relative}.el-dialog__body{padding:0 10px!important}.data-list .btns,.data-list .page-info{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.data-list .page-info{margin-top:10px}.data-list .page-info .opt{width:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.data-list .page-info .opt .pick{width:100px}.data-list .page-info .opt .section{margin-left:10px}.data-list .page-info .page-data{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.data-list .page-info .page-data .page-item{width:100%}.data-list .page-info .page-data .page-opt{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}

+ 1 - 0
dist/static/css/chunk-13d43070.7e10a489.css

@@ -0,0 +1 @@
+.tag-container[data-v-30ead251]{padding:20px}.search-bar[data-v-30ead251]{margin-bottom:20px}.pagination-container[data-v-30ead251]{margin-top:20px;text-align:right}

+ 1 - 0
dist/static/css/chunk-1b1358e5.03a06711.css

@@ -0,0 +1 @@
+.gpu-list[data-v-774f5a66]{padding:20px}.filter-section[data-v-774f5a66]{margin-bottom:20px}.ml-15[data-v-774f5a66]{margin-left:15px}.pagination[data-v-774f5a66]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-top:15px}

+ 0 - 1
dist/static/css/chunk-20bc854d.4e775eab.css

@@ -1 +0,0 @@
-.midd-page[data-v-7df62f00]{padding:20px}.el-icon-edit[data-v-7df62f00]{font-size:14px;color:#409eff}[data-v-7df62f00] .model-gen-1{background-color:#e6f3ff!important}[data-v-7df62f00] .model-gen-1.el-table__cell{background-color:#e6f3ff!important;color:#333!important}[data-v-7df62f00] .model-gen-2{background-color:#f0e6ff!important}[data-v-7df62f00] .model-gen-2.el-table__cell{background-color:#f0e6ff!important;color:#333!important}.header[data-v-7df62f00]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px 0}.h_left p[data-v-7df62f00]{margin-top:0}.search-container[data-v-7df62f00]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.search-box[data-v-7df62f00]{width:350px}.custom-search-input[data-v-7df62f00] :deep(.el-input__inner){height:40px;line-height:40px;border-right:none;border-radius:4px 0 0 4px}.custom-search-input[data-v-7df62f00] :deep(.el-input-group__append){padding:0;border:none;background-color:transparent}.custom-search-input[data-v-7df62f00] :deep(.el-input-group__append .el-button){height:40px;padding:0 20px;border-radius:0 4px 4px 0;margin:0}.custom-search-input[data-v-7df62f00] :deep(.el-input__inner:hover){border-color:#dcdfe6}.custom-search-input[data-v-7df62f00] :deep(.el-input__inner:focus){border-color:#409eff}

+ 1 - 0
dist/static/css/chunk-29d91702.6712b828.css

@@ -0,0 +1 @@
+.sub-imgs[data-v-2c6b7984]{padding:0;margin:0}.sub-imgs li[data-v-2c6b7984]{float:left;margin-right:10px;width:100px;height:100px;list-style:none}.data-search[data-v-01f60281]{padding:20px 10px 0 10px}.el-dialog__body[data-v-01f60281]{padding:10px}.data-list .btns,.data-list .page-info{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.data-list .page-info{margin-top:10px}.data-list .page-info .opt{width:50%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.data-list .page-info .opt .pick{width:100px}.data-list .page-info .opt .section{margin-left:10px}.data-list .page-info .page-data{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%}.data-list .page-info .page-data .page-item{width:100%}.data-list .page-info .page-data .page-opt{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.project-search{padding:30px;font-size:12px}

+ 1 - 0
dist/static/css/chunk-3f426cd0.d1f21e34.css

@@ -0,0 +1 @@
+.com-data-view{width:100%;min-height:90vh;position:relative}.com-data-view .btn-save{position:fixed;right:10px;bottom:50px;z-index:9999!important}.el-dialog__body{padding:0 10px!important}

+ 1 - 0
dist/static/css/chunk-4552e990.8677f655.css

@@ -0,0 +1 @@
+.midd-page[data-v-e429baea]{padding:20px}.el-icon-edit[data-v-e429baea]{font-size:14px;color:#409eff}[data-v-e429baea] .model-gen-1{background-color:#e6f3ff!important}[data-v-e429baea] .model-gen-1.el-table__cell{background-color:#e6f3ff!important;color:#333!important}[data-v-e429baea] .model-gen-2{background-color:#f0e6ff!important}[data-v-e429baea] .model-gen-2.el-table__cell{background-color:#f0e6ff!important;color:#333!important}.header[data-v-e429baea]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px 0}.h_left p[data-v-e429baea]{margin-top:0}.search-container[data-v-e429baea]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.search-box[data-v-e429baea]{width:350px}.custom-search-input[data-v-e429baea] :deep(.el-input__inner){height:40px;line-height:40px;border-right:none;border-radius:4px 0 0 4px}.custom-search-input[data-v-e429baea] :deep(.el-input-group__append){padding:0;border:none;background-color:transparent}.custom-search-input[data-v-e429baea] :deep(.el-input-group__append .el-button){height:40px;padding:0 20px;border-radius:0 4px 4px 0;margin:0}.custom-search-input[data-v-e429baea] :deep(.el-input__inner:hover){border-color:#dcdfe6}.custom-search-input[data-v-e429baea] :deep(.el-input__inner:focus){border-color:#409eff}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-5d225980.01443ad7.css


+ 1 - 0
dist/static/css/chunk-708c45dc.b27c668a.css

@@ -0,0 +1 @@
+.project-search{padding:30px;font-size:12px}

+ 1 - 0
dist/static/css/chunk-77bc8fb9.b27c668a.css

@@ -0,0 +1 @@
+.project-search{padding:30px;font-size:12px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-7a449bba.8ae29168.css


+ 0 - 1
dist/static/css/chunk-994a158a.dddc02b6.css

@@ -1 +0,0 @@
-.gpu-list[data-v-00f3c91c]{padding:20px}

+ 0 - 0
dist/static/css/chunk-683feb49.13a7e89e.css → dist/static/css/chunk-c5d7799a.13a7e89e.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-d68c6fdc.81d362dc.css


+ 0 - 0
dist/static/css/chunk-4c2b6424.775a21e3.css → dist/static/css/chunk-e355d7b2.775a21e3.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.1c4c4616.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-09f78c22.b631aafb.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-0c6ee714.13219a14.js


+ 0 - 0
dist/static/js/chunk-0ec56e2a.0c37ce4d.js → dist/static/js/chunk-0ec56e2a.882f74a6.js


+ 0 - 0
dist/static/js/chunk-10bfc27e.21d5a037.js → dist/static/js/chunk-10bfc27e.3daf87c2.js


+ 0 - 0
dist/static/js/chunk-11ff1a32.2b7e8c3c.js → dist/static/js/chunk-11ff1a32.349e1f4a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-126245aa.df34deaa.js


+ 0 - 0
dist/static/js/chunk-138f7583.3d73846c.js → dist/static/js/chunk-138f7583.d6989454.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-13d43070.65029c7a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1b1358e5.fce6ecd2.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-20bc854d.0ee0271d.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-23008ed8.1420b87a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-29d91702.c33e6c76.js


+ 0 - 0
dist/static/js/chunk-2d0d3705.008b654f.js → dist/static/js/chunk-2d0d3705.eefef99a.js


+ 0 - 0
dist/static/js/chunk-2d22d9b8.3f135adb.js → dist/static/js/chunk-2d22d9b8.77252a61.js


+ 0 - 0
dist/static/js/chunk-35464144.1446671d.js → dist/static/js/chunk-35464144.31565a8d.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-386d37cb.39d608c5.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3f426cd0.fb11fc95.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-43013872.27af98c7.js


+ 0 - 0
dist/static/js/chunk-44eee83d.05cdf17c.js → dist/static/js/chunk-44eee83d.716e73e5.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-4552e990.df35fa7b.js


+ 0 - 0
dist/static/js/chunk-4ac7f82e.7af0717f.js → dist/static/js/chunk-4ac7f82e.d8e8dbbf.js


+ 0 - 0
dist/static/js/chunk-52f685c2.eef74343.js → dist/static/js/chunk-52f685c2.d8e526ce.js


+ 0 - 0
dist/static/js/chunk-5a3bdf57.4040cbd1.js → dist/static/js/chunk-5a3bdf57.d59f9cf1.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-5a750430.39aec23b.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-5d225980.5d204861.js


+ 0 - 0
dist/static/js/chunk-6a80e4ca.d70d93a6.js → dist/static/js/chunk-6a80e4ca.cd3066c1.js


+ 0 - 0
dist/static/js/chunk-6ddf6871.e749e081.js → dist/static/js/chunk-6ddf6871.8c0ac814.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-708604c0.dec0f218.js


+ 1 - 0
dist/static/js/chunk-708c45dc.80486961.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-708c45dc"],{"0b8b":function(t,a,d){},d5ae:function(t,a,d){"use strict";d.r(a);var n=function(){var t=this,a=t.$createElement,d=t._self._c||a;return d("div",{staticClass:"project-search"},[d("dataInfo",{attrs:{dataId:t.dataId}})],1)},e=[],s=d("ae6b"),c={components:{dataInfo:s["a"]},data:function(){return{dataId:0}},mounted:function(){var t=this;t.dataId=t.$route.query.id,isNaN(this.dataId)&&(this.dataId=0),this.dataId=parseInt(this.dataId)},methods:{}},i=c,o=(d("d8aa"),d("2877")),u=Object(o["a"])(i,n,e,!1,null,null,null);a["default"]=u.exports},d8aa:function(t,a,d){"use strict";d("0b8b")}}]);

+ 0 - 0
dist/static/js/chunk-712c0160.df8fd582.js → dist/static/js/chunk-712c0160.77baeeba.js


+ 1 - 0
dist/static/js/chunk-77bc8fb9.5ce2c3e6.js

@@ -0,0 +1 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-77bc8fb9"],{"2b73":function(t,e,a){"use strict";a.r(e);var r=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"project-search"},[a("dataSearch",{attrs:{allowCreate:t.checkAuth("/source/data/create")},on:{bindSetQuery:t.setQuery}}),a("dataList",{attrs:{queryForm:t.queryForm,allowEdit:t.checkAuth("/source/data/update"),allowDelete:t.checkAuth("/source/data/delete")}})],1)},c=[],u=a("5530"),n=(a("4de4"),a("d3b7"),a("2f62")),o=a("ae6b"),s={components:{dataSearch:o["c"],dataList:o["b"]},data:function(){return{queryForm:{page:1,pageSize:10,code:"",name:"",status:""}}},computed:Object(u["a"])({},Object(n["b"])(["roleInfo","authList"])),methods:{checkAuth:function(t){var e=this.authList.filter((function(e){return 999==e.parent_id&&e.path==t}));return!(e.length>0)},setQuery:function(t){this.queryForm=t}}},d=s,i=(a("2d22"),a("2877")),h=Object(i["a"])(d,r,c,!1,null,null,null);e["default"]=h.exports},"2d22":function(t,e,a){"use strict";a("941d")},"941d":function(t,e,a){}}]);

File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7a449bba.bd924dfa.js


+ 0 - 0
dist/static/js/chunk-7a88741c.5112e2dc.js → dist/static/js/chunk-7a88741c.2ff345bd.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7dbc1954.7f7e5a40.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7dbc1954.9d03f435.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7dfdc0a0.a33b1d95.js


+ 0 - 0
dist/static/js/chunk-9235c1ae.0a068157.js → dist/static/js/chunk-9235c1ae.86d79577.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-994a158a.bbddd770.js


+ 1 - 1
dist/static/js/chunk-683feb49.eb637873.js → dist/static/js/chunk-c5d7799a.b9e6011b.js

@@ -1 +1 @@
-(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-683feb49"],{"1db4":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"wscn-http404-container"},[a("div",{staticClass:"wscn-http404"},[t._m(0),a("div",{staticClass:"bullshit"},[a("div",{staticClass:"bullshit__oops"},[t._v("OOPS!")]),t._m(1),a("div",{staticClass:"bullshit__headline"},[t._v(t._s(t.message))]),a("div",{staticClass:"bullshit__info"},[t._v("Please check that the URL you entered is correct, or click the button below to return to the homepage.")]),a("a",{staticClass:"bullshit__return-home",attrs:{href:""}},[t._v("Back to home")])])])])},c=[function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"pic-404"},[e("img",{staticClass:"pic-404__parent",attrs:{src:a("a36b"),alt:"404"}}),e("img",{staticClass:"pic-404__child left",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child mid",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child right",attrs:{src:a("26fc"),alt:"404"}})])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"bullshit__info"},[t._v("All rights reserved "),a("a",{staticStyle:{color:"#20a0ff"},attrs:{href:"https://wallstreetcn.com",target:"_blank"}},[t._v("wallstreetcn")])])}],i={name:"Page404",computed:{message:function(){return"The webmaster said that you can not enter this page..."}}},l=i,n=(a("207f"),a("2877")),r=Object(n["a"])(l,e,c,!1,null,"26fcd89f",null);s["default"]=r.exports},"207f":function(t,s,a){"use strict";a("ba6f")},"26fc":function(t,s,a){t.exports=a.p+"static/img/404_cloud.0f4bc32b.png"},a36b:function(t,s,a){t.exports=a.p+"static/img/404.a57b6f31.png"},ba6f:function(t,s,a){}}]);
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-c5d7799a"],{"1db4":function(t,s,a){"use strict";a.r(s);var e=function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"wscn-http404-container"},[a("div",{staticClass:"wscn-http404"},[t._m(0),a("div",{staticClass:"bullshit"},[a("div",{staticClass:"bullshit__oops"},[t._v("OOPS!")]),t._m(1),a("div",{staticClass:"bullshit__headline"},[t._v(t._s(t.message))]),a("div",{staticClass:"bullshit__info"},[t._v("Please check that the URL you entered is correct, or click the button below to return to the homepage.")]),a("a",{staticClass:"bullshit__return-home",attrs:{href:""}},[t._v("Back to home")])])])])},c=[function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"pic-404"},[e("img",{staticClass:"pic-404__parent",attrs:{src:a("a36b"),alt:"404"}}),e("img",{staticClass:"pic-404__child left",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child mid",attrs:{src:a("26fc"),alt:"404"}}),e("img",{staticClass:"pic-404__child right",attrs:{src:a("26fc"),alt:"404"}})])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"bullshit__info"},[t._v("All rights reserved "),a("a",{staticStyle:{color:"#20a0ff"},attrs:{href:"https://wallstreetcn.com",target:"_blank"}},[t._v("wallstreetcn")])])}],i={name:"Page404",computed:{message:function(){return"The webmaster said that you can not enter this page..."}}},l=i,n=(a("207f"),a("2877")),r=Object(n["a"])(l,e,c,!1,null,"26fcd89f",null);s["default"]=r.exports},"207f":function(t,s,a){"use strict";a("ba6f")},"26fc":function(t,s,a){t.exports=a.p+"static/img/404_cloud.0f4bc32b.png"},a36b:function(t,s,a){t.exports=a.p+"static/img/404.a57b6f31.png"},ba6f:function(t,s,a){}}]);

File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-cbf68ff6.82b0e925.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-d09dbc1a.2fe169db.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-d09dbc1a.74630db8.js


+ 0 - 0
dist/static/js/chunk-d4c547ca.2f6790ee.js → dist/static/js/chunk-d4c547ca.d6c299dc.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-d68c6fdc.99c0cbc5.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-d91fed4e.a350b568.js


File diff suppressed because it is too large
+ 1 - 1
dist/static/js/chunk-e355d7b2.6ed2fb55.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-ec55d346.0d0949d0.js


+ 0 - 0
dist/static/js/chunk-libs.d2d03206.js → dist/static/js/chunk-libs.04661dff.js


+ 1 - 0
package.json

@@ -47,6 +47,7 @@
     "jspdf": "^2.5.1",
     "jszip": "^3.2.1",
     "jszip-utils": "^0.1.0",
+    "lodash-es": "^4.17.21",
     "luckyexcel": "^1.0.1",
     "luckysheet": "^2.1.13",
     "mammoth": "^1.8.0",

+ 80 - 0
src/api/knowledge.js

@@ -333,4 +333,84 @@ export function configDelete(data) {
       method: 'post',
       data
     })
+  } 
+
+  /* mq利用率 */
+
+  export function GET_Rbq(data) {
+    return request({
+      url: '/rabbitmq/info/',
+      method: 'get',
+      data
+    })
+  } 
+
+  /* 获取解析进度 */
+
+  export function getdocpro(data) {
+    return request({
+      url: '/kbm/getdocpro',
+      method: 'post',
+      data
+    })
+  } 
+
+  /* 获取解析结果  */
+  
+  export function getDetail(data) {
+    return request({
+      url: '/literature-data/detail/',
+      method: 'post',
+      data
+    })
+  } 
+
+  /* 新增标签 */
+
+  export function add_tags(data) {
+    return request({
+      url: '/literature-tags/add_tags/',
+      method: 'post',
+      data
+    })
+  } 
+
+  /* 获取标签 */
+
+  export function get_literature_tags(data) {
+    return request({
+      url: '/literature-tags/get_literature_tags/',
+      method: 'get',
+      data
+    })
+  } 
+
+  /* 删除 */
+
+  export function remove_tags(data) {
+    return request({
+      url: '/literature-tags/remove_tags/',
+      method: 'post',
+      data
+    })
+  } 
+
+  /* 搜索 */
+
+  export function search_tags(data) {
+    return request({
+      url: '/literature-tags/search_tags/',
+      method: 'post',
+      data
+    })
+  } 
+
+  /* 编辑  */
+
+  export function edit_tags(data) {
+    return request({
+      url: '/literature-tags/edit_tags/',
+      method: 'post',
+      data
+    })
   } 

+ 10 - 3
src/router/index.js

@@ -287,7 +287,7 @@ export const asyncRoutes = [
 
 
 
-       /*{
+       {
         path: 'dataCenter/index',
         component: () => import('@/views/dataCenter/search'),
         name: 'dataCenter',
@@ -313,7 +313,7 @@ export const asyncRoutes = [
         component: () => import('@/views/dataCenter/category/search'),
         name: 'dataCenterCategorySearch',
         meta: { title: '原始数据分类', noCache: true,roles: ['admin'] }
-      }, */
+      },
     ]
   },
  
@@ -367,7 +367,14 @@ export const asyncRoutes = [
         name: 'MiddleFuntion',
         hidden:true,
         meta: { title: '中间数据',  noCache: true ,roles: ['admin']}
-      }
+      },
+      /* literature_tag */
+      {
+        path: 'tags/index',
+        component: () => import('@/views/tags/index.vue'),
+        name: 'literature_tag',
+        meta: { title: '标签管理',  noCache: true ,roles: ['admin']}
+      },
     ]
   },
     {

+ 31 - 4
src/views/dashboard/admin/components/LineChart.vue

@@ -175,12 +175,28 @@ export default {
       data1: [],
       data2: [],
       timer: null,
-      isDestroyed: false
+      isDestroyed: false,
+      isOnDashboard:false
     };
   },
+  watch: {
+    $route: {
+      immediate: true,
+      handler(newRoute) {
+        this.isOnDashboard = newRoute.path === '/dashboard';
+        if (this.isOnDashboard) {
+          this.startLiveData();
+        } else {
+          this.stopLiveData();
+        }
+      }
+    }
+  },
   mounted() {
     this.initChart();
-    this.startLiveData();
+    if (this.isOnDashboard) {
+      this.startLiveData();
+    }
   },
   beforeDestroy() {
     this.cleanupResources();
@@ -409,15 +425,19 @@ export default {
       if (this.timer) {
         clearInterval(this.timer);
       }
-
+      this.stopLiveData();
       this.timer = setInterval(async () => {
+        if (!this.isOnDashboard) {
+          this.stopLiveData();
+          return;
+        }
         try {
           const response = await gpu_info();
           const currentTime = Date.now();
 
           // 模拟两组数据
           const expectedValue = Math.random() * 30 + 50;
-          const actualValue = response.data.data[0].usage;
+          const actualValue = response.data.data.cpu.total_usage;
 
           // 更新数据
           this.data1.push({
@@ -453,8 +473,15 @@ export default {
       }, 2000);
     },
 
+    stopLiveData() {
+      if (this.timer) {
+        clearInterval(this.timer);
+        this.timer = null;
+      }
+    },
     async cleanupResources() {
       this.isDestroyed = true;
+      this.stopLiveData();
       if (this.timer) {
         clearInterval(this.timer);
         this.timer = null;

+ 147 - 2
src/views/dashboard/admin/components/instruChart.vue

@@ -120,7 +120,7 @@
     }
   }
   </script> -->
-  <template>
+  <!-- <template>
     <div ref="chartDiv" style="width: 100%; height: 300px;"></div>
   </template>
   
@@ -230,4 +230,149 @@
       }
     }
   }
-  </script>
+  </script> -->
+
+  <template>
+    <div id="chartdiv"></div>
+  </template>
+  
+  <script>
+  import * as am5 from "@amcharts/amcharts5";
+  import * as am5percent from "@amcharts/amcharts5/percent";
+  import am5themes_Animated from "@amcharts/amcharts5/themes/Animated";
+  
+  export default {
+    name: "DoublePieChart",
+    props: {
+      percentage: {
+        type: Number,
+        default: 0
+      }
+    },
+    data() {
+      return {
+        root: null,
+        chart: null,
+        series: null,
+        centerLabel: null,
+      };
+    },
+    watch: {
+      percentage: {
+        handler(newValue) {
+          this.updateChart(newValue);
+        }
+      }
+    },
+    methods: {
+      initChart() {
+        // 确保在重新初始化前清理旧实例
+        if (this.root) {
+          this.root.dispose();
+        }
+  
+        // Create root element
+        this.root = am5.Root.new("chartdiv");
+  
+        // Set themes
+        this.root.setThemes([am5themes_Animated.new(this.root)]);
+  
+        // Create chart
+        this.chart = this.root.container.children.push(
+          am5percent.PieChart.new(this.root, {
+            startAngle: 180,
+            endAngle: 360,
+            layout: this.root.verticalLayout,
+            innerRadius: am5.percent(80),
+          })
+        );
+  
+        // 确保 chart 创建完成后再创建 series
+        if (this.chart) {
+          // Create series
+          this.series = this.chart.series.push(
+            am5percent.PieSeries.new(this.root, {
+              valueField: "value",
+              categoryField: "category",
+              startAngle: 180,
+              endAngle: 360,
+              radius: am5.percent(80),
+              innerRadius: am5.percent(30),
+            })
+          );
+  
+          // Set custom colors
+          this.series.set(
+            "colors",
+            am5.ColorSet.new(this.root, {
+              colors: [
+                am5.color("#19bcbf"),
+                am5.color("#F5F5F5"),
+              ],
+            })
+          );
+  
+          // Disable labels and ticks
+          this.series.labels.template.set("forceHidden", true);
+          this.series.ticks.template.set("forceHidden", true);
+  
+          // Create center label
+          this.centerLabel = am5.Label.new(this.root, {
+            textAlign: "center",
+            centerY: am5.p45,
+            centerX: am5.p50,
+            y: am5.percent(-35), // 负值会使文字向上移动
+            text: "[fontSize:24px]0%[/]\n[fontSize:14px]Compiled Ticket[/]",
+          });
+  
+          this.chart.seriesContainer.children.push(this.centerLabel);
+  
+          // 初始化完成后更新数据
+          this.$nextTick(() => {
+            this.updateChart(this.percentage);
+          });
+        }
+      },
+  
+      updateChart(percentage) {
+        // 确保所有必要的组件都已创建
+        if (!this.series || !this.centerLabel) {
+          return;
+        }
+  
+        try {
+          // Update data
+          this.series.data.setAll([
+            { category: "Complete", value: percentage },
+            { category: "Remaining", value: 100 - percentage },
+          ]);
+  
+          // Update center label
+          this.centerLabel.set("text", 
+            `[fontSize:24px]${percentage}%[/]\n[fontSize:14px]Compiled Ticket[/]`
+          );
+        } catch (error) {
+          console.error('Error updating chart:', error);
+        }
+      }
+    },
+    mounted() {
+      // 使用 nextTick 确保 DOM 已经更新
+      this.$nextTick(() => {
+        this.initChart();
+      });
+    },
+    beforeDestroy() {
+      if (this.root) {
+        this.root.dispose();
+      }
+    },
+  };
+  </script>
+  
+  <style scoped>
+  #chartdiv {
+    width: 100%;
+    height: 150px;
+  }
+  </style>

+ 6 - 2
src/views/dashboard/admin/index.vue

@@ -9,7 +9,7 @@
           <div slot="header" class="clearfixs">
             <span></span>
           </div>
-         <instruChart style="height: 150px"/>
+         <instruChart style="height: 150px" :percentage="currentPercentage"/>
         </el-card>
       </el-col> -->
       <el-col style="margin-bottom: 20px;" :span="24">
@@ -89,7 +89,7 @@ import BoxCard from "./components/BoxCard";
 import TagCloud from "./components/tagCloud.vue";
 import RecentFile from "./components/recentFile.vue";
 import  instruChart from "./components/instruChart.vue"
-import { listBuckets, structure_count } from "@/api/knowledge";
+import { listBuckets, structure_count,GET_Rbq } from "@/api/knowledge";
 import { mapState } from 'vuex';
 
 const lineChartData = {
@@ -149,6 +149,7 @@ export default {
       kenList: [],
       kenValue: null,
       kenVal: {},
+      currentPercentage:11,
       refreshInterval: null,
       isOnDashboard: false,
       chartData: [
@@ -232,6 +233,9 @@ export default {
           this.kenVal = this.kenList[0];
         }
       });
+      GET_Rbq().then(res=>{
+        console.log(res);
+      })
     },
 
     init() {

+ 6 - 3
src/views/knowledgeMenu/category/knowledgeSet.vue

@@ -176,7 +176,7 @@
                       effect="dark"
                       :content="
                         scope.row.run == 1 || scope.row.run == 5
-                          ? '解析中'
+                          ? `已解析数:${scope.row.progress}`
                           : '解析'
                       "
                       placement="top"
@@ -409,6 +409,7 @@ import {
   batchMove,
   selectType0,
   delDocumentList,
+  getdocpro
 } from "@/api/knowledge";
 export default {
   components: {
@@ -904,11 +905,13 @@ export default {
       }
 
       const checkStatus = () => {
-        getRunStatus({ document_id: row.id })
+        getdocpro({ document_id: row.id })
           .then((res) => {
             if (res.status === 200) {
-              const newStatus = Number(res.data.run);
+              const newStatus = Number(res.data.status);
+              const newProgress = Number(res.data.total_tasks);
               this.$set(row, "run", newStatus);
+              this.$set(row, "progress", newProgress);
 
               if (newStatus === 3) {
                 this.$message.success("解析成功");

+ 53 - 72
src/views/middPage/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="midd-page">
-    <el-tabs v-model="activeName" @tab-click="handleClick">
-      <el-tab-pane label="AED列表" name="first">
+    <!-- <el-tabs v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="AED列表" name="first"> -->
         <div class="header">
           <div class="h_left">
             <p class="current-doc">
@@ -27,7 +27,7 @@
               </el-input>
             </div>
           </div>
-          <div class="h_right">
+          <!-- <div class="h_right">
             <el-pagination
               @size-change="handleSizeChange"
               @current-change="handleCurrentChange"
@@ -35,12 +35,12 @@
               :page-size="firstForm.pageSize"
               layout="total, prev, pager, next"
               :total="firstForm.total"
-              ><!-- , jumper -->
+              >
             </el-pagination>
-          </div>
+          </div> -->
         </div>
         <el-table :data="firstTableData" style="width: 100%">
-          <el-table-column
+          <!-- <el-table-column
             label="工作类型"
             prop="workType"
             :filters="firstForm.workTypeFilters"
@@ -60,10 +60,10 @@
               </el-select>
               <span v-else>{{ scope.row.workType }}</span>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column
             label="项目"
-            prop="project"
+            prop="name"
             :filters="firstForm.projectFilters"
             :filter-method="firstFilterProject"
             filter-placement="bottom-end"
@@ -71,10 +71,10 @@
           >
             <template #default="scope">
               <el-input
-                v-model="scope.row.project"
+                v-model="scope.row.name"
                 v-if="scope.row.isEdit"
               ></el-input>
-              <span v-else>{{ scope.row.project }}</span>
+              <span v-else>{{ scope.row.name }}</span>
             </template>
           </el-table-column>
           <el-table-column label="说明" prop="description">
@@ -104,16 +104,16 @@
           </el-table-column>
           <el-table-column
             label="模型生成1"
-            prop="model1"
+            prop="generation_1"
             class-name="model-gen-1"
           >
             <template #default="scope">
               <el-input
-                v-model="scope.row.example"
+                v-model="scope.row.generation_1"
                 v-if="scope.row.isEdit"
               ></el-input>
               <span v-else>
-                {{ scope.row.model1 }}
+                {{ scope.row.generation_1 }}
                 <i
                   class="el-icon-refresh"
                   @click="openModel1Dialog(scope.row)"
@@ -124,16 +124,16 @@
           </el-table-column>
           <el-table-column
             label="模型生成2"
-            prop="model2"
+            prop="generation_2"
             class-name="model-gen-2"
           >
             <template #default="scope">
               <el-input
-                v-model="scope.row.model2"
+                v-model="scope.row.generation_2"
                 v-if="scope.row.isEdit"
               ></el-input>
               <span v-else>
-                {{ scope.row.model2 }}
+                {{ scope.row.generation_2 }}
                 <i
                   class="el-icon-refresh"
                   @click="openModel2Dialog(scope.row)"
@@ -189,8 +189,8 @@
           style="margin-top: 20px"
           >新增行</el-button
         >
-      </el-tab-pane>
-      <el-tab-pane label="SOTA详情" name="second">
+    <!--   </el-tab-pane> -->
+     <!--  <el-tab-pane label="SOTA详情" name="second">
         <el-table :data="secondTableData" style="width: 100%">
           <el-table-column
             label="Identifier"
@@ -244,11 +244,6 @@
               ></el-input>
               <span v-else>
                 {{ scope.row.example }}
-                <!--  <i
-                  class="el-icon-edit"
-                  @click="openExampleDialog(scope.row)"
-                  style="cursor: pointer; margin-left: 5px"
-                ></i> -->
               </span>
             </template>
           </el-table-column>
@@ -286,11 +281,6 @@
                     >
                       <i class="el-icon-check"></i> 保存
                     </el-dropdown-item>
-                    <!--  <el-dropdown-item
-                      @click.native="secondHandleUpload(scope.$index, scope.row)"
-                    >
-                      <i class="el-icon-refresh"></i> 更新内容
-                    </el-dropdown-item> -->
                     <el-dropdown-item
                       @click.native="
                         secondHandleDelete(scope.$index, scope.row)
@@ -357,22 +347,6 @@
               <span v-else>{{ scope.row.description }}</span>
             </template>
           </el-table-column>
-          <!-- <el-table-column label="范例" prop="example">
-            <template #default="scope">
-              <el-input
-                v-model="scope.row.example"
-                v-if="scope.row.isEdit"
-              ></el-input>
-              <span v-else>
-                {{ scope.row.example }}
-                <i
-                  class="el-icon-edit"
-                  @click="openExampleDialog(scope.row)"
-                  style="cursor: pointer; margin-left: 5px"
-                ></i>
-              </span>
-            </template>
-          </el-table-column> -->
           <el-table-column label="操作" width="100">
             <template #default="scope">
               <el-dropdown trigger="click">
@@ -398,11 +372,6 @@
                     >
                       <i class="el-icon-check"></i> 保存
                     </el-dropdown-item>
-                    <!--  <el-dropdown-item
-                      @click.native="thirdHandleUpload(scope.$index, scope.row)"
-                    >
-                      <i class="el-icon-refresh"></i> 更新内容
-                    </el-dropdown-item> -->
                     <el-dropdown-item
                       @click.native="thirdHandleDelete(scope.$index, scope.row)"
                     >
@@ -420,8 +389,8 @@
           style="margin-top: 20px"
           >新增行</el-button
         >
-      </el-tab-pane>
-    </el-tabs>
+      </el-tab-pane> -->
+   <!--  </el-tabs> -->
 
     <el-dialog :visible.sync="dialogVisible" title="编辑范例" width="30%">
       <el-input v-model="currentExample" type="textarea" :rows="4"></el-input>
@@ -507,6 +476,7 @@
 </template>
   
   <script>
+import { getDetail } from "@/api/knowledge";
 export default {
   name: "MiddPage",
   data() {
@@ -514,7 +484,7 @@ export default {
       activeName: "first",
       firstForm: {
         tableData: [
-          {
+          /* {
             workType: "复制",
             project: "indication",
             description:
@@ -549,7 +519,7 @@ export default {
             model2:
               "Capillary blood by BMG;Venous blood by YSI(此处为CGM的替代疗法)",
             isEdit: false,
-          },
+          }, */
         ],
         workTypeFilters: [
           { text: "类型1", value: "type1" },
@@ -575,7 +545,7 @@ export default {
         pageSize: 10, // 每页显示条数
         total: 3, // 总条数
       },
-      secondForm: {
+     /*  secondForm: {
         tableData: [
           {
             workType: "SOTA-E1-01",
@@ -627,15 +597,6 @@ export default {
               "white non-hispanic: n=247;african american:n=25;hispanic or latino: n=34",
             isEdit: false,
           },
-          /*  {
-            workType: "总结和数据提取;",
-            project: "Alternative device(treatment)",
-            description:
-              "Device name + model name如无,可写疗法(以评价的器械的替代疗法)",
-            example:
-              "Capillary blood by BMG;Venous blood by YSI(此处为CGM的替代疗法)",
-            isEdit: false,
-          }, */
         ],
         workTypeFilters: [
           { text: "类型1", value: "type1" },
@@ -647,7 +608,7 @@ export default {
           workType: [],
           project: [],
         },
-      },
+      }, */
 
       dialogVisible: false,
       currentExample: "",
@@ -665,7 +626,7 @@ export default {
         );
       });
     },
-    secondTableData() {
+    /* secondTableData() {
       return this.secondForm.tableData.filter((data) => {
         return (
           (!this.secondForm.activeFilters.workType.length ||
@@ -684,14 +645,18 @@ export default {
             this.thirdForm.activeFilters.project.includes(data.project))
         );
       });
-    },
+    }, */
   },
   created() {
     this.updateProjectFilters();
   },
+  mounted() {
+    this.firstForm.currentDocument=this.$route.query.name
+    this.firstInit();
+  },
   methods: {
     /* SOTA汇总表(第三) */
-    thirdHandleEdit(index, row) {
+   /*  thirdHandleEdit(index, row) {
       row.isEdit = true;
     },
     thirdHandleSave(index, row) {
@@ -727,9 +692,9 @@ export default {
         text: project,
         value: project,
       }));
-    },
+    }, */
     /* SOTA数据表(第二) */
-    secondHandleEdit(index, row) {
+   /*  secondHandleEdit(index, row) {
       row.isEdit = true;
     },
     secondHandleSave(index, row) {
@@ -765,7 +730,7 @@ export default {
         text: project,
         value: project,
       }));
-    },
+    }, */
     /* AED数据表(第一) 操作事件*/
     openExampleDialog(row) {
       this.dialogVisible = true;
@@ -909,6 +874,22 @@ export default {
     },
 
     handleClick() {},
+    /* 获取详细信息 */
+    async firstInit() {
+      const res = await getDetail({ id: this.$route.query.id });
+      console.log("详情数据:", res.data);
+
+      // Transform data into array of objects with name property
+      const processedData = Object.entries(res.data)
+        .filter(([key]) => !["id", "create_time", "update_time"].includes(key)) // Exclude non-field properties
+        .map(([key, value]) => ({
+          name: key,
+          isEdit:false,
+          ...value,
+        }));
+        console.log(processedData);
+        this.firstForm.tableData=processedData;
+    },
   },
   watch: {
     tableData: {
@@ -990,10 +971,10 @@ export default {
 
 /* 悬停效果 */
 .custom-search-input :deep(.el-input__inner:hover) {
-  border-color: #DCDFE6;
+  border-color: #dcdfe6;
 }
 
 .custom-search-input :deep(.el-input__inner:focus) {
-  border-color: #409EFF;
+  border-color: #409eff;
 }
 </style>

+ 493 - 108
src/views/middPage/list.vue

@@ -1,164 +1,549 @@
 <template>
   <div class="gpu-list">
-    <el-select
-      v-model="selectedBucket"
-      placeholder="请选择知识库"
-      @change="handleBucketChange"
-    >
-      <el-option
-        v-for="item in buckets"
-        :key="item.id"
-        :label="item.name"
-        :value="item.id"
+    <!-- 顶部筛选区域 -->
+    <div class="filter-section">
+      <el-select
+        v-model="selectedBucket"
+        placeholder="请选择知识库"
+        @change="handleBucketChange"
       >
-      </el-option>
-    </el-select>
-    <el-select
-    style="margin-left: 15px"
-      v-model="selectedType"
-      placeholder="请选择目录"
-      :disabled="!selectedBucket"
-    >
-      <el-option
-        v-for="item in types"
-        :key="item.id"
-        :label="item.name"
-        :value="item.id"
+        <el-option
+          v-for="item in buckets"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        />
+      </el-select>
+
+      <el-select
+        v-model="selectedType"
+        placeholder="请选择目录"
+        :disabled="!selectedBucket"
+        class="ml-15"
       >
-      </el-option>
-    </el-select>
-    <!-- 添加同步数据按钮 -->
-    <el-button
-    style="margin-left: 15px"
-      type="primary"
-      @click="handleSyncData"
-      :loading="isSyncing"
-      :disabled="!selectedType"
-    >
-      {{ isSyncing ? "同步中..." : "同步数据" }}
-    </el-button>
-    <el-table :data="gpuList" style="width: 100%">
-      <el-table-column prop="id" label="ID"> </el-table-column>
-      <el-table-column prop="name" label="名称">
-        <template slot-scope="scope">
-          <el-link @click="handleNameClick(scope.row)">{{
-            scope.row.name
-          }}</el-link>
-        </template>
-      </el-table-column>
-      <el-table-column prop="type" label="文档类型"> </el-table-column>
-      <el-table-column prop="status" label="处理状态">
-        <template slot-scope="scope">
-          {{ scope.row.status }}
-        </template>
-      </el-table-column>
-      <!-- 添加其他需要的列 -->
-    </el-table>
-
-    <el-pagination
-      style="display: flex; justify-content: flex-end"
-      @size-change="handleSizeChange"
-      @current-change="handleCurrentChange"
-      :current-page="currentPage"
-      :page-sizes="[10, 20, 50, 100]"
-      :page-size="pageSize"
-      layout="total, sizes, prev, pager, next, jumper"
-      :total="total"
+        <el-option
+          v-for="item in types"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        />
+      </el-select>
+
+      <el-button
+        type="primary"
+        :loading="isSyncing"
+        :disabled="!selectedType"
+        class="ml-15"
+        @click="handleSyncData"
+      >
+        {{ isSyncing ? "同步中..." : "同步数据" }}
+      </el-button>
+    </div>
+    <el-tabs v-model="activeName" @tab-click="handleClick">
+      <!-- 原有的文献列表 tab -->
+      <el-tab-pane label="文献列表" name="first">
+        <!-- 添加搜索表单 -->
+        <div class="search-form">
+          <el-form
+            :inline="true"
+            :model="searchForm"
+            class="demo-form-inline"
+            label-width="100px"
+          >
+            <el-form-item label="创建时间:">
+              <el-date-picker
+                v-model="searchForm.createTimeRange"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+            <el-form-item label="文本时间:">
+              <el-date-picker
+                v-model="searchForm.textTimeRange"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="YYYY-MM-DD"
+              />
+            </el-form-item>
+            <el-form-item label="标签:">
+              <el-select
+                v-model="searchForm.tag"
+                filterable
+                remote
+                reserve-keyword
+                :remote-method="searchFormTags"
+                :loading="searchTagsLoading"
+                placeholder="请输入标签关键词"
+                clearable
+              >
+                <el-option
+                  v-for="tag in searchTagOptions"
+                  :key="tag.id"
+                  :label="tag.name"
+                  :value="tag.id"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="handleSearch">搜索</el-button>
+              <el-button @click="resetSearch">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="batch-operations">
+          <el-button
+            type="primary"
+            @click="handleBatchTag"
+            :disabled="selectedRows.length == 0"
+            >批量绑定标签</el-button
+          >
+        </div>
+        <!-- 数据表格区域 -->
+        <el-table
+          v-loading="isLoading"
+          :data="gpuList"
+          style="width: 100%"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="55" />
+          <el-table-column prop="id" label="ID" />
+          <el-table-column prop="name" label="名称">
+            <template #default="{ row }">
+              <el-link @click="handleNameClick(row)">{{ row.name }}</el-link>
+            </template>
+          </el-table-column>
+          <el-table-column prop="type" label="文档类型" />
+          <el-table-column prop="status" label="处理状态">
+            <template #default="{ row }">
+              <el-tag :type="getStatusType(row.status)">
+                {{ getStatusText(row.status) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <!-- 分页器 -->
+        <el-pagination
+          class="pagination"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="currentPage"
+          :page-sizes="[10, 20, 50, 100]"
+          :page-size="pageSize"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="total"
+        />
+      </el-tab-pane>
+
+      <!-- 添加 SOTA详情 tab -->
+      <el-tab-pane label="SOTA详情" name="second">
+        <el-table :data="sotaDetailsList" style="width: 100%">
+          <el-table-column label="Identifier" prop="identifier" />
+          <el-table-column label="Device" prop="device" />
+          <el-table-column label="Outcomes" prop="outcomes" />
+          <el-table-column label="Unit for analysis" prop="unit" />
+          <el-table-column label="Mean" prop="mean" />
+          <!-- 操作列与原有类似 -->
+        </el-table>
+      </el-tab-pane>
+
+      <!-- 添加 SOTA汇总表 tab -->
+      <el-tab-pane label="SOTA汇总表" name="third">
+        <el-table :data="sotaSummaryList" style="width: 100%">
+          <el-table-column label="Summary" prop="summary" />
+          <el-table-column label="EqMD" prop="eqmd" />
+          <el-table-column label="Pain:VAS" prop="painVas" />
+          <!-- 操作列与原有类似 -->
+        </el-table>
+      </el-tab-pane>
+    </el-tabs>
+
+    <!-- 添加标签对话框 -->
+    <el-dialog
+      title="批量绑定标签"
+      :visible.sync="tagDialogVisible"
+      width="500px"
     >
-    </el-pagination>
+      <el-form :model="tagForm">
+        <el-form-item label="标签">
+          <el-select
+            v-model="tagForm.tags"
+            multiple
+            filterable
+            remote
+            reserve-keyword
+            :remote-method="searchTags"
+            :loading="tagsLoading"
+            placeholder="请输入关键词搜索标签"
+          >
+            <el-option
+              v-for="tag in tagOptions"
+              :key="tag.id"
+              :label="tag.name"
+              :value="tag.name"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="tagDialogVisible = false">取消</el-button>
+          <el-button type="primary" @click="submitBatchTag">确定</el-button>
+        </span>
+      </template>
+    </el-dialog>
   </div>
 </template>
-  
-  <script>
+
+<script>
+import { debounce } from "lodash-es";
 import {
   GET_list,
   GET_sync,
   listBuckets,
   selectTypeList,
-} from "@/api/knowledge"; // 假设您有一个 API 文件来管理接口调用
+  getDetail,
+  search_tags,
+  edit_tags,
+} from "@/api/knowledge";
+import axios from "axios";
+// 状态映射表
+const STATUS_MAP = {
+  1: { text: "未处理", type: "info" },
+  2: { text: "已审核", type: "warning" },
+  3: { text: "已处理", type: "success" },
+  4: { text: "已作废", type: "danger" },
+  5: { text: "使用中", type: "primary" },
+};
 
 export default {
   name: "GpuList",
+
   data() {
     return {
-      gpuList: [{ name: "1" }],
+      gpuList: [],
       currentPage: 1,
       pageSize: 10,
       total: 0,
+      isLoading: false,
       isSyncing: false,
       buckets: [],
       types: [],
       selectedBucket: null,
       selectedType: null,
+      activeName: "first", // 当前激活的tab
+      sotaDetailsList: [], // SOTA详情列表数据
+      sotaSummaryList: [], // SOTA汇总表数据
+      searchForm: {
+        createTimeRange: [],
+        textTimeRange: [],
+        tag: "",
+      },
+      selectedRows: [], // 选中的行
+      tagDialogVisible: false, // 标签对话框显示状态
+      tagForm: {
+        tags: [], // 选中的标签ID数组
+      },
+      tagOptions: [], // 标签选项
+      tagsLoading: false, // 标签加载状态
+
+      searchTagOptions: [], // 搜索表单的标签选项
+      searchTagsLoading: false, // 搜索表单的标签加载状态
     };
   },
+
+  created() {
+    // 使用防抖处理数据加载
+    this.debouncedFetchGpuList = debounce(this.fetchGpuList, 300);
+  },
+
   mounted() {
-    this.fetchBuckets();
-    this.fetchGpuList();
+    this.initialize();
   },
+
   methods: {
-    fetchBuckets() {
-      listBuckets().then((res) => {
-        this.buckets = res.data;
-      });
+    /* 搜索栏模糊查找 */
+    /* 搜索表单的标签搜索 */
+    async searchFormTags(query) {
+      if (query !== "") {
+        this.searchTagsLoading = true;
+        try {
+          const { data } = await search_tags({ keyword: query });
+          this.searchTagOptions = data.data.items;
+        } catch (error) {
+          this.$message.error("搜索标签失败");
+          console.error(error);
+        } finally {
+          this.searchTagsLoading = false;
+        }
+      } else {
+        this.searchTagOptions = [];
+      }
+    },
+    // 处理表格选择变化
+    handleSelectionChange(rows) {
+      this.selectedRows = rows;
+    },
+
+    // 处理批量标签
+    handleBatchTag() {
+      this.tagDialogVisible = true;
+    },
+
+    /* 模糊搜索 */
+    async searchTags(query) {
+      if (query !== "") {
+        this.tagsLoading = true;
+        try {
+          const { data } = await search_tags({
+            keyword: query,
+          });
+          this.tagOptions = data.data.items;
+        } catch (error) {
+          this.$message.error("搜索标签失败");
+          console.error(error);
+        } finally {
+          this.tagsLoading = false;
+        }
+      } else {
+        this.tagOptions = []; // 当搜索词为空时清空选项
+      }
+    },
+
+    // 修改提交方法
+    async submitBatchTag() {
+      try {
+        const ids = this.selectedRows.map((row) => row.id);
+        // 这里需要添加实际的API调用
+        /* await edit_tags({
+          ids,
+          tagIds: this.tagForm.tags, // 现在传递的是标签ID数组
+        }); */
+        const idObject={literature_ids:ids,tag_names:this.tagForm.tags}
+        const response = await axios.post(
+          `${process.env.VUE_APP_BASE_API}/literature-tags/relation_tags/`,
+          idObject,
+          {
+            headers: {
+              "Content-Type": "application/json",
+            },
+          }
+        );
+        if(response.status!==200) return
+        console.log(this.tagForm.tags);
+        this.$message.success("标签更新成功");
+        this.tagDialogVisible = false;
+        this.fetchGpuList(); // 刷新列表
+      } catch (error) {
+        this.$message.error("标签更新失败");
+      }
+    },
+    // 处理搜索
+    handleSearch() {
+      this.currentPage = 1; // 重置页码
+      this.fetchGpuList();
+    },
+
+    // 重置搜索
+    resetSearch() {
+      this.searchForm = {
+        createTimeRange: [],
+        textTimeRange: [],
+        tag: "",
+      };
+      this.handleSearch();
+    },
+
+    // 初始化数据
+    async initialize() {
+      try {
+        await this.fetchBuckets();
+        await this.fetchGpuList();
+      } catch (error) {
+        this.$message.error("初始化数据失败");
+        console.error("初始化失败:", error);
+      }
+    },
+
+    // 获取状态文本
+    getStatusText(status) {
+      return STATUS_MAP[status]?.text || "未知状态";
+    },
+
+    // 获取状态样式类型
+    getStatusType(status) {
+      return STATUS_MAP[status]?.type || "info";
     },
-    handleBucketChange(val) {
+
+    // 获取知识库列表
+    async fetchBuckets() {
+      try {
+        const { data } = await listBuckets();
+        this.buckets = data;
+      } catch (error) {
+        this.$message.error("获取知识库列表失败");
+        console.error("获取知识库失败:", error);
+      }
+    },
+
+    // 处理知识库变更
+    async handleBucketChange(val) {
       this.selectedType = null;
       this.types = [];
-      if (this.selectedBucket) {
-        selectTypeList({ kb_id: val }).then((res) => {
-          this.types = res.data.dataList;
-        });
+
+      if (!val) return;
+
+      try {
+        const { data } = await selectTypeList({ kb_id: val });
+        this.types = data.dataList;
+        this.debouncedFetchGpuList();
+      } catch (error) {
+        this.$message.error("获取目录列表失败");
       }
-      this.fetchGpuList();
     },
-    handleSyncData() {
+
+    // 同步数据处理
+    async handleSyncData() {
       if (!this.selectedType) {
         this.$message.warning("请先选择目录");
         return;
       }
+
       this.isSyncing = true;
-      GET_sync({ doc_type_id: this.selectedType })
-        .then((res) => {
-          this.$message.success("同步成功");
-          this.fetchGpuList();
-        })
-        .catch((error) => {
-          this.$message.error("同步失败");
-        })
-        .finally(() => {
-          this.isSyncing = false;
-        });
+      try {
+        await GET_sync({ doc_type_id: this.selectedType });
+        this.$message.success("同步成功");
+        await this.fetchGpuList();
+      } catch (error) {
+        this.$message.error("同步失败");
+      } finally {
+        this.isSyncing = false;
+      }
     },
-    fetchGpuList() {
-      /*  structure_count() */
-      GET_list({ doc_type_id: 36 }).then((res) => {
-        this.gpuList = res.data.list;
-        this.total = res.data.total;
-      });
+
+    // 获取GPU列表数据
+    async fetchGpuList() {
+      this.isLoading = true;
+      try {
+        const params = {
+          page: this.currentPage,
+          page_size: this.pageSize,
+          doc_type_id: this.selectedType || 36,
+          // 添加搜索参数
+          create_time_start: this.searchForm.createTimeRange[0],
+          create_time_end: this.searchForm.createTimeRange[1],
+          text_time_start: this.searchForm.textTimeRange[0],
+          text_time_end: this.searchForm.textTimeRange[1],
+          tag: this.searchForm.tag,
+        };
+
+        const { data } = await GET_list(params);
+        this.gpuList = data.list.map((item) => {
+          const nameParts = item.name.split(".");
+          return {
+            ...item,
+            name: nameParts[0],
+            type: nameParts.length > 1 ? nameParts.pop() : "未知",
+          };
+        });
+        console.log(this.gpuList);
+        this.total = data.total;
+        this.currentPage = data.current_page;
+        this.pageSize = data.page_size;
+      } catch (error) {
+        this.$message.error("获取列表数据失败");
+      } finally {
+        this.isLoading = false;
+      }
     },
+
+    // 处理每页数量变化
     handleSizeChange(val) {
       this.pageSize = val;
-      this.fetchGpuList();
+      this.debouncedFetchGpuList();
     },
+
+    // 处理页码变化
     handleCurrentChange(val) {
       this.currentPage = val;
-      this.fetchGpuList();
+      this.debouncedFetchGpuList();
+    },
+
+    // 处理名称点击
+    async handleNameClick(row) {
+      try {
+        /* const res = await getDetail({ id: row.id })
+        console.log('详情数据:', res) */
+        this.$router.push({
+          path: "/knowledge/middPage/index",
+          query: { id: row.id, name: row.name },
+        });
+        // 这里可以添加详情处理逻辑
+      } catch (error) {
+        this.$message.error("获取详情失败");
+      }
     },
-    handleNameClick(row) {
-      // 这里实现跳转逻辑,例如:
-      this.$router.push({
-        path: "/knowledge/middPage/index",
-        query: { id: 1 },
-      });
+    // Tab切换处理
+    handleClick(tab) {
+      // 根据tab加载相应数据
+      switch (tab.name) {
+        case "second":
+          this.loadSotaDetails();
+          break;
+        case "third":
+          this.loadSotaSummary();
+          break;
+      }
+    },
+
+    // 加载SOTA详情数据
+    async loadSotaDetails() {
+      try {
+        // 这里调用API获取SOTA详情数据
+        const response = await getSotaDetails();
+        this.sotaDetailsList = response.data;
+      } catch (error) {
+        this.$message.error("获取SOTA详情失败");
+        console.error(error);
+      }
+    },
+
+    // 加载SOTA汇总表数据
+    async loadSotaSummary() {
+      try {
+        // 这里调用API获取SOTA汇总数据
+        const response = await getSotaSummary();
+        this.sotaSummaryList = response.data;
+      } catch (error) {
+        this.$message.error("获取SOTA汇总数据失败");
+        console.error(error);
+      }
     },
   },
 };
 </script>
-  
-  <style scoped>
+
+<style scoped>
 .gpu-list {
   padding: 20px;
-  /* 添加您需要的样式 */
+}
+
+.filter-section {
+  margin-bottom: 20px;
+}
+
+.ml-15 {
+  margin-left: 15px;
+}
+
+.pagination {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 15px;
 }
 </style>

+ 280 - 0
src/views/tags/index.vue

@@ -0,0 +1,280 @@
+<template>
+  <div class="tag-container">
+    <!-- 搜索栏 -->
+    <div class="search-bar">
+      <el-form :inline="true" :model="queryParams" class="demo-form-inline">
+        <el-form-item label="标签名称">
+          <el-input
+            v-model="queryParams.name"
+            placeholder="请输入标签名称"
+            clearable
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery">查询</el-button>
+          <el-button @click="resetQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-button type="primary" @click="handleAdd">新增</el-button>
+    <!-- 数据表格 -->
+    <el-table :data="tagList" style="width: 100%">
+      <el-table-column prop="id" label="ID" width="80"></el-table-column>
+      <el-table-column prop="name" label="标签名称"></el-table-column>
+      <el-table-column prop="create_time" label="创建时间"></el-table-column>
+      <el-table-column label="操作" width="180">
+        <template slot-scope="scope">
+          <el-button size="mini" type="primary" @click="handleEdit(scope.row)"
+            >编辑</el-button
+          >
+          <el-button size="mini" type="danger" @click="handleDelete(scope.row)"
+            >删除</el-button
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <div class="pagination-container">
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page="queryParams.pageNum"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="queryParams.pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+      >
+      </el-pagination>
+    </div>
+
+    <!-- 添加/编辑对话框 -->
+    <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="500px">
+      <el-form :model="form" :rules="rules" ref="form" label-width="80px">
+        <el-form-item label="标签名称" prop="name">
+          <el-input
+            v-model="form.name"
+            placeholder="请输入标签名称(以,隔开可批量增加)"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+  
+  <script>
+import {
+  add_tags,
+  get_literature_tags,
+  remove_tags,
+  search_tags,
+  edit_tags,
+} from "@/api/knowledge";
+import axios from "axios";
+export default {
+  name: "TagManagement",
+  data() {
+    return {
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: "",
+      },
+      // 标签列表数据
+      tagList: [],
+      // 总记录数
+      total: 0,
+      // 对话框显示状态
+      dialogVisible: false,
+      // 对话框标题
+      dialogTitle: "",
+      // 表单对象
+      form: {
+        id: undefined,
+        name: "",
+      },
+      // 表单校验规则
+      rules: {
+        name: [
+          { required: true, message: "请输入标签名称", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "长度在 2 到 20 个字符",
+            trigger: "blur",
+          },
+        ],
+      },
+      // 加载状态
+      loading: false,
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取列表数据
+    async getList() {
+      try {
+        this.loading = true;
+        const params = {
+          page: this.queryParams.pageNum,
+          size: this.queryParams.pageSize,
+          keyword: this.queryParams.name,
+        };
+
+        const response = await (this.queryParams.name
+          ? search_tags(params)
+          : search_tags(params));
+        console.log(response);
+        if (response.status === 200) {
+          this.tagList = response.data.data.items || [];
+          this.total = response.data.data.total || 0;
+        } else {
+          this.$message.error(response.msg || "获取标签列表失败");
+        }
+      } catch (error) {
+        console.error("获取标签列表出错:", error);
+        this.$message.error("获取标签列表失败");
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    // 删除按钮点击
+    handleDelete(row) {
+      this.$confirm("确认删除该标签吗?", "提示", {
+        type: "warning",
+      })
+        .then(async () => {
+          try {
+            const idObject = {tag_ids:[row.id]} 
+              const response = await axios.post(
+                `${process.env.VUE_APP_BASE_API}/literature-tags/remove_tags/`,
+                idObject,
+                {
+                  headers: {
+                    "Content-Type": "application/json",
+                  },
+                }
+              );
+            if (response.status === 200) {
+              this.$message.success("删除成功");
+              this.getList();
+            } else {
+              this.$message.error(response.msg || "删除失败");
+            }
+          } catch (error) {
+            console.error("删除标签出错:", error);
+            this.$message.error("删除失败");
+          }
+        })
+        .catch(() => {
+          // 取消删除操作
+        });
+    },
+
+    // 提交表单
+    submitForm() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          try {
+            if (!this.form.id) {
+              // 新增
+              /* const response = await add_tags({
+                tag_names: this.form.tag_names.split(','),
+              }); */
+              const idObject = { tag_names: this.form.name.split(",") };
+              const response = await axios.post(
+                `${process.env.VUE_APP_BASE_API}/literature-tags/add_tags/`,
+                idObject,
+                {
+                  headers: {
+                    "Content-Type": "application/json",
+                  },
+                }
+              );
+              if (response.status === 200) {
+                this.$message.success("添加成功");
+                this.dialogVisible = false;
+                this.getList();
+              } else {
+                this.$message.error(response.msg || "添加失败");
+              }
+            } else {
+              edit_tags({ name: this.form.name, id: this.form.id }).then(
+                (res) => {
+                  if (res.status !== 200) return;
+                  this.$message.success("修改成功");
+                  this.dialogVisible = false;
+                  this.getList();
+                }
+              );
+            }
+          } catch (error) {
+            console.error("提交表单出错:", error);
+            this.$message.error("操作失败");
+          }
+        }
+      });
+    },
+    // 查询按钮点击
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 重置按钮点击
+    resetQuery() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        name: "",
+      };
+      this.getList();
+    },
+    // 新增按钮点击
+    handleAdd() {
+      this.dialogTitle = "添加标签";
+      this.form = {
+        id: undefined,
+        name: "",
+      };
+      this.dialogVisible = true;
+    },
+    // 编辑按钮点击
+    handleEdit(row) {
+      this.dialogTitle = "编辑标签";
+      this.form = JSON.parse(JSON.stringify(row));
+      this.dialogVisible = true;
+    },
+    // 每页条数改变
+    handleSizeChange(val) {
+      this.queryParams.pageSize = val;
+      this.getList();
+    },
+    // 当前页改变
+    handleCurrentChange(val) {
+      this.queryParams.pageNum = val;
+      this.getList();
+    },
+  },
+};
+</script>
+  
+  <style scoped>
+.tag-container {
+  padding: 20px;
+}
+.search-bar {
+  margin-bottom: 20px;
+}
+.pagination-container {
+  margin-top: 20px;
+  text-align: right;
+}
+</style>

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