fix: 修复注册异常,删除用户异常,调整用户信息存储时间

This commit is contained in:
2025-02-23 03:58:38 +08:00
parent 5be35d8231
commit df5f2977d4
10 changed files with 984 additions and 32 deletions

View File

@@ -14,7 +14,7 @@ from annotation.auth import Auth
from annotation.log import Log
from config.constant import BusinessType, RedisKeyConfig
from controller.login import LoginController
from models import Department
from models import Department, Role
from schemas.common import BaseResponse, DeleteListParams
from schemas.department import AddDepartmentParams, GetDepartmentInfoResponse, \
GetDepartmentListResponse
@@ -201,3 +201,36 @@ async def get_department_list(
"page": page,
"pageSize": pageSize
})
@departmentAPI.get("/roleList/{id}", response_model=GetDepartmentListResponse, response_class=JSONResponse,
summary="用户获取部门角色列表")
@Log(title="获取部门角色列表", business_type=BusinessType.SELECT)
@Auth(["department:btn:list"])
async def get_department_role_list(
request: Request,
id: str = Path(..., description="部门ID"),
current_user: dict = Depends(LoginController.get_current_user)
):
sub_departments = current_user.get("sub_departments")
if id not in sub_departments:
return Response.error(msg="查询失败,无权限!")
data = await Role.filter(department__id=id).values(
id="id",
department_id="department__id",
department_name="department__name",
department_phone="department__phone",
department_principal="department__principal",
department_email="department__email",
role_name="name",
role_code="code",
role_id="id",
create_time="create_time",
update_time="update_time"
)
return Response.success(data={
"result": data,
"total": len(data),
"page": 1,
"pageSize": 9999
})

View File

@@ -274,11 +274,7 @@ async def get_i18n_list(request: Request,
@Auth(["i18n:btn:infoList"])
async def get_i18n_info_list(request: Request, id: str = Path(description="国际化内容语言ID")):
if locale := await Locale.get_or_none(id=id, del_flag=1):
result = await request.app.state.redis.get(f'{RedisKeyConfig.TRANSLATION_INFO.key}:{id}')
if result:
result = eval(result)
return Response.success(data=result)
data = await I18n.filter(locale_id=locale.id, del_flag=1).values(
data = await I18n.filter(locale_id=locale.id, del_flag=1).order_by("key").values(
id="id",
key="key",
translation="translation",
@@ -292,13 +288,6 @@ async def get_i18n_info_list(request: Request, id: str = Path(description="国
result = {}
for i18n in data:
result[f"{i18n['key']}"] = i18n["translation"]
await request.app.state.redis.set(f'{RedisKeyConfig.TRANSLATION_INFO.key}:{id}',
str(jsonable_encoder({
"data": result,
"locale": locale.code,
"name": locale.name,
})),
ex=timedelta(minutes=60))
return Response.success(data={
"data": result,
"locale": locale.code,

View File

@@ -48,7 +48,6 @@ async def get_login_log(request: Request,
f'{k}__contains': v for k, v in {
'username': username,
'nickname': nickname,
'department_id': department_id,
}.items() if v
}
if status is not None:
@@ -59,7 +58,9 @@ async def get_login_log(request: Request,
filterArgs['login_time__range'] = [startTime, endTime]
if not department_id:
filterArgs['user__department__id__in'] = sub_departments
result = await LoginLog.filter(**filterArgs, del_flag=1).offset(
else:
filterArgs['user__department__id'] = department_id
result = await LoginLog.filter(**filterArgs, user__del_flag=1, del_flag=1).offset(
(page - 1) * pageSize).limit(pageSize).values(
id="id",
user_id="user__id",
@@ -83,7 +84,7 @@ async def get_login_log(request: Request,
if item["session_id"] == log["session_id"]:
log["online"] = True
return Response.success(data={
"total": await LoginLog.filter(**filterArgs, del_flag=1, ).count(),
"total": await LoginLog.filter(**filterArgs, del_flag=1, user__del_flag=1, ).count(),
"result": result,
"page": page,
})
@@ -176,7 +177,6 @@ async def get_operation_log(request: Request,
'operation_type': type,
'operator__username': username,
'operator__nickname': nickname,
'department_id': department_id,
}.items() if v
}
if status is not None:
@@ -187,7 +187,10 @@ async def get_operation_log(request: Request,
filterArgs['operation_time__range'] = [startTime, endTime]
if not department_id:
filterArgs['department__id__in'] = sub_departments
result = await OperationLog.filter(**filterArgs, del_flag=1).offset((page - 1) * pageSize).limit(
else:
filterArgs['department__id'] = department_id
result = await OperationLog.filter(**filterArgs, operator__del_flag=1, del_flag=1).offset(
(page - 1) * pageSize).limit(
pageSize).values(
id="id",
operation_name="operation_name",
@@ -211,7 +214,7 @@ async def get_operation_log(request: Request,
cost_time="cost_time"
)
return Response.success(data={
"total": await OperationLog.filter(**filterArgs, del_flag=1).count(),
"total": await OperationLog.filter(**filterArgs, del_flag=1, operator__del_flag=1).count(),
"result": result,
"page": page,
"pageSize": pageSize

View File

@@ -18,7 +18,7 @@ from config.constant import BusinessType
from config.constant import RedisKeyConfig
from controller.login import CustomOAuth2PasswordRequestForm, LoginController
from controller.query import QueryController
from models import Department, User
from models import Department, User, Role, UserRole
from schemas.common import BaseResponse
from schemas.login import LoginParams, GetUserInfoResponse, LoginResponse, GetCaptchaResponse, GetEmailCodeParams, \
ResetPasswordParams
@@ -94,7 +94,7 @@ async def login(
async def register(request: Request, params: RegisterUserParams):
register_enabled = (
True
if await request.app.state.redis.get(f'{RedisKeyConfig.SYSTEM_CONFIG.key}:register_enabled')
if await request.app.state.redis.get(f'{RedisKeyConfig.SYSTEM_CONFIG.key}:account_register_enabled')
== 'true'
else False
)
@@ -106,7 +106,14 @@ async def register(request: Request, params: RegisterUserParams):
if await QueryController.register_user_before(username=params.username, phone=params.phone, email=params.email):
return Response.error(msg="注册失败,用户已存在!")
params.password = await Password.get_password_hash(input_password=params.password)
# 默认分配注册用户
userRole = await Role.get_or_none(department__name="注册用户", code="user", del_flag=1).values(
department_id="department__id", id="id")
if not params.department_id:
params.department_id = userRole.get("department_id", "")
department = await Department.get_or_none(id=params.department_id)
userRole = await Role.get_or_none(department__id=department.id, code="user", del_flag=1).values(id="id")
print(userRole)
user = await User.create(
username=params.username,
password=params.password,
@@ -118,6 +125,11 @@ async def register(request: Request, params: RegisterUserParams):
status=params.status,
)
if user:
# 默认分配普通用户角色
await UserRole.create(
user_id=user.id,
role_id=userRole.get("id", ""),
)
userParams = LoginParams(
username=params.username,
password=params.password
@@ -140,7 +152,7 @@ async def register(request: Request, params: RegisterUserParams):
result.pop("session_id")
result.pop("userInfo")
return Response.success(msg="注册成功!", data=result)
return Response.error(msg="注册成功!")
return Response.success(msg="注册成功!")
else:
return Response.error(msg="注册失败!")
@@ -221,7 +233,7 @@ async def info(
@loginAPI.get("/getRoutes", response_class=JSONResponse, summary="获取路由信息")
# @Log(title="获取路由信息", business_type=BusinessType.SELECT)
@Log(title="获取路由信息", business_type=BusinessType.SELECT)
async def get_routes(request: Request, current_user: dict = Depends(LoginController.get_current_user)):
sub_departments = current_user.get("sub_departments")
routes = await request.app.state.redis.get(f'{RedisKeyConfig.USER_ROUTES.key}:{current_user["id"]}')

View File

@@ -31,7 +31,7 @@ roleAPI = APIRouter(
@Auth(permission_list=["role:btn:add"])
async def add_role(request: Request, params: AddRoleParams,
current_user: dict = Depends(LoginController.get_current_user)):
if await Role.get_or_none(code=params.role_code, department_id=params.department_id, del_flag=1):
if await Role.get_or_none(code=params.code, department_id=params.department_id, del_flag=1):
return Response.error(msg="角色编码已存在!")
sub_departments = current_user.get("sub_departments")
if params.department_id not in sub_departments:
@@ -47,10 +47,10 @@ async def add_role(request: Request, params: AddRoleParams,
)
else:
role = await Role.create(
code=params.role_code,
name=params.role_name,
code=params.code,
name=params.name,
status=params.status,
description=params.role_description,
description=params.description,
department_id=None,
)
if role:

View File

@@ -20,7 +20,7 @@ from controller.login import LoginController
from controller.query import QueryController
from exceptions.exception import ModelValidatorException
from models import File as FileModel
from models import Role, Department
from models import Role, Department, OperationLog, LoginLog
from models.user import User, UserRole
from schemas.common import BaseResponse, DeleteListParams
from schemas.department import GetDepartmentListResponse
@@ -76,6 +76,18 @@ async def delete_user(
if user := await User.get_or_none(id=id, department__id__in=sub_departments, del_flag=1):
user.del_flag = 0
await user.save()
# 移除用户角色
await UserRole.filter(user_id=user.id, del_flag=1).update(del_flag=0)
# 移除用户登录日志
await LoginLog.filter(user_id=user.id, del_flag=1).update(del_flag=0)
# 移除用户操作日志
await OperationLog.filter(user_id=user.id, del_flag=1).update(del_flag=0)
# 更新用户信息缓存
if await request.app.state.redis.get(f'{RedisKeyConfig.USER_INFO.key}:{id}'):
await request.app.state.redis.delete(f'{RedisKeyConfig.USER_INFO.key}:{id}')
# 更新用户路由缓存
if await request.app.state.redis.get(f'{RedisKeyConfig.USER_ROUTES.key}:{id}'):
await request.app.state.redis.delete(f'{RedisKeyConfig.USER_ROUTES.key}:{id}')
return Response.success(msg="删除成功!")
else:
return Response.error(msg="删除失败,用户不存在!")