feat: 添加系统级管理专属页面权限
This commit is contained in:
parent
f6af4eace8
commit
7d4170a3c3
@ -9,6 +9,7 @@ from functools import wraps
|
|||||||
|
|
||||||
from fastapi import Request
|
from fastapi import Request
|
||||||
|
|
||||||
|
from config.constant import RedisKeyConfig
|
||||||
from controller.login import LoginController
|
from controller.login import LoginController
|
||||||
from exceptions.exception import PermissionException
|
from exceptions.exception import PermissionException
|
||||||
|
|
||||||
@ -53,3 +54,16 @@ async def hasAuth(request: Request, permission: str) -> bool:
|
|||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
async def hasAdmin(request: Request, department_id: str) -> bool:
|
||||||
|
"""
|
||||||
|
判断是否有管理员权限
|
||||||
|
"""
|
||||||
|
permissions = []
|
||||||
|
if ids := await request.app.state.redis.get(f'{RedisKeyConfig.SYSTEM_CONFIG.key}:permission_departments'):
|
||||||
|
permissions = eval(ids)
|
||||||
|
if department_id in permissions:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
@ -10,7 +10,7 @@ from typing import Optional
|
|||||||
from fastapi import APIRouter, Depends, Path, Query, Request
|
from fastapi import APIRouter, Depends, Path, Query, Request
|
||||||
from fastapi.responses import JSONResponse
|
from fastapi.responses import JSONResponse
|
||||||
|
|
||||||
from annotation.auth import Auth
|
from annotation.auth import Auth, hasAdmin
|
||||||
from annotation.log import Log
|
from annotation.log import Log
|
||||||
from config.constant import BusinessType, RedisKeyConfig
|
from config.constant import BusinessType, RedisKeyConfig
|
||||||
from controller.login import LoginController
|
from controller.login import LoginController
|
||||||
@ -51,6 +51,7 @@ async def add_permission(request: Request, params: AddPermissionParams):
|
|||||||
leave_transition=params.leave_transition,
|
leave_transition=params.leave_transition,
|
||||||
fixed_tag=params.fixed_tag,
|
fixed_tag=params.fixed_tag,
|
||||||
hidden_tag=params.hidden_tag,
|
hidden_tag=params.hidden_tag,
|
||||||
|
is_admin=params.is_admin
|
||||||
)
|
)
|
||||||
if permission:
|
if permission:
|
||||||
# 更新用户信息缓存
|
# 更新用户信息缓存
|
||||||
@ -114,6 +115,7 @@ async def update_permission(request: Request, params: AddPermissionParams, id: s
|
|||||||
permission.leave_transition = params.leave_transition
|
permission.leave_transition = params.leave_transition
|
||||||
permission.fixed_tag = params.fixed_tag
|
permission.fixed_tag = params.fixed_tag
|
||||||
permission.hidden_tag = params.hidden_tag
|
permission.hidden_tag = params.hidden_tag
|
||||||
|
permission.is_admin = params.is_admin
|
||||||
await permission.save()
|
await permission.save()
|
||||||
# 更新用户信息缓存
|
# 更新用户信息缓存
|
||||||
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
|
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
|
||||||
@ -161,6 +163,7 @@ async def get_permission(request: Request, id: str = Path(description="权限ID"
|
|||||||
fixed_tag="fixed_tag",
|
fixed_tag="fixed_tag",
|
||||||
show_link="show_link",
|
show_link="show_link",
|
||||||
show_parent="show_parent",
|
show_parent="show_parent",
|
||||||
|
is_admin="is_admin"
|
||||||
)
|
)
|
||||||
return Response.success(msg="查询权限详情成功!", data=permission)
|
return Response.success(msg="查询权限详情成功!", data=permission)
|
||||||
else:
|
else:
|
||||||
@ -195,7 +198,9 @@ async def get_permission_list(
|
|||||||
enterTransition: Optional[str] = Query(default=None, description="进场动画"),
|
enterTransition: Optional[str] = Query(default=None, description="进场动画"),
|
||||||
leaveTransition: Optional[str] = Query(default=None, description="离场动画"),
|
leaveTransition: Optional[str] = Query(default=None, description="离场动画"),
|
||||||
fixedTag: Optional[bool] = Query(default=None, description="固定标签页"),
|
fixedTag: Optional[bool] = Query(default=None, description="固定标签页"),
|
||||||
hiddenTag: Optional[bool] = Query(default=None, description="隐藏标签页")
|
hiddenTag: Optional[bool] = Query(default=None, description="隐藏标签页"),
|
||||||
|
isAdmin: Optional[bool] = Query(default=None, description="是否为管理专属页面"),
|
||||||
|
current_user: dict = Depends(LoginController.get_current_user),
|
||||||
):
|
):
|
||||||
filterArgs = {
|
filterArgs = {
|
||||||
f'{k}__contains': v for k, v in {
|
f'{k}__contains': v for k, v in {
|
||||||
@ -219,9 +224,13 @@ async def get_permission_list(
|
|||||||
"enter_transition": enterTransition,
|
"enter_transition": enterTransition,
|
||||||
"leave_transition": leaveTransition,
|
"leave_transition": leaveTransition,
|
||||||
"fixed_tag": fixedTag,
|
"fixed_tag": fixedTag,
|
||||||
"hidden_tag": hiddenTag
|
"hidden_tag": hiddenTag,
|
||||||
|
"is_admin": isAdmin
|
||||||
}.items() if v
|
}.items() if v
|
||||||
}
|
}
|
||||||
|
department_id = current_user.get("department_id", "")
|
||||||
|
if not await hasAdmin(request, department_id):
|
||||||
|
filterArgs["is_admin"] = False
|
||||||
total = await Permission.filter(**filterArgs, del_flag=1).count()
|
total = await Permission.filter(**filterArgs, del_flag=1).count()
|
||||||
result = await Permission.filter(**filterArgs, del_flag=1).offset((page - 1) * pageSize).limit(pageSize).order_by(
|
result = await Permission.filter(**filterArgs, del_flag=1).offset((page - 1) * pageSize).limit(pageSize).order_by(
|
||||||
'rank').values(
|
'rank').values(
|
||||||
@ -250,7 +259,8 @@ async def get_permission_list(
|
|||||||
hidden_tag="hidden_tag",
|
hidden_tag="hidden_tag",
|
||||||
fixed_tag="fixed_tag",
|
fixed_tag="fixed_tag",
|
||||||
show_link="show_link",
|
show_link="show_link",
|
||||||
show_parent="show_parent"
|
show_parent="show_parent",
|
||||||
|
is_admin="is_admin"
|
||||||
)
|
)
|
||||||
return Response.success(data={
|
return Response.success(data={
|
||||||
"total": total,
|
"total": total,
|
||||||
|
16
api/role.py
16
api/role.py
@ -10,7 +10,7 @@ from typing import Optional
|
|||||||
from fastapi import APIRouter, Depends, Path, Query, Request
|
from fastapi import APIRouter, Depends, Path, Query, Request
|
||||||
from fastapi.responses import JSONResponse
|
from fastapi.responses import JSONResponse
|
||||||
|
|
||||||
from annotation.auth import Auth, hasAuth
|
from annotation.auth import Auth, hasAuth, hasAdmin
|
||||||
from annotation.log import Log
|
from annotation.log import Log
|
||||||
from config.constant import BusinessType, RedisKeyConfig
|
from config.constant import BusinessType, RedisKeyConfig
|
||||||
from controller.login import LoginController
|
from controller.login import LoginController
|
||||||
@ -235,6 +235,11 @@ async def add_role_permission(request: Request, params: AddRolePermissionParams,
|
|||||||
id: str = Path(..., description="角色ID"),
|
id: str = Path(..., description="角色ID"),
|
||||||
current_user: dict = Depends(LoginController.get_current_user)):
|
current_user: dict = Depends(LoginController.get_current_user)):
|
||||||
sub_departments = current_user.get("sub_departments")
|
sub_departments = current_user.get("sub_departments")
|
||||||
|
if await hasAdmin(request, current_user.get("department_id")):
|
||||||
|
department_permissions = await Permission.filter(del_flag=1).values("id")
|
||||||
|
else:
|
||||||
|
department_permissions = await Permission.filter(is_admin=False, del_flag=1).values("id")
|
||||||
|
department_permissions = filterKeyValues(department_permissions, "id")
|
||||||
if role := await Role.get_or_none(id=id, del_flag=1, department__id__in=sub_departments):
|
if role := await Role.get_or_none(id=id, del_flag=1, department__id__in=sub_departments):
|
||||||
# 已有角色权限
|
# 已有角色权限
|
||||||
rolePermissions = await RolePermission.filter(role_id=id, del_flag=1).values("permission_id")
|
rolePermissions = await RolePermission.filter(role_id=id, del_flag=1).values("permission_id")
|
||||||
@ -243,6 +248,8 @@ async def add_role_permission(request: Request, params: AddRolePermissionParams,
|
|||||||
add_list = set(params.permission_ids).difference(set(rolePermissions))
|
add_list = set(params.permission_ids).difference(set(rolePermissions))
|
||||||
# 循环添加角色权限
|
# 循环添加角色权限
|
||||||
for item in add_list:
|
for item in add_list:
|
||||||
|
if item not in department_permissions:
|
||||||
|
continue
|
||||||
permission = await Permission.get_or_none(id=item, del_flag=1)
|
permission = await Permission.get_or_none(id=item, del_flag=1)
|
||||||
if permission:
|
if permission:
|
||||||
await RolePermission.create(
|
await RolePermission.create(
|
||||||
@ -294,6 +301,11 @@ async def update_role_permission(request: Request, params: AddRolePermissionPara
|
|||||||
id: str = Path(..., description="角色ID"),
|
id: str = Path(..., description="角色ID"),
|
||||||
current_user: dict = Depends(LoginController.get_current_user)):
|
current_user: dict = Depends(LoginController.get_current_user)):
|
||||||
sub_departments = current_user.get("sub_departments")
|
sub_departments = current_user.get("sub_departments")
|
||||||
|
if await hasAdmin(request, current_user.get("department_id")):
|
||||||
|
department_permissions = await Permission.filter(del_flag=1).values("id")
|
||||||
|
else:
|
||||||
|
department_permissions = await Permission.filter(is_admin=False, del_flag=1).values("id")
|
||||||
|
department_permissions = filterKeyValues(department_permissions, "id")
|
||||||
if role := await Role.get_or_none(id=id, del_flag=1, department__id__in=sub_departments):
|
if role := await Role.get_or_none(id=id, del_flag=1, department__id__in=sub_departments):
|
||||||
# 已有角色权限
|
# 已有角色权限
|
||||||
rolePermissions = await RolePermission.filter(role_id=role.id, del_flag=1).values("permission_id")
|
rolePermissions = await RolePermission.filter(role_id=role.id, del_flag=1).values("permission_id")
|
||||||
@ -307,6 +319,8 @@ async def update_role_permission(request: Request, params: AddRolePermissionPara
|
|||||||
await RolePermission.filter(role_id=id, permission_id=item, del_flag=1).update(del_flag=0)
|
await RolePermission.filter(role_id=id, permission_id=item, del_flag=1).update(del_flag=0)
|
||||||
# 循环添加角色权限
|
# 循环添加角色权限
|
||||||
for item in add_list:
|
for item in add_list:
|
||||||
|
if item not in department_permissions:
|
||||||
|
continue
|
||||||
await RolePermission.create(role_id=id, permission_id=item)
|
await RolePermission.create(role_id=id, permission_id=item)
|
||||||
# 更新用户信息缓存
|
# 更新用户信息缓存
|
||||||
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
|
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
|
||||||
|
17
api/user.py
17
api/user.py
@ -443,7 +443,7 @@ async def reset_user_password(request: Request, params: ResetPasswordParams, id:
|
|||||||
@userAPI.post("/updateBaseUserInfo", response_model=BaseResponse, response_class=JSONResponse,
|
@userAPI.post("/updateBaseUserInfo", response_model=BaseResponse, response_class=JSONResponse,
|
||||||
summary="更新基础个人信息")
|
summary="更新基础个人信息")
|
||||||
@Log(title="更新基础个人信息", business_type=BusinessType.UPDATE)
|
@Log(title="更新基础个人信息", business_type=BusinessType.UPDATE)
|
||||||
async def update_base_userinfo(params: UpdateBaseUserInfoParams, request: Request,
|
async def update_base_userinfo(request: Request, params: UpdateBaseUserInfoParams,
|
||||||
current_user: dict = Depends(LoginController.get_current_user)):
|
current_user: dict = Depends(LoginController.get_current_user)):
|
||||||
user = await User.get_or_none(id=current_user.get("id"), del_flag=1)
|
user = await User.get_or_none(id=current_user.get("id"), del_flag=1)
|
||||||
if user:
|
if user:
|
||||||
@ -485,10 +485,10 @@ async def update_user_phone(request: Request, password: str = Form(description="
|
|||||||
password = await Password.get_password_hash(password)
|
password = await Password.get_password_hash(password)
|
||||||
if user.password != password:
|
if user.password != password:
|
||||||
return Response.error("更改失败,请正确输入旧密码")
|
return Response.error("更改失败,请正确输入旧密码")
|
||||||
phoneStatus = await User.filter(phone=phone,del_flag=1).count()
|
phoneStatus = await User.filter(phone=phone, del_flag=1).count()
|
||||||
if phoneStatus:
|
if phoneStatus:
|
||||||
return Response.error( f"更改失败,手机号:{phone}已绑定其他账号!")
|
return Response.error(f"更改失败,手机号:{phone}已绑定其他账号!")
|
||||||
user.phone=phone
|
user.phone = phone
|
||||||
await user.save()
|
await user.save()
|
||||||
if await request.app.state.redis.get(f'{RedisKeyConfig.USER_INFO.key}:{user.id}'):
|
if await request.app.state.redis.get(f'{RedisKeyConfig.USER_INFO.key}:{user.id}'):
|
||||||
await request.app.state.redis.delete(f'{RedisKeyConfig.USER_INFO.key}:{user.id}')
|
await request.app.state.redis.delete(f'{RedisKeyConfig.USER_INFO.key}:{user.id}')
|
||||||
@ -500,15 +500,16 @@ async def update_user_phone(request: Request, password: str = Form(description="
|
|||||||
@userAPI.post("/updateEmail", response_class=JSONResponse, response_model=BaseResponse, summary="用户更新邮箱")
|
@userAPI.post("/updateEmail", response_class=JSONResponse, response_model=BaseResponse, summary="用户更新邮箱")
|
||||||
@Log(title="用户更新邮箱", business_type=BusinessType.UPDATE)
|
@Log(title="用户更新邮箱", business_type=BusinessType.UPDATE)
|
||||||
async def update_user_email(request: Request, password: str = Form(description="用户密码"),
|
async def update_user_email(request: Request, password: str = Form(description="用户密码"),
|
||||||
email: str = Form(description="用户邮箱"),current_user: dict = Depends(LoginController.get_current_user)):
|
email: str = Form(description="用户邮箱"),
|
||||||
if user:=await User.get_or_none(id=current_user.get("id"),del_flag=1):
|
current_user: dict = Depends(LoginController.get_current_user)):
|
||||||
|
if user := await User.get_or_none(id=current_user.get("id"), del_flag=1):
|
||||||
password = await Password.get_password_hash(password)
|
password = await Password.get_password_hash(password)
|
||||||
if user.password != password:
|
if user.password != password:
|
||||||
return Response.error("更改失败,请正确输入旧密码")
|
return Response.error("更改失败,请正确输入旧密码")
|
||||||
emailStatus = await User.filter(email=email,del_flag=1).count()
|
emailStatus = await User.filter(email=email, del_flag=1).count()
|
||||||
if emailStatus:
|
if emailStatus:
|
||||||
return Response.error(f"更改失败,邮箱:{email}已绑定其他账号!")
|
return Response.error(f"更改失败,邮箱:{email}已绑定其他账号!")
|
||||||
user.email=email
|
user.email = email
|
||||||
await user.save()
|
await user.save()
|
||||||
if await request.app.state.redis.get(f'{RedisKeyConfig.USER_INFO.key}:{user.id}'):
|
if await request.app.state.redis.get(f'{RedisKeyConfig.USER_INFO.key}:{user.id}'):
|
||||||
await request.app.state.redis.delete(f'{RedisKeyConfig.USER_INFO.key}:{user.id}')
|
await request.app.state.redis.delete(f'{RedisKeyConfig.USER_INFO.key}:{user.id}')
|
||||||
|
@ -280,6 +280,18 @@ class Permission(BaseModel):
|
|||||||
- 映射到数据库字段 show_parent。
|
- 映射到数据库字段 show_parent。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
is_admin = fields.BooleanField(
|
||||||
|
default=False,
|
||||||
|
description="是否为管理专属页面",
|
||||||
|
source_field="is_admin" # 映射到数据库字段 is_admin
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
是否为管理专属页面。
|
||||||
|
- 是否为管理专属页面,仅管理员可见。
|
||||||
|
- 默认为 False。
|
||||||
|
- 映射到数据库字段 is_admin。
|
||||||
|
"""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
table = "permission" # 数据库表名
|
table = "permission" # 数据库表名
|
||||||
table_description = "权限表" # 表描述
|
table_description = "权限表" # 表描述
|
||||||
|
@ -43,6 +43,7 @@ class PermissionInfo(BaseModel):
|
|||||||
fixed_tag: bool = Field(default=False, description="固定标签页")
|
fixed_tag: bool = Field(default=False, description="固定标签页")
|
||||||
show_link: bool = Field(default=True, description="显示菜单")
|
show_link: bool = Field(default=True, description="显示菜单")
|
||||||
show_parent: bool = Field(default=True, description="显示父级菜单")
|
show_parent: bool = Field(default=True, description="显示父级菜单")
|
||||||
|
is_admin: bool = Field(default=False, description="是否为管理专属页面")
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
json_schema_extra = {
|
json_schema_extra = {
|
||||||
@ -72,7 +73,8 @@ class PermissionInfo(BaseModel):
|
|||||||
"hidden_tag": False,
|
"hidden_tag": False,
|
||||||
"fixed_tag": False,
|
"fixed_tag": False,
|
||||||
"show_link": True,
|
"show_link": True,
|
||||||
"show_parent": True
|
"show_parent": True,
|
||||||
|
"is_admin": False
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,6 +111,7 @@ class AddPermissionParams(BaseModel):
|
|||||||
show_parent: bool = Field(default=True, description="显示父级菜单")
|
show_parent: bool = Field(default=True, description="显示父级菜单")
|
||||||
parent_id: str = Field(default="", max_length=36, description="父级菜单ID")
|
parent_id: str = Field(default="", max_length=36, description="父级菜单ID")
|
||||||
menu_type: int = Field(default=0, description="菜单类型")
|
menu_type: int = Field(default=0, description="菜单类型")
|
||||||
|
is_admin: bool = Field(default=False, description="是否为管理专属页面")
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
json_schema_extra = {
|
json_schema_extra = {
|
||||||
@ -133,7 +136,8 @@ class AddPermissionParams(BaseModel):
|
|||||||
"show_link": True,
|
"show_link": True,
|
||||||
"show_parent": True,
|
"show_parent": True,
|
||||||
"parent_id": "",
|
"parent_id": "",
|
||||||
"menu_type": 0
|
"menu_type": 0,
|
||||||
|
"is_admin": False
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
# @Software : PyCharm
|
# @Software : PyCharm
|
||||||
# @Comment : 本程序
|
# @Comment : 本程序
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from enum import IntEnum
|
|
||||||
from typing import Optional, List
|
from typing import Optional, List
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
@ -16,11 +15,6 @@ from pydantic_validation_decorator import Xss, NotBlank, Size, Network
|
|||||||
from schemas.common import BaseResponse, ListQueryResult
|
from schemas.common import BaseResponse, ListQueryResult
|
||||||
|
|
||||||
|
|
||||||
class Gender(IntEnum):
|
|
||||||
MAN = 0
|
|
||||||
WOMAN = 1
|
|
||||||
|
|
||||||
|
|
||||||
class UserBase(BaseModel):
|
class UserBase(BaseModel):
|
||||||
"""
|
"""
|
||||||
用户表基础模型。
|
用户表基础模型。
|
||||||
@ -399,7 +393,7 @@ class UpdateBaseUserInfoParams(BaseModel):
|
|||||||
"""修改基础信息参数"""
|
"""修改基础信息参数"""
|
||||||
name: str
|
name: str
|
||||||
"""姓名"""
|
"""姓名"""
|
||||||
gender: Gender
|
gender: int
|
||||||
"""性别"""
|
"""性别"""
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user