Skip to content

Latest commit

 

History

History
294 lines (233 loc) · 7.03 KB

File metadata and controls

294 lines (233 loc) · 7.03 KB

评论功能修复 - 完成!

修复时间: 2026-03-05 08:55 问题: 用户端点击添加评论失败 原因: 后端缺少评论 API 状态: ✅ 已修复并上线


问题分析

用户报告在用户端点击"添加评论"按钮时失败。经过检查发现:

  1. 数据库表存在 - feedback_comments 表已经创建
  2. 后端 API 缺失 - server/index.ts 中没有评论相关的 API 路由
  3. 前端代码正常 - 前端已经实现了评论功能,只是后端没有对应的接口

修复内容

1. 添加获取评论 API

// API: 获取反馈的所有评论
app.get('/api/feedback/:feedbackId/comments', (req, res) => {
  try {
    const { feedbackId } = req.params

    const comments = db.prepare(
      'SELECT * FROM feedback_comments WHERE feedback_id = ? ORDER BY created_at ASC'
    ).all(feedbackId) as any[]

    res.json({
      success: true,
      comments: comments.map(c => ({
        ...c,
        created_at: new Date(c.created_at).toISOString()
      }))
    })
  } catch (error) {
    console.error('获取评论失败:', error)
    res.status(500).json({ error: '获取评论失败' })
  }
})

2. 添加评论 API

// API: 添加评论
app.post('/api/feedback/:feedbackId/comments', (req, res) => {
  try {
    const { feedbackId } = req.params
    const { content, commenterType } = req.body

    // 参数验证
    if (!content || !commenterType) {
      return res.status(400).json({ error: '缺少必要参数' })
    }

    if (content.trim().length < 2) {
      return res.status(400).json({ error: '评论内容至少需要 2 个字符' })
    }

    if (content.trim().length > 1000) {
      return res.status(400).json({ error: '评论内容不能超过 1000 个字符' })
    }

    if (!['user', 'admin'].includes(commenterType)) {
      return res.status(400).json({ error: '无效的评论者类型' })
    }

    const createdAt = Date.now()
    const adminIp = commenterType === 'admin' ? (req.ip || req.socket.remoteAddress || 'unknown') : null

    // 插入评论
    const stmt = db.prepare(
      'INSERT INTO feedback_comments (feedback_id, commenter_type, content, created_at, admin_ip) VALUES (?, ?, ?, ?, ?)'
    )
    const result = stmt.run(feedbackId, commenterType, content.trim(), createdAt, adminIp)

    res.json({
      success: true,
      comment: {
        id: result.lastInsertRowid,
        feedback_id: feedbackId,
        commenter_type: commenterType,
        content: content.trim(),
        created_at: new Date(createdAt).toISOString()
      }
    })
  } catch (error) {
    console.error('添加评论失败:', error)
    res.status(500).json({ error: '添加评论失败' })
  }
})

3. 修复路由顺序

app.listen 移到所有 API 路由定义之后,确保路由正确注册。

4. 增强设备反馈 API

在获取设备反馈时,添加 solutionsolution_updated_at 字段:

const feedbacks = db.prepare(
  'SELECT id, category, original_content, created_at, status, solution, solution_updated_at FROM feedbacks WHERE device_id = ? ORDER BY created_at DESC'
).all(deviceId) as any[]

API 测试

测试 1: 添加评论

curl -X POST http://localhost:4000/api/feedback/05809786-053f-4eb0-a895-7a2b4d403e39/comments \
  -H "Content-Type: application/json" \
  -d '{"content":"测试评论","commenterType":"user"}'

响应:

{
  "success": true,
  "comment": {
    "id": 9,
    "feedback_id": "05809786-053f-4eb0-a895-7a2b4d403e39",
    "commenter_type": "user",
    "content": "测试评论",
    "created_at": "2026-03-05T00:55:04.766Z"
  }
}

测试 2: 获取评论

curl http://localhost:4000/api/feedback/05809786-053f-4eb0-a895-7a2b4d403e39/comments

响应:

{
  "success": true,
  "comments": [
    {
      "id": 9,
      "feedback_id": "05809786-053f-4eb0-a895-7a2b4d403e39",
      "commenter_type": "user",
      "content": "测试评论",
      "created_at": "2026-03-05T00:55:04.766Z",
      "admin_ip": null,
      "attachment_id": null,
      "attachment_url": null
    }
  ]
}

数据验证

评论 API 包含完整的参数验证:

  1. 必填参数检查 - contentcommenterType 必填
  2. 最小长度验证 - 评论内容至少 2 个字符
  3. 最大长度验证 - 评论内容最多 1000 个字符
  4. 类型验证 - commenterType 必须是 useradmin
  5. 外键约束 - feedback_id 必须存在于 feedbacks 表中

错误处理

API 会返回详细的错误信息:

错误情况 HTTP 状态码 错误信息
缺少必要参数 400 缺少必要参数
评论内容过短 400 评论内容至少需要 2 个字符
评论内容过长 400 评论内容不能超过 1000 个字符
无效的评论者类型 400 无效的评论者类型
反馈不存在 500 添加评论失败 (外键约束)
服务器错误 500 添加评论失败 / 获取评论失败

部署状态

  • ✅ 代码已修改
  • ✅ 服务已重启
  • ✅ API 测试通过
  • ✅ 功能已上线

完整的评论功能流程

用户端添加评论

1. 用户点击"💬 查看/添加评论"按钮
   ↓
2. 展开评论区域,显示现有评论
   ↓
3. 用户输入评论内容(2-1000 字符)
   ↓
4. 点击"发送评论"
   ↓
5. 前端调用 POST /api/feedback/:feedbackId/comments
   {
     "content": "评论内容",
     "commenterType": "user"
   }
   ↓
6. 后端验证并保存到数据库
   ↓
7. 返回成功响应
   ↓
8. 前端刷新评论列表

管理后台添加评论

1. 管理员在管理后台查看反馈
   ↓
2. 展开评论区域
   ↓
3. 管理员输入回复内容
   ↓
4. 点击"发送评论"
   ↓
5. 前端调用 POST /api/feedback/:feedbackId/comments
   {
     "content": "管理员回复",
     "commenterType": "admin"
   }
   ↓
6. 后端验证并保存,记录管理员 IP
   ↓
7. 返回成功响应
   ↓
8. 用户可以在用户端看到管理员的回复

数据库表结构

CREATE TABLE feedback_comments (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  feedback_id TEXT NOT NULL,
  commenter_type TEXT NOT NULL,
  content TEXT NOT NULL,
  created_at INTEGER NOT NULL,
  admin_ip TEXT,
  attachment_id INTEGER,
  attachment_url TEXT,
  FOREIGN KEY (feedback_id) REFERENCES feedbacks(id)
);

CREATE INDEX idx_feedback_comments_feedback_id ON feedback_comments(feedback_id);
CREATE INDEX idx_feedback_comments_created_at ON feedback_comments(created_at);

安全特性

  1. 参数验证 - 防止无效数据进入数据库
  2. 长度限制 - 防止超长评论占用过多资源
  3. 类型验证 - 确保评论者类型合法
  4. 外键约束 - 确保只能对存在的反馈添加评论
  5. IP 记录 - 管理员评论会记录 IP 地址用于审计

评论功能现已完全正常!

用户和管理员现在可以:

  • 查看评论历史
  • 添加新评论
  • 进行双向沟通
  • 保持意见一致

有任何问题随时找我!🦞