Xiao_123 1 год назад
Родитель
Сommit
e0b291bc6b

+ 2 - 4
.env.development

@@ -1,9 +1,7 @@
 NODE_ENV = 'development'
 
-VUE_APP_MODE = 'development'
-
 VITE_APP_TITLE = 门墩儿招聘
 
-VUE_APP_BASE_API = 'http://192.168.3.86:83/op/base'
+VITE_BASE_URL = 'http://192.168.3.80/admin-api'
 
-TENANTCODE = ''
+VITE_TENANTCODE = '155'

+ 278 - 10
package-lock.json

@@ -9,10 +9,14 @@
       "version": "0.0.0",
       "dependencies": {
         "@mdi/font": "7.0.96",
+        "axios": "^1.6.8",
         "js-cookie": "^3.0.5",
         "pinia": "^2.1.7",
+        "pinia-plugin-persistedstate": "^3.2.1",
+        "qs": "^6.12.1",
         "roboto-fontface": "*",
         "vue": "^3.4.0",
+        "vue-i18n": "9",
         "vue-router": "^4.3.0",
         "vuetify": "^3.5.0"
       },
@@ -475,6 +479,47 @@
       "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
       "dev": true
     },
+    "node_modules/@intlify/core-base": {
+      "version": "9.13.1",
+      "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.13.1.tgz",
+      "integrity": "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w==",
+      "dependencies": {
+        "@intlify/message-compiler": "9.13.1",
+        "@intlify/shared": "9.13.1"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/message-compiler": {
+      "version": "9.13.1",
+      "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.13.1.tgz",
+      "integrity": "sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w==",
+      "dependencies": {
+        "@intlify/shared": "9.13.1",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
+    "node_modules/@intlify/shared": {
+      "version": "9.13.1",
+      "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.13.1.tgz",
+      "integrity": "sha512-u3b6BKGhE6j/JeRU6C/RL2FgyJfy6LakbtfeVF8fJXURpZZTzfh3e05J0bu0XPw447Q6/WUp3C4ajv4TMS4YsQ==",
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      }
+    },
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
@@ -984,8 +1029,17 @@
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
-      "dev": true
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/axios": {
+      "version": "1.6.8",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz",
+      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
+      "dependencies": {
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
     },
     "node_modules/balanced-match": {
       "version": "1.0.2",
@@ -1030,6 +1084,24 @@
         "node": ">=8"
       }
     },
+    "node_modules/call-bind": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
+      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "set-function-length": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/callsites": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
@@ -1107,7 +1179,6 @@
       "version": "1.0.8",
       "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
       "dependencies": {
         "delayed-stream": "~1.0.0"
       },
@@ -1206,11 +1277,26 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
       "dev": true
     },
+    "node_modules/define-data-property": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+      "dependencies": {
+        "es-define-property": "^1.0.0",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "dev": true,
       "engines": {
         "node": ">=0.4.0"
       }
@@ -1235,6 +1321,25 @@
         "node": ">=0.12"
       }
     },
+    "node_modules/es-define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
+      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/esbuild": {
       "version": "0.20.2",
       "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.20.2.tgz",
@@ -1596,11 +1701,29 @@
       "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
       "dev": true
     },
+    "node_modules/follow-redirects": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/form-data": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
       "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "dev": true,
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
@@ -1632,8 +1755,25 @@
     "node_modules/function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "dev": true
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/glob": {
       "version": "7.2.3",
@@ -1676,6 +1816,17 @@
         "node": ">=8"
       }
     },
+    "node_modules/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/graphemer": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz",
@@ -1691,11 +1842,43 @@
         "node": ">=8"
       }
     },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+      "dependencies": {
+        "es-define-property": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
+      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/hasown": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dev": true,
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -2066,7 +2249,6 @@
       "version": "1.52.0",
       "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "dev": true,
       "engines": {
         "node": ">= 0.6"
       }
@@ -2075,7 +2257,6 @@
       "version": "2.1.35",
       "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dev": true,
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -2142,6 +2323,14 @@
       "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==",
       "dev": true
     },
+    "node_modules/object-inspect": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz",
+      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
@@ -2282,6 +2471,14 @@
         }
       }
     },
+    "node_modules/pinia-plugin-persistedstate": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.1.tgz",
+      "integrity": "sha512-MK++8LRUsGF7r45PjBFES82ISnPzyO6IZx3CH5vyPseFLZCk1g2kgx6l/nW8pEBKxxd4do0P6bJw+mUSZIEZUQ==",
+      "peerDependencies": {
+        "pinia": "^2.0.0"
+      }
+    },
     "node_modules/postcss": {
       "version": "8.4.38",
       "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz",
@@ -2341,6 +2538,11 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
     "node_modules/psl": {
       "version": "1.9.0",
       "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz",
@@ -2356,6 +2558,20 @@
         "node": ">=6"
       }
     },
+    "node_modules/qs": {
+      "version": "6.12.1",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.12.1.tgz",
+      "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==",
+      "dependencies": {
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/querystringify": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz",
@@ -2536,6 +2752,22 @@
         "node": ">=10"
       }
     },
+    "node_modules/set-function-length": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+      "dependencies": {
+        "define-data-property": "^1.1.4",
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.4",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -2557,6 +2789,23 @@
         "node": ">=8"
       }
     },
+    "node_modules/side-channel": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
+      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.4",
+        "object-inspect": "^1.13.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/source-map-js": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
@@ -2965,6 +3214,25 @@
         "eslint": ">=6.0.0"
       }
     },
+    "node_modules/vue-i18n": {
+      "version": "9.13.1",
+      "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.13.1.tgz",
+      "integrity": "sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==",
+      "dependencies": {
+        "@intlify/core-base": "9.13.1",
+        "@intlify/shared": "9.13.1",
+        "@vue/devtools-api": "^6.5.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
     "node_modules/vue-router": {
       "version": "4.3.2",
       "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.3.2.tgz",

+ 3 - 1
package.json

@@ -2,7 +2,7 @@
   "name": "vuetify-project",
   "version": "0.0.0",
   "scripts": {
-    "dev": "vite",
+    "dev": "vite --host 0.0.0.0",
     "build": "vite build",
     "preview": "vite preview",
     "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
@@ -10,9 +10,11 @@
   },
   "dependencies": {
     "@mdi/font": "7.0.96",
+    "axios": "^1.6.8",
     "js-cookie": "^3.0.5",
     "pinia": "^2.1.7",
     "pinia-plugin-persistedstate": "^3.2.1",
+    "qs": "^6.12.1",
     "roboto-fontface": "*",
     "vue": "^3.4.0",
     "vue-i18n": "9",

+ 11 - 0
src/api/common/index.js

@@ -0,0 +1,11 @@
+import http from '@/utils/request'
+
+// 发送验证码
+export const sendSmsCode = (params) => {
+  return http.post('/menduner/system/auth/send-sms-code', params)
+}
+
+// 验证码登录
+export const smsLogin = (params) => {
+  return http.post('/menduner/system/auth/sms-login', params)
+}

+ 31 - 0
src/store/user.js

@@ -0,0 +1,31 @@
+import { defineStore } from 'pinia'
+import { reactive } from 'vue'
+import { setToken } from '@/utils/auth'
+import { smsLogin } from '@/api/common/index'
+
+export const userLocaleStore = defineStore('user',
+  () => {
+    let userInfo = reactive({})
+    const handleLogin = async (data) => {
+      console.log(data, 'login-params')
+      return new Promise((resolve, reject) => {
+        smsLogin(data).then(res => {
+          const { data } = res
+          console.log(data, 'res-login')
+          setToken(data.accessToken)
+          userInfo = data
+          localStorage.setItem('expiresTime', data.expiresTime) // token过期时间
+          resolve()
+        }).catch(err => { reject(err) })
+      })
+    }
+    return {
+      userInfo,
+      handleLogin
+    }
+  },
+  {
+    persist: true,
+  }
+)
+

+ 12 - 11
src/utils/request.js

@@ -5,7 +5,7 @@ import qs from 'qs'
 
 // create an axios instance
 const service = axios.create({
-  baseURL: import.meta.env.VUE_APP_BASE_API,
+  baseURL: import.meta.env.VITE_BASE_URL,
   timeout: 120000 // request timeout
 })
 
@@ -13,10 +13,11 @@ const service = axios.create({
 // 发送请求拦截器
 service.interceptors.request.use(
   config => {
+    config.headers['tenant-id'] = import.meta.env.VITE_TENANTCODE
     if (getToken()) {
-      config.headers.token = getToken()
+      config.headers.token = `Bearer ${getToken()}`
     }
-    config.headers.token = getToken()
+    config.headers.token = `Bearer ${getToken()}`
     return config
   },
   error => {
@@ -47,14 +48,14 @@ service.interceptors.response.use(
       }
     }
 
-    if ([50008, 50012, 50014, 402000, 401].includes(res.code)) {
-      // 登录过期
-      return Promise.reject(res.msg)
-    }
-    // 登录验证码过期
-    if (res.code === 60902) {
-      return Promise.reject(res)
-    }
+    // if ([50008, 50012, 50014, 402000, 401].includes(res.code)) {
+    //   // 登录过期
+    //   return Promise.reject(res.msg)
+    // }
+    // // 登录验证码过期
+    // if (res.code === 60902) {
+    //   return Promise.reject(res)
+    // }
     if (res.code !== 20000) {
       if (res.data) {
         return Promise.reject(res)

+ 48 - 9
src/views/login/components/phone.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
-    <v-form @submit.prevent>
-      <v-text-field v-model="loginData.query.phone" placeholder="请输入手机号" color="#00897B" variant="outlined" density="compact" :rules="phoneRules">
+    <v-form @submit.prevent ref="phoneForm">
+      <v-text-field v-model="loginData.phone" placeholder="请输入手机号" color="#00897B" variant="outlined" density="compact" :rules="phoneRules" validate-on="input">
         <template v-slot:prepend-inner>
           <span class="d-flex">
             <v-icon icon="mdi-cellphone" size="20"></v-icon>
@@ -19,20 +19,23 @@
           </span>
         </template>
       </v-text-field>
-      <v-text-field v-model="loginData.query.code" placeholder="请输入验证码" color="#00897B" variant="outlined" density="compact" prepend-inner-icon="mdi-security" :rules="[v=> !!v || '请填写验证码']">
+      <v-text-field v-model="loginData.code" placeholder="请输入验证码" color="#00897B" variant="outlined" density="compact" prepend-inner-icon="mdi-security" :rules="[v=> !!v || '请填写验证码']">
         <template #append-inner>
           <span v-if="showCode" class="login-code" @click="handleCode">获取验证码</span>
           <span v-else class="disable">重新获取{{ count }}s</span>
         </template>
       </v-text-field>
     </v-form>
+    <v-snackbar v-model="tips.show" :color="tips.color" :timeout="1500" location="top">{{ tips.text }}</v-snackbar>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive } from 'vue'
+import { ref, reactive, defineExpose } from 'vue'
 import { setCodeTime } from '@/utils/code'
+import { sendSmsCode } from '@/api/common/index'
 defineOptions({ name: 'phone-index' })
+
 const phoneRules = ref([
   value => {
     if (value) return true
@@ -43,6 +46,13 @@ const phoneRules = ref([
     return '请输入正确的手机号码'
   }
 ])
+
+const tips = reactive({
+  show: false,
+  color: '',
+  text: ''
+})
+
 // 手机号区域
 const currentArea = ref('0086')
 const items = [
@@ -57,9 +67,26 @@ const showCode = ref(true)
 const count = ref(0)
 const timer = ref(null)
 const handleCode = () => {
-  // 先校验手机号
+  if (!loginData.phone) {
+    tips.text = '请输入手机号码'
+    tips.color = 'warning'
+    tips.show = true
+    return
+  }
   count.value = 60
   setTime()
+  getSmsCode()
+}
+const getSmsCode = async () => {
+  const query = {
+    phone: loginData.phone,
+    scene: 30
+  }
+  try {
+    await sendSmsCode(query)
+  } catch (error) {
+    console.log(error, 'error')
+  }
 }
 const setTime = () => {
   showCode.value = false
@@ -83,10 +110,22 @@ const autoTimer = () => {
 autoTimer()
 
 const loginData = reactive({
-  query: {
-    phone: '',
-    code: ''
-  }
+  phone: '13229740091',
+  code: ''
+})
+
+const phoneForm = ref()
+// const handleValidate = async () => {
+//   const { valid } = await phoneForm.value.validate()
+//   console.log(valid, 'valid')
+//   return valid
+// }
+
+
+defineExpose({
+  loginData, 
+  // handleValidate,
+  phoneForm
 })
 </script>
 

+ 1 - 1
src/views/login/components/qrCode.vue

@@ -5,7 +5,7 @@
       cover
       aspect-ratio="16/9"
       src="https://minio.citupro.com/dev/static/csqrcode.jpg"
-      style="height: 300px;"
+      style="height: 200px;"
     ></v-img>
   </div>
 </template>

+ 18 - 32
src/views/login/index.vue

@@ -14,38 +14,18 @@
         </div>
       </div>
       <div class="login-content-box mt-5">
-        <v-menu>
-          <template v-slot:activator="{ props }">
-            <v-btn
-              color="primary"
-              v-bind="props"
-            >
-              Activator slot
-            </v-btn>
-          </template>
-          <v-list>
-            <v-list-item
-              v-for="(item, index) in localeStore.localeMap"
-              :key="index"
-              :value="item.lang"
-            >
-              <v-list-item-title @click="localeStore.setCurrentLocale(item)">{{ item.name }}</v-list-item-title>
-            </v-list-item>
-          </v-list>
-        </v-menu>
-        <v-btn>{{ localeStore.currentLocale.lang }}</v-btn>
         <div v-if="!isPhone" class="login-tab">
           <v-tabs v-model="tab" align-tabs="center" color="#00897B">
             <v-tab :value="1">短信登录</v-tab>
             <v-tab :value="2">密码登录</v-tab>
           </v-tabs>
           <v-window v-model="tab" class="mt-9">
-            <v-window-item :value="1">
               <!-- 验证码登录 -->
+            <v-window-item :value="1">
               <phoneFrom ref="phoneRef"></phoneFrom>
             </v-window-item>
-            <v-window-item :value="2">
               <!-- 账号密码登录 -->
+            <v-window-item :value="2">
               <passwordFrom ref="passRef"></passwordFrom>
             </v-window-item>
           </v-window>
@@ -54,7 +34,7 @@
           <!-- 微信扫码登录 -->
           <qr-code></qr-code>
         </div>
-        <v-btn color="primary" class="white--text mt-5" min-width="350" @click="handleLogin">
+        <v-btn v-if="!isPhone" :loading="loginLoading" color="primary" class="white--text mt-5" min-width="350" @click="handleLogin">
           {{ tab === 1 ? $t('login.register') : $t('login.login') }}
         </v-btn>
         <div class="login-tips mt-3">
@@ -72,13 +52,10 @@ import { ref } from 'vue'
 import passwordFrom from './components/password.vue'
 import phoneFrom from './components/phone.vue'
 import qrCode from './components/qrCode.vue'
+import { userLocaleStore } from '@/store/user'
+import { useRouter } from 'vue-router'
 defineOptions({ name: 'login-index' })
 
-import { useLocaleStore } from '@/store/locale'
-
-const localeStore = useLocaleStore()
-
-
 const phone = ref()
 let isPhone = ref(false)
 const handlePhone = () => {
@@ -86,20 +63,29 @@ const handlePhone = () => {
   phone.value.style.backgroundPosition = isPhone.value ? '0 -80px' : '0 0'
 }
 const tab = ref(1)
-
 const showClose = ref(false)
 
+// 验证码登录
 const phoneRef = ref()
 const passRef = ref()
-const handleLogin = () => {
+const loginLoading = ref(false)
+const userStore = userLocaleStore()
+const handleLogin = async () => {
+  const { valid } = await phoneRef.value.phoneForm.validate()
+  if (!valid) return
+  loginLoading.value = true
+  try {
+    await userStore.handleLogin(phoneRef.value.loginData)
+  } finally {
+    loginLoading.value = false
+  }
 }
 
-import { useRouter } from 'vue-router'
+// 隐私、用户协议
 const router = useRouter()
 const handleToUserAgreement = () => {
   router.push({ path: '/userAgreement' })
 }
-
 const handlePrivacyPolicy = () => {
   router.push({ path: '/privacyPolicy' })
 }