/* * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ (self["webpackChunkshiweisuzhou"] = self["webpackChunkshiweisuzhou"] || []).push([["src_views_Login_vue"],{ /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=script&lang=js": /*!*******************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=script&lang=js ***! \*******************************************************************************************************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__);\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: \"Login\",\n data() {\n return {\n // 登录方式:sms-短信 / password-密码\n loginType: \"sms\",\n form: {\n phone: \"\",\n code: \"\",\n password: \"\",\n captcha: \"\" // 新增图形验证码字段\n },\n rules: {\n phone: [{\n required: true,\n message: \"请输入手机号码\",\n trigger: \"blur\"\n }, {\n pattern: /^1\\d{10}$/,\n message: \"手机号码格式错误\",\n trigger: \"blur\"\n }],\n // 新增图形验证码验证规则\n captcha: [{\n required: true,\n message: \"请输入图形验证码\",\n trigger: \"blur\"\n }, {\n min: 4,\n max: 4,\n message: \"图形验证码为4位字符\",\n trigger: \"blur\"\n }],\n code: [{\n required: true,\n message: \"请输入验证码\",\n trigger: \"blur\"\n }, {\n pattern: /^\\d{6}$/,\n message: \"验证码为6位数字\",\n trigger: \"blur\"\n }],\n password: [{\n required: true,\n message: \"请输入密码\",\n trigger: \"blur\"\n }, {\n min: 6,\n message: \"密码至少6位\",\n trigger: \"blur\"\n }]\n },\n // 验证码逻辑\n codeText: \"获取验证码\",\n codeDisabled: false,\n countdown: 60,\n // 图形验证码相关\n captchaUrl: \"\",\n // 图形验证码图片地址\n captchaId: \"\",\n // 记住账号\n rememberPhone: false,\n // 加载状态\n submitting: false,\n smsCodeId: \"\"\n };\n },\n mounted() {\n // 读取记住的手机号\n const rememberedPhone = localStorage.getItem(\"rememberedPhone\");\n if (rememberedPhone) {\n this.form.phone = rememberedPhone;\n this.rememberPhone = true;\n }\n // 初始化加载图形验证码\n this.refreshCaptcha();\n },\n methods: {\n // 刷新图形验证码\n refreshCaptcha() {\n this.post({}, \"/api/uservice/user/getCaptchaImg\").then(res => {\n if (res) {\n this.captchaUrl = res.data.code;\n this.captchaId = res.data.id;\n }\n });\n },\n // 切换登录方式\n switchLoginType(type) {\n this.loginType = type;\n this.resetForm();\n },\n // 重置表单\n resetForm() {\n this.form.code = \"\";\n this.form.password = \"\";\n this.form.captcha = \"\"; // 重置图形验证码\n this.$refs.loginForm.resetValidation();\n // 刷新图形验证码\n this.refreshCaptcha();\n },\n // 获取短信验证码(添加图形验证码校验)\n handleGetCode() {\n // 先验证手机号和图形验证码\n if (!this.form.phone) {\n this.$message.warning(\"请先输入手机号码\");\n return;\n }\n if (!this.form.captcha) {\n this.$message.warning(\"请先输入图形验证码\");\n return;\n }\n this.post({\n mobile: this.form.phone,\n captchaCode: this.form.captcha,\n captchaCodeId: this.captchaId\n }, \"/api/uservice/user/getMobileCodeForLogin\").then(res => {\n console.log(res);\n if (res.code == 1) {\n this.codeDisabled = true;\n this.smsCodeId = res.data.id;\n this.codeText = `重新发送(${this.countdown}s)`;\n const timer = setInterval(() => {\n this.countdown--;\n this.codeText = `重新发送(${this.countdown}s)`;\n if (this.countdown <= 0) {\n clearInterval(timer);\n this.codeText = \"获取验证码\";\n this.codeDisabled = false;\n this.countdown = 60;\n }\n }, 1000);\n }\n });\n },\n // 登录提交(包含图形验证码校验)\n handleLogin() {\n this.$refs.loginForm.validate(valid => {\n if (valid) {\n this.submitting = true;\n this.post({\n mobile: this.form.phone,\n smsCodeId: this.smsCodeId,\n smsCode: this.form.code,\n fromSource: \"PC\"\n }, \"/api/uservice/user/loginByMobileCode\").then(res => {\n this.submitting = false;\n if (res.code == 1) {\n this.$message.success(\"登录成功!\");\n // 记住账号\n if (this.rememberPhone) {\n localStorage.setItem(\"rememberedPhone\", this.form.phone);\n } else {\n localStorage.removeItem(\"rememberedPhone\");\n }\n\n // 提交到Vuex存储用户信息\n this.$store.dispatch(\"login\", {\n userInfo: res.data,\n token: res.data.token\n });\n\n // 登录成功后获取存储的跳转路径\n const redirectPath = localStorage.getItem('redirectPath');\n this.$router.push(redirectPath || '/');\n localStorage.removeItem('redirectPath');\n }\n });\n\n // 模拟登录请求\n setTimeout(() => {\n // 实际项目替换为:\n // axios.post('/api/login', this.form).then(res => {\n // this.$router.push('/home')\n // })\n }, 1500);\n }\n });\n },\n // 前往注册页\n goToRegister() {\n this.$router.push(\"/Register\");\n }\n }\n});\n\n//# sourceURL=webpack://shiweisuzhou/./src/views/Login.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options\n}"); /***/ }), /***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=template&id=26084dc2&scoped=true": /*!***************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=template&id=26084dc2&scoped=true ***! \***************************************************************************************************************************************************************************************************************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; },\n/* harmony export */ staticRenderFns: function() { return /* binding */ staticRenderFns; }\n/* harmony export */ });\nvar render = function render() {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n staticClass: \"login-page\"\n }, [_vm._m(0), _c(\"div\", {\n staticClass: \"form-card\"\n }, [_c(\"el-form\", {\n ref: \"loginForm\",\n staticClass: \"login-form\",\n attrs: {\n model: _vm.form,\n rules: _vm.rules,\n \"label-width\": \"0\"\n }\n }, [_c(\"el-form-item\", {\n attrs: {\n prop: \"phone\"\n }\n }, [_c(\"el-input\", {\n attrs: {\n placeholder: \"请输入手机号码\",\n clearable: \"\",\n \"prefix-icon\": \"el-icon-phone\",\n maxlength: \"11\"\n },\n model: {\n value: _vm.form.phone,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"phone\", $$v);\n },\n expression: \"form.phone\"\n }\n })], 1), _c(\"el-form-item\", {\n attrs: {\n prop: \"captcha\"\n }\n }, [_c(\"el-input\", {\n staticStyle: {\n width: \"65%\"\n },\n attrs: {\n placeholder: \"请输入图形验证码\",\n clearable: \"\",\n \"prefix-icon\": \"el-icon-picture\"\n },\n model: {\n value: _vm.form.captcha,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"captcha\", $$v);\n },\n expression: \"form.captcha\"\n }\n }), _c(\"div\", {\n staticClass: \"captcha-img\",\n on: {\n click: _vm.refreshCaptcha\n }\n }, [_c(\"img\", {\n staticClass: \"captcha-pic\",\n attrs: {\n src: _vm.captchaUrl,\n alt: \"图形验证码\"\n }\n })])], 1), _vm.loginType === \"sms\" ? _c(\"el-form-item\", {\n attrs: {\n prop: \"code\"\n }\n }, [_c(\"el-input\", {\n staticStyle: {\n width: \"65%\"\n },\n attrs: {\n placeholder: \"请输入验证码\",\n clearable: \"\",\n \"prefix-icon\": \"el-icon-message\"\n },\n model: {\n value: _vm.form.code,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"code\", $$v);\n },\n expression: \"form.code\"\n }\n }), _c(\"el-button\", {\n staticClass: \"code-btn\",\n attrs: {\n type: \"primary\",\n disabled: _vm.codeDisabled\n },\n on: {\n click: _vm.handleGetCode\n }\n }, [_vm._v(\" \" + _vm._s(_vm.codeText) + \" \")])], 1) : _vm._e(), _vm.loginType === \"password\" ? _c(\"el-form-item\", {\n attrs: {\n prop: \"password\"\n }\n }, [_c(\"el-input\", {\n attrs: {\n type: \"password\",\n placeholder: \"请输入密码\",\n clearable: \"\",\n \"prefix-icon\": \"el-icon-lock\"\n },\n model: {\n value: _vm.form.password,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"password\", $$v);\n },\n expression: \"form.password\"\n }\n })], 1) : _vm._e(), _c(\"el-form-item\", {\n staticClass: \"remember-item\"\n }, [_c(\"el-checkbox\", {\n attrs: {\n size: \"mini\"\n },\n model: {\n value: _vm.rememberPhone,\n callback: function ($$v) {\n _vm.rememberPhone = $$v;\n },\n expression: \"rememberPhone\"\n }\n }, [_vm._v(\" 记住用户名/手机号码 \")])], 1), _c(\"el-form-item\", [_c(\"el-button\", {\n staticClass: \"login-btn\",\n attrs: {\n type: \"primary\",\n loading: _vm.submitting\n },\n on: {\n click: _vm.handleLogin\n }\n }, [_vm._v(\" 立即登录 \")])], 1), false ? 0 : _vm._e()], 1)], 1)]);\n};\nvar staticRenderFns = [function () {\n var _vm = this,\n _c = _vm._self._c;\n return _c(\"div\", {\n staticClass: \"bg-container\"\n }, [_c(\"img\", {\n staticClass: \"bg-img\",\n attrs: {\n src: \"https://static.ticket.sz-trip.com/shiweisuzhou/pc/login/loginBg.png\",\n alt: \"login background\"\n }\n })]);\n}];\nrender._withStripped = true;\n\n\n//# sourceURL=webpack://shiweisuzhou/./src/views/Login.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options\n}"); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=style&index=0&id=26084dc2&lang=scss&scoped=true": /*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=style&index=0&id=26084dc2&lang=scss&scoped=true ***! \******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".login-page[data-v-26084dc2] {\\n position: relative;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n overflow: hidden;\\n}\\n.login-page .bg-container[data-v-26084dc2] {\\n width: 100vw;\\n height: 100%;\\n left: 0;\\n top: 0;\\n z-index: 1;\\n}\\n.login-page .bg-container .bg-img[data-v-26084dc2] {\\n width: 100%;\\n height: 100%;\\n -o-object-fit: cover;\\n object-fit: cover;\\n}\\n.login-page .form-card[data-v-26084dc2] {\\n position: absolute;\\n right: 8%;\\n top: 50%;\\n transform: translateY(-50%);\\n width: 360px;\\n background: #fff;\\n border-radius: 8px;\\n box-shadow: 0 2px 16px rgba(0, 0, 0, 0.1);\\n z-index: 2;\\n padding: 30px 25px;\\n}\\n.login-page .form-card .tab-bar[data-v-26084dc2] {\\n display: flex;\\n justify-content: center;\\n margin-bottom: 25px;\\n}\\n.login-page .form-card .tab-bar .tab-item[data-v-26084dc2] {\\n width: 50%;\\n text-align: center;\\n padding: 10px 0;\\n color: #666;\\n cursor: pointer;\\n border-bottom: 2px solid transparent;\\n}\\n.login-page .form-card .tab-bar .tab-item.active[data-v-26084dc2] {\\n color: #6a8a27;\\n border-bottom-color: #6a8a27;\\n}\\n.login-page .form-card .login-form .el-form-item[data-v-26084dc2] {\\n margin-bottom: 20px;\\n}\\n.login-page .form-card .login-form .el-input[data-v-26084dc2] {\\n height: 40px;\\n line-height: 40px;\\n}\\n.login-page .form-card .login-form .captcha-img[data-v-26084dc2] {\\n display: inline-block;\\n width: 30%;\\n height: 40px;\\n margin-left: 8px;\\n cursor: pointer;\\n vertical-align: middle;\\n}\\n.login-page .form-card .login-form .captcha-img .captcha-pic[data-v-26084dc2] {\\n width: 100%;\\n height: 100%;\\n -o-object-fit: cover;\\n object-fit: cover;\\n border-radius: 4px;\\n}\\n.login-page .form-card .login-form .code-btn[data-v-26084dc2] {\\n padding: 0 5px;\\n height: 40px;\\n background-color: #6a8a27;\\n border: none;\\n margin-left: 5px;\\n}\\n.login-page .form-card .login-form .remember-item[data-v-26084dc2] {\\n padding-left: 0;\\n margin-bottom: 10px;\\n}\\n.login-page .form-card .login-form .login-btn[data-v-26084dc2] {\\n width: 100%;\\n background: #6a8a27;\\n border: none;\\n}\\n.login-page .form-card .login-form .login-btn[data-v-26084dc2]:hover {\\n background: #e03e40;\\n}\\n.login-page .form-card .login-form .register-guide[data-v-26084dc2] {\\n text-align: center;\\n margin-top: 15px;\\n color: #999;\\n}\\n.login-page .form-card .login-form .register-guide .register-link[data-v-26084dc2] {\\n color: #6a8a27;\\n text-decoration: underline;\\n margin-left: 5px;\\n}\\n@media (max-width: 992px) {\\n.login-page .form-card[data-v-26084dc2] {\\n right: 5%;\\n width: 320px;\\n}\\n}\\n@media (max-width: 576px) {\\n.login-page .form-card[data-v-26084dc2] {\\n right: 50%;\\n transform: translate(50%, -50%);\\n width: 90%;\\n}\\n}\", \"\"]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://shiweisuzhou/./src/views/Login.vue?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use%5B1%5D!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use%5B2%5D!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use%5B3%5D!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options\n}"); /***/ }), /***/ "./node_modules/vue-style-loader/index.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=style&index=0&id=26084dc2&lang=scss&scoped=true": /*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-style-loader/index.js??clonedRuleSet-22.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-22.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-22.use[2]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-22.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/views/Login.vue?vue&type=style&index=0&id=26084dc2&lang=scss&scoped=true ***! \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { eval("{// style-loader: Adds some css to the DOM by adding a