|
@@ -70,10 +70,11 @@
|
|
|
<div
|
|
|
v-else
|
|
|
class="single-image-container"
|
|
|
- :style="{ width: answerPaperScale }"
|
|
|
+ :style="{ width: answerPaperScale, fontSize: answerPaperFontSize }"
|
|
|
>
|
|
|
<img
|
|
|
draggable="false"
|
|
|
+ id="mark-body-paper"
|
|
|
:src="curImageUrl"
|
|
|
:style="{
|
|
|
transform:
|
|
@@ -82,7 +83,15 @@
|
|
|
}"
|
|
|
@click="switchImage"
|
|
|
@contextmenu="showBigImage"
|
|
|
+ @load="paperLoad"
|
|
|
/>
|
|
|
+ <div
|
|
|
+ v-for="(tag, tindex) in answerTags"
|
|
|
+ :key="tindex"
|
|
|
+ :style="tag.style"
|
|
|
+ >
|
|
|
+ {{ tag.answer }}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<ZoomPaper v-if="student" showRotate fixed @rotateRight="rotateRight" />
|
|
@@ -182,8 +191,9 @@ import ZoomPaper from "@/components/ZoomPaper.vue";
|
|
|
import { useTimers } from "@/setups/useTimers";
|
|
|
import { ArrowLeftOutlined, ArrowRightOutlined } from "@ant-design/icons-vue";
|
|
|
import vls from "@/utils/storage";
|
|
|
-import { StudentObjectiveInfo } from "@/types";
|
|
|
+import { StudentObjectiveInfo, PaperRecogData } from "@/types";
|
|
|
import { doLogout } from "@/api/markPage";
|
|
|
+import { maxNum } from "@/utils/utils";
|
|
|
|
|
|
const { addTimeout } = useTimers();
|
|
|
|
|
@@ -215,6 +225,15 @@ const curImageUrl = $computed(() =>
|
|
|
let student: StudentObjectiveInfo | null = $ref(null);
|
|
|
/** 后台数据错误,停止整个页面的流程 */
|
|
|
let dataError = $ref(false);
|
|
|
+let answerMap: Record<string, string> = {};
|
|
|
+
|
|
|
+interface AnswerTagType {
|
|
|
+ mainNumber: number;
|
|
|
+ subNumber: number;
|
|
|
+ answer: string;
|
|
|
+ style: Record<string, string>;
|
|
|
+}
|
|
|
+let answerTags = $ref([]);
|
|
|
|
|
|
const answersComputed = $computed(() => {
|
|
|
let mains = student?.answers.map((v) => ({
|
|
@@ -276,6 +295,11 @@ async function getStudent(studentId: string) {
|
|
|
currentImage = 0;
|
|
|
browsedImageIndexes = [0];
|
|
|
|
|
|
+ answerMap = {};
|
|
|
+ stu.answers.forEach((item) => {
|
|
|
+ answerMap[`${item.mainNumber}_${item.subNumber}`] = item.answer;
|
|
|
+ });
|
|
|
+
|
|
|
return stu;
|
|
|
}
|
|
|
|
|
@@ -346,6 +370,46 @@ async function saveStudentAnswer() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+function paperLoad() {
|
|
|
+ if (!student.sheetUrls[currentImage]?.recogData) {
|
|
|
+ answerTags = [];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const imgDom = document.getElementById("mark-body-paper");
|
|
|
+ const { naturalWidth, naturalHeight } = imgDom;
|
|
|
+ const recogData: PaperRecogData = JSON.parse(
|
|
|
+ window.atob(student.sheetUrls[currentImage].recogData)
|
|
|
+ );
|
|
|
+
|
|
|
+ answerTags = [];
|
|
|
+ recogData.question.forEach((question) => {
|
|
|
+ question.fill_result.forEach((result) => {
|
|
|
+ const tagSize = result.fill_size[1];
|
|
|
+ const fillPositions = result.fill_position.map((pos) => {
|
|
|
+ return pos.split(",").map((n) => n * 1);
|
|
|
+ });
|
|
|
+ const tagLeft =
|
|
|
+ maxNum(fillPositions.map((pos) => pos[0])) + result.fill_size[0] + 2;
|
|
|
+
|
|
|
+ answerTags.push({
|
|
|
+ mainNumber: result.main_number,
|
|
|
+ subNumber: result.sub_number,
|
|
|
+ answer: answerMap[`${result.main_number}_${result.sub_number}`],
|
|
|
+ style: {
|
|
|
+ height: ((100 * tagSize) / naturalHeight).toFixed(2) + "%",
|
|
|
+ fontSize: ((100 * 20) / tagSize).toFixed(2) + "%",
|
|
|
+ left: ((100 * tagLeft) / naturalWidth).toFixed(2) + "%",
|
|
|
+ top: ((100 * fillPositions[0][1]) / naturalHeight).toFixed(2) + "%",
|
|
|
+ position: "absolute",
|
|
|
+ color: "#f53f3f",
|
|
|
+ lineHeight: 1,
|
|
|
+ zIndex: 9,
|
|
|
+ },
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
//#region : 显示大图,供查看和翻转
|
|
|
let currentImage = $ref(0);
|
|
|
let browsedImageIndexes = $ref([0]);
|
|
@@ -437,6 +501,10 @@ const answerPaperScale = $computed(() => {
|
|
|
const scale = store.setting.uiSetting["answer.paper.scale"];
|
|
|
return scale * 100 + "%";
|
|
|
});
|
|
|
+const answerPaperFontSize = $computed(() => {
|
|
|
+ const scale = store.setting.uiSetting["answer.paper.scale"];
|
|
|
+ return scale * 14 + "px";
|
|
|
+});
|
|
|
//#endregion : 放大缩小和之后的滚动
|
|
|
|
|
|
//#region rotateRight
|