feat: 参考答案图片上传 + AI提示词分有无标准答案图片两种流程
This commit is contained in:
@@ -113,6 +113,7 @@ async function gradeQuestion(questionIdx: number) {
|
||||
rubric: q.rubric || `请根据答案内容评分,满分${q.maxScore}分`,
|
||||
maxScore: q.maxScore,
|
||||
referenceAnswer: q.referenceAnswer,
|
||||
referenceAnswerImage: q.referenceAnswerImage,
|
||||
questionTitle: q.questionTitle,
|
||||
apiConfig: {
|
||||
apiKey: settingsStore.settings.apiKey,
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
<div class="result-section" v-if="currentQuestion.referenceAnswer">
|
||||
<div class="section-title">参考答案</div>
|
||||
<div class="reference-text">{{ currentQuestion.referenceAnswer }}</div>
|
||||
<img v-if="currentQuestion.referenceAnswerImage" class="ref-image" :src="'data:image/png;base64,' + currentQuestion.referenceAnswerImage" />
|
||||
</div>
|
||||
|
||||
<div class="result-score">
|
||||
@@ -143,6 +144,7 @@ async function gradeAt(idx: number) {
|
||||
rubric: q.rubric || `请根据答案内容评分,满分${q.maxScore}分`,
|
||||
maxScore: q.maxScore,
|
||||
referenceAnswer: q.referenceAnswer,
|
||||
referenceAnswerImage: q.referenceAnswerImage,
|
||||
questionTitle: q.questionTitle,
|
||||
apiConfig: {
|
||||
apiKey: settingsStore.settings.apiKey,
|
||||
@@ -353,6 +355,13 @@ async function confirmScore() {
|
||||
border-radius: 6px;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
.ref-image {
|
||||
max-width: 100%;
|
||||
max-height: 300px;
|
||||
border-radius: 6px;
|
||||
margin-top: 8px;
|
||||
border: 1px solid #e4e7ed;
|
||||
}
|
||||
.error-message {
|
||||
background: #fef0f0;
|
||||
color: #f56c6c;
|
||||
|
||||
@@ -25,6 +25,15 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="参考答案">
|
||||
<el-input v-model="questions[activeIndex].referenceAnswer" type="textarea" :rows="3" placeholder="输入参考答案(可选)" />
|
||||
<div class="ref-image-section">
|
||||
<template v-if="questions[activeIndex].referenceAnswerImage">
|
||||
<div class="ref-image-preview">
|
||||
<img :src="'data:image/png;base64,' + questions[activeIndex].referenceAnswerImage" />
|
||||
<el-button size="small" type="danger" text @click="removeRefImage(activeIndex)">删除图片</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<el-button size="small" @click="uploadRefImage(activeIndex)">上传参考答案图片</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="评分标准">
|
||||
<el-input v-model="questions[activeIndex].rubric" type="textarea" :rows="6" placeholder="输入评分标准" />
|
||||
@@ -128,6 +137,18 @@ async function handleImport() {
|
||||
function handleClose() {
|
||||
window.electronAPI?.dialog.close()
|
||||
}
|
||||
|
||||
async function uploadRefImage(idx: number) {
|
||||
if (!window.electronAPI) return
|
||||
const data = await window.electronAPI.dialog.openImage()
|
||||
if (data) {
|
||||
questions.value[idx].referenceAnswerImage = data.base64
|
||||
}
|
||||
}
|
||||
|
||||
function removeRefImage(idx: number) {
|
||||
delete questions.value[idx].referenceAnswerImage
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@@ -178,4 +199,21 @@ function handleClose() {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
.ref-image-section {
|
||||
margin-top: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.ref-image-preview {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.ref-image-preview img {
|
||||
max-height: 120px;
|
||||
max-width: 200px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #e4e7ed;
|
||||
}
|
||||
</style>
|
||||
+2
-1
@@ -3,6 +3,7 @@ export interface QuestionItem {
|
||||
maxScore: number
|
||||
referenceAnswer: string
|
||||
rubric: string
|
||||
referenceAnswerImage?: string
|
||||
}
|
||||
|
||||
export interface GradeResult {
|
||||
@@ -56,7 +57,7 @@ export interface ElectronAPI {
|
||||
onCompleted: (callback: (base64: string) => void) => () => void
|
||||
}
|
||||
ai: {
|
||||
grade: (data: { imageBase64: string; rubric: string; apiConfig: ApiConfig; maxScore?: number; referenceAnswer?: string; questionTitle?: string }) => Promise<GradeResult>
|
||||
grade: (data: { imageBase64: string; rubric: string; apiConfig: ApiConfig; maxScore?: number; referenceAnswer?: string; questionTitle?: string; referenceAnswerImage?: string }) => Promise<GradeResult>
|
||||
}
|
||||
settings: {
|
||||
get: () => Promise<AppSettings>
|
||||
|
||||
Reference in New Issue
Block a user