diff --git a/src/components/marking/components/renderer/MarkingImageViewerNew.vue b/src/components/marking/components/renderer/MarkingImageViewerNew.vue
index 06b9608..7c996dc 100644
--- a/src/components/marking/components/renderer/MarkingImageViewerNew.vue
+++ b/src/components/marking/components/renderer/MarkingImageViewerNew.vue
@@ -2,11 +2,11 @@
import type { KonvaMarkingData } from '../../composables/renderer/useMarkingKonva'
import type { ExamStudentMarkingQuestionResponse } from '@/api'
import { markingSettings } from '../../composables/useMarkingSettings'
-import { useSmartScale } from '../../composables/useSmartScale'
import QuestionRenderer from './QuestionRenderer.vue'
interface Props {
imageSize: number
+ questionData: ExamStudentMarkingQuestionResponse[]
}
const props = defineProps
()
@@ -15,16 +15,43 @@ const emit = defineEmits<{
'marking-change': [questionIndex: number, imageIndex: number, data: KonvaMarkingData]
}>()
-// 智能缩放控制
-const smartScale = useSmartScale(props.imageSize)
+const scale = defineModel('scale', { default: 1.0 })
-const questionData = defineModel('questionData')
+// 智能缩放控制 - 内联实现
+// 用户手动调节的缩放因子(1.0 = 默认100%,0.5 = 缩小50%,2.0 = 放大200%)
+const userScaleFactor = ref(scale.value || 1.0)
+
+// 最终的缩放比例 - 默认100%
+const finalScale = computed(() => {
+ return userScaleFactor.value
+})
+
+// 设置缩放比例(用于手势缩放)
+function setScale(newScale: number) {
+ // 限制缩放范围:0.1倍到5倍
+ const clampedScale = Math.max(0.1, Math.min(5.0, newScale))
+ userScaleFactor.value = clampedScale
+ scale.value = clampedScale
+}
+
+// 缩放级别文本
+const scaleText = computed(() => {
+ const percentage = Math.round(userScaleFactor.value * 100)
+ return `${percentage}%`
+})
+
+// 同步外部 scale 变化到内部状态
+watch(scale, (newScale) => {
+ if (newScale !== undefined && newScale !== userScaleFactor.value) {
+ userScaleFactor.value = newScale
+ }
+})
// 手势缩放相关
const containerRef = ref()
const initialDistance = ref(0)
-const initialScale = ref(1)
const isGesturing = ref(false)
+const initialScale = ref(1.0)
/**
* 计算两点之间的距离
@@ -43,7 +70,7 @@ function handleTouchStart(e: TouchEvent) {
// 双指触摸,开始缩放手势
isGesturing.value = true
initialDistance.value = getDistance(e.touches[0], e.touches[1])
- initialScale.value = smartScale.userScaleFactor.value
+ initialScale.value = userScaleFactor.value
e.preventDefault()
}
}
@@ -61,7 +88,7 @@ function handleTouchMove(e: TouchEvent) {
// 应用新的缩放比例
const newScale = initialScale.value * scaleChange
- smartScale.setScale(newScale)
+ setScale(newScale)
e.preventDefault()
}
@@ -86,10 +113,10 @@ const questionsLayoutClass = computed(() => ({
// 转换为渲染数据
const questionDataList = computed(() => {
- if (!questionData.value?.length)
+ if (!props.questionData?.length)
return []
- return questionData.value.map((item, index) => ({
+ return props.questionData.map((item, index) => ({
id: `question_${item.tpl_question_id || index}_${item.scan_info_id}_${index}`,
title: `${item.question_major || ''}${item.question_minor || ''}`,
fullScore: item.full_score || 0,
@@ -109,8 +136,8 @@ function handleMarkingChange(questionIndex: number, imageIndex: number, data: Ko
@@ -118,7 +145,7 @@ function handleMarkingChange(questionIndex: number, imageIndex: number, data: Ko
v-if="isGesturing"
class="fixed left-1/2 top-1/2 z-50 rounded-lg bg-black/70 px-4 py-2 text-white -translate-x-1/2 -translate-y-1/2"
>
- {{ smartScale.scaleText.value }}
+ {{ scaleText }}
@@ -127,7 +154,7 @@ function handleMarkingChange(questionIndex: number, imageIndex: number, data: Ko
:key="question.id"
:question="question"
:question-index="questionIndex"
- :scale="smartScale.finalScale.value"
+ :scale="finalScale"
:image-layout="markingSettings.imageLayout"
:show-toolbar="markingSettings.showTraceToolbar"
class="question-item w-fit"
@@ -140,6 +167,7 @@ function handleMarkingChange(questionIndex: number, imageIndex: number, data: Ko