feat(cwd-api, widget): 实现评论取消点赞功能
- 添加了评论取消点赞的逻辑处理 - 新增 DELETE /api/comments/like 接口用于取消点赞 - 修改点赞接口支持根据请求方法判断增加或减少点赞数 - 优化点赞数计算逻辑,支持正确的增减操作 - 更新错误提示信息为更通用的操作失败提示
This commit is contained in:
@@ -27,6 +27,7 @@ export const likeComment = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const id = parsed;
|
const id = parsed;
|
||||||
|
const method = c.req.method;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const existing = await c.env.CWD_DB.prepare(
|
const existing = await c.env.CWD_DB.prepare(
|
||||||
@@ -39,26 +40,20 @@ export const likeComment = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
return c.json({ message: 'Comment not found' }, 404);
|
return c.json({ message: 'Comment not found' }, 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const delta = method === 'DELETE' ? -1 : 1;
|
||||||
|
const currentLikes = typeof existing.likes === 'number' && Number.isFinite(existing.likes) && existing.likes >= 0
|
||||||
|
? existing.likes
|
||||||
|
: 0;
|
||||||
|
const newLikes = Math.max(0, currentLikes + delta);
|
||||||
|
|
||||||
await c.env.CWD_DB.prepare(
|
await c.env.CWD_DB.prepare(
|
||||||
'UPDATE Comment SET likes = COALESCE(likes, 0) + 1 WHERE id = ?'
|
'UPDATE Comment SET likes = ? WHERE id = ?'
|
||||||
)
|
)
|
||||||
.bind(id)
|
.bind(newLikes, id)
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
const updated = await c.env.CWD_DB.prepare(
|
return c.json({ id, likes: newLikes });
|
||||||
'SELECT COALESCE(likes, 0) as likes FROM Comment WHERE id = ?'
|
|
||||||
)
|
|
||||||
.bind(id)
|
|
||||||
.first<{ likes?: number }>();
|
|
||||||
|
|
||||||
const likes =
|
|
||||||
updated && typeof updated.likes === 'number' && Number.isFinite(updated.likes) && updated.likes >= 0
|
|
||||||
? updated.likes
|
|
||||||
: ((existing.likes || 0) + 1);
|
|
||||||
|
|
||||||
return c.json({ id, likes });
|
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
return c.json({ message: e?.message || '点赞失败' }, 500);
|
return c.json({ message: e?.message || '操作失败' }, 500);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -273,6 +273,7 @@ app.get('/api/analytics/pv', getPagePv);
|
|||||||
app.get('/api/like', getLikeStatus);
|
app.get('/api/like', getLikeStatus);
|
||||||
app.post('/api/like', likePage);
|
app.post('/api/like', likePage);
|
||||||
app.post('/api/comments/like', likeComment);
|
app.post('/api/comments/like', likeComment);
|
||||||
|
app.delete('/api/comments/like', likeComment);
|
||||||
app.post('/api/telegram/webhook', telegramWebhook);
|
app.post('/api/telegram/webhook', telegramWebhook);
|
||||||
app.get('/api/config/comments', async (c) => {
|
app.get('/api/config/comments', async (c) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -371,8 +371,12 @@ export class CommentItem extends Component {
|
|||||||
likedComments.add(commentId);
|
likedComments.add(commentId);
|
||||||
this.saveLikedComments(likedComments);
|
this.saveLikedComments(likedComments);
|
||||||
this.props.onLikeComment(commentId, true);
|
this.props.onLikeComment(commentId, true);
|
||||||
|
} else {
|
||||||
|
// 已点赞,执行取消点赞
|
||||||
|
likedComments.delete(commentId);
|
||||||
|
this.saveLikedComments(likedComments);
|
||||||
|
this.props.onLikeComment(commentId, false);
|
||||||
}
|
}
|
||||||
// 已点赞则不做任何操作
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user