table_game/backend/app/services/admin_game_service.py
2025-03-10 08:35:19 +08:00

327 lines
10 KiB
Python

from fastapi import HTTPException
from ..db import get_connection
from ..utils.jwt_handler import verify_token
from mysql.connector import IntegrityError
def _verify_admin_permission(token: str):
"""公共权限验证方法"""
try:
payload = verify_token(token)
username = payload["sub"]
except ValueError as e:
raise HTTPException(status_code=401, detail=str(e))
connection = get_connection()
try:
cursor = connection.cursor(dictionary=True)
cursor.execute("SELECT user_type FROM users WHERE username = %s;", (username,))
admin_user = cursor.fetchone()
if not admin_user or admin_user["user_type"] != "admin":
raise HTTPException(status_code=403, detail="Permission denied")
return username
finally:
cursor.close()
connection.close()
def create_game(token: str, game) -> dict:
"""
服务层:创建游戏
"""
# print(token)
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(status_code=500, detail="Database connection failed!")
cursor = connection.cursor()
try:
cursor.execute(
"""
INSERT INTO games
(game_name, game_type, description, min_players, max_players, duration, price, difficulty_level, is_available, quantity, long_description)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""",
(
game.game_name,
game.game_type,
game.description,
game.min_players,
game.max_players,
game.duration,
game.price,
game.difficulty_level,
game.is_available,
game.quantity,
game.long_description,
),
)
connection.commit()
return {"message": "游戏创建成功"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
finally:
cursor.close()
connection.close()
def delete_game(token: str, game_id: int) -> dict:
"""
服务层:删除游戏
"""
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(status_code=500, detail="Database connection failed!")
cursor = connection.cursor()
try:
cursor.execute("DELETE FROM games WHERE game_id = %s", (game_id,))
if cursor.rowcount == 0:
raise HTTPException(status_code=404, detail="游戏不存在")
connection.commit()
return {"message": "删除成功"}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
finally:
cursor.close()
connection.close()
def update_game(token: str, game_id: int, game) -> dict:
"""
服务层:更新游戏信息
"""
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(status_code=500, detail="Database connection failed!")
cursor = connection.cursor()
try:
cursor.execute(
"""
UPDATE games SET
game_name=%s, game_type=%s, description=%s,
min_players=%s, max_players=%s, duration=%s,
price=%s, difficulty_level=%s , quantity=%s ,
is_available=%s , long_description=%s
WHERE game_id=%s
""",
(
game.game_name,
game.game_type,
game.description,
game.min_players,
game.max_players,
game.duration,
game.price,
game.difficulty_level,
game.quantity,
game.is_available,
game.long_description,
game_id,
),
)
status = cursor.statusmessage if hasattr(cursor, "statusmessage") else ""
print("数据库返回的日志:", "rowcount =", cursor.rowcount, status)
if cursor.rowcount == 0:
raise HTTPException(status_code=404, detail="游戏不存在")
connection.commit()
return {"message": "更新成功"}
except Exception as e:
print("数据库错误日志:", str(e))
raise HTTPException(status_code=500, detail=str(e))
finally:
cursor.close()
connection.close()
def list_games_service(token: str):
"""
服务层:获取所有游戏数据
"""
print(token)
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(status_code=500, detail="Database connection failed!")
cursor = connection.cursor(dictionary=True)
try:
cursor.execute("SELECT * FROM games")
return cursor.fetchall()
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
finally:
cursor.close()
connection.close()
def set_the_game_photo(token: str, photo_url: str, game_id: int):
"""
服务层:设置游戏图片
"""
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(status_code=500, detail="Database connection failed!")
cursor = connection.cursor()
try:
cursor.execute(
"""
UPDATE games SET
photo_url=%s
WHERE game_id=%s
""",
(
photo_url,
game_id,
),
)
if cursor.rowcount == 0:
raise HTTPException(status_code=404, detail="游戏不存在")
connection.commit()
return {"message": "图片设置成功"}
except Exception as e:
print("数据库错误日志:", str(e))
raise HTTPException(status_code=500, detail=str(e))
finally:
cursor.close()
connection.close()
def create_tag_service(token: str, tag_name: str) -> dict:
"""创建标签服务"""
_verify_admin_permission(token)
connection = get_connection()
cursor = connection.cursor()
try:
cursor.execute(
"INSERT INTO tags (tag_name) VALUES (%s)",
(tag_name,)
)
connection.commit()
return {"tag_id": cursor.lastrowid, "tag_name": tag_name}
except IntegrityError:
raise HTTPException(400, "标签已存在")
finally:
cursor.close()
connection.close()
def link_tag_to_games_service(token: str, tag_id: int, game_ids: list[int]) -> dict:
"""批量关联服务"""
_verify_admin_permission(token)
connection = get_connection()
cursor = connection.cursor()
try:
# 检查标签存在
cursor.execute("SELECT 1 FROM tags WHERE tag_id = %s", (tag_id,))
if not cursor.fetchone():
raise HTTPException(404, "标签不存在")
# 批量插入
values = [(game_id, tag_id) for game_id in game_ids]
cursor.executemany(
"INSERT IGNORE INTO game_tags (game_id, tag_id) VALUES (%s, %s)",
values
)
connection.commit()
return {"linked_count": cursor.rowcount}
finally:
cursor.close()
connection.close()
def list_tags_service(token: str) -> list:
"""获取所有标签服务"""
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(500, "数据库连接失败")
cursor = connection.cursor(dictionary=True)
try:
cursor.execute("""
SELECT t.tag_id,
t.tag_name,
COUNT(gt.game_id) AS game_count
FROM tags t
LEFT JOIN game_tags gt ON t.tag_id = gt.tag_id
GROUP BY t.tag_id
ORDER BY t.tag_id
""")
return cursor.fetchall()
finally:
cursor.close()
connection.close()
def get_game_tags_service(token: str, game_id: int) -> list:
"""获取游戏标签服务"""
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(500, "数据库连接失败")
cursor = connection.cursor(dictionary=True)
try:
cursor.execute(
"""
SELECT t.tag_id, t.tag_name
FROM game_tags gt
JOIN tags t ON gt.tag_id = t.tag_id
WHERE gt.game_id = %s
""",
(game_id,)
)
return cursor.fetchall()
finally:
cursor.close()
connection.close()
def unlink_tag_from_game_service(token: str, tag_id: int, game_id: int) -> dict:
"""取消关联服务"""
_verify_admin_permission(token)
connection = get_connection()
cursor = connection.cursor()
print("tag_id:", tag_id, "game_id:", game_id)
try:
cursor.execute(
"DELETE FROM game_tags WHERE tag_id = %s AND game_id = %s",
(tag_id, game_id)
)
connection.commit()
return {"deleted": cursor.rowcount}
finally:
cursor.close()
connection.close()
def get_games_by_tag_service(token: str, tag_id: int) -> list:
"""获取标签关联游戏服务"""
_verify_admin_permission(token)
connection = get_connection()
if not connection:
raise HTTPException(500, "数据库连接失败")
cursor = connection.cursor(dictionary=True)
try:
cursor.execute(
"""
SELECT g.game_id, g.game_name
FROM game_tags gt
JOIN games g ON gt.game_id = g.game_id
WHERE gt.tag_id = %s
""",
(tag_id,)
)
return cursor.fetchall()
finally:
cursor.close()
connection.close()
def delete_tag_service(token: str, tag_id: int) -> dict:
_verify_admin_permission(token)
connection = get_connection()
try:
with connection.cursor() as cursor:
# 先删除关联关系
cursor.execute("DELETE FROM game_tags WHERE tag_id = %s", (tag_id,))
# 再删除标签
cursor.execute("DELETE FROM tags WHERE tag_id = %s", (tag_id,))
connection.commit()
return {"deleted": cursor.rowcount}
finally:
connection.close()