diff --git a/public/.~questions.xlsx b/public/.~questions.xlsx deleted file mode 100644 index 70c5cdf..0000000 Binary files a/public/.~questions.xlsx and /dev/null differ diff --git a/public/questions.xlsx b/public/questions.xlsx index 1a5b9aa..7b3c095 100644 Binary files a/public/questions.xlsx and b/public/questions.xlsx differ diff --git a/public/survey.html b/public/survey.html index e7d5978..95528fc 100644 --- a/public/survey.html +++ b/public/survey.html @@ -1769,49 +1769,8 @@ const urlParams = new URLSearchParams(window.location.search); const assessmentParam = urlParams.get('assessment'); - if (assessmentParam) { - try { - // 使用 UTF-8 兼容的解码方法 - const assessmentParams = JSON.parse(this.base64ToUtf64(assessmentParam)); - - // 应用筛选条件 - if (assessmentParams.selectedSubject) { - document.getElementById('subjectFilterSelect').value = assessmentParams.selectedSubject; - this.onSubjectFilterChange(); - } - - if (assessmentParams.selectedSemester) { - document.getElementById('gradeFilterSelect').value = assessmentParams.selectedSemester; - this.onGradeFilterChange(); - } - - if (assessmentParams.selectedUnit) { - // 延迟设置单元,等待年级选择后再设置单元 - setTimeout(() => { - document.getElementById('unitFilterSelect').value = assessmentParams.selectedUnit; - this.onUnitFilterChange(); - }, 100); - } - - if (assessmentParams.scoreRange) { - document.getElementById('scoreRangeSelect').value = assessmentParams.scoreRange; - this.onScoreRangeChange(); - } - - // 显示提示信息 - this.showNotification('测评配置已自动加载,请填写学员信息后开始答题'); - - } catch (error) { - console.error('解析测评参数失败:', error); - this.showErrorDialog('测评链接解析失败', - `测评链接参数解析失败,请手动配置测评。

- 可能的原因:
- • 链接格式不正确
- • 链接已损坏
- • 浏览器兼容性问题` - ); - } - } + // 注意:现在不再使用assessment参数,因为测评链接直接使用会话ID + // 保留此函数是为了向后兼容,但不再处理assessment参数 } async loadQuestions() { @@ -2053,23 +2012,14 @@ } displayAutoRules() { - // 显示自动配置结果区域 - document.getElementById('autoRulesDisplay').style.display = 'grid'; + // 不显示自动配置结果区域 + document.getElementById('autoRulesDisplay').style.display = 'none'; - // 更新各类型题目数量 - document.getElementById('autoBasicCount').textContent = this.currentRules['基础题']; - document.getElementById('autoAdvancedCount').textContent = this.currentRules['进阶题']; - document.getElementById('autoCompetitionCount').textContent = this.currentRules['竞赛题']; - - // 计算并更新分数 + // 计算题目总数和总分数 const basicScore = this.currentRules['基础题'] * 5; const advancedScore = this.currentRules['进阶题'] * 10; const competitionScore = this.currentRules['竞赛题'] * 15; - document.getElementById('autoBasicScore').textContent = basicScore; - document.getElementById('autoAdvancedScore').textContent = advancedScore; - document.getElementById('autoCompetitionScore').textContent = competitionScore; - // 更新总计 const totalQuestions = this.currentRules['基础题'] + this.currentRules['进阶题'] + this.currentRules['竞赛题']; const totalScore = basicScore + advancedScore + competitionScore; @@ -2365,22 +2315,7 @@ } } - // UTF-8 字符串转 Base64 编码 - utf8ToBase64(str) { - // 将字符串转换为 UTF-8 字节 - const utf8Bytes = new TextEncoder().encode(str); - // 将字节转换为 Base64 - return btoa(String.fromCharCode(...utf8Bytes)); - } - - // Base64 解码为 UTF-8 字符串 - base64ToUtf64(base64) { - // 将 Base64 转换为字节 - const bytes = Uint8Array.from(atob(base64), c => c.charCodeAt(0)); - // 将字节转换为 UTF-8 字符串 - return new TextDecoder().decode(bytes); - } - + async generateAssessmentLink() { try { // 验证学员信息(和开始答题一样的验证逻辑) @@ -2435,55 +2370,70 @@ generateBtn.querySelector('.button-text').textContent = '正在生成链接...'; generateBtn.disabled = true; - // 构建测评参数(包含学员信息和配置) - const assessmentParams = { - selectedSubject: document.getElementById('subjectFilterSelect').value || '', - selectedSemester: document.getElementById('gradeFilterSelect').value || '', - selectedExamType: '', - selectedUnit: document.getElementById('unitFilterSelect').value || '', - selectedCategory: '', - selectedQuestionType: '', - selectedTag: this.selectedTag, - selectedTagsList: [], - questionsConfig: this.currentRules, - scoreRange: scoreRange - }; - - // 使用 UTF-8 兼容的 Base64 编码 - const encodedParams = this.utf8ToBase64(JSON.stringify(assessmentParams)); - - // 生成测评链接 - const baseUrl = window.location.origin + window.location.pathname.split('/').slice(0, -1).join('/') + '/survey.html'; - const assessmentLink = `${baseUrl}?assessment=${encodedParams}`; - - // 复制链接到剪贴板 - await navigator.clipboard.writeText(assessmentLink); - - // 显示成功对话框 - this.showDialog({ - title: '测评链接生成成功!', - content: `
-
🎉
-
- 测评链接已生成并复制到剪贴板! -
-
- 学生信息:${studentName} | ${studentSchool} | ${studentGrade} -
-
- 测评链接:
- ${assessmentLink} -
-
- 请将此链接发送给学生,学生点击后即可开始答题 -
-
`, - onConfirm: null, - showCancel: false + // 调用后端API创建会话(和开始答题一样的逻辑) + const response = await fetch('/api/create-session', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + name: studentName, + school: studentSchool, + grade: studentGrade, + phone: studentPhone, + selectedSubject: document.getElementById('subjectFilterSelect').value || '', + selectedSemester: document.getElementById('gradeFilterSelect').value || '', + selectedExamType: '', + selectedUnit: document.getElementById('unitFilterSelect').value || '', + selectedCategory: '', + selectedQuestionType: '', + selectedTag: this.selectedTag, + selectedTagsList: [], + questionsConfig: this.currentRules, + scoreRange: scoreRange + }) }); - // 可选:在控制台输出链接,方便调试 - console.log('生成的测评链接:', assessmentLink); + if (!response.ok) { + throw new Error(`创建会话失败: ${response.status}`); + } + + const result = await response.json(); + + if (result.success) { + // 生成答题页面链接 + const assessmentLink = `${window.location.origin}/quiz/${result.sessionId}`; + + // 复制链接到剪贴板 + await navigator.clipboard.writeText(assessmentLink); + // 显示成功对话框 + this.showDialog({ + title: '测评链接生成成功!', + content: `
+
🎉
+
+ 测评链接已生成并复制到剪贴板! +
+
+ 学生信息:${studentName} | ${studentSchool} | ${studentGrade} +
+
+ 答题链接:
+ ${assessmentLink} +
+
+ 请将此链接发送给学生,学生点击后即可开始答题 +
+
`, + onConfirm: null, + showCancel: false + }); + + // 可选:在控制台输出链接,方便调试 + console.log('生成的答题链接:', assessmentLink); + } else { + throw new Error('创建会话失败'); + } } catch (error) { console.error('生成测评链接失败:', error);