From 340bfc7e42a3c1e5ec6de10776d7fe2eb047cc87 Mon Sep 17 00:00:00 2001
From: yujialong <479214531@qq.com>
Date: Fri, 17 Nov 2023 17:44:08 +0800
Subject: [PATCH] fix

---
 package-lock.json                   | 349 ++++++++++++++++++++--
 package.json                        |   1 +
 src/layouts/home/index.vue          | 447 +++++++++++++++-------------
 src/pages/ass/list/index.vue        |   2 +-
 src/pages/match/details/index.vue   | 124 +++++---
 src/pages/match/list/index.vue      | 113 ++++---
 src/pages/station/preview/index.vue |   2 +-
 src/setting.js                      |   4 +-
 8 files changed, 718 insertions(+), 324 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b0bbe53..c682b92 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2140,6 +2140,14 @@
       "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
       "dev": true
     },
+    "agentkeepalive": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
+      "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==",
+      "requires": {
+        "humanize-ms": "^1.2.1"
+      }
+    },
     "ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -2162,6 +2170,82 @@
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
     },
+    "ali-oss": {
+      "version": "6.18.1",
+      "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.18.1.tgz",
+      "integrity": "sha512-VsptD0jX3JNc3AjiLs5a9oTP0ArfT9IYhBuY6G/SpuY6LMuiwfqywrAosY65BlHKODAdYy8VWL6kmt0mO7BUGA==",
+      "requires": {
+        "address": "^1.2.2",
+        "agentkeepalive": "^3.4.1",
+        "bowser": "^1.6.0",
+        "copy-to": "^2.0.1",
+        "dateformat": "^2.0.0",
+        "debug": "^4.3.4",
+        "destroy": "^1.0.4",
+        "end-or-error": "^1.0.1",
+        "get-ready": "^1.0.0",
+        "humanize-ms": "^1.2.0",
+        "is-type-of": "^1.4.0",
+        "js-base64": "^2.5.2",
+        "jstoxml": "^2.0.0",
+        "merge-descriptors": "^1.0.1",
+        "mime": "^2.4.5",
+        "platform": "^1.3.1",
+        "pump": "^3.0.0",
+        "sdk-base": "^2.0.1",
+        "stream-http": "2.8.2",
+        "stream-wormhole": "^1.0.4",
+        "urllib": "2.41.0",
+        "utility": "^1.18.0",
+        "xml2js": "^0.6.2"
+      },
+      "dependencies": {
+        "address": {
+          "version": "1.2.2",
+          "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+          "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA=="
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+        },
+        "readable-stream": {
+          "version": "2.3.8",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+          "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "stream-http": {
+          "version": "2.8.2",
+          "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz",
+          "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==",
+          "requires": {
+            "builtin-status-codes": "^3.0.0",
+            "inherits": "^2.0.1",
+            "readable-stream": "^2.3.6",
+            "to-arraybuffer": "^1.0.0",
+            "xtend": "^4.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
     "alphanum-sort": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
@@ -2227,8 +2311,7 @@
     "any-promise": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
-      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
-      "dev": true
+      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
     },
     "anymatch": {
       "version": "3.1.2",
@@ -2886,6 +2969,11 @@
       "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
       "dev": true
     },
+    "bowser": {
+      "version": "1.9.4",
+      "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
+      "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ=="
+    },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -3087,8 +3175,7 @@
     "builtin-status-codes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
-      "dev": true
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
     },
     "bytes": {
       "version": "3.1.2",
@@ -4001,8 +4088,7 @@
     "content-type": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
-      "dev": true
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
     },
     "convert-source-map": {
       "version": "1.8.0",
@@ -4044,6 +4130,11 @@
       "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
       "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
     },
+    "copy-to": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
+      "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w=="
+    },
     "copy-webpack-plugin": {
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz",
@@ -4804,6 +4895,21 @@
       "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
       "dev": true
     },
+    "debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "requires": {
+        "ms": "2.1.2"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
     "decamelize": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
@@ -4947,6 +5053,14 @@
         }
       }
     },
+    "default-user-agent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz",
+      "integrity": "sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==",
+      "requires": {
+        "os-name": "~1.0.3"
+      }
+    },
     "defaults": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
@@ -5107,8 +5221,7 @@
     "destroy": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
-      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
-      "dev": true
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
     },
     "detect-file": {
       "version": "1.0.0",
@@ -5140,6 +5253,11 @@
         }
       }
     },
+    "digest-header": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-1.1.0.tgz",
+      "integrity": "sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg=="
+    },
     "dir-glob": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
@@ -5386,8 +5504,7 @@
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
-      "dev": true
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
     },
     "ejs": {
       "version": "2.7.4",
@@ -5481,6 +5598,11 @@
         "once": "~1.3.0"
       }
     },
+    "end-or-error": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/end-or-error/-/end-or-error-1.0.1.tgz",
+      "integrity": "sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ=="
+    },
     "enhanced-resolve": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
@@ -5620,8 +5742,7 @@
     "escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
-      "dev": true
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
     },
     "escape-string-regexp": {
       "version": "1.0.5",
@@ -6283,6 +6404,16 @@
         "mime-types": "^2.1.12"
       }
     },
+    "formstream": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.3.1.tgz",
+      "integrity": "sha512-FkW++ub+VbE5dpwukJVDizNWhSgp8FhmhI65pF7BZSVStBqe6Wgxe2Z9/Vhsn7l7nXCPwP+G1cyYlX8VwWOf0g==",
+      "requires": {
+        "destroy": "^1.0.4",
+        "mime": "^2.5.2",
+        "pause-stream": "~0.0.11"
+      }
+    },
     "forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -6470,6 +6601,11 @@
         "has-symbols": "^1.0.1"
       }
     },
+    "get-ready": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz",
+      "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw=="
+    },
     "get-stdin": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
@@ -7713,11 +7849,18 @@
       "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
       "dev": true
     },
+    "humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+      "requires": {
+        "ms": "^2.0.0"
+      }
+    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
       "requires": {
         "safer-buffer": ">= 2.1.2 < 3"
       }
@@ -7913,8 +8056,7 @@
     "ip": {
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
-      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
-      "dev": true
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
     },
     "ip-regex": {
       "version": "2.1.0",
@@ -8015,6 +8157,11 @@
       "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
       "dev": true
     },
+    "is-class-hotfix": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz",
+      "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ=="
+    },
     "is-color-stop": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
@@ -8263,6 +8410,16 @@
         "has-symbols": "^1.0.2"
       }
     },
+    "is-type-of": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.4.0.tgz",
+      "integrity": "sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==",
+      "requires": {
+        "core-util-is": "^1.0.2",
+        "is-class-hotfix": "~0.0.6",
+        "isstream": "~0.1.2"
+      }
+    },
     "is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -8472,6 +8629,11 @@
         "verror": "1.10.0"
       }
     },
+    "jstoxml": {
+      "version": "2.2.9",
+      "resolved": "https://registry.npmjs.org/jstoxml/-/jstoxml-2.2.9.tgz",
+      "integrity": "sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw=="
+    },
     "killable": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
@@ -9034,8 +9196,7 @@
     "merge-descriptors": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
-      "dev": true
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
     },
     "merge-source-map": {
       "version": "1.1.0",
@@ -9113,8 +9274,7 @@
     "mime": {
       "version": "2.6.0",
       "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
-      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
-      "dev": true
+      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="
     },
     "mime-db": {
       "version": "1.52.0",
@@ -9315,7 +9475,6 @@
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
       "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
-      "dev": true,
       "requires": {
         "any-promise": "^1.0.0",
         "object-assign": "^4.0.1",
@@ -9325,8 +9484,7 @@
         "object-assign": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-          "dev": true
+          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
         }
       }
     },
@@ -9955,6 +10113,15 @@
       "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
       "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
     },
+    "os-name": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz",
+      "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==",
+      "requires": {
+        "osx-release": "^1.0.0",
+        "win-release": "^1.0.0"
+      }
+    },
     "os-tmpdir": {
       "version": "1.0.2",
       "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz",
@@ -9969,6 +10136,14 @@
         "os-tmpdir": "^1.0.0"
       }
     },
+    "osx-release": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz",
+      "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==",
+      "requires": {
+        "minimist": "^1.1.0"
+      }
+    },
     "p-finally": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -10227,6 +10402,14 @@
         }
       }
     },
+    "pause-stream": {
+      "version": "0.0.11",
+      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+      "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==",
+      "requires": {
+        "through": "~2.3"
+      }
+    },
     "pbkdf2": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
@@ -10385,6 +10568,11 @@
         }
       }
     },
+    "platform": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
+      "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="
+    },
     "plugin-error": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
@@ -11699,7 +11887,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
       "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "dev": true,
       "requires": {
         "end-of-stream": "^1.1.0",
         "once": "^1.3.1"
@@ -11709,7 +11896,6 @@
           "version": "1.4.4",
           "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
           "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-          "dev": true,
           "requires": {
             "once": "^1.4.0"
           },
@@ -11718,7 +11904,6 @@
               "version": "1.4.0",
               "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
               "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-              "dev": true,
               "requires": {
                 "wrappy": "1"
               }
@@ -12497,8 +12682,7 @@
     "sax": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-      "dev": true
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
     "schema-utils": {
       "version": "3.1.1",
@@ -12529,6 +12713,14 @@
         }
       }
     },
+    "sdk-base": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/sdk-base/-/sdk-base-2.0.1.tgz",
+      "integrity": "sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==",
+      "requires": {
+        "get-ready": "~1.0.0"
+      }
+    },
     "select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -13222,8 +13414,7 @@
     "statuses": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
-      "dev": true
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
     },
     "stdout-stream": {
       "version": "1.4.1",
@@ -13396,6 +13587,11 @@
       "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
       "dev": true
     },
+    "stream-wormhole": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz",
+      "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew=="
+    },
     "strict-uri-encode": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
@@ -13774,7 +13970,6 @@
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
       "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
-      "dev": true,
       "requires": {
         "any-promise": "^1.0.0"
       }
@@ -13783,7 +13978,6 @@
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
       "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
-      "dev": true,
       "requires": {
         "thenify": ">= 3.1.0 < 4"
       }
@@ -13884,8 +14078,7 @@
     "to-arraybuffer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
-      "dev": true
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
     },
     "to-fast-properties": {
       "version": "2.0.0",
@@ -14081,6 +14274,24 @@
       "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
       "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
     },
+    "unescape": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz",
+      "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==",
+      "requires": {
+        "extend-shallow": "^2.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
     "unicode-canonical-property-names-ecmascript": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -14291,6 +14502,37 @@
         "requires-port": "^1.0.0"
       }
     },
+    "urllib": {
+      "version": "2.41.0",
+      "resolved": "https://registry.npmjs.org/urllib/-/urllib-2.41.0.tgz",
+      "integrity": "sha512-pNXdxEv52L67jahLT+/7QE+Fup1y2Gc6EdmrAhQ6OpQIC2rl14oWwv9hvk1GXOZqEnJNwRXHABuwgPOs1CtL7g==",
+      "requires": {
+        "any-promise": "^1.3.0",
+        "content-type": "^1.0.2",
+        "debug": "^2.6.9",
+        "default-user-agent": "^1.0.0",
+        "digest-header": "^1.0.0",
+        "ee-first": "~1.1.1",
+        "formstream": "^1.1.0",
+        "humanize-ms": "^1.2.0",
+        "iconv-lite": "^0.4.15",
+        "ip": "^1.1.5",
+        "pump": "^3.0.0",
+        "qs": "^6.4.0",
+        "statuses": "^1.3.1",
+        "utility": "^1.16.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
     "use": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -14341,6 +14583,18 @@
       "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
       "dev": true
     },
+    "utility": {
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/utility/-/utility-1.18.0.tgz",
+      "integrity": "sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==",
+      "requires": {
+        "copy-to": "^2.0.1",
+        "escape-html": "^1.0.3",
+        "mkdirp": "^0.5.1",
+        "mz": "^2.7.0",
+        "unescape": "^1.0.1"
+      }
+    },
     "utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -15294,6 +15548,21 @@
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
+    "win-release": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz",
+      "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==",
+      "requires": {
+        "semver": "^5.0.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.7.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+          "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
+        }
+      }
+    },
     "worker-farm": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
@@ -15390,6 +15659,20 @@
         "async-limiter": "~1.0.0"
       }
     },
+    "xml2js": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
+      "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
+      "requires": {
+        "sax": ">=0.6.0",
+        "xmlbuilder": "~11.0.0"
+      }
+    },
+    "xmlbuilder": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
+    },
     "xss": {
       "version": "1.0.14",
       "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz",
diff --git a/package.json b/package.json
index 748f928..8163e32 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,7 @@
     "build": "vue-cli-service build"
   },
   "dependencies": {
+    "ali-oss": "^6.18.1",
     "axios": "^0.26.1",
     "babel-polyfill": "^6.26.0",
     "core-js": "^2.6.10",
diff --git a/src/layouts/home/index.vue b/src/layouts/home/index.vue
index 2f5003b..2c88771 100644
--- a/src/layouts/home/index.vue
+++ b/src/layouts/home/index.vue
@@ -1,41 +1,60 @@
 <template>
-    <div class="main">
-        <v-head></v-head>
-        <div class="layout">
-            <div class="content">
-                <transition name="move" mode="out-in">
-                    <router-view class="view"></router-view>
-                </transition>
-                <el-backtop target=".content"></el-backtop>
-                <v-footer ref="footer"></v-footer>
-            </div>
-            <div class="log-mask" v-if="logVisible"></div>
-            <div class="log-dia" v-if="logVisible">
-              <img class="bg1" src="@/assets/img/log-bg.png" alt="">
-              <img class="bg2" src="@/assets/img/log-bg1.png" alt="">
-              <p class="log-title">更新日志</p>
-              <div class="log-wrap">
-                <div class="logs">
-                  <div class="item" v-for="(item, i) in list" :key="i" v-show="!i || (i && logAll)">
-                    <h6>{{ item.versionName }}</h6>
-                    <img v-if="item.coverUrl" :src="item.coverUrl" alt="" class="cover">
-                    <ul class="detail">
-                      <li v-for="(item, i) in item.logContents" :key="i">
-                        <p class="name"><img :src="require('@/assets/img/' + funcList.find(e => e.id === item.type).icon + '.png')" alt=""> {{ funcList.find(e => e.id === item.type).name }}</p>
-                        <div class="val">
-                          <p v-for="(item, i) in item.content" :key="i">{{ i + 1 }}、{{ item }}</p>
-                        </div>
-                      </li>
-                    </ul>
+  <div class="main">
+    <v-head></v-head>
+    <div class="layout">
+      <div class="content">
+        <transition name="move"
+                    mode="out-in">
+          <router-view class="view"></router-view>
+        </transition>
+        <el-backtop target=".content"></el-backtop>
+        <v-footer ref="footer"></v-footer>
+      </div>
+      <div class="log-mask"
+           v-if="logVisible"></div>
+      <div class="log-dia"
+           v-if="logVisible">
+        <img class="bg1"
+             src="@/assets/img/log-bg.png"
+             alt="">
+        <img class="bg2"
+             src="@/assets/img/log-bg1.png"
+             alt="">
+        <p class="log-title">更新日志</p>
+        <div class="log-wrap">
+          <div class="logs">
+            <div class="item"
+                 v-for="(item, i) in list"
+                 :key="i"
+                 v-show="!i || (i && logAll)">
+              <h6>{{ item.versionName }}</h6>
+              <img v-if="item.coverUrl"
+                   :src="item.coverUrl"
+                   alt=""
+                   class="cover">
+              <ul class="detail">
+                <li v-for="(item, i) in item.logContents"
+                    :key="i">
+                  <p class="name"><img :src="require('@/assets/img/' + funcList.find(e => e.id === item.type).icon + '.png')"
+                         alt=""> {{ funcList.find(e => e.id === item.type).name }}</p>
+                  <div class="val">
+                    <p v-for="(item, i) in item.content"
+                       :key="i">{{ i + 1 }}、{{ item }}</p>
                   </div>
-                </div>
-                <div class="more-wrap">
-                  <el-button class="know" type="primary" size="small" @click="closeLog">知道了</el-button>
-                </div>
-              </div>
+                </li>
+              </ul>
             </div>
+          </div>
+          <div class="more-wrap">
+            <el-button class="know"
+                       type="primary"
+                       size="small"
+                       @click="closeLog">知道了</el-button>
+          </div>
         </div>
+      </div>
     </div>
+  </div>
 </template>
 
 <script>
@@ -46,211 +65,211 @@ import vHead from "../header";
 import vFooter from "../footer";
 
 export default {
-    data() {
-        return {
-            logVisible: false,
-            list: [],
-            logAll: false,
-            funcList: [
-                {
-                    id: 0,
-                    name: '新功能',
-                    icon: 'func'
-                },
-                {
-                    id: 1,
-                    name: '修复',
-                    icon: 'bug'
-                },
-                {
-                    id: 2,
-                    name: '优化',
-                    icon: 'optimize'
-                }
-            ]
-        };
+  data () {
+    return {
+      logVisible: false,
+      list: [],
+      logAll: false,
+      funcList: [
+        {
+          id: 0,
+          name: '新功能',
+          icon: 'func'
+        },
+        {
+          id: 1,
+          name: '修复',
+          icon: 'bug'
+        },
+        {
+          id: 2,
+          name: '优化',
+          icon: 'optimize'
+        }
+      ]
+    };
+  },
+  components: {
+    vHead,
+    vFooter
+  },
+  computed: {
+    ...mapState("user", [
+      'logView'
+    ]),
+    ...mapState("match", [
+      'noticed'
+    ])
+  },
+  mounted () {
+    this.autoLogout()
+    this.noticed || this.getMatchStatus() // 0才要调用
+    this.logView || this.getLogStatus() // logView为false才需要查询接口
+  },
+  methods: {
+    ...mapMutations("user", [
+      'SET_LOG'
+    ]),
+    ...mapMutations("match", [
+      'SET_NOTICE'
+    ]),
+    ...mapActions("user", [
+      "logout"
+    ]),
+    // 提示赛事状态(登录后调用一次)
+    getMatchStatus () {
+      util.local.get(Setting.tokenKey) && this.$post(this.api.promptRemoval).then(({ prompt }) => {
+        this.SET_NOTICE()
+        prompt && util.errorMsg(prompt)
+      }).catch(res => { })
     },
-    components: {
-        vHead,
-        vFooter
+    // 获取日志列表
+    getLog () {
+      this.$get(`${this.api.platformLogList}?platformId=${Setting.platformId}&port=1&versionName=`).then(({ logList }) => {
+        logList.map((e, i) => {
+          e.logContents.map(n => {
+            n.content = n.content.split('\n')
+          })
+        })
+        this.list = logList
+      }).catch(res => { })
     },
-    computed: {
-        ...mapState("user", [
-            'logView'
-        ]),
-        ...mapState("match", [
-            'noticed'
-        ])
+    // 获取日志状态
+    getLogStatus () {
+      util.local.get(Setting.tokenKey) && this.$get(this.api.logNotification, {
+        platformId: Setting.platformId
+      }).then(({ notification }) => {
+        if (notification) {
+          this.logVisible = true // 返回true,则显示日志弹框
+          this.getLog()
+        } else {
+          this.SET_LOG() // 把查看日志状态设置为true
+        }
+      }).catch(res => { })
     },
-    mounted() {
-        this.autoLogout()
-        this.noticed || this.getMatchStatus() // 0才要调用
-        this.logView || this.getLogStatus() // logView为false才需要查询接口
+    // 关闭日志弹框
+    closeLog () {
+      this.logVisible = false
+      this.SET_LOG() // 把查看日志状态设置为true
     },
-    methods: {
-        ...mapMutations("user", [
-            'SET_LOG'
-        ]),
-        ...mapMutations("match", [
-            'SET_NOTICE'
-        ]),
-        ...mapActions("user", [
-            "logout"
-        ]),
-        // 提示赛事状态(登录后调用一次)
-        getMatchStatus() {
-          util.local.get(Setting.tokenKey) && this.$post(this.api.promptRemoval).then(({ prompt }) => {
-            this.SET_NOTICE()
-            prompt && util.errorMsg(prompt)
-          }).catch(res => {})
-        },
-        // 获取日志列表
-        getLog() {
-          this.$get(`${this.api.platformLogList}?platformId=${Setting.platformId}&port=1&versionName=`).then(({ logList }) => {
-            logList.map((e, i) => {
-              e.logContents.map(n => {
-                n.content = n.content.split('\n')
-              })
-            })
-            this.list = logList
-          }).catch(res => {})
-        },
-        // 获取日志状态
-        getLogStatus() {
-            util.local.get(Setting.tokenKey) && this.$get(this.api.logNotification, {
-              platformId: Setting.platformId
-            }).then(({ notification }) => {
-              if (notification) {
-                this.logVisible = true // 返回true,则显示日志弹框
-                this.getLog()
-              } else {
-                this.SET_LOG() // 把查看日志状态设置为true
-              }
-            }).catch(res => {})
-        },
-        // 关闭日志弹框
-        closeLog() {
-          this.logVisible = false
-          this.SET_LOG() // 把查看日志状态设置为true
-        },
-        // 长时间未操作,自动退出登录
-        autoLogout() {
-            let lastTime = new Date().getTime();
-            document.onmousedown = () => {
-                lastTime = new Date().getTime();
-            };
+    // 长时间未操作,自动退出登录
+    autoLogout () {
+      let lastTime = new Date().getTime();
+      document.onmousedown = () => {
+        lastTime = new Date().getTime();
+      };
 
-            setInterval(() => {
-                if (util.local.get(Setting.tokenKey) && (new Date().getTime() - lastTime) > Setting.autoLogoutTime) {
-                    util.errorMsg("用户登录过期,请重新登录");
-                    setTimeout(this.logout, 1500);
-                }
-            }, 1000);
+      setInterval(() => {
+        if (util.local.get(Setting.tokenKey) && (new Date().getTime() - lastTime) > Setting.autoLogoutTime) {
+          util.errorMsg("由于您已经有一个小时没有操作,系统自动登出,请重新登录。页面刷新到登录页。");
+          setTimeout(this.logout, 1500);
         }
+      }, 1000);
     }
+  }
 };
 </script>
 <style lang="scss" scoped>
-.main{
+.main {
     min-height: calc(100% - 64px);
-    .layout{
+    .layout {
         padding-top: 64px;
     }
-    .index{
+    .index {
         padding: 0;
     }
 }
 .log-mask {
-  position: fixed;
-  top: 0;
-  left: 0;
-  bottom: 0;
-  right: 0;
-  background-color: rgba(0, 0, 0, .4);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    background-color: rgba(0, 0, 0, 0.4);
 }
 /deep/.log-dia {
-  z-index: 11;
-  position: absolute;
-  top: 250px;
-  left: 50%;
-  width: 550px;
-  transform: translateX(-50%);
-  background-color: #fff;
-  border-radius: 6px;
-  .bg1 {
-    width: 100%;
-    height: 140px;
-  }
-  .bg2 {
+    z-index: 11;
     position: absolute;
-    top: -130px;
-    left: 48px;
-    max-width: 100%;
-    height: 250px;
-  }
-  .log-title {
-    position: absolute;
-    top: 65px;
-    left: 0;
-    width: 100%;
-    text-align: center;
-    font-size: 22px;
-    color: #fff;
-    font-weight: 600;
-  }
-  .log-wrap {
-    padding-bottom: 30px;
-  }
-  .logs {
-    max-height: 250px;
-    padding: 0 100px;
-    margin: 30px 0;
-    overflow: auto;
-  }
-  h6 {
-    margin-bottom: 15px;
-    font-size: 16px;
-    color: #333;
-    line-height: 1;
-  }
-  .more-wrap {
-    padding: 0 60px;
-    font-size: 14px;
-    color: #333;
-    text-align: center;
-  }
-  .know {
-    margin-top: 15px;
-  }
-  .cover {
-      max-width: 250px;
-      max-height: 160px;
-      margin: 10px 0 20px;
-  }
-  .detail {
-    li {
-        margin-bottom: 20px;
+    top: 250px;
+    left: 50%;
+    width: 550px;
+    transform: translateX(-50%);
+    background-color: #fff;
+    border-radius: 6px;
+    .bg1 {
+        width: 100%;
+        height: 140px;
+    }
+    .bg2 {
+        position: absolute;
+        top: -130px;
+        left: 48px;
+        max-width: 100%;
+        height: 250px;
+    }
+    .log-title {
+        position: absolute;
+        top: 65px;
+        left: 0;
+        width: 100%;
+        text-align: center;
+        font-size: 22px;
+        color: #fff;
+        font-weight: 600;
+    }
+    .log-wrap {
+        padding-bottom: 30px;
     }
-    .name {
-        display: flex;
-        align-items: center;
-        margin-bottom: 5px;
+    .logs {
+        max-height: 250px;
+        padding: 0 100px;
+        margin: 30px 0;
+        overflow: auto;
+    }
+    h6 {
+        margin-bottom: 15px;
+        font-size: 16px;
+        color: #333;
+        line-height: 1;
+    }
+    .more-wrap {
+        padding: 0 60px;
         font-size: 14px;
-        img {
-            width: 20px;
-            margin-right: 8px;
-        }
+        color: #333;
+        text-align: center;
+    }
+    .know {
+        margin-top: 15px;
     }
-    .val {
-        font-size: 15px;
-        line-height: 1.8;
-        white-space: pre-wrap;
-        p {
-          position: relative;
-          font-size: 13px;
-          color: #727272;
+    .cover {
+        max-width: 250px;
+        max-height: 160px;
+        margin: 10px 0 20px;
+    }
+    .detail {
+        li {
+            margin-bottom: 20px;
+        }
+        .name {
+            display: flex;
+            align-items: center;
+            margin-bottom: 5px;
+            font-size: 14px;
+            img {
+                width: 20px;
+                margin-right: 8px;
+            }
+        }
+        .val {
+            font-size: 15px;
+            line-height: 1.8;
+            white-space: pre-wrap;
+            p {
+                position: relative;
+                font-size: 13px;
+                color: #727272;
+            }
         }
     }
-  }
 }
 </style>
\ No newline at end of file
diff --git a/src/pages/ass/list/index.vue b/src/pages/ass/list/index.vue
index 1474c77..440988c 100644
--- a/src/pages/ass/list/index.vue
+++ b/src/pages/ass/list/index.vue
@@ -498,7 +498,7 @@ export default {
       util.cookies.set("token", token)
       util.cookies.set("assessmentId", this.assessmentId)
       util.cookies.set("classId", classId)
-      util.cookies.set("className", classItem ? encodeURI(classItem.className) : '')
+      util.cookies.set("className", classItem ? encodeURIComponent(classItem.className) : '')
       util.cookies.set("projectId", this.projectId)
       util.cookies.set("courseId", this.cid)
       util.cookies.set("curriculumName", escape(row.sysName));
diff --git a/src/pages/match/details/index.vue b/src/pages/match/details/index.vue
index 38d37dd..2f95792 100644
--- a/src/pages/match/details/index.vue
+++ b/src/pages/match/details/index.vue
@@ -620,23 +620,32 @@
     <el-dialog title="阶段赛名称"
                :visible.sync="stageVisible"
                :close-on-click-modal="false"
-               width="600px">
+               width="600px"
+               @close="stageClose">
       <template v-if="curStage && curStage.competitionStageContentSetting">
-        <el-button v-if="curStage.competitionStageContentSetting.systemLink"
-                   type="text"
-                   style="font-size: 13px"
-                   @click="toOffline">进入{{ curStage.stageName }}</el-button>
-        <div v-if="curStage.competitionStageContentSetting.fileUrl"
-             class="flex a-center m-b-10">
-          <p class="m-r-10"
-             style="font-size: 13px">文件下载:{{ curStage.competitionStageContentSetting.fileName }}</p>
-          <el-button type="text"
+        <div>
+          <span class="fs-14">进入比赛:</span>
+          <el-button v-if="curStage.competitionStageContentSetting.systemLink"
+                     type="danger"
                      style="font-size: 13px"
-                     @click="download({fileName: curStage.competitionStageContentSetting.fileName, filePath: curStage.competitionStageContentSetting.fileUrl})">点击下载</el-button>
+                     @click="toOffline">进入{{ curStage.stageName }}</el-button>
+        </div>
+        <div v-if="curStage.competitionStageContentSetting.fileUrl"
+             class="flex m-b-20 fs-14">
+          <span style="padding-top: 7px">文件下载:</span>
+          <div>
+            <div v-for="(file, i) in curStage.competitionStageContentSetting.fileList"
+                 :key="i">
+              <span style="margin-right: 10px;color: #606266;">{{ file.name }}</span>
+              <el-button type="text"
+                         style="font-size: 14px"
+                         @click="download({fileName: file.name, filePath: file.url})">点击下载</el-button>
+            </div>
+          </div>
         </div>
 
         <div class="flex m-b-20">
-          <span style="font-size: 12px">文件上传:</span>
+          <span class="fs-14">文件上传:</span>
           <el-upload :before-upload="beforeUpload"
                      :on-remove="handleRemove"
                      :on-error="uploadError"
@@ -646,26 +655,28 @@
                      :on-exceed="handleExceed"
                      :action="api.fileUploadNakadai"
                      :headers="headers"
+                     :file-list="fileList"
                      name="file">
             <el-button size="small"
-                       type="primary">上传试卷</el-button>
+                       type="primary">上传文件</el-button>
             <div slot="tip"
                  class="el-upload__tip">
+
+              <el-progress v-if="showProgress"
+                           :stroke-width="3"
+                           :percentage="progressPercent"></el-progress>
               <p>请上传大小1G以内的文件,支持常见文件格式。</p>
               <p>只允许上传一个文件,如有多个文件则需打包再上传。</p>
             </div>
           </el-upload>
         </div>
 
-        <div>说明:{{ curStage.competitionStageContentSetting.stageExplain }}</div>
+        <div class="fs-14">说明:{{ curStage.competitionStageContentSetting.stageExplain }}</div>
       </template>
       <span slot="footer"
             class="dialog-footer">
         <el-button size="small"
-                   type="primary"
-                   @click="stageSubmit">提交</el-button>
-        <el-button size="small"
-                   @click="stageVisible = false">取消</el-button>
+                   @click="stageVisible = false">关闭</el-button>
       </span>
     </el-dialog>
   </div>
@@ -677,6 +688,7 @@ import breadcrumb from '@/components/breadcrumb'
 import util from '@/libs/util'
 import Setting from "@/setting"
 import Const from '@/const/match'
+import axios from 'axios'
 export default {
   name: 'matchdetail',
   data () {
@@ -791,7 +803,11 @@ export default {
       submiting: false,
 
       stageVisible: false,
-      filesResult: {}
+      filesResult: {},
+      fileList: [],
+      curFileId: '',
+      showProgress: false,
+      progressPercent: 0,
     };
   },
   computed: {
@@ -1419,6 +1435,7 @@ export default {
       const oversize = file.size / 1024 / 1024 < 1000
       if (!oversize) util.warningMsg('请上传小于1GB的附件!')
       if (oversize) {
+        this.showProgress = true
         return true
       } else {
         return false
@@ -1437,31 +1454,40 @@ export default {
     handleExceed (files, fileList) {
       util.warningMsg(`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`);
     },
-    handleRemove (file, fileList) { },
-    uploadSuccess (res) {
-      this.filesResult = res.filesResult
+    // 删除文件表里的文件
+    handleRemove () {
+      this.curFileId && this.$post(this.api.cCompetitionStageFileDel, [this.curFileId]).then(res => {
+        this.curFileId = ''
+      }).catch(res => { })
     },
-    // 提交阶段内容
-    stageSubmit () {
-      if (this.submiting) return false
-      this.submiting = true
+    uploadSuccess (res) {
+      const result = res.filesResult
       // 有上传记录,则删除上次的文件
-      this.curStage.competitionStageFile && this.$post(this.api.cCompetitionStageFileDel, [this.curStage.competitionStageFile.id]).then(res => { }).catch(res => { })
+      this.handleRemove()
       this.$post(this.api.cCompetitionStageFileSave, {
         competitionId: this.id,
-        fileFormat: this.filesResult.fileType,
-        fileName: this.filesResult.originalFileName,
-        filePath: this.filesResult.fileUrl,
-        fileSize: this.filesResult.fileSize,
-        ossFileName: this.filesResult.ossFileName,
+        fileFormat: result.fileType,
+        fileName: result.originalFileName,
+        filePath: result.fileUrl,
+        fileSize: result.fileSize,
+        ossFileName: result.ossFileName,
         stageId: this.curStage.stageId,
         teamId: this.form.competitionRegistration.teamId
       }).then(res => {
-        util.successMsg('提交成功!')
-        this.stageVisible = false
-        this.submiting = false
+        this.curFileId = res.message
+        util.successMsg(`上传成功!`);
       }).catch(res => { })
     },
+    // 提交阶段内容
+    stageSubmit () {
+      if (this.submiting) return false
+      this.submiting = true
+    },
+    // 阶段弹框关闭回调
+    stageClose () {
+      this.fileList = []
+      this.getData()
+    },
 
     // 选择要进入的阶段
     chooseStage (e) {
@@ -1498,7 +1524,28 @@ export default {
               window.open(this.curStage.competitionStageContentSetting.systemLink)
             } else { // 显示上传文件弹框
               this.stageVisible = true
-              console.log("🚀 ~ file: index.vue:1499 ~ signup ~ this.curStage:", this.curStage)
+
+              // 文件路径名称处理
+              if (this.curStage.competitionStageContentSetting && this.curStage.competitionStageContentSetting.fileUrl) {
+                const urls = this.curStage.competitionStageContentSetting.fileUrl.split('|')
+                const names = this.curStage.competitionStageContentSetting.fileName.split('|')
+                this.curStage.competitionStageContentSetting.fileList = []
+                urls.map((n, i) => {
+                  this.curStage.competitionStageContentSetting.fileList.push({
+                    name: names[i],
+                    url: n
+                  })
+                })
+              }
+
+              const file = this.curStage.competitionStageFile
+              if (file) {
+                this.curFileId = file.id
+                this.fileList = [{
+                  name: file.fileName,
+                  url: file.filePath,
+                }]
+              }
             }
           } else {
             // 参加过比赛不让参加
@@ -1568,7 +1615,7 @@ export default {
       util.cookies.set('projectId', form.projectId)
       util.cookies.set('token', token)
       util.cookies.set('courseId', form.cid)
-      util.cookies.set('curriculumName', escape(form.systemName))
+      util.cookies.set('curriculumName', encodeURIComponent(form.systemName))
       util.cookies.set('systemId', form.systemId)
       util.cookies.set('isSubmit', '', -1)
       util.cookies.set('competitionId', this.form.id)
@@ -1989,4 +2036,7 @@ export default {
         align-items: center;
     }
 }
+/deep/.el-upload__tip {
+    color: #727272;
+}
 </style>
\ No newline at end of file
diff --git a/src/pages/match/list/index.vue b/src/pages/match/list/index.vue
index 81cfcd9..caff19c 100644
--- a/src/pages/match/list/index.vue
+++ b/src/pages/match/list/index.vue
@@ -267,23 +267,32 @@
     <el-dialog title="阶段赛名称"
                :visible.sync="stageVisible"
                :close-on-click-modal="false"
-               width="600px">
+               width="600px"
+               @close="stageClose">
       <template v-if="curStageItem && curStageItem.competitionStageContentSetting">
-        <el-button v-if="curStageItem.competitionStageContentSetting.systemLink"
-                   type="text"
-                   style="font-size: 13px"
-                   @click="toOffline">进入{{ curStageItem.stageName }}</el-button>
-        <div v-if="curStageItem.competitionStageContentSetting.fileUrl"
-             class="flex a-center m-b-10">
-          <p class="m-r-10"
-             style="font-size: 13px">文件下载:{{ curStageItem.competitionStageContentSetting.fileName }}</p>
-          <el-button type="text"
+        <div>
+          <span class="fs-14">进入比赛:</span>
+          <el-button v-if="curStageItem.competitionStageContentSetting.systemLink"
+                     type="danger"
                      style="font-size: 13px"
-                     @click="download({fileName: curStageItem.competitionStageContentSetting.fileName, filePath: curStageItem.competitionStageContentSetting.fileUrl})">点击下载</el-button>
+                     @click="toOffline">进入{{ curStageItem.stageName }}</el-button>
+        </div>
+        <div v-if="curStageItem.competitionStageContentSetting.fileUrl"
+             class="flex m-b-20 fs-14">
+          <span style="padding-top: 7px">文件下载:</span>
+          <div>
+            <div v-for="file in curStageItem.competitionStageContentSetting.fileList"
+                 :key="file">
+              <span style="margin-right: 10px;color: #606266;">{{ file.name }}</span>
+              <el-button type="text"
+                         style="font-size: 14px"
+                         @click="download({fileName: file.name, filePath: file.url})">点击下载</el-button>
+            </div>
+          </div>
         </div>
 
         <div class="flex m-b-20">
-          <span style="font-size: 12px">文件上传:</span>
+          <span class="fs-14">文件上传:</span>
           <el-upload :before-upload="beforeUpload"
                      :on-remove="handleRemove"
                      :on-error="uploadError"
@@ -293,9 +302,10 @@
                      :on-exceed="handleExceed"
                      :action="api.fileUploadNakadai"
                      :headers="headers"
+                     :file-list="fileList"
                      name="file">
             <el-button size="small"
-                       type="primary">上传试卷</el-button>
+                       type="primary">上传文件</el-button>
             <div slot="tip"
                  class="el-upload__tip">
               <p>请上传大小1G以内的文件,支持常见文件格式。</p>
@@ -304,15 +314,12 @@
           </el-upload>
         </div>
 
-        <div>说明:{{ curStageItem.competitionStageContentSetting.stageExplain }}</div>
+        <div class="fs-14">说明:{{ curStageItem.competitionStageContentSetting.stageExplain }}</div>
       </template>
       <span slot="footer"
             class="dialog-footer">
         <el-button size="small"
-                   type="primary"
-                   @click="stageSubmit">提交</el-button>
-        <el-button size="small"
-                   @click="stageVisible = false">取消</el-button>
+                   @click="stageVisible = false">关闭</el-button>
       </span>
     </el-dialog>
   </div>
@@ -444,7 +451,9 @@ export default {
 
       stageVisible: false,
       filesResult: {},
-      curStageItem: {}
+      curStageItem: {},
+      fileList: [],
+      curFileId: ''
     };
   },
   computed: {
@@ -767,31 +776,39 @@ export default {
     handleExceed (files, fileList) {
       util.warningMsg(`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`);
     },
-    handleRemove (file, fileList) { },
-    uploadSuccess (res) {
-      this.filesResult = res.filesResult
+    // 删除文件表里的文件
+    handleRemove () {
+      this.curFileId && this.$post(this.api.cCompetitionStageFileDel, [this.curFileId]).then(res => {
+        this.curFileId = ''
+      }).catch(res => { })
     },
-    // 提交阶段内容
-    stageSubmit () {
-      if (this.submiting) return false
-      this.submiting = true
+    uploadSuccess (res) {
+      const result = res.filesResult
       // 有上传记录,则删除上次的文件
-      this.curStageItem.competitionStageFile && this.$post(this.api.cCompetitionStageFileDel, [this.curStageItem.competitionStageFile.id]).then(res => { }).catch(res => { })
+      this.handleRemove()
       this.$post(this.api.cCompetitionStageFileSave, {
         competitionId: this.curItem.id,
-        fileFormat: this.filesResult.fileType,
-        fileName: this.filesResult.originalFileName,
-        filePath: this.filesResult.fileUrl,
-        fileSize: this.filesResult.fileSize,
-        ossFileName: this.filesResult.ossFileName,
+        fileFormat: result.fileType,
+        fileName: result.originalFileName,
+        filePath: result.fileUrl,
+        fileSize: result.fileSize,
+        ossFileName: result.ossFileName,
         stageId: this.curStageItem.stageId,
         teamId: this.curItem.teamId
       }).then(res => {
         util.successMsg('提交成功!')
-        this.stageVisible = false
-        this.submiting = false
       }).catch(res => { })
     },
+    // 提交阶段内容
+    stageSubmit () {
+      if (this.submiting) return false
+      this.submiting = true
+    },
+    // 阶段弹框关闭回调
+    stageClose () {
+      this.fileList = []
+      this.getData()
+    },
     // 下载附件
     download (item) {
       util.downloadFile(item.fileName, item.filePath)
@@ -839,7 +856,28 @@ export default {
             } else { // 显示上传文件弹框
               this.curStageItem = item.curStage
               this.stageVisible = true
-              console.log("🚀 ~ file: index.vue:830 ~ signup ~ this.curItem:", this.curItem.curStage.competitionStageContentSetting.systemLink)
+
+              // 文件路径名称处理
+              if (item.curStage.competitionStageContentSetting && item.curStage.competitionStageContentSetting.fileUrl) {
+                const urls = item.curStage.competitionStageContentSetting.fileUrl.split('|')
+                const names = item.curStage.competitionStageContentSetting.fileName.split('|')
+                item.curStage.competitionStageContentSetting.fileList = []
+                urls.map((n, i) => {
+                  item.curStage.competitionStageContentSetting.fileList.push({
+                    name: names[i],
+                    url: n
+                  })
+                })
+              }
+
+              const file = item.curStage.competitionStageFile
+              if (file) {
+                this.curFileId = file.id
+                this.fileList = [{
+                  name: file.fileName,
+                  url: file.filePath,
+                }]
+              }
             }
           } else {
             // 参加过比赛不让参加
@@ -913,7 +951,7 @@ export default {
       util.cookies.set('projectId', form.projectId)
       util.cookies.set('token', token)
       util.cookies.set('courseId', form.cid)
-      util.cookies.set('curriculumName', escape(form.systemName))
+      util.cookies.set('curriculumName', encodeURIComponent(form.systemName))
       util.cookies.set('systemId', form.systemId)
       util.cookies.set('competitionId', this.curItem.id)
       util.cookies.set('stageId', form.stageId)
@@ -1241,4 +1279,7 @@ export default {
         align-items: center;
     }
 }
+/deep/.el-upload__tip {
+    color: #727272;
+}
 </style>
\ No newline at end of file
diff --git a/src/pages/station/preview/index.vue b/src/pages/station/preview/index.vue
index 1653d14..9035570 100644
--- a/src/pages/station/preview/index.vue
+++ b/src/pages/station/preview/index.vue
@@ -941,7 +941,7 @@ export default {
       projectId ? util.cookies.set('projectId', projectId) : util.cookies.set('projectId', '', -1)
       util.cookies.set('token', token)
       util.cookies.set('courseId', this.courseId)
-      util.cookies.set('curriculumName', escape(this.curriculumName))
+      util.cookies.set('curriculumName', encodeURIComponent(this.curriculumName))
       util.cookies.set('systemId', id)
       util.cookies.set('mallId', this.mallId)
       util.cookies.set('isSubmit', '', -1)
diff --git a/src/setting.js b/src/setting.js
index d94aeec..48748ca 100644
--- a/src/setting.js
+++ b/src/setting.js
@@ -32,7 +32,7 @@ if (isPro) {
     uploadURL = `http://121.37.12.51/`
     host = "http://121.37.12.51/"; // 测试服
     // host = 'https://www.occupationlab.com/' // 正式服
-    host = "http://192.168.31.217:9000/"; // 榕
+    // host = "http://192.168.31.217:9000/"; // 榕
     // host = "http://192.168.31.51:9000/"; // 赓
 } else if (isSq) {
 	zcPath = `10.20.100.204:8883`
@@ -51,7 +51,7 @@ const Setting = {
     uploadURL, // 阿里云oss域名
     systemPath, // 子系统地址前缀
 		sandPath,
-    autoLogoutTime: 3600000000, // 长时间未操作,自动退出登录时间
+    autoLogoutTime: 1000 * 60 * 60, // 长时间未操作,自动退出登录时间
     modalDuration: 3, // 接口请求返回错误时,弹窗的持续时间,单位:秒
     errorModalType: "Message", // 接口请求返回错误时,弹窗的类型,可选值为 Message 或 Notice
     cookiesExpires: 1, // Cookies 默认保存时间,单位:天