# 确认最佳答案功能优化说明 ## 修改概述 按照您的要求,重新设计了"确认最佳答案"功能的交互方式,采用带提交/关闭按钮的弹窗模式,并优化了选择按钮的样式和交互体验。 ## 核心改进 ### 1. 独立的确认页面 **文件**: `workKnowledgeBaseConfirmAnswer.jsp` **特点**: - ✅ 专门的页面用于选择最佳答案 - ✅ 底部固定操作栏(显示已选数量和提交/关闭按钮) - ✅ 美观的回答卡片式布局 - ✅ 按钮样式交互(点击变色、文字切换) ### 2. 弹窗模式 **参考样式**: 使用 `skin: 'three-btns'` 和双按钮配置 **按钮**: - **提交**: 调用 iframe 内的 `doSubmit()` 方法 - **关闭**: 直接关闭弹窗 ### 3. 交互优化 #### 选择按钮样式 ```css .select-best-btn { /* 未选中状态 */ border: 1px solid #d9d9d9; color: #666; background: white; } .select-best-btn.selected { /* 选中状态 - 浅橙色 */ background-color: #ff9800; color: white; border-color: #ff9800; } ``` #### 按钮文字切换 - **未选中**: "选择为最佳答案"(灰色边框) - **已选中**: "取消选择"(浅橙色背景,白色文字) #### 数量限制反馈 - 实时显示:`已选择 X/5 条` - 超过5条时弹出提示:`最多只能选择5个最佳答案` - 提交按钮自动启用/禁用 ## 文件清单 ### 新增文件 1. **workKnowledgeBaseConfirmAnswer.jsp** - 路径: `src/main/webapp/webpage/modules/WorkKnowledgeBase/workKnowledgeBaseConfirmAnswer.jsp` - 用途: 确认最佳答案专用页面 ### 修改文件 1. **WorkKnowledgeBaseShareController.java** - 新增方法: `confirmAnswerPage()` - 用途: 提供确认页面的访问入口 2. **workKnowledgeBaseShareList.jsp** - 新增方法: `openConfirmAnswerDialog()` - 修改按钮: "确认答案"按钮调用新方法 ## 功能流程 ### 1. 打开确认页面 ```javascript // 列表页点击"确认答案"按钮 openConfirmAnswerDialog(questionId) ↓ // 打开弹窗,加载确认页面 top.layer.open({ content: '${ctx}/workKnowledgeBase/share/confirmAnswerPage?id=' + id, btn: ['提交', '关闭'] }) ``` ### 2. 选择最佳答案 ```javascript // 用户点击选择按钮 toggleSelect(btn) ↓ // 判断是否已选中 if (已选中) { 取消选择,文字变为"选择为最佳答案" } else { if (已选数量 >= 5) { 弹出提示 } else { 选中,背景变橙色,文字变为"取消选择" } } ↓ // 更新界面状态 updateUI() - 更新已选数量显示 - 启用/禁用提交按钮 ``` ### 3. 提交确认 ```javascript // 用户点击"提交确认"按钮 doSubmit() ↓ // 验证至少选择1条 if (selectedAnswers.length === 0) { 提示"请至少选择一个答案" return false; } ↓ // 弹出确认对话框 layer.confirm('确认将这 X 条回答设为最佳答案并提交吗?') ↓ // 调用后端接口 $.ajax({ url: '${ctx}/workKnowledgeBase/share/confirmMultipleBestAnswers', data: { questionId, answerIds } }) ↓ // 处理结果 if (success) { 提示"提交成功,积分已发放" 关闭弹窗 刷新列表 } ``` ## 技术要点 ### 1. 弹窗父子通信 ```javascript // 父窗口调用子窗口方法 btn1: function(index, layero) { var iframeWin = layero.find('iframe')[0]; if (iframeWin.contentWindow.doSubmit()) { // 提交成功后关闭弹窗 top.layer.close(index); } } // 子窗口暴露方法给父窗口 window.doSubmit = doSubmit; ``` ### 2. 数组参数传递 ```javascript // 使用 traditional: true 确保数组正确传递 $.ajax({ data: { answerIds: selectedAnswers }, traditional: true // 重要! }) ``` ### 3. 实时状态管理 ```javascript var selectedAnswers = []; // 存储已选答案ID // 选择时添加 selectedAnswers.push(answerId); // 取消时过滤 selectedAnswers = selectedAnswers.filter(id => id !== answerId); // 更新UI $('#selectedCount').text(selectedAnswers.length); ``` ## 样式设计 ### 回答卡片 ```css .answer-item { background: white; padding: 15px; margin-bottom: 15px; border-radius: 5px; box-shadow: 0 2px 4px rgba(0,0,0,0.05); } ``` ### 底部固定栏 ```css .footer-bar { position: fixed; bottom: 0; left: 0; right: 0; background: white; padding: 15px; box-shadow: 0 -2px 8px rgba(0,0,0,0.1); z-index: 999; } ``` ### 选择按钮交互 ```css /* 悬停效果 */ .select-best-btn:hover { color: #ff9800; border-color: #ff9800; } /* 选中状态 */ .select-best-btn.selected { background-color: #ff9800; color: white; } ``` ## 用户体验提升 ### 对比旧版 | 项目 | 旧版 | 新版 | |------|------|------| | 选择方式 | 小复选框 | 大按钮,点击变色 | | 视觉反馈 | 无明显变化 | 浅橙色高亮,文字切换 | | 操作位置 | 顶部小框 | 底部固定栏,符合习惯 | | 提交方式 | 即时确认 | 统一提交,二次确认 | | 数量提示 | 静态文本 | 实时更新,动态禁用按钮 | ### 新版优势 1. **更直观**: 大按钮比小复选框更容易点击 2. **更清晰**: 颜色变化和文字切换提供明确的视觉反馈 3. **更安全**: 底部统一提交,避免误操作 4. **更美观**: 卡片式布局,整洁大方 5. **更友好**: 实时计数和动态按钮状态 ## 注意事项 ### 1. 权限验证 - Controller 层验证:只有问题发起人可以访问 - 前端也进行了身份判断,双重保障 ### 2. 状态检查 - 问题已结束(auditStatus=8)不允许再次确认 - 已选择的答案在提交时会再次验证 ### 3. 数据一致性 - 后端 Service 层会验证每个答案的有效性 - 自动去重回答人ID进行积分发放 - 同一人的多条答案被选中时会多次赋分 ### 4. 浏览器兼容 - 使用了 ES5 语法,兼容主流浏览器 - 移动端自适应(width/height = 'auto') ## 测试建议 ### 功能测试 - [ ] 选择1-5条答案并成功提交 - [ ] 尝试选择6条,验证限制提示 - [ ] 不选择任何答案,验证提交按钮禁用 - [ ] 选中后取消,验证状态正确切换 - [ ] 非发起人尝试访问,验证权限拦截 ### 界面测试 - [ ] 不同分辨率下的显示效果 - [ ] 移动端适配 - [ ] 底部固定栏是否正常显示 - [ ] 按钮颜色和文字是否正确 ### 集成测试 - [ ] 提交成功后弹窗是否正常关闭 - [ ] 列表是否正确刷新 - [ ] 积分是否正确发放(特别是同一人多条的情况) --- **完成日期**: 2026-01-16 **版本**: v2.0 **作者**: AI Assistant