项目初次搭建
This commit is contained in:
13
app/common/bcrypt_pw.py
Normal file
13
app/common/bcrypt_pw.py
Normal 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
50
app/common/jwt_check.py
Normal 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")
|
33
app/common/logger_config.py
Normal file
33
app/common/logger_config.py
Normal 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
4
app/common/redis_cli.py
Normal 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)
|
46
app/common/reponse_code.py
Normal file
46
app/common/reponse_code.py
Normal 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,
|
||||
}
|
||||
)
|
Reference in New Issue
Block a user