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