Procházet zdrojové kódy

1、统一及管理跳转登录和首页路由常量
2、在新访问项目时强制刷新用户平台路由权限
3、处理登录状态下新打开链接时被判断无权限bug
4、移出无用log日志输出

liyanbo před 3 měsíci
rodič
revize
3622f611be

+ 4 - 4
src/components/HomePage.vue

@@ -29,14 +29,14 @@
             round
             class="top-right-btn"
             :class="{ 'is-active': selectedButton === 'AI编程课' }"
-            @click="router.push('/blocklyHome')"
+            @click="router.push(blocklyRoutes.home)"
             >AI编程课</el-button
           >
           <el-button
             round
             class="top-right-btn"
             :class="{ 'is-active': selectedButton === 'AI实验课' }"
-            @click="router.push('/aiCourseHome')"
+            @click="router.push(aiCourseRoutes.home)"
             >AI实验课</el-button
           >
           <el-button
@@ -100,7 +100,7 @@
 import { ref, onMounted, watch } from 'vue'
 import { useRouter } from 'vue-router'
 import { ClassList } from '@/api/class.js'
-import { ArrowDown, ArrowRightBold } from '@element-plus/icons-vue'
+import {ArrowDown, ArrowRightBold, Message} from '@element-plus/icons-vue'
 import { Search, ArrowLeftBold } from '@element-plus/icons-vue'
 
 // 导入图片
@@ -113,7 +113,7 @@ import studyImg from '@/assets/images/study.png'
 import logoutIcon from '@/assets/icon/logout.png'
 // 退出登录
 import { logoutLogic } from '@/utils/loginUtils.js'
-import {homeRoutes} from "@/router/index.js";
+import {aiCourseRoutes, blocklyRoutes, homeRoutes} from "@/router/index.js";
 
 // 平台标题响应式变量
 const platformTitle = ref(import.meta.env.VITE_APP_TITLE)

+ 0 - 1
src/components/LeftPanel.vue

@@ -174,7 +174,6 @@ const navigateToAI = async (group) => {
           message: aiPerson.systemMessage,
           default: aiPerson.questTip
         }
-        console.log(personData.value)
         let newState = {
           ...personData.value,
           category: grade + 'AI'

+ 1 - 1
src/components/ai/video/ImageToVideo.vue

@@ -323,7 +323,7 @@ const refreshWatchImages = async () => {
   }
   const list = await VideoGetMys(imageIds)
   
-      console.log('AI生成的视频地址2222222222:', list,imageIds);
+      console.log('AI生成的视频地址:', list,imageIds);
   const newWatchImages = {}
   list?.data.forEach((image) => {
     if (image.status === AiImageStatusEnum.IN_PROGRESS) {

+ 0 - 1
src/components/blockly/MapGame.vue

@@ -1777,7 +1777,6 @@ async function animateItemUse(item, itemIndex, finishAnimation) {
     // 触发重绘后设置透明度为1,实现渐变效果
     setTimeout(() => {
       videoElement.style.opacity = '1';
-      console.log('Video opacity set to 1');
     }, CONFIG.DELAY.VIDEO_FADE_DURATION);
   } else {
     console.log('无视频');

+ 2 - 1
src/components/sidebar/ProgrammingSidebar.vue

@@ -50,6 +50,7 @@ import blockly from '@/assets/icon/blockly.png'
 // 黑色
 import blockly02 from '@/assets/icon/blockly02.png'
 import breakthrough from '@/assets/icon/breakthrough.png'
+import {blocklyRoutes} from "@/router/index.js";
 
 
  
@@ -101,7 +102,7 @@ watch(() => route, () => {
 // 跳转智能问答
 const navigateToAI = async (group) => {
   if (group.title === 'blockly编程') {
-    router.push('/blocklyHome')
+    router.push(blocklyRoutes.home)
   }
 }
 

+ 12 - 14
src/router/index.js

@@ -1,5 +1,5 @@
 import {createRouter, createWebHashHistory} from 'vue-router'
-import {CONFIG} from "@/utils/roleUtils.js";
+import {CONFIG, refreshRoleRoute} from "@/utils/roleUtils.js";
 import {Message} from "@/utils/message/Message.js";
 
 
@@ -199,17 +199,22 @@ const loginToHomeMap = {
   '/ai-login': aiCourseRoutes.home
 }
 
-// 从localStorage获取角色路由数据
-const roleRouteStr = localStorage.getItem(CONFIG.USER_ROLE_ROUTE_KEY)
-const roleRouteSet = roleRouteStr ? JSON.parse(roleRouteStr) : []
-
 const router = createRouter({
   history: createWebHashHistory(),
   routes
 })
 
 // 导航守卫
-router.beforeEach((to, from, next) => {
+router.beforeEach(async (to, from, next) => {
+
+  if (to.path === "/"){
+    await refreshRoleRoute()
+  }
+
+  // 从localStorage获取角色路由数据
+  const roleRouteStr = localStorage.getItem(CONFIG.USER_ROLE_ROUTE_KEY)
+  const roleRouteSet = roleRouteStr ? JSON.parse(roleRouteStr) : []
+
   // 如果是登录页面,直接放行并存储登录信息
   if (Object.keys(loginToHomeMap).includes(to.path)) {
     localStorage.setItem('loginPath', to.path)
@@ -223,12 +228,6 @@ router.beforeEach((to, from, next) => {
   // 获取当前登录类型对应的主页
   let allowedHome = loginToHomeMap[loginPath]
 
-  // 如果没有登录信息,允许访问所有页面(或根据实际需求处理)
-  if (!loginPath || !allowedHome) {
-    next()
-    return
-  }
-
   // 检查目标路由是否在允许的路由范围内
   let isAllowed = false
 
@@ -254,7 +253,6 @@ router.beforeEach((to, from, next) => {
       return
     }
   }
-
   // 检查目标路由是否在允许的范围内
   if ((to.path === homeRoutes.home || homeRoutes.children.includes(to.path)) && hasHomePermission) {
     isAllowed = true
@@ -268,7 +266,7 @@ router.beforeEach((to, from, next) => {
     next()
   } else {
     // 不允许访问时,重定向到用户有权限的主页
-    Message().warning('您没有权限访问该页面,已自动切换到您有权限的主页!', true);
+    if (to.path !== "/")Message().warning('您没有权限访问该页面,已自动切换到您有权限的主页!', true);
     next(allowedHome)
   }
 })

+ 5 - 5
src/utils/loginUtils.js

@@ -7,6 +7,7 @@ import CryptoJS from 'crypto-js';
 // 消息工具
 import { Message } from './message/Message.js';
 import {CONFIG, refreshRoleRoute} from "@/utils/roleUtils.js";
+import {homeRoutes} from "@/router/index.js";
 
 // 加密密钥 (从环境变量获取)
 const SECRET_KEY = import.meta.env.VITE_SECRET_KEY;
@@ -312,14 +313,14 @@ const autoLogin = async (tenantName, username, password, router, redirectPath) =
     } else {
       ElMessage.error(res?.message || '信息校验失败')
       // 如果登录失败,跳转到正常登录页面
-      router.push('/login')
+       router.push(homeRoutes.login)
       return false
     }
   } catch (error) {
     ElMessage.error('信息校验过程中发生错误')
     console.error('信息校验错误:', error)
     // 错误时跳转到登录页面
-    router.push('/login')
+    router.push(homeRoutes.login)
     return false
   } finally {
     // 关闭加载状态
@@ -330,7 +331,7 @@ const autoLogin = async (tenantName, username, password, router, redirectPath) =
 }
 
 // 退出登录逻辑
-const logoutLogic = async (router, redirectPath = '/login') => {
+const logoutLogic = async (router, redirectPath = homeRoutes.login) => {
   try {
     // 调用logout API 退出登录
     const logoutRes = await logout()
@@ -371,7 +372,7 @@ const logoutLogic = async (router, redirectPath = '/login') => {
       localStorage.removeItem('rememberMe')
     }
     Message().notifyError('退出登录失败,请重试', true)
-    router.push({ path: '/login' })
+    router.push({ path: homeRoutes.login })
   }
 }
 
@@ -390,7 +391,6 @@ const refreshDictData = async () => {
 // 添加获取角色路由数据的函数
 const refreshRoleRouteData = async () => {
   try {
-
     // 使用角色路由工具更新角色路由
     await refreshRoleRoute();
   } catch (error) {

+ 3 - 3
src/utils/request.js

@@ -1,7 +1,7 @@
 // src/utils/request.js
 // 该文件是用来 二次 封装 axios 用的
 import axios from 'axios'
-import router from '@/router/index.js'
+import router, {homeRoutes} from '@/router/index.js'
 
 // 开发环境(写代码的阶段)  development
 // 生产环境(代码已经写好已经部署到服务器了) production
@@ -34,7 +34,7 @@ request.interceptors.request.use(function (config) {
     if (token === "undefined") {
     // token 无效,之后我们可以重新登录
     localStorage.clear()
-    router.push('/login')
+    router.push(homeRoutes.login)
     return
   }
    // 2.设置 token 到请求头
@@ -52,7 +52,7 @@ request.interceptors.response.use(function (response) {
   if (response.data.code == '401') {
     // token 无效,之后我们可以重新登录
     localStorage.clear()
-    router.push('/login')
+    router.push(homeRoutes.login)
   }
   return response.data;
 }, function (error) {

+ 2 - 2
src/utils/roleUtils.js

@@ -13,12 +13,12 @@ const CONFIG = {
  * 刷新角色路由缓存
  * @returns {Promise<Array>} - 角色路由数组
  */
-export const refreshRoleRoute = async () => {
+export const refreshRoleRoute = async (refresh = true) => {
     try {
 
         // 检查缓存是否存在且未过期
         const cachedData = localStorage.getItem(CONFIG.USER_ROLE_ROUTE_KEY);
-        if (cachedData && !isCacheExpired(CONFIG.USER_ROLE_ROUTE_KEY)) {
+        if (!refresh && cachedData && !isCacheExpired(CONFIG.USER_ROLE_ROUTE_KEY)) {
             return JSON.parse(cachedData);
         }
 

+ 0 - 1
src/views/AIPage/AIDevelop.vue

@@ -356,7 +356,6 @@ const handleVideoEnded = () => {
     )
   }
 
-  console.log("================")
   // 自动播放下一个
   const allIndices = flattenMenuItems()
   const currentIndexInList = allIndices.indexOf(course.value.key)

+ 2 - 1
src/views/AIPage/AILaboratory.vue

@@ -83,13 +83,14 @@ const route = useRoute()
 
 // 返回上一页
 const goBack = () => {
-  router.push('/home')
+   router.push(homeRoutes.home)
 }
 
 // 导入图片
 import question from '@/assets/icon/question.png'
 import painting from '@/assets/icon/painting.png'
 import human from '@/assets/icon/human.png'
+import {homeRoutes} from "@/router/index.js";
 
 // 数字人接口
 const grade = ref('')

+ 2 - 2
src/views/AiCourseLogin.vue

@@ -179,11 +179,11 @@ onMounted(() => {
   // 检查地址栏是否有tenantName参数
   if (Object.keys(router.currentRoute.value.query).length > 0) {
     // 其他参数,重定向到登录页
-    router.replace('/ai-login')
+    router.replace(aiCourseRoutes.login)
   }
 
   // 检查登录状态,如果已登录则直接跳转到首页
-  checkLoginStatus(router, '/aiCourseHome')
+  checkLoginStatus(router, aiCourseRoutes.home)
 
   const handleKeyPress = (event) => {
     // 检查是否按下回车键(keyCode 13)

+ 2 - 1
src/views/EnNumerals/index.vue

@@ -70,6 +70,7 @@ const leftPanelRef = ref(null);
 
 // 数字人接口
 import { teacherList } from "@/api/teachers.js";
+import {homeRoutes} from "@/router/index.js";
 
 // 抽屉显示状态
 const drawerVisible = ref(true);
@@ -82,7 +83,7 @@ const route = useRoute();
 
 // 返回上一页
 const goBack = () => {
-  router.push("/home");
+   router.push(homeRoutes.home);
 };
 
 

+ 2 - 2
src/views/Login.vue

@@ -176,11 +176,11 @@ onMounted(() => {
 
   if (Object.keys(router.currentRoute.value.query).length > 0) {
     // 其他参数,重定向到登录页
-    router.replace('/login')
+    router.replace(homeRoutes.login)
   }
 
   // 检查登录状态,如果已登录则直接跳转到首页
-  checkLoginStatus(router, '/home')
+  checkLoginStatus(router, homeRoutes.home)
 
   const handleKeyPress = (event) => {
     // 检查是否按下回车键(keyCode 13)

+ 2 - 3
src/views/evaluation/testList.vue

@@ -31,6 +31,7 @@ import { ArrowLeftBold } from '@element-plus/icons-vue'
 import { useRouter } from 'vue-router'
 
 import testPaperIcon from '@/assets/icon/test-paper.png'
+import {homeRoutes} from "@/router/index.js";
 
 const router = useRouter()
 // 点击进入试题携带列表id
@@ -46,16 +47,14 @@ const handleClick = (item) => {
 
 // 返回列表
 const goToHome = ()=>{
-  router.push('/home')
+   router.push(homeRoutes.home)
 }
 
 // 问卷列表
 const testList = ref([])
 onMounted(() => {
   QuestionList().then(res => {
-    console.log(res)
     testList.value = res.data.list
-    console.log(testList.value)
   })
 })
 

+ 0 - 2
src/views/evaluation/testTopic.vue

@@ -126,7 +126,6 @@ onMounted(()=>{
       if (questions.value.length > 0) {
         currentQuestionIndex.value = 0
       }
-      console.log(questions.value);
     }).catch(err => {
       console.error('获取题目失败:', err)
     })
@@ -174,7 +173,6 @@ const handleSubmit = () => {
     ElMessage.error('检测到有题目未完成,请回答所有题目后再提交')
     return;
   }
-  console.log("userAnswers.value----", qrId.value,questResultId.value)
 
   // 答完全部答完跳转到提交页面
   QuestionTopicSave({

+ 2 - 2
src/views/gamepage/GameIndex.vue

@@ -90,6 +90,7 @@ import teachingImg from '@/assets/icon/teaching.png'
 // 引入游戏列表接口
 import { GameList } from '@/api/blockly/game.js'
 import ProgrammingSidebar from '@/components/sidebar/ProgrammingSidebar.vue'
+import {homeRoutes} from "@/router/index.js";
 const leftPanelRef = ref(null)
 const route = useRoute()
 
@@ -107,7 +108,6 @@ onMounted(() => {
   GameList().then(res => {
     // 根据接口返回的数据结构
     if (res && res.data) {
-      console.log(res);
       // 处理返回的数据
       gameData.value = res.data.list.map(item => {
         let sortNum = item.sort || 0;
@@ -159,7 +159,7 @@ const handleSearchSelect = item => {
 }
 // 返回上一页
 const goBack = () => {
-  router.push('/home')
+   router.push(homeRoutes.home)
 }
 // 跳转到游戏页面
 const goToGame = game => {

+ 2 - 1
src/views/laboratory/ExperimentType.vue

@@ -112,6 +112,7 @@ import {Message} from "@/utils/message/Message.js";
 // 获取实验室类型接口
 import { getExperimentTypeId } from '@/api/laboratory/index.js'
 import {scrollToCenter} from "@/utils/pageCss/scrollToCenter.js";
+import {aiCourseRoutes} from "@/router/index.js";
 
 // 常量配置
 const CONSTANTS = {
@@ -134,7 +135,7 @@ const scrollLeft = ref(0)
 const goBackToTopic = () => {
   localStorage.removeItem(blocklyActiveButton.value)
 
-  router.push('/aiCourseHome')
+   router.push(aiCourseRoutes.home)
 }
 
 // 定义实验类型数据

+ 0 - 1
src/views/laboratory/ExperimentalInterface.vue

@@ -326,7 +326,6 @@ const handleParentCourseData = (courseData = props.courseData) => {
 
   // 设置对话ID
   course.value.conversationId = localStorage.getItem(localStorage.getItem("token") + "-" + course.value.id)
-  console.log(course.value.conversationId)
 
   // 如果有配置,禁用视频检查
   if (courseData.isDisabled) {

+ 2 - 2
src/views/laboratory/ExperimentalTheme.vue

@@ -112,7 +112,7 @@ import logoutIcon from '@/assets/icon/logout.png'
 import { logoutLogic } from '@/utils/loginUtils.js'
 // 实验课主题接口
 import { getThemeExperimentList } from '@/api/laboratory/index.js'
-import {aiCourseRoutes} from "@/router/index.js";
+import {aiCourseRoutes, homeRoutes} from "@/router/index.js";
 import {scrollToCenter} from "@/utils/pageCss/scrollToCenter.js";
 
 // 常量定义
@@ -258,7 +258,7 @@ const goToProgrammingList = (experiment, index) => {
 const goToHomePage = () => {
   localStorage.removeItem(blocklyActiveButton.value)
 
-  router.push({ path: '/home' })
+   router.push({path: homeRoutes.home})
 }
 
 // 退出登录

+ 2 - 1
src/views/personalized/Personalized.vue

@@ -77,12 +77,13 @@ import { getReport } from '@/api/personalized/index.js'
 import { useRouter } from "vue-router";
 // 导入全局状态
 import { globalState } from '@/utils/globalState.js'
+import {homeRoutes} from "@/router/index.js";
 
 const router = useRouter();
 
 // 返回首页
 const goBack = () => {
-  router.push('/home');
+   router.push(homeRoutes.home);
 };
 
 // 课程开课率进度条数据

+ 0 - 1
src/views/programming/Interface.vue

@@ -300,7 +300,6 @@ const handleParentCourseData = (courseData = props.courseData) => {
   // 设置返回按钮标题
   boxIconTitle.value = courseData.bcName;
   // 重新定义course接收传递过来的数据
-  console.log(courseData.isDisabled);
   course.value = {
     id: courseData.id,
     courseName: courseData.bcName,

+ 2 - 2
src/views/programming/ProgrammingGame.vue

@@ -95,7 +95,7 @@ import rightbtn from '@/assets/programming/rightbtn.png'
 import logoutIcon from '@/assets/icon/logout.png'
 // 退出登录
 import { logoutLogic } from '@/utils/loginUtils.js'
-import {blocklyRoutes} from "@/router/index.js";
+import {blocklyRoutes, homeRoutes} from "@/router/index.js";
 import {scrollToCenter} from "@/utils/pageCss/scrollToCenter.js";
 
 
@@ -223,7 +223,7 @@ const goToHomePage = () => {
   localStorage.removeItem(blocklyActiveButton.value)
 
   router.push({
-    path: '/home'
+    path: homeRoutes.home
   })
 }
 

+ 2 - 1
src/views/programming/ProgrammingList.vue

@@ -112,6 +112,7 @@ import star02Image from '@/assets/programming/star02.png'
 import star01Image from '@/assets/programming/star01.png'
 import {Message} from "@/utils/message/Message.js";
 import {scrollToCenter} from "@/utils/pageCss/scrollToCenter.js";
+import {blocklyRoutes} from "@/router/index.js";
 
 // 获取路由实例
 const router = useRouter()
@@ -125,7 +126,7 @@ const categoryId = ref('')
 // 返回上一页
 const goBackIndex = () => {
   localStorage.removeItem(blocklyActiveButton.value)
-  router.push('/blocklyHome')
+  router.push(blocklyRoutes.home)
 }
 
 // 定义课程数据

+ 3 - 2
src/views/virtuallaboratory/index.vue

@@ -60,6 +60,7 @@ import LeftPanel from '@/components/LeftPanel.vue'
 import desklamp from '@/assets/images/desklamp.png'
 // 导入虚拟设备API
 import { getVirtualDeviceList } from '@/api/ai/virtualDevice';
+import {homeRoutes} from "@/router/index.js";
 
 const leftPanelRef = ref(null)
 
@@ -77,11 +78,11 @@ const router = useRouter()
 const goBack = () => {
   try {
     // 直接使用window.location.href确保页面立即跳转并刷新
-    window.location.href = '/home';
+    window.location.href = homeRoutes.home;
   } catch (error) {
     console.error('返回home页面失败:', error);
     // 备用方案
-    router.replace('/home');
+    router.replace(homeRoutes.home);
     window.location.reload();
   }
 }