feat: 添加公告功能

This commit is contained in:
2025-12-13 18:40:42 +08:00
parent d7d878dc08
commit 7015de0055
4 changed files with 584 additions and 3 deletions

105
app.py
View File

@@ -1720,6 +1720,48 @@ def logout():
return jsonify({"success": True})
# ==================== 公告API ====================
@app.route('/api/announcements/active', methods=['GET'])
@login_required
def get_active_announcement():
"""获取当前用户应展示的公告若无则返回announcement=null"""
try:
user_id = int(current_user.id)
except Exception:
return jsonify({"announcement": None})
announcement = database.get_active_announcement_for_user(user_id)
if not announcement:
return jsonify({"announcement": None})
return jsonify({
"announcement": {
"id": announcement.get("id"),
"title": announcement.get("title", ""),
"content": announcement.get("content", ""),
"created_at": announcement.get("created_at")
}
})
@app.route('/api/announcements/<int:announcement_id>/dismiss', methods=['POST'])
@login_required
def dismiss_announcement(announcement_id):
"""用户永久关闭某条公告(本次公告不再弹窗)"""
try:
user_id = int(current_user.id)
except Exception:
return jsonify({"error": "请先登录"}), 401
announcement = database.get_announcement_by_id(announcement_id)
if not announcement:
return jsonify({"error": "公告不存在"}), 404
database.dismiss_announcement_for_user(user_id, announcement_id)
return jsonify({"success": True})
# ==================== 管理员认证API ====================
@app.route('/yuyx/api/debug-config', methods=['GET'])
@@ -1812,6 +1854,69 @@ def admin_logout():
return jsonify({"success": True})
# ==================== 公告管理API管理员 ====================
@app.route('/yuyx/api/announcements', methods=['GET'])
@admin_required
def admin_get_announcements():
"""获取公告列表"""
try:
limit = int(request.args.get('limit', 50))
offset = int(request.args.get('offset', 0))
except (TypeError, ValueError):
limit, offset = 50, 0
limit = max(1, min(200, limit))
offset = max(0, offset)
return jsonify(database.get_announcements(limit=limit, offset=offset))
@app.route('/yuyx/api/announcements', methods=['POST'])
@admin_required
def admin_create_announcement():
"""创建公告(默认启用并替换旧公告)"""
data = request.json or {}
title = (data.get('title') or '').strip()
content = (data.get('content') or '').strip()
is_active = bool(data.get('is_active', True))
announcement_id = database.create_announcement(title, content, is_active=is_active)
if not announcement_id:
return jsonify({"error": "标题和内容不能为空"}), 400
return jsonify({"success": True, "id": announcement_id})
@app.route('/yuyx/api/announcements/<int:announcement_id>/activate', methods=['POST'])
@admin_required
def admin_activate_announcement(announcement_id):
"""启用公告(会自动停用其他公告)"""
if not database.get_announcement_by_id(announcement_id):
return jsonify({"error": "公告不存在"}), 404
ok = database.set_announcement_active(announcement_id, True)
return jsonify({"success": ok})
@app.route('/yuyx/api/announcements/<int:announcement_id>/deactivate', methods=['POST'])
@admin_required
def admin_deactivate_announcement(announcement_id):
"""停用公告"""
if not database.get_announcement_by_id(announcement_id):
return jsonify({"error": "公告不存在"}), 404
ok = database.set_announcement_active(announcement_id, False)
return jsonify({"success": ok})
@app.route('/yuyx/api/announcements/<int:announcement_id>', methods=['DELETE'])
@admin_required
def admin_delete_announcement(announcement_id):
"""删除公告"""
if not database.get_announcement_by_id(announcement_id):
return jsonify({"error": "公告不存在"}), 404
ok = database.delete_announcement(announcement_id)
return jsonify({"success": ok})
@app.route('/yuyx/api/users', methods=['GET'])
@admin_required
def get_all_users():