1.0.0初始化源代码

This commit is contained in:
yuqianqian10204095yu
2026-03-23 15:40:36 +08:00
parent f13ecb3bba
commit cebc0a288f
53 changed files with 5300 additions and 0 deletions

View File

@@ -0,0 +1,291 @@
"""
会会接口对接服务
基于 http://192.168.1.200:63120/doc.html 接口文档
"""
import httpx
import logging
from typing import Optional, Dict, Any, List
from datetime import datetime
from app.core.config import settings
logger = logging.getLogger(__name__)
class HuihuiAPIService:
"""会会 API 服务类"""
def __init__(self):
self.base_url = settings.HUIHUI_API_BASE
self.timeout = 30 # 秒
self._session_cache: Dict[str, httpx.AsyncClient] = {}
def _get_client(self, session_token: Optional[str] = None) -> httpx.AsyncClient:
"""获取 HTTP 客户端"""
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
}
if session_token:
headers["Authorization"] = f"Bearer {session_token}"
return httpx.AsyncClient(
base_url=self.base_url,
headers=headers,
timeout=self.timeout,
)
async def login(self, username: str, password: str) -> Optional[Dict[str, Any]]:
"""
用户登录
:param username: 用户名
:param password: 密码
:return: 登录响应(包含 session token
"""
try:
async with self._get_client() as client:
response = await client.post(
"/api/login", # 实际接口路径需根据 doc.html 调整
json={"username": username, "password": password}
)
if response.status_code == 200:
data = response.json()
logger.info(f"Login success for user: {username}")
return data
else:
logger.error(f"Login failed: {response.status_code} - {response.text}")
return None
except Exception as e:
logger.error(f"Login error: {e}")
return None
async def get_news_list(
self,
page: int = 1,
page_size: int = 20,
category: Optional[str] = None
) -> Optional[List[Dict[str, Any]]]:
"""
获取新闻列表
:param page: 页码
:param page_size: 每页数量
:param category: 分类(可选)
:return: 新闻列表
"""
try:
async with self._get_client() as client:
params = {"page": page, "pageSize": page_size}
if category:
params["category"] = category
response = await client.get(
"/api/news/list", # 实际接口路径需根据 doc.html 调整
params=params
)
if response.status_code == 200:
data = response.json()
return data.get("data", [])
else:
logger.error(f"Get news list failed: {response.status_code}")
return None
except Exception as e:
logger.error(f"Get news list error: {e}")
return None
async def get_news_detail(self, news_id: str) -> Optional[Dict[str, Any]]:
"""
获取新闻详情
:param news_id: 新闻 ID
:return: 新闻详情
"""
try:
async with self._get_client() as client:
response = await client.get(f"/api/news/{news_id}")
if response.status_code == 200:
data = response.json()
return data.get("data")
else:
logger.error(f"Get news detail failed: {response.status_code}")
return None
except Exception as e:
logger.error(f"Get news detail error: {e}")
return None
async def create_comment(
self,
news_id: str,
content: str,
session_token: str
) -> Optional[Dict[str, Any]]:
"""
创建评论
:param news_id: 新闻 ID
:param content: 评论内容
:param session_token: 会话 Token
:return: 评论结果
"""
try:
async with self._get_client(session_token) as client:
response = await client.post(
"/api/comment/create", # 实际接口路径需根据 doc.html 调整
json={"newsId": news_id, "content": content}
)
if response.status_code == 200:
data = response.json()
logger.info(f"Comment created for news: {news_id}")
return data
else:
logger.error(f"Create comment failed: {response.status_code} - {response.text}")
return None
except Exception as e:
logger.error(f"Create comment error: {e}")
return None
async def create_reply(
self,
comment_id: str,
content: str,
session_token: str
) -> Optional[Dict[str, Any]]:
"""
创建回复
:param comment_id: 评论 ID
:param content: 回复内容
:param session_token: 会话 Token
:return: 回复结果
"""
try:
async with self._get_client(session_token) as client:
response = await client.post(
"/api/reply/create", # 实际接口路径需根据 doc.html 调整
json={"commentId": comment_id, "content": content}
)
if response.status_code == 200:
data = response.json()
logger.info(f"Reply created for comment: {comment_id}")
return data
else:
logger.error(f"Create reply failed: {response.status_code}")
return None
except Exception as e:
logger.error(f"Create reply error: {e}")
return None
async def like_comment(
self,
comment_id: str,
session_token: str
) -> Optional[Dict[str, Any]]:
"""
点赞评论
:param comment_id: 评论 ID
:param session_token: 会话 Token
:return: 点赞结果
"""
try:
async with self._get_client(session_token) as client:
response = await client.post(f"/api/comment/{comment_id}/like")
if response.status_code == 200:
data = response.json()
logger.info(f"Comment liked: {comment_id}")
return data
else:
logger.error(f"Like comment failed: {response.status_code}")
return None
except Exception as e:
logger.error(f"Like comment error: {e}")
return None
async def favorite_news(
self,
news_id: str,
session_token: str
) -> Optional[Dict[str, Any]]:
"""
收藏新闻
:param news_id: 新闻 ID
:param session_token: 会话 Token
:return: 收藏结果
"""
try:
async with self._get_client(session_token) as client:
response = await client.post(f"/api/news/{news_id}/favorite")
if response.status_code == 200:
data = response.json()
logger.info(f"News favorited: {news_id}")
return data
else:
logger.error(f"Favorite news failed: {response.status_code}")
return None
except Exception as e:
logger.error(f"Favorite news error: {e}")
return None
async def share_news(
self,
news_id: str,
session_token: str
) -> Optional[Dict[str, Any]]:
"""
转发新闻
:param news_id: 新闻 ID
:param session_token: 会话 Token
:return: 转发结果
"""
try:
async with self._get_client(session_token) as client:
response = await client.post(f"/api/news/{news_id}/share")
if response.status_code == 200:
data = response.json()
logger.info(f"News shared: {news_id}")
return data
else:
logger.error(f"Share news failed: {response.status_code}")
return None
except Exception as e:
logger.error(f"Share news error: {e}")
return None
async def get_comments(
self,
news_id: str,
page: int = 1,
page_size: int = 20
) -> Optional[List[Dict[str, Any]]]:
"""
获取新闻评论列表
:param news_id: 新闻 ID
:param page: 页码
:param page_size: 每页数量
:return: 评论列表
"""
try:
async with self._get_client() as client:
params = {"page": page, "pageSize": page_size}
response = await client.get(
f"/api/news/{news_id}/comments",
params=params
)
if response.status_code == 200:
data = response.json()
return data.get("data", [])
else:
logger.error(f"Get comments failed: {response.status_code}")
return None
except Exception as e:
logger.error(f"Get comments error: {e}")
return None
# 创建全局服务实例
huihui_api_service = HuihuiAPIService()