|
@@ -3,71 +3,71 @@
|
|
|
<div class="login-content">
|
|
<div class="login-content">
|
|
|
<!-- 背景图容器 -->
|
|
<!-- 背景图容器 -->
|
|
|
<div
|
|
<div
|
|
|
- class="bg-image-container"
|
|
|
|
|
- :style="{ backgroundImage: `url(${BGImages})`, backgroundSize: 'cover' }"
|
|
|
|
|
|
|
+ class="bg-image-container"
|
|
|
|
|
+ :style="{ backgroundImage: `url(${BGImages})`, backgroundSize: 'cover' }"
|
|
|
></div>
|
|
></div>
|
|
|
<!-- 登录输入框 -->
|
|
<!-- 登录输入框 -->
|
|
|
<div class="login-wrapper">
|
|
<div class="login-wrapper">
|
|
|
<div class="login-input">
|
|
<div class="login-input">
|
|
|
<span>{{ appTitle }}</span>
|
|
<span>{{ appTitle }}</span>
|
|
|
<el-form
|
|
<el-form
|
|
|
- ref="loginFormRef"
|
|
|
|
|
- :model="loginData.loginForm"
|
|
|
|
|
- :rules="rules"
|
|
|
|
|
- label-width="0px"
|
|
|
|
|
- class="input-item"
|
|
|
|
|
|
|
+ ref="loginFormRef"
|
|
|
|
|
+ :model="loginData.loginForm"
|
|
|
|
|
+ :rules="rules"
|
|
|
|
|
+ label-width="0px"
|
|
|
|
|
+ class="input-item"
|
|
|
>
|
|
>
|
|
|
<el-form-item prop="tenantName">
|
|
<el-form-item prop="tenantName">
|
|
|
- <el-input v-show="!tenantNameQuery"
|
|
|
|
|
- v-model="loginData.loginForm.tenantName"
|
|
|
|
|
- :prefix-icon="HomeFilled"
|
|
|
|
|
- placeholder="学校"
|
|
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-model="loginData.loginForm.tenantName"
|
|
|
|
|
+ :prefix-icon="HomeFilled"
|
|
|
|
|
+ placeholder="学校"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
|
|
|
<!-- 条件显示手机号和短信验证码或账号和密码 -->
|
|
<!-- 条件显示手机号和短信验证码或账号和密码 -->
|
|
|
- <template v-if="isAuthorized">
|
|
|
|
|
|
|
+ <template v-if="isAuthorized">
|
|
|
<el-form-item prop="username">
|
|
<el-form-item prop="username">
|
|
|
<el-input
|
|
<el-input
|
|
|
- v-model="loginData.loginForm.username"
|
|
|
|
|
- :prefix-icon="Avatar"
|
|
|
|
|
- placeholder="账号"
|
|
|
|
|
|
|
+ v-model="loginData.loginForm.username"
|
|
|
|
|
+ :prefix-icon="Avatar"
|
|
|
|
|
+ placeholder="账号"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item prop="password">
|
|
<el-form-item prop="password">
|
|
|
<el-input
|
|
<el-input
|
|
|
- v-model="loginData.loginForm.password"
|
|
|
|
|
- class="password-input"
|
|
|
|
|
- type="password"
|
|
|
|
|
- :prefix-icon="Lock"
|
|
|
|
|
- placeholder="密码"
|
|
|
|
|
- show-password
|
|
|
|
|
|
|
+ v-model="loginData.loginForm.password"
|
|
|
|
|
+ class="password-input"
|
|
|
|
|
+ type="password"
|
|
|
|
|
+ :prefix-icon="Lock"
|
|
|
|
|
+ placeholder="密码"
|
|
|
|
|
+ show-password
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
- <template v-else>
|
|
|
|
|
|
|
+ <template v-else>
|
|
|
<el-form-item prop="phoneNumber">
|
|
<el-form-item prop="phoneNumber">
|
|
|
<el-input
|
|
<el-input
|
|
|
- v-model="loginData.loginForm.phoneNumber"
|
|
|
|
|
- :prefix-icon="Iphone"
|
|
|
|
|
- placeholder="手机号"
|
|
|
|
|
|
|
+ v-model="loginData.loginForm.phoneNumber"
|
|
|
|
|
+ :prefix-icon="Iphone"
|
|
|
|
|
+ placeholder="手机号"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<!-- 短信验证码输入框和获取验证码按钮 -->
|
|
<!-- 短信验证码输入框和获取验证码按钮 -->
|
|
|
<el-form-item prop="smsCode">
|
|
<el-form-item prop="smsCode">
|
|
|
<div class="sms-code-container">
|
|
<div class="sms-code-container">
|
|
|
<el-input
|
|
<el-input
|
|
|
- v-model="loginData.loginForm.smsCode"
|
|
|
|
|
- placeholder="短信验证码"
|
|
|
|
|
- class="sms-input"
|
|
|
|
|
|
|
+ v-model="loginData.loginForm.smsCode"
|
|
|
|
|
+ placeholder="短信验证码"
|
|
|
|
|
+ class="sms-input"
|
|
|
/>
|
|
/>
|
|
|
<el-button
|
|
<el-button
|
|
|
- type="primary"
|
|
|
|
|
- @click="getSmsCode"
|
|
|
|
|
- :disabled="countingDown"
|
|
|
|
|
- class="get-code-btn"
|
|
|
|
|
- :loading="sendingCode"
|
|
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ @click="handleGetSmsCode"
|
|
|
|
|
+ :disabled="countingDown"
|
|
|
|
|
+ class="get-code-btn"
|
|
|
|
|
+ :loading="sendingCode"
|
|
|
>
|
|
>
|
|
|
{{ countingDown ? `${countDown}秒后重新获取` : '获取验证码' }}
|
|
{{ countingDown ? `${countDown}秒后重新获取` : '获取验证码' }}
|
|
|
</el-button>
|
|
</el-button>
|
|
@@ -81,26 +81,34 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<!-- 多选框 -->
|
|
<!-- 多选框 -->
|
|
|
- <div class="check-box">
|
|
|
|
|
- <el-checkbox
|
|
|
|
|
|
|
+ <div class="check-box">
|
|
|
|
|
+ <el-checkbox
|
|
|
v-model="loginData.loginForm.rememberMe"
|
|
v-model="loginData.loginForm.rememberMe"
|
|
|
label="记住我"
|
|
label="记住我"
|
|
|
size="large"
|
|
size="large"
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
-import { ref, onMounted, computed, onUnmounted, nextTick } from 'vue'
|
|
|
|
|
|
|
+import { ref, onMounted, onUnmounted } from 'vue'
|
|
|
import { useRouter } from 'vue-router'
|
|
import { useRouter } from 'vue-router'
|
|
|
-import { HomeFilled, Avatar, Lock,Iphone } from '@element-plus/icons-vue'
|
|
|
|
|
-import { getTenantIdByName, login,smsLogin,smsCode } from '@/api/login/login.js'
|
|
|
|
|
-import { ElLoading, ElMessage } from 'element-plus'
|
|
|
|
|
|
|
+import { HomeFilled, Avatar, Lock, Iphone } from '@element-plus/icons-vue'
|
|
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
|
|
|
|
|
import BGImages from '@/assets/images/homeBG.png'
|
|
import BGImages from '@/assets/images/homeBG.png'
|
|
|
|
|
+import {
|
|
|
|
|
+ createLoginData,
|
|
|
|
|
+ createVerificationCodeLogic,
|
|
|
|
|
+ getTenantId,
|
|
|
|
|
+ loginLogic,
|
|
|
|
|
+ loadLoginData,
|
|
|
|
|
+ checkLoginStatus,
|
|
|
|
|
+ generateRules
|
|
|
|
|
+} from '@/utils/loginUtils.js'
|
|
|
|
|
|
|
|
const router = useRouter()
|
|
const router = useRouter()
|
|
|
|
|
|
|
@@ -109,78 +117,20 @@ const appTitle = import.meta.env.VITE_APP_TITLE
|
|
|
|
|
|
|
|
const loginFormRef = ref(null)
|
|
const loginFormRef = ref(null)
|
|
|
|
|
|
|
|
-const loginData = ref({
|
|
|
|
|
- loginForm: {
|
|
|
|
|
- tenantName: import.meta.env.VITE_APP_DEFAULT_LOGIN_TENANT || '',
|
|
|
|
|
- username: import.meta.env.VITE_APP_DEFAULT_LOGIN_USERNAME || '',
|
|
|
|
|
- password: import.meta.env.VITE_APP_DEFAULT_LOGIN_PASSWORD || '',
|
|
|
|
|
- smsCode: '', // 短信验证码字段
|
|
|
|
|
- rememberMe: false, // 记住
|
|
|
|
|
- phoneNumber: '' // 手机号字段
|
|
|
|
|
- }
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
-const loginLoading = ref(false)
|
|
|
|
|
-const loading = ref() // ElLoading.service 返回的实例
|
|
|
|
|
-const tenantId = ref('')
|
|
|
|
|
-// 登录状态标识
|
|
|
|
|
-const isLoggedIn = ref(false)
|
|
|
|
|
-//地址栏传参默认值
|
|
|
|
|
-const tenantNameQuery = ref()
|
|
|
|
|
|
|
+// 初始化登录数据
|
|
|
|
|
+const loginData = createLoginData()
|
|
|
|
|
|
|
|
-// 短信验证码相关状态
|
|
|
|
|
-const countingDown = ref(false)
|
|
|
|
|
-const countDown = ref(60)
|
|
|
|
|
-const sendingCode = ref(false)
|
|
|
|
|
-let countDownTimer = null
|
|
|
|
|
|
|
+// 初始化验证码逻辑
|
|
|
|
|
+const { countingDown, countDown, sendingCode, getSmsCode, clearCountDownTimer } = createVerificationCodeLogic()
|
|
|
|
|
|
|
|
// 授权状态 默认授权
|
|
// 授权状态 默认授权
|
|
|
const isAuthorized = ref(true)
|
|
const isAuthorized = ref(true)
|
|
|
|
|
|
|
|
-// 输入框校验 - 根据授权状态动态调整
|
|
|
|
|
-const rules = computed(() => {
|
|
|
|
|
- if (isAuthorized.value) {
|
|
|
|
|
- // 授权状态:需要账号和密码
|
|
|
|
|
- return {
|
|
|
|
|
- tenantName: [{ required: true, message: '请输入学校名称', trigger: 'blur' }],
|
|
|
|
|
- username: [{ required: true, message: '请输入账号', trigger: 'blur' }],
|
|
|
|
|
- password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- // 未授权状态:需要手机号和短信验证码
|
|
|
|
|
- return {
|
|
|
|
|
- tenantName: [{ required: true, message: '请输入学校名称', trigger: 'blur' }],
|
|
|
|
|
- phoneNumber: [
|
|
|
|
|
- { required: true, message: '请输入手机号', trigger: 'blur' },
|
|
|
|
|
- { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
|
|
|
|
|
- ],
|
|
|
|
|
- smsCode: [{ required: true, message: '请输入短信验证码', trigger: 'blur' }]
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
-// 获取租户 ID
|
|
|
|
|
-const getTenantId = async () => {
|
|
|
|
|
- try {
|
|
|
|
|
- const res = await getTenantIdByName(loginData.value.loginForm.tenantName)
|
|
|
|
|
- console.log(res);
|
|
|
|
|
- if (res && res.data) {
|
|
|
|
|
- //记录租户id
|
|
|
|
|
- tenantId.value = res.data
|
|
|
|
|
- return true; // 租户验证成功
|
|
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error('租户填写错误!')
|
|
|
|
|
- return false; // 租户验证失败
|
|
|
|
|
- }
|
|
|
|
|
- } catch (error) {
|
|
|
|
|
- ElMessage.error('租户填写错误!')
|
|
|
|
|
- console.error('获取租户 ID 错误:', error)
|
|
|
|
|
- return false; // 租户验证失败
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
|
|
+// 生成表单验证规则
|
|
|
|
|
+const rules = generateRules(isAuthorized)
|
|
|
|
|
|
|
|
-// 获取短信验证码函数
|
|
|
|
|
-const getSmsCode = async () => {
|
|
|
|
|
|
|
+// 获取短信验证码
|
|
|
|
|
+const handleGetSmsCode = async () => {
|
|
|
// 先验证租户和手机号是否填写
|
|
// 先验证租户和手机号是否填写
|
|
|
if (!loginData.value.loginForm.tenantName) {
|
|
if (!loginData.value.loginForm.tenantName) {
|
|
|
ElMessage.warning('请先输入学校名称')
|
|
ElMessage.warning('请先输入学校名称')
|
|
@@ -191,173 +141,47 @@ const getSmsCode = async () => {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
// 验证租户是否存在
|
|
// 验证租户是否存在
|
|
|
- const tenantValid = await getTenantId()
|
|
|
|
|
- if (!tenantValid) {
|
|
|
|
|
|
|
+ const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
|
|
|
|
|
+ if (!tenantId) {
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- sendingCode.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- // 获取验证码
|
|
|
|
|
- const res = await smsCode(
|
|
|
|
|
- { 'Tenant-Id': tenantId.value },{
|
|
|
|
|
- tenantName: loginData.value.loginForm.tenantName,
|
|
|
|
|
- mobile: loginData.value.loginForm.phoneNumber,
|
|
|
|
|
- scene: import.meta.env.VITE_APP_LOGIN_SMS_TEMPLATE_ID,
|
|
|
|
|
- })
|
|
|
|
|
- console.log('发送短信验证码:', res)
|
|
|
|
|
- if (res.code === 0) {
|
|
|
|
|
- ElMessage.success('验证码发送成功')
|
|
|
|
|
- // 开始倒计时
|
|
|
|
|
- startCountDown()
|
|
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res.message || '验证码发送失败')
|
|
|
|
|
- }
|
|
|
|
|
- } catch (error) {
|
|
|
|
|
- ElMessage.error('验证码发送失败,请重试')
|
|
|
|
|
- console.error('发送验证码错误:', error)
|
|
|
|
|
- } finally {
|
|
|
|
|
- sendingCode.value = false
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// 验证码倒计时函数
|
|
|
|
|
-const startCountDown = () => {
|
|
|
|
|
- countingDown.value = true
|
|
|
|
|
- countDown.value = 60
|
|
|
|
|
|
|
|
|
|
- if (countDownTimer) {
|
|
|
|
|
- clearInterval(countDownTimer)
|
|
|
|
|
- }
|
|
|
|
|
- countDownTimer = setInterval(() => {
|
|
|
|
|
- countDown.value--
|
|
|
|
|
- if (countDown.value <= 0) {
|
|
|
|
|
- clearInterval(countDownTimer)
|
|
|
|
|
- countingDown.value = false
|
|
|
|
|
- }
|
|
|
|
|
- }, 1000)
|
|
|
|
|
|
|
+ // 调用验证码逻辑
|
|
|
|
|
+ getSmsCode(tenantId, loginData.value.loginForm.tenantName, loginData.value.loginForm.phoneNumber)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 登录
|
|
// 登录
|
|
|
-const handleLogin = async params => {
|
|
|
|
|
|
|
+const handleLogin = async () => {
|
|
|
if (!loginFormRef.value) return
|
|
if (!loginFormRef.value) return
|
|
|
await loginFormRef.value.validate(async valid => {
|
|
await loginFormRef.value.validate(async valid => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
|
- loginLoading.value = true
|
|
|
|
|
- try {
|
|
|
|
|
- // 先验证租户是否存在
|
|
|
|
|
- const tenantValid = await getTenantId()
|
|
|
|
|
- if (!tenantValid) {
|
|
|
|
|
- // 租户验证失败,不执行登录
|
|
|
|
|
- loginLoading.value = false
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- const loginDataLoginForm = { ...loginData.value.loginForm }
|
|
|
|
|
-
|
|
|
|
|
- // 根据授权状态选择不同的登录接口
|
|
|
|
|
- let res
|
|
|
|
|
- if (!isAuthorized.value) {
|
|
|
|
|
- // 未授权状态,使用短信验证码登录
|
|
|
|
|
- res = await smsLogin(
|
|
|
|
|
- { 'Tenant-Id': tenantId.value },{
|
|
|
|
|
- mobile: loginData.value.loginForm.phoneNumber,
|
|
|
|
|
- code: loginData.value.loginForm.smsCode,
|
|
|
|
|
- })
|
|
|
|
|
- } else {
|
|
|
|
|
- // 授权状态,使用账号密码登录
|
|
|
|
|
- res = await login(
|
|
|
|
|
- { 'Tenant-Id': tenantId.value },
|
|
|
|
|
- loginDataLoginForm
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (!res) {
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- // 校验登录状态
|
|
|
|
|
- if (res.code === 0) {
|
|
|
|
|
- ElMessage.success('登录成功')
|
|
|
|
|
- isLoggedIn.value = true
|
|
|
|
|
- // 存储登录状态
|
|
|
|
|
- localStorage.setItem('isLoggedIn', 'true')
|
|
|
|
|
- localStorage.setItem('token', res.data.accessToken)
|
|
|
|
|
-
|
|
|
|
|
- // 总是存储用户名和租户名称
|
|
|
|
|
- localStorage.setItem('userName', loginData.value.loginForm.username)
|
|
|
|
|
- localStorage.setItem('tenantName', loginData.value.loginForm.tenantName)
|
|
|
|
|
- // 存储记住我状态
|
|
|
|
|
- localStorage.setItem('rememberMe', loginData.value.loginForm.rememberMe)
|
|
|
|
|
-
|
|
|
|
|
- if (loginData.value.loginForm.rememberMe) {
|
|
|
|
|
- // 保存密码
|
|
|
|
|
- localStorage.setItem('password', loginData.value.loginForm.password)
|
|
|
|
|
- } else {
|
|
|
|
|
- // 如果没有勾选记住我,清除密码
|
|
|
|
|
- localStorage.removeItem('password')
|
|
|
|
|
- localStorage.removeItem('maxCourseSections')
|
|
|
|
|
- }
|
|
|
|
|
- loading.value = ElLoading.service({
|
|
|
|
|
- lock: true,
|
|
|
|
|
- text: '正在加载系统中...',
|
|
|
|
|
- background: 'rgba(0, 0, 0, 0.7)'
|
|
|
|
|
- })
|
|
|
|
|
- // 登录成功后,跳转到指定的页面
|
|
|
|
|
- router.push(!tenantNameQuery.value?'/home':'/programming')
|
|
|
|
|
-
|
|
|
|
|
- } else if (res.code === 1002000009) {
|
|
|
|
|
- // 未授权状态,切换到短信验证码登录
|
|
|
|
|
- ElMessage.warning(res.msg || '登录IP未被授权,请使用手机号短信验证码登录!')
|
|
|
|
|
- isAuthorized.value = false
|
|
|
|
|
- } else {
|
|
|
|
|
- ElMessage.error(res.msg || '登录失败,请检查账号密码!')
|
|
|
|
|
- }
|
|
|
|
|
- } catch (error) {
|
|
|
|
|
- ElMessage.error('登录出错,请重试!')
|
|
|
|
|
- console.error('登录错误:', error)
|
|
|
|
|
- } finally {
|
|
|
|
|
- loginLoading.value = false
|
|
|
|
|
- if (loading.value) {
|
|
|
|
|
- loading.value.close()
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 先验证租户是否存在
|
|
|
|
|
+ const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
|
|
|
|
|
+ if (!tenantId) {
|
|
|
|
|
+ // 租户验证失败,不执行登录
|
|
|
|
|
+ return
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 调用登录逻辑
|
|
|
|
|
+ await loginLogic(loginData.value.loginForm, tenantId, isAuthorized, router, '/home')
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 在组件挂载时检查登录状态和恢复登录信息
|
|
// 在组件挂载时检查登录状态和恢复登录信息
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
- const storedStatus = localStorage.getItem('isLoggedIn') // isLoggedIn
|
|
|
|
|
- const storedTenantName = localStorage.getItem('tenantName')
|
|
|
|
|
- const storedUserName = localStorage.getItem('userName')
|
|
|
|
|
- const storedPassword = localStorage.getItem('password')
|
|
|
|
|
-
|
|
|
|
|
- // 恢复登录信息到输入框
|
|
|
|
|
- if (storedTenantName) {
|
|
|
|
|
- loginData.value.loginForm.tenantName = storedTenantName
|
|
|
|
|
- }
|
|
|
|
|
- if (storedUserName) {
|
|
|
|
|
- loginData.value.loginForm.username = storedUserName
|
|
|
|
|
- }
|
|
|
|
|
- if (storedPassword) {
|
|
|
|
|
- loginData.value.loginForm.password = storedPassword
|
|
|
|
|
- loginData.value.loginForm.rememberMe = true
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 加载本地存储的登录数据
|
|
|
|
|
+ loadLoginData(loginData)
|
|
|
|
|
|
|
|
- // 检查地址栏是否有tenantName参数
|
|
|
|
|
- let tenantName = router.currentRoute.value.meta?.TENANT;
|
|
|
|
|
- if (tenantName && tenantName === "内部测试租户") {
|
|
|
|
|
- loginData.value.loginForm.tenantName = tenantNameQuery.value = tenantName
|
|
|
|
|
- } else if (Object.keys(router.currentRoute.value.query).length > 0) {
|
|
|
|
|
|
|
+ if (Object.keys(router.currentRoute.value.query).length > 0) {
|
|
|
// 其他参数,重定向到登录页
|
|
// 其他参数,重定向到登录页
|
|
|
router.replace('/login')
|
|
router.replace('/login')
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 检查登录状态,如果已登录则直接跳转到首页
|
|
// 检查登录状态,如果已登录则直接跳转到首页
|
|
|
- if (storedStatus === 'true') {
|
|
|
|
|
- isLoggedIn.value = true
|
|
|
|
|
- router.push(!tenantNameQuery.value?'/home':'/programming')
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ checkLoginStatus(router, '/home')
|
|
|
|
|
|
|
|
- const handleKeyPress = (event) => {
|
|
|
|
|
|
|
+ const handleKeyPress = (event) => {
|
|
|
// 检查是否按下回车键(keyCode 13)
|
|
// 检查是否按下回车键(keyCode 13)
|
|
|
if (event.key === 'Enter' || event.keyCode === 13) {
|
|
if (event.key === 'Enter' || event.keyCode === 13) {
|
|
|
handleLogin()
|
|
handleLogin()
|
|
@@ -369,11 +193,8 @@ onMounted(() => {
|
|
|
// 在组件卸载时移除事件监听
|
|
// 在组件卸载时移除事件监听
|
|
|
onUnmounted(() => {
|
|
onUnmounted(() => {
|
|
|
document.removeEventListener('keydown', handleKeyPress)
|
|
document.removeEventListener('keydown', handleKeyPress)
|
|
|
- if (countDownTimer) {
|
|
|
|
|
- clearInterval(countDownTimer)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ clearCountDownTimer()
|
|
|
})
|
|
})
|
|
|
-
|
|
|
|
|
})
|
|
})
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
@@ -450,7 +271,7 @@ onMounted(() => {
|
|
|
color: black;
|
|
color: black;
|
|
|
font-size: rpx(8);
|
|
font-size: rpx(8);
|
|
|
letter-spacing: rpx(10);
|
|
letter-spacing: rpx(10);
|
|
|
- border-radius: rpx(5);
|
|
|
|
|
|
|
+ border-radius: rpx(5);
|
|
|
margin: rpx(15) 0 auto;
|
|
margin: rpx(15) 0 auto;
|
|
|
border: none;
|
|
border: none;
|
|
|
background: linear-gradient(to bottom, #fee78a, #ffce1b);
|
|
background: linear-gradient(to bottom, #fee78a, #ffce1b);
|
|
@@ -505,8 +326,8 @@ onMounted(() => {
|
|
|
margin: 0 !important;
|
|
margin: 0 !important;
|
|
|
padding: 0;
|
|
padding: 0;
|
|
|
font-size: rpx(5);
|
|
font-size: rpx(5);
|
|
|
- border-radius: rpx(5);
|
|
|
|
|
- border-top-left-radius: 0;
|
|
|
|
|
|
|
+ border-radius: rpx(5);
|
|
|
|
|
+ border-top-left-radius: 0;
|
|
|
border-bottom-left-radius: 0;
|
|
border-bottom-left-radius: 0;
|
|
|
letter-spacing: normal;
|
|
letter-spacing: normal;
|
|
|
display: flex;
|
|
display: flex;
|
|
@@ -517,4 +338,4 @@ onMounted(() => {
|
|
|
// background: linear-gradient(to bottom, #78c0ff, #0070f3);
|
|
// background: linear-gradient(to bottom, #78c0ff, #0070f3);
|
|
|
border: none;
|
|
border: none;
|
|
|
}
|
|
}
|
|
|
-</style>
|
|
|
|
|
|
|
+</style>
|