From d7a96e70ab45225cc87f01d7d435eab1c169eac4 Mon Sep 17 00:00:00 2001 From: yangyin <1850366751@qq.com> Date: 星期五, 26 七月 2024 16:29:14 +0800 Subject: [PATCH] fix: 新增短信验证登录 --- src/api/ai/chat.ts | 6 -- src/api/ai/user.ts | 14 ++++++ src/utils/request.ts | 9 ++-- src/layout/component/sidebar/components/MenuList.vue | 89 +++++++++++++++++++++++++++++++++++++------- 4 files changed, 93 insertions(+), 25 deletions(-) diff --git a/src/api/ai/chat.ts b/src/api/ai/chat.ts index d2a3c6c..2d8f11e 100644 --- a/src/api/ai/chat.ts +++ b/src/api/ai/chat.ts @@ -298,7 +298,6 @@ }); }; - export const reportHistoryProblem = async (params, req: any = request) => { return req({ url: 'history/report_history_problem', @@ -309,7 +308,6 @@ }, }); }; - export const querySimilarityHistory = async (params, req: any = request) => { return req({ @@ -322,8 +320,6 @@ }); }; - - export const filterQuery = async (params, req: any = request) => { return req({ url: 'chat/filter_query', @@ -333,4 +329,4 @@ 'Content-Type': 'application/x-www-form-urlencoded', }, }); -}; \ No newline at end of file +}; diff --git a/src/api/ai/user.ts b/src/api/ai/user.ts index a3bbf3b..8ab839c 100644 --- a/src/api/ai/user.ts +++ b/src/api/ai/user.ts @@ -1,6 +1,6 @@ import request from '/@/utils/request'; -import { toFormData } from '/@/utils/util'; export const LOGIN_URL = '/login'; +export const TEL_LOGIN_URL = '/send_login_sms'; /** * @summary description */ @@ -24,3 +24,15 @@ method: 'POST', }); }; + +//鍙戦�佺煭淇¢獙璇佺爜鐧诲綍 +export const loginMessageUser = async (params, req: any = request) => { + return req({ + url: TEL_LOGIN_URL, + method: 'POST', + data: params, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }); +}; diff --git a/src/layout/component/sidebar/components/MenuList.vue b/src/layout/component/sidebar/components/MenuList.vue index ed6be66..e9e438f 100644 --- a/src/layout/component/sidebar/components/MenuList.vue +++ b/src/layout/component/sidebar/components/MenuList.vue @@ -42,14 +42,48 @@ <div class="sign_in"> <i class="ywicon icon-guanbi closes" @click="handleClose"></i> <h1><span>鐧诲綍 WI 姘村姟</span></h1> - <el-form ref="loginFormRef" :model="state.loginForm" :rules="loginRules" class="demo-ruleForm mt-[24px]" size="large"> - <el-form-item label="璐﹀彿" prop="account"> - <el-input v-model="state.loginForm.account" clearable /> - </el-form-item> - <el-form-item label="瀵嗙爜" prop="pwd"> - <el-input v-model="state.loginForm.pwd" type="password" autocomplete="off" clearable /> - </el-form-item> - </el-form> + <el-tabs v-model="state.activeLoginName" class="mt-[24px]" @tab-change="handleUserClick"> + <el-tab-pane label="璐︽埛瀵嗙爜鐧诲綍" name="accountUser"> + <el-form + ref="loginFormRef" + :model="state.loginForm" + :rules="loginRules" + class="demo-ruleForm mt-[24px] min-h-[126px]" + size="large" + > + <el-form-item label="璐﹀彿" prop="account"> + <el-input v-model="state.loginForm.account" clearable /> + </el-form-item> + <el-form-item label="瀵嗙爜" prop="pwd"> + <el-input v-model="state.loginForm.pwd" type="password" autocomplete="off" clearable /> + </el-form-item> + </el-form> + </el-tab-pane> + <el-tab-pane label="鎵嬫満鍙风櫥褰�" name="phoneUser"> + <el-form + ref="formPhoneRef" + :rules="loginPhoneRules" + :model="state.loginPhoneForm" + size="large" + label-width="67px" + class="mt-[24px] min-h-[126px]" + > + <el-form-item label="鎵嬫満鍙�" prop="phoneUser"> + <el-input v-model="state.loginPhoneForm.phoneUser" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable> + <template #prepend>+86</template> + </el-input> + </el-form-item> + <el-form-item prop="verifyCode" label="楠岃瘉鐮�"> + <el-input v-model="state.loginPhoneForm.verifyCode" placeholder="璇疯緭鍏ュ洓浣嶉獙璇佺爜" maxlength="6" clearable> + <template #append> + <el-button type="primary" @click="handleSendVerifyCode">鑾峰彇楠岃瘉鐮�</el-button> + </template> + </el-input> + </el-form-item> + </el-form> + </el-tab-pane> + </el-tabs> + <div class="mt-[24px]"> <el-button type="primary" @click="onSubmit" class="set-login_btn">鐧诲綍</el-button> </div> @@ -61,16 +95,15 @@ <script setup lang="ts"> import type { FormInstance } from 'element-plus'; import { computed, onMounted, reactive, ref, watchEffect } from 'vue'; -import { PostLogin } from '/@/api/ai/user'; +import { PostLogin, loginMessageUser } from '/@/api/ai/user'; import router from '/@/router'; import emitter from '/@/utils/mitt'; import { accessSessionKey, userNameKey } from '/@/utils/request'; import { gotoRoute } from '/@/utils/route'; import { Local, LoginInfo } from '/@/utils/storage'; - -const loginFormRef = ref<FormInstance>(null); +const loginFormRef = ref<FormInstance>(null); //璐︽埛瀵嗙爜鐧诲綍 +const formPhoneRef = ref(); //鎵嬫満鍙风櫥褰� const isLoginStatus = ref(!!Local.get(accessSessionKey)); - const userName = ref(''); const firstUserCharacter = computed(() => userName.value?.[0]?.toUpperCase()); watchEffect(() => { @@ -109,11 +142,22 @@ account: '', pwd: '', }, + loginPhoneForm: { + phoneUser: '', + verifyCode: '', + }, + activeLoginName: 'accountUser', }); const loginRules = reactive({ account: [{ required: true, message: '璇疯緭鍏ヨ处鍙�', trigger: 'blur' }], pwd: [{ required: true, message: '璇疯緭鍏ュ瘑鐮�', trigger: 'blur' }], }); +const loginPhoneRules = { + phoneUser: [ + { required: true, message: '璇疯緭鍏ユ墜鏈哄彿鐮�', trigger: 'blur' }, + { pattern: /^1\d{10}$/, message: '璇疯緭鍏ユ纭殑鎵嬫満鍙风爜', trigger: 'blur' }, + ], +}; const handleClick = (item) => { gotoRoute({ name: item.routerName }); }; @@ -133,7 +177,7 @@ pass: state.loginForm.pwd, }); - LoginInfo.set(res.hswatersession,state.loginForm.account); + LoginInfo.set(res.hswatersession, state.loginForm.account); state.isShowLogin = false; isLoginStatus.value = true; window.location.reload(); @@ -158,7 +202,23 @@ state.isShowExitLogin = false; } }; - +//鍒囨崲鐢ㄦ埛鐧诲綍椤甸潰 +const handleUserClick = (item) => { + state.activeLoginName = item; + // formPhoneRef?.value?.resetFields(); + // loginFormRef.value.resetFields(); +}; +//鑾峰彇楠岃瘉鐮� +const handleSendVerifyCode = async () => { + formPhoneRef.value.validateField('phoneUser', async (valid: boolean) => { + if (valid) { + const res = await loginMessageUser({ + phone: state.loginPhoneForm.phoneUser, + }); + console.log('馃殌 ~ res:', res); + } + }); +}; onMounted(() => { emitter.on('openLoginDlg', () => { if (state.isShowLogin || isLoginStatus.value) return; @@ -343,6 +403,7 @@ -ms-flex-pack: center; justify-content: center; } + .pc-login { position: fixed; top: 0; diff --git a/src/utils/request.ts b/src/utils/request.ts index a8f78b5..bf97f7c 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,12 +1,12 @@ import type { AxiosInstance, AxiosRequestConfig } from 'axios'; import axios from 'axios'; import { ElMessage } from 'element-plus'; +import { NO_AUTH_API_LIST } from '../api/ai/chat'; +import { LOGIN_URL, TEL_LOGIN_URL } from '../api/ai/user'; import emitter from './mitt'; import { debounce } from './util'; import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants'; import { Local, LoginInfo, Session } from '/@/utils/storage'; -import { LOGIN_URL } from '../api/ai/user'; -import { NO_AUTH_API_LIST } from '../api/ai/chat'; // import JSONbig from 'json-bigint'; //#region ====================== 鍚庣 res.err_code ====================== @@ -48,7 +48,7 @@ // 灏� token 娣诲姞鍒拌姹傛姤鏂囧ご涓� config.headers['hswatersession'] = accessSession; } else { - if (config.url !== LOGIN_URL) { + if (config.url !== LOGIN_URL && config.url !== TEL_LOGIN_URL) { handleNoAuth(config.url); throw '鏉冮檺楠岃瘉澶辫触'; } @@ -88,7 +88,7 @@ if (!serveData.json_ok) { switch (serveData?.err_code) { case ErrorCode.Auth: - if (res.config.url !== LOGIN_URL) { + if (res.config.url !== LOGIN_URL && res.config.url !== TEL_LOGIN_URL) { handleNoAuth(); throw '鏉冮檺楠岃瘉澶辫触'; } @@ -97,7 +97,6 @@ ElMessage.error('鍐呴儴閿欒锛�'); throw '鍐呴儴閿欒'; } - } return res.data; }, -- Gitblit v1.9.3