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