From b768424519220c552f732ebb2366fd97a9ec8c66 Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Sun, 12 Apr 2026 18:44:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B8=96=E5=AD=90=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=88=E7=94=A8=E6=88=B7=E9=99=90=E5=88=B6?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 发布后24小时内可编辑 - 最多修改5次 - 编辑按钮仅作者可见 - 显示编辑次数和剩余次数 - 数据库新增 edit_count 和 last_edit_at 字段 --- backend/app.py | 34 +++++++++ frontend/post.html | 167 ++++++++++++++++++++++++++++++++++++++++----- models.py | 66 ++++++++++++++++++ 3 files changed, 249 insertions(+), 18 deletions(-) diff --git a/backend/app.py b/backend/app.py index 8977831..1ff6a3b 100644 --- a/backend/app.py +++ b/backend/app.py @@ -697,10 +697,44 @@ def api_post_detail(post_id): 'likes': len(post['likes']), 'views': post['views'], 'replies': reply_list, + 'edit_count': post.get('edit_count', 0) or 0, + 'last_edit_at': post.get('last_edit_at'), 'created_at': post['created_at'], 'updated_at': post.get('updated_at', post['created_at']) }) +@app.route('/api/posts//edit', methods=['POST']) +def api_edit_post(post_id): + """用户编辑自己的帖子""" + user = get_current_user() + if not user: + return jsonify({'error': '请先登录'}), 401 + + data = request.json + title = data.get('title', '').strip() + content = data.get('content', '').strip() + tags = data.get('tags') + + if not title or len(title) < 5: + return jsonify({'error': '标题至少5个字符'}), 400 + if not content or len(content) < 10: + return jsonify({'error': '内容至少10个字符'}), 400 + + # 检查是否可以编辑 + can_edit, error = post_model.can_edit(post_id, user['id']) + if not can_edit: + return jsonify({'error': error}), 400 + + # 执行编辑 + success, error = post_model.update_by_user(post_id, user['id'], title, content, tags) + if not success: + return jsonify({'error': error}), 400 + + return jsonify({ + 'success': True, + 'message': '编辑成功' + }) + @app.route('/api/posts//reply', methods=['POST']) def api_reply_post(post_id): user = get_current_user() diff --git a/frontend/post.html b/frontend/post.html index a471d15..e5353db 100644 --- a/frontend/post.html +++ b/frontend/post.html @@ -56,9 +56,47 @@
+ + + diff --git a/models.py b/models.py index 4d1e023..d38299e 100644 --- a/models.py +++ b/models.py @@ -55,6 +55,8 @@ class Database: views INTEGER DEFAULT 0, is_pinned INTEGER DEFAULT 0, is_hidden INTEGER DEFAULT 0, + edit_count INTEGER DEFAULT 0, + last_edit_at TEXT, created_at TEXT, updated_at TEXT, FOREIGN KEY (author_id) REFERENCES users(id) @@ -281,6 +283,70 @@ class PostModel: conn.commit() return new_pin + def can_edit(self, post_id, user_id): + """检查用户是否可以编辑帖子""" + post = self.get_by_id(post_id) + if not post: + return False, '帖子不存在' + + # 检查是否是作者 + if post['author_id'] != user_id: + return False, '只能编辑自己的帖子' + + # 检查时间限制(24小时内) + created_time = datetime.datetime.fromisoformat(post['created_at']) + now = datetime.datetime.now() + hours_passed = (now - created_time).total_seconds() / 3600 + + if hours_passed > 24: + return False, '超过24小时,无法编辑' + + # 检查修改次数限制(最多5次) + edit_count = post.get('edit_count', 0) or 0 + if edit_count >= 5: + return False, '已达到最大修改次数(5次)' + + return True, None + + def update_by_user(self, post_id, user_id, title=None, content=None, tags=None): + """用户编辑帖子(带限制检查)""" + can_edit, error = self.can_edit(post_id, user_id) + if not can_edit: + return False, error + + now = datetime.datetime.now().isoformat() + + with self.db.get_conn() as conn: + # 获取当前修改次数 + row = conn.execute('SELECT edit_count FROM posts WHERE id = ?', (post_id,)).fetchone() + edit_count = (row['edit_count'] or 0) + 1 + + update_fields = [] + values = [] + + if title: + update_fields.append('title = ?') + values.append(title) + if content: + update_fields.append('content = ?') + values.append(content) + if tags: + update_fields.append('tags = ?') + values.append(json.dumps(tags)) + + update_fields.append('edit_count = ?') + values.append(edit_count) + update_fields.append('last_edit_at = ?') + values.append(now) + update_fields.append('updated_at = ?') + values.append(now) + values.append(post_id) + + conn.execute(f"UPDATE posts SET {', '.join(update_fields)} WHERE id = ?", values) + conn.commit() + + return True, None + def get_tags_stats(self): with self.db.get_conn() as conn: rows = conn.execute('SELECT tags FROM posts').fetchall()