Skip to content

Commit c37d86e

Browse files
committed
feat:新增数据权限功能,内置五种数据权限 #I848BG
1 parent 7e8e358 commit c37d86e

File tree

13 files changed

+600
-12
lines changed

13 files changed

+600
-12
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from fastapi import Depends
2+
from module_admin.entity.vo.user_vo import CurrentUserInfoServiceResponse
3+
from module_admin.service.login_service import get_current_user
4+
from typing import Optional
5+
6+
7+
class GetDataScope:
8+
"""
9+
获取当前用户数据权限对应的查询sql语句
10+
"""
11+
def __init__(self, query_alias: Optional[str] = '', db_alias: Optional[str] = 'db'):
12+
self.query_alias = query_alias
13+
self.db_alias = db_alias
14+
15+
def __call__(self, current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
16+
user_id = current_user.user.user_id
17+
dept_id = current_user.user.dept_id
18+
role_datascope_list = [dict(role_id=item.role_id, data_scope=int(item.data_scope)) for item in current_user.role]
19+
max_data_scope_dict = min(role_datascope_list, key=lambda x: x['data_scope'])
20+
max_role_id = max_data_scope_dict['role_id']
21+
max_data_scope = max_data_scope_dict['data_scope']
22+
if self.query_alias == '' or max_data_scope == 1 or user_id == 1:
23+
param_sql = '1 == 1'
24+
elif max_data_scope == 2:
25+
param_sql = f'{self.query_alias}.dept_id.in_({self.db_alias}.query(SysRoleDept.dept_id).filter(SysRoleDept.role_id == {max_role_id}))'
26+
elif max_data_scope == 3:
27+
param_sql = f'{self.query_alias}.dept_id == {dept_id}'
28+
elif max_data_scope == 4:
29+
param_sql = f'{self.query_alias}.dept_id.in_({self.db_alias}.query(SysDept.dept_id).filter(or_(SysDept.dept_id == {dept_id}, func.find_in_set({dept_id}, SysDept.ancestors))))'
30+
elif max_data_scope == 5:
31+
param_sql = f'{self.query_alias}.user_id == {user_id}'
32+
else:
33+
param_sql = '1 == 0'
34+
35+
return param_sql

dash-fastapi-backend/module_admin/controller/role_controller.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,24 @@ async def edit_system_role(request: Request, edit_role: AddRoleModel, query_db:
7575
except Exception as e:
7676
logger.exception(e)
7777
return response_500(data="", message=str(e))
78+
79+
80+
@roleController.patch("/role/dataScope", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:edit'))])
81+
@log_decorator(title='角色管理', business_type=4)
82+
async def edit_system_role_datascope(request: Request, role_data_scope: RoleDataScopeModel, query_db: Session = Depends(get_db), current_user: CurrentUserInfoServiceResponse = Depends(get_current_user)):
83+
try:
84+
role_data_scope.update_by = current_user.user.user_name
85+
role_data_scope.update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
86+
role_data_scope_result = RoleService.role_datascope_services(query_db, role_data_scope)
87+
if role_data_scope_result.is_success:
88+
logger.info(role_data_scope_result.message)
89+
return response_200(data=role_data_scope_result, message=role_data_scope_result.message)
90+
else:
91+
logger.warning(role_data_scope_result.message)
92+
return response_400(data="", message=role_data_scope_result.message)
93+
except Exception as e:
94+
logger.exception(e)
95+
return response_500(data="", message=str(e))
7896

7997

8098
@roleController.post("/role/delete", response_model=CrudRoleResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:role:remove'))])

dash-fastapi-backend/module_admin/controller/user_controller.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@
1212
from utils.log_util import *
1313
from utils.common_util import bytes2file_response
1414
from module_admin.aspect.interface_auth import CheckUserInterfaceAuth
15+
from module_admin.aspect.data_scope import GetDataScope
1516
from module_admin.annotation.log_annotation import log_decorator
1617

1718

1819
userController = APIRouter(dependencies=[Depends(get_current_user)])
1920

2021

2122
@userController.post("/user/get", response_model=UserPageObjectResponse, dependencies=[Depends(CheckUserInterfaceAuth('system:user:list'))])
22-
async def get_system_user_list(request: Request, user_page_query: UserPageObject, query_db: Session = Depends(get_db)):
23+
async def get_system_user_list(request: Request, user_page_query: UserPageObject, query_db: Session = Depends(get_db), data_scope_sql: str = Depends(GetDataScope('SysUser'))):
2324
try:
2425
user_query = UserQueryModel(**user_page_query.dict())
2526
# 获取全量数据
26-
user_query_result = UserService.get_user_list_services(query_db, user_query)
27+
user_query_result = UserService.get_user_list_services(query_db, user_query, data_scope_sql)
2728
# 分页操作
2829
user_page_query_result = get_page_obj(user_query_result, user_page_query.page_num, user_page_query.page_size)
2930
logger.info('获取成功')

dash-fastapi-backend/module_admin/dao/role_dao.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from sqlalchemy import and_, desc
22
from sqlalchemy.orm import Session
3-
from module_admin.entity.do.role_do import SysRole, SysRoleMenu
3+
from module_admin.entity.do.role_do import SysRole, SysRoleMenu, SysRoleDept
4+
from module_admin.entity.do.dept_do import SysDept
45
from module_admin.entity.do.menu_do import SysMenu
5-
from module_admin.entity.vo.role_vo import RoleModel, RoleMenuModel, RoleQueryModel, RoleDetailModel
6+
from module_admin.entity.vo.role_vo import RoleModel, RoleMenuModel, RoleDeptModel, RoleQueryModel, RoleDetailModel
67
from utils.time_format_util import list_format_datetime, object_format_datetime
78
from datetime import datetime, time
89

@@ -74,9 +75,15 @@ def get_role_detail_by_id(cls, db: Session, role_id: int):
7475
.outerjoin(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id) \
7576
.outerjoin(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == 0)) \
7677
.distinct().all()
78+
query_role_dept_info = db.query(SysDept).select_from(SysRole) \
79+
.filter(SysRole.del_flag == 0, SysRole.role_id == role_id) \
80+
.outerjoin(SysRoleDept, SysRole.role_id == SysRoleDept.role_id) \
81+
.outerjoin(SysDept, and_(SysRoleDept.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \
82+
.distinct().all()
7783
results = dict(
7884
role=object_format_datetime(query_role_basic_info),
7985
menu=list_format_datetime(query_role_menu_info),
86+
dept=list_format_datetime(query_role_dept_info),
8087
)
8188

8289
return RoleDetailModel(**results)
@@ -177,3 +184,26 @@ def delete_role_menu_dao(cls, db: Session, role_menu: RoleMenuModel):
177184
db.query(SysRoleMenu) \
178185
.filter(SysRoleMenu.role_id == role_menu.role_id) \
179186
.delete()
187+
188+
@classmethod
189+
def add_role_dept_dao(cls, db: Session, role_dept: RoleDeptModel):
190+
"""
191+
新增角色部门关联信息数据库操作
192+
:param db: orm对象
193+
:param role_dept: 用户角色部门关联对象
194+
:return:
195+
"""
196+
db_role_dept = SysRoleDept(**role_dept.dict())
197+
db.add(db_role_dept)
198+
199+
@classmethod
200+
def delete_role_dept_dao(cls, db: Session, role_dept: RoleDeptModel):
201+
"""
202+
删除角色部门关联信息数据库操作
203+
:param db: orm对象
204+
:param role_dept: 角色部门关联对象
205+
:return:
206+
"""
207+
db.query(SysRoleDept) \
208+
.filter(SysRoleDept.role_id == role_dept.role_id) \
209+
.delete()

dash-fastapi-backend/module_admin/dao/user_dao.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from sqlalchemy import and_, or_, desc, func
22
from sqlalchemy.orm import Session
33
from module_admin.entity.do.user_do import SysUser, SysUserRole, SysUserPost
4-
from module_admin.entity.do.role_do import SysRole, SysRoleMenu
4+
from module_admin.entity.do.role_do import SysRole, SysRoleMenu, SysRoleDept
55
from module_admin.entity.do.dept_do import SysDept
66
from module_admin.entity.do.post_do import SysPost
77
from module_admin.entity.do.menu_do import SysMenu
@@ -139,11 +139,12 @@ def get_user_detail_by_id(cls, db: Session, user_id: int):
139139
return CurrentUserInfo(**results)
140140

141141
@classmethod
142-
def get_user_list(cls, db: Session, query_object: UserQueryModel):
142+
def get_user_list(cls, db: Session, query_object: UserQueryModel, data_scope_sql: str):
143143
"""
144144
根据查询参数获取用户列表信息
145145
:param db: orm对象
146146
:param query_object: 查询参数对象
147+
:param data_scope_sql: 数据权限对应的查询sql语句
147148
:return: 用户列表信息对象
148149
"""
149150
user_list = db.query(SysUser, SysDept) \
@@ -160,7 +161,8 @@ def get_user_list(cls, db: Session, query_object: UserQueryModel):
160161
SysUser.create_time.between(
161162
datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)),
162163
datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59)))
163-
if query_object.create_time_start and query_object.create_time_end else True
164+
if query_object.create_time_start and query_object.create_time_end else True,
165+
eval(data_scope_sql)
164166
) \
165167
.outerjoin(SysDept, and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \
166168
.distinct().all()

dash-fastapi-backend/module_admin/entity/vo/role_vo.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from pydantic import BaseModel
22
from typing import Union, Optional, List
33
from module_admin.entity.vo.user_vo import RoleModel
4+
from module_admin.entity.vo.dept_vo import DeptModel
45
from module_admin.entity.vo.menu_vo import MenuModel
56

67

@@ -15,6 +16,17 @@ class Config:
1516
orm_mode = True
1617

1718

19+
class RoleDeptModel(BaseModel):
20+
"""
21+
角色和部门关联表对应pydantic模型
22+
"""
23+
role_id: Optional[int]
24+
dept_id: Optional[int]
25+
26+
class Config:
27+
orm_mode = True
28+
29+
1830
class RoleQueryModel(RoleModel):
1931
"""
2032
角色管理不分页查询模型
@@ -65,6 +77,13 @@ class AddRoleModel(RoleModel):
6577
type: Optional[str]
6678

6779

80+
class RoleDataScopeModel(RoleModel):
81+
"""
82+
角色数据权限模型
83+
"""
84+
dept_id: Optional[str]
85+
86+
6887
class DeleteRoleModel(BaseModel):
6988
"""
7089
删除角色模型
@@ -80,3 +99,4 @@ class RoleDetailModel(BaseModel):
8099
"""
81100
role: Union[RoleModel, None]
82101
menu: List[Union[MenuModel, None]]
102+
dept: List[Union[DeptModel, None]]

dash-fastapi-backend/module_admin/service/role_service.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,42 @@ def edit_role_services(cls, result_db: Session, page_object: AddRoleModel):
100100

101101
return CrudRoleResponse(**result)
102102

103+
@classmethod
104+
def role_datascope_services(cls, result_db: Session, page_object: RoleDataScopeModel):
105+
"""
106+
分配角色数据权限service
107+
:param result_db: orm对象
108+
:param page_object: 角色数据权限对象
109+
:return: 分配角色数据权限结果
110+
"""
111+
edit_role = page_object.dict(exclude_unset=True)
112+
del edit_role['dept_id']
113+
role_info = cls.detail_role_services(result_db, edit_role.get('role_id'))
114+
if role_info:
115+
if role_info.role.role_name != page_object.role_name:
116+
role = RoleDao.get_role_by_info(result_db, RoleModel(**dict(role_name=page_object.role_name)))
117+
if role:
118+
result = dict(is_success=False, message='角色名称已存在')
119+
return CrudRoleResponse(**result)
120+
try:
121+
RoleDao.edit_role_dao(result_db, edit_role)
122+
role_id_dict = dict(role_id=page_object.role_id)
123+
RoleDao.delete_role_dept_dao(result_db, RoleDeptModel(**role_id_dict))
124+
if page_object.dept_id and page_object.data_scope == '2':
125+
dept_id_list = page_object.dept_id.split(',')
126+
for dept in dept_id_list:
127+
dept_dict = dict(role_id=page_object.role_id, dept_id=dept)
128+
RoleDao.add_role_dept_dao(result_db, RoleDeptModel(**dept_dict))
129+
result_db.commit()
130+
result = dict(is_success=True, message='分配成功')
131+
except Exception as e:
132+
result_db.rollback()
133+
result = dict(is_success=False, message=str(e))
134+
else:
135+
result = dict(is_success=False, message='角色不存在')
136+
137+
return CrudRoleResponse(**result)
138+
103139
@classmethod
104140
def delete_role_services(cls, result_db: Session, page_object: DeleteRoleModel):
105141
"""

dash-fastapi-backend/module_admin/service/user_service.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ class UserService:
1010
"""
1111

1212
@classmethod
13-
def get_user_list_services(cls, result_db: Session, query_object: UserQueryModel):
13+
def get_user_list_services(cls, result_db: Session, query_object: UserQueryModel, data_scope_sql: str):
1414
"""
1515
获取用户列表信息service
1616
:param result_db: orm对象
1717
:param query_object: 查询参数对象
18+
:param data_scope_sql: 数据权限对应的查询sql语句
1819
:return: 用户列表信息对象
1920
"""
20-
user_list_result = UserDao.get_user_list(result_db, query_object)
21+
user_list_result = UserDao.get_user_list(result_db, query_object, data_scope_sql)
2122

2223
return user_list_result
2324

dash-fastapi-frontend/api/role.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ def edit_role_api(page_obj: dict):
2121
return api_request(method='patch', url='/system/role/edit', is_headers=True, json=page_obj)
2222

2323

24+
def role_datascope_api(page_obj: dict):
25+
26+
return api_request(method='patch', url='/system/role/dataScope', is_headers=True, json=page_obj)
27+
28+
2429
def delete_role_api(page_obj: dict):
2530

2631
return api_request(method='post', url='/system/role/delete', is_headers=True, json=page_obj)

0 commit comments

Comments
 (0)