feat: 添加公告功能
This commit is contained in:
105
app.py
105
app.py
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user