项目初次搭建

This commit is contained in:
2025-02-13 16:29:28 +08:00
parent feef37cbd7
commit 3cb2a4c507
121 changed files with 19550 additions and 0 deletions

13
app/common/bcrypt_pw.py Normal file
View File

@ -0,0 +1,13 @@
import bcrypt
#使用bcrypt对密码进行加密
def hash_password(password):
# 生成盐值并使用 bcrypt 加密密码
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(password.encode('utf-8'), salt)
return hashed
def verify_password(provided_password, stored_password):
# 验证提供的密码是否与存储的哈希值匹配
return bcrypt.checkpw(provided_password.encode('utf-8'), stored_password.encode('utf-8'))

50
app/common/jwt_check.py Normal file
View File

@ -0,0 +1,50 @@
import datetime
import jwt
from app.common.redis_cli import redis_conn
# 过期时间单位S
exp = 6000
# 加密秘钥
secret_key = 'syg15684712291'
def generate_token(user_id: int, username: str):
"""
根据用户id和用户名生成一个token
:param user_id: 用户id
:param username: 用户名
:return: token
"""
payload = {
'user_id': user_id,
'username': username,
'exp': datetime.datetime.utcnow() + datetime.timedelta(exp)
}
# 生成token
token = jwt.encode(payload, secret_key, algorithm='HS256')
return token
def check_token(token: str):
"""
验证token
:param token: token
:return: True or False
"""
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=['HS256'])
user_id = decoded_payload['user_id']
token_redis = redis_conn.get(user_id)
if token_redis is None:
raise jwt.ExpiredSignatureError("Expired Token")
if token_redis != token:
raise jwt.ExpiredSignatureError("Invalid Token")
return decoded_payload
except jwt.ExpiredSignatureError:
raise jwt.ExpiredSignatureError("Expired Token")
except jwt.InvalidTokenError:
raise jwt.InvalidTokenError("Invalid Token")

View File

@ -0,0 +1,33 @@
import logging
import os
from logging.handlers import TimedRotatingFileHandler
from app.config.config_reader import log_dir
file_suffix = "%Y-%m-%d"
os.makedirs(log_dir, exist_ok=True)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#所有http请求的日志
logger_http = logging.getLogger("api_log")
logger_http.setLevel(logging.DEBUG)
# 创建一个TimedRotatingFileHandler指定日志文件名、轮转周期和备份数量
api_log_file = os.path.join(log_dir, 'api.log')
api_handler = TimedRotatingFileHandler(api_log_file, when="midnight", interval=1, backupCount=30)
api_handler.setFormatter(formatter)
api_handler.suffix = file_suffix # 日志文件的后缀为日期格式
logger_http.addHandler(api_handler)
#所有sqlalchemy打印的日志
logger_sql = logging.getLogger("sqlalchemy.engine.Engine")
logger_sql.setLevel(logging.DEBUG)
# 创建文件处理器并设置级别
sql_log_file = os.path.join(log_dir, 'sql.log')
sql_handler = TimedRotatingFileHandler(sql_log_file, when="midnight", interval=1, backupCount=30)
sql_handler.setFormatter(formatter)
sql_handler.suffix = file_suffix # 日志文件的后缀为日期格式
logger_sql.addHandler(sql_handler)

4
app/common/redis_cli.py Normal file
View File

@ -0,0 +1,4 @@
import redis
from app.config.config_reader import redis_db, redis_password, redis_port, redis_host
redis_conn = redis.Redis(host=redis_host, port=redis_port, db=redis_db, password=redis_password, decode_responses=True)

View File

@ -0,0 +1,46 @@
from fastapi.responses import JSONResponse, Response
from fastapi import status
from app.db.page_util import Pager
def response_code_view(code: int,msg: str) -> Response:
return JSONResponse(
status_code=code,
content={
'code': code,
'msg': msg
}
)
def response_success(msg: str = "查询成功", data: object = None):
return JSONResponse(
status_code=status.HTTP_200_OK,
content={
'code': 200,
'msg': msg,
'data': data,
}
)
def response_success_pager(pager: Pager):
return JSONResponse(
status_code=status.HTTP_200_OK,
content={
'code': 200,
'msg': "查询成功",
'data': pager.data,
'total': pager.total
}
)
def response_error(msg:str):
return JSONResponse(
status_code=status.HTTP_200_OK,
content={
'code': 500,
'msg': msg,
'data': None,
}
)