From ffdeb042145a75f6693c05229c988d78bc6319e8 Mon Sep 17 00:00:00 2001 From: WXL <1785969728@qq.com> Date: 星期四, 24 七月 2025 18:13:23 +0800 Subject: [PATCH] 测试完成 --- src/api/login.js | 10 ++ src/store/modules/user.js | 3 src/views/login.vue | 201 ++++++++++++++++++++++++++++++++++++++------------ vue.config.js | 4 4 files changed, 166 insertions(+), 52 deletions(-) diff --git a/src/api/login.js b/src/api/login.js index 4d3977e..8fb8d89 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,13 +1,14 @@ import request from '@/utils/request' // 鐧诲綍鏂规硶 -export function login(username, password, code, uuid,orgid) { +export function login(username, password, code, uuid,orgid,phoneCode) { const data = { username, password, code, uuid, orgid, + phoneCode } return request({ url: '/login', @@ -58,3 +59,10 @@ timeout: 20000 }) } +export function phoneCode(data) { + return request({ + url: '/phoneLogin', + method: 'post', + data: data + }); +} diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 6bdcc72..7206500 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -121,8 +121,9 @@ const code = userInfo.code const uuid = userInfo.uuid const orgid = userInfo.orgid + const phoneCode = userInfo.phoneCode return new Promise((resolve, reject) => { - login(username, password, code, uuid,orgid).then(res => { + login(username, password, code, uuid,orgid,phoneCode).then(res => { setToken(res.token) commit('SET_TOKEN', res.token) localStorage.setItem('orgid', orgid); diff --git a/src/views/login.vue b/src/views/login.vue index 02252e1..e8c178c 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -7,41 +7,79 @@ class="login-form" > <h3 class="title">鏃犻敗鍎跨鍖婚櫌鏅烘収闅忚骞冲彴</h3> + + <!-- 鐧诲綍鏂瑰紡鍒囨崲 --> + <div class="login-method"> + <el-radio-group v-model="loginMethod" @change="changeLoginMethod"> + <el-radio-button label="password">瀵嗙爜鐧诲綍</el-radio-button> + <el-radio-button label="sms">楠岃瘉鐮佺櫥褰�</el-radio-button> + </el-radio-group> + </div> + + <!-- 鐢ㄦ埛鍚�/鎵嬫満鍙疯緭鍏� --> <el-form-item prop="username"> <el-input v-model="loginForm.username" type="text" auto-complete="off" - placeholder="璐﹀彿" + :placeholder="loginMethod === 'password' ? '璐﹀彿' : '鎵嬫満鍙�'" > <svg-icon slot="prefix" - icon-class="user" - class="el-input__icon input-icon" - /> - </el-input> - </el-form-item> - <el-form-item prop="password"> - <el-input - v-model="loginForm.password" - type="password" - auto-complete="off" - placeholder="瀵嗙爜" - @keyup.enter.native="handleLogin" - > - <svg-icon - slot="prefix" - icon-class="password" + :icon-class="loginMethod === 'password' ? 'user' : 'phone'" class="el-input__icon input-icon" /> </el-input> </el-form-item> - <el-checkbox - v-model="loginForm.rememberMe" - style="margin: 0px 0px 25px 0px" - >璁颁綇瀵嗙爜</el-checkbox - > + <!-- 瀵嗙爜鐧诲綍閮ㄥ垎 --> + <template v-if="loginMethod === 'password'"> + <el-form-item prop="password"> + <el-input + v-model="loginForm.password" + type="password" + auto-complete="off" + placeholder="瀵嗙爜" + @keyup.enter.native="handleLogin" + > + <svg-icon + slot="prefix" + icon-class="password" + class="el-input__icon input-icon" + /> + </el-input> + </el-form-item> + <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px"> + 璁颁綇瀵嗙爜 + </el-checkbox> + </template> + + <!-- 楠岃瘉鐮佺櫥褰曢儴鍒� --> + <template v-else> + <el-form-item prop="smsCode"> + <el-input + v-model="loginForm.smsCode" + auto-complete="off" + placeholder="鐭俊楠岃瘉鐮�" + style="width: 60%" + @keyup.enter.native="handleLogin" + > + <svg-icon + slot="prefix" + icon-class="validCode" + class="el-input__icon input-icon" + /> + </el-input> + <el-button + :disabled="countdown > 0" + @click="phoneCode" + style="width: 38%; margin-left: 2%" + > + {{ countdown > 0 ? `${countdown}绉掑悗閲嶆柊鑾峰彇` : '鑾峰彇楠岃瘉鐮�' }} + </el-button> + </el-form-item> + </template> + <el-form-item style="width: 100%"> <el-button :loading="loading" @@ -54,13 +92,10 @@ <span v-else>鐧� 褰� 涓�...</span> </el-button> <div style="float: right" v-if="register"> - <router-link class="link-type" :to="'/register'" - >绔嬪嵆娉ㄥ唽1</router-link - > + <router-link class="link-type" :to="'/register'">绔嬪嵆娉ㄥ唽</router-link> </div> </el-form-item> </el-form> - </div> <!-- <div class="block"> <div class="smerry"> @@ -72,18 +107,33 @@ </template> <script> -import { getCodeImg } from "@/api/login"; +import { getCodeImg, phoneCode } from "@/api/login"; import Cookies from "js-cookie"; import { encrypt, decrypt } from "@/utils/jsencrypt"; export default { name: "Login", data() { + // 楠岃瘉鎵嬫満鍙疯鍒� + const validatePhone = (rule, value, callback) => { + if (!value) { + callback(new Error("璇疯緭鍏ユ墜鏈哄彿")); + } else if (!/^1[3-9]\d{9}$/.test(value)) { + callback(new Error("璇疯緭鍏ユ纭殑鎵嬫満鍙�")); + } else { + callback(); + } + }; + return { + loginMethod: "password", // 鐧诲綍鏂瑰紡锛宲assword鎴杝ms + countdown: 0, // 鐭俊楠岃瘉鐮佸�掕鏃� + timer: null, // 鍊掕鏃跺畾鏃跺櫒 codeUrl: "", loginForm: { username: "", password: "", + smsCode: "", rememberMe: false, code: "", orgid: "1", @@ -95,16 +145,18 @@ loginRules: { username: [ { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }, + { validator: validatePhone, trigger: "blur", when: () => this.loginMethod === "sms" } ], password: [ - { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }, + { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�", when: () => this.loginMethod === "password" }, ], - // orgid: [{ required: true, trigger: "blur", message: "璇烽�夋嫨闄㈠尯" }], + smsCode: [ + { required: true, trigger: "blur", message: "璇疯緭鍏ラ獙璇佺爜", when: () => this.loginMethod === "sms" }, + { pattern: /^\d{6}$/, message: "楠岃瘉鐮佷负6浣嶆暟瀛�", trigger: "blur", when: () => this.loginMethod === "sms" } + ], }, loading: false, - // 楠岃瘉鐮佸紑鍏� captchaEnabled: true, - // 娉ㄥ唽寮�鍏� register: false, redirect: undefined, }; @@ -120,11 +172,48 @@ created() { this.getCode(); this.getCookie(); - // if (localStorage.getItem('orgid')) { - // this.loginForm.orgid = localStorage.getItem('orgid'); - // } + }, + beforeDestroy() { + if (this.timer) { + clearInterval(this.timer); + } }, methods: { + // 鍒囨崲鐧诲綍鏂瑰紡 + changeLoginMethod() { + this.$refs.loginForm.clearValidate(); + }, + + // 鍙戦�佺煭淇¢獙璇佺爜 + phoneCode() { + this.$refs.loginForm.validateField("username", (error) => { + if (!error) { + this.loading = true; + phoneCode({ phone: this.loginForm.username }) + .then(() => { + this.$message.success("楠岃瘉鐮佸凡鍙戦��"); + this.startCountdown(); + this.loading = false; + + }) + .catch(() => { + this.loading = false; + }); + } + }); + }, + + // 寮�濮嬪�掕鏃� + startCountdown() { + this.countdown = 60; + this.timer = setInterval(() => { + this.countdown--; + if (this.countdown <= 0) { + clearInterval(this.timer); + } + }, 1000); + }, + getCode() { getCodeImg().then((res) => { console.log(res); @@ -136,6 +225,7 @@ } }); }, + getCookie() { const username = Cookies.get("username"); const password = Cookies.get("password"); @@ -147,11 +237,13 @@ rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), }; }, + handleLogin() { this.$refs.loginForm.validate((valid) => { if (valid) { this.loading = true; - if (this.loginForm.rememberMe) { + + if (this.loginMethod === "password" && this.loginForm.rememberMe) { Cookies.set("username", this.loginForm.username, { expires: 30 }); Cookies.set("password", encrypt(this.loginForm.password), { expires: 30, @@ -164,19 +256,32 @@ Cookies.remove("password"); Cookies.remove("rememberMe"); } - (this.loginForm.orgid = "1"), - this.$store - .dispatch("Login", this.loginForm) - .then(() => { - this.$router.push({ path: this.redirect || "/" }).catch(() => {}); - // this.$router.push({ path:"/patient/patient" }).catch(() => {}); - }) - .catch(() => { - this.loading = false; - if (this.captchaEnabled) { - this.getCode(); - } - }); + + const loginData = { + username: this.loginForm.username, + orgid: "1", + loginType: this.loginMethod + }; + + if (this.loginMethod === "password") { + loginData.password = this.loginForm.password; + } else { + console.log(this.loginForm.smsCode); + + loginData.phoneCode = this.loginForm.smsCode; + } + + this.$store + .dispatch("Login", loginData) + .then(() => { + this.$router.push({ path: this.redirect || "/" }).catch(() => {}); + }) + .catch(() => { + this.loading = false; + if (this.captchaEnabled) { + this.getCode(); + } + }); } }); }, diff --git a/vue.config.js b/vue.config.js index 6062c0f..0b35599 100644 --- a/vue.config.js +++ b/vue.config.js @@ -36,9 +36,9 @@ // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { // target: `http://192.168.168.60:8095`, - // target: `http://192.168.144.34:8095`, + target: `http://192.168.144.34:8095`, // target: `http://192.168.100.100:8095`, - target:`http://localhost:8095`, + // target:`http://localhost:8095`, changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: '' -- Gitblit v1.9.3