django-vue-admin/dvadmin-backend/apps/vadmin/permission/views.py

396 lines
19 KiB
Python
Raw Normal View History

2021-02-27 12:38:44 +00:00
from django.contrib.auth import authenticate
2021-02-26 15:47:54 +00:00
from rest_framework.request import Request
2021-02-21 17:08:48 +00:00
from rest_framework.views import APIView
2021-03-20 07:47:16 +00:00
from ..op_drf.filters import DataLevelPermissionsFilter
2021-03-13 10:06:47 +00:00
from ..op_drf.viewsets import CustomModelViewSet
from ..permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter, UserProfileFilter
from ..permission.models import Role, Menu, Dept, Post, UserProfile
from ..permission.serializers import UserProfileSerializer, MenuSerializer, RoleSerializer, \
2021-02-26 15:47:54 +00:00
MenuCreateUpdateSerializer, DeptSerializer, DeptCreateUpdateSerializer, PostSerializer, PostCreateUpdateSerializer, \
2021-02-27 05:48:31 +00:00
RoleCreateUpdateSerializer, DeptTreeSerializer, MenuTreeSerializer, UserProfileCreateUpdateSerializer, \
2021-03-20 07:47:16 +00:00
PostSimpleSerializer, RoleSimpleSerializer, ExportUserProfileSerializer, ExportRoleSerializer, ExportPostSerializer, \
UserProfileImportSerializer
2021-03-15 14:33:40 +00:00
from ..system.models import DictDetails
2021-03-20 07:47:16 +00:00
from ..utils.export_excel import export_excel_save_model, excel_to_data
2021-03-13 10:06:47 +00:00
from ..utils.response import SuccessResponse, ErrorResponse
2021-02-21 17:08:48 +00:00
class GetUserProfileView(APIView):
2021-02-21 17:08:48 +00:00
"""
获取用户详细信息
"""
def get(self, request, format=None):
user_dict = UserProfileSerializer(request.user).data
2021-03-20 07:47:16 +00:00
permissions_list = ['*:*:*'] if user_dict.get('admin') else Menu.objects.filter(
2021-02-27 11:37:39 +00:00
role__userprofile=request.user).values_list('perms', flat=True)
return SuccessResponse({
2021-02-27 11:37:39 +00:00
'permissions': [ele for ele in permissions_list if ele],
'roles': Role.objects.filter(userprofile=request.user).values_list('roleKey', flat=True),
'user': user_dict
})
2021-02-21 17:08:48 +00:00
2021-02-21 17:08:48 +00:00
class GetRouters(APIView):
"""
2021-02-27 11:37:39 +00:00
获取路由详细信息
2021-02-21 17:08:48 +00:00
"""
2021-02-27 11:37:39 +00:00
def depth_menu(self, menus):
"""
获取菜单(通过前端递归值)
:param menus:
:return:
"""
return dict
2021-02-21 17:08:48 +00:00
def get(self, request, format=None):
# data = GetUserInfoSerializer(request.user).data
2021-03-20 07:47:16 +00:00
menus = Menu.objects.filter(role__userprofile=request.user).exclude(menuType='2').values('id', 'name',
2021-02-28 06:49:09 +00:00
'web_path',
2021-02-27 11:37:39 +00:00
'visible', 'status',
'isFrame',
'component_path',
'icon', 'parentId',
2021-03-02 15:20:25 +00:00
'isCache').distinct()
2021-03-20 07:47:16 +00:00
# data = '{'msg':'操作成功','code':200,'data':[{'name':'System','path':'/system','hidden':false,'redirect':'noRedirect','component':'Layout','alwaysShow':true,'meta':{'title':'系统管理','icon':'system','noCache':false},'children':[{'name':'User','path':'user','hidden':false,'component':'permission/user/index','meta':{'title':'用户管理','icon':'user','noCache':false}},{'name':'Role','path':'role','hidden':false,'component':'permission/role/index','meta':{'title':'角色管理','icon':'peoples','noCache':false}},{'name':'Menu','path':'menu','hidden':false,'component':'permission/menu/index','meta':{'title':'菜单管理','icon':'tree-table','noCache':false}},{'name':'Dept','path':'dept','hidden':false,'component':'permission/dept/index','meta':{'title':'部门管理','icon':'tree','noCache':false}},{'name':'Post','path':'post','hidden':false,'component':'permission/post/index','meta':{'title':'岗位管理','icon':'post','noCache':false}},{'name':'Dict','path':'dict','hidden':false,'component':'system/dict/index','meta':{'title':'字典管理','icon':'dict','noCache':false}},{'name':'Config','path':'config','hidden':false,'component':'system/config/index','meta':{'title':'参数设置','icon':'edit','noCache':false}},{'name':'Notice','path':'notice','hidden':false,'component':'system/notice/index','meta':{'title':'通知公告','icon':'message','noCache':false}},{'name':'Log','path':'log','hidden':false,'redirect':'noRedirect','component':'ParentView','alwaysShow':true,'meta':{'title':'日志管理','icon':'log','noCache':false},'children':[{'name':'Operlog','path':'operlog','hidden':false,'component':'monitor/operlog/index','meta':{'title':'操作日志','icon':'form','noCache':false}},{'name':'Logininfor','path':'logininfor','hidden':false,'component':'monitor/logininfor/index','meta':{'title':'登录日志','icon':'logininfor','noCache':false}}]}]},{'name':'Monitor','path':'/monitor','hidden':false,'redirect':'noRedirect','component':'Layout','alwaysShow':true,'meta':{'title':'系统监控','icon':'monitor','noCache':false},'children':[{'name':'Online','path':'online','hidden':false,'component':'monitor/online/index','meta':{'title':'在线用户','icon':'online','noCache':false}},{'name':'Job','path':'job','hidden':false,'component':'monitor/job/index','meta':{'title':'定时任务','icon':'job','noCache':false}},{'name':'Druid','path':'druid','hidden':false,'component':'monitor/druid/index','meta':{'title':'数据监控','icon':'druid','noCache':false}},{'name':'Server','path':'server','hidden':false,'component':'monitor/server/index','meta':{'title':'服务监控','icon':'server','noCache':false}},{'name':'Cache','path':'cache','hidden':false,'component':'monitor/cache/index','meta':{'title':'缓存监控','icon':'redis','noCache':false}}]},{'name':'Tool','path':'/tool','hidden':false,'redirect':'noRedirect','component':'Layout','alwaysShow':true,'meta':{'title':'系统工具','icon':'tool','noCache':false},'children':[{'name':'Build','path':'build','hidden':false,'component':'tool/build/index','meta':{'title':'表单构建','icon':'build','noCache':false}},{'name':'Gen','path':'gen','hidden':false,'component':'tool/gen/index','meta':{'title':'代码生成','icon':'code','noCache':false}},{'name':'Swagger','path':'swagger','hidden':false,'component':'tool/swagger/index','meta':{'title':'系统接口','icon':'swagger','noCache':false}}]},{'name':'Http://ruoyi.vip','path':'http://ruoyi.vip','hidden':false,'component':'Layout','meta':{'title':'若依官网','icon':'guide','noCache':false}}]}'
2021-02-27 11:37:39 +00:00
# data = json.loads(data)
data = []
2021-03-15 14:33:40 +00:00
sys_show_hide = DictDetails.get_default_dictValue('sys_show_hide')
2021-02-27 11:37:39 +00:00
for ele in menus:
data.append({
'id': ele.get('id'),
2021-03-15 14:42:59 +00:00
'name': ele.get('web_path', '').split('/')[-1] and ele.get('web_path', '').split('/')[-1].capitalize(),
2021-02-27 11:37:39 +00:00
'path': ele.get('web_path'),
'hidden': True if ele.get('visible') != '1' else False,
'redirect': ele.get('web_path') if ele.get('isFrame') == '1' else 'noRedirect',
'component': ele.get('component_path') or 'Layout',
2021-03-20 07:47:16 +00:00
'meta': {'title': ele.get('name'), 'icon': ele.get('icon'),
'noCache': True if ele.get('isCache') == sys_show_hide else False},
2021-02-27 11:37:39 +00:00
'parentId': ele.get('parentId')
})
return SuccessResponse(data)
class MenuModelViewSet(CustomModelViewSet):
"""
2021-02-26 15:47:54 +00:00
菜单模型 的CRUD视图
"""
queryset = Menu.objects.all()
serializer_class = MenuSerializer
2021-02-26 15:47:54 +00:00
create_serializer_class = MenuCreateUpdateSerializer
update_serializer_class = MenuCreateUpdateSerializer
filter_class = MenuFilter
2021-03-05 16:58:15 +00:00
extra_filter_backends = [DataLevelPermissionsFilter]
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
search_fields = ('name',)
ordering = 'create_datetime' # 默认排序
2021-02-26 17:53:08 +00:00
def tree_select_list(self, request: Request, *args, **kwargs):
"""
递归获取部门树
:param request:
:param args:
:param kwargs:
:return:
"""
queryset = self.filter_queryset(self.get_queryset())
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
serializer = MenuTreeSerializer(queryset, many=True)
return SuccessResponse(serializer.data)
def role_menu_tree_select(self, request: Request, *args, **kwargs):
"""
根据角色ID查询菜单下拉树结构
:param request:
:param args:
:param kwargs:
:return:
"""
menu_queryset = Menu.objects.filter(role__id=kwargs.get('pk')).values_list('id', flat=True)
queryset = self.filter_queryset(self.get_queryset())
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
serializer = MenuTreeSerializer(queryset, many=True)
return SuccessResponse({
'menus': serializer.data,
'checkedKeys': menu_queryset
})
2021-02-26 15:47:54 +00:00
class DeptModelViewSet(CustomModelViewSet):
"""
部门管理 的CRUD视图
"""
queryset = Dept.objects.all()
serializer_class = DeptSerializer
create_serializer_class = DeptCreateUpdateSerializer
update_serializer_class = DeptCreateUpdateSerializer
filter_class = DeptFilter
2021-03-05 16:58:15 +00:00
extra_filter_backends = [DataLevelPermissionsFilter]
2021-02-26 15:47:54 +00:00
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
2021-02-27 03:14:14 +00:00
search_fields = ('deptName',)
2021-02-26 15:47:54 +00:00
ordering = 'create_datetime' # 默认排序
def exclude_list(self, request: Request, *args, **kwargs):
2021-02-26 17:53:08 +00:00
"""
过滤剔除同级部门
:param request:
:param args:
:param kwargs:
:return:
"""
2021-02-26 15:47:54 +00:00
dept_queryset = Dept.objects.filter(id=kwargs.get('pk')).first()
parentId = dept_queryset.parentId if dept_queryset else ''
queryset = self.queryset.exclude(parentId=parentId).order_by('orderNum')
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
serializer = self.get_serializer(queryset, many=True)
return SuccessResponse(serializer.data)
2021-02-26 17:53:08 +00:00
def tree_select_list(self, request: Request, *args, **kwargs):
"""
递归获取部门树
:param request:
:param args:
:param kwargs:
:return:
"""
queryset = self.filter_queryset(self.get_queryset())
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
serializer = DeptTreeSerializer(queryset, many=True)
return SuccessResponse(serializer.data)
def role_dept_tree_select(self, request: Request, *args, **kwargs):
"""
根据角色ID查询部门树结构
:param request:
:param args:
:param kwargs:
:return:
"""
dept_queryset = Dept.objects.filter(role__id=kwargs.get('pk')).values_list('id', flat=True)
queryset = self.filter_queryset(self.get_queryset())
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
serializer = DeptTreeSerializer(queryset, many=True)
return SuccessResponse({
'depts': serializer.data,
'checkedKeys': dept_queryset
})
2021-02-26 15:47:54 +00:00
class PostModelViewSet(CustomModelViewSet):
"""
岗位管理 的CRUD视图
"""
queryset = Post.objects.all()
serializer_class = PostSerializer
create_serializer_class = PostCreateUpdateSerializer
update_serializer_class = PostCreateUpdateSerializer
filter_class = PostFilter
2021-03-05 16:58:15 +00:00
extra_filter_backends = [DataLevelPermissionsFilter]
2021-02-26 15:47:54 +00:00
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
2021-02-27 03:14:14 +00:00
search_fields = ('postName',)
2021-02-26 17:53:08 +00:00
ordering = ['postSort', 'create_datetime'] # 默认排序
2021-02-26 15:47:54 +00:00
2021-02-28 06:49:09 +00:00
def export(self, request: Request, *args, **kwargs):
"""
导出岗位
:param request:
:param args:
:param kwargs:
:return:
"""
field_data = ['岗位序号', '岗位编码', '岗位名称', '岗位排序', '状态', '创建者', '修改者', '备注']
data = ExportPostSerializer(Post.objects.all(), many=True).data
return SuccessResponse(export_excel_save_model(request, field_data, data, '导出岗位数据.xls'))
2021-02-26 15:47:54 +00:00
class RoleModelViewSet(CustomModelViewSet):
"""
2021-02-26 15:47:54 +00:00
角色管理 的CRUD视图
"""
queryset = Role.objects.all()
serializer_class = RoleSerializer
2021-02-26 15:47:54 +00:00
create_serializer_class = RoleCreateUpdateSerializer
update_serializer_class = RoleCreateUpdateSerializer
filter_class = RoleFilter
2021-03-05 16:58:15 +00:00
extra_filter_backends = [DataLevelPermissionsFilter]
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
2021-02-27 03:14:14 +00:00
search_fields = ('roleName',)
ordering = 'create_datetime' # 默认排序
2021-02-27 05:48:31 +00:00
2021-02-28 06:49:09 +00:00
def export(self, request: Request, *args, **kwargs):
"""
导出角色
:param request:
:param args:
:param kwargs:
:return:
"""
field_data = ['角色序号', '角色名称', '角色权限', '角色排序', '数据范围', '角色状态', '创建者', '修改者', '备注']
data = ExportRoleSerializer(Role.objects.all(), many=True).data
return SuccessResponse(export_excel_save_model(request, field_data, data, '导出角色数据.xls'))
2021-02-27 05:48:31 +00:00
class UserProfileModelViewSet(CustomModelViewSet):
"""
用户管理 的CRUD视图
"""
queryset = UserProfile.objects.all()
serializer_class = UserProfileSerializer
create_serializer_class = UserProfileCreateUpdateSerializer
update_serializer_class = UserProfileCreateUpdateSerializer
filter_class = UserProfileFilter
2021-03-05 16:58:15 +00:00
extra_filter_backends = [DataLevelPermissionsFilter]
2021-03-20 07:47:16 +00:00
# 导出
export_serializer_class = ExportUserProfileSerializer
export_field_data = ['用户序号', '登录名称', '用户名称', '用户邮箱', '手机号码', '用户性别', '帐号状态', '最后登录时间', '部门名称', '部门负责人']
# 导入
import_serializer_class = UserProfileImportSerializer
import_field_data = {'username': '登录账号', 'name': '用户名称', 'email': '用户邮箱', 'mobile': '手机号码',
'gender': '用户性别(男/女/未知)',
'is_active': '帐号状态(启用/禁用)', 'password': '登录密码', 'dept': '部门ID', 'role': '角色ID',
'post': '岗位ID'}
2021-02-27 05:48:31 +00:00
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
search_fields = ('username',)
ordering = 'create_datetime' # 默认排序
def change_status(self, request: Request, *args, **kwargs):
"""
修改用户状态
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.data.get('userId'))
instance.is_active = request.data.get('status')
instance.save()
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)
def get_user_details(self, request: Request, *args, **kwargs):
"""
获取用户详情
:param request:
:param args:
:param kwargs:
:return:
"""
userId = request.query_params.get('userId')
data = {
'posts': PostSimpleSerializer(Post.objects.all().order_by('postSort'), many=True).data,
'roles': RoleSimpleSerializer(Role.objects.all().order_by('roleSort'), many=True).data
}
if userId:
instance = self.queryset.get(id=userId)
serializer = self.get_serializer(instance)
data['data'] = serializer.data
data['postIds'] = [ele.get('id') for ele in serializer.data.get('post')]
data['roleIds'] = [ele.get('id') for ele in serializer.data.get('role')]
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(data)
def reset_pwd(self, request: Request, *args, **kwargs):
"""
重置密码
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.data.get('userId'))
serializer = self.get_serializer(instance)
instance.set_password(request.data.get('password'))
instance.save()
if hasattr(self, 'handle_logging'):
2021-02-27 11:37:39 +00:00
self.handle_logging(request, instance=instance, *args, **kwargs)
2021-02-27 05:48:31 +00:00
return SuccessResponse(serializer.data)
2021-02-27 12:38:44 +00:00
def profile(self, request: Request, *args, **kwargs):
"""
获取用户个人信息
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.user.id)
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)
def put_profile(self, request: Request, *args, **kwargs):
"""
更新用户个人信息
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.user.id)
2021-02-28 06:49:09 +00:00
instance.name = request.data.get('name', None)
instance.mobile = request.data.get('mobile', None)
instance.email = request.data.get('email', None)
instance.gender = request.data.get('gender', None)
2021-02-27 12:38:44 +00:00
instance.save()
2021-03-24 14:56:09 +00:00
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)
def put_avatar(self, request: Request, *args, **kwargs):
"""
更新用户头像
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.user.id)
instance.avatar = request.data.get('avatar_url', None)
instance.save()
2021-02-27 12:38:44 +00:00
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)
def update_pwd(self, request: Request, *args, **kwargs):
"""
个人修改密码
:param request:
:param args:
:param kwargs:
:return:
"""
instance = self.queryset.get(id=request.user.id)
2021-02-28 06:49:09 +00:00
instance.mobile = request.data.get('newPassword', None)
if not authenticate(username=request.user.username, password=request.data.get('oldPassword', None)):
2021-02-27 12:38:44 +00:00
return ErrorResponse(msg='旧密码不正确!')
instance.set_password(request.data.get('newPassword'))
instance.save()
serializer = self.get_serializer(instance)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, instance=instance, *args, **kwargs)
return SuccessResponse(serializer.data)