From 7ec72d865a839f89bdc1da03ec424f2395e53dd5 Mon Sep 17 00:00:00 2001 From: zhangxiaohua <827885272@qq.com> Date: Mon, 19 Jan 2026 16:09:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/layouts/BasicLayout.vue | 34 ++++++++++++------- .../src/views/activities/ReviewDetail.vue | 19 ++++++++++- frontend/src/views/model/ModelViewer.vue | 9 ++--- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/frontend/src/layouts/BasicLayout.vue b/frontend/src/layouts/BasicLayout.vue index 9ffe0c5..125c1a9 100644 --- a/frontend/src/layouts/BasicLayout.vue +++ b/frontend/src/layouts/BasicLayout.vue @@ -12,8 +12,9 @@

CMS

- +
{ return route.meta?.hideSidebar === true }) +// 判断是否可以访问3D建模实验室(仅学生和教师角色可见) +const canAccess3DLab = computed(() => { + return authStore.hasAnyRole(["student", "teacher"]) +}) + // 使用动态菜单 const menuItems = computed(() => { if (authStore.menus && authStore.menus.length > 0) { @@ -119,18 +125,22 @@ const menuItems = computed(() => { return [] }) -// 过滤掉3D建模实验室的菜单项(因为已经作为固定入口展示) +// 过滤掉3D建模实验室的菜单项(仅当用户能看到快捷入口时才过滤,避免重复显示) const filteredMenuItems = computed(() => { const items = menuItems.value || [] - return items.filter((item: any) => { - // 检查是否是3D建模实验室菜单 - const is3DLab = - item?.key?.toLowerCase().includes("3dlab") || - item?.key?.toLowerCase().includes("3d-lab") || - item?.label?.includes("3D建模") || - item?.title?.includes("3D建模") - return !is3DLab - }) + // 如果用户能看到快捷入口,则过滤掉菜单中的3D实验室 + if (canAccess3DLab.value) { + return items.filter((item: any) => { + // 检查是否是3D建模实验室菜单 + const is3DLab = + item?.key?.toLowerCase().includes("3dlab") || + item?.key?.toLowerCase().includes("3d-lab") || + item?.label?.includes("3D建模") || + item?.title?.includes("3D建模") + return !is3DLab + }) + } + return items }) // 打开3D建模实验室(当前窗口跳转,更快) @@ -292,7 +302,7 @@ $primary-light: #40a9ff; display: flex; align-items: center; justify-content: center; - padding: 16px 12px; + padding: 25px 16px 12px; margin-bottom: 8px; img { diff --git a/frontend/src/views/activities/ReviewDetail.vue b/frontend/src/views/activities/ReviewDetail.vue index 63e9f2d..0da7feb 100644 --- a/frontend/src/views/activities/ReviewDetail.vue +++ b/frontend/src/views/activities/ReviewDetail.vue @@ -72,7 +72,7 @@ {{ (pagination.current - 1) * pagination.pageSize + index + 1 }} @@ -110,6 +116,7 @@ import type { TableProps } from "ant-design-vue" import { SearchOutlined, ReloadOutlined } from "@ant-design/icons-vue" import { reviewsApi, contestsApi } from "@/api/contests" import ReviewWorkModal from "./components/ReviewWorkModal.vue" +import WorkDetailModal from "../contests/components/WorkDetailModal.vue" const route = useRoute() const tenantCode = route.params.tenantCode as string @@ -184,6 +191,10 @@ const reviewModalVisible = ref(false) const currentAssignmentId = ref(null) const currentWorkId = ref(null) +// 作品详情弹框 +const workDetailModalVisible = ref(false) +const viewWorkId = ref(null) + // 获取赛事信息 const fetchContestInfo = async () => { try { @@ -236,6 +247,12 @@ const handleTableChange = (pag: any) => { fetchList() } +// 查看作品详情 +const handleViewWork = (record: any) => { + viewWorkId.value = record.workId + workDetailModalVisible.value = true +} + // 评审作品 const handleReview = (record: any) => { currentAssignmentId.value = record.id diff --git a/frontend/src/views/model/ModelViewer.vue b/frontend/src/views/model/ModelViewer.vue index 7782c3c..15495bd 100644 --- a/frontend/src/views/model/ModelViewer.vue +++ b/frontend/src/views/model/ModelViewer.vue @@ -742,11 +742,6 @@ const switchModel = (direction: number) => { updateCurrentModelUrl() // 重置渲染模式为默认 currentRenderMode.value = "textured" - // 重置自动旋转 - autoRotate.value = false - if (controls) { - controls.autoRotate = false - } // 重新加载模型 loadModel() } @@ -1302,13 +1297,13 @@ const loadModel = async () => { const distanceForWidth = size.x / 2 / Math.tan(fovRad / 2) / aspect const distanceForDepth = size.z / 2 / Math.tan(fovRad / 2) - // 取最大距离,并添加适当的边距(1.8倍,让模型显示更大) + // 取最大距离,并添加适当的边距(0.9倍,让模型显示更大更近) const baseDistance = Math.max( distanceForHeight, distanceForWidth, distanceForDepth ) - const cameraDistance = Math.max(baseDistance * 1.8, maxDim * 1.8, 5) + const cameraDistance = Math.max(baseDistance * 0.9, maxDim * 0.9, 2) console.log("模型尺寸:", size) console.log("计算的相机距离:", cameraDistance)