部门管理完成

pull/1/head
李强 2021-02-26 23:47:54 +08:00
parent d9f920b245
commit e54eccec46
17 changed files with 295 additions and 75 deletions

View File

@ -90,7 +90,7 @@ npm run build:prod
~~~bash
1. 进入项目目录 cd dvadmin-backend
2. 在项目根目录中,复制 env.example.py 文件为一份新的,并重命名为 env.py
2. 在项目根目录中,复制 ./conf/env.example.py 文件为一份新的到 ./conf 文件夹下,并重命名为 env.py
3. 在 env.py 中配置数据库信息
4. 安装依赖环境
pip3 install -r requirements.txt

View File

@ -141,6 +141,8 @@ MEDIA_ROOT = os.path.join(BASE_DIR, "media")
# log 配置部分BEGIN #
SERVER_LOGS_FILE = os.path.join(BASE_DIR, 'logs', 'server.log')
ERROR_LOGS_FILE = os.path.join(BASE_DIR, 'logs', 'error.log')
if not os.path.exists(os.path.join(BASE_DIR, 'logs')):
os.makedirs(os.path.join(BASE_DIR, 'logs'))
# 格式:[2020-04-22 23:33:01][micoservice.apps.ready():16] [INFO] 这是一条日志:
# 格式:[日期][模块.函数名称():行号] [级别] 信息

View File

@ -1,4 +1,5 @@
from collections import OrderedDict
from typing import Any
from rest_framework.pagination import PageNumberPagination, _positive_int
from rest_framework.utils.urls import replace_query_param
@ -21,6 +22,10 @@ class Pagination(PageNumberPagination):
page_size = 10
def paginate_queryset(self, queryset, request, view=None):
page_num = request.query_params.get(self.page_query_param)
# 判断,如果 pageNum 为all 则取消分页返回所有
if page_num == 'all':
return None
return super().paginate_queryset(queryset, request, view)
def get_next_link(self):

View File

@ -232,7 +232,7 @@ class CustomMongoModelViewSet(MongoModelViewSet, mixins.TableSerializerMixin):
filtering_kwargs = {}
for param in self.request.query_params:
param = param.strip()
if param in ['page_size', 'page', 'search', 'ordering', 'as']: continue
if param in ['pageSize', 'pageNum', 'search', 'ordering', 'as']: continue
if self.filter_fields == '__all__' or param in self.filter_fields:
# if param in self.filter_fields:
filtering_kwargs[param] = self.request.query_params[param]

View File

@ -1,9 +1,53 @@
import django_filters
from apps.permission.models import Menu
from apps.permission.models import Menu, Dept, Post, Role, UserProfile
class MenuFilter(django_filters.rest_framework.FilterSet):
"""
菜单管理 简单序过滤器
"""
class Meta:
model = Menu
fields = '__all__'
exclude = ('description', 'creator', 'modifier')
class DeptFilter(django_filters.rest_framework.FilterSet):
"""
部门管理 简单序过滤器
"""
class Meta:
model = Dept
exclude = ('description', 'creator', 'modifier')
class PostFilter(django_filters.rest_framework.FilterSet):
"""
岗位管理 简单序过滤器
"""
class Meta:
model = Post
exclude = ('description', 'creator', 'modifier')
class RoleFilter(django_filters.rest_framework.FilterSet):
"""
角色管理 简单序过滤器
"""
class Meta:
model = Role
exclude = ('description', 'creator', 'modifier')
class UserProfileFilter(django_filters.rest_framework.FilterSet):
"""
用户管理 简单序过滤器
"""
class Meta:
model = UserProfile
exclude = ('secret', 'password',)

View File

@ -5,17 +5,17 @@ from apps.op_drf.models import CoreModel
class Dept(CoreModel):
name = CharField(max_length=64, verbose_name="部门名称")
deptName = CharField(max_length=64, verbose_name="部门名称")
orderNum = IntegerField(verbose_name="显示排序")
owner = CharField(max_length=32, verbose_name="负责人", null=True)
phone = CharField(max_length=32, verbose_name="联系电话", null=True)
email = CharField(max_length=32, verbose_name="邮箱", null=True)
status = BooleanField(default=False, verbose_name="部门状态")
parentId = ForeignKey(to='Dept', on_delete=CASCADE, default=False, verbose_name="上级部门")
status = CharField(max_length=8, verbose_name="部门状态", null=True)
parentId = ForeignKey(to='Dept', null=True, on_delete=CASCADE, default=False, verbose_name="上级部门")
class Meta:
verbose_name = '部门管理'
verbose_name_plural = verbose_name
def __str__(self):
return f"{self.name}"
return f"{self.deptName}"

View File

@ -1,9 +1,13 @@
from rest_framework import serializers
from apps.op_drf.serializers import CustomModelSerializer
from apps.permission.models import UserProfile, Menu, Role
from apps.permission.models import Menu, Dept, Post, Role, UserProfile
# ================================================= #
# ************** 用户管理 序列化器 ************** #
# ================================================= #
class UserProfileSerializer(CustomModelSerializer):
"""
简单用户序列化器
@ -22,19 +26,24 @@ class UserProfileSerializer(CustomModelSerializer):
exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined')
# ================================================= #
# ************** 菜单管理 序列化器 ************** #
# ================================================= #
class MenuSerializer(CustomModelSerializer):
"""
简单菜单序列化器
"""
parentId = serializers.IntegerField(source="parentId.id", default=0)
class Meta:
model = Menu
fields = '__all__'
exclude = ('description', 'creator', 'modifier')
class CreateUpdateMenuSerializer(CustomModelSerializer):
class MenuCreateUpdateSerializer(CustomModelSerializer):
"""
创建角色/更新时的列化器
菜单管理 创建/更新时的列化器
"""
def validate(self, attrs: dict):
@ -50,15 +59,89 @@ class CreateUpdateMenuSerializer(CustomModelSerializer):
class Meta:
model = Menu
fields = "__all__"
read_only_fields = ('mtime', 'ctime', 'creator', 'modifier')
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
class RoleSerializer(serializers.ModelSerializer):
# ================================================= #
# ************** 部门管理 序列化器 ************** #
# ================================================= #
class DeptSerializer(CustomModelSerializer):
"""
简单角色序列化器
部门管理 简单序列化器
"""
parentId = serializers.IntegerField(source="parentId.id", default=0)
class Meta:
model = Dept
exclude = ('description', 'creator', 'modifier')
class DeptCreateUpdateSerializer(CustomModelSerializer):
"""
部门管理 创建/更新时的列化器
"""
def validate(self, attrs: dict):
return super().validate(attrs)
class Meta:
model = Dept
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
# ================================================= #
# ************** 岗位管理 序列化器 ************** #
# ================================================= #
class PostSerializer(CustomModelSerializer):
"""
岗位管理 简单序列化器
"""
class Meta:
model = Post
exclude = ('description', 'creator', 'modifier')
class PostCreateUpdateSerializer(CustomModelSerializer):
"""
岗位管理 创建/更新时的列化器
"""
def validate(self, attrs: dict):
return super().validate(attrs)
class Meta:
model = Post
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
# ================================================= #
# ************** 角色管理 序列化器 ************** #
# ================================================= #
class RoleSerializer(CustomModelSerializer):
"""
角色管理 简单序列化器
"""
class Meta:
model = Role
fields = '__all__'
exclude = ('description', 'creator', 'modifier')
class RoleCreateUpdateSerializer(CustomModelSerializer):
"""
角色管理 创建/更新时的列化器
"""
def validate(self, attrs: dict):
return super().validate(attrs)
class Meta:
model = Role
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')

View File

@ -1,13 +1,17 @@
from django.urls import re_path
from rest_framework.routers import DefaultRouter
from apps.permission.views import MenuModelViewSet
from apps.permission.views import MenuModelViewSet, DeptModelViewSet, PostModelViewSet, RoleModelViewSet
router = DefaultRouter()
router.register(r'menus', MenuModelViewSet)
router.register(r'dept', DeptModelViewSet)
router.register(r'dept/exclude', DeptModelViewSet)
router.register(r'post', PostModelViewSet)
router.register(r'role', RoleModelViewSet)
urlpatterns = [
# re_path('menus/', MenuModelViewSet.as_view({'get': 'list'}), name='api_token_auth'),
re_path('dept/exclude/(?P<pk>.*)/', DeptModelViewSet.as_view({'get': 'exclude_list'}), name='api_token_auth'),
]
urlpatterns += router.urls

View File

@ -1,13 +1,15 @@
import json
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView
from apps.op_drf.viewsets import CustomModelViewSet
from apps.permission.filters import MenuFilter
from apps.permission.models import Role, Menu
from apps.permission.filters import MenuFilter, DeptFilter, PostFilter, RoleFilter
from apps.permission.models import Role, Menu, Dept, Post
from apps.permission.serializers import UserProfileSerializer, MenuSerializer, RoleSerializer, \
CreateUpdateMenuSerializer
MenuCreateUpdateSerializer, DeptSerializer, DeptCreateUpdateSerializer, PostSerializer, PostCreateUpdateSerializer, \
RoleCreateUpdateSerializer
from utils.response import SuccessResponse
@ -35,21 +37,19 @@ class GetRouters(APIView):
def get(self, request, format=None):
# data = GetUserInfoSerializer(request.user).data
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":"system/user/index","meta":{"title":"用户管理","icon":"user","noCache":false}},{"name":"Role","path":"role","hidden":false,"component":"system/role/index","meta":{"title":"角色管理","icon":"peoples","noCache":false}},{"name":"Menu","path":"menu","hidden":false,"component":"system/menu/index","meta":{"title":"菜单管理","icon":"tree-table","noCache":false}},{"name":"Dept","path":"dept","hidden":false,"component":"system/dept/index","meta":{"title":"部门管理","icon":"tree","noCache":false}},{"name":"Post","path":"post","hidden":false,"component":"system/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}}]}'
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}}]}'
data = json.loads(data)
return Response(data)
class MenuModelViewSet(CustomModelViewSet):
"""
菜单模型的CRUD视图
菜单模型 的CRUD视图
"""
queryset = Menu.objects.all()
serializer_class = MenuSerializer
create_serializer_class = CreateUpdateMenuSerializer
update_serializer_class = CreateUpdateMenuSerializer
# list_serializer_class = ListRoleSerializer
# retrieve_serializer_class = DetailRoleSerializer
create_serializer_class = MenuCreateUpdateSerializer
update_serializer_class = MenuCreateUpdateSerializer
filter_class = MenuFilter
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
@ -58,17 +58,56 @@ class MenuModelViewSet(CustomModelViewSet):
ordering = 'create_datetime' # 默认排序
class DeptModelViewSet(CustomModelViewSet):
"""
部门管理 的CRUD视图
"""
queryset = Dept.objects.all()
serializer_class = DeptSerializer
create_serializer_class = DeptCreateUpdateSerializer
update_serializer_class = DeptCreateUpdateSerializer
filter_class = DeptFilter
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
search_fields = ('name',)
ordering = 'create_datetime' # 默认排序
def exclude_list(self, request: Request, *args, **kwargs):
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)
class PostModelViewSet(CustomModelViewSet):
"""
岗位管理 的CRUD视图
"""
queryset = Post.objects.all()
serializer_class = PostSerializer
create_serializer_class = PostCreateUpdateSerializer
update_serializer_class = PostCreateUpdateSerializer
filter_class = PostFilter
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
search_fields = ('name',)
ordering = 'create_datetime' # 默认排序
class RoleModelViewSet(CustomModelViewSet):
"""
角色模型的CRUD视图
角色管理 的CRUD视图
"""
queryset = Role.objects.all()
serializer_class = RoleSerializer
# create_serializer_class = CreateUpdateRoleSerializer
# update_serializer_class = CreateUpdateRoleSerializer
# list_serializer_class = ListRoleSerializer
# retrieve_serializer_class = DetailRoleSerializer
# filter_class = RoleFilter
create_serializer_class = RoleCreateUpdateSerializer
update_serializer_class = RoleCreateUpdateSerializer
filter_class = RoleFilter
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)

View File

@ -4,12 +4,18 @@ from apps.system.models import DictDetails, DictData
class DictDataFilter(django_filters.rest_framework.FilterSet):
"""
字典管理 简单过滤器
"""
class Meta:
model = DictData
fields = '__all__'
class DictDetailsFilter(django_filters.rest_framework.FilterSet):
"""
字典详情 简单过滤器
"""
dictType = django_filters.CharFilter(field_name='dict_data__dictType')
class Meta:
model = DictDetails

View File

@ -4,7 +4,7 @@ from apps.op_drf.models import CoreModel
class DictDetails(CoreModel):
name = CharField(max_length=64, verbose_name="字典标签")
dictLabel = CharField(max_length=64, verbose_name="字典标签")
dictValue = CharField(max_length=256, verbose_name="字典键值")
is_default = BooleanField(verbose_name="是否默认", default=False)
status = CharField(max_length=2, verbose_name="字典状态")
@ -17,4 +17,4 @@ class DictDetails(CoreModel):
verbose_name_plural = verbose_name
def __str__(self):
return f"{self.name}"
return f"{self.dictLabel}"

View File

@ -4,6 +4,10 @@ from apps.op_drf.serializers import CustomModelSerializer
from apps.system.models import DictData, DictDetails
# ================================================= #
# ************** 字典管理 序列化器 ************** #
# ================================================= #
class DictDataSerializer(serializers.ModelSerializer):
"""
字典管理 简单序列化器
@ -21,10 +25,14 @@ class DictDataCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = DictData
fields = "__all__"
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
# ================================================= #
# ************** 字典详情 序列化器 ************** #
# ================================================= #
class DictDetailsSerializer(serializers.ModelSerializer):
"""
字典详情 简单序列化器
@ -33,7 +41,16 @@ class DictDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = DictDetails
exclude = ('creator', 'modifier')
exclude = ('description', 'creator', 'modifier')
class DictDetailsListSerializer(serializers.ModelSerializer):
"""
字典详情List 简单序列化器
"""
class Meta:
model = DictDetails
fields = ('dictLabel', 'dictValue', 'is_default')
class DictDetailsCreateUpdateSerializer(CustomModelSerializer):
@ -43,5 +60,5 @@ class DictDetailsCreateUpdateSerializer(CustomModelSerializer):
class Meta:
model = DictDetails
fields = "__all__"
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')

View File

@ -6,7 +6,7 @@ from apps.system.views import DictDataModelViewSet, DictDetailsModelViewSet, Dic
router = DefaultRouter()
router.register(r'dict/type', DictDataModelViewSet)
router.register(r'dict/data', DictDetailsModelViewSet)
router.register(r'dict/get/type', DictDetailsListModelViewSet)
urlpatterns = [
re_path('dict/get/type/(?P<pk>.*)/', DictDetailsListModelViewSet.as_view({'get':'list'})),
]
urlpatterns += router.urls

View File

@ -3,7 +3,7 @@ from rest_framework.request import Request
from apps.op_drf.viewsets import CustomModelViewSet
from apps.system.models import DictData
from apps.system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
DictDetailsCreateUpdateSerializer
DictDetailsCreateUpdateSerializer, DictDetailsListSerializer
from apps.system.models import DictDetails
from apps.system.filters import DictDetailsFilter, DictDataFilter
from utils.response import SuccessResponse
@ -16,7 +16,7 @@ class DictDataModelViewSet(CustomModelViewSet):
queryset = DictData.objects.all()
serializer_class = DictDataSerializer
create_serializer_class = DictDataCreateUpdateSerializer
# update_serializer_class = CreateUpdateRoleSerializer
update_serializer_class = DictDataCreateUpdateSerializer
# list_serializer_class = ListRoleSerializer
# retrieve_serializer_class = DetailRoleSerializer
filter_class = DictDataFilter
@ -33,27 +33,41 @@ class DictDetailsModelViewSet(CustomModelViewSet):
queryset = DictDetails.objects.all()
serializer_class = DictDetailsSerializer
create_serializer_class = DictDetailsCreateUpdateSerializer
# update_serializer_class = CreateUpdateRoleSerializer
# list_serializer_class = ListRoleSerializer
# retrieve_serializer_class = DetailRoleSerializer
update_serializer_class = DictDetailsCreateUpdateSerializer
filter_class = DictDetailsFilter
# update_extra_permission_classes = (IsManagerPermission,)
# destroy_extra_permission_classes = (IsManagerPermission,)
# create_extra_permission_classes = (IsManagerPermission,)
search_fields = ('name',)
ordering = 'sort' # 默认排序
def list(self, request: Request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
print(1,page)
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
if page is not None:
if getattr(self, 'values_queryset', None):
return self.get_paginated_response(page)
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
if getattr(self, 'values_queryset', None):
return SuccessResponse(page)
serializer = self.get_serializer(queryset, many=True)
return SuccessResponse(serializer.data)
class DictDetailsListModelViewSet(CustomModelViewSet):
"""
根据字典类型查询字典数据信息 模型的CRUD视图
"""
queryset = DictDetails.objects.filter(status=True)
serializer_class = DictDetailsSerializer
queryset = DictDetails.objects.filter(status=0)
serializer_class = DictDetailsListSerializer
filter_class = DictDetailsFilter
search_fields = ('name',)
ordering = 'create_datetime' # 默认排序
ordering = 'sort' # 默认排序
def list(self, request: Request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = self.queryset.filter(dict_data__dictType=kwargs.get('pk')).order_by('sort')
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
serializer = self.get_serializer(queryset, many=True)

View File

@ -3,7 +3,7 @@
# ************** mysql数据库 配置 ************** #
# ================================================= #
# 数据库类型 MYSQL/SQLITE3
DATABASE_TYPE = "SQLITE3"
DATABASE_TYPE = "MYSQL"
# 数据库地址
DATABASE_HOST = "127.0.0.1"
# 数据库端口

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询部门列表
export function listDept(query) {
return request({
url: '/system/dept/list',
url: '/permission/dept/',
method: 'get',
params: query
})
@ -12,7 +12,7 @@ export function listDept(query) {
// 查询部门列表(排除节点)
export function listDeptExcludeChild(deptId) {
return request({
url: '/system/dept/list/exclude/' + deptId,
url: '/permission/dept/exclude/' + deptId + '/',
method: 'get'
})
}
@ -20,7 +20,7 @@ export function listDeptExcludeChild(deptId) {
// 查询部门详细
export function getDept(deptId) {
return request({
url: '/system/dept/' + deptId,
url: '/permission/dept/' + deptId + '/',
method: 'get'
})
}
@ -28,7 +28,7 @@ export function getDept(deptId) {
// 查询部门下拉树结构
export function treeselect() {
return request({
url: '/system/dept/treeselect',
url: '/permission/dept/treeselect',
method: 'get'
})
}
@ -36,7 +36,7 @@ export function treeselect() {
// 根据角色ID查询部门树结构
export function roleDeptTreeselect(roleId) {
return request({
url: '/system/dept/roleDeptTreeselect/' + roleId,
url: '/permission/dept/roleDeptTreeselect/' + roleId,
method: 'get'
})
}
@ -44,7 +44,7 @@ export function roleDeptTreeselect(roleId) {
// 新增部门
export function addDept(data) {
return request({
url: '/system/dept',
url: '/permission/dept/',
method: 'post',
data: data
})
@ -53,7 +53,7 @@ export function addDept(data) {
// 修改部门
export function updateDept(data) {
return request({
url: '/system/dept',
url: '/permission/dept/' + data.id + '/',
method: 'put',
data: data
})
@ -62,7 +62,7 @@ export function updateDept(data) {
// 删除部门
export function delDept(deptId) {
return request({
url: '/system/dept/' + deptId,
url: '/permission/dept/' + deptId + '',
method: 'delete'
})
}
}

View File

@ -43,16 +43,21 @@
<el-table
v-loading="loading"
:data="deptList"
row-key="deptId"
row-key="id"
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
<el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
<el-table-column prop="status" label="状态" :formatter="statusFormat" width="100"></el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="200">
<el-table-column prop="status" label="状态" :formatter="statusFormat" width="200"></el-table-column>
<el-table-column label="更新时间" align="center" prop="update_datetime" width="200">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
<span>{{ parseTime(scope.row.update_datetime) }}</span>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="create_datetime" width="200">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.create_datetime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@ -165,7 +170,8 @@ export default {
//
queryParams: {
deptName: undefined,
status: undefined
status: undefined,
pageNum: 'all'
},
//
form: {},
@ -208,7 +214,7 @@ export default {
getList() {
this.loading = true;
listDept(this.queryParams).then(response => {
this.deptList = this.handleTree(response.data, "deptId");
this.deptList = this.handleTree(response.data, "id");
this.loading = false;
});
},
@ -218,7 +224,7 @@ export default {
delete node.children;
}
return {
id: node.deptId,
id: node.id,
label: node.deptName,
children: node.children
};
@ -235,7 +241,7 @@ export default {
//
reset() {
this.form = {
deptId: undefined,
id: undefined,
parentId: undefined,
deptName: undefined,
orderNum: undefined,
@ -259,31 +265,31 @@ export default {
handleAdd(row) {
this.reset();
if (row != undefined) {
this.form.parentId = row.deptId;
this.form.parentId = row.id;
}
this.open = true;
this.title = "添加部门";
listDept().then(response => {
this.deptOptions = this.handleTree(response.data, "deptId");
listDept({pageNum: 'all'}).then(response => {
this.deptOptions = this.handleTree(response.data, "id");
});
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
getDept(row.deptId).then(response => {
getDept(row.id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改部门";
});
listDeptExcludeChild(row.deptId).then(response => {
this.deptOptions = this.handleTree(response.data, "deptId");
listDeptExcludeChild(row.id).then(response => {
this.deptOptions = this.handleTree(response.data, "id");
});
},
/** 提交按钮 */
submitForm: function() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.deptId != undefined) {
if (this.form.id != undefined) {
updateDept(this.form).then(response => {
this.msgSuccess("修改成功");
this.open = false;
@ -306,7 +312,7 @@ export default {
cancelButtonText: "取消",
type: "warning"
}).then(function() {
return delDept(row.deptId);
return delDept(row.id);
}).then(() => {
this.getList();
this.msgSuccess("删除成功");