Explorar o código

new file: components.d.ts
modified: index.html
modified: package-lock.json
modified: package.json
modified: src/App.vue
new file: src/api/_prefix.ts
new file: src/api/store.ts
new file: src/assets/img/eg.jpg
new file: src/components/AllStore.vue
new file: src/components/SingleStore.vue
modified: src/main.ts
new file: src/router/index.ts
modified: src/style.css
new file: src/utils/request.ts

ZhangXuan %!s(int64=2) %!d(string=hai) anos
pai
achega
bd2ee0ec09
Modificáronse 14 ficheiros con 493 adicións e 26 borrados
  1. 24 0
      components.d.ts
  2. 9 0
      index.html
  3. 241 1
      package-lock.json
  4. 3 1
      package.json
  5. 3 22
      src/App.vue
  6. 10 0
      src/api/_prefix.ts
  7. 18 0
      src/api/store.ts
  8. BIN=BIN
      src/assets/img/eg.jpg
  9. 77 0
      src/components/AllStore.vue
  10. 39 0
      src/components/SingleStore.vue
  11. 9 1
      src/main.ts
  12. 16 0
      src/router/index.ts
  13. 1 1
      src/style.css
  14. 43 0
      src/utils/request.ts

+ 24 - 0
components.d.ts

@@ -0,0 +1,24 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+export {}
+
+declare module 'vue' {
+  export interface GlobalComponents {
+    ElAside: typeof import('element-plus/es')['ElAside']
+    ElAvatar: typeof import('element-plus/es')['ElAvatar']
+    ElCard: typeof import('element-plus/es')['ElCard']
+    ElContainer: typeof import('element-plus/es')['ElContainer']
+    ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
+    ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
+    ElForm: typeof import('element-plus/es')['ElForm']
+    ElFormItem: typeof import('element-plus/es')['ElFormItem']
+    ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElMain: typeof import('element-plus/es')['ElMain']
+    HelloWorld: typeof import('./src/components/HelloWorld.vue')['default']
+    RouterLink: typeof import('vue-router')['RouterLink']
+    RouterView: typeof import('vue-router')['RouterView']
+  }
+}

+ 9 - 0
index.html

@@ -11,3 +11,12 @@
     <script type="module" src="/src/main.ts"></script>
     <script type="module" src="/src/main.ts"></script>
   </body>
   </body>
 </html>
 </html>
+
+<style>
+  html,body,#app{
+    height:100%;
+    width: 100%;
+    margin: 0px;
+    padding: 0px;
+  }
+</style>

+ 241 - 1
package-lock.json

@@ -8,7 +8,9 @@
       "name": "bluewhale-frontend",
       "name": "bluewhale-frontend",
       "version": "0.0.0",
       "version": "0.0.0",
       "dependencies": {
       "dependencies": {
-        "vue": "^3.3.8"
+        "element-plus": "^2.4.3",
+        "vue": "^3.3.8",
+        "vue-router": "^4.2.5"
       },
       },
       "devDependencies": {
       "devDependencies": {
         "@vitejs/plugin-vue": "^4.5.0",
         "@vitejs/plugin-vue": "^4.5.0",
@@ -28,6 +30,22 @@
         "node": ">=6.0.0"
         "node": ">=6.0.0"
       }
       }
     },
     },
+    "node_modules/@ctrl/tinycolor": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@element-plus/icons-vue": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+      "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
     "node_modules/@esbuild/android-arm": {
     "node_modules/@esbuild/android-arm": {
       "version": "0.19.7",
       "version": "0.19.7",
       "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.7.tgz",
       "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.19.7.tgz",
@@ -380,11 +398,43 @@
         "node": ">=12"
         "node": ">=12"
       }
       }
     },
     },
+    "node_modules/@floating-ui/core": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.1.tgz",
+      "integrity": "sha512-QgcKYwzcc8vvZ4n/5uklchy8KVdjJwcOeI+HnnTNclJjs2nYsy23DOCf+sSV1kBwD9yDAoVKCkv/gEPzgQU3Pw==",
+      "dependencies": {
+        "@floating-ui/utils": "^0.1.3"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz",
+      "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==",
+      "dependencies": {
+        "@floating-ui/core": "^1.4.2",
+        "@floating-ui/utils": "^0.1.3"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
+      "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A=="
+    },
     "node_modules/@jridgewell/sourcemap-codec": {
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "version": "1.4.15",
       "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
     },
     },
+    "node_modules/@popperjs/core": {
+      "name": "@sxzz/popperjs-es",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+      "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
     "node_modules/@rollup/rollup-android-arm-eabi": {
     "node_modules/@rollup/rollup-android-arm-eabi": {
       "version": "4.5.2",
       "version": "4.5.2",
       "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.2.tgz",
       "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.5.2.tgz",
@@ -541,6 +591,24 @@
         "win32"
         "win32"
       ]
       ]
     },
     },
+    "node_modules/@types/lodash": {
+      "version": "4.14.202",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
+      "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ=="
+    },
+    "node_modules/@types/lodash-es": {
+      "version": "4.17.12",
+      "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+      "dependencies": {
+        "@types/lodash": "*"
+      }
+    },
+    "node_modules/@types/web-bluetooth": {
+      "version": "0.0.16",
+      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+      "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+    },
     "node_modules/@vitejs/plugin-vue": {
     "node_modules/@vitejs/plugin-vue": {
       "version": "4.5.0",
       "version": "4.5.0",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz",
@@ -628,6 +696,11 @@
         "@vue/shared": "3.3.8"
         "@vue/shared": "3.3.8"
       }
       }
     },
     },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz",
+      "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA=="
+    },
     "node_modules/@vue/language-core": {
     "node_modules/@vue/language-core": {
       "version": "1.8.22",
       "version": "1.8.22",
       "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.22.tgz",
       "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.22.tgz",
@@ -708,6 +781,94 @@
       "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.8.tgz",
       "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.8.tgz",
       "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw=="
       "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw=="
     },
     },
+    "node_modules/@vueuse/core": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz",
+      "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.16",
+        "@vueuse/metadata": "9.13.0",
+        "@vueuse/shared": "9.13.0",
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/core/node_modules/vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vueuse/metadata": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz",
+      "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared": {
+      "version": "9.13.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
+      "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+      "dependencies": {
+        "vue-demi": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared/node_modules/vue-demi": {
+      "version": "0.14.6",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+      "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+      "hasInstallScript": true,
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/async-validator": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
+      "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
+    },
     "node_modules/balanced-match": {
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
       "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -734,12 +895,42 @@
       "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz",
       "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz",
       "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
       "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
     },
     },
+    "node_modules/dayjs": {
+      "version": "1.11.10",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+    },
     "node_modules/de-indent": {
     "node_modules/de-indent": {
       "version": "1.0.2",
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
       "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
       "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
       "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
       "dev": true
       "dev": true
     },
     },
+    "node_modules/element-plus": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.4.3.tgz",
+      "integrity": "sha512-b3q26j+lM4SBqiyzw8HybybGnP2pk4MWgrnzzzYW5qKQUgV6EG1Zg7nMCfgCVccI8tNvZoTiUHb2mFaiB9qT8w==",
+      "dependencies": {
+        "@ctrl/tinycolor": "^3.4.1",
+        "@element-plus/icons-vue": "^2.3.1",
+        "@floating-ui/dom": "^1.0.1",
+        "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+        "@types/lodash": "^4.14.182",
+        "@types/lodash-es": "^4.17.6",
+        "@vueuse/core": "^9.1.0",
+        "async-validator": "^4.2.5",
+        "dayjs": "^1.11.3",
+        "escape-html": "^1.0.3",
+        "lodash": "^4.17.21",
+        "lodash-es": "^4.17.21",
+        "lodash-unified": "^1.0.2",
+        "memoize-one": "^6.0.0",
+        "normalize-wheel-es": "^1.2.0"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
     "node_modules/esbuild": {
     "node_modules/esbuild": {
       "version": "0.19.7",
       "version": "0.19.7",
       "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.19.7.tgz",
       "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.19.7.tgz",
@@ -777,6 +968,11 @@
         "@esbuild/win32-x64": "0.19.7"
         "@esbuild/win32-x64": "0.19.7"
       }
       }
     },
     },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+    },
     "node_modules/estree-walker": {
     "node_modules/estree-walker": {
       "version": "2.0.2",
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
       "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
@@ -805,6 +1001,26 @@
         "he": "bin/he"
         "he": "bin/he"
       }
       }
     },
     },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+    },
+    "node_modules/lodash-unified": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "peerDependencies": {
+        "@types/lodash-es": "*",
+        "lodash": "*",
+        "lodash-es": "*"
+      }
+    },
     "node_modules/lru-cache": {
     "node_modules/lru-cache": {
       "version": "6.0.0",
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
       "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -828,6 +1044,11 @@
         "node": ">=12"
         "node": ">=12"
       }
       }
     },
     },
+    "node_modules/memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+    },
     "node_modules/minimatch": {
     "node_modules/minimatch": {
       "version": "9.0.3",
       "version": "9.0.3",
       "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz",
       "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz",
@@ -857,6 +1078,11 @@
         "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
         "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
       }
       }
     },
     },
+    "node_modules/normalize-wheel-es": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
+    },
     "node_modules/path-browserify": {
     "node_modules/path-browserify": {
       "version": "1.0.1",
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
       "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz",
@@ -1017,6 +1243,20 @@
         }
         }
       }
       }
     },
     },
+    "node_modules/vue-router": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
+      "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
     "node_modules/vue-template-compiler": {
     "node_modules/vue-template-compiler": {
       "version": "2.7.15",
       "version": "2.7.15",
       "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz",
       "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz",

+ 3 - 1
package.json

@@ -9,7 +9,9 @@
     "preview": "vite preview"
     "preview": "vite preview"
   },
   },
   "dependencies": {
   "dependencies": {
-    "vue": "^3.3.8"
+    "element-plus": "^2.4.3",
+    "vue": "^3.3.8",
+    "vue-router": "^4.2.5"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@vitejs/plugin-vue": "^4.5.0",
     "@vitejs/plugin-vue": "^4.5.0",

+ 3 - 22
src/App.vue

@@ -1,30 +1,11 @@
 <script setup lang="ts">
 <script setup lang="ts">
-import HelloWorld from './components/HelloWorld.vue'
+//import SingleStore from './components/SingleStore.vue'
+import AllStore from './components/AllStore.vue'
 </script>
 </script>
 
 
 <template>
 <template>
-  <div>
-    <a href="https://vitejs.dev" target="_blank">
-      <img src="/vite.svg" class="logo" alt="Vite logo" />
-    </a>
-    <a href="https://vuejs.org/" target="_blank">
-      <img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
-    </a>
-  </div>
-  <HelloWorld msg="Vite + Vue" />
+  <AllStore />
 </template>
 </template>
 
 
 <style scoped>
 <style scoped>
-.logo {
-  height: 6em;
-  padding: 1.5em;
-  will-change: filter;
-  transition: filter 300ms;
-}
-.logo:hover {
-  filter: drop-shadow(0 0 2em #646cffaa);
-}
-.logo.vue:hover {
-  filter: drop-shadow(0 0 2em #42b883aa);
-}
 </style>
 </style>

+ 10 - 0
src/api/_prefix.ts

@@ -0,0 +1,10 @@
+export const API_MODULE = '/api'
+
+//用户模块
+export const USER_MODULE= `${API_MODULE}/users`
+//商店模块
+export const STORE_MODULE= `${API_MODULE}/stores`
+//商品模块
+export const PRODUCT_MODULE= `${API_MODULE}/products`
+//图片模块
+export const IMAGE_MODULE= `${API_MODULE}/images`

+ 18 - 0
src/api/store.ts

@@ -0,0 +1,18 @@
+import {axios} from '../utils/request'
+import {STORE_MODULE} from './_prefix'
+
+// 获取全部商店
+export const getAllStore = payload => {
+    return axios.get(`${STORE_MODULE}/all`, payload)
+        .then(res => {
+            return res;
+        })
+}
+
+// 获取指定商店
+export const getStoreById = storeId => {
+    return axios.get(`${STORE_MODULE}/?id=${storeId}`)
+        .then(res => {
+            return res;
+        })
+}

BIN=BIN
src/assets/img/eg.jpg


+ 77 - 0
src/components/AllStore.vue

@@ -0,0 +1,77 @@
+<script setup lang="ts">
+import {getStoreById} from "../api/store.ts";
+import { router } from "../router";
+type StoreList = [
+    {
+        "id": number,
+        "name": string,
+        "logoUrl": string,
+        "rating": number,
+        "number": number,
+        "location": string
+    }
+]
+const storelist:StoreList=[{id:1001, name:'123', logoUrl:'', rating:0, number:0, location:'F4'}]
+
+async function showStore(id:number) {
+    const payload = {id:id}
+
+    getStoreById(payload)
+        .then(res => {
+            console.log(res)
+            const token = res.result
+            localStorage.setItem('token', token)
+            router.push({path:"/singlestore"})
+        })
+}
+    
+</script>
+
+<template>
+    <div class="common-layout">
+      <el-container>
+        <el-header style="background-color: #409EFF; height: auto;"><h1 style="color: white;">商店列表</h1></el-header>
+        <el-main style="width: 80%; margin-left: 10vw">
+            <ul style="list-style: none;">
+                <template v-for="store in storelist" :key="storelist.id">
+                    <li class="item" @click="showStore(store.id)">
+                        <el-container>
+                            <el-aside><el-image :src = "store.logoUrl" style="height: 200px; width: 300px;"></el-image></el-aside>
+                            <el-main style="text-align: left; height: 200px; position: relative;">
+                                <h3 style="text-align: left; margin-top: 0;">商店名称</h3>
+                                <el-space>
+                                    xx个评分
+                                    <el-container>
+                                    <el-icon><Star /></el-icon>
+                                    <el-icon><Star /></el-icon>
+                                    <el-icon><Star /></el-icon>
+                                    <el-icon><Star /></el-icon>
+                                    <el-icon><Star /></el-icon>
+                                    </el-container>
+                                </el-space>
+                                <div style="bottom: 10px; position: absolute;">商店位置</div>
+                            </el-main>
+                        </el-container>
+                    </li>
+                </template>
+            </ul>
+        </el-main>
+      </el-container>
+    </div>
+</template>
+
+<style>
+.item{
+    border: 1px solid black;
+    /*边框合并*/
+    margin:0 0 -1px -1px;
+    position: relative; 
+    z-index: 0;
+}
+ 
+.item:hover{
+    border-color: #409EFF;
+    border-width: medium;
+    z-index: 1;
+}
+</style>

+ 39 - 0
src/components/SingleStore.vue

@@ -0,0 +1,39 @@
+<script setup lang="ts">
+    const url = 'src/assets/img/eg.jpg'
+</script>
+
+<template>
+    <div>
+      <el-container>
+        <el-header>
+          <h1 style="color: white;">XX商店</h1>
+        </el-header>
+          <el-container>
+            <el-aside width="600px">
+              <el-image :src="url" />
+            </el-aside>
+            <el-main>
+              <el-space>
+                xx个评分
+                <el-container>
+                  <el-icon><Star /></el-icon>
+                  <el-icon><Star /></el-icon>
+                  <el-icon><Star /></el-icon>
+                  <el-icon><Star /></el-icon>
+                  <el-icon><Star /></el-icon>
+                </el-container>
+              </el-space>
+            </el-main>
+          </el-container>
+          <el-footer><h2 style="color: white;">地址:</h2></el-footer>
+      </el-container>
+    </div>
+</template>
+
+<style scoped>
+.el-header, .el-footer {
+  max-width: 100%;
+  background-color: #409EFF;
+  height: auto;
+}
+</style>

+ 9 - 1
src/main.ts

@@ -1,5 +1,13 @@
 import { createApp } from 'vue'
 import { createApp } from 'vue'
 import './style.css'
 import './style.css'
 import App from './App.vue'
 import App from './App.vue'
+import ElementPlus from 'element-plus'
+import 'element-plus/dist/index.css'
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
 
 
-createApp(App).mount('#app')
+const app = createApp(App)
+app.use(ElementPlus)
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+  app.component(key, component)
+}
+app.mount('#app')

+ 16 - 0
src/router/index.ts

@@ -0,0 +1,16 @@
+import { createRouter, createWebHistory } from "vue-router";
+import SingleStore from "../components/SingleStore.vue";
+import AllStore from "../components/AllStore.vue";
+
+const router = createRouter({
+    history: createWebHistory(),
+    routes: [{
+        path: '/singlestore',
+        component: SingleStore,
+    },{
+        path: '/allstore',
+        component: AllStore,
+    }]
+})
+
+export {router}

+ 1 - 1
src/style.css

@@ -59,7 +59,7 @@ button:focus-visible {
 }
 }
 
 
 #app {
 #app {
-  max-width: 1280px;
+  max-width: 100%;
   margin: 0 auto;
   margin: 0 auto;
   padding: 2rem;
   padding: 2rem;
   text-align: center;
   text-align: center;

+ 43 - 0
src/utils/request.ts

@@ -0,0 +1,43 @@
+import axios from 'axios';
+
+const service = axios.create({
+    baseURL: 'http://localhost:8080'
+});
+
+function hasToken() {
+    return !(localStorage.getItem('token') == '')
+}
+
+
+
+service.interceptors.request.use(
+    config => {
+        if(hasToken()) {
+            config.headers['token'] = localStorage.getItem('token')
+        }
+        return config
+    },
+    error => {
+        console.log(error);
+        return Promise.reject();
+    }
+);
+
+service.interceptors.response.use(
+    response => {
+        if (response.status === 200) {
+            return response.data;
+        } else {
+            Promise.reject();
+        }
+    },
+    error => {
+        console.log(error);
+        return Promise.reject();
+    }
+);
+
+export default service;
+export {
+    service as axios
+}