1
0

2 Ревизии a215a35329 ... d3765aa7c4

Автор SHA1 Съобщение Дата
  xzh d3765aa7c4 feat:增加各种新功能等 преди 4 години
  xzh b7015cdbe4 feat:改了点bug преди 4 години
променени са 41 файла, в които са добавени 1633 реда и са изтрити 257 реда
  1. 1 1
      config/index.js
  2. BIN
      dist.rar
  3. 418 57
      package-lock.json
  4. 5 2
      package.json
  5. 227 0
      shurufa/css/index.css
  6. BIN
      shurufa/images/bg.png
  7. BIN
      shurufa/images/bodang.png
  8. BIN
      shurufa/images/close.png
  9. BIN
      shurufa/images/cls.png
  10. BIN
      shurufa/images/no-result.png
  11. BIN
      shurufa/images/reload.png
  12. BIN
      shurufa/images/二维码按钮.png
  13. BIN
      shurufa/images/搜索按钮.png
  14. BIN
      shurufa/images/暂停按钮.png
  15. BIN
      shurufa/images/点赞按钮(已触发).png
  16. BIN
      shurufa/images/点赞按钮(未触发).png
  17. 57 0
      shurufa/index.html
  18. 295 0
      shurufa/js/handwritingapi.js
  19. 150 0
      shurufa/js/index.js
  20. 4 0
      shurufa/js/jquery.min.js
  21. BIN
      src/assets/img/down-arrow.png
  22. BIN
      src/assets/img/up-arrow.png
  23. 25 22
      src/configue/http.js
  24. 1 1
      src/main.js
  25. 8 7
      src/pages/cultural-relic/index.vue
  26. 4 2
      src/pages/device/index.vue
  27. 23 11
      src/pages/display/index.vue
  28. 69 26
      src/pages/editPages/cultural-relic/index.vue
  29. 2 1
      src/pages/editPages/cultural-relic/style.less
  30. 119 19
      src/pages/editPages/display/index.vue
  31. 4 3
      src/pages/editPages/message/index.vue
  32. 2 1
      src/pages/editPages/role/index.vue
  33. 9 7
      src/pages/information/index.vue
  34. 5 5
      src/pages/layout/aside.vue
  35. 8 6
      src/pages/layout/head.vue
  36. 4 3
      src/pages/login/index.vue
  37. 47 10
      src/pages/modify/index.vue
  38. 8 4
      src/pages/role/index.vue
  39. 78 41
      src/pages/user/index.vue
  40. 51 20
      src/pages/work-log/index.vue
  41. 9 8
      src/router/index.js

+ 1 - 1
config/index.js

@@ -12,7 +12,7 @@ module.exports = {
     proxyTable: {},
 
     // Various Dev Server settings
-    host: '192.168.0.172', // can be overwritten by process.env.HOST
+    host: '0.0.0.0', // can be overwritten by process.env.HOST
     port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
     autoOpenBrowser: false,
     errorOverlay: true,

BIN
dist.rar


+ 418 - 57
package-lock.json

@@ -436,8 +436,8 @@
     },
     "async-validator": {
       "version": "1.8.5",
-      "resolved": "http://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz",
-      "integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
       "requires": {
         "babel-runtime": "6.x"
       }
@@ -462,6 +462,38 @@
         "postcss-value-parser": "^3.2.3"
       }
     },
+    "axios": {
+      "version": "0.18.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz",
+      "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==",
+      "requires": {
+        "follow-redirects": "1.5.10",
+        "is-buffer": "^2.0.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "follow-redirects": {
+          "version": "1.5.10",
+          "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+          "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
+          "requires": {
+            "debug": "=3.1.0"
+          }
+        },
+        "is-buffer": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
+        }
+      }
+    },
     "babel-code-frame": {
       "version": "6.26.0",
       "resolved": "http://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz",
@@ -1388,6 +1420,11 @@
       "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=",
       "dev": true
     },
+    "basic-auth": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz",
+      "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ="
+    },
     "batch": {
       "version": "0.6.1",
       "resolved": "http://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz",
@@ -1408,8 +1445,7 @@
     "big.js": {
       "version": "3.2.0",
       "resolved": "http://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz",
-      "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=",
-      "dev": true
+      "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4="
     },
     "binary-extensions": {
       "version": "1.12.0",
@@ -2237,6 +2273,11 @@
       "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
       "dev": true
     },
+    "corser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
+      "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c="
+    },
     "cosmiconfig": {
       "version": "4.0.0",
       "resolved": "http://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-4.0.0.tgz",
@@ -2692,8 +2733,7 @@
     "deep-equal": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/deep-equal/download/deep-equal-1.0.1.tgz",
-      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
-      "dev": true
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
     },
     "deep-is": {
       "version": "0.1.3",
@@ -2703,8 +2743,8 @@
     },
     "deepmerge": {
       "version": "1.5.2",
-      "resolved": "http://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz",
-      "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
     },
     "define-properties": {
       "version": "1.1.3",
@@ -2924,6 +2964,14 @@
         }
       }
     },
+    "dom7": {
+      "version": "3.0.0-alpha.9",
+      "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0-alpha.9.tgz",
+      "integrity": "sha512-wTxPe1vJqLAy2PzAROh/n1PsRF/ZklAJyRIn9shm2dAQjP4JhjsgDKQ1YTbuzf1KVlqOlqYPmwupQExcB9jOUg==",
+      "requires": {
+        "ssr-window": "^3.0.0-alpha.1"
+      }
+    },
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz",
@@ -2973,6 +3021,32 @@
         "stream-shift": "^1.0.0"
       }
     },
+    "echarts": {
+      "version": "4.9.0",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-4.9.0.tgz",
+      "integrity": "sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==",
+      "requires": {
+        "zrender": "4.3.2"
+      }
+    },
+    "ecstatic": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.2.tgz",
+      "integrity": "sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==",
+      "requires": {
+        "he": "^1.1.1",
+        "mime": "^1.6.0",
+        "minimist": "^1.1.0",
+        "url-join": "^2.0.5"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+        }
+      }
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
@@ -2992,9 +3066,9 @@
       "dev": true
     },
     "element-ui": {
-      "version": "2.4.9",
-      "resolved": "http://registry.npm.taobao.org/element-ui/download/element-ui-2.4.9.tgz",
-      "integrity": "sha1-t8nJbaBvGCxqT+f1CLjI7xpRZzI=",
+      "version": "2.13.2",
+      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.13.2.tgz",
+      "integrity": "sha512-r761DRPssMPKDiJZWFlG+4e4vr0cRG/atKr3Eqr8Xi0tQMNbtmYU1QXvFnKiFPFFGkgJ6zS6ASkG+sellcoHlQ==",
       "requires": {
         "async-validator": "~1.8.1",
         "babel-helper-vue-jsx-merge-props": "^2.0.0",
@@ -3022,8 +3096,7 @@
     "emojis-list": {
       "version": "2.1.0",
       "resolved": "http://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz",
-      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
-      "dev": true
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
     },
     "encodeurl": {
       "version": "1.0.2",
@@ -3062,7 +3135,6 @@
       "version": "0.1.7",
       "resolved": "http://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz",
       "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=",
-      "dev": true,
       "requires": {
         "prr": "~1.0.1"
       }
@@ -3732,8 +3804,7 @@
     "extend": {
       "version": "3.0.2",
       "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
-      "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=",
-      "dev": true
+      "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
     },
     "extend-shallow": {
       "version": "3.0.2",
@@ -3856,6 +3927,11 @@
       "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
       "dev": true
     },
+    "fast-diff": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
+      "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
+    },
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
@@ -4056,7 +4132,6 @@
       "version": "1.5.9",
       "resolved": "http://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.9.tgz",
       "integrity": "sha1-ye2ddIuBSjlTVxblMbkZaoRdicY=",
-      "dev": true,
       "requires": {
         "debug": "=3.1.0"
       },
@@ -4065,7 +4140,6 @@
           "version": "3.1.0",
           "resolved": "http://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz",
           "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
-          "dev": true,
           "requires": {
             "ms": "2.0.0"
           }
@@ -4194,7 +4268,8 @@
         "ansi-regex": {
           "version": "2.1.1",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "aproba": {
           "version": "1.2.0",
@@ -4215,12 +4290,14 @@
         "balanced-match": {
           "version": "1.0.0",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
@@ -4235,17 +4312,20 @@
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "concat-map": {
           "version": "0.0.1",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "console-control-strings": {
           "version": "1.1.0",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "core-util-is": {
           "version": "1.0.2",
@@ -4362,7 +4442,8 @@
         "inherits": {
           "version": "2.0.3",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "ini": {
           "version": "1.3.5",
@@ -4374,6 +4455,7 @@
           "version": "1.0.0",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -4388,6 +4470,7 @@
           "version": "3.0.4",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
@@ -4395,12 +4478,14 @@
         "minimist": {
           "version": "0.0.8",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "minipass": {
           "version": "2.2.4",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.1",
             "yallist": "^3.0.0"
@@ -4419,6 +4504,7 @@
           "version": "0.5.1",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "minimist": "0.0.8"
           }
@@ -4499,7 +4585,8 @@
         "number-is-nan": {
           "version": "1.0.1",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "object-assign": {
           "version": "4.1.1",
@@ -4511,6 +4598,7 @@
           "version": "1.4.0",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "wrappy": "1"
           }
@@ -4596,7 +4684,8 @@
         "safe-buffer": {
           "version": "5.1.1",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "safer-buffer": {
           "version": "2.1.2",
@@ -4632,6 +4721,7 @@
           "version": "1.0.2",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -4651,6 +4741,7 @@
           "version": "3.0.1",
           "bundled": true,
           "dev": true,
+          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -4694,12 +4785,14 @@
         "wrappy": {
           "version": "1.0.2",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         },
         "yallist": {
           "version": "3.0.2",
           "bundled": true,
-          "dev": true
+          "dev": true,
+          "optional": true
         }
       }
     },
@@ -4833,8 +4926,7 @@
     "graceful-fs": {
       "version": "4.1.15",
       "resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz",
-      "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=",
-      "dev": true
+      "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA="
     },
     "growly": {
       "version": "1.3.0",
@@ -4949,8 +5041,7 @@
     "he": {
       "version": "1.2.0",
       "resolved": "http://registry.npm.taobao.org/he/download/he-1.2.0.tgz",
-      "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=",
-      "dev": true
+      "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8="
     },
     "hmac-drbg": {
       "version": "1.0.1",
@@ -5241,6 +5332,94 @@
         }
       }
     },
+    "http-server": {
+      "version": "0.12.3",
+      "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.12.3.tgz",
+      "integrity": "sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA==",
+      "requires": {
+        "basic-auth": "^1.0.3",
+        "colors": "^1.4.0",
+        "corser": "^2.0.1",
+        "ecstatic": "^3.3.2",
+        "http-proxy": "^1.18.0",
+        "minimist": "^1.2.5",
+        "opener": "^1.5.1",
+        "portfinder": "^1.0.25",
+        "secure-compare": "3.0.1",
+        "union": "~0.5.0"
+      },
+      "dependencies": {
+        "async": {
+          "version": "2.6.3",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+          "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+          "requires": {
+            "lodash": "^4.17.14"
+          }
+        },
+        "colors": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+          "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
+        },
+        "debug": {
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "eventemitter3": {
+          "version": "4.0.7",
+          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+          "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+        },
+        "http-proxy": {
+          "version": "1.18.1",
+          "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+          "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+          "requires": {
+            "eventemitter3": "^4.0.0",
+            "follow-redirects": "^1.0.0",
+            "requires-port": "^1.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.20",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+          "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "portfinder": {
+          "version": "1.0.28",
+          "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+          "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+          "requires": {
+            "async": "^2.6.2",
+            "debug": "^3.1.1",
+            "mkdirp": "^0.5.5"
+          }
+        }
+      }
+    },
     "https-browserify": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz",
@@ -5289,6 +5468,12 @@
       "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=",
       "dev": true
     },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "optional": true
+    },
     "import-cwd": {
       "version": "2.1.0",
       "resolved": "http://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz",
@@ -5738,6 +5923,11 @@
       "integrity": "sha1-dIkR+wT0imDEdxs3XKxFqA3xHAM=",
       "dev": true
     },
+    "js-cookie": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+    },
     "js-tokens": {
       "version": "3.0.2",
       "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz",
@@ -5793,8 +5983,7 @@
     "json5": {
       "version": "0.5.1",
       "resolved": "http://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz",
-      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
-      "dev": true
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
     },
     "killable": {
       "version": "1.0.1",
@@ -5836,6 +6025,61 @@
         "invert-kv": "^1.0.0"
       }
     },
+    "less": {
+      "version": "3.12.2",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz",
+      "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==",
+      "requires": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "native-request": "^1.0.5",
+        "source-map": "~0.6.0",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+          "optional": true,
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "optional": true
+        }
+      }
+    },
+    "less-loader": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz",
+      "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==",
+      "requires": {
+        "clone": "^2.1.1",
+        "loader-utils": "^1.1.0",
+        "pify": "^4.0.1"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
+        }
+      }
+    },
     "levn": {
       "version": "0.3.0",
       "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz",
@@ -5927,7 +6171,6 @@
       "version": "1.1.0",
       "resolved": "http://registry.npm.taobao.org/loader-utils/download/loader-utils-1.1.0.tgz",
       "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
-      "dev": true,
       "requires": {
         "big.js": "^3.1.3",
         "emojis-list": "^2.0.0",
@@ -6267,8 +6510,7 @@
     "mime": {
       "version": "1.6.0",
       "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz",
-      "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=",
-      "dev": true
+      "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE="
     },
     "mime-db": {
       "version": "1.37.0",
@@ -6383,8 +6625,7 @@
     "ms": {
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
     },
     "multicast-dns": {
       "version": "6.2.3",
@@ -6442,6 +6683,12 @@
         }
       }
     },
+    "native-request": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz",
+      "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==",
+      "optional": true
+    },
     "natural-compare": {
       "version": "1.4.0",
       "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz",
@@ -6716,8 +6963,7 @@
     "opener": {
       "version": "1.5.1",
       "resolved": "http://registry.npm.taobao.org/opener/download/opener-1.5.1.tgz",
-      "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=",
-      "dev": true
+      "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0="
     },
     "opn": {
       "version": "5.4.0",
@@ -6864,6 +7110,11 @@
         "no-case": "^2.2.0"
       }
     },
+    "parchment": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
+      "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
+    },
     "parse-asn1": {
       "version": "5.1.1",
       "resolved": "http://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.1.tgz",
@@ -9195,8 +9446,7 @@
     "prr": {
       "version": "1.0.1",
       "resolved": "http://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz",
-      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
-      "dev": true
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
     },
     "pseudomap": {
       "version": "1.0.2",
@@ -9254,8 +9504,7 @@
     "qs": {
       "version": "6.5.2",
       "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz",
-      "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=",
-      "dev": true
+      "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY="
     },
     "query-string": {
       "version": "4.3.4",
@@ -9285,6 +9534,41 @@
       "integrity": "sha1-fe2N+/eHncxg0KZErGdUsoOtF+8=",
       "dev": true
     },
+    "quill": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
+      "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+      "requires": {
+        "clone": "^2.1.1",
+        "deep-equal": "^1.0.1",
+        "eventemitter3": "^2.0.3",
+        "extend": "^3.0.2",
+        "parchment": "^1.1.4",
+        "quill-delta": "^3.6.2"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
+        },
+        "eventemitter3": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+          "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo="
+        }
+      }
+    },
+    "quill-delta": {
+      "version": "3.6.3",
+      "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
+      "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+      "requires": {
+        "deep-equal": "^1.0.1",
+        "extend": "^3.0.2",
+        "fast-diff": "1.1.2"
+      }
+    },
     "randomatic": {
       "version": "3.1.1",
       "resolved": "http://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz",
@@ -9652,13 +9936,12 @@
     "requires-port": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz",
-      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
-      "dev": true
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
     },
     "resize-observer-polyfill": {
-      "version": "1.5.0",
-      "resolved": "http://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.0.tgz",
-      "integrity": "sha1-Zg/x2XEqI4K6osrUUKRxYgn5ymk="
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
     },
     "resolve": {
       "version": "1.8.1",
@@ -9811,6 +10094,11 @@
         "ajv": "^5.0.0"
       }
     },
+    "secure-compare": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
+      "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM="
+    },
     "select-hose": {
       "version": "2.0.0",
       "resolved": "http://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz",
@@ -9829,8 +10117,7 @@
     "semver": {
       "version": "5.6.0",
       "resolved": "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz",
-      "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ=",
-      "dev": true
+      "integrity": "sha1-fnQlb7qknHWqfHogXMInmcrIAAQ="
     },
     "send": {
       "version": "0.16.2",
@@ -10150,6 +10437,11 @@
         "is-plain-obj": "^1.0.0"
       }
     },
+    "sortablejs": {
+      "version": "1.11.2-alpha.3",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.11.2-alpha.3.tgz",
+      "integrity": "sha512-sX/cttekU7IQDvUGNsRIKDB1MXhd0OfR2OOsluusrZHIPwAKS8OSeGlNXONjcd3vsc3o6t8VakT0KpwnKMm6PQ=="
+    },
     "source-list-map": {
       "version": "2.0.1",
       "resolved": "http://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz",
@@ -10159,8 +10451,7 @@
     "source-map": {
       "version": "0.6.1",
       "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz",
-      "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
-      "dev": true
+      "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
     },
     "source-map-resolve": {
       "version": "0.5.2",
@@ -10274,6 +10565,11 @@
       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
     },
+    "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=="
+    },
     "ssri": {
       "version": "5.3.0",
       "resolved": "http://registry.npm.taobao.org/ssri/download/ssri-5.3.0.tgz",
@@ -10457,6 +10753,15 @@
         "whet.extend": "~0.9.9"
       }
     },
+    "swiper": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/swiper/-/swiper-6.2.0.tgz",
+      "integrity": "sha512-lOQeWRAHXwWPDu6k5cJYkf/eVRq2IUiHpMSGS143PVBg91J+2ZCXwM+Uv2sUckrZn3AMGcpcpnEBqD8Rwz9XGQ==",
+      "requires": {
+        "dom7": "^3.0.0-alpha.7",
+        "ssr-window": "^3.0.0-alpha.4"
+      }
+    },
     "table": {
       "version": "4.0.2",
       "resolved": "http://registry.npm.taobao.org/table/download/table-4.0.2.tgz",
@@ -10485,8 +10790,8 @@
     },
     "throttle-debounce": {
       "version": "1.1.0",
-      "resolved": "http://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz",
-      "integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0="
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
     },
     "through": {
       "version": "2.3.8",
@@ -10601,6 +10906,11 @@
       "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=",
       "dev": true
     },
+    "tslib": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+      "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
+    },
     "tty-browserify": {
       "version": "0.0.0",
       "resolved": "http://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz",
@@ -10723,6 +11033,14 @@
         }
       }
     },
+    "union": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
+      "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
+      "requires": {
+        "qs": "^6.4.0"
+      }
+    },
     "union-value": {
       "version": "1.0.0",
       "resolved": "http://registry.npm.taobao.org/union-value/download/union-value-1.0.0.tgz",
@@ -10879,6 +11197,11 @@
         }
       }
     },
+    "url-join": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz",
+      "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg="
+    },
     "url-loader": {
       "version": "0.5.9",
       "resolved": "http://registry.npm.taobao.org/url-loader/download/url-loader-0.5.9.tgz",
@@ -10982,6 +11305,16 @@
       "resolved": "http://registry.npm.taobao.org/vue/download/vue-2.5.17.tgz",
       "integrity": "sha1-D4eJrXGL5oyhhyYpgy7VM1icato="
     },
+    "vue-awesome-swiper": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/vue-awesome-swiper/-/vue-awesome-swiper-4.1.1.tgz",
+      "integrity": "sha512-50um10t6N+lJaORkpwSi1wWuMmBI1sgFc9Znsi5oUykw2cO5DzLaBHcO2JNX21R+Ue4TGoIJDhhxjBHtkFrTEQ=="
+    },
+    "vue-cropper": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.5.5.tgz",
+      "integrity": "sha512-5mGaBlS1EwLxUFwHHX2Q8zOZSiVfBUjOfolR+ZNKwu7Rh3u+GhwHYOyFkgZHhhoQBBNdyVB28O6W+MpMimhCbA=="
+    },
     "vue-eslint-parser": {
       "version": "2.0.3",
       "resolved": "http://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-2.0.3.tgz",
@@ -11112,6 +11445,29 @@
       "integrity": "sha1-3EJpcTMwLOMBdSQ1amxht7abShg=",
       "dev": true
     },
+    "vue2-editor": {
+      "version": "2.10.2",
+      "resolved": "https://registry.npmjs.org/vue2-editor/-/vue2-editor-2.10.2.tgz",
+      "integrity": "sha512-sjHTPdRoiB9VK9HLSOjFgubxBWHxRydvykqBCNaX7Sv+2KpdWu6AoyguvP5tyEp4ECX7z6PnbBluyD5M57QOng==",
+      "requires": {
+        "quill": "^1.3.6"
+      }
+    },
+    "vuedraggable": {
+      "version": "2.24.1",
+      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.1.tgz",
+      "integrity": "sha512-G1fxO1oshx+WLdieSGl6jSJdlHOQFga1FpjuUpgXldbpKNzxpjsGn4xYNnRHVrOAqm8aG5FfpdQlh5LHesxCeA==",
+      "requires": {
+        "sortablejs": "^1.10.1"
+      },
+      "dependencies": {
+        "sortablejs": {
+          "version": "1.10.2",
+          "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
+          "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+        }
+      }
+    },
     "watchpack": {
       "version": "1.6.0",
       "resolved": "http://registry.npm.taobao.org/watchpack/download/watchpack-1.6.0.tgz",
@@ -11748,6 +12104,11 @@
           "dev": true
         }
       }
+    },
+    "zrender": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-4.3.2.tgz",
+      "integrity": "sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g=="
     }
   }
 }

+ 5 - 2
package.json

@@ -8,16 +8,19 @@
     "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
     "start": "npm run dev",
     "lint": "eslint --ext .js,.vue src",
-    "build": "node build/build.js"
+    "build": "node build/build.js",
+    "preview": "http-server -p 3000 ./dist"
   },
   "dependencies": {
     "axios": "^0.18.0",
     "echarts": "^4.2.1",
-    "element-ui": "^2.4.9",
+    "element-ui": "^2.13.2",
+    "http-server": "^0.12.3",
     "js-cookie": "^2.2.0",
     "less": "^3.9.0",
     "less-loader": "^5.0.0",
     "qs": "^6.5.2",
+    "sortablejs": "^1.11.2-alpha.3",
     "swiper": "^6.2.0",
     "vue": "^2.5.2",
     "vue-awesome-swiper": "^4.1.1",

+ 227 - 0
shurufa/css/index.css

@@ -0,0 +1,227 @@
+*{
+  padding: 0;
+  margin: 0;
+     font-family:"Microsoft YaHei",微软雅黑,"MicrosoftJhengHei",华文细黑,STHeiti,MingLiu;
+     line-height: 1;
+}
+
+::-webkit-scrollbar {
+  width: 0.6rem;
+  height: 1rem;
+  background-color: #71471d;
+
+}
+
+::-webkit-scrollbar-thumb {
+  height: 5rem;
+  background-color: #EA9649;
+  outline: 0.5rem solid #EA9649;
+  outline-offset: -0.5rem;
+}
+
+::-webkit-scrollbar-thumb:hover {
+  height: 5rem;
+  background-color: #EA9649;
+}
+
+li{
+  list-style: none;
+}
+html,body{
+  width: 100%;
+  height: 100%;
+  font-size: 34px;
+}
+
+body{
+  position: relative;
+  color: #EA9649;
+  max-width: 100%;
+  margin: 0 auto;
+}
+
+button,input{
+    border: none;
+    outline: none;
+    background: none;
+    font-size: 1rem;		
+}
+
+
+
+.body{
+  width: 100%;
+  height: 100%;
+}
+
+.bg{
+  width: 100%;
+  top: 0;
+  position: absolute;
+  z-index: -1;
+}
+
+.content{
+  width: 90%;
+  margin: 0 auto;
+}
+
+.title{
+  text-align: center;
+  padding-top: 6%;
+}
+
+.input{
+  display: flex;
+  width: 100%;
+  font-size: 0;
+  position: relative;
+}
+
+.input input{
+  border: #EA9649 0.13rem solid;
+  border-right: none;
+  background: none;
+  color: #EA9649;
+  padding-left: 0.63rem;
+  padding-right: 2.63rem;
+  margin: 0;
+  flex: 30;
+}
+
+.input span{
+  display: inline-block;
+  height: 1rem;
+  padding: 0.63rem 1.25rem;
+  border-top: #EA9649 0.13rem solid;
+  border-bottom: #EA9649 0.13rem solid;
+  flex: 1;
+  text-align: center;
+}
+
+.input span img{
+  vertical-align: middle;
+  display: inline-block;
+  height: 100%;
+  opacity: 0;
+}
+
+.input .button{
+  flex: 3;
+  padding: 0.63rem 1.25rem;
+  background: #EA9649;
+  border-top: #EA9649 0.13rem solid;
+  border-bottom: #EA9649 0.13rem solid;
+  margin: 0;
+  font-size:1rem;
+  line-height: 1rem;
+  height: 1rem;
+  margin: 0 auto;
+  color: #000;
+  min-width: 15%;
+  text-align: center;
+}
+
+.result{
+  width: 100%;
+  margin: 0.63rem 0;
+  min-height: 1.88rem;
+}
+
+.result li{
+  list-style: none;
+  display: inline-block;
+  margin-right: 0.38rem;
+  padding: 0.13rem 0.25rem;
+  vertical-align: middle;
+}
+
+.result li:last-of-type{
+  margin-right: 0;
+}
+.result li img{
+  width: 1.25rem;
+  vertical-align: middle;
+}
+
+
+.result .active{
+  background: #EA9649;
+  color: #000;
+}
+
+#canvasWrap {
+  position:relative;
+  margin:0 auto;
+  width:100%;
+  height:40%;
+  min-height: 20rem;
+  border:0.13rem solid #EA9649;
+  font-size: 0;
+}
+
+#clear{
+  opacity: 0;
+}
+
+.cls{
+  text-align: center;
+  width: 100%;
+  position: fixed;
+  left: 50%;
+  transform: translateX(-50%);
+}
+
+.cls img{
+  width: 1.88rem;
+}
+
+.result-page{
+  display: none;
+}
+
+.reload{
+  margin-top: 0.5rem;
+  text-align: right;
+}
+
+#reload{
+  width: 1rem;
+}
+
+.result-page ul {
+  margin-left: 0.63rem;
+  margin-top: 0.5rem;
+  user-select: none;
+}
+
+.result-page ul li{
+  display: flex;
+  align-items: center;
+  margin-top: 0.63rem;
+  font-size: 1.2rem;
+}
+
+.result-page ul li img{
+  width: 7rem;
+  height: 7rem;
+  margin-right: 1.88rem;
+}
+.result-page ul li span{
+  width: 15.63rem;
+  line-height: 1.5;
+}
+
+.no-result{
+  text-align: center;
+  margin-top: 5rem;
+  display: none;
+}
+
+.no-result img{
+  width: 14.38rem;
+  height:auto;
+}
+.no-result p{
+  line-height: 1.5;
+}

BIN
shurufa/images/bg.png


BIN
shurufa/images/bodang.png


BIN
shurufa/images/close.png


BIN
shurufa/images/cls.png


BIN
shurufa/images/no-result.png


BIN
shurufa/images/reload.png


BIN
shurufa/images/二维码按钮.png


BIN
shurufa/images/搜索按钮.png


BIN
shurufa/images/暂停按钮.png


BIN
shurufa/images/点赞按钮(已触发).png


BIN
shurufa/images/点赞按钮(未触发).png


+ 57 - 0
shurufa/index.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no">
+  <link rel="stylesheet" href="./css/index.css">
+  <title>手写</title>
+</head>
+<body>
+  <div class="body">
+    <!-- <img id="bg" class="bg" src="./images/bg.png" alt=""> -->
+    <div class="content">
+      <!-- <div class="title">搜索页面</div> -->
+      <div class="input">
+        <input id="input" type="text">
+        <span>
+          <img id="clsipt" src="./images/close.png" alt="">
+        </span>
+        <div id="search" class="button">搜索</div>
+      </div>
+      
+      <!-- 搜索页面 -->
+      <div class="search-page">
+        <ul class="result">
+          <li>
+            <ul id="result"></ul>
+          </li>
+          <li><img id="clear" src="./images/close.png" alt=""></li>
+        </ul>
+        <div id="canvasWrap">
+          <canvas id="canvas"></canvas>
+        </div>
+      </div>
+
+      <div class="result-page">
+        <div class="reload">
+          <img id="reload" src="./images/reload.png" alt="">
+        </div>
+        <ul>
+        </ul>
+        <div class="no-result">
+          <img src="./images/no-result.png" alt="">
+          <p>暂时没有结果呢,<br/>请试一下其他关键字</p>
+        </div>
+      </div>
+
+      <!-- <div class="cls">
+        <img src="./images/cls.png" alt="">
+      </div> -->
+
+    </div>
+  </div>
+  <script src="./js/jquery.min.js"></script>
+  <script src="./js/handwritingapi.js"></script>
+  <script src="./js/index.js?t=20200919"></script>
+</body>
+</html>

+ 295 - 0
shurufa/js/handwritingapi.js

@@ -0,0 +1,295 @@
+QQShuru = {};
+QQShuru.Util = {};
+QQShuru.Util.Browser = {};
+QQShuru.Util.Browser.isIE = (navigator.appName == "Microsoft Internet Explorer");
+
+QQShuru.Util.Ajax = {};
+QQShuru.Util.Ajax.get = function(a, c) {
+    var b = document.createElement("script");
+    b.setAttribute("charset", "utf-8");
+    b.id = Math.random();
+    document.getElementsByTagName("head")[0].appendChild(b);
+    b.src = a + "&c=" + c;
+    if (QQShuru.Util.Browser.isIE) {
+        b.onreadystatechange = function() {
+            if (b.readyState == "loaded") {
+                document.getElementsByTagName("head")[0].removeChild(b)
+            }
+        }
+    } else {
+        b.onload = function() {
+            document.getElementsByTagName("head")[0].removeChild(b)
+        }
+    }
+};
+QQShuru.Util.Event = {};
+QQShuru.Util.Event.addEvent = function() {
+    if (QQShuru.Util.Browser.isIE) {
+        return function(b, c, a) {
+            b.attachEvent("on" + c, a)
+        }
+    } else {
+        return function(b, c, a, d) {
+            b.addEventListener(c, a, d || false)
+        }
+    }
+} ();
+QQShuru.Util.Event.remEvent = function() {
+    if (QQShuru.Util.Browser.isIE) {
+        return function(b, c, a) {
+            b.detachEvent("on" + c, a)
+        }
+    } else {
+        return function(b, c, a, d) {
+            b.removeEventListener(c, a, d || false)
+        }
+    }
+} ();
+QQShuru.Util.Event.getPoint = function(a) {
+    if (QQShuru.Util.Browser.isIE) {
+        return [a.x, a.y]
+    } else {
+        return [a.layerX, a.layerY]
+    }
+};
+/*
+    初始化函数
+*   params:obj
+*   obj={
+*       canvasId:canvas的id  --required
+*       lineColor:  默认#606060  ,
+*       lineWidth:  默认10
+*       backBtnId: 退一步按钮id
+*       clearBtnId:清空canvas按钮id
+*       callback:func  每次请求后回调
+*   }
+*
+*
+*/
+QQShuru.HWPanel = function(obj) {
+    var o = QQShuru.Util.Browser.isIE;
+    var m = QQShuru.Util.Event.addEvent;
+    var j = QQShuru.Util.Event.remEvent;
+    var B = QQShuru.Util.Event.getPoint;
+    var h = document;
+    var H = document.body;
+    var z = document.documentElement;
+    var f = [];
+    var K = [];
+    var O = [];
+
+    var i = document.querySelector(obj.canvasId);
+    var v = o ? 1 : 0;
+    var a = 2;
+    var N = i.clientWidth;//canvas宽度
+    var R = i.clientHeight;//canvas高度
+    var c = obj.lineColor?obj.lineColor:"#606060"; //线条颜色
+    var y = obj.lineWidth?obj.lineWidth:10;//线条宽度
+    var t = "round";
+    var J = !!i.getContext;
+    if (J) {
+        var Q = i.getContext("2d");
+        Q.lineCap = t;
+        Q.lineJoin = t;
+        Q.lineWidth = y;
+        Q.strokeStyle = c
+    }
+    var L = false;
+    var P = false;
+    var u = 0;
+    var T = [];
+    var r = 0;
+    var e = [],
+        d = [],
+        I = [];
+    var D = [],
+        C = [];
+    pointsDeltaXY = [];
+    var k = [0, 0];
+    //鼠标按下事件
+    var l = function(W) {
+        if (v !== W.button) {
+            return
+        }
+        var Y = B(W);
+        if (!Y) {
+            return
+        }
+        L = true;
+        r = 0;
+        e = [];
+        d = [];
+        I = [];
+        D = [];
+        C = [];
+        pointsDeltaXY = [];
+        e[r] = Y[0];
+        d[r] = Y[1];
+        I[r * 2] = Y[0];
+        I[r * 2 + 1] = Y[1];
+        D[r] = Y[0];
+        C[r] = Y[1];
+        pointsDeltaXY[r * 2] = Y[0];
+        pointsDeltaXY[r * 2 + 1] = Y[1];
+        if (J) {
+            Q.beginPath();
+            Q.moveTo(Y[0], Y[1])
+        }
+        k[0] = Y[0];
+        k[1] = Y[1];
+        r++;
+        if (o) {
+            m(i, "losecapture", n);
+            i.setCapture()
+        } else {
+            m(window, "blur", n)
+        }
+    };
+    //鼠标移动事件
+    var A = function(W) {
+        if (!L) {
+            return
+        }
+        var Y = B(W);//坐标
+        if (!Y) {
+            return
+        }
+        e[r] = Y[0];
+        d[r] = Y[1];
+        I[r * 2] = Y[0];
+        I[r * 2 + 1] = Y[1];
+        D[r] = Y[0] - k[0];
+        C[r] = Y[1] - k[1];
+        pointsDeltaXY[r * 2] = D[r];
+        pointsDeltaXY[r * 2 + 1] = C[r];
+        if (J) {
+            Q.lineTo(Y[0], Y[1]);
+            Q.stroke()
+        } else {
+            var X = T[u].e.path;
+            X.value = X.value.replace(" e", "," + Y[0] + "," + Y[1] + " e")
+        }
+        k[0] = Y[0];
+        k[1] = Y[1];
+        r++
+    };
+    //鼠标松开事件
+    var n = function(W) {
+        if (!L) {
+            return
+        }
+        L = false;
+        if (1 === r) {
+            if (!J) {
+                T[u].e.style.visibility = "hidden"
+            }
+            return
+        }
+        if (J) {
+            Q.closePath();
+            var Z = i.cloneNode(false);
+            Z.style.display = "none";
+            Z.getContext("2d").drawImage(i, 0, 0);
+            T[u] = {
+                e: Z
+            };
+            Z = null
+        }
+        var aa = T[u];
+        aa.count = r;
+        aa.x = e.slice(0);
+        aa.y = d.slice(0);
+        aa.xy = I.slice(0);
+        aa.deltaX = D.slice(0);
+        aa.deltaY = C.slice(0);
+        aa.deltaXY = pointsDeltaXY.slice(0);
+        u++;
+        var X = [];
+        for (var Y = 0; Y < r; Y++) {
+            X[Y] = "[" + e[Y] + ", " + d[Y] + "]"
+        }
+        if (o) {
+            j(i, "losecapture", n);
+            i.releaseCapture()
+        } else {
+            j(window, "blur", n)
+        }
+        if (1 === u) {
+            i.className = "writting"
+        }
+        s(u);
+    };
+    //清空所有
+    var V = function(W) {
+        if (0 === u) {
+            return
+        }
+        var ab = "";
+        if (J) {
+            Q.clearRect(0, 0, N, R)
+        }
+        for (var Z = 0; Z < u; Z++) {
+            T[Z].e.style.visibility = "hidden"
+        }
+        u = 0;
+        i.className = ""
+    };
+    //退一笔
+    var g = function(W) {
+        if (0 === u) {
+            return
+        }
+        if (1 === u) {
+            V();
+            return
+        }
+        u--;
+        if (J) {
+            Q.clearRect(0, 0, N, R);
+            Q.drawImage(T[u - 1].e, 0, 0)
+        }
+        T[u].e.style.visibility = "hidden";
+        s(u)
+    };
+    var p = function(W, ab) {
+        var aa = ab || W.length;
+        var Z = "";
+        var ad = "";
+        for (var X = 0; X < aa; ++X) {
+            var ac = W[X];
+            ad = X ? ",eb,": "";
+            var Y = ad + ac.deltaXY.join(",");
+            Z += Y
+        }
+        return Z
+    };
+    this.ajax_callback = function(X) {
+        obj.callback&&obj.callback(X)
+    };
+    QQShuru.HWPanel.ajax_callback = this.ajax_callback;
+    var s = function(Y) {
+        var Z = p(T, Y);
+        var ab = "QQShuru.HWPanel.ajax_callback";
+        var W = "https://handwriting.shuru.qq.com/cloud/cgi-bin/cloud_hw_pub.wsgi";
+        var aa = "track_str=" + Z + "&cmd=0";
+        var X = W + "?" + aa;
+        QQShuru.Util.Ajax.get(X, ab)
+    };
+    m(i, "mousedown", l);
+    m(i, "mousemove", A);
+    m(i, "mouseup", n);
+    m(i, "dblclick", V);
+    m(i, "contextmenu",
+        function(W) {
+            o ? (W.returnValue = false) : W.preventDefault()
+        });
+    m(h, "mouseup", n);
+    if(obj.backBtnId){
+        m(document.querySelector(obj.backBtnId), "click", g);
+    }
+    if(obj.clearBtnId){
+        m(document.querySelector(obj.clearBtnId), "click", V);
+    }
+    this.clear=V;//暴露清空canvas的方法到外部
+    this.back=g;//暴露退一步的方法到外部
+};

+ 150 - 0
shurufa/js/index.js

@@ -0,0 +1,150 @@
+$(function(){
+  // let base = 'http://119.23.129.199:8100/'
+  let base = '/'
+  
+  var stopClick = false
+
+  function getQueryString(value) {
+    var reg = new RegExp("(^|&)" + value + "=([^&]*)(&|$)", "i");
+    var r = window.location.search.substr(1).match(reg);
+    if (r != null) return unescape(r[2]); return null;
+  }
+    $('#canvas').attr('width',$('#canvasWrap').width())
+    $('#canvas').attr('height',$('#canvasWrap').height())
+
+    init()
+  
+    $('#clear').click(function () {
+      $('#clear').css('opacity',0)
+      $('#result').html('')
+    })
+
+    $('#clsipt').click(function () {
+      $('#input').val('')
+      $('#clsipt').css('opacity',0)
+      $('.search-page').show()
+      $('.result-page').hide()
+    })
+    
+    $('#input').on('input propertychange', function() {
+      var count = $(this).val().length;
+      $('#clsipt').css('opacity',count?1:0)
+     });
+  
+    $('#search').click(function () {
+      search()
+    })
+
+    $('#reload').click(function () {
+      location.reload()
+    })
+
+    let startY = ''
+    let lastY = ''
+
+    let mMove = function (event) {
+      event.stopPropagation()
+      event.preventDefault()
+      let deltaY = event.clientY - startY
+      stopClick = true
+
+      if (lastY == deltaY) {
+        return
+      }
+      let de = document.documentElement.scrollTop||document.body.scrollTop
+      dic = lastY>deltaY? 1:-1
+      let to = de + dic * 15
+      window.scrollTo(0,to)
+      // lastY>deltaY?window.scrollTo(deltaY):'下'
+      lastY = deltaY
+    }
+
+    $('.body').mousedown(function (e) {
+      startY = e.clientY
+      stopClick = false
+      $('.body').mousemove(mMove)
+    })
+
+    $('.body').mouseup(function (e) {
+      $('.body').off('mousemove',mMove)
+    })
+  function callbackfunc(ret){
+    let html = ''
+
+    ret.cand.forEach(item => {
+      html+=`<li>${item}</li>`
+    });
+    $('#clear').css('opacity',1)
+    $('#result').html(html)
+    $('#result').undelegate()
+    $('#result').delegate('li','click',function (e) {
+      e.stopPropagation()
+      e.preventDefault()
+      let target = e.target
+      $('#input').val($('#input').val() + $(target).text())
+      $('#clsipt').css('opacity',1)
+      $('#clear').click()
+    })
+  
+  }
+
+  function search() {
+    let data = {
+      id: getQueryString('id') || '',
+      name: $('#input').val(),
+    }
+    $.ajax({
+      url: base + 'api/searchCollection',
+      type: "POST",
+      data: JSON.stringify(data),
+      dataType: "json",
+      contentType: "application/json;charset=utf-8",
+      success: function (data) {
+        if (data.code!=0) {
+          return alert(data.msg)
+        }
+        $('.search-page').hide()
+      
+        if (data.data.length<=0) {
+          $('.result-page').fadeIn()
+          $('.result-page ul').hide()
+          $('.no-result').fadeIn()
+        }
+
+        else{
+          $('.no-result').hide()
+          $('.result-page').fadeIn()
+          $('.result-page ul').fadeIn()
+
+          let html = ``
+          data.data.forEach(item=>{
+            html += `<li data-id="${item.id}">
+                      <img src="${item.pic}" data-id="${item.id}" alt="">
+                      <span data-id="${item.id}">${item.name}</span>
+                    </li>`
+          })
+          $('.result-page ul').html(html)
+          let arr = Array.from(document.querySelectorAll(".result-page ul li"))
+          arr.forEach(function(dom) {
+            dom.addEventListener("mouseup", function(e) {
+              let id = e.target.dataset.id
+              setTimeout(function() {
+                (window.resultCallback&&!stopClick) && window.resultCallback(parseInt(id)); 
+              });
+            });
+          });
+        }
+
+      }
+  })
+  }
+
+  function init() {
+      QQShuru.HWPanel({
+          canvasId:"#canvas",
+          lineColor:"#EA9649",
+          clearBtnId:"#clear",
+          callback:callbackfunc
+      });
+  }
+})

Файловите разлики са ограничени, защото са твърде много
+ 4 - 0
shurufa/js/jquery.min.js


BIN
src/assets/img/down-arrow.png


BIN
src/assets/img/up-arrow.png


+ 25 - 22
src/configue/http.js

@@ -7,7 +7,7 @@ const vue = new Vue()
 let loading = ''
 
 // 配置请求域名
-
+let layoutBoxIsShow
 const serverName = isProduction ? '/zhoushan' : 'http://119.23.129.199:8110/zhoushan'
 // http://119.23.129.199:8100/
 const exceptUrls = ['/login']
@@ -49,35 +49,38 @@ axios.interceptors.response.use(
       case 102:
         break
       case 5001:
-        window.localStorage.setItem('token', '')
-        vue.$alert('登录状态失效,请重新登录', '提示', {
-          confirmButtonText: '确定',
-          callback: function () {
-            router.push('/login')
-          }
-        })
-        break
-      case 0:
-        break
-    }
-    // tryHideFullScreenLoading()
-    return data
-  },
-  error => {
-    loading.close()
-    if (error.response) {
-      switch (error.response.code) {
-        case 5001:
+        if (!layoutBoxIsShow) {
+          layoutBoxIsShow = true
           window.localStorage.setItem('token', '')
           vue.$alert('登录状态失效,请重新登录', '提示', {
             confirmButtonText: '确定',
             callback: function () {
+              layoutBoxIsShow = false
               router.push('/login')
             }
           })
-          break
-      }
+        }
+        break
+      case 0:
+        break
     }
+    return data
+  },
+  error => {
+    loading.close()
+    // if (error.response) {
+    //   switch (error.response.code) {
+    //     case 5001:
+    //       window.localStorage.setItem('token', '')
+    //       vue.$alert('登录状态失效,请重新登录', '提示', {
+    //         confirmButtonText: '确定',
+    //         callback: function () {
+    //           router.push('/login')
+    //         }
+    //       })
+    //       break
+    //   }
+    // }
     return Promise.reject(error)
   }
 )

+ 1 - 1
src/main.js

@@ -32,7 +32,7 @@ Vue.prototype.vLoading = {
 }
 
 /* eslint-disable no-new */
-new Vue({
+window.$app = new Vue({
   el: '#app',
   router,
   components: { App },

+ 8 - 7
src/pages/cultural-relic/index.vue

@@ -40,7 +40,7 @@
             <li class="theme-color" @click="gotoShow(item)" v-for="(item,i) in tableData" :key="i">
               <div class="li-img">
                 <el-image :fit="'cover'" style="width:100%;height:100%;" :src="item.unityPic"></el-image>
-                <div class="liulan"><span>浏览量: {{Math.round(Math.random()*100000)}}</span> 点赞数: {{Math.round(Math.random()*1000)}}</div>
+                <!-- <div class="liulan"><span>浏览量: {{Math.round(Math.random()*100000)}}</span> 点赞数: {{Math.round(Math.random()*1000)}}</div> -->
               </div>
               <div>{{item.timeName}} {{item.typeName}} <span @click.stop="del(item)" class="del">删除</span></div>
               <p>{{item.name}}</p>
@@ -123,16 +123,17 @@ export default {
       }).then(() => {
         this.$http.post('/collection/deleteCollection', data).then(res => {
           if (res.code === 0) {
-            this.$alert('删除成功', '提示', {
-              confirmButtonText: '确定',
-              callback: action => {
-                this.refresh()
-              }
+            this.$notify.success({
+              title: '提示',
+              message: '删除成功',
+              duration: 2000
             })
+            this.refresh()
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })

+ 4 - 2
src/pages/device/index.vue

@@ -196,7 +196,8 @@ export default {
         } else {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: res.message,
+            duration: 2000
           })
         }
       })
@@ -249,7 +250,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })

+ 23 - 11
src/pages/display/index.vue

@@ -41,6 +41,12 @@
           </el-table-column>
           <el-table-column label="操作">
             <template slot-scope="scope">
+              <!-- <a href="javascript:;" @click="up(scope.row, scope.$index)">
+                <img class="icon" src="@/assets/img/up-arrow.png" alt="">
+              </a>
+              <a href="javascript:;"  @click="down(scope.row, scope.$index)">
+                <img class="icon" src="@/assets/img/down-arrow.png" alt="">
+              </a> -->
               <span class="o-span" @click="goto(scope.row)">编辑</span>
               <span class="o-span" @click="del(scope.row)">删除</span>
             </template>
@@ -75,10 +81,10 @@ export default {
   data () {
     // 这里存放数据
     let data = [
-      {
-        prop: 'idx',
-        label: '序号'
-      },
+      // {
+      //   prop: 'idx',
+      //   label: '序号'
+      // },
       {
         prop: 'name',
         label: '展示方案'
@@ -88,6 +94,10 @@ export default {
         label: '展示类别'
       },
       {
+        prop: 'orderNum',
+        label: '排序'
+      },
+      {
         prop: 'date',
         label: '发布时间'
       }
@@ -134,7 +144,8 @@ export default {
         } else {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: res.message,
+            duration: 2000
           })
         }
       })
@@ -158,16 +169,17 @@ export default {
       }).then(() => {
         this.$http.post('/exhibition/deleteExhibition', data).then(res => {
           if (res.code === 0) {
-            this.$alert('删除成功', '提示', {
-              confirmButtonText: '确定',
-              callback: action => {
-                this.refresh()
-              }
+            this.$notify.success({
+              title: '提示',
+              message: '删除成功',
+              duration: 2000
             })
+            this.refresh()
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })

+ 69 - 26
src/pages/editPages/cultural-relic/index.vue

@@ -3,22 +3,24 @@
   <div  v-loading.fullscreen.lock="loading"
     element-loading-text="拼命加载中"
     element-loading-spinner="el-icon-loading"
+    class="edit-cultural-relic"
     element-loading-background="rgba(0, 0, 0, 0.8)">
     <main-top :crumb="crumbData"></main-top>
     <div class="table-interface">
       <div class="top-body">
         <div class="top-title">文物信息:</div>
         <div class="form-con">
-          <el-form ref="form" :model="form" label-width="120px">
-            <el-form-item :rules="[
-              { required: true, message: '文物名称不能为空'}
-            ]" label="文物名称:" style="width:318px;">
+          <el-form ref="form"  :rules="rules" status-icon  :model="form" label-width="120px">
+            <el-form-item prop="name" label="文物名称:" style="width:318px;">
               <el-input v-model="form.name" placeholder="请输入文物名称"></el-input>
             </el-form-item>
-
-            <el-form-item label="文物类别:" :rules="[
-              { required: true}
-            ]">
+            <el-form-item prop="verticalName" label="竖排文物名">
+              <el-input type="textarea" v-model="form.verticalName" class="verticla-input" />
+              <!-- <textarea rows="10" >
+                在w3school,你可以找到你所需要的所有的网站建设教程。
+                </textarea> -->
+            </el-form-item>
+            <el-form-item label="文物类别:">
               <el-select v-model="form.typeId" placeholder="请选择文物类别">
                   <el-option v-for="(item,i) in plist" :key="i" :label="item.name" :value="item.id"></el-option>
               </el-select>
@@ -31,7 +33,9 @@
                 <el-option v-for="(item,i) in tlist" :key="i" :label="item.name" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
-
+            <el-form-item label="文物排序:">
+              <el-input v-model="form.num" placeholder="请输入文物排序"></el-input>
+            </el-form-item>
             <el-form-item label="文物年代:" >
               <el-input v-model="form.typeTime" maxlength="50" show-word-limit placeholder="请输入文物年代"></el-input>
             </el-form-item>
@@ -39,7 +43,9 @@
             <el-form-item label="文物介绍:">
                 <vue-editor v-model="form.description" />
             </el-form-item>
-
+            <el-form-item label="文物介绍预览:">
+                <el-input type="textarea" v-model="form.description1" disabled />
+            </el-form-item>
             <el-form-item label="出土信息:" style="width:100%;">
               <el-input v-model="form.venue" maxlength="50" show-word-limit placeholder="请输入出土信息"></el-input>
             </el-form-item>
@@ -102,10 +108,10 @@
                     </div>
                   </div>
                   <div class="el-upload__tip" slot="tip">
-                    支持扩展名:.jpg, .jpgc, .png
+                    支持扩展名:.jpg, .jpgc, .png,图片最长边不可以超过1024
                   </div>
                 </el-upload>
-                <div class="el-upload__tip">*海报规定尺寸比例:3:4 </div>
+                <!-- <div class="el-upload__tip">*海报规定尺寸比例:3:4 </div> -->
               </el-form-item>
             </template>
 
@@ -126,7 +132,7 @@
               <span class="wwtxt" style="color:#C0C4CC">建议上传512*512的png格式图片</span>
             </el-form-item>
 
-            <el-form-item label="文物展示:">
+            <el-form-item label="动画封面:">
                <el-upload
                 class="avatar-uploader"
                 :action="uploadUrl"
@@ -140,7 +146,7 @@
                 <img v-if="form.unityPic" :src="form.unityPic" class="avatar">
                 <i v-else class="el-icon-plus avatar-uploader-icon"></i>
               </el-upload>
-              <span class="wwtxt" style="color:#C0C4CC">仅支持上传文物展示的JPG格式文件</span>
+              <span class="wwtxt" style="color:#C0C4CC">建议上传最长边不超过1024的JPG格式图片</span>
             </el-form-item>
 
             <!-- <el-form-item label="四维模库:" style="width:340px;">
@@ -193,7 +199,7 @@
                     <em>点击上传</em>
                   </div>
                 </div>
-                <div class="el-upload__tip" slot="tip">支持视频动画格式:.wma, .wav, .mp4</div>
+                <div class="el-upload__tip" slot="tip">支持视频动画格式:.wmv, .wav, .mp4</div>
               </el-upload>
             </el-form-item>
             <el-form-item label="二维码信息:">
@@ -272,12 +278,16 @@ export default {
       loading: false,
       contentUrlList: [],
       unityUrlList: [],
+      rules: {
+        name: [{ required: true, message: '请输入文物名称', trigger: 'blur' }],
+        verticalName: [{ required: true, message: '请输入竖排文物名', trigger: 'blur' }]
+      },
       form: {
         name: '',
         typeId: 2,
         timeId: 1,
         typeTime: '',
-        num: '',
+        num: 0,
         discoveryTime: '',
         venue: '',
         modelUrl: '',
@@ -295,7 +305,8 @@ export default {
         state: 0,
         texture: '',
         type: '2D',
-        typeImages: ''
+        typeImages: '',
+        verticalName: ''
       },
       plist: [],
       tlist: [],
@@ -306,7 +317,9 @@ export default {
     }
   },
   watch: {
-
+    'form.description' (val) {
+      this.form.description1 = val.replace(/<\/[^>]*>/g, '\n').replace(/<[^>]*>/g, '').replace(/&nbsp/g, '')
+    }
   },
   methods: {
     delUploadItem (i) {
@@ -317,7 +330,6 @@ export default {
     },
     getQrCodeImages (img) {
       this.form.qrCode = img
-      console.log(this.form.qrCode)
     },
     getModelImages (img) {
       this.form.unityPic = img
@@ -332,7 +344,7 @@ export default {
       this.loading = false
       this.uploadList.push(data.data)
     },
-    onSubmit () {
+    async onSubmit () {
       let {name,
         typeId,
         type,
@@ -355,12 +367,30 @@ export default {
         state,
         remarks,
         description,
+        verticalName,
         id} = this.form
+      if (!name) {
+        this.$notify.error({
+          title: '错误',
+          message: '请输入文物名称',
+          duration: 2000
+        })
+        return
+      }
+      if (!verticalName) {
+        this.$notify.error({
+          title: '错误',
+          message: '请输入竖排文物名称',
+          duration: 2000
+        })
+        return
+      }
       contentUrl = this.contentUrlList[0] ? this.contentUrlList[0].url : ''
       unityUrl = this.unityUrlList[0] ? this.unityUrlList[0].url : ''
       if (type === '2D') {
         typeImages = this.uploadList
       }
+      description = this.form.description1
       let data = {name,
         typeId,
         timeId,
@@ -382,6 +412,7 @@ export default {
         qrCode,
         contentUrl,
         state,
+        verticalName,
         description}
       if (this.type) {
         data['id'] = id
@@ -397,7 +428,8 @@ export default {
         } else {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: res.message,
+            duration: 2000
           })
         }
       })
@@ -412,7 +444,7 @@ export default {
       let type = this.isTypeBySend(file.name, typeArr)
       if (!type) {
         this.loading = false
-        this.$message.error('仅支持上传文物展示的JPG格式文件')
+        this.$message.error('仅支持上传动画封面的JPG格式文件')
         return type
       }
     },
@@ -438,11 +470,11 @@ export default {
 
     beforeUpload (file) {
       this.loading = true
-      let typeArr = ['wma', 'wav', 'mp4']
+      let typeArr = ['wmv', 'wav', 'mp4']
       let type = this.isTypeBySend(file.name, typeArr)
       if (!type) {
         this.loading = false
-        this.$message.error('支持视频动画格式:.wma, .wav, .mp4')
+        this.$message.error('支持视频动画格式:.wmv, .wav, .mp4')
         return type
       }
     },
@@ -534,7 +566,7 @@ export default {
         typeId: 2,
         timeId: 1,
         typeTime: '',
-        num: '',
+        num: 0,
         discoveryTime: '',
         venue: '',
         modelUrl: '',
@@ -564,7 +596,7 @@ export default {
 @import './style.less';
 </style>
 
-<style>
+<style  lang='less'>
 .ql-picker-label {
   line-height: 1;
   overflow: hidden;
@@ -624,4 +656,15 @@ export default {
   display: block;
 }
 
+.edit-cultural-relic {
+  .verticla-input {
+    height: 200px;
+    width: 40px;
+    textarea {
+      height: 100% !important;
+      resize: none;
+    }
+  }
+}
+
 </style>

+ 2 - 1
src/pages/editPages/cultural-relic/style.less

@@ -50,4 +50,5 @@
       }
     }
   }
-}
+}
+

+ 119 - 19
src/pages/editPages/display/index.vue

@@ -10,10 +10,12 @@
         <div class="top-title">方案信息:</div>
         <div class="form-con">
           <el-form ref="form" :model="form" label-width="100px">
-            <el-form-item label="方案名称:" style="width:318px;">
+            <el-form-item label="方案名称:" required style="width:318px;">
               <el-input v-model="form.name"></el-input>
             </el-form-item>
-
+            <el-form-item label="方案排序:"  style="width:318px;">
+              <el-input v-model="form.orderNum"></el-input>
+            </el-form-item>
             <el-form-item label="展示说明:">
               <vue-editor v-model="form.description" />
             </el-form-item>
@@ -23,14 +25,14 @@
         </div>
         <div class="top-title">展示信息:</div>
         <div class="form-con">
-          <el-form ref="form" :model="form" label-width="100px">
+          <el-form ref="form" :model="form" label-width="140px">
             <el-form-item label="展示类别:" style="width:318px;">
               <el-select v-model="form.typeId" placeholder="请选择文物类别">
                 <el-option v-for="(item,i) in exhibitionlist" :key="i" :label="item.name" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
 
-            <el-form-item label="展示封面:">
+            <el-form-item label="展示封面(深色):">
                <el-upload
                 class="avatar-uploader"
                 :action="uploadUrl"
@@ -46,9 +48,24 @@
               </el-upload>
 
             </el-form-item>
+            <el-form-item label="展示封面(浅色):">
+               <el-upload
+                class="avatar-uploader"
+                :action="uploadUrl"
+                :headers="{
+                  token,
+                }"
+                :show-file-list="false"
+                :before-upload="beforeUpload"
+                :on-success="upload_avatar_success2"
+                >
+                <img v-if="form.webUrl2" :src="form.webUrl2" class="avatar">
+                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+              </el-upload>
 
-            <el-form-item label="展示文物:">
-              <el-table :data="tableData" v-if="tableData.length>0" style="width: 100%">
+            </el-form-item>
+            <el-form-item label="展示文物:" required="">
+              <el-table ref="dragTable" :data="tableData" v-if="tableData.length>0" style="width: 100%">
                 <el-table-column
                   v-for="(item, idx) in data"
                   :key="idx"
@@ -61,6 +78,12 @@
                 </el-table-column>
                 <el-table-column label="操作">
                   <template slot-scope="scope">
+                    <a href="javascript:;" @click="up(scope.row, scope.$index)">
+                      <img class="icon" src="@/assets/img/up-arrow.png" alt="">
+                    </a>
+                    <a href="javascript:;"  @click="down(scope.row, scope.$index)">
+                      <img class="icon" src="@/assets/img/down-arrow.png" alt="">
+                    </a>
                     <span class="o-span" @click="del(scope.row)">删除</span>
                   </template>
                 </el-table-column>
@@ -129,6 +152,7 @@
 import MainTop from '@/components/main-top'
 import SearchBar from '@/components/search-bar'
 import Cropper from '@/components/cropper'
+import Sortable from 'sortablejs'
 
 import { VueEditor } from 'vue2-editor'
 
@@ -193,9 +217,13 @@ export default {
         equipmentId: 1,
         state: 0,
         description: '',
-        webUrl: ''
+        webUrl: '',
+        webUrl2: '',
+        orderNum: 0
       },
       tableData: [],
+      oldList: [],
+      newList: [],
       collectList: [],
       timelist: [],
       typeId: '',
@@ -226,7 +254,10 @@ export default {
       this.loading = false
       this.form.webUrl = data.data
     },
-
+    upload_avatar_success2 (data) {
+      this.loading = false
+      this.form.webUrl2 = data.data
+    },
     refresh () {
       this.loading = true
       this.getInformation()
@@ -273,6 +304,9 @@ export default {
       })
 
       this.tableData = result.data
+      this.$nextTick(() => {
+        this.setSort()
+      })
       console.log('tableData', result.data)
 
       this.tableData.forEach((item, i) => {
@@ -291,8 +325,24 @@ export default {
       return false
     },
     onSubmit () {
-      let { name, id, typeId, equipmentId, state, description, webUrl } = this.form
-      let data = { name, typeId, equipmentId, state, description, webUrl }
+      let { name, id, typeId, equipmentId, state, description, webUrl, webUrl2, orderNum } = this.form
+      let data = { name, typeId, equipmentId, state, description, webUrl, webUrl2, orderNum }
+      if (!name) {
+        this.$notify.error({
+          title: '错误',
+          message: '请填写方案名称',
+          duration: 2000
+        })
+        return
+      }
+      if (this.tableData.length < 1) {
+        this.$notify.error({
+          title: '错误',
+          message: '请选择展示文物',
+          duration: 2000
+        })
+        return
+      }
       if (this.type) {
         data['id'] = id
       }
@@ -321,14 +371,16 @@ export default {
             } else {
               this.$notify.error({
                 title: '错误',
-                message: res.message
+                message: res.message,
+                duration: 2000
               })
             }
           })
         } else {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: res.message,
+            duration: 2000
           })
         }
       })
@@ -344,14 +396,18 @@ export default {
       this.tableData.push(item)
     },
     del (item) {
-      let arr = []
-      this.tableData.forEach(sub => {
-        if (sub.id !== item.id) {
-          arr.push(sub)
+      this.$alert('是否删除该文物', {
+        callback: () => {
+          let arr = []
+          this.tableData.forEach(sub => {
+            if (sub.id !== item.id) {
+              arr.push(sub)
+            }
+          })
+
+          this.tableData = arr
         }
       })
-
-      this.tableData = arr
     },
     async getInformation () {
       this.showSelect = true
@@ -388,6 +444,47 @@ export default {
 
       this.form = result.data
       this.tableData = result.data.collectionList
+      this.oldList = this.tableData.map(v => v.id)
+      this.newList = this.oldList.slice()
+      this.$nextTick(() => {
+        // this.setSort()
+      })
+    },
+    setSort () {
+      const el = this.$refs.dragTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0]
+      this.sortable = Sortable.create(el, {
+        ghostClass: 'sortable-ghost', // Class name for the drop placeholder,
+        setData: function (dataTransfer) {
+          // to avoid Firefox bug
+          // Detail see : https://github.com/RubaXa/Sortable/issues/1012
+          dataTransfer.setData('Text', '')
+        },
+        onEnd: evt => {
+          console.log(evt)
+          const targetRow = this.tableData.splice(evt.oldIndex, 1)[0]
+          console.log(targetRow)
+          this.tableData.splice(evt.newIndex, 0, targetRow)
+          // for show the changes, you can delete in you code
+          const tempIndex = this.newList.splice(evt.oldIndex, 1)[0]
+          this.newList.splice(evt.newIndex, 0, tempIndex)
+        }
+      })
+    },
+    up (row, index) {
+      if (index < 1) {
+        return
+      }
+      const targetRow = this.tableData.splice(index, 1)[0]
+      index--
+      this.tableData.splice(index, 0, targetRow)
+    },
+    down (row, index) {
+      if (index > this.tableData.length - 1) {
+        return
+      }
+      const targetRow = this.tableData.splice(index, 1)[0]
+      index++
+      this.tableData.splice(index, 0, targetRow)
     }
   },
 
@@ -438,5 +535,8 @@ export default {
   height: 178px;
   display: block;
 }
-
+.icon {
+  width: 20px;
+  vertical-align: middle;
+}
 </style>

+ 4 - 3
src/pages/editPages/message/index.vue

@@ -98,7 +98,7 @@
                   </div>
                 </div>
                 <div class="el-upload__tip" slot="tip">
-                  支持扩展名:.wma, .rmvb, .rm, .flash, .mp4
+                  支持扩展名:.wmv, .rmvb, .rm, .flash, .mp4
                 </div>
               </el-upload>
             </el-form-item>
@@ -265,7 +265,7 @@ export default {
         'vqf'
       ]
       var v = ['jpg', 'jpgc', 'png']
-      var m = ['wma', 'rmvb', 'rm', 'flash', 'mp4']
+      var m = ['wmv', 'rmvb', 'rm', 'flash', 'mp4']
 
       for (var i in a) {
         if (a[i] === type.toLowerCase()) return 'audio'
@@ -320,7 +320,8 @@ export default {
         } else {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: res.message,
+            duration: 2000
           })
         }
       })

+ 2 - 1
src/pages/editPages/role/index.vue

@@ -260,7 +260,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: result.msg
+              message: result.msg,
+              duration: 2000
             })
           }
         }

+ 9 - 7
src/pages/information/index.vue

@@ -152,7 +152,8 @@ export default {
         } else {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: res.message,
+            duration: 2000
           })
         }
       })
@@ -201,16 +202,17 @@ export default {
       }).then(() => {
         this.$http.post('/information/deleteInformation', data).then(res => {
           if (res.code === 0) {
-            this.$alert('删除成功', '提示', {
-              confirmButtonText: '确定',
-              callback: action => {
-                this.refresh()
-              }
+            this.$notify.success({
+              title: '提示',
+              message: '删除成功',
+              duration: 2000
             })
+            this.refresh()
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })

+ 5 - 5
src/pages/layout/aside.vue

@@ -2,11 +2,11 @@
 <template>
 <div class="aside">
   <div class="aside-list">
-    <div class="aside-item">
+    <!-- <div class="aside-item">
       <div :class="{active:activeIdx === -1}" @click="go(-1,'/')"><img :src="require('@/assets/img/01jk.png')" >首页</div>
-      <!-- <div @click="go(0,'/message')" :class="{active:activeIdx === 0}">消息管理</div> -->
+      <div @click="go(0,'/message')" :class="{active:activeIdx === 0}">消息管理</div>
       <div @click="go(1,'/user-analysis')" :class="{active:activeIdx === 1}">数据统计</div>
-    </div>
+    </div> -->
     <div class="aside-item">
       <div><img :src="require('@/assets/img/02fb.png')">工作管理</div>
       <!-- <div @click="go(2,'/information')" :class="{active:activeIdx === 2}">资讯管理</div> -->
@@ -21,11 +21,11 @@
       <div @click="go(7,'/work-log')" :class="{active:activeIdx === 7}">工作日志</div>
       <div @click="go(8,'/modify')" :class="{active:activeIdx === 8}">密码修改</div>
     </div>
-    <div class="aside-item" >
+    <!-- <div class="aside-item" >
       <div><img :src="require('@/assets/img/04fb.png')">高级管理</div>
       <div @click="go(9,'/role')" :class="{active:activeIdx === 9}">角色管理</div>
       <div @click="go(10,'/device')" :class="{active:activeIdx === 10}">设备管理</div>
-    </div>
+    </div> -->
   </div>
 </div>
 </template>

+ 8 - 6
src/pages/layout/head.vue

@@ -6,9 +6,9 @@
     <!-- <span>大屏后台管理系统</span> -->
   </div>
   <div class="header-user">
-    <div class="avatar">
-      <img :src="head" alt="">
-      <span>高级管理员</span>
+    <div class="1">
+      <!-- <img :src="head" alt=""> -->
+      <span>{{ userName }}</span>
     </div>
     <div  @click="logout" class="logout"><img src="@/assets/img/logout.png" alt="">退出</div>
   </div>
@@ -24,7 +24,8 @@ export default {
   components: {},
   data () {
     return {
-      head: ''
+      head: '',
+      userName: ''
     }
   },
   // 监控data中的数据变化
@@ -48,9 +49,10 @@ export default {
     if (userInfo) {
       tmp = JSON.parse(userInfo)
     }
-
+    console.log(tmp, 'userInfo')
     if (tmp) {
-      this.head = userInfo.head
+      this.head = tmp.user.head
+      this.userName = tmp.user.userName
     }
     // this.updateInfo()
   },

+ 4 - 3
src/pages/login/index.vue

@@ -40,8 +40,8 @@ export default {
         return callback(new Error('用户名不能为空'))
       }
       setTimeout(() => {
-        if (value.length > 10) {
-          callback(new Error('用户名字符不能大于10位'))
+        if (value.length > 20) {
+          callback(new Error('用户名字符不能大于20位'))
         } else {
           callback()
         }
@@ -92,7 +92,8 @@ export default {
             } else {
               this.$notify.error({
                 title: '错误',
-                message: res.msg
+                message: res.msg,
+                duration: 2000
               })
             }
           })

+ 47 - 10
src/pages/modify/index.vue

@@ -6,18 +6,18 @@
       <div class="top-body">
         <div class="body-middle">
           <el-form :rules="ruleForget" status-icon :model="formForget" ref="formForget">
-            <el-form-item prop="newPassword">
-              <el-input v-model="formForget.oldPass" placeholder="当前密码" type="password"></el-input>
+            <el-form-item prop="password">
+              <el-input v-model="formForget.password" placeholder="当前密码" type="password"></el-input>
             </el-form-item>
             <el-form-item prop="newPassword">
               <el-input v-model="formForget.newPassword" placeholder="新密码" type="password"></el-input>
             </el-form-item>
-            <el-form-item prop="comfirm">
-              <el-input v-model="formForget.comfirm" placeholder="重复新密码" type="password"></el-input>
+            <el-form-item prop="repeatPassword">
+              <el-input v-model="formForget.repeatPassword" placeholder="重复新密码" type="password"></el-input>
             </el-form-item>
             <el-form-item>
-              <el-button type="primary">确定</el-button>
-              <el-button>取消</el-button>
+              <el-button style="width:100%" type="primary" @click="handleSubmitClick">确定</el-button>
+              <!-- <el-button>取消</el-button> -->
             </el-form-item>
           </el-form>
         </div>
@@ -68,16 +68,53 @@ export default {
     return {
       crumbData,
       formForget: {
-        oldPass: '',
+        password: '',
         newPassword: '',
-        comfirm: ''
-
+        repeatPassword: '',
+        id: ''
       },
       ruleForget: {
+        password: [{ required: true, message: '请输入当前密码', trigger: 'blur' }],
         newPassword: [{ validator: validatePass, trigger: 'blur' }],
-        comfirm: [{ validator: validatePass2, trigger: 'blur' }]
+        repeatPassword: [{ validator: validatePass2, trigger: 'blur' }]
       }
     }
+  },
+  mounted () {
+    let userInfo = window.localStorage.getItem('userInfo') || ''
+    let tmp = ''
+    if (userInfo) {
+      tmp = JSON.parse(userInfo)
+      this.formForget.id = tmp.user.id
+    }
+  },
+  methods: {
+    handleSubmitClick () {
+      this.$http({
+        url: '/user/updatePassword',
+        method: 'post',
+        data: this.formForget
+      }).then(res => {
+        if (res.code === 0) {
+          this.$notify.success({
+            title: '提示',
+            message: '修改成功',
+            duration: 2000,
+            onClose: () => {
+              window.localStorage.setItem('userInfo', '')
+              window.localStorage.setItem('token', '')
+              this.$router.push({name: 'login'})
+            }
+          })
+        } else {
+          this.$notify.error({
+            title: '错误',
+            message: res.msg,
+            duration: 2000
+          })
+        }
+      })
+    }
   }
 }
 </script>

+ 8 - 4
src/pages/role/index.vue

@@ -141,7 +141,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })
@@ -180,7 +181,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })
@@ -207,7 +209,8 @@ export default {
         } else {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: res.message,
+            duration: 2000
           })
         }
       })
@@ -252,7 +255,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })

+ 78 - 41
src/pages/user/index.vue

@@ -48,38 +48,37 @@
               <span class="o-span" @click="del(scope.row)">注销</span>
             </template>
           </el-table-column>
-          <div class="e-pagination">
+        </el-table>
+         <div class="e-pagination">
             <el-pagination @current-change="handleCurrentChange" :current-page.sync="currentPage" :page-size="size" layout="prev, pager, next, jumper" :total="total">
             </el-pagination>
           </div>
-        </el-table>
       </div>
     </div>
     <el-dialog :title="editTitle" :visible.sync="dialogFormVisible" width="40%">
       <div class="add-con">
         <div class="add-left">
-          <el-form :model="form">
-            <el-form-item label="用户账号:" :label-width="formLabelWidth">
+          <el-form :model="form" :rules="rules" ref="form">
+            <el-form-item required prop="userName" label="用户账号:" :label-width="formLabelWidth">
               <el-input :disabled="type==='edit'" v-model="form.userName" autocomplete="off"></el-input>
             </el-form-item>
-            <el-form-item label="用户角色:" :label-width="formLabelWidth">
+            <el-form-item required label="用户角色:" :label-width="formLabelWidth">
               <el-select v-model="form.roleId" placeholder="请选择角色">
-                <el-option label="普通管理员" :value="0"></el-option>
-                <el-option label="高级管理员" :value="1"></el-option>
+                <el-option v-for="item in roleList" :label="item.roleName" :key="item.id" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
-            <el-form-item label="手机号码:" :label-width="formLabelWidth">
+            <el-form-item required label="手机号码:" :label-width="formLabelWidth" prop="phone">
               <el-input v-model="form.phone" autocomplete="off"></el-input>
             </el-form-item>
             <el-form-item label="是否启用:" :label-width="formLabelWidth">
                <el-radio-group v-model="form.state">
-                <el-radio :label="0" >是</el-radio>
-                <el-radio :label="1" >否</el-radio>
+                <el-radio :label="0">是</el-radio>
+                <el-radio :label="1">否</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-form>
         </div>
-        <div class="add-right">
+        <!-- <div class="add-right">
           <el-upload
             class="avatar-uploader"
             :action='uploadUrl'
@@ -96,7 +95,7 @@
           <div class="avatar-img">
             <el-button v-if="type==='edit'" @click="reset">重置密码</el-button>
           </div>
-        </div>
+        </div> -->
       </div>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="save">保 存</el-button>
@@ -145,15 +144,11 @@ export default {
         label: '序号'
       },
       {
-        prop: 'head',
-        label: '用户头像'
-      },
-      {
         prop: 'userName',
         label: '账号'
       },
       {
-        prop: 'role',
+        prop: 'roleName',
         label: '角色'
       },
       {
@@ -176,22 +171,34 @@ export default {
       dialogFormVisible: false,
       form: {
         userName: '',
-        roleId: 0,
+        roleId: 16,
         phone: '',
         head: '',
         password: '',
-        repeatPassword: ''
+        repeatPassword: '',
+        state: 0
       },
+      total: 0,
       inputKey: '',
       currentPage: 1,
       size: 10,
-      total: 0,
       formLabelWidth: '120px',
       imageUrl: '',
       type: 'add',
       editTitle: '新增用户',
       uploadUrl: `${this.$serverName}/user/uploadHead`,
-      token: window.localStorage.getItem('token')
+      token: window.localStorage.getItem('token'),
+      roleList: [],
+      rules: {
+        userName: [
+          { required: true, message: '用户账号不能为空' },
+          { max: 20, message: '用户账号不能大于20个字符' }
+        ],
+        phone: [
+          { required: true, message: '手机号不能为空' },
+          { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号' }
+        ]
+      }
     }
   },
   watch: {
@@ -205,6 +212,7 @@ export default {
       this.refresh()
     },
     inputKey () {
+      this.currentPage = 1
       this.refresh()
     },
     type (newVal) {
@@ -213,6 +221,7 @@ export default {
   },
   mounted () {
     this.refresh()
+    this.getRole()
   },
   methods: {
     reset () {
@@ -234,7 +243,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })
@@ -281,7 +291,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })
@@ -293,24 +304,33 @@ export default {
       })
     },
     save () {
-      let {userName, roleId, phone, head, state} = this.form
-      let data = {userName, roleId, phone, head, state}
+      this.$refs['form'].validate().then(res => {
+        let {userName, roleId, phone, head, state} = this.form
+        let data = {userName, roleId, phone, head, state}
 
-      this.$http.post(urlType[this.type], data).then(res => {
-        if (res.code === 0) {
-          this.$alert('操作成功', '提示', {
-            confirmButtonText: '确定',
-            callback: action => {
-              this.dialogFormVisible = false
-              this.refresh()
-            }
-          })
-        } else {
+        this.$http.post(urlType[this.type], data).then(res => {
+          if (res.code === 0) {
+            this.$alert('操作成功', '提示', {
+              confirmButtonText: '确定',
+              callback: action => {
+                this.dialogFormVisible = false
+                this.refresh()
+              }
+            })
+          } else {
+            this.$notify.error({
+              title: '错误',
+              message: res.message,
+              duration: 2000
+            })
+          }
+        }).catch(() => {
           this.$notify.error({
             title: '错误',
-            message: res.message
+            message: '添加失败',
+            duration: 2000
           })
-        }
+        })
       })
     },
 
@@ -319,11 +339,12 @@ export default {
       this.type = type
       this.form = {
         userName: '',
-        roleId: 0,
+        roleId: 16,
         phone: '',
         head: '',
         password: '',
-        repeatPassword: ''
+        repeatPassword: '',
+        state: 0
       }
 
       if (type === 'edit') {
@@ -353,7 +374,8 @@ export default {
           } else {
             this.$notify.error({
               title: '错误',
-              message: res.msg
+              message: res.msg,
+              duration: 2000
             })
           }
         })
@@ -388,8 +410,23 @@ export default {
         item['date'] = this.$base.timestampToTime(item['startTime']) + '至' + this.$base.timestampToTime(item['endTime'])
         item['role'] = juese[item['roleId']]
         item['qiyong'] = zt[item['state']]
-        item['idx'] = i + 1
+        item['idx'] = i + 1 + (this.currentPage - 1) * this.size
+      })
+    },
+    // 获取角色列表
+    async getRole () {
+      let res = await this.$http({
+        method: 'post',
+        data: {
+          state: 1
+        },
+        url: '/user/roleList'
       })
+      this.roleList = res.data.filter(item => item.roleName !== '超级管理员')
+    },
+    handleSearchBtnClick () {
+      this.params.pageNum = 1
+      // this.getLogs()
     }
   }
 }

+ 51 - 20
src/pages/work-log/index.vue

@@ -6,25 +6,24 @@
       <div class="top-body">
         <div class="info-top">
           <div class="info-left">
-            <span>按用户操作查看:</span>
-            <el-select style="width:100px;" v-model="region" placeholder="请选择">
+            <!-- <span>按用户操作查看:</span> -->
+            <!-- <el-select style="width:100px;" v-model="region" placeholder="请选择">
               <el-option label="全部" value="all"></el-option>
               <el-option label="发布" value="fb"></el-option>
               <el-option label="编辑" value="bj"></el-option>
               <el-option label="删除" value="sc"></el-option>
               <el-option label="排序" value="px"></el-option>
-            </el-select>
+            </el-select> -->
             <span style="margin-left:20px;">按操作模块查看:</span>
-            <el-select style="width:100px;" v-model="region1" placeholder="请选择">
-              <el-option label="全部" value="all"></el-option>
-              <el-option label="资讯管理" value="zx"></el-option>
-              <el-option label="文物管理" value="ww"></el-option>
-              <el-option label="问卷管理" value="wj"></el-option>
-              <el-option label="用户管理" value="yh"></el-option>
-              <el-option label="密码修改" value="xg"></el-option>
+            <el-select style="width:120px;" v-model="params.type" placeholder="请选择">
+              <el-option label="全部" value=""></el-option>
+              <el-option label="展览管理" value="展览管理"></el-option>
+              <el-option label="文物库" value="文物库"></el-option>
+              <el-option label="日志管理" value="日志管理"></el-option>
+              <el-option label="用户管理" value="用户管理"></el-option>
             </el-select>
-            <el-input style="width:220px;margin:0 20px;" v-model="infoName" placeholder="请输入操作事件内容"></el-input>
-            <el-button type="primary" >查找</el-button>
+            <el-input style="width:220px;margin:0 20px;" v-model="params.description" placeholder="请输入操作事件内容"></el-input>
+            <el-button type="primary" @click="handleSearchBtnClick">查找</el-button>
             <el-button>重置</el-button>
           </div>
         </div>
@@ -40,6 +39,10 @@
           </template>
           </el-table-column>
         </el-table>
+        <div class="e-pagination">
+          <el-pagination @current-change="handleCurrentChange" :current-page.sync="params.pageNum" :page-size="params.pageSize" layout="prev, pager, next, jumper" :total="total">
+          </el-pagination>
+        </div>
       </div>
     </div>
   </div>
@@ -76,20 +79,16 @@ export default {
         label: '账号'
       },
       {
-        prop: 'module',
+        prop: 'type',
         label: '操作模块'
       },
       {
-        prop: 'event',
+        prop: 'description',
         label: '操作事件'
       },
       {
-        prop: 'date',
+        prop: 'createTime',
         label: '操作时间'
-      },
-      {
-        prop: 'status',
-        label: '状态'
       }
     ]
 
@@ -99,7 +98,39 @@ export default {
       region: 'all',
       region1: 'all',
       infoName: '',
-      tableData: []
+      tableData: [],
+      params: {
+        pageNum: 1,
+        description: '',
+        pageSize: 20,
+        type: ''
+      },
+      total: 0
+    }
+  },
+  mounted () {
+    this.getModuleList()
+    this.getLogs()
+  },
+  methods: {
+    getModuleList () {
+      this.$http.post('/resource/find').then(res => {
+        console.log(res, '/resource/find')
+      })
+    },
+    getLogs () {
+      this.$http.post('/log/list', this.params).then(res => {
+        console.log(res)
+        this.tableData = res.data.list
+        this.total = res.data.total
+      })
+    },
+    handleCurrentChange () {
+      this.getLogs()
+    },
+    handleSearchBtnClick () {
+      this.params.pageNum = 1
+      this.getLogs()
     }
   }
 }

+ 9 - 8
src/router/index.js

@@ -23,12 +23,12 @@ import showCulturalRelic from '@/pages/showPages/cultural-relic'
 
 import User from '@/pages/user'
 
-import Home from '@/pages/home'
+// import Home from '@/pages/home'
 
 Vue.use(Router)
 const originalPush = Router.prototype.push
 Router.prototype.push = function push (location) {
-  return originalPush.call(this, location).catch(err => err)
+  return originalPush.call(this, location)
 }
 
 export default new Router({
@@ -37,13 +37,14 @@ export default new Router({
       path: '/',
       // name: 'mainLayout',
       component: Layout,
+      redirect: '/display',
       children: [
-        {
-          path: '/',
-          name: 'home',
-          component: Home,
-          meta: {index: -1}
-        },
+        // {
+        //   path: '/',
+        //   name: 'home',
+        //   component: Home,
+        //   meta: {index: -1}
+        // },
         {
           path: '/message',
           name: 'message',