feat:清除gitignore文件
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,108 +0,0 @@
|
||||
from fastapi import Request
|
||||
|
||||
from models.blog import BlogVisit
|
||||
|
||||
# 博客概要字数
|
||||
BLOG_SUMMARY_COUNT = 100
|
||||
|
||||
# 阅读速度 600 字/分钟
|
||||
READ_SPEED = 600.0
|
||||
|
||||
# 博客非统计字符
|
||||
EXCLUDE_CHARS = [' ', '\n', '\t']
|
||||
|
||||
|
||||
def get_word_count(text: str) -> int:
|
||||
"""
|
||||
获取文本字数
|
||||
|
||||
:param text: 文本
|
||||
:return: 字数
|
||||
"""
|
||||
count = 0
|
||||
|
||||
if not text: # 检查None或空字符串
|
||||
return count
|
||||
|
||||
for char in text:
|
||||
if char not in EXCLUDE_CHARS:
|
||||
count += 1
|
||||
|
||||
return count
|
||||
|
||||
|
||||
def get_read_duration(word_count: int) -> float:
|
||||
"""
|
||||
获取阅读时长 单位:分钟
|
||||
|
||||
:param word_count: 文本字数
|
||||
:return: 阅读时长
|
||||
"""
|
||||
return word_count / READ_SPEED
|
||||
|
||||
|
||||
def get_blog_summary(content: str) -> str:
|
||||
"""
|
||||
获取简要信息
|
||||
|
||||
:param content: 博客内容
|
||||
:return: 简要信息
|
||||
"""
|
||||
if len(content) > BLOG_SUMMARY_COUNT:
|
||||
return content[:BLOG_SUMMARY_COUNT]
|
||||
return content
|
||||
|
||||
|
||||
def get_client_ip(request):
|
||||
"""从请求中获取客户端IP地址"""
|
||||
x_forwarded_for = request.headers.get("X-Forwarded-For")
|
||||
if x_forwarded_for:
|
||||
return x_forwarded_for.split(',')[0]
|
||||
return request.client.host
|
||||
|
||||
|
||||
def get_user_agent_info(user_agent: str):
|
||||
"""解析User-Agent获取操作系统和浏览器信息"""
|
||||
# 使用正则表达式进行更精确的解析
|
||||
os = "Unknown"
|
||||
browser = "Unknown"
|
||||
|
||||
# 操作系统检测
|
||||
if "Windows NT" in user_agent:
|
||||
os = "Windows"
|
||||
elif "Macintosh" in user_agent:
|
||||
os = "Mac OS"
|
||||
elif "Linux" in user_agent:
|
||||
os = "Linux"
|
||||
elif "Android" in user_agent:
|
||||
os = "Android"
|
||||
elif "iPhone" in user_agent or "iPad" in user_agent:
|
||||
os = "iOS"
|
||||
|
||||
# 浏览器检测
|
||||
if "Chrome" in user_agent:
|
||||
browser = "Chrome"
|
||||
elif "Firefox" in user_agent:
|
||||
browser = "Firefox"
|
||||
elif "Safari" in user_agent and "Chrome" not in user_agent:
|
||||
browser = "Safari"
|
||||
elif "Edge" in user_agent:
|
||||
browser = "Edge"
|
||||
elif "MSIE" in user_agent or "Trident" in user_agent:
|
||||
browser = "Internet Explorer"
|
||||
|
||||
return os, browser
|
||||
|
||||
|
||||
def get_blog_visit(request: Request, blog_id: int) -> BlogVisit:
|
||||
ip = get_client_ip(request)
|
||||
user_agent = request.headers.get("User-Agent", "")
|
||||
os, browser = get_user_agent_info(user_agent)
|
||||
|
||||
return BlogVisit(
|
||||
ip=ip,
|
||||
os=os,
|
||||
browser=browser,
|
||||
uri=request.url.path,
|
||||
blog_id=blog_id
|
||||
)
|
||||
@@ -1,13 +0,0 @@
|
||||
import re
|
||||
|
||||
|
||||
def camel_to_snake(name: str) -> str:
|
||||
"""将驼峰命名转换为蛇形命名(CamelCase → snake_case)"""
|
||||
name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
|
||||
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()
|
||||
|
||||
|
||||
def snake_to_camel(name: str) -> str:
|
||||
"""将蛇形命名转换为驼峰命名(snake_case → CamelCase)"""
|
||||
components = name.split('_')
|
||||
return ''.join(x.title() for x in components)
|
||||
Reference in New Issue
Block a user