浏览代码

ficc小程序管理-报告分类配置

jwyu 9 月之前
父节点
当前提交
fb2eeabfd1
共有 5 个文件被更改,包括 1482 次插入163 次删除
  1. 2 1
      package.json
  2. 130 28
      pnpm-lock.yaml
  3. 153 134
      src/router/modules/ficcXcxRoutes.js
  4. 366 0
      src/views/ficc_manage/chapterVariety.vue
  5. 831 0
      src/views/ficc_manage/reportVariety.vue

+ 2 - 1
package.json

@@ -35,7 +35,8 @@
     "vue-froala-wysiwyg": "^4.1.4",
     "vue-qr": "^4.0.9",
     "vue-router": "^4.3.0",
-    "vue3-tree-org": "^4.2.2"
+    "vue3-tree-org": "^4.2.2",
+    "vuedraggable": "^2.24.3"
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^5.0.4",

+ 130 - 28
pnpm-lock.yaml

@@ -1,9 +1,5 @@
 lockfileVersion: '6.0'
 
-settings:
-  autoInstallPeers: true
-  excludeLinksFromLockfile: false
-
 dependencies:
   '@element-plus/icons-vue':
     specifier: ^2.3.1
@@ -71,6 +67,9 @@ dependencies:
   vue-froala-wysiwyg:
     specifier: ^4.1.4
     version: 4.1.4
+  vue-qr:
+    specifier: ^4.0.9
+    version: 4.0.9
   vue-router:
     specifier: ^4.3.0
     version: 4.3.0(vue@3.4.20)
@@ -78,8 +77,8 @@ dependencies:
     specifier: ^4.2.2
     version: 4.2.2(vue@3.4.20)
   vuedraggable:
-    specifier: ^4.1.0
-    version: 4.1.0(vue@3.4.20)
+    specifier: ^2.24.3
+    version: 2.24.3
 
 devDependencies:
   '@vitejs/plugin-vue':
@@ -647,11 +646,11 @@ packages:
     dev: false
 
   /@types/web-bluetooth@0.0.16:
-    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==, tarball: https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz}
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
     dev: false
 
   /@types/web-bluetooth@0.0.20:
-    resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, tarball: https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz}
+    resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
     dev: false
 
   /@vitejs/plugin-vue@5.0.4(vite@5.1.4)(vue@3.4.20):
@@ -817,7 +816,7 @@ packages:
     resolution: {integrity: sha512-KTEngal0aiUvNJ6I1Chk5Ew5XqChsFsxP4GKAYXWb99zKJWjNU72p2FWEOmZWHxHcqtniOJsgnpd3zizdpfEag==}
 
   /@vueuse/core@10.9.0(vue@3.4.20):
-    resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==, tarball: https://registry.npmmirror.com/@vueuse/core/-/core-10.9.0.tgz}
+    resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==}
     dependencies:
       '@types/web-bluetooth': 0.0.20
       '@vueuse/metadata': 10.9.0
@@ -829,7 +828,7 @@ packages:
     dev: false
 
   /@vueuse/core@9.13.0(vue@3.4.20):
-    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==, tarball: https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz}
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
     dependencies:
       '@types/web-bluetooth': 0.0.16
       '@vueuse/metadata': 9.13.0
@@ -841,15 +840,15 @@ packages:
     dev: false
 
   /@vueuse/metadata@10.9.0:
-    resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==, tarball: https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.9.0.tgz}
+    resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==}
     dev: false
 
   /@vueuse/metadata@9.13.0:
-    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==, tarball: https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz}
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
     dev: false
 
   /@vueuse/shared@10.9.0(vue@3.4.20):
-    resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==, tarball: https://registry.npmmirror.com/@vueuse/shared/-/shared-10.9.0.tgz}
+    resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==}
     dependencies:
       vue-demi: 0.14.7(vue@3.4.20)
     transitivePeerDependencies:
@@ -858,7 +857,7 @@ packages:
     dev: false
 
   /@vueuse/shared@9.13.0(vue@3.4.20):
-    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==, tarball: https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz}
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
     dependencies:
       vue-demi: 0.14.7(vue@3.4.20)
     transitivePeerDependencies:
@@ -906,6 +905,10 @@ packages:
       regenerator-runtime: 0.11.1
     dev: false
 
+  /balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+    dev: false
+
   /base64-arraybuffer@0.2.0:
     resolution: {integrity: sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==}
     engines: {node: '>= 0.6.0'}
@@ -916,6 +919,12 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
+  /brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+    dependencies:
+      balanced-match: 1.0.2
+    dev: false
+
   /braces@3.0.2:
     resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
     engines: {node: '>=8'}
@@ -948,7 +957,7 @@ packages:
     dev: true
 
   /clipboard@2.0.11:
-    resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==, tarball: https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz}
+    resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==}
     dependencies:
       good-listener: 1.2.2
       select: 1.1.2
@@ -1037,13 +1046,20 @@ packages:
       ms: 2.1.2
     dev: true
 
+  /decompress-response@6.0.0:
+    resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      mimic-response: 3.1.0
+    dev: false
+
   /delayed-stream@1.0.0:
     resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
     engines: {node: '>=0.4.0'}
     dev: false
 
   /delegate@3.2.0:
-    resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==, tarball: https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz}
+    resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==}
     dev: false
 
   /element-plus@2.4.4(vue@3.4.20):
@@ -1148,6 +1164,10 @@ packages:
     resolution: {integrity: sha512-oWF8SZNtLvfweURV5T0WYO69ZQpB1LQiGO2e6zoYRAlOwmqlW5yqLWfGi0tfn99qOgZ/4dxqBBDxqfOsRCQFiA==}
     dev: false
 
+  /fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+    dev: false
+
   /fsevents@2.3.3:
     resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -1163,13 +1183,25 @@ packages:
       is-glob: 4.0.3
     dev: true
 
+  /glob@8.1.0:
+    resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
+    engines: {node: '>=12'}
+    deprecated: Glob versions prior to v9 are no longer supported
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 5.1.6
+      once: 1.4.0
+    dev: false
+
   /globals@11.12.0:
     resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
     engines: {node: '>=4'}
     dev: true
 
   /good-listener@1.2.2:
-    resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==, tarball: https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz}
+    resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==}
     dependencies:
       delegate: 3.2.0
     dev: false
@@ -1194,6 +1226,18 @@ packages:
     resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==}
     dev: true
 
+  /inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+    dev: false
+
+  /inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+    dev: false
+
   /is-binary-path@2.1.0:
     resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
     engines: {node: '>=8'}
@@ -1226,6 +1270,10 @@ packages:
     resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
     dev: false
 
+  /js-binary-schema-parser@2.0.3:
+    resolution: {integrity: sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==}
+    dev: false
+
   /js-md5@0.8.3:
     resolution: {integrity: sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==}
     dev: false
@@ -1288,6 +1336,18 @@ packages:
       mime-db: 1.52.0
     dev: false
 
+  /mimic-response@3.1.0:
+    resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /minimatch@5.1.6:
+    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+    engines: {node: '>=10'}
+    dependencies:
+      brace-expansion: 2.0.1
+    dev: false
+
   /moment@2.30.1:
     resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
     dev: false
@@ -1310,6 +1370,16 @@ packages:
     resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
     dev: false
 
+  /once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+    dependencies:
+      wrappy: 1.0.2
+    dev: false
+
+  /parenthesis@3.1.8:
+    resolution: {integrity: sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==}
+    dev: false
+
   /path-key@3.1.1:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
     engines: {node: '>=8'}
@@ -1405,7 +1475,7 @@ packages:
     dev: true
 
   /select@1.1.2:
-    resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==, tarball: https://registry.npmmirror.com/select/-/select-1.1.2.tgz}
+    resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==}
     dev: false
 
   /shebang-command@2.0.0:
@@ -1420,12 +1490,24 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /sortablejs@1.14.0:
-    resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==, tarball: https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz}
+  /simple-concat@1.0.1:
+    resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
+    dev: false
+
+  /simple-get@4.0.1:
+    resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
+    dependencies:
+      decompress-response: 6.0.0
+      once: 1.4.0
+      simple-concat: 1.0.1
+    dev: false
+
+  /sortablejs@1.10.2:
+    resolution: {integrity: sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==}
     dev: false
 
   /sortablejs@1.15.2:
-    resolution: {integrity: sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==, tarball: https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.2.tgz}
+    resolution: {integrity: sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==}
     dev: false
 
   /source-map-js@1.0.2:
@@ -1442,6 +1524,12 @@ packages:
     deprecated: Please use @jridgewell/sourcemap-codec instead
     dev: false
 
+  /string-split-by@1.0.0:
+    resolution: {integrity: sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==}
+    dependencies:
+      parenthesis: 3.1.8
+    dev: false
+
   /supports-color@5.5.0:
     resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
     engines: {node: '>=4'}
@@ -1450,7 +1538,7 @@ packages:
     dev: true
 
   /tiny-emitter@2.1.0:
-    resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==, tarball: https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz}
+    resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==}
     dev: false
 
   /to-fast-properties@2.0.0:
@@ -1553,6 +1641,15 @@ packages:
       - typescript
     dev: false
 
+  /vue-qr@4.0.9:
+    resolution: {integrity: sha512-pAISV94T0MNEYA3NGjykUpsXRE2QfaNxlu9ZhEL6CERgqNc21hJYuP3hRVzAWfBQlgO18DPmZTbrFerJC3+Ikw==}
+    dependencies:
+      glob: 8.1.0
+      js-binary-schema-parser: 2.0.3
+      simple-get: 4.0.1
+      string-split-by: 1.0.0
+    dev: false
+
   /vue-router@4.3.0(vue@3.4.20):
     resolution: {integrity: sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==}
     peerDependencies:
@@ -1595,13 +1692,10 @@ packages:
       '@vue/server-renderer': 3.4.20(vue@3.4.20)
       '@vue/shared': 3.4.20
 
-  /vuedraggable@4.1.0(vue@3.4.20):
-    resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==, tarball: https://registry.npmmirror.com/vuedraggable/-/vuedraggable-4.1.0.tgz}
-    peerDependencies:
-      vue: ^3.0.1
+  /vuedraggable@2.24.3:
+    resolution: {integrity: sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==}
     dependencies:
-      sortablejs: 1.14.0
-      vue: 3.4.20
+      sortablejs: 1.10.2
     dev: false
 
   /which@2.0.2:
@@ -1611,3 +1705,11 @@ packages:
     dependencies:
       isexe: 2.0.0
     dev: true
+
+  /wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+    dev: false
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false

+ 153 - 134
src/router/modules/ficcXcxRoutes.js

@@ -1,137 +1,156 @@
-
-import Home from '@/layouts/index.vue'
+import Home from "@/layouts/index.vue";
 
 export default [
-    {
-		path: '/',
-		component: Home,
-		name: 'ficcXcxManage',
-		hidden: false,
-		meta:{
-			title:'ficc小程序管理'
-		},
-        children:[
-            {	
-				path:"videoManage",
-				name:"videoManage",
-				component:()=>import('@/views/interaction_manage/videoManage.vue'),
-				meta:{
-					title:'中文视频'
-				}
-			},
-            {	
-				path:"videoManageEN",
-				name:"videoManageEN",
-				component:()=>import('@/views/interaction_manage/videoManageEN.vue'),
-				meta:{
-					title:'英文视频'
-				}
-			},
-            {	
-				path:"videoManageENAdd",
-				name:"videoManageENAdd",
-				component:()=>import('@/views/interaction_manage/videoManageENAdd.vue'),
-				meta: {
-					title:'添加视频',
-					pathFrom:'videoManageEN',
-					pathName:'英文视频',
-					keepAlive: false
-				}
-			},
-            {	
-				path:"videoManageENEdit",
-				name:"videoManageENEdit",
-				component:()=>import('@/views/interaction_manage/videoManageENAdd.vue'),
-				meta:{
-					title:'编辑视频'
-				}
-			},
-            {
-				path: 'reportupdate',
-				component: () => import('@/views/report_manage/dayWeekUpdate.vue'),
-				name: 'reportupdate',
-				hidden: true,
+  {
+    path: "/",
+    component: Home,
+    name: "ficcXcxManage",
+    hidden: false,
+    meta: {
+      title: "ficc小程序管理",
+    },
+    children: [
+      {
+        path: "videoManage",
+        name: "videoManage",
+        component: () => import("@/views/interaction_manage/videoManage.vue"),
+        meta: {
+          title: "中文视频",
+        },
+      },
+      {
+        path: "videoManageEN",
+        name: "videoManageEN",
+        component: () => import("@/views/interaction_manage/videoManageEN.vue"),
+        meta: {
+          title: "英文视频",
+        },
+      },
+      {
+        path: "videoManageENAdd",
+        name: "videoManageENAdd",
+        component: () => import("@/views/interaction_manage/videoManageENAdd.vue"),
+        meta: {
+          title: "添加视频",
+          pathFrom: "videoManageEN",
+          pathName: "英文视频",
+          keepAlive: false,
+        },
+      },
+      {
+        path: "videoManageENEdit",
+        name: "videoManageENEdit",
+        component: () => import("@/views/interaction_manage/videoManageENAdd.vue"),
+        meta: {
+          title: "编辑视频",
+        },
+      },
+      {
+        path: "reportupdate",
+        component: () => import("@/views/report_manage/dayWeekUpdate.vue"),
+        name: "reportupdate",
+        hidden: true,
+        meta: {
+          title: "报告更新管理",
+          keepAlive: false,
+        },
+      },
+      {
+        path: "questionManage",
+        name: "questionManage",
+        component: () => import("@/views/interaction_manage/questionManage.vue"),
+        meta: {
+          title: "问答社区",
+        },
+      },
+      // {
+      // 	path: "messageboard",
+      // 	name: "留言板",
+      // 	component: () => import('@/views/interactive_manage/messageboard.vue')
+      // },
+      {
+        path: "ybComment",
+        name: "ybComment",
+        component: () => import("@/views/interactive_manage/messageManage.vue"),
+        meta: {
+          title: "留言管理",
+        },
+      },
+      {
+        path: "likelist",
+        name: "likelist",
+        component: () => import("@/views/interactive_manage/likelist.vue"),
+        meta: {
+          title: "点赞",
+        },
+      },
+      // {
+      // 	path:"questionComment",
+      // 	name:"问答评论",
+      // 	component:()=>import('@/views/interactive_manage/questionComment.vue')
+      // },
+      {
+        path: "bulletChatList",
+        name: "bulletChatList",
+        component: () => import("@/views/interactive_manage/bulletChatList.vue"),
+        meta: {
+          title: "弹幕管理",
+        },
+      },
+      {
+        path: "voicePlayStatistics",
+        component: () => import("@/views/dataReport_manage/voicePlayList.vue"),
+        name: "voicePlayStatistics",
+        hidden: false,
+        meta: {
+          title: "语音播报统计",
+        },
+      },
+      {
+        path: "reportlabel",
+        component: () => import("@/views/report_manage/tagLib.vue"),
+        name: "reportlabel",
+        hidden: true,
+        meta: {
+          title: "标签库",
+        },
+      },
+      // {
+      // 	path:'sendlog',
+      // 	component:()=> import('@/views/report_manage/reportEn/sendMsgLog.vue'),
+      // 	name:'群发日志',
+      // 	hidden:true
+      // },
+      {
+        path: "bannerStatistics",
+        component: () => import("@/views/interaction_manage/bannerStatistics.vue"),
+        name: "bannerStatistics",
+        hidden: true,
+        meta: {
+          title: "banner 统计",
+        },
+      },
+      {
+        path: "reportVariety",
+        component: () => import("@/views/ficc_manage/reportVariety.vue"),
+        name: "reportVariety",
+        hidden: true,
 				meta: {
-					title:'报告更新管理',
-					keepAlive: false
-				}
-			},
-            {
-				path:"questionManage",
-				name:"questionManage",
-				component:()=>import('@/views/interaction_manage/questionManage.vue'),
-				meta:{
-					title:'问答社区'
-				}
-			},
-            // {
-			// 	path: "messageboard",
-			// 	name: "留言板",
-			// 	component: () => import('@/views/interactive_manage/messageboard.vue')
-			// },
-			{
-				path: "ybComment",
-				name: "ybComment",
-				component: () => import('@/views/interactive_manage/messageManage.vue'),
-				meta:{
-					title:'留言管理'
-				}
-			},
-			{
-				path: "likelist",
-				name: "likelist",
-				component: () => import('@/views/interactive_manage/likelist.vue'),
-				meta:{
-					title:'点赞'
-				}
-			},
-            // {
-			// 	path:"questionComment",
-			// 	name:"问答评论",
-			// 	component:()=>import('@/views/interactive_manage/questionComment.vue')
-			// },
-            {
-				path:"bulletChatList",
-				name:"bulletChatList",
-				component:()=>import('@/views/interactive_manage/bulletChatList.vue'),
-				meta:{
-					title:'弹幕管理'
-				}
-			},
-            {
-				path:'voicePlayStatistics',
-				component: () => import('@/views/dataReport_manage/voicePlayList.vue'),
-				name: 'voicePlayStatistics',
-				hidden: false,
-				meta:{
-					title:'语音播报统计'
-				}
-			},
-            {
-				path:'reportlabel',
-				component:()=> import('@/views/report_manage/tagLib.vue'),
-				name:'reportlabel',
-				hidden:true,
-				meta:{
-					title:'标签库'
-				}
-			},
-			// {
-			// 	path:'sendlog',
-			// 	component:()=> import('@/views/report_manage/reportEn/sendMsgLog.vue'),
-			// 	name:'群发日志',
-			// 	hidden:true
-			// },
-			{
-				path:'bannerStatistics',
-				component:()=> import('@/views/interaction_manage/bannerStatistics.vue'),
-				name:'bannerStatistics',
-				hidden:true,
-				meta:{
-					title:"banner 统计"
-				}
-			},
-
-        ]
-    }
-]
+          title: "报告分类配置",
+        },
+      },
+      {
+        path: "chapterVariety",
+        component: () => import("@/views/ficc_manage/chapterVariety.vue"),
+        name: "chapterVariety",
+        hidden: true,
+        meta: {
+					title: "章节设置",
+          pathFrom: "reportVariety",
+          pathName: "报告分类配置",
+          keepAlive: false,
+        },
+      },
+    ],
+  },
+];

+ 366 - 0
src/views/ficc_manage/chapterVariety.vue

@@ -0,0 +1,366 @@
+<script>
+import { defineComponent } from 'vue'
+export default defineComponent({
+  //进入前是否清除参数
+  beforeRouteEnter(to, from, next) {
+    if (to.query.reportType == 'day') {
+      to.matched[1].meta.title = '晨报章节设置'
+    } else {
+      to.matched[1].meta.title = '周报章节设置'
+    }
+    next()
+  }
+})
+
+</script>
+
+<script setup>
+import { bannerupload, getchapterTypeList, editChapterType } from '@/api/api.js';
+import { reactive,ref } from 'vue'
+import $ from 'jquery'
+import { useRoute } from 'vue-router'
+import { ElMessage } from 'element-plus'
+
+const route = useRoute()
+
+const pageState = reactive({
+  list: [],
+  aeForm: {
+    show: false,
+    id: 0,
+    UnselectedIcon: '',
+    selectedIcon: '',
+    wordIcon: '',
+    bgImg: '',
+    IsShow: false
+  }
+})
+
+async function getList() {
+  getchapterTypeList({ ReportType: route.query.reportType == 'week' ? 'week' : 'day' }).then(res => {
+    if (res.Ret === 200) {
+      pageState.list = res.Data.List || []
+    }
+  })
+}
+function handleShowEdit(data) {
+  pageState.aeForm = {
+    show: true,
+    id: data.ReportChapterTypeId,
+    UnselectedIcon: data.UnselectedImage,
+    selectedIcon: data.SelectedImage,
+    wordIcon: data.WordsImage,
+    bgImg: data.EditImgUrl,
+    IsShow: data.IsShow == 0 ? true : false
+  }
+}
+getList()
+
+const aeForm = ref(null)
+function setClassifyHandle() {
+  aeForm.value.validate((valid) => {
+    if (valid) {
+      let params = {
+        ReportChapterTypeId: pageState.aeForm.id,
+        SelectedImage: pageState.aeForm.selectedIcon,
+        UnselectedImage: pageState.aeForm.UnselectedIcon,
+        WordsImage: pageState.aeForm.wordIcon,
+        EditImgUrl: pageState.aeForm.bgImg,
+        IsShow: pageState.aeForm.IsShow ? 0 : 1
+      }
+      editChapterType(params).then(res => {
+        if (res.Ret === 200) {
+          ElMessage.success(res.Msg);
+          getList();
+          pageState.aeForm.show = false;
+        }
+      })
+    }
+  })
+}
+
+function clickinput(type) {  //上传模拟点击
+  $(`#file${type}`).click();
+}
+function fileSelected(type) {  //选择文件上传
+  if (document.getElementById('file' + type).files[0]) {
+    let hostfile = document.getElementById('file' + type).files[0];
+    let size = Math.floor(hostfile.size / 1024 / 1024);
+    if (size > 200) {
+      ElMessage.error('上传文件大小不能大于200M!');
+      hostfile = {};
+      return false
+    }
+    if (hostfile.name.toLowerCase().includes('.png') || hostfile.name.toLowerCase().includes('.jpg') || hostfile.name.toLowerCase().includes('.jpeg')) {
+      let form = new FormData();
+      form.append('file', hostfile);  //hostfile.name
+      pageState.uploadloading = true;
+      bannerupload(form).then((res) => {
+        if (res.Ret === 200) {
+          if (type == 1) {
+            pageState.aeForm.UnselectedIcon = res.Data.ResourceUrl;
+          } else if (type == 2) {
+            pageState.aeForm.selectedIcon = res.Data.ResourceUrl;
+          } else if (type == 3) {
+            pageState.aeForm.wordIcon = res.Data.ResourceUrl
+          } else if (type == 4) {
+            pageState.aeForm.bgImg = res.Data.ResourceUrl
+          }
+        }
+        $("#file" + type).val('');
+        hostfile = {};
+      });
+    } else {
+      ElMessage.error('上传文件格式不正确!');
+    }
+  }
+}
+
+
+
+
+</script>
+
+<template>
+  <div class="classify-page">
+    <div class="content-box">
+      <el-tree
+        :data="pageState.list"
+        node-key="ReportChapterTypeId"
+        :props="{
+          label: 'ReportChapterTypeName',
+          children: 'Child',
+        }"
+        check-strictly
+        empty-text="暂无数据"
+        draggable
+        :allow-drop="canDropHandle"
+        @node-drop="dropOverHandle"
+      >
+        <template #default="{ data }">
+          <div class="classify-item-wrap">
+            <div>
+              <span :class="['tag', data.Enabled == 1 ? 'open' : 'close']">{{
+                data.Enabled == 1 ? "启用" : "禁用"
+              }}</span>
+              <span>{{ data.ReportChapterTypeName }}</span>
+            </div>
+
+            <div class="opt-box">
+              <span
+                style="cursor: pointer; color: #409eff"
+                @click.stop="handleShowEdit(data)"
+                >小程序配置</span
+              >
+            </div>
+          </div>
+        </template>
+      </el-tree>
+    </div>
+
+    <!-- 分类弹窗 -->
+    <el-dialog
+      :append-to-body="true"
+      v-model="pageState.aeForm.show"
+      center
+      title="小程序配置"
+      width="650px"
+    >
+      <div style="padding-left: 50px">
+        <el-form
+          :model="pageState.aeForm"
+          :rules="pageState.aerules"
+          ref="aeForm"
+          label-position="left"
+          hide-required-asterisk
+          label-width="110px"
+        >
+          <el-form-item label="未选中icon" prop="UnselectedIcon">
+            <input
+              type="file"
+              size="small"
+              name="file"
+              @change="fileSelected(1)"
+              id="file1"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.UnselectedIcon"
+              placeholder="上传icon"
+              size="medium"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(1)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="选中icon" prop="selectedIcon">
+            <input
+              type="file"
+              size="small"
+              name="file"
+              @change="fileSelected(2)"
+              id="file2"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.selectedIcon"
+              placeholder="上传icon"
+              size="medium"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(2)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="带字icon" prop="wordIcon">
+            <input
+              type="file"
+              size="small"
+              name="file3"
+              @change="fileSelected(3)"
+              id="file6"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.wordIcon"
+              placeholder="上传icon"
+              size="medium"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(3)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="章节配图" prop="bgImg">
+            <input
+              type="file"
+              size="small"
+              name="file4"
+              @change="fileSelected(4)"
+              id="file6"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.bgImg"
+              placeholder="上传icon"
+              size="medium"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(4)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="小程序端隐藏" prop="IsShow">
+            <el-switch
+              v-model="pageState.aeForm.IsShow"
+              inactive-color="#ededed"
+            ></el-switch>
+          </el-form-item>
+        </el-form>
+      </div>
+      <template #footer>
+        <div style="margin-top: 20px">
+          <el-button
+            @click="pageState.aeForm.show = false"
+            style="width: 132px; height: 40px"
+            >取消</el-button
+          >
+          <el-button
+            @click="setClassifyHandle"
+            type="primary"
+            style="width: 132px; height: 40px"
+            >保存</el-button
+          >
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+
+<style lang="scss">
+.el-cascader .el-input {
+  width: 100%;
+}
+.classify-page {
+  .content-box {
+    .el-tree-node__content {
+      padding-top: 10px;
+      padding-bottom: 10px;
+      border-bottom: 1px solid #c8cdd9;
+      height: auto;
+    }
+  }
+}
+</style>
+<style lang="scss" scoped>
+.top-wrap {
+  display: flex;
+  justify-content: space-between;
+  background: #ffffff;
+  border-radius: 4px;
+  padding: 20px;
+}
+.content-box {
+  padding: 20px;
+  margin-top: 20px;
+  height: calc(100vh - 260px);
+  overflow-y: auto;
+  background-color: #ffffff;
+  .classify-item-wrap {
+    flex: 1;
+    padding-right: 20px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    .tag {
+      display: inline-block;
+      min-width: 76px;
+      line-height: 30px;
+      text-align: center;
+      margin-right: 5px;
+      &.open {
+        background-color: #ecf2fe;
+        color: #0052d9;
+      }
+      &.close {
+        background-color: #0052d9;
+        color: #fff;
+      }
+    }
+    .opt-box {
+      .icon-drag,
+      .icon-set {
+        width: 16px;
+        height: 16px;
+        margin-left: 10px;
+      }
+    }
+  }
+}
+</style>

+ 831 - 0
src/views/ficc_manage/reportVariety.vue

@@ -0,0 +1,831 @@
+<script setup>
+import { bannerupload, classifylist, classifyedit } from '@/api/api.js';
+import { ElMessage } from 'element-plus';
+import { useRouter } from 'vue-router';
+import { ref, reactive, computed, nextTick } from 'vue'
+import { Search } from '@element-plus/icons-vue'
+// import draggable from 'vuedraggable';
+import $ from 'jquery'
+
+const router = useRouter()
+
+const pageState = reactive({
+  searchVal: '',
+  list: [],
+  inputVisible: false,
+  inputValue: '',
+  ClassifyMenuList: [],
+  YbFiccPcIconList: [
+    {
+      label: '蓝色',
+      val: 'https://hzstatic.hzinsights.com/static/yb_wx/ficc_classify_bg_blue.png'
+    },
+    {
+      label: '绿色',
+      val: 'https://hzstatic.hzinsights.com/static/yb_wx/ficc_classify_bg_green.png'
+    },
+    {
+      label: '红色',
+      val: 'https://hzstatic.hzinsights.com/static/yb_wx/ficc_classify_bg_orange.png'
+    },
+  ],
+  aeForm: {
+    show: false,
+    classify_name: '',
+    parent_id: 0,
+    abstract: '',
+    descript: '',
+    author: '',
+    authorDsec: '',
+    classifyDsec: '',
+    authorTag: '',
+    classifyImg: '',
+    reportImg: '',
+    columImg: '',
+    bannerImg: '',
+    avatar: '',
+    label: "",
+    hasTel: 0,//是否有电话会:0-否 1-是
+    showType: 1,//展示形式 1-列表 2-专栏 3-品种
+    Sort: '',
+    YbFiccSort: '',
+    YbFiccIcon: '',
+    YbIconUrl: '',
+    YbBgUrl: '',
+    YbFiccPcIcon: '',
+    IsShow: false,//是否在小程序端展示:0-隐藏 1-显示
+    YbListImg: '',//小程序研报列表封面图
+    YbShareBgImg: '',
+    ClassifyMenuId: '',
+    YbRightBanner: '',//报告合集配图
+    relate: [],
+    RelateVideo: false,//关联线上路演
+  },
+  aerules: {
+    abstract: [{
+      required: true,
+      message: '请输入分类简介',
+      trigger: 'blur'
+    }],
+    descript: [{
+      required: true,
+      message: '请输入分类描述',
+      trigger: 'blur'
+    }],
+    author: [{
+      required: true,
+      message: '请输入栏目作者',
+      trigger: 'blur'
+    }],
+    authorDsec: [{
+      required: true,
+      message: '请输入作者简介',
+      trigger: 'blur'
+    }],
+    classifyDsec: [{
+      required: true,
+      message: '请输入栏目简介',
+      trigger: 'blur'
+    }],
+    classifyImg: [{
+      required: true,
+      message: '请上传首页配图',
+      trigger: 'blur'
+    }],
+    reportImg: [{
+      required: true,
+      message: '请上传研报配图',
+      trigger: 'blur'
+    }],
+    bannerImg: [{
+      required: true,
+      message: '请上传头部banner',
+      trigger: 'blur'
+    }],
+    avatar: [{
+      required: true,
+      message: '请上传作者头像',
+      trigger: 'blur'
+    }],
+    columImg: [{
+      required: true,
+      message: '请上传专栏配图',
+      trigger: 'blur'
+    }],
+    label: [{
+      required: true,
+      message: '请输入分类标签',
+      trigger: 'blur'
+    }],
+    hasTel: [{
+      required: true,
+      message: '请选择',
+      trigger: 'change'
+    }],
+    showType: [{
+      required: true,
+      message: '请选择展示形式',
+      trigger: 'change'
+    }],
+    Sort: [{
+      required: true,
+      message: '请输入数字',
+      trigger: 'blur'
+    }],
+    YbFiccSort: [{
+      required: true,
+      message: '请输入数字',
+      trigger: 'blur'
+    }],
+    YbFiccIcon: [{
+      required: true,
+      message: '上传FICC页icon',
+      trigger: 'change'
+    }],
+    YbRightBanner: [{
+      required: true,
+      message: '上传报告合集配图',
+      trigger: 'change'
+    }],
+    YbFiccPcIcon: [{
+      required: true,
+      message: '选择背景颜色',
+      trigger: 'change'
+    }],
+    IsShow: [{
+      required: true,
+      message: '小程序端隐藏',
+      trigger: 'change'
+    }],
+    YbListImg: [{
+      required: true,
+      message: '上传列表背景图',
+      trigger: 'change'
+    }],
+    YbShareBgImg: [{
+      required: true,
+      message: '上传列表背景图',
+      trigger: 'change'
+    }],
+  },
+})
+
+const parentIsList = computed(() => {
+  //当前上级分类是否为列表
+  let flag = false
+  if (pageState.aeForm.show) {
+    pageState.list.forEach(item => {
+      if (item.Id == pageState.aeForm.parent_id) {
+        if (item.ShowType == 1) {
+          flag = true
+        }
+      }
+    })
+  }
+  return flag
+})
+const parentIsVariety = computed(() => {
+  //当前上级分类是否为品种
+  let flag = false
+  if (pageState.aeForm.show) {
+    pageState.list.forEach(item => {
+      if (item.Id == pageState.aeForm.parent_id) {
+        if (item.ShowType == 3) {
+          flag = true
+        }
+      }
+    })
+  }
+  return flag
+})
+const selectMenuOpt = computed(() => {
+  let arr = []
+  if (this.aeForm.show) {
+    this.list.forEach(item => {
+      if (item.Id == this.aeForm.parent_id) {
+        arr = item.ClassifyMenuList || []
+      }
+    })
+  }
+  return arr
+})
+
+
+function chapterSetting(row) {
+  let reportType;
+  if (row.ClassifyName == '周报') {
+    reportType = 'week'
+  } else {
+    reportType = 'day'
+  }
+  router.push({ path: 'chapterVariety', query: { reportType } })
+}
+const itemINput = ref(null)
+const saveTagInput = ref(null)
+function showInput(index) {
+  if (index != -1) {
+    pageState.ClassifyMenuList[index].inputVisible = true
+    nextTick(() => {
+      itemINput.value[0].focus();
+    })
+    return
+  }
+  pageState.inputVisible = true;
+  nextTick(() => {
+    saveTagInput.value.focus();
+  });
+}
+function handleInputConfirm() {
+  let inputValue = pageState.inputValue;
+  if (inputValue) {
+    pageState.ClassifyMenuList.push({ MenuId: 0, MenuName: inputValue, inputVisible: false });
+  }
+  pageState.inputVisible = false;
+  pageState.inputValue = '';
+}
+function handleClose(index) {
+  pageState.ClassifyMenuList.splice(index, 1)
+}
+//保存
+const aeForm = ref(null)
+function setClassifyHandle() {
+  aeForm.value.validate((valid) => {
+    if (valid) {
+      // console.log(this.aeForm);
+      let params = {
+        ClassifyId: pageState.aeForm.classify_id,
+        ClassifyLabel: pageState.aeForm.label,
+        ShowType: pageState.aeForm.showType,
+        IsShow: pageState.aeForm.IsShow ? 0 : 1,
+        YbFiccSort: pageState.aeForm.YbFiccSort ? Number(pageState.aeForm.YbFiccSort) : 0,
+        YbFiccIcon: pageState.aeForm.YbFiccIcon,
+        YbFiccPcIcon: pageState.aeForm.YbFiccPcIcon,
+        YbIconUrl: pageState.aeForm.YbIconUrl,
+        YbBgUrl: pageState.aeForm.YbBgUrl,
+        YbListImg: pageState.aeForm.YbListImg,
+        YbShareBgImg: pageState.aeForm.parent_id != 0 && (pageState.parentIsList || pageState.parentIsVariety) ? pageState.aeForm.YbShareBgImg_ : pageState.aeForm.YbShareBgImg,
+        ClassifyMenuId: pageState.aeForm.ClassifyMenuId || 0,
+        YbRightBanner: pageState.aeForm.YbRightBanner || '',
+        MenuList: [],
+        RelateTel: pageState.aeForm.relate.includes(1) ? 1 : 0,
+        RelateVideo: pageState.aeForm.RelateVideo ? 1 : 0,
+      }
+      params.MenuList = pageState.ClassifyMenuList.map(item => {
+        return {
+          MenuId: item.MenuId,
+          MenuName: item.MenuName
+        }
+      })
+      classifyedit(params).then(res => {
+        if (res.Ret == 200) {
+          ElMessage.success(res.Msg);
+          getlist();
+          pageState.aeForm.show = false;
+        }
+      });
+
+    }
+  })
+}
+function cancelClassify() {
+  pageState.aeForm.show = false
+}
+function handleShowEdit(item) {
+  pageState.aeForm = {
+    show: true,
+    classify_id: parseInt(item.Id),
+    classify_name: item.ClassifyName,
+    parent_id: item.ParentId,
+    descript: item.Descript,
+    author: item.ReportAuthor,
+    authorDsec: item.AuthorDescript,
+    classifyDsec: item.Abstract,
+    authorTag: item.VipTitle,
+    classifyImg: item.ReportImgUrl,
+    reportImg: item.HomeImgUrl,
+    columImg: item.ColumnImgUrl,
+    bannerImg: item.HeadImgUrl,
+    avatar: item.AvatarImgUrl,
+    label: item.ClassifyLabel,
+    hasTel: item.HasTeleconference,
+    showType: item.ShowType,
+    Sort: item.Sort,
+    YbFiccSort: item.YbFiccSort,
+    YbFiccIcon: item.YbFiccIcon,
+    YbIconUrl: item.YbIconUrl,
+    YbBgUrl: item.YbBgUrl,
+    YbFiccPcIcon: item.YbFiccPcIcon,
+    IsShow: item.IsShow == 0 ? true : false,//是否在小程序端展示:0-隐藏 1-显示
+    YbListImg: item.YbListImg,
+    YbShareBgImg: item.YbShareBgImg,
+    ClassifyMenuId: item.ClassifyMenuId || '',
+    YbRightBanner: item.YbRightBanner || '',
+    relate: [item.RelateTel == 1 ? 1 : null, item.RelateVideo == 1 ? 2 : null],
+    RelateVideo: item.RelateVideo == 1 ? true : false
+  }
+  pageState.ClassifyMenuList = item.ClassifyMenuList ? item.ClassifyMenuList.map(item => {
+    return {
+      MenuId: item.MenuId,
+      MenuName: item.MenuName,
+      inputVisible: false
+    }
+  }) : []
+  //若编辑的为列表、品种下的二级分类 需要计算YbShareBgImg_
+  //已填写则获取已填写内容
+  if (item.YbShareBgImg) {
+    pageState.aeForm.YbShareBgImg_ = item.YbShareBgImg
+  } else {//若未填写则取一级分类的YbShareBgImg
+    pageState.aeForm.YbShareBgImg_ = getParentYbShareBgImg(item.ParentId)
+  }
+  nextTick(() => {
+    aeForm.value.clearValidate();
+  })
+}
+//根据上级分类id获取YbShareBgImg
+function getParentYbShareBgImg(id) {
+  let YbShareBgImg = ''
+  let parent = pageState.list.find((item) => { return item.Id === id })
+  if (!parent) return
+  YbShareBgImg = parent.YbShareBgImg || ''
+  return YbShareBgImg
+}
+function getlist() {  //获取列表
+  let params = { KeyWord: pageState.searchVal };
+  pageState.listLoading = true;
+  classifylist(params).then((res) => {
+    if (res.Ret == 200) {
+      pageState.list = res.Data.List || [];
+
+    }
+    pageState.listLoading = false;
+  });
+}
+function clickinput(type) {  //上传模拟点击
+  $(`#file${type}`).click();
+}
+function fileSelected(type) {  //选择文件上传
+  // const that = this;
+  if (document.getElementById('file' + type).files[0]) {
+    let hostfile = document.getElementById('file' + type).files[0];
+    let size = Math.floor(hostfile.size / 1024 / 1024);
+    if (size > 200) {
+      ElMessage.error('上传文件大小不能大于200M!');
+      hostfile = {};
+      return false
+    }
+    if (hostfile.name.toLowerCase().includes('.png') || hostfile.name.toLowerCase().includes('.jpg') || hostfile.name.toLowerCase().includes('.jpeg')) {
+      let form = new FormData();
+      form.append('file', hostfile);  //hostfile.name
+      pageState.uploadloading = true;
+      bannerupload(form).then((res) => {
+        if (res.Ret === 200) {
+          if (type == 1) {
+            pageState.aeForm.classifyImg = res.Data.ResourceUrl;
+          } else if (type == 2) {
+            pageState.aeForm.bannerImg = res.Data.ResourceUrl;
+          } else if (type == 3) {
+            pageState.aeForm.avatar = res.Data.ResourceUrl
+          } else if (type == 4) {
+            pageState.aeForm.columImg = res.Data.ResourceUrl
+          } else if (type == 5) {
+            pageState.aeForm.reportImg = res.Data.ResourceUrl
+          } else if (type == 6) {
+            pageState.aeForm.YbFiccIcon = res.Data.ResourceUrl
+          } else if (type == 7) {
+            pageState.aeForm.YbIconUrl = res.Data.ResourceUrl
+          } else if (type == 8) {
+            pageState.aeForm.YbBgUrl = res.Data.ResourceUrl
+          } else if (type == 9) {
+            pageState.aeForm.YbListImg = res.Data.ResourceUrl
+          } else if (type == 10) {
+            pageState.aeForm.YbShareBgImg = res.Data.ResourceUrl
+          } else if (type == 11) {
+            pageState.aeForm.YbRightBanner = res.Data.ResourceUrl
+          } else if (type == 12) {
+            pageState.aeForm.YbShareBgImg_ = res.Data.ResourceUrl
+          }
+        }
+        $("#file" + type).val('');
+        hostfile = {};
+      });
+    } else {
+      ElMessage.error('上传文件格式不正确!');
+    }
+  }
+}
+
+getlist()
+
+
+</script>
+
+<template>
+  <div class="report-variety-page">
+    <div class="top-wrap">
+      <el-input
+        placeholder="分类名称"
+        v-model="pageState.searchVal"
+        style="max-width: 262px"
+        @change="getlist"
+        clearable
+        :prefix-icon="Search"
+      >
+      </el-input>
+    </div>
+    <div class="content-box">
+      <el-tree
+        :data="pageState.list"
+        node-key="Id"
+        :props="{
+          label: 'ClassifyName',
+          children: 'Child',
+        }"
+        check-strictly
+        empty-text="暂无数据"
+        :indent="76"
+      >
+        <template #default="{ data }">
+          <div class="classify-item-wrap">
+            <div>
+              <span :class="['tag', data.Enabled == 1 ? 'open' : 'close']">{{
+                data.Enabled == 1 ? "启用" : "禁用"
+              }}</span>
+              <span>{{ data.ClassifyName }}</span>
+            </div>
+
+            <div class="opt-box">
+              <span
+                class="editsty"
+                v-if="['晨报', '周报'].includes(data.ClassifyName)"
+                @click="chapterSetting(data)"
+                >章节设置</span
+              >
+              <span
+                style="cursor: pointer; color: #409eff; margin-left: 10px"
+                @click.stop="handleShowEdit(data)"
+                >小程序配置</span
+              >
+            </div>
+          </div>
+        </template>
+      </el-tree>
+    </div>
+
+    <!-- 分类弹窗 -->
+    <el-dialog
+      :append-to-body="true"
+      v-model="pageState.aeForm.show"
+      center
+      title="小程序配置"
+      width="650px"
+    >
+      <div style="padding-left: 50px">
+        <el-form
+          :model="pageState.aeForm"
+          :rules="pageState.aerules"
+          ref="aeForm"
+          label-position="left"
+          hide-required-asterisk
+          label-width="110px"
+        >
+          <el-form-item
+            prop="showType"
+            label="展示形式"
+            v-if="pageState.aeForm.parent_id == 0"
+          >
+            <el-select
+              v-model="pageState.aeForm.showType"
+              placeholder="请选择"
+              style="width: 400px"
+            >
+              <el-option label="列表" :value="1"></el-option>
+              <!-- <el-option label="专栏" :value="2"></el-option>  -->
+              <el-option label="品种" :value="3"></el-option>
+            </el-select>
+          </el-form-item>
+          <!-- 一级目录子目录 -->
+          <el-form-item
+            label="子目录"
+            v-if="
+              pageState.aeForm.parent_id == 0 && pageState.aeForm.showType == 1
+            "
+          >
+            <draggable v-model="pageState.ClassifyMenuList" animation="300">
+              <div
+                style="display: inline-block; margin-right: 5px"
+                v-for="(item, index) in pageState.ClassifyMenuList"
+                :key="item"
+              >
+                <el-input
+                  v-if="item.inputVisible"
+                  v-model="item.MenuName"
+                  ref="itemINput"
+                  size="small"
+                  style="width: 90px"
+                  :autofocus="true"
+                  @keyup.enter="item.inputVisible = false"
+                  @blur="item.inputVisible = false"
+                ></el-input>
+                <el-tag
+                  v-else
+                  closable
+                  :disable-transitions="false"
+                  @click="showInput(index)"
+                  @close="handleClose(index)"
+                >
+                  {{ item.MenuName }}
+                </el-tag>
+              </div>
+            </draggable>
+            <div>
+              <el-input
+                v-if="pageState.inputVisible"
+                v-model="pageState.inputValue"
+                ref="saveTagInput"
+                size="small"
+                @keyup.enter="handleInputConfirm"
+                @blur="handleInputConfirm"
+                style="width: 90px"
+              >
+              </el-input>
+              <el-button v-else size="small" @click="showInput(-1)"
+                >+ 点击新增</el-button
+              >
+            </div>
+          </el-form-item>
+          <!-- 二级目录子目录 -->
+          <el-form-item
+            label="子目录"
+            v-if="
+              pageState.aeForm.parent_id != 0 &&
+              pageState.selectMenuOpt.length > 0
+            "
+          >
+            <el-select
+              v-model="pageState.aeForm.ClassifyMenuId"
+              clearable
+              placeholder="请选择"
+              style="width: 400px"
+            >
+              <el-option
+                :label="item.MenuName"
+                :value="item.MenuId"
+                v-for="item in pageState.selectMenuOpt"
+                :key="item.MenuId"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item
+            label="FICC页icon"
+            v-if="pageState.aeForm.parent_id == 0"
+            prop="YbFiccIcon"
+          >
+            <input
+              type="file"
+              size="small"
+              name="file"
+              @change="fileSelected(6)"
+              id="file6"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.YbFiccIcon"
+              placeholder="上传FICC页icon"
+              size="medium"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(6)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item
+            label="报告合集配图"
+            v-if="
+              pageState.aeForm.parent_id == 0 && pageState.aeForm.showType !== 2
+            "
+            prop="YbRightBanner"
+          >
+            <input
+              type="file"
+              size="small"
+              name="file"
+              @change="fileSelected(11)"
+              id="file11"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.YbRightBanner"
+              placeholder="上传报告合集配图"
+              size="medium"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click.="clickinput(11)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item
+            label="分享链接配图"
+            prop="YbShareBgImg"
+            v-if="pageState.aeForm.parent_id == 0"
+          >
+            <input
+              type="file"
+              size="small"
+              name="file"
+              @change="fileSelected(10)"
+              id="file10"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.YbShareBgImg"
+              placeholder="上传分享链接配图"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(10)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+
+          <!-- 二级分类配置列表背景图 -->
+          <el-form-item
+            label="列表背景图"
+            v-if="
+              pageState.aeForm.parent_id != 0 &&
+              (parentIsList || parentIsVariety)
+            "
+            prop="YbListImg"
+          >
+            <input
+              type="file"
+              size="small"
+              name="file"
+              @change="fileSelected(9)"
+              id="file9"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.YbListImg"
+              placeholder="上传列表背景图"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(9)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+          <!-- 列表、品种的二级分类 展示分享链接配图 但是不是必填的 -->
+          <el-form-item
+            label="分享链接配图"
+            prop="YbShareBgImg_"
+            v-if="
+              pageState.aeForm.parent_id != 0 &&
+              (parentIsList || parentIsVariety)
+            "
+          >
+            <input
+              type="file"
+              size="small"
+              name="file"
+              @change="fileSelected(12)"
+              id="file12"
+              class="true-file"
+              style="display: none"
+            />
+            <el-input
+              readonly
+              type="text"
+              v-model="pageState.aeForm.YbShareBgImg_"
+              placeholder="上传分享链接配图"
+              size="medium"
+              style="width: 400px"
+            >
+              <template #append>
+                <el-button type="primary" size="mini" @click="clickinput(12)"
+                  >选择图片</el-button
+                >
+              </template>
+            </el-input>
+          </el-form-item>
+
+          <el-form-item
+            label="关联线上路演"
+            prop="RelateVideo"
+            v-if="pageState.aeForm.parent_id != 0"
+          >
+            <el-switch
+              v-model="pageState.aeForm.RelateVideo"
+              inactive-color="#ededed"
+            ></el-switch>
+          </el-form-item>
+
+          <el-form-item label="小程序端隐藏" prop="IsShow">
+            <el-switch
+              v-model="pageState.aeForm.IsShow"
+              inactive-color="#ededed"
+            ></el-switch>
+          </el-form-item>
+        </el-form>
+      </div>
+      <template #footer>
+        <div style="margin-top: 20px">
+          <el-button @click="cancelClassify" style="width: 132px; height: 40px"
+            >取消</el-button
+          >
+          <el-button
+            @click="setClassifyHandle"
+            type="primary"
+            style="width: 132px; height: 40px"
+            >保存</el-button
+          >
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<style lang="scss">
+.el-cascader .el-input {
+  width: 100%;
+}
+.report-variety-page {
+  .content-box {
+    .el-tree-node__content {
+      padding-top: 10px;
+      padding-bottom: 10px;
+      border-bottom: 1px solid #c8cdd9;
+      height: auto;
+    }
+  }
+}
+</style>
+<style lang="scss" scoped>
+.top-wrap {
+  display: flex;
+  justify-content: flex-end;
+  background: #ffffff;
+  border-radius: 4px;
+  padding: 10px 20px;
+}
+.content-box {
+  --el-tree-node-content-height: auto !important;
+  padding: 20px;
+  margin-top: 20px;
+  height: calc(100vh - 230px);
+  overflow-y: auto;
+  background-color: #ffffff;
+  .classify-item-wrap {
+    flex: 1;
+    padding-right: 20px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    .tag {
+      display: inline-block;
+      min-width: 76px;
+      line-height: 30px;
+      text-align: center;
+      margin-right: 5px;
+      &.open {
+        background-color: #ecf2fe;
+        color: #0052d9;
+      }
+      &.close {
+        background-color: #0052d9;
+        color: #fff;
+      }
+    }
+    .opt-box {
+      .icon-drag,
+      .icon-set {
+        width: 16px;
+        height: 16px;
+        margin-left: 10px;
+      }
+    }
+  }
+}
+</style>