Kaynağa Gözat

更改登录校验跳过租户校验,后台校验填充,优化逻辑配置文件统一管理配置

liyanbo 1 ay önce
ebeveyn
işleme
27d983823c

+ 32 - 14
src/utils/loginUtils.js

@@ -18,6 +18,9 @@ import {homeRoutes} from "@/router/index.js";
 // 加密密钥 (从环境变量获取)
 const SECRET_KEY = import.meta.env.VITE_SECRET_KEY;
 
+// 是否开启租户模式
+const tenantOpen = import.meta.env.VITE_APP_COMPULSORY_TENANT === 'true';
+
 //需要删除的缓存key列表
 const CACHE_KEYS_TO_DELETE = [
   'userId',
@@ -45,7 +48,7 @@ const decryptPassword = (encryptedPassword) => {
 const createLoginData = () => {
   return ref({
     loginForm: {
-      tenantName: import.meta.env.VITE_APP_DEFAULT_LOGIN_TENANT || '',
+      tenantName: tenantOpen ? (import.meta.env.VITE_APP_DEFAULT_LOGIN_TENANT || '') : null,
       username: import.meta.env.VITE_APP_DEFAULT_LOGIN_USERNAME || '',
       password: import.meta.env.VITE_APP_DEFAULT_LOGIN_PASSWORD || '',
       smsCode: '', // 短信验证码字段
@@ -91,8 +94,10 @@ const createVerificationCodeLogic = () => {
   const getSmsCode = async (tenantId, tenantName, mobile) => {
     sendingCode.value = true
     try {
+      // 构建请求头,只有当 tenantId 存在时才添加 Tenant-Id
+      const headers = tenantId ? { 'Tenant-Id': tenantId } : {}
       const res = await smsCode(
-        { 'Tenant-Id': tenantId }, {
+        headers, {
           tenantName,
           mobile,
           scene: import.meta.env.VITE_APP_LOGIN_SMS_TEMPLATE_ID,
@@ -147,10 +152,13 @@ const loginLogic = async (loginForm, tenantId, isAuthorized, router, redirectPat
   loginLoading.value = true
   try {
     let res
+    // 构建请求头,只有当 tenantId 存在时才添加 Tenant-Id
+    const headers = tenantId ? { 'Tenant-Id': tenantId } : {}
+    
     if (!isAuthorized.value) {
       // 未授权状态,使用短信验证码登录
       res = await smsLogin(
-        { 'Tenant-Id': tenantId }, {
+        headers, {
           mobile: loginForm.phoneNumber,
           code: loginForm.smsCode,
         }
@@ -159,7 +167,7 @@ const loginLogic = async (loginForm, tenantId, isAuthorized, router, redirectPat
       // 授权状态,使用账号密码登录
       // 传输时使用明文密码,确保后端能正确处理
       res = await login(
-        { 'Tenant-Id': tenantId },
+        headers,
         loginForm
       )
     }
@@ -175,14 +183,14 @@ const loginLogic = async (loginForm, tenantId, isAuthorized, router, redirectPat
       // 存储登录状态
       localStorage.setItem('isLoggedIn', 'true')
       localStorage.setItem('token', res.data.accessToken)
-      
+
       // 登录成功后存储用户ID
       if (res.data.userId) {
         localStorage.setItem('userId', res.data.userId)
       }
 
       // 总是存储用户名和租户名称
-      localStorage.setItem('tenantName', loginForm.tenantName)
+      localStorage.setItem('tenantName', res.data.tenantName)
       // 存储记住我状态
       localStorage.setItem('rememberMe', loginForm.rememberMe)
       
@@ -212,6 +220,7 @@ const loginLogic = async (loginForm, tenantId, isAuthorized, router, redirectPat
     } else if (res.code === 1002000009) {
       // 未授权状态,切换到短信验证码登录
       ElMessage.warning(res.msg || '登录IP未被授权,请使用手机号短信验证码登录!')
+      loginForm.phoneNumber = res.data?.mobile
       isAuthorized.value = false
       return false
     } else {
@@ -237,7 +246,7 @@ const loadLoginData = (loginData) => {
   const storedPassword = localStorage.getItem('password')
 
   // 恢复登录信息到输入框
-  if (storedTenantName) {
+  if (tenantOpen && storedTenantName) {
     loginData.value.loginForm.tenantName = storedTenantName
   }
   if (storedUserName) {
@@ -272,21 +281,27 @@ const generateRules = (isAuthorized) => {
   return computed(() => {
     if (isAuthorized.value) {
       // 授权状态:需要账号和密码
-      return {
-        tenantName: [{ required: true, message: '请输入学校名称', trigger: 'blur' }],
+      const rules = {
         username: [{ required: true, message: '请输入账号', trigger: 'blur' }],
         password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
       }
+      if (tenantOpen) {
+        rules.tenantName = [{ required: true, message: '请输入学校名称', trigger: 'blur' }]
+      }
+      return rules
     } else {
       // 未授权状态:需要手机号和短信验证码
-      return {
-        tenantName: [{ required: true, message: '请输入学校名称', trigger: 'blur' }],
+      const rules = {
         phoneNumber: [
           { required: true, message: '请输入手机号', trigger: 'blur' },
           { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号格式', trigger: 'blur' }
         ],
         smsCode: [{ required: true, message: '请输入短信验证码', trigger: 'blur' }]
       }
+      if (tenantOpen) {
+        rules.tenantName = [{ required: true, message: '请输入学校名称', trigger: 'blur' }]
+      }
+      return rules
     }
   })
 }
@@ -302,16 +317,19 @@ const autoLogin = async (tenantName, username, password, router, redirectPath) =
       background: 'rgba(0, 0, 0, 0.7)'
     })
 
-    // 获取租户ID
-    const tenantId = await getTenantId(tenantName)
+    // 获取租户ID,只有当 tenantOpen 为 true 时才获取
+    let tenantId = await getTenantId(tenantName)
     if (!tenantId) {
       // 租户验证失败
       return false
     }
 
+    // 构建请求头,只有当 tenantId 存在时才添加 Tenant-Id
+    const headers = tenantId ? { 'Tenant-Id': tenantId } : {}
+    
     // 执行登录
     const res = await login(
-      { 'Tenant-Id': tenantId },
+      headers,
       { tenantName, username, password }
     )
 

+ 16 - 9
src/views/AiCourseLogin.vue

@@ -17,7 +17,7 @@
             label-width="0px"
             class="input-item"
         >
-          <el-form-item prop="tenantName">
+          <el-form-item prop="tenantName" v-show="tenantOpen">
             <el-input v-model="loginData.loginForm.tenantName"
                       :prefix-icon="HomeFilled"
                       placeholder="学校"
@@ -115,6 +115,7 @@ const router = useRouter()
 
 // 获取环境变量
 const appTitle = import.meta.env.VITE_APP_TITLE
+const tenantOpen = import.meta.env.VITE_APP_COMPULSORY_TENANT === 'true'
 
 const loginFormRef = ref(null)
 
@@ -136,7 +137,7 @@ const rules = generateRules(isAuthorized)
 // 获取短信验证码
 const handleGetSmsCode = async () => {
   // 先验证租户和手机号是否填写
-  if (!loginData.value.loginForm.tenantName) {
+  if (tenantOpen && !loginData.value.loginForm.tenantName) {
     ElMessage.warning('请先输入学校名称')
     return
   }
@@ -145,9 +146,12 @@ const handleGetSmsCode = async () => {
     return
   }
   // 验证租户是否存在
-  const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
-  if (!tenantId) {
-    return
+  let tenantId = null;
+  if(tenantOpen) {
+    tenantId = await getTenantId(loginData.value.loginForm.tenantName)
+    if (!tenantId) {
+      return
+    }
   }
 
   // 调用验证码逻辑
@@ -160,10 +164,13 @@ const handleLogin = async () => {
   await loginFormRef.value.validate(async valid => {
     if (valid) {
       // 先验证租户是否存在
-      const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
-      if (!tenantId) {
-        // 租户验证失败,不执行登录
-        return
+      let tenantId = null
+      if (tenantOpen) {
+        tenantId = await getTenantId(loginData.value.loginForm.tenantName)
+        if (!tenantId) {
+          // 租户验证失败,不执行登录
+          return
+        }
       }
 
       // 调用登录逻辑

+ 16 - 9
src/views/BlocklyLogin.vue

@@ -17,7 +17,7 @@
             label-width="0px"
             class="input-item"
         >
-          <el-form-item prop="tenantName">
+          <el-form-item prop="tenantName" v-show="tenantOpen">
             <el-input v-show="!tenantNameQuery"
                       v-model="loginData.loginForm.tenantName"
                       :prefix-icon="HomeFilled"
@@ -116,6 +116,7 @@ const router = useRouter()
 
 // 获取环境变量
 const appTitle = import.meta.env.VITE_APP_TITLE
+const tenantOpen = import.meta.env.VITE_APP_COMPULSORY_TENANT === 'true'
 
 const loginFormRef = ref(null)
 
@@ -140,7 +141,7 @@ const rules = generateRules(isAuthorized)
 // 获取短信验证码
 const handleGetSmsCode = async () => {
   // 先验证租户和手机号是否填写
-  if (!loginData.value.loginForm.tenantName) {
+  if (tenantOpen && !loginData.value.loginForm.tenantName) {
     ElMessage.warning('请先输入学校名称')
     return
   }
@@ -149,9 +150,12 @@ const handleGetSmsCode = async () => {
     return
   }
   // 验证租户是否存在
-  const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
-  if (!tenantId) {
-    return
+  let tenantId = null;
+  if(tenantOpen) {
+    tenantId = await getTenantId(loginData.value.loginForm.tenantName)
+    if (!tenantId) {
+      return
+    }
   }
 
   // 调用验证码逻辑
@@ -164,10 +168,13 @@ const handleLogin = async () => {
   await loginFormRef.value.validate(async valid => {
     if (valid) {
       // 先验证租户是否存在
-      const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
-      if (!tenantId) {
-        // 租户验证失败,不执行登录
-        return
+      let tenantId = null
+      if (tenantOpen) {
+        tenantId = await getTenantId(loginData.value.loginForm.tenantName)
+        if (!tenantId) {
+          // 租户验证失败,不执行登录
+          return
+        }
       }
 
       // 调用登录逻辑

+ 18 - 9
src/views/Login.vue

@@ -17,7 +17,7 @@
             label-width="0px"
             class="input-item"
         >
-          <el-form-item prop="tenantName">
+          <el-form-item prop="tenantName" v-show="tenantOpen">
             <el-input
                 v-model="loginData.loginForm.tenantName"
                 :prefix-icon="HomeFilled"
@@ -52,6 +52,7 @@
                   v-model="loginData.loginForm.phoneNumber"
                   :prefix-icon="Iphone"
                   placeholder="手机号"
+                  disabled
               />
             </el-form-item>
             <!-- 短信验证码输入框和获取验证码按钮 -->
@@ -115,6 +116,7 @@ const router = useRouter()
 
 // 获取环境变量
 const appTitle = import.meta.env.VITE_APP_TITLE
+const tenantOpen = import.meta.env.VITE_APP_COMPULSORY_TENANT === 'true'
 
 const loginFormRef = ref(null)
 
@@ -133,7 +135,7 @@ const rules = generateRules(isAuthorized)
 // 获取短信验证码
 const handleGetSmsCode = async () => {
   // 先验证租户和手机号是否填写
-  if (!loginData.value.loginForm.tenantName) {
+  if (tenantOpen && !loginData.value.loginForm.tenantName) {
     ElMessage.warning('请先输入学校名称')
     return
   }
@@ -142,9 +144,12 @@ const handleGetSmsCode = async () => {
     return
   }
   // 验证租户是否存在
-  const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
-  if (!tenantId) {
-    return
+  let tenantId = null;
+  if(tenantOpen) {
+    tenantId = await getTenantId(loginData.value.loginForm.tenantName)
+    if (!tenantId) {
+      return
+    }
   }
 
   // 调用验证码逻辑
@@ -156,11 +161,15 @@ const handleLogin = async () => {
   if (!loginFormRef.value) return
   await loginFormRef.value.validate(async valid => {
     if (valid) {
+
       // 先验证租户是否存在
-      const tenantId = await getTenantId(loginData.value.loginForm.tenantName)
-      if (!tenantId) {
-        // 租户验证失败,不执行登录
-        return
+      let tenantId = null
+      if (tenantOpen) {
+        tenantId = await getTenantId(loginData.value.loginForm.tenantName)
+        if (!tenantId) {
+          // 租户验证失败,不执行登录
+          return
+        }
       }
 
       // 调用登录逻辑