确认最佳答案功能优化说明.md 6.5 KB

确认最佳答案功能优化说明

修改概述

按照您的要求,重新设计了"确认最佳答案"功能的交互方式,采用带提交/关闭按钮的弹窗模式,并优化了选择按钮的样式和交互体验。

核心改进

1. 独立的确认页面

文件: workKnowledgeBaseConfirmAnswer.jsp

特点:

  • ✅ 专门的页面用于选择最佳答案
  • ✅ 底部固定操作栏(显示已选数量和提交/关闭按钮)
  • ✅ 美观的回答卡片式布局
  • ✅ 按钮样式交互(点击变色、文字切换)

2. 弹窗模式

参考样式: 使用 skin: 'three-btns' 和双按钮配置

按钮:

  • 提交: 调用 iframe 内的 doSubmit() 方法
  • 关闭: 直接关闭弹窗

3. 交互优化

选择按钮样式

.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. 打开确认页面

// 列表页点击"确认答案"按钮
openConfirmAnswerDialog(questionId)
  ↓
// 打开弹窗,加载确认页面
top.layer.open({
    content: '${ctx}/workKnowledgeBase/share/confirmAnswerPage?id=' + id,
    btn: ['提交', '关闭']
})

2. 选择最佳答案

// 用户点击选择按钮
toggleSelect(btn)
  ↓
// 判断是否已选中
if (已选中) {
    取消选择,文字变为"选择为最佳答案"
} else {
    if (已选数量 >= 5) {
        弹出提示
    } else {
        选中,背景变橙色,文字变为"取消选择"
    }
}
  ↓
// 更新界面状态
updateUI()
  - 更新已选数量显示
  - 启用/禁用提交按钮

3. 提交确认

// 用户点击"提交确认"按钮
doSubmit()
  ↓
// 验证至少选择1条
if (selectedAnswers.length === 0) {
    提示"请至少选择一个答案"
    return false;
}
  ↓
// 弹出确认对话框
layer.confirm('确认将这 X 条回答设为最佳答案并提交吗?')
  ↓
// 调用后端接口
$.ajax({
    url: '${ctx}/workKnowledgeBase/share/confirmMultipleBestAnswers',
    data: { questionId, answerIds }
})
  ↓
// 处理结果
if (success) {
    提示"提交成功,积分已发放"
    关闭弹窗
    刷新列表
}

技术要点

1. 弹窗父子通信

// 父窗口调用子窗口方法
btn1: function(index, layero) {
    var iframeWin = layero.find('iframe')[0];
    if (iframeWin.contentWindow.doSubmit()) {
        // 提交成功后关闭弹窗
        top.layer.close(index);
    }
}

// 子窗口暴露方法给父窗口
window.doSubmit = doSubmit;

2. 数组参数传递

// 使用 traditional: true 确保数组正确传递
$.ajax({
    data: { answerIds: selectedAnswers },
    traditional: true  // 重要!
})

3. 实时状态管理

var selectedAnswers = [];  // 存储已选答案ID

// 选择时添加
selectedAnswers.push(answerId);

// 取消时过滤
selectedAnswers = selectedAnswers.filter(id => id !== answerId);

// 更新UI
$('#selectedCount').text(selectedAnswers.length);

样式设计

回答卡片

.answer-item {
    background: white;
    padding: 15px;
    margin-bottom: 15px;
    border-radius: 5px;
    box-shadow: 0 2px 4px rgba(0,0,0,0.05);
}

底部固定栏

.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;
}

选择按钮交互

/* 悬停效果 */
.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