Browse Source

暂时处理好了左侧tab栏

shaogen1995 3 years ago
parent
commit
bff5b69165

+ 205 - 85
new_backstage/package-lock.json

@@ -1752,6 +1752,63 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.2.tgz",
+          "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "ssri": {
           "version": "8.0.1",
           "resolved": "https://registry.nlark.com/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1621364626710&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1760,6 +1817,28 @@
           "requires": {
             "minipass": "^3.1.1"
           }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          }
         }
       }
     },
@@ -2314,6 +2393,14 @@
       "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=",
       "dev": true
     },
+    "async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "requires": {
+        "babel-runtime": "6.x"
+      }
+    },
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
@@ -2353,6 +2440,14 @@
       "integrity": "sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk=",
       "dev": true
     },
+    "axios": {
+      "version": "0.21.4",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz",
+      "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
+      "requires": {
+        "follow-redirects": "^1.14.0"
+      }
+    },
     "babel-eslint": {
       "version": "10.1.0",
       "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.1.0.tgz?cache=0&sync_timestamp=1611946434496&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-eslint%2Fdownload%2Fbabel-eslint-10.1.0.tgz",
@@ -2367,6 +2462,11 @@
         "resolve": "^1.12.0"
       }
     },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
     "babel-loader": {
       "version": "8.2.2",
       "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz",
@@ -2418,6 +2518,27 @@
         "@babel/helper-define-polyfill-provider": "^0.2.2"
       }
     },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.6.12",
+          "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+        },
+        "regenerator-runtime": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+        }
+      }
+    },
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz",
@@ -4072,8 +4193,7 @@
     "deepmerge": {
       "version": "1.5.2",
       "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz",
-      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=",
-      "dev": true
+      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
     },
     "default-gateway": {
       "version": "5.0.5",
@@ -4504,6 +4624,22 @@
         "safer-buffer": "^2.1.0"
       }
     },
+    "echarts": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.3.0.tgz",
+      "integrity": "sha512-zENufmwFE6WjM+24tW3xQq4ICqQtI0CGj4bDVDNd3BK3LtaA/5wBp+64ykIyKy3QElz0cieKqSYP4FX9Lv9MwQ==",
+      "requires": {
+        "tslib": "2.3.0",
+        "zrender": "5.3.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+        }
+      }
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
@@ -4522,6 +4658,19 @@
       "integrity": "sha1-vwEEhzbJW3jymI6IAF4OuzhZQqQ=",
       "dev": true
     },
+    "element-ui": {
+      "version": "2.15.6",
+      "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.6.tgz",
+      "integrity": "sha512-rcYXEKd/j2G0AgficAOk1Zd1AsnHRkhmrK4yLHmNOiimU2JfsywgfKUjMoFuT6pQx0luhovj8lFjpE4Fnt58Iw==",
+      "requires": {
+        "async-validator": "~1.8.1",
+        "babel-helper-vue-jsx-merge-props": "^2.0.0",
+        "deepmerge": "^1.2.0",
+        "normalize-wheel": "^1.0.1",
+        "resize-observer-polyfill": "^1.5.0",
+        "throttle-debounce": "^1.0.1"
+      }
+    },
     "elliptic": {
       "version": "6.5.4",
       "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.4.tgz",
@@ -5412,8 +5561,7 @@
     "follow-redirects": {
       "version": "1.14.1",
       "resolved": "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.1.tgz?cache=0&sync_timestamp=1620555300559&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.1.tgz",
-      "integrity": "sha1-2RFN7Qoc/dM04WTmZirQK/2R/0M=",
-      "dev": true
+      "integrity": "sha1-2RFN7Qoc/dM04WTmZirQK/2R/0M="
     },
     "for-in": {
       "version": "1.0.2",
@@ -6750,6 +6898,11 @@
       "integrity": "sha1-J8dlOb4U2L0Sghmi1zGwkzeQTnk=",
       "dev": true
     },
+    "js-base64": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.2.tgz",
+      "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ=="
+    },
     "js-message": {
       "version": "1.0.7",
       "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.7.tgz",
@@ -7660,6 +7813,11 @@
       "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
       "dev": true
     },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+    },
     "npm-run-path": {
       "version": "2.0.2",
       "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz",
@@ -9322,6 +9480,11 @@
       "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
       "dev": true
     },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
     "resolve": {
       "version": "1.20.0",
       "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz?cache=0&sync_timestamp=1613054822645&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.20.0.tgz",
@@ -9913,6 +10076,11 @@
         }
       }
     },
+    "sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
     "source-list-map": {
       "version": "2.0.1",
       "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz",
@@ -10512,6 +10680,11 @@
         "neo-async": "^2.6.0"
       }
     },
+    "throttle-debounce": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
@@ -11097,87 +11270,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.3.0",
-      "resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-16.3.0.tgz",
-      "integrity": "sha1-LxleS6D7DiY1ltaDDfF9Gjbok2w=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz",
-          "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.1.tgz?cache=0&sync_timestamp=1618995367379&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.1.tgz",
-          "integrity": "sha1-yAs/qyi/Y3HmhjMl7uZ+YYt35q0=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
-          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
-          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz",
-          "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz",
-          "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
-          "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-router": {
       "version": "3.5.2",
       "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.2.tgz",
@@ -11217,6 +11309,19 @@
       "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=",
       "dev": true
     },
+    "vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "requires": {
+        "sortablejs": "1.10.2"
+      }
+    },
+    "vuex": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
+    },
     "watchpack": {
       "version": "1.7.5",
       "resolved": "https://registry.nlark.com/watchpack/download/watchpack-1.7.5.tgz?cache=0&sync_timestamp=1621437868630&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.5.tgz",
@@ -12104,6 +12209,21 @@
           "dev": true
         }
       }
+    },
+    "zrender": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.3.0.tgz",
+      "integrity": "sha512-Ln2QB5uqI1ftNYMtCRxd+XDq6MOttLgam2tmhKAVA+j0ko47UT+VNlDvKTkqe4K2sJhBvB0EhYNLebqlCTjatQ==",
+      "requires": {
+        "tslib": "2.3.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+          "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+        }
+      }
     }
   }
 }

+ 1 - 0
new_backstage/package.json

@@ -10,6 +10,7 @@
   "dependencies": {
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
+    "echarts": "^5.3.0",
     "element-ui": "^2.15.3",
     "js-base64": "^3.6.1",
     "vue": "^2.6.11",

+ 1 - 0
new_backstage/src/components/accordion/index.vue

@@ -27,6 +27,7 @@
 <script>
 
 export default {
+  name:'con-left',
   props:['menu','title','default'],
   data() {
     return {

+ 19 - 0
new_backstage/src/configue/api.js

@@ -270,3 +270,22 @@ export function resetPass(data, cb) {
     cb(res);
   });
 }
+
+
+
+// 获取精品典藏左侧tab列表
+export const getTabList = () => {
+  return axios({
+    method: 'post',
+    url: 'cms/goodsModule/list',
+  })
+}
+
+//精品典藏左侧tab列表新增和修改
+export const addTabList = (data) => {
+  return axios({
+    method: 'post',
+    url: 'cms/goodsModule/save',
+    data
+  })
+}

+ 2 - 1
new_backstage/src/configue/http.js

@@ -8,7 +8,8 @@ const vue = new Vue();
 var isProduction = process.env.NODE_ENV === "production";
 let loading = "";
 
-const serverName = isProduction ? "/" : "http://192.168.0.245:8003/";
+// const serverName = isProduction ? "/" : "http://192.168.0.245:8003/";
+const serverName = isProduction ? "/" : "http://192.168.0.135:8003/";
 
 const serverLocation = window.location.hostname;
 

+ 40 - 13
new_backstage/src/configue/menu.js

@@ -4,7 +4,7 @@ let routes = [
     id: "1",
     key: "scene",
     noEdit: true,
-    type:'content'
+    type: 'content'
   },
   {
     name: "精品典藏管理",
@@ -30,7 +30,7 @@ let routes = [
         default: "0",
       }
     ],
-    type:'content'
+    type: 'content'
   },
   {
     name: "纪念祭扫管理",
@@ -56,7 +56,7 @@ let routes = [
         default: "0",
       }
     ],
-    type:'content'
+    type: 'content'
   },
   {
     name: "学习园地管理",
@@ -82,7 +82,7 @@ let routes = [
         default: "0",
       }
     ],
-    type:'content'
+    type: 'content'
   },
   {
     name: "互动模块管理",
@@ -108,8 +108,24 @@ let routes = [
         default: "0",
       }
     ],
-    type:'content'
+    type: 'content'
   },
+
+
+  // 新增加的网站数据统计功能
+  {
+    name: "网站数据统计",
+    id: "9",
+    key: "statistics",
+    type: 'info',
+    noEdit: true
+  },
+
+
+
+
+
+
   {
     name: "用户管理",
     id: "6",
@@ -130,7 +146,7 @@ let routes = [
         default: "none",
       }
     ],
-    type:'system'
+    type: 'system'
   },
   {
     name: "角色权限管理",
@@ -152,14 +168,14 @@ let routes = [
         default: "none",
       },
     ],
-    type:'system'
+    type: 'system'
   },
   {
     name: "操作日志",
     id: "8",
     key: "worklog",
-    type:'system',
-    noEdit:true
+    type: 'system',
+    noEdit: true
   },
 ];
 
@@ -168,19 +184,28 @@ let main = [
     name: "内容管理",
     id: "1",
     icon: "iconsys_nav_work",
-    key: "content"
+    key: "content",
+    routes: [],
+  },
+  {
+    name: "统计管理",
+    key: "info",
+    icon: "iconsys_nav_system",
+    routes: [],
+    id: "3"
   },
   {
     name: "系统管理",
     key: "system",
     icon: "iconsys_nav_system",
+    routes: [],
     id: "2"
   },
 ];
 
-let menu = main.map(item=>{
+let menu = main.map(item => {
   let route = []
-  routes.forEach((sub)=>{
+  routes.forEach((sub) => {
     if (item.key == sub.type) {
       route.push(sub)
     }
@@ -189,4 +214,6 @@ let menu = main.map(item=>{
   return item
 })
 
-export {routes,main,menu};
+
+
+export { routes, main, menu };

+ 137 - 0
new_backstage/src/pages/content/collection/componets/leftTab copy.vue

@@ -0,0 +1,137 @@
+<template>
+  <div class="leftTab">
+    <div class="title" @click="cutBoult = !cutBoult">
+      <i class="el-icon-menu"></i>
+      精品典藏
+      <div class="boult">
+        <i class="el-icon-arrow-down" v-if="cutBoult"></i>
+        <i class="el-icon-arrow-up" v-else></i>
+      </div>
+    </div>
+    <ul :class="{ hide: cutBoult }">
+      <li
+        v-for="(item, index) in menu"
+        :key="item.id"
+        :class="{ active: index === tabInd }"
+        @click="cutTab(item, index)"
+      >
+        {{ item.name }}
+      </li>
+    </ul>
+  </div>
+</template>
+
+<script>
+//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
+//例如:import 《组件名称》 from '《组件路径》';
+
+export default {
+  name: "leftTab",
+  props: ["menu"],
+  //import引入的组件需要注入到对象中才能使用
+  components: {},
+  data() {
+    //这里存放数据
+    return {
+      cutBoult: false,
+      tabInd: 0,
+    };
+  },
+  //监听属性 类似于data概念
+  computed: {},
+  //监控data中的数据变化
+  watch: {},
+  //方法集合
+  methods: {
+    cutTab(item, index) {
+      this.$emit("select", item);
+      this.tabInd = index;
+    },
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {},
+  beforeCreate() {}, //生命周期 - 创建之前
+  beforeMount() {}, //生命周期 - 挂载之前
+  beforeUpdate() {}, //生命周期 - 更新之前
+  updated() {}, //生命周期 - 更新之后
+  beforeDestroy() {}, //生命周期 - 销毁之前
+  destroyed() {}, //生命周期 - 销毁完成
+  activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
+};
+</script>
+<style lang='less' scoped>
+.leftTab {
+  border-right: solid 1px #e5e5e5;
+  position: relative;
+  margin-right: 20px;
+  padding-top: 40px;
+  & > ul {
+    width: 200px;
+    min-height: 400px;
+    list-style: none;
+    position: relative;
+    margin: 0;
+    padding-left: 0;
+    background-color: #fff;
+    & > li {
+      transition: all 0.3s;
+      cursor: pointer;
+      font-size: 14px;
+      list-style: none;
+      margin: 0;
+      height: 50px;
+      line-height: 50px;
+      padding: 0 45px;
+      min-width: 200px;
+      &:hover {
+        background-color: #f8ece9;
+      }
+    }
+    .active {
+      color: #b63c25;
+    }
+  }
+  .hide {
+    & > li {
+      height: 0px;
+      overflow: hidden;
+    }
+  }
+  .title {
+    position: relative;
+    font-weight: 400;
+    margin: 0;
+    font-size: 14px;
+    color: #303133;
+    padding: 0 20px;
+    cursor: pointer;
+    // transition: border-color 0.3s, background-color 0.3s, color 0.3s;
+    box-sizing: border-box;
+    height: 56px;
+    display: flex;
+    align-items: center;
+    position: relative;
+    white-space: nowrap;
+    list-style: none;
+    & > i {
+      vertical-align: middle;
+      margin-right: 5px;
+      width: 24px;
+      text-align: center;
+      font-size: 18px;
+      color: #909399;
+    }
+    &:hover {
+      background-color: #f8ece9;
+    }
+    .boult {
+      position: absolute;
+      top: 50%;
+      right: 18px;
+      transform: translateY(-50%);
+    }
+  }
+}
+</style>

+ 68 - 0
new_backstage/src/pages/content/collection/componets/leftTab.vue

@@ -0,0 +1,68 @@
+<template>
+  <div class="con-left">
+      <!-- @select="handleSelect($event)" -->
+    <el-menu
+      :default-active="`${type}`"
+      class="el-menu-vertical-demo"
+    >
+      <el-submenu index="1">
+        <template slot="title">
+          <i class="el-icon-menu"></i>
+          <span slot="title">{{title}}</span>
+        </template>
+        <el-menu-item
+          v-for="(item, i) in menu"
+          :key="i"
+          :index="item.id.toString()"
+          @click="handleSelect(item)"
+          >{{ item.name }}</el-menu-item
+        >
+      </el-submenu>
+    </el-menu>
+    <!-- <div class="sousuo" @click="isCollapse = !isCollapse">
+      <i :class="isCollapse ? 'el-icon-arrow-right' : 'el-icon-arrow-left'"></i>
+    </div> -->
+  </div>
+</template>
+
+<script>
+
+export default {
+  name:'con-left',
+  props:['menu','title','default'],
+  data() {
+    return {
+      type: this.default
+    };
+  },
+  methods:{
+    handleSelect(data){
+      // console.log(998,data);
+      this.$emit('select',data)
+    }
+  }
+};
+</script>
+
+<style lang="less" scoped>
+.con-left {
+  border-right: solid 1px #e5e5e5;
+  position: relative;
+  margin-right: 20px;
+  padding-top: 40px;
+  .sousuo {
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+    right: -30px;
+    cursor: pointer;
+  }
+}
+.el-menu-vertical-demo:not(.el-menu--collapse) {
+  width: 200px;
+  min-height: 400px;
+}
+.el-menu {
+  border-right: none !important;
+}
+</style>

+ 54 - 35
new_backstage/src/pages/content/collection/data.js

@@ -1,3 +1,5 @@
+// import { getTabList } from "../../../configue/api";
+
 let raw = {
   model: [
     {
@@ -37,7 +39,7 @@ let raw = {
       label: "是否显示"
     },
   ],
-  img:[
+  img: [
     {
       prop: "idx",
       label: "编号",
@@ -75,7 +77,7 @@ let raw = {
       label: "是否显示"
     },
   ],
-  video:[
+  video: [
     {
       prop: "idx",
       label: "编号",
@@ -115,55 +117,76 @@ let raw = {
   ]
 }
 
+
+let menuStr = {
+  'model': '模型',
+  'img': '图片',
+  'video': '视频',
+}
 let menu = [
-  {
-    id: 'model',
-    name: "实物模型",
-  },
-  {
-    id: 'img',
-    name: "专题图库",
-  },
-  {
-    id: 'video',
-    name: "视频档案",
-  },
+  // {
+  //   id: 'model',
+  //   name: "实物模型",
+  // },
+  // {
+  //   id: 'img',
+  //   name: "专题图库",
+  // },
+  // {
+  //   id: 'video',
+  //   name: "视频档案",
+  // },
+  // {
+  //   id: 'video2',
+  //   name: "视频档案2",
+  // },
 ];
 
+
+// 获取左侧tab栏信息
+// const  myFn= async()=>{
+//   let res= await getTabList()
+//   menu= res.data.map(v=>({id:v.type,name:v.name,ID:v.id}))
+//   console.log(998,menu);
+//  }
+//  myFn()
+
+ 
+
 let formKey = {
-  model:{ 
-    name:'',
-    thumb:'',
-    filePath:'',
+  model: {
+    name: '',
+    thumb: '',
+    filePath: '',
     display: false
   },
-  img:{ 
-    name:'',
-    thumb:'',
-    filePath:'',
+  img: {
+    name: '',
+    thumb: '',
+    filePath: '',
     display: false,
-    indexId:''
+    indexId: ''
   },
-  video:{ 
-    name:'',
-    thumb:'',
-    filePath:'',
+  video: {
+    name: '',
+    thumb: '',
+    filePath: '',
     display: false
   }
 }
 
 let rules = {
-  model:{
+  model: {
     name: [{ required: true, message: "请输入标题", trigger: "blur" }],
     thumb: [{ required: true, message: "请上传封面图片", trigger: "change" }],
     filePath: [{ required: true, message: "请上传模型文件", trigger: "change" }]
   },
-  img:{ 
+  img: {
     name: [{ required: true, message: "请输入标题", trigger: "blur" }],
     thumb: [{ required: true, message: "请上传图片", trigger: "change" }],
     filePath: [{ required: true, message: "请上传封面图片", trigger: "blur" }]
   },
-  video:{ 
+  video: {
     name: [{ required: true, message: "请输入标题", trigger: "blur" }],
     thumb: [{ required: true, message: "请上传封面图片", trigger: "blur" }],
     filePath: [{ required: true, message: "请上传封面图片", trigger: "blur" }]
@@ -171,11 +194,7 @@ let rules = {
 }
 
 
-let menuStr = {
-  'model':'模型',
-  'img':'图片',
-  'video':'视频',
-}
+
 
 
 export {

+ 193 - 37
new_backstage/src/pages/content/collection/index.vue

@@ -1,19 +1,35 @@
 <template>
-  <div>
+  <div class="myTab2">
     <main-top>
       <div slot="con" v-if="activeSub['新增']">
-        <el-button @click="goto({ id: 'none',status: 0 })" type="primary"
+        <el-button @click="goto({ id: 'none', status: 0 })" type="primary"
           >新增</el-button
         >
       </div>
     </main-top>
     <div class="tablecon flexcon">
-      <accordion
+      <!-- 新增tab栏的按钮 -->
+      <div class="addTab">
+        <el-button type="primary" style="width: 100%" @click="addTab"
+          >新增模块</el-button
+        >
+      </div>
+      <div></div>
+      <!-- 左侧的tab栏 -->
+      <!-- <accordion
         @select="handleMenu"
         :menu="menu"
         :default="subMenu"
         title="精品典藏"
+      /> -->
+
+      <LeftTab
+        @select="handleMenu"
+        :menu="menu"
+        :default="goodsModuleId"
+        title="精品典藏"
       />
+
       <div class="tablebody">
         <status :status="status" @select="selectStatus"></status>
         <search>
@@ -38,7 +54,10 @@
               placeholder="请输入关键字"
             ></el-input>
             <el-button @click="getList" type="primary">查询</el-button>
-            <el-button @click="search.date='',search.inputKey='',getList()" >重置</el-button>
+            <el-button
+              @click="(search.date = ''), (search.inputKey = ''), getList()"
+              >重置</el-button
+            >
           </div>
         </search>
         <div class="table">
@@ -61,57 +80,166 @@
             @submit="submit"
             :tableData="list"
           >
-          
-            <template slot-scope="{data}" slot="record">
-              <el-button @click="applyDetail(data,type)" type="text">审核详情</el-button>
+            <template slot-scope="{ data }" slot="record">
+              <el-button @click="applyDetail(data, type)" type="text"
+                >审核详情</el-button
+              >
             </template>
           </vtable>
         </div>
       </div>
     </div>
 
-    <vdialog :show="showApplyDetail" @close="showApplyDetail=false" :tableData="alDetail"></vdialog>
+    <vdialog
+      :show="showApplyDetail"
+      @close="showApplyDetail = false"
+      :tableData="alDetail"
+    ></vdialog>
+    <!-- 点击新增模块出现的弹窗 -->
+    <el-dialog title="新增模块" :visible="isShow" @close="addTabX">
+      <el-form
+        :model="ruleForm"
+        ref="ruleForm"
+        label-width="100px"
+        class="demo-ruleForm"
+      >
+        <el-form-item label="模块名称:">
+          <el-input
+            v-model="ruleForm.name"
+            maxlength="10"
+            show-word-limit
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="展示类型:">
+          <el-radio v-model="ruleForm.type" label="model">模型</el-radio>
+          <el-radio v-model="ruleForm.type" label="img">图片</el-radio>
+          <el-radio v-model="ruleForm.type" label="video">视频</el-radio>
+        </el-form-item>
+        <el-form-item label="投票功能:">
+          <el-switch
+            v-model="ruleForm.isVote"
+            :active-value="1"
+            :inactive-value="0"
+          >
+          </el-switch>
+        </el-form-item>
+        <el-form-item label="投票数量:" v-if="ruleForm.isVote === 1">
+          <el-input
+            @input="changeInput"
+            style="width: 300px"
+            v-model.number="ruleForm.voteCount"
+          ></el-input>
+          &ensp;票/用户
+        </el-form-item>
+        <el-form-item label="点赞功能:">
+          <el-switch
+            v-model="ruleForm.isLike"
+            :active-value="1"
+            :inactive-value="0"
+          >
+          </el-switch>
+        </el-form-item>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="addTabX">取 消</el-button>
+        <el-button type="primary" @click="addTabOK">确 定</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-
-import { raw, menu,menuStr } from "./data";
+import { raw, menuStr } from "./data";
 import { getList } from "@/configue/api";
 
 import { mapGetters } from "vuex";
-
+import { addTabList, getTabList } from "../../../configue/api";
+// 导入后面自己写的tab栏组件
+import LeftTab from "./componets/leftTab.vue";
 export default {
+  name: "tab",
+  components: { LeftTab },
   data() {
     return {
-      type:'goods',
-      showApplyDetail:false,
-      alDetail:{},
+      type: "goods",
+      showApplyDetail: false,
+      alDetail: {},
       search: {
         inputKey: "",
         date: "",
         state: "",
       },
       status: "all",
-      menu,
+      menu: [],
       list: {},
       page: {
         size: 25,
         pageNum: 1,
-      }
+      },
+      goodsModuleId: 1,
+      // 点击新增模块
+      isShow: false,
+      ruleForm: {
+        isLike: 0, //点赞功能,0:关, 1:开
+        isVote: 0, //投票功能,0:关, 1:开
+        name: "",
+        type: "model", //类型, model:模型, img:图片, video:视频
+        voteCount: 1, //投票数量,默认为1
+      },
     };
   },
- 
+
   methods: {
+    //------------------点击新增模块
+    addTab() {
+      this.isShow = true;
+    },
+    //投票数量只能输入正整数
+    changeInput() {
+      let pattern = /^[1-9][0-9]*$/; //正整数的正则表达式
+      //不符合正整数时
+      if (!pattern.test(this.ruleForm.voteCount)) {
+        //input框绑定的内容非数字的全部置为空
+        this.ruleForm.voteCount = this.ruleForm.voteCount.replace(/[^\d]/g, "");
+      }
+    },
+    async addTabOK() {
+      if (this.ruleForm.name.trim() === "")
+        return this.$message.warning("模块名称不能为空");
+      if (this.ruleForm.isVote === 1 && this.ruleForm.voteCount < 1)
+        return this.$message.warning("投票数量不能小于1");
+      else {
+        let res = await addTabList(this.ruleForm);
+        if (res.code === 0) {
+          this.getTabList();
+          this.isShow = false;
+        } else this.$message.warning(res.msg);
+      }
+    },
+    addTabX() {
+      this.ruleForm = {
+        isLike: 0, //点赞功能,0:关, 1:开
+        isVote: 0, //投票功能,0:关, 1:开
+        name: "",
+        type: "model", //类型, model:模型, img:图片, video:视频
+        voteCount: 1, //投票数量,默认为1
+      };
+      this.isShow = false;
+    },
+    //----------------------- 新增模块结束
     selectStatus(item) {
       this.status = item.id;
     },
     handleMenu(data) {
+      // 把索引存起来
+      localStorage.setItem('XJ_goodsModuleId',data.id)
+      this.goodsModuleId = data.id;
       this.$router.push({
-        params: { ...this.$route.params, type: data },
+        params: { ...this.$route.params, type: data.type, id: data.id },
       });
     },
-   
+
     getList() {
       let { inputKey, date } = this.search;
       getList(
@@ -122,45 +250,73 @@ export default {
           pageSize: this.page.size,
           searchKey: inputKey,
           status: this.status == "all" ? "" : this.status,
-          type: this.subMenu
+          type: this.subMenu,
+          goodsModuleId: this.goodsModuleId,
         },
         (data) => {
           this.list = data.data;
         }
       );
     },
+    //封装获取tab列表的方法
+    async getTabList() {
+      let res = await getTabList();
+      this.menu = res.data;
+    },
   },
   computed: {
     ...mapGetters({
       activeMenu: "activeMenu",
-      activeSub:"activeSub"
+      activeSub: "activeSub",
     }),
     data() {
       return raw[this.$route.params.type];
     },
     subMenu() {
-      return this.$route.params.type
-    }
+      return this.$route.params.type;
+    },
   },
   watch: {
-    subMenu:{
-      deep:true,
-      immediate:true,
-      handler:function (newVal) {
-        this.getAuth(this.activeMenu,menuStr[newVal])
+    goodsModuleId: {
+      deep: true,
+      immediate: true,
+      handler: function () {
+        this.getAuth(this.activeMenu, menuStr[this.subMenu]);
         this.getList();
-      }
+      },
+    },
+    activeMenu: {
+      deep: true,
+      immediate: true,
+      handler: function (newVal) {
+        this.getAuth(newVal, menuStr[this.subMenu]);
+      },
     },
-    activeMenu:{
-      deep:true,
-      immediate:true,
-      handler:function (newVal) {
-        this.getAuth(newVal,menuStr[this.subMenu])
-      }
-    }
   },
   mounted() {
-    this.getList();
+    // this.getList();
+  },
+  created() {
+    // 调用获取tab列表方法
+    this.getTabList();
+    let myId = localStorage.getItem('XJ_goodsModuleId')
+    if(myId) this.goodsModuleId=Number(myId)
+    else this.goodsModuleId=1
   },
 };
 </script>
+
+<style lang="less" scoped>
+.myTab2 {
+  .tablecon {
+    position: relative;
+    .addTab {
+      width: 201px;
+      z-index: 10;
+      position: absolute;
+      left: 0px;
+      top: 0px;
+    }
+  }
+}
+</style>

+ 306 - 0
new_backstage/src/pages/info/statistics/index.vue

@@ -0,0 +1,306 @@
+<template>
+  <div class="statistics">
+    <main-top>
+      <div slot="con"></div>
+    </main-top>
+    <div class="tablecon noSubmune">
+      <!-- 头部 -->
+      <div class="topInfo">
+        <h3><span></span> 网站统计</h3>
+        <div class="topInfo_list">
+          <div
+            class="topInfo_list_box"
+            v-for="item in topList"
+            :key="item.id"
+            :title="item.num"
+          >
+            <div>{{ item.name }}</div>
+            <span>{{ item.num }}</span>
+          </div>
+        </div>
+      </div>
+      <!-- 底部图表 -->
+      <div class="conInfo">
+        <div class="conInfo_box" v-for="(item, index) in ecBox" :key="index">
+          <h3><span></span> {{ item.name }}</h3>
+          <div class="conInfo_box_ec">
+            <div class="ec_top">
+              <div>
+                <span>时间范围:</span>
+                <el-date-picker
+                  v-model="item.time"
+                  type="daterange"
+                  value-format="yyyy-MM-dd"
+                  range-separator="-"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                >
+                </el-date-picker>
+              </div>
+              <el-button type="primary" @click="search(item)"
+                >查询统计</el-button
+              >
+            </div>
+            <!-- 图表上面的文字 -->
+            <span class="ech_txt">{{ item.title }}</span>
+            <!-- 图表内容 -->
+            <div class="echarts" :class="item.className"></div>
+          </div>
+        </div>
+
+        <!-- 最后一个特别的图表 -->
+        <div class="conInfo_box">
+          <h3><span></span> 投票点赞统计</h3>
+          <div class="conInfo_box_ec">
+            <div class="ec_top">
+              <div>
+                <span>时间范围:</span>
+                <el-date-picker
+                  v-model="timeLast"
+                  type="daterange"
+                  value-format="yyyy-MM-dd"
+                  range-separator="-"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                >
+                </el-date-picker>
+              </div>
+              <el-button type="primary">查询统计</el-button>
+            </div>
+            <!-- 图表上面的文字 -->
+            <div class="ech_txtLast">
+              <div></div>
+              <span>投票数</span>
+              <div class="tow"></div>
+              <span>点赞数</span>
+            </div>
+            <!-- 图表内容 -->
+            <div class="echarts ech_four"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import * as echarts from "echarts";
+export default {
+  name: "statistics",
+  data() {
+    return {
+      topList: [
+        { name: "精品典藏", num: 3244444444444, id: 1 },
+        { name: "纪念祭扫", num: 18, id: 2 },
+        { name: "学习园地", num: 23, id: 3 },
+        { name: "留言数量", num: 443, id: 4 },
+        { name: "弹幕数量", num: 325, id: 5 },
+        { name: "答题次数", num: 111, id: 6 },
+      ],
+      timeLast: "",
+      // echarts数据
+      ecBox: [
+        {
+          name: "各模块浏览量统计",
+          time: "",
+          txt: ["数字史馆", "精品典藏", "纪念忌扫", "学习园地", "我要留意"],
+          title: "浏览量(次)",
+          className: "ech_one",
+        },
+        {
+          name: "注册用户统计",
+          time: "",
+          txt: ["超级管理员", "游客", "审核管理员", "内容管理员"],
+          title: "数量",
+          className: "ech_tow",
+        },
+        {
+          name: "互动统计",
+          time: "",
+          txt: ["留言", "弹幕", "答题"],
+          title: "数量",
+          className: "ech_three",
+        },
+      ],
+    };
+  },
+  components: {},
+  methods: {
+    // 点击查询
+    search(item) {
+      this.echartsFu("." + item.className, [999, 888, 777, 666, 111], item.txt);
+    },
+    // 封装前3个echarts方法
+    echartsFu(dom, data, txtDa) {
+      const chartDom = document.querySelector(dom);
+      const myChart = echarts.init(chartDom);
+      const option = {
+        color: ["#5c7bd9"],
+        xAxis: {
+          type: "category",
+          data: txtDa,
+        },
+        yAxis: {
+          type: "value",
+        },
+        series: [
+          {
+            data,
+            type: "bar",
+            barWidth: 50,
+          },
+        ],
+      };
+
+      option && myChart.setOption(option);
+    },
+    // 封装最后一个echarts方法
+    echartsLastFu() {
+      const chartDom = document.querySelector(".ech_four");
+      const myChart = echarts.init(chartDom);
+      const option = {
+        color: ["#5c7bd9", "#c0504d"],
+        xAxis: {
+          type: "category",
+          data: ["实物模型", "专题图库", "视频档案", "自定义1", "自定义2"],
+        },
+        yAxis: {
+          type: "value",
+        },
+        series: [
+          {
+            name: "投票数",
+            data: [7, 8, 9, 1, 8],
+            type: "bar",
+          },
+          {
+            name: "点赞数",
+            data: [2, 2, 4, 7, 6],
+            type: "bar",
+          },
+        ],
+      };
+
+      option && myChart.setOption(option);
+    },
+  },
+  computed: {},
+  watch: {},
+  mounted() {
+    // 调用前3个echarts方法
+    this.echartsFu(".ech_one", [120, 200, 150, 80, 70], this.ecBox[0].txt);
+    this.echartsFu(".ech_tow", [333, 444, 123, 888, 33], this.ecBox[1].txt);
+    this.echartsFu(".ech_three", [100, 200, 500, 600, 70], this.ecBox[2].txt);
+    // 调用最后一个echarts方法
+    this.echartsLastFu();
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.statistics {
+  h3 {
+    display: flex;
+    align-items: center;
+    height: 40px;
+    color: #b9412e;
+    & > span {
+      display: inline-block;
+      width: 6px;
+      background-color: #b9412e;
+      height: 60%;
+      margin-right: 15px;
+    }
+  }
+  .tablecon {
+    min-width: 1500px;
+    min-height: 700px;
+    overflow: auto;
+    padding-bottom: 100px;
+    .topInfo {
+      padding-top: 10px;
+      .topInfo_list {
+        margin-top: 15px;
+        margin-bottom: 40px;
+        display: flex;
+        justify-content: space-between;
+        .topInfo_list_box {
+          cursor: pointer;
+          padding: 0 12px;
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          border: 1px solid #ccc;
+          width: 200px;
+          height: 50px;
+          & > div {
+            color: #999999;
+          }
+          & > span {
+            max-width: 100px;
+            color: #b9412e;
+            font-size: 22px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+          }
+        }
+      }
+    }
+    .conInfo {
+      margin-top: 20px;
+      display: flex;
+      justify-content: space-between;
+      flex-wrap: wrap;
+      .conInfo_box {
+        height: 400px;
+        width: 47%;
+        margin-bottom: 20px;
+        .conInfo_box_ec {
+          position: relative;
+          border: 1px solid #ccc;
+          height: calc(100% - 50px);
+          .ec_top {
+            margin: 15px;
+            display: flex;
+            justify-content: space-between;
+          }
+        }
+        .echarts {
+          transform: translateY(-20px);
+          width: 80%;
+          margin: 0 auto;
+          height: 300px;
+        }
+        .ech_txt {
+          position: absolute;
+          top: 65px;
+          left: 50%;
+          transform: translateX(-50%);
+        }
+        .ech_txtLast {
+          display: flex;
+          justify-content: center;
+          align-items: center;
+          position: absolute;
+          bottom: 15px;
+          left: 50%;
+          transform: translateX(-50%);
+          & > div {
+            margin-right: 2px;
+            width: 8px;
+            height: 8px;
+            background-color: #5c7bd9;
+          }
+          .tow {
+            background-color: #c0504d;
+          }
+          & > span {
+            margin-right: 10px;
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 104 - 92
new_backstage/src/pages/layout/aside.vue

@@ -1,183 +1,195 @@
 <!--  -->
 <template>
-<div class="aside">
-  <div class="aside-list">
-    <div class="aside-item" v-for="(item,i) in menu" :key="i">
-      <div :class="{active:belong==item.id}"><i class="iconfont" :class="item.icon"></i>{{item.name}}</div>
-      <div @click="goto(sub)" v-for="(sub,idx) in item.routes" :key="idx" :class="{activeFont:activeIdx === sub.key}">{{sub.name}}</div>
+  <div class="aside">
+    <div class="aside-list">
+      <div class="aside-item" v-for="(item, i) in menu" :key="i">
+        <div :class="{ active: belong == item.id }">
+          <i class="iconfont" :class="item.icon"></i>{{ item.name }}
+        </div>
+        <div
+          @click="goto(sub)"
+          v-for="(sub, idx) in item.routes"
+          :key="idx"
+          :class="{ activeFont: activeIdx === sub.key }"
+        >
+          {{ sub.name }}
+        </div>
+      </div>
     </div>
   </div>
-</div>
 </template>
 
 <script>
-import {routes,main} from '@/configue/menu'
+import { routes, main } from "@/configue/menu";
 
 export default {
   components: {},
-  data () {
+  data() {
     return {
       routes,
       main,
-      menu:[],
-      tmpRoute:[]
-    }
+      menu: [],
+      tmpRoute: [],
+    };
   },
   computed: {
     activeIdx: {
       get: function () {
-        return this.$route.meta.index
+        return this.$route.meta.index;
       },
-      set: function () {
-      }
+      set: function () {},
     },
     belong: {
       get: function () {
-        return this.$route.meta.belong
+        return this.$route.meta.belong;
       },
-      set: function () {
-      }
-    }
+      set: function () {},
+    },
   },
   watch: {
-    'activeIdx':{
-      immediate:true,
+    activeIdx: {
+      immediate: true,
       handler: function (newVal) {
-        if (this.tmpRoute.length>0) {
-          let temp = this.tmpRoute.filter(item=>{
-            return item.key == newVal
-          })
+        if (this.tmpRoute.length > 0) {
+          let temp = this.tmpRoute.filter((item) => {
+            return item.key == newVal;
+          });
           this.$store.commit("SetActiveMenu", temp[0]);
         }
-      }
-    }
+      },
+    },
   },
   methods: {
-    goto (item) {
-      let path = {path:`/${item.key}${item.param?`/${item.param.map(tt=>tt.default).join('/')}`:''}`}
-      this.$router.push(path)
+    goto(item) {
+      let path = {
+        path: `/${item.key}${
+          item.param ? `/${item.param.map((tt) => tt.default).join("/")}` : ""
+        }`,
+      };
+      this.$router.push(path);
     },
-    async getResource(){
+    async getResource() {
       let result = await this.$http({
-        method: 'GET',
-        url: '/sys/resource/getTreePermissions'
-      })
+        method: "GET",
+        url: "/sys/resource/getTreePermissions",
+      });
 
-      this.tmpRoute = routes.filter(item => {
-        let tmp = ''
-        result.data.forEach(sub=>{
+      this.tmpRoute = routes.filter((item) => {
+        let tmp = "";
+        result.data.forEach((sub) => {
           if (item.name == sub.name) {
             if (sub.authority) {
-              tmp = sub
+              tmp = sub;
             }
           }
-        })
+        });
 
-          if (item.type == "system") {
-            if (window.localStorage.getItem("role") == 'sys_admin') {
-                tmp = item
-            }
-            else{
-              tmp = ''
-            }
+        if (item.type == "system") {
+          if (window.localStorage.getItem("role") == "sys_admin") {
+            tmp = item;
+          } else {
+            tmp = "";
           }
-        return tmp ? Object.assign(item,tmp) : tmp
+        }
+        return tmp ? Object.assign(item, tmp) : tmp;
       });
 
-      console.log(this.tmpRoute);
+      //---------------------没有设置权限,临时push进去----------------------------------
+      this.tmpRoute.push({
+        id: "9",
+        key: "statistics",
+        name: "网站数据统计",
+        noEdit: true,
+        type: "info",
+      });
 
-      let temp = this.tmpRoute.filter(item=>{
-          return item.key == this.activeIdx
-        })
+      console.log(this.tmpRoute);
+      let temp = this.tmpRoute.filter((item) => {
+        return item.key == this.activeIdx;
+      });
       this.$store.commit("SetActiveMenu", temp[0]);
 
-      this.menu = main.filter(item=>{
-        let route = []
-        this.tmpRoute.forEach((sub)=>{
+      this.menu = main.filter((item) => {
+        let route = [];
+        this.tmpRoute.forEach((sub) => {
           if (item.key == sub.type) {
-            route.push(sub)
+            route.push(sub);
           }
-        })
-        item.routes = route
-        return route.length>0 && item
-      })
-    }
+        });
+        item.routes = route;
+        return route.length > 0 && item;
+      });
+    },
   },
-  created () {
-
+  created() {},
+  mounted() {
+    this.getResource();
   },
-  mounted () {
-    this.getResource()
-  }
-}
+};
 </script>
 
 <style scoped>
-.aside-list{
+.aside-list {
   width: 100%;
   padding-top: 1.5rem;
 }
 .aside-item {
-  padding: .625rem 0;
+  padding: 0.625rem 0;
   text-align: center;
 }
 
-
-.aside-item:last-child{
-  border-bottom:none;
+.aside-item:last-child {
+  border-bottom: none;
 }
 
-.aside-item div{
+.aside-item div {
   height: 2.875rem;
   line-height: 2.875rem;
-  margin: .0625rem 0;
+  margin: 0.0625rem 0;
   width: 89%;
   padding-left: 5.7rem;
-  font-size: .875rem;
+  font-size: 0.875rem;
   cursor: pointer;
   color: #707070;
   text-align: left;
 }
-.aside-item div:not(:first-child):hover{
-  color: #B63C25;
+.aside-item div:not(:first-child):hover {
+  color: #b63c25;
 }
 
-.aside-item div:first-child{
+.aside-item div:first-child {
   padding-left: 3.81rem;
   display: flex;
   align-items: center;
-  color: #532F1C;
+  color: #532f1c;
   font-size: 1.25rem;
   font-weight: bold;
   margin-bottom: 0.2rem;
 }
 
-.aside-item div:first-child img{
+.aside-item div:first-child img {
   width: 1.1rem;
   height: 1.1rem;
-  margin-right: .625rem;
+  margin-right: 0.625rem;
 }
 
-.aside-item .iconfont{
-  color: #532F1C;
-  margin-right: .8125rem;
+.aside-item .iconfont {
+  color: #532f1c;
+  margin-right: 0.8125rem;
 }
 
-.aside-item .active{
-  background-color: #B63C25;
+.aside-item .active {
+  background-color: #b63c25;
   border-top-right-radius: 80px;
   border-bottom-right-radius: 80px;
-  color: #F2ECDE!important;
+  color: #f2ecde !important;
 }
 
-.aside-item .active .iconfont{
-  color: #F2ECDE;
+.aside-item .active .iconfont {
+  color: #f2ecde;
 }
 
-
-.aside-item .activeFont{
-  color: #B63C25;
+.aside-item .activeFont {
+  color: #b63c25;
 }
-
-
 </style>

+ 2 - 0
new_backstage/src/router/index.js

@@ -62,6 +62,8 @@ menu.forEach(item => {
         component: () => import(`../pages/${item.key}/${sub.key}/edit.vue`)
     })
     }
+
+    
   })
 })
 

+ 41 - 12
web/package-lock.json

@@ -4221,11 +4221,11 @@
       }
     },
     "dom7": {
-      "version": "3.0.0-alpha.7",
-      "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0-alpha.7.tgz",
-      "integrity": "sha512-3epkQPsKsbk2Dixqqgm2DT/KzhiAPByjDK7emu6owwFLbM5UoiqWKgdsH+6PpMEgoeR6Ex/bW1UbOe0FWZU0zg==",
+      "version": "2.1.5",
+      "resolved": "https://registry.npmmirror.com/dom7/-/dom7-2.1.5.tgz",
+      "integrity": "sha512-xnhwVgyOh3eD++/XGtH+5qBwYTgCm0aW91GFgPJ3XG+jlsRLyJivnbP0QmUBFhI+Oaz9FV0s7cxgXHezwOEBYA==",
       "requires": {
-        "ssr-window": "^3.0.0-alpha.1"
+        "ssr-window": "^2.0.0"
       }
     },
     "domain-browser": {
@@ -6453,6 +6453,11 @@
         }
       }
     },
+    "js-base64": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.2.tgz",
+      "integrity": "sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ=="
+    },
     "js-message": {
       "version": "1.0.5",
       "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz",
@@ -9766,9 +9771,9 @@
       }
     },
     "ssr-window": {
-      "version": "3.0.0-alpha.4",
-      "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0-alpha.4.tgz",
-      "integrity": "sha512-+dBRP/pZ+VyITxTzD0lMDzDwN/BmfUl8xi2e6t5Nz4+FqUphfcBLB1OOUSYCRNFB25rD3c8AJRYpY5rHTbL+kg=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-2.0.0.tgz",
+      "integrity": "sha512-NXzN+/HPObKAx191H3zKlYomE5WrVIkoCB5IaSdvKokxTpjBdWfr0RaP+1Z5KOfDT0ZVz+2tdtiBkhsEQ9p+0A=="
     },
     "ssri": {
       "version": "6.0.1",
@@ -10005,12 +10010,12 @@
       }
     },
     "swiper": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/swiper/-/swiper-6.1.1.tgz",
-      "integrity": "sha512-w6rmEUnpuSWvzuIDJ+nTi7YQ4+pvr++zUnBO2VxkzOZbzQzcMNKNw1yj0RFEok682IHDPCs3LXSl8zSQ+zDEdw==",
+      "version": "5.4.5",
+      "resolved": "https://registry.npmmirror.com/swiper/-/swiper-5.4.5.tgz",
+      "integrity": "sha512-7QjA0XpdOmiMoClfaZ2lYN6ICHcMm72LXiY+NF4fQLFidigameaofvpjEEiTQuw3xm5eksG5hzkaRsjQX57vtA==",
       "requires": {
-        "dom7": "^3.0.0-alpha.7",
-        "ssr-window": "^3.0.0-alpha.4"
+        "dom7": "^2.1.5",
+        "ssr-window": "^2.0.0"
       }
     },
     "table": {
@@ -10155,6 +10160,11 @@
         "neo-async": "^2.6.0"
       }
     },
+    "throttle-debounce": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz",
+      "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz",
@@ -10624,6 +10634,15 @@
       "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=",
       "dev": true
     },
+    "v-viewer": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmmirror.com/v-viewer/-/v-viewer-1.6.4.tgz",
+      "integrity": "sha512-LVkiUHpmsbsZXebeNXnu8krRCi5i2n07FeLFxoIVGhw8lVvTBO0ffpbDC6mLEuacCjrIh09HjIqpciwUtWE8lQ==",
+      "requires": {
+        "throttle-debounce": "^2.0.1",
+        "viewerjs": "^1.5.0"
+      }
+    },
     "v8-compile-cache": {
       "version": "2.1.1",
       "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.1.1.tgz",
@@ -10663,6 +10682,11 @@
         "extsprintf": "^1.2.0"
       }
     },
+    "viewerjs": {
+      "version": "1.10.3",
+      "resolved": "https://registry.npmmirror.com/viewerjs/-/viewerjs-1.10.3.tgz",
+      "integrity": "sha512-X6dSO8aa6+Majmhx2GQcDSOzLClmj9zjsa89lGyG3cKGM2ca8rpGwL+iSRaAtRZalL5+VQ9osg+zfYVcAUyH8g=="
+    },
     "vm-browserify": {
       "version": "1.1.2",
       "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz?cache=0&sync_timestamp=1572870717730&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvm-browserify%2Fdownload%2Fvm-browserify-1.1.2.tgz",
@@ -10679,6 +10703,11 @@
       "resolved": "https://registry.npmjs.org/vue-awesome-swiper/-/vue-awesome-swiper-4.1.1.tgz",
       "integrity": "sha512-50um10t6N+lJaORkpwSi1wWuMmBI1sgFc9Znsi5oUykw2cO5DzLaBHcO2JNX21R+Ue4TGoIJDhhxjBHtkFrTEQ=="
     },
+    "vue-chat-scroll": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/vue-chat-scroll/-/vue-chat-scroll-1.4.0.tgz",
+      "integrity": "sha512-taHcwJJadZwJR4C4t/fv+R9ZXXSrwrpQKP17La/ep5q7IyH5i3BvscgSpXwu7s8TPP9T9n5n3JDnO+vRsZ/mBQ=="
+    },
     "vue-eslint-parser": {
       "version": "7.1.0",
       "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-7.1.0.tgz?cache=0&sync_timestamp=1589566521118&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.1.0.tgz",