guoyu/log/题目编辑自动保存功能说明.md

281 lines
7.3 KiB
Markdown
Raw Normal View History

# 题目编辑自动保存功能说明
## 🎯 **功能需求**
### **问题场景**
1. 打开试卷的"题目管理"对话框图2
2. 点击某个题目的"编辑"按钮
3. 跳转到题目编辑页面图1
4. 编辑题目后点击"保存"
5. **旧流程**:直接返回试卷管理列表,题目管理对话框没有保存
6. **问题**:需要再次打开题目管理,点击"保存"按钮才能保存所有题目
### **期望流程**
1. 编辑题目点击"保存"后
2. ✅ 自动触发题目管理对话框的"保存"按钮
3. ✅ 保存所有题目到数据库
4. ✅ 自动更新试卷的题目数和总分
---
## ✅ **实现方案**
### **方案说明**
1. 题目编辑保存后,设置标记 `autoSaveQuestionList`
2. 返回到试卷管理页面
3. `activated` 钩子检测到标记
4. 自动打开题目管理对话框
5. 自动触发保存操作
6. 保存后对话框保持打开状态(用户可以继续编辑其他题目)
### **修改的文件**
#### **1. questionEdit.vue题目编辑页面**
**修改位置:** 保存成功后的逻辑
```javascript
.then(() => {
sessionStorage.removeItem('savedQuestion');
// 保留 questionListForExam让题目管理对话框能够保存整个列表
sessionStorage.removeItem('pendingQuestionExamId');
// 标记需要自动保存题目列表
sessionStorage.setItem('autoSaveQuestionList', 'true');
sessionStorage.setItem('lastSavedExamId', this.examId);
this.$modal.msgSuccess("保存成功");
this.$router.back();
})
```
#### **2. index.vue试卷管理页面**
**修改1activated钩子**
```javascript
activated() {
// 从题目编辑页面返回时,自动保存题目列表
if (sessionStorage.getItem('autoSaveQuestionList') === 'true') {
sessionStorage.removeItem('autoSaveQuestionList');
const lastExamId = sessionStorage.getItem('lastSavedExamId');
if (lastExamId) {
const examId = Number(lastExamId);
const targetExam = this.examList.find(item => item.id === examId);
if (targetExam) {
// 打开题目管理对话框
this.handleManageQuestions(targetExam);
// 等待对话框打开后,自动触发保存
this.$nextTick(() => {
setTimeout(() => {
if (this.questionDialog && this.questionList.length > 0) {
// 传入false保存后不关闭对话框
this.handleSaveQuestions(false);
}
}, 500);
});
}
}
}
}
```
**修改2handleSaveQuestions方法**
```javascript
/**
* 保存题目
* @param autoClose 是否在保存成功后自动关闭对话框默认true
*/
handleSaveQuestions(autoClose = true) {
// ... 保存逻辑 ...
.then(response => {
// 更新题目列表
this.currentExam = response.data || {};
this.questionList = ...;
// 根据autoClose参数决定是否关闭对话框
if (autoClose) {
this.questionDialog = false;
}
this.getList();
})
}
```
---
## 🔄 **完整流程**
### **用户操作流程**
```
1. 试卷管理页面
2. 点击"题目管理"
3. 题目管理对话框打开(显示所有题目)
4. 点击某个题目的"编辑"按钮
5. 跳转到题目编辑页面
6. 修改题目内容、选项、答案、分数等
7. 点击"保存"按钮
8. 【自动】保存单个题目到后端
9. 【自动】返回试卷管理页面
10. 【自动】重新打开题目管理对话框
11. 【自动】触发"保存"按钮
12. 【自动】保存所有题目到数据库
13. 【自动】更新试卷的题目数和总分
14. 【完成】对话框保持打开,用户可以继续编辑其他题目
```
---
## ⚙️ **技术实现细节**
### **关键技术点**
1. **SessionStorage标记**
- `autoSaveQuestionList`: 标记需要自动保存
- `lastSavedExamId`: 记录最后保存的考试ID
2. **activated生命周期钩子**
- 页面激活时检测标记
- 自动执行保存操作
3. **延迟执行**
- 使用 `$nextTick` + `setTimeout` 确保对话框完全加载
- 延迟500ms避免过快执行导致数据未准备好
4. **保存参数控制**
- `autoClose` 参数控制是否自动关闭对话框
- 自动保存时传入 `false`,保持对话框打开
---
## 🧪 **测试步骤**
### **测试场景1编辑题目后自动保存**
1. 打开一个试卷的"题目管理"
2. 点击某个题目的"编辑"按钮
3. 修改题目内容(如题干、选项、分数)
4. 点击"保存"按钮
5. **预期结果:**
- ✅ 显示"保存成功"提示
- ✅ 返回试卷管理页面
- ✅ 题目管理对话框自动打开
- ✅ 显示"题目保存成功"提示
- ✅ 题目列表显示最新内容
- ✅ 对话框保持打开状态
- ✅ 试卷总分自动更新
### **测试场景2修改题目分数后总分更新**
1. 试卷初始总分20分2道题各10分
2. 编辑第一道题修改分数为15分
3. 保存题目
4. **预期结果:**
- ✅ 自动保存成功
- ✅ 试卷总分更新为25分15+10
- ✅ 题目数保持为2
### **测试场景3新增题目后更新题目数**
1. 试卷初始题目数2道题
2. 在题目管理中新增一道题
3. 编辑新题目,填写内容
4. 保存题目
5. **预期结果:**
- ✅ 自动保存成功
- ✅ 试卷题目数更新为3
- ✅ 试卷总分自动更新
---
## ⚠️ **注意事项**
### **1. 对话框打开延迟**
- 自动保存会有约500ms的延迟
- 这是为了确保对话框完全加载
- 用户会看到对话框打开的动画
### **2. 保存后不关闭**
- 手动点击"保存"按钮:保存后关闭对话框
- 自动触发保存:保存后保持对话框打开
- 这样用户可以继续编辑其他题目
### **3. 标记清理**
- 保存成功后会清除 `autoSaveQuestionList` 标记
- 避免下次进入页面时误触发
### **4. 兼容性**
- 旧的刷新逻辑(`needRefreshList`)保持不变
- 不影响其他页面的正常功能
---
## 🐛 **可能的问题**
### **问题1对话框打开太快或太慢**
**原因:** 延迟时间不合适
**解决:** 调整 `setTimeout` 的延迟时间当前500ms
### **问题2保存失败**
**原因:** 题目数据不完整或后端错误
**解决:**
- 检查题目数据是否完整
- 查看浏览器控制台和后端日志
- 确保后端 `saveQuestions` API 正常
### **问题3总分没有更新**
**原因:** 后端保存题目时没有更新考试信息
**解决:**
- 检查 `StudyExamController.editQuestions` 方法
- 确保保存题目后重新计算总分和题目数
---
## 📝 **后续优化建议**
### **优化1无缝编辑**
- 将题目编辑改为对话框形式
- 不需要跳转页面
- 体验更流畅
### **优化2实时保存**
- 题目编辑时自动保存草稿
- 不需要手动点击保存
- 防止数据丢失
### **优化3批量编辑**
- 支持同时编辑多个题目
- 一次性保存所有更改
- 提高编辑效率
---
## ✅ **验收标准**
- [ ] 编辑题目保存后,自动触发题目管理对话框的保存
- [ ] 保存后对话框保持打开状态
- [ ] 试卷题目数自动更新
- [ ] 试卷总分自动更新
- [ ] 不影响其他功能的正常使用
- [ ] 没有出现错误提示
- [ ] 数据保存到数据库正确