From 218036c0ea8b3df22e1913923088c66434eb67f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Sat, 22 Jun 2024 11:45:20 +0800 Subject: [PATCH 01/44] =?UTF-8?q?dvadmin3-build=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/main.py b/backend/main.py index 2408243c..c0419d99 100644 --- a/backend/main.py +++ b/backend/main.py @@ -9,5 +9,9 @@ from application.settings import LOGGING if __name__ == '__main__': multiprocessing.freeze_support() - uvicorn.run("application.asgi:application", reload=False, host="0.0.0.0", port=8000, workers=4, + workers = 4 + if os.sys.platform.startswith('win'): + # Windows操作系统 + workers = None + uvicorn.run("application.asgi:application", reload=False, host="0.0.0.0", port=8000, workers=workers, log_config=LOGGING) -- Gitee From 05f659bc87f798f458027034284d47c8412a2717 Mon Sep 17 00:00:00 2001 From: 1638245306 <1638245306@qq.com> Date: Sat, 22 Jun 2024 16:10:42 +0800 Subject: [PATCH 02/44] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/system/views/dept.py | 21 +++------------------ backend/dvadmin/system/views/menu_button.py | 2 +- backend/dvadmin/system/views/user.py | 3 +++ 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/backend/dvadmin/system/views/dept.py b/backend/dvadmin/system/views/dept.py index 5c5105b7..dfdbc82b 100644 --- a/backend/dvadmin/system/views/dept.py +++ b/backend/dvadmin/system/views/dept.py @@ -124,30 +124,15 @@ class DeptViewSet(CustomModelViewSet): data = serializer.data return SuccessResponse(data=data) - @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated], extra_filter_class=[]) + @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated]) def dept_lazy_tree(self, request, *args, **kwargs): parent = self.request.query_params.get('parent') is_superuser = request.user.is_superuser if is_superuser: queryset = Dept.objects.values('id', 'name', 'parent') else: - role_ids = request.user.role.values_list('id', flat=True) - data_range = RoleMenuButtonPermission.objects.filter(role__in=role_ids).values_list('data_range', flat=True) - user_dept_id = request.user.dept.id - dept_list = [user_dept_id] - data_range_list = list(set(data_range)) - for item in data_range_list: - if item in [0, 2]: - dept_list = [user_dept_id] - elif item == 1: - dept_list = Dept.recursion_all_dept(dept_id=user_dept_id) - elif item == 3: - dept_list = Dept.objects.values_list('id', flat=True) - elif item == 4: - dept_list = request.user.role.values_list('dept', flat=True) - else: - dept_list = [] - queryset = Dept.objects.filter(id__in=dept_list).values('id', 'name', 'parent') + queryset = Dept.objects.values('id', 'name', 'parent') + queryset = self.filter_queryset(queryset) return DetailResponse(data=queryset, msg="获取成功") @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated], extra_filter_class=[]) diff --git a/backend/dvadmin/system/views/menu_button.py b/backend/dvadmin/system/views/menu_button.py index f91839a8..f6cc411f 100644 --- a/backend/dvadmin/system/views/menu_button.py +++ b/backend/dvadmin/system/views/menu_button.py @@ -10,7 +10,7 @@ from django.db.models import F from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated -from dvadmin.system.models import MenuButton, RoleMenuButtonPermission +from dvadmin.system.models import MenuButton, RoleMenuButtonPermission, Menu from dvadmin.utils.json_response import DetailResponse, SuccessResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index c6c002e8..559bdf13 100644 --- a/backend/dvadmin/system/views/user.py +++ b/backend/dvadmin/system/views/user.py @@ -407,9 +407,12 @@ class UserViewSet(CustomModelViewSet): queryset = self.filter_queryset(self.get_queryset()) else: queryset = self.filter_queryset(self.get_queryset()) + print(queryset.values('id','name','dept__id')) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True, request=request) + print(serializer.data) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True, request=request) + return SuccessResponse(data=serializer.data, msg="获取成功") -- Gitee From 297c4df74f28453ea68a33838211aa70bb8a83d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Sat, 22 Jun 2024 21:20:19 +0800 Subject: [PATCH 03/44] logo.icns --- backend/static/logo.icns | Bin 0 -> 303433 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 backend/static/logo.icns diff --git a/backend/static/logo.icns b/backend/static/logo.icns new file mode 100644 index 0000000000000000000000000000000000000000..99572efcb34019f76a56baed454a7900e63505bf GIT binary patch literal 303433 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 Date: Sat, 22 Jun 2024 22:23:35 +0800 Subject: [PATCH 04/44] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1..优化部门管理相关接口; --- .../dvadmin/system/fixtures/init_menu.json | 10 +-- backend/dvadmin/system/views/dept.py | 12 +-- backend/dvadmin/system/views/user.py | 5 +- .../plugins/dvadmin_form_flow/install.js | 73 ------------------- .../plugins/dvadmin_form_flow/src/index.ts | 29 -------- web/src/views/system/user/index.vue | 1 - 6 files changed, 5 insertions(+), 125 deletions(-) delete mode 100644 web/src/views/plugins/dvadmin_form_flow/install.js delete mode 100644 web/src/views/plugins/dvadmin_form_flow/src/index.ts diff --git a/backend/dvadmin/system/fixtures/init_menu.json b/backend/dvadmin/system/fixtures/init_menu.json index 42588723..b683f0af 100644 --- a/backend/dvadmin/system/fixtures/init_menu.json +++ b/backend/dvadmin/system/fixtures/init_menu.json @@ -167,19 +167,13 @@ "method": 0 }, { - "name": "查询所有", + "name": "获取所有部门", "value": "dept:SearchAll", "api": "/api/system/dept/all_dept/", "method": 0 }, { - "name": "懒加载查询所有", - "value": "dept:LazySearchAll", - "api": "/api/system/dept/dept_lazy_tree/", - "method": 0 - }, - { - "name": "头信息", + "name": "部门顶部信息", "value": "dept:HeaderInfo", "api": "/api/system/dept/dept_info/", "method": 0 diff --git a/backend/dvadmin/system/views/dept.py b/backend/dvadmin/system/views/dept.py index dfdbc82b..de48b0db 100644 --- a/backend/dvadmin/system/views/dept.py +++ b/backend/dvadmin/system/views/dept.py @@ -10,6 +10,7 @@ from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated from dvadmin.system.models import Dept, RoleMenuButtonPermission, Users +from dvadmin.utils.filters import DataLevelPermissionsFilter from dvadmin.utils.json_response import DetailResponse, SuccessResponse, ErrorResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -125,17 +126,6 @@ class DeptViewSet(CustomModelViewSet): return SuccessResponse(data=data) @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated]) - def dept_lazy_tree(self, request, *args, **kwargs): - parent = self.request.query_params.get('parent') - is_superuser = request.user.is_superuser - if is_superuser: - queryset = Dept.objects.values('id', 'name', 'parent') - else: - queryset = Dept.objects.values('id', 'name', 'parent') - queryset = self.filter_queryset(queryset) - return DetailResponse(data=queryset, msg="获取成功") - - @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated], extra_filter_class=[]) def all_dept(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent') diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index 559bdf13..116d71f1 100644 --- a/backend/dvadmin/system/views/user.py +++ b/backend/dvadmin/system/views/user.py @@ -119,7 +119,6 @@ class UserUpdateSerializer(CustomModelSerializer): """ 更改激活状态 """ - print(111, value) if value: self.initial_data["login_error_count"] = 0 return value @@ -407,11 +406,11 @@ class UserViewSet(CustomModelViewSet): queryset = self.filter_queryset(self.get_queryset()) else: queryset = self.filter_queryset(self.get_queryset()) - print(queryset.values('id','name','dept__id')) + # print(queryset.values('id','name','dept__id')) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True, request=request) - print(serializer.data) + # print(serializer.data) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True, request=request) diff --git a/web/src/views/plugins/dvadmin_form_flow/install.js b/web/src/views/plugins/dvadmin_form_flow/install.js deleted file mode 100644 index 02154d40..00000000 --- a/web/src/views/plugins/dvadmin_form_flow/install.js +++ /dev/null @@ -1,73 +0,0 @@ -import axios from 'axios' - -import VFormDesigner from '@/components/form-designer/index.vue' -import VFormRender from '@/components/form-render/index.vue' - -import Draggable from '@/../lib/vuedraggable/dist/vuedraggable.umd.js' -import {registerIcon} from '@/utils/el-icons' -import 'virtual:svg-icons-register' -import '@/iconfont/iconfont.css' - -import ContainerWidgets from '@/components/form-designer/form-widget/container-widget/index' -import ContainerItems from '@/components/form-render/container-item/index' - -import { addDirective } from '@/utils/directive' -import { installI18n } from '@/utils/i18n' -import { loadExtension } from '@/extension/extension-loader' - - -VFormDesigner.install = function (app) { - addDirective(app) - installI18n(app) - loadExtension(app) - - app.use(ContainerWidgets) - app.use(ContainerItems) - - registerIcon(app) - app.component('draggable', Draggable) - app.component(VFormDesigner.name, VFormDesigner) -} - -VFormRender.install = function (app) { - installI18n(app) - loadExtension(app) - - app.use(ContainerItems) - - registerIcon(app) - app.component(VFormRender.name, VFormRender) -} - -const components = [ - VFormDesigner, - VFormRender -] - -const install = (app) => { - addDirective(app) - installI18n(app) - loadExtension(app) - - app.use(ContainerWidgets) - app.use(ContainerItems) - - registerIcon(app) - app.component('draggable', Draggable) - - components.forEach(component => { - app.component(component.name, component) - }) - - window.axios = axios -} - -if (typeof window !== 'undefined' && window.Vue) { /* scriptʽʱֵaxios */ - //window.axios = axios -} - -export default { - install, - VFormDesigner, - VFormRender -} diff --git a/web/src/views/plugins/dvadmin_form_flow/src/index.ts b/web/src/views/plugins/dvadmin_form_flow/src/index.ts deleted file mode 100644 index c57cc05a..00000000 --- a/web/src/views/plugins/dvadmin_form_flow/src/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -// -import DVAFormDesigner from './components/DVAFormDesigner.vue' - -// 浽һ -const components = [ - DVAFormDesigner -] - -// install -const install = function (Vue) { - - if (install.installed) return - install.installed = true - // бעȫ - components.map(component => { - Vue.component(component.name, component) //component.name ˴ʹõvueļе name - }) -} - -if (typeof window !== 'undefined' && window.Vue) { - install(window.Vue) -} - -export default { - // Ķ߱һ install - install, - // б - ...components -} diff --git a/web/src/views/system/user/index.vue b/web/src/views/system/user/index.vue index 4ea5033d..71085d1b 100644 --- a/web/src/views/system/user/index.vue +++ b/web/src/views/system/user/index.vue @@ -98,7 +98,6 @@ const getData = () => { const result = XEUtils.toArrayTree(responseData, { parentKey: 'parent', children: 'children', - strict: true, }); data.value = result; -- Gitee From 354d230c2a43d20462507a942827399a714c3f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Sat, 22 Jun 2024 22:53:59 +0800 Subject: [PATCH 05/44] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96:=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=AF=86=E7=A0=81=E5=90=8E=E5=BC=BA=E5=88=B6=E9=80=80?= =?UTF-8?q?=E5=87=BA=E7=99=BB=E5=BD=95=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/__init__.py | 1 + .../system/dept/components/DeptUserCom/api.ts | 14 +++++++------- .../system/dept/components/DeptUserCom/crud.tsx | 15 +++++++++++++-- web/src/views/system/user/api.ts | 2 +- web/src/views/system/user/crud.tsx | 11 +++++++++-- 5 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 backend/dvadmin/__init__.py diff --git a/backend/dvadmin/__init__.py b/backend/dvadmin/__init__.py new file mode 100644 index 00000000..40a96afc --- /dev/null +++ b/backend/dvadmin/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/web/src/views/system/dept/components/DeptUserCom/api.ts b/web/src/views/system/dept/components/DeptUserCom/api.ts index 28602c72..b395c39d 100644 --- a/web/src/views/system/dept/components/DeptUserCom/api.ts +++ b/web/src/views/system/dept/components/DeptUserCom/api.ts @@ -5,13 +5,13 @@ type GetListType = PageQuery & { show_all: string }; export const apiPrefix = '/api/system/user/'; -export function GetDept(query: PageQuery) { - return request({ - url: '/api/system/dept/dept_lazy_tree/', - method: 'get', - params: query, - }); -} +// export function GetDept(query: PageQuery) { +// return request({ +// url: '/api/system/dept/dept_all/', +// method: 'get', +// params: query, +// }); +// } export function GetList(query: GetListType) { return request({ diff --git a/web/src/views/system/dept/components/DeptUserCom/crud.tsx b/web/src/views/system/dept/components/DeptUserCom/crud.tsx index 8bb2b3cf..bcee5b09 100644 --- a/web/src/views/system/dept/components/DeptUserCom/crud.tsx +++ b/web/src/views/system/dept/components/DeptUserCom/crud.tsx @@ -220,7 +220,10 @@ export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOp label: 'name', }), column: { - minWidth: 150, //最小列宽 + minWidth: 200, //最小列宽 + formatter({value,row,index}){ + return row.dept_name_all + } }, form: { rules: [ @@ -259,7 +262,11 @@ export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOp label: 'name', }), column: { - minWidth: 100, //最小列宽 + minWidth: 200, //最小列宽 + formatter({value,row,index}){ + const values = row.role_info.map((item:any) => item.name); + return values.join(',') + } }, form: { rules: [ @@ -382,6 +389,10 @@ export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOp form: { show: false, }, + column:{ + width:150, + showOverflowTooltip: true, + } }, }, }, diff --git a/web/src/views/system/user/api.ts b/web/src/views/system/user/api.ts index 78a15ec9..02a2ac6e 100644 --- a/web/src/views/system/user/api.ts +++ b/web/src/views/system/user/api.ts @@ -5,7 +5,7 @@ export const apiPrefix = '/api/system/user/'; export function GetDept(query: PageQuery) { return request({ - url: "/api/system/dept/dept_lazy_tree/", + url: "/api/system/dept/all_dept/", method: 'get', params: query, }); diff --git a/web/src/views/system/user/crud.tsx b/web/src/views/system/user/crud.tsx index 72815251..dd24c406 100644 --- a/web/src/views/system/user/crud.tsx +++ b/web/src/views/system/user/crud.tsx @@ -218,7 +218,10 @@ export const createCrudOptions = function ({crudExpose}: CreateCrudOptionsProps) label: 'name' }), column: { - minWidth: 150, //最小列宽 + minWidth: 200, //最小列宽 + formatter({value,row,index}){ + return row.dept_name_all + } }, form: { rules: [ @@ -253,7 +256,11 @@ export const createCrudOptions = function ({crudExpose}: CreateCrudOptionsProps) label: 'name', }), column: { - minWidth: 100, //最小列宽 + minWidth: 200, //最小列宽 + formatter({value,row,index}){ + const values = row.role_info.map((item:any) => item.name); + return values.join(',') + } }, form: { rules: [ -- Gitee From 275d380fe0cc4c5521d60f14aa34cb385d064c96 Mon Sep 17 00:00:00 2001 From: acjzdpbb <103135538+acjzdpbb@users.noreply.github.com> Date: Sun, 23 Jun 2024 10:07:48 +0800 Subject: [PATCH 06/44] =?UTF-8?q?feat:=20=E5=9C=A8=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E6=A0=87=E5=87=86=E6=8A=BD=E8=B1=A1=E6=A8=A1=E5=9E=8B=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=B8=AD=E8=AE=BE=E7=BD=AE=E6=8F=92=E5=85=A5=E5=92=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A8=A1=E5=9E=8B=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/utils/models.py | 136 ++++++++++++++++++++++++++------ 1 file changed, 113 insertions(+), 23 deletions(-) diff --git a/backend/dvadmin/utils/models.py b/backend/dvadmin/utils/models.py index fb0c2ba7..7ed2f928 100644 --- a/backend/dvadmin/utils/models.py +++ b/backend/dvadmin/utils/models.py @@ -6,13 +6,14 @@ @Created on: 2021/5/31 031 22:08 @Remark: 公共基础model类 """ +from datetime import datetime from importlib import import_module +from application import settings from django.apps import apps -from django.db import models from django.conf import settings - -from application import settings +from django.db import models +from rest_framework.request import Request table_prefix = settings.TABLE_PREFIX # 数据库表名前缀 @@ -87,6 +88,111 @@ class CoreModel(models.Model): verbose_name = '核心模型' verbose_name_plural = verbose_name + def get_request_user(self, request: Request): + if getattr(request, "user", None): + return request.user + return None + + def get_request_user_id(self, request: Request): + if getattr(request, "user", None): + return getattr(request.user, "id", None) + return None + + def get_request_user_name(self, request: Request): + if getattr(request, "user", None): + return getattr(request.user, "name", None) + return None + + def get_request_user_username(self, request: Request): + if getattr(request, "user", None): + return getattr(request.user, "username", None) + return None + + def common_insert_data(self, request: Request): + data = { + 'create_datetime': datetime.now(), + 'creator': self.get_request_user(request) + } + return {**data, **self.common_update_data(request)} + + def common_update_data(self, request: Request): + return { + 'update_datetime': datetime.now(), + 'modifier': self.get_request_user_username(request) + } + + exclude_fields = [ + '_state', + 'pk', + 'id', + 'create_datetime', + 'update_datetime', + 'creator', + 'creator_id', + 'creator_pk', + 'creator_name', + 'modifier', + 'modifier_id', + 'modifier_pk', + 'modifier_name', + 'dept_belong_id', + ] + + def get_exclude_fields(self): + return self.exclude_fields + + def get_all_fields(self): + return self._meta.fields + + def get_all_fields_names(self): + return [field.name for field in self.get_all_fields()] + + def get_need_fields_names(self): + return [field.name for field in self.get_all_fields() if field.name not in self.exclude_fields] + + def to_data(self): + """将模型转化为字典(去除不包含字段)(注意与to_dict_data区分)。 + """ + res = {} + for field in self.get_need_fields_names(): + field_value = getattr(self, field) + res[field] = field_value.id if (issubclass(field_value.__class__, CoreModel)) else field_value + return res + + @property + def DATA(self): + return self.to_data() + + def to_dict_data(self): + """需要导出的字段(去除不包含字段)(注意与to_data区分) + """ + return {field: getattr(self, field) for field in self.get_need_fields_names()} + + @property + def DICT_DATA(self): + return self.to_dict_data() + + def insert(self, request): + """插入模型 + """ + assert self.pk is None, f'模型{self.__class__.__name__}还没有保存到数据中,不能手动指定ID' + validated_data = {**self.common_insert_data(request), **self.DICT_DATA} + return self.__class__._default_manager.create(**validated_data) + + def update(self, request, update_data: dict[str, any] = None): + """更新模型 + """ + assert isinstance(update_data, dict), 'update_data必须为字典' + validated_data = {**self.common_insert_data(request), **update_data} + for key, value in validated_data.items(): + # 不允许修改id,pk,uuid字段 + if key in ['id', 'pk', 'uuid']: + continue + if hasattr(self, key): + setattr(self, key, value) + self.save() + return self + def get_all_models_objects(model_name=None): """ @@ -97,16 +203,9 @@ def get_all_models_objects(model_name=None): if not settings.ALL_MODELS_OBJECTS: all_models = apps.get_models() for item in list(all_models): - table = { - "tableName": item._meta.verbose_name, - "table": item.__name__, - "tableFields": [] - } + table = {"tableName": item._meta.verbose_name, "table": item.__name__, "tableFields": []} for field in item._meta.fields: - fields = { - "title": field.verbose_name, - "field": field.name - } + fields = {"title": field.verbose_name, "field": field.name} table['tableFields'].append(fields) settings.ALL_MODELS_OBJECTS.setdefault(item.__name__, {"table": table, "object": item}) if model_name: @@ -125,17 +224,8 @@ def get_model_from_app(app_name): for model in filter_model: if model.__name__ == 'AbstractUser': continue - fields = [ - {'title': field.verbose_name, 'name': field.name, 'object': field} - for field in model._meta.fields - ] - model_list.append({ - 'app': app_name, - 'verbose': model._meta.verbose_name, - 'model': model.__name__, - 'object': model, - 'fields': fields - }) + fields = [{'title': field.verbose_name, 'name': field.name, 'object': field} for field in model._meta.fields] + model_list.append({'app': app_name, 'verbose': model._meta.verbose_name, 'model': model.__name__, 'object': model, 'fields': fields}) return model_list -- Gitee From 452bc0a63a822ef566eb31ea0f94a66d900f00df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Sun, 23 Jun 2024 10:54:40 +0800 Subject: [PATCH 07/44] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG:=20=E5=AD=90?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=8E=88=E6=9D=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/role_menu_button_permission.py | 37 +------------------ .../role/components/PermissionComNew/api.ts | 10 ++++- .../components/PermissionComNew/index.vue | 7 ++-- 3 files changed, 14 insertions(+), 40 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 604ebe24..d44fab2b 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -180,51 +180,16 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): :return: menu,btns,columns """ params = request.query_params - role = params.get('role', None) - if role is None: - return ErrorResponse(msg="未获取到角色信息") is_superuser = request.user.is_superuser if is_superuser: queryset = Menu.objects.filter(status=1, is_catalog=True).values('name', 'id').all() else: role_id = request.user.role.values_list('id', flat=True) - menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('id', flat=True) + menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('menu__id', flat=True) queryset = Menu.objects.filter(status=1, is_catalog=True, id__in=menu_list).values('name', 'id').all() serializer = RoleMenuSerializer(queryset, many=True, request=request) data = serializer.data return DetailResponse(data=data) - # data = [] - # if is_superuser: - # queryset = Menu.objects.filter(status=1, is_catalog=False).values('name', 'id').all() - # else: - # role_id = request.user.role.values_list('id', flat=True) - # menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('id', flat=True) - # queryset = Menu.objects.filter(status=1, is_catalog=False, id__in=menu_list).values('name', 'id') - # for item in queryset: - # parent_list = Menu.get_all_parent(item['id']) - # names = [d["name"] for d in parent_list] - # completeName = "/".join(names) - # isCheck = RoleMenuPermission.objects.filter( - # menu__id=item['id'], - # role__id=role, - # ).exists() - # mbCheck = RoleMenuButtonPermission.objects.filter( - # menu_button=OuterRef("pk"), - # role__id=role, - # ) - # btns = MenuButton.objects.filter( - # menu__id=item['id'], - # ).annotate(isCheck=Exists(mbCheck)).values('id', 'name', 'value', 'isCheck', - # data_range=F('menu_button_permission__data_range')) - # dicts = { - # 'name': completeName, - # 'id': item['id'], - # 'isCheck': isCheck, - # 'btns': btns, - # - # } - # data.append(dicts) - # return DetailResponse(data=data) @action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated]) def set_role_premission(self, request, pk): diff --git a/web/src/views/system/role/components/PermissionComNew/api.ts b/web/src/views/system/role/components/PermissionComNew/api.ts index be37ef5b..eee6d2a1 100644 --- a/web/src/views/system/role/components/PermissionComNew/api.ts +++ b/web/src/views/system/role/components/PermissionComNew/api.ts @@ -26,7 +26,15 @@ export function setRolePremission(roleId:any,data:object) { }) } -export function getDataPermissionRange() { +export function getDataPermissionRange(query:object) { + return request({ + url: '/api/system/role_menu_button_permission/data_scope/', + method: 'get', + params:query + }) +} + +export function getDataPermissionRangeAll() { return request({ url: '/api/system/role_menu_button_permission/data_scope/', method: 'get', diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 058f5fc2..7770b05b 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -124,7 +124,7 @@ watch( (val) => { drawerVisible.value = val; getMenuBtnPermission() - fetchData() + } ); const handleDrawerClose = () => { @@ -159,9 +159,9 @@ const getMenuBtnPermission = async () => { menuData.value = resMenu.data } -const fetchData = async () => { +const fetchData = async (btnId) => { try { - const resRange = await getDataPermissionRange(); + const resRange = await getDataPermissionRange({menu_button:btnId}); if (resRange?.code === 2000) { dataPermissionRange.value = resRange.data; } @@ -183,6 +183,7 @@ const handleSettingClick = (record: MenusType, btnId: number) => { menuCurrent.value = record; menuBtnCurrent.value = btnId; dialogVisible.value = true; + fetchData(btnId) }; const handleColumnChange = (val: boolean, record: MenusType, btnType: string) => { -- Gitee From b6c013dad751c0aaada1b7eab543fea513d09442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 24 Jun 2024 07:22:05 +0800 Subject: [PATCH 08/44] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=AE=A4=E8=AF=81=E5=A4=B1=E8=B4=A5=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/utils/service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/utils/service.ts b/web/src/utils/service.ts index 0dfe45aa..3775e266 100644 --- a/web/src/utils/service.ts +++ b/web/src/utils/service.ts @@ -82,7 +82,7 @@ function createService() { ElMessageBox.alert(dataAxios.msg, '提示', { confirmButtonText: 'OK', callback: (action: Action) => { - window.location.reload(); + // window.location.reload(); }, }); errorCreate(`${dataAxios.msg}: ${response.config.url}`); -- Gitee From d7edbde434e6b0c31d5af99d3b5be5dfbe4c0b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=BB=A7=E9=A3=8E?= <1914007838@qq.com> Date: Mon, 24 Jun 2024 22:35:17 +0800 Subject: [PATCH 09/44] =?UTF-8?q?[feat]=E5=A2=9E=E5=8A=A0=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E7=8E=AF=E5=A2=83=E4=B8=AD=E5=89=8D=E7=AB=AF=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=E5=90=8E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E8=87=AA=E5=8A=A8=E5=8D=87=E7=BA=A7=E4=B8=BA?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E5=89=8D=E7=AB=AF=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/.gitignore | 1 + web/src/router/index.ts | 3 +++ web/src/utils/loading.ts | 4 +++ web/src/utils/upgrade.ts | 54 ++++++++++++++++++++++++++++++++++++++++ web/vite.config.ts | 3 +++ 5 files changed, 65 insertions(+) create mode 100644 web/src/utils/upgrade.ts diff --git a/web/.gitignore b/web/.gitignore index aa1baf22..455b6136 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -21,3 +21,4 @@ pnpm-debug.log* *.njsproj *.sln *.sw? +public/version diff --git a/web/src/router/index.ts b/web/src/router/index.ts index 3f564eb2..53aa3d96 100644 --- a/web/src/router/index.ts +++ b/web/src/router/index.ts @@ -13,6 +13,7 @@ import {initBackEndControlRoutes, setRouters} from '/@/router/backEnd'; import {useFrontendMenuStore} from "/@/stores/frontendMenu"; import {useTagsViewRoutes} from "/@/stores/tagsViewRoutes"; import {toRaw} from "vue"; +import {checkVersion} from "/@/utils/upgrade"; /** * 1、前端控制路由时:isRequestRoutes 为 false,需要写 roles,需要走 setFilterRoute 方法。 @@ -95,6 +96,8 @@ export function formatTwoStageRoutes(arr: any) { // 路由加载前 router.beforeEach(async (to, from, next) => { + // 检查浏览器本地版本与线上版本是否一致,判断是否需要刷新页面进行更新 + await checkVersion() NProgress.configure({showSpinner: false}); if (to.meta.title) NProgress.start(); const token = Session.get('token'); diff --git a/web/src/utils/loading.ts b/web/src/utils/loading.ts index 5fd020c8..9dce4bd4 100644 --- a/web/src/utils/loading.ts +++ b/web/src/utils/loading.ts @@ -1,5 +1,7 @@ import { nextTick } from 'vue'; import '/@/theme/loading.scss'; +import { showUpgrade } from "/@/utils/upgrade"; + /** * 页面全局 Loading @@ -9,6 +11,8 @@ import '/@/theme/loading.scss'; export const NextLoading = { // 创建 loading start: () => { + // 显示升级提示 + showUpgrade() const bodys: Element = document.body; const div = document.createElement('div'); div.setAttribute('class', 'loading-next'); diff --git a/web/src/utils/upgrade.ts b/web/src/utils/upgrade.ts new file mode 100644 index 00000000..6ca9e679 --- /dev/null +++ b/web/src/utils/upgrade.ts @@ -0,0 +1,54 @@ +import axios from "axios"; +import * as process from "process"; +import {Local, Session} from '/@/utils/storage'; +import {ElNotification} from "element-plus"; +import fs from "fs"; + +// 是否显示升级提示信息框 +export const IS_SHOW_UPGRADE_SESSION_KEY = 'isShowUpgrade'; +const versionKey = 'DVADMIN3_VERSION' + +export function showUpgrade () { + const isShowUpgrade = Session.get(IS_SHOW_UPGRADE_SESSION_KEY) ?? false + if (isShowUpgrade) { + Session.remove(IS_SHOW_UPGRADE_SESSION_KEY) + ElNotification({ + title: '新版本升级', + message: "检测到系统新版本,正在更新中!不用担心,更新很快的哦!", + type: 'success', + duration: 5000, + }); + } +} + +// 生产环境前端版本校验, +export async function checkVersion(){ + if (process.env.NODE_ENV === 'development') { + // 开发环境无需校验前端版本 + return + } + // 获取线上版本号 t为时间戳,防止缓存 + await axios.get(`/version?t=${new Date().getTime()}`).then(res => { + const {status, data} = res || {} + if (status === 200) { + // 获取当前版本号 + const localVersion = Local.get(versionKey) + // 将当前版本号持久缓存至本地 + Local.set(versionKey, data) + // 当用户本地存在版本号并且和线上版本号不一致时,进行页面刷新操作 + if (localVersion && localVersion !== data) { + // 本地缓存版本号和线上版本号不一致,弹出升级提示框 + // 此处无法直接使用消息框进行提醒,因为 window.location.reload()会导致消息框消失,将在loading页面判断是否需要显示升级提示框 + Session.set(IS_SHOW_UPGRADE_SESSION_KEY, true) + window.location.reload() + + } + } + }) +} + +export function generateVersionFile (){ + // 生成版本文件到public目录下version文件中 + const version = `${process.env.npm_package_version}.${new Date().getTime()}`; + fs.writeFileSync('public/version', version); +} diff --git a/web/vite.config.ts b/web/vite.config.ts index c86cfc48..d91057f5 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -3,6 +3,7 @@ import { resolve } from 'path'; import { defineConfig, loadEnv, ConfigEnv } from 'vite'; import vueSetupExtend from 'vite-plugin-vue-setup-extend'; import vueJsx from '@vitejs/plugin-vue-jsx' +import { generateVersionFile } from "./src/utils/upgrade"; const pathResolve = (dir: string) => { return resolve(__dirname, '.', dir); @@ -17,6 +18,8 @@ const alias: Record = { const viteConfig = defineConfig((mode: ConfigEnv) => { const env = loadEnv(mode.mode, process.cwd()); + // 当Vite构建时,生成版本文件 + generateVersionFile() return { plugins: [vue(), vueJsx(), vueSetupExtend()], root: process.cwd(), -- Gitee From 0529c2747a6cb074db497889dfdbca99d5898eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=BB=A7=E9=A3=8E?= <1914007838@qq.com> Date: Tue, 25 Jun 2024 10:16:11 +0800 Subject: [PATCH 10/44] =?UTF-8?q?[fix]=E4=BC=98=E5=8C=96=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/.gitignore | 3 ++- web/src/utils/upgrade.ts | 13 +++++++------ web/vite.config.ts | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/web/.gitignore b/web/.gitignore index 455b6136..8cef9186 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -21,4 +21,5 @@ pnpm-debug.log* *.njsproj *.sln *.sw? -public/version +# 构建版本文件,无需上传git +public/version-build diff --git a/web/src/utils/upgrade.ts b/web/src/utils/upgrade.ts index 6ca9e679..a571863d 100644 --- a/web/src/utils/upgrade.ts +++ b/web/src/utils/upgrade.ts @@ -5,8 +5,9 @@ import {ElNotification} from "element-plus"; import fs from "fs"; // 是否显示升级提示信息框 -export const IS_SHOW_UPGRADE_SESSION_KEY = 'isShowUpgrade'; -const versionKey = 'DVADMIN3_VERSION' +const IS_SHOW_UPGRADE_SESSION_KEY = 'isShowUpgrade'; +const VERSION_KEY = 'DVADMIN3_VERSION' +const VERSION_FILE_NAME = 'version-build' export function showUpgrade () { const isShowUpgrade = Session.get(IS_SHOW_UPGRADE_SESSION_KEY) ?? false @@ -28,13 +29,13 @@ export async function checkVersion(){ return } // 获取线上版本号 t为时间戳,防止缓存 - await axios.get(`/version?t=${new Date().getTime()}`).then(res => { + await axios.get(`/${VERSION_FILE_NAME}?t=${new Date().getTime()}`).then(res => { const {status, data} = res || {} if (status === 200) { // 获取当前版本号 - const localVersion = Local.get(versionKey) + const localVersion = Local.get(VERSION_KEY) // 将当前版本号持久缓存至本地 - Local.set(versionKey, data) + Local.set(VERSION_KEY, data) // 当用户本地存在版本号并且和线上版本号不一致时,进行页面刷新操作 if (localVersion && localVersion !== data) { // 本地缓存版本号和线上版本号不一致,弹出升级提示框 @@ -50,5 +51,5 @@ export async function checkVersion(){ export function generateVersionFile (){ // 生成版本文件到public目录下version文件中 const version = `${process.env.npm_package_version}.${new Date().getTime()}`; - fs.writeFileSync('public/version', version); + fs.writeFileSync(`public/${VERSION_FILE_NAME}`, version); } diff --git a/web/vite.config.ts b/web/vite.config.ts index d91057f5..ed6dec25 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -3,7 +3,7 @@ import { resolve } from 'path'; import { defineConfig, loadEnv, ConfigEnv } from 'vite'; import vueSetupExtend from 'vite-plugin-vue-setup-extend'; import vueJsx from '@vitejs/plugin-vue-jsx' -import { generateVersionFile } from "./src/utils/upgrade"; +import { generateVersionFile } from "/@/utils/upgrade"; const pathResolve = (dir: string) => { return resolve(__dirname, '.', dir); -- Gitee From 38ad2db7a75250550e9972c481eede14ef8d4ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=BB=A7=E9=A3=8E?= <1914007838@qq.com> Date: Tue, 25 Jun 2024 10:17:36 +0800 Subject: [PATCH 11/44] =?UTF-8?q?[feat]=E5=A2=9E=E5=8A=A0nginx=E4=B8=8D?= =?UTF-8?q?=E7=BC=93=E5=AD=98index.html=E9=85=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E6=90=AD=E9=85=8D=E5=89=8D=E7=AB=AF=E7=89=88=E6=9C=AC=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8D=87=E7=BA=A7=E5=8A=9F=E8=83=BD=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=EF=BC=88=E4=B8=8D=E5=8A=A0=E6=AD=A4=E9=85=8D=E7=BD=AE=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=BC=9A=E5=AF=BC=E8=87=B4=E7=94=A8=E6=88=B7=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E5=90=8E=E8=BF=98=E6=98=AF=E6=97=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker_env/nginx/my-80.conf | 4 ++++ docker_env/nginx/my.conf | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docker_env/nginx/my-80.conf b/docker_env/nginx/my-80.conf index e50bdc46..98d33bd9 100644 --- a/docker_env/nginx/my-80.conf +++ b/docker_env/nginx/my-80.conf @@ -7,6 +7,10 @@ server { index index.html index.htm; root /usr/share/nginx/html; try_files $uri $uri/ /index.html; + # 禁止缓存html文件,避免前端页面不及时更新,需要用户手动刷新的情况 + if ($request_uri ~* "^/$|^/index.html|^/index.htm") { + add_header Cache-Control "no-store"; + } } location ~ ^/api/ { diff --git a/docker_env/nginx/my.conf b/docker_env/nginx/my.conf index 178d9793..dd6b3337 100644 --- a/docker_env/nginx/my.conf +++ b/docker_env/nginx/my.conf @@ -11,6 +11,10 @@ server { real_ip_header X-Forwarded-For; root /usr/share/nginx/html; index index.html index.php index.htm; + # 禁止缓存html文件,避免前端页面不及时更新,需要用户手动刷新的情况 + if ($request_uri ~* "^/$|^/index.html|^/index.htm") { + add_header Cache-Control "no-store"; + } } location /api/ { -- Gitee From 5b60f60b7053b451b8c8152657de5d6394d53108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=BB=A7=E9=A3=8E?= <1914007838@qq.com> Date: Tue, 25 Jun 2024 23:53:54 +0800 Subject: [PATCH 12/44] =?UTF-8?q?[fix]=E6=9B=B4=E6=96=B0django-cors-header?= =?UTF-8?q?s=E7=89=88=E6=9C=AC=E8=87=B34.4.0,=20=E7=8E=B0=E5=9C=A84.3.0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84CorsMiddleware=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6=E4=BC=9A=E5=AF=BC=E8=87=B4SessionMiddleware=E4=B8=AD?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=AE=BE=E7=BD=AEsession?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 6309e7c1..2e7c6cb6 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,6 +1,6 @@ Django==4.2.7 django-comment-migrate==0.1.7 -django-cors-headers==4.3.0 +django-cors-headers==4.4.0 django-filter==23.3 django-ranged-response==0.2.0 djangorestframework==3.14.0 -- Gitee From 259c51b23cefd07a41bca1652a00c45db42f5bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=BB=A7=E9=A3=8E?= <1914007838@qq.com> Date: Wed, 26 Jun 2024 00:00:14 +0800 Subject: [PATCH 13/44] =?UTF-8?q?[fix]=E6=9B=B4=E6=96=B0django-cors-header?= =?UTF-8?q?s=E7=89=88=E6=9C=AC=E8=87=B34.4.0,=20=E7=8E=B0=E5=9C=A84.3.0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84CorsMiddleware=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6=E4=BC=9A=E5=AF=BC=E8=87=B4SessionMiddleware=E4=B8=AD?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=AE=BE=E7=BD=AEsession?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 6309e7c1..2e7c6cb6 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,6 +1,6 @@ Django==4.2.7 django-comment-migrate==0.1.7 -django-cors-headers==4.3.0 +django-cors-headers==4.4.0 django-filter==23.3 django-ranged-response==0.2.0 djangorestframework==3.14.0 -- Gitee From 7234d2b3e90041c953c823607a4645c35052e2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Wed, 26 Jun 2024 05:53:20 +0000 Subject: [PATCH 14/44] update docker_env/django/Dockerfile. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- docker_env/django/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker_env/django/Dockerfile b/docker_env/django/Dockerfile index 427ed0c8..cad6fed5 100644 --- a/docker_env/django/Dockerfile +++ b/docker_env/django/Dockerfile @@ -6,4 +6,4 @@ RUN awk 'BEGIN { cmd="cp -i ./conf/env.example.py ./conf/env.py "; print "n" | RUN sed -i "s|DATABASE_HOST = '127.0.0.1'|DATABASE_HOST = '177.10.0.1'|g" ./conf/env.py RUN sed -i "s|REDIS_HOST = '127.0.0.1'|REDIS_HOST = '177.10.0.1'|g" ./conf/env.py RUN python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt -CMD ["/backend/docker_start.sh"] +CMD ["sh","docker_start.sh"] -- Gitee From b6a4be25f2aee186188bd782beb0e1937830d0b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8C=97=E9=A3=8E=E5=8D=97=E9=87=8C?= Date: Wed, 26 Jun 2024 09:04:54 +0000 Subject: [PATCH 15/44] =?UTF-8?q?=E6=B7=BB=E5=8A=A0copy=EF=BC=8CImport?= =?UTF-8?q?=E5=8F=8AImport=E6=8C=89=E9=92=AE=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E7=9A=84URL=E5=9C=B0=E5=9D=80=E4=B8=BAmenu?= =?UTF-8?q?=5Fobj.component=5Fname=20=E5=8E=9F=E6=9D=A5URL=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E6=98=AF=E6=8B=BC=E6=8E=A5=E5=89=8D=E7=AB=AF=E7=9A=84?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E5=9C=B0=E5=9D=80=EF=BC=8C=E8=BF=99=E4=B8=8E?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E5=90=8E=E7=AB=AF=E5=9C=B0=E5=9D=80=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 北风南里 --- backend/dvadmin/system/views/menu_button.py | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/dvadmin/system/views/menu_button.py b/backend/dvadmin/system/views/menu_button.py index f6cc411f..6ad1a0c0 100644 --- a/backend/dvadmin/system/views/menu_button.py +++ b/backend/dvadmin/system/views/menu_button.py @@ -16,6 +16,8 @@ from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet + + class MenuButtonSerializer(CustomModelSerializer): """ 菜单按钮-序列化器 @@ -92,17 +94,15 @@ class MenuButtonViewSet(CustomModelViewSet): """ menu_obj = Menu.objects.filter(id=request.data['menu']).first() result_list = [ - {'menu': menu_obj.id, 'name': '新增', 'value': f'{menu_obj.component_name}:Create', 'api': f'/api{menu_obj.web_path}/', - 'method': 1}, - {'menu': menu_obj.id, 'name': '删除', 'value': f'{menu_obj.component_name}:Delete', 'api': f'/api{menu_obj.web_path}/{{id}}/', - 'method': 3}, - {'menu': menu_obj.id, 'name': '修改', 'value': f'{menu_obj.component_name}:Update', 'api': f'/api{menu_obj.web_path}/{{id}}/', - 'method': 2}, - {'menu': menu_obj.id, 'name': '查询', 'value': f'{menu_obj.component_name}:Search', 'api': f'/api{menu_obj.web_path}/', - 'method': 0}, - {'menu': menu_obj.id, 'name': '详情', 'value': f'{menu_obj.component_name}:Retrieve', 'api': f'/api{menu_obj.web_path}/{{id}}/', - 'method': 0}] + {'menu': menu_obj.id, 'name': '新增', 'value': f'{menu_obj.component_name}:Create', 'api': f'/api{menu_obj.component_name}/', 'method': 1}, + {'menu': menu_obj.id, 'name': '删除', 'value': f'{menu_obj.component_name}:Delete', 'api': f'/api{menu_obj.component_name}/{{id}}/', 'method': 3}, + {'menu': menu_obj.id, 'name': '编辑', 'value': f'{menu_obj.component_name}:Update', 'api': f'/api{menu_obj.component_name}/{{id}}/', 'method': 2}, + {'menu': menu_obj.id, 'name': '查询', 'value': f'{menu_obj.component_name}:Search', 'api': f'/api{menu_obj.component_name}/', 'method': 0}, + {'menu': menu_obj.id, 'name': '详情', 'value': f'{menu_obj.component_name}:Retrieve', 'api': f'/api{menu_obj.component_name}/{{id}}/', 'method': 0}, + {'menu': menu_obj.id, 'name': '复制', 'value': f'{menu_obj.component_name}:Copy', 'api': f'/api{menu_obj.component_name}/', 'method': 1}, + {'menu': menu_obj.id, 'name': '导入', 'value': f'{menu_obj.component_name}:Import', 'api': f'/api{menu_obj.component_name}/import_data/', 'method': 1}, + {'menu': menu_obj.id, 'name': '导出', 'value': f'{menu_obj.component_name}:Import', 'api': f'/api{menu_obj.component_name}/export_data/', 'method': 1},] serializer = self.get_serializer(data=result_list, many=True) serializer.is_valid(raise_exception=True) serializer.save() - return SuccessResponse(serializer.data, msg="批量创建成功") + return SuccessResponse(serializer.data, msg="批量创建成功") \ No newline at end of file -- Gitee From 9383508a858b083a82a90ca4593423c823a5e324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A5=BD=E5=A5=87=E5=AE=9D=E5=AE=9D?= Date: Fri, 28 Jun 2024 10:13:11 +0800 Subject: [PATCH 16/44] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=82=AE=E7=AE=B1?= =?UTF-8?q?=E5=92=8C=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=99=BB=E5=BD=95=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/system/views/login.py | 12 ++++++++++-- web/public/version-build | 1 + web/src/i18n/pages/login/zh-cn.ts | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 web/public/version-build diff --git a/backend/dvadmin/system/views/login.py b/backend/dvadmin/system/views/login.py index e04743c6..f3adcb8b 100644 --- a/backend/dvadmin/system/views/login.py +++ b/backend/dvadmin/system/views/login.py @@ -4,6 +4,7 @@ from datetime import datetime, timedelta from captcha.views import CaptchaStore, captcha_image from django.contrib import auth from django.contrib.auth import login +from django.db.models import Q from django.shortcuts import redirect from django.utils.translation import gettext_lazy as _ from drf_yasg import openapi @@ -83,11 +84,18 @@ class LoginSerializer(TokenObtainPairSerializer): else: self.image_code and self.image_code.delete() raise CustomValidationError("图片验证码错误") - - user = Users.objects.get(username=attrs['username']) + try: + user = Users.objects.get( + Q(username=attrs['username']) | Q(email=attrs['username']) | Q(mobile=attrs['username'])) + except Users.DoesNotExist: + raise CustomValidationError("您登录的账号不存在") + except Users.MultipleObjectsReturned: + raise CustomValidationError("您登录的账号存在多个,请联系管理员检查登录账号唯一性") if not user.is_active: raise CustomValidationError("账号已被锁定,联系管理员解锁") try: + # 必须重置用户名为username,否则使用邮箱手机号登录会提示密码错误 + attrs['username'] = user.username data = super().validate(attrs) data["name"] = self.user.name data["userId"] = self.user.id diff --git a/web/public/version-build b/web/public/version-build new file mode 100644 index 00000000..f6571be6 --- /dev/null +++ b/web/public/version-build @@ -0,0 +1 @@ +3.0.3.1719538291017 \ No newline at end of file diff --git a/web/src/i18n/pages/login/zh-cn.ts b/web/src/i18n/pages/login/zh-cn.ts index 6ab9813a..07fd82eb 100644 --- a/web/src/i18n/pages/login/zh-cn.ts +++ b/web/src/i18n/pages/login/zh-cn.ts @@ -9,7 +9,7 @@ export default { two4: '友情链接', }, account: { - accountPlaceholder1: '请输入登录账号', + accountPlaceholder1: '请输入登录账号/邮箱/手机号', accountPlaceholder2: '请输入登录密码', accountPlaceholder3: '请输入验证码', accountBtnText: '登 录', -- Gitee From 7a21f44eab58e50565d14172341fca7c6a69cb84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A5=BD=E5=A5=87=E5=AE=9D=E5=AE=9D?= <11259906+haoqibb@user.noreply.gitee.com> Date: Fri, 28 Jun 2024 02:15:47 +0000 Subject: [PATCH 17/44] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20we?= =?UTF-8?q?b/public/version-build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/public/version-build | 1 - 1 file changed, 1 deletion(-) delete mode 100644 web/public/version-build diff --git a/web/public/version-build b/web/public/version-build deleted file mode 100644 index f6571be6..00000000 --- a/web/public/version-build +++ /dev/null @@ -1 +0,0 @@ -3.0.3.1719538291017 \ No newline at end of file -- Gitee From 5cb7ec500c9b9a641d306866142b2de381a7bc97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A5=BD=E5=A5=87=E5=AE=9D=E5=AE=9D?= <11259906+haoqibb@user.noreply.gitee.com> Date: Fri, 28 Jun 2024 02:18:39 +0000 Subject: [PATCH 18/44] =?UTF-8?q?update=20backend/dvadmin/system/views/log?= =?UTF-8?q?in.py.=20=E4=BF=AE=E5=A4=8D=E7=99=BB=E5=BD=95=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=E5=86=99=E5=85=A5=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 好奇宝宝 <11259906+haoqibb@user.noreply.gitee.com> --- backend/dvadmin/system/views/login.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/dvadmin/system/views/login.py b/backend/dvadmin/system/views/login.py index e04743c6..165cf552 100644 --- a/backend/dvadmin/system/views/login.py +++ b/backend/dvadmin/system/views/login.py @@ -114,8 +114,8 @@ class LoginSerializer(TokenObtainPairSerializer): user.login_error_count += 1 if user.login_error_count >= 5: user.is_active = False + user.save() raise CustomValidationError("账号已被锁定,联系管理员解锁") - user.save() count = 5 - user.login_error_count raise CustomValidationError(f"账号/密码错误;重试{count}次后将被锁定~") -- Gitee From 82d0b19bc2e1c0fad557b20120c5b382a54a621c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Fri, 28 Jun 2024 11:20:19 +0800 Subject: [PATCH 19/44] =?UTF-8?q?1.=E6=9B=B4=E6=96=B0=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=9A=84=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/role_menu_button_permission.py | 93 ++++++++++++++++--- .../role/components/PermissionComNew/api.ts | 8 +- .../components/PermissionComNew/index.vue | 10 +- 3 files changed, 89 insertions(+), 22 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index d44fab2b..e9e0852d 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -6,9 +6,11 @@ @Created on: 2021/6/3 003 0:30 @Remark: 菜单按钮管理 """ -from django.db.models import F, Subquery, OuterRef, Exists +from django.db.models import F, Subquery, OuterRef, Exists, BooleanField, Q, Case, Value, When +from django.db.models.functions import Coalesce from rest_framework import serializers from rest_framework.decorators import action +from rest_framework.fields import ListField from rest_framework.permissions import IsAuthenticated from dvadmin.system.models import RoleMenuButtonPermission, Menu, MenuButton, Dept, RoleMenuPermission, FieldPermission, \ @@ -172,24 +174,87 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): update_serializer_class = RoleMenuButtonPermissionCreateUpdateSerializer extra_filter_class = [] + # @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) + # def get_role_premission(self, request): + # """ + # 角色授权获取: + # :param request: role + # :return: menu,btns,columns + # """ + # params = request.query_params + # is_superuser = request.user.is_superuser + # if is_superuser: + # queryset = Menu.objects.filter(status=1, is_catalog=True).values('name', 'id').all() + # else: + # role_id = request.user.role.values_list('id', flat=True) + # menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('menu__id', flat=True) + # queryset = Menu.objects.filter(status=1, is_catalog=True, id__in=menu_list).values('name', 'id').all() + # serializer = RoleMenuSerializer(queryset, many=True, request=request) + # data = serializer.data + # return DetailResponse(data=data) + @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) - def get_role_premission(self, request): - """ - 角色授权获取: - :param request: role - :return: menu,btns,columns - """ + def get_role_permission(self, request): params = request.query_params + # 需要授权的角色信息 + current_role = params.get('role', None) + if current_role is None: + return ErrorResponse(msg='参数错误') is_superuser = request.user.is_superuser if is_superuser: - queryset = Menu.objects.filter(status=1, is_catalog=True).values('name', 'id').all() + menu_queryset = Menu.objects.prefetch_related('menuPermission').prefetch_related( + 'menufield_set') else: - role_id = request.user.role.values_list('id', flat=True) - menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('menu__id', flat=True) - queryset = Menu.objects.filter(status=1, is_catalog=True, id__in=menu_list).values('name', 'id').all() - serializer = RoleMenuSerializer(queryset, many=True, request=request) - data = serializer.data - return DetailResponse(data=data) + role_id_list = request.user.role.values_list('id', flat=True) + menu_list = RoleMenuPermission.objects.filter(role__in=role_id_list).values_list('menu__id', flat=True) + + # 当前角色已授权的菜单 + menu_queryset = Menu.objects.filter(id__in=menu_list).prefetch_related('menuPermission').prefetch_related('menufield_set') + result = [] + for menu_item in menu_queryset: + isCheck = RoleMenuPermission.objects.filter( + menu_id=menu_item.id, + role_id=current_role + ).exists() + dicts = { + 'name': menu_item.name, + 'id': menu_item.id, + 'parent': menu_item.parent.id if menu_item.parent else None, + 'isCheck':isCheck, + 'btns': [], + 'columns': [] + } + for mb_item in menu_item.menuPermission.all(): + rolemenubuttonpermission_queryset =RoleMenuButtonPermission.objects.filter( + menu_button_id=mb_item.id, + role_id=current_role + ).first() + dicts['btns'].append( + { + 'id': mb_item.id, + 'name': mb_item.name, + 'value': mb_item.value, + 'data_range': rolemenubuttonpermission_queryset.data_range + if rolemenubuttonpermission_queryset + else None, + 'isCheck': bool(rolemenubuttonpermission_queryset), + } + ) + for column_item in menu_item.menufield_set.all(): + fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first() + dicts['columns'].append({ + 'id':column_item.id, + 'field_name':column_item.field_name, + 'title':column_item.title, + 'is_query':fieldpermission_queryset.is_query, + 'is_create':fieldpermission_queryset.is_create, + 'is_update':fieldpermission_queryset.is_update + }) + result.append(dicts) + return DetailResponse(data=result) + + + @action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated]) def set_role_premission(self, request, pk): diff --git a/web/src/views/system/role/components/PermissionComNew/api.ts b/web/src/views/system/role/components/PermissionComNew/api.ts index eee6d2a1..dde42b8c 100644 --- a/web/src/views/system/role/components/PermissionComNew/api.ts +++ b/web/src/views/system/role/components/PermissionComNew/api.ts @@ -1,15 +1,17 @@ import { request } from "/@/utils/service"; - +import XEUtils from "xe-utils"; /** * 获取角色的授权列表 * @param roleId * @param query */ -export function getRolePremission(query:object) { +export function getRolePermission(query:object) { return request({ - url: '/api/system/role_menu_button_permission/get_role_premission/', + url: '/api/system/role_menu_button_permission/get_role_permission/', method: 'get', params:query + }).then((res:any)=>{ + return XEUtils.toArrayTree(res.data, {key: 'id', parentKey: 'parent',children: 'children',strict: false}) }) } diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 7770b05b..6c211414 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -20,7 +20,7 @@ - + 页面显示权限
@@ -95,9 +95,9 @@ import { errorNotification } from '/@/utils/message'; import { getDataPermissionRange, getDataPermissionDept, - getRolePremission, + getRolePermission, setRolePremission, - setBtnDatarange + setBtnDatarange, } from './api'; import { MenuDataType, MenusType, DataPermissionRangeType, CustomDataPermissionDeptType } from './types'; import { ElMessage } from 'element-plus' @@ -155,8 +155,8 @@ let dataPermission = ref(); let customDataPermission = ref([]); //获取菜单,按钮,权限 const getMenuBtnPermission = async () => { - const resMenu = await getRolePremission({ role: props.roleId }) - menuData.value = resMenu.data + const resMenu = await getRolePermission({ role: props.roleId }) + menuData.value = resMenu } const fetchData = async (btnId) => { -- Gitee From 087d478094ed745b7fa631d6603b352ec46eadce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 28 Jun 2024 15:19:57 +0800 Subject: [PATCH 20/44] =?UTF-8?q?feat(role=5Fper=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复首次打开权限配置,按钮小齿轮数据权限不显示bug 2、优化自定义数据权限:在input里面显示当前配置用户已有的权限 3、优化自定义数据权限:在树形选择器中,禁用掉当前登录用户没有权限的部门 --- .../views/role_menu_button_permission.py | 142 ++++++------------ .../views/system/login/component/account.vue | 4 +- .../role/components/PermissionComNew/api.ts | 5 +- .../components/PermissionComNew/index.vue | 22 ++- 4 files changed, 70 insertions(+), 103 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index d44fab2b..4c933f4b 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -256,86 +256,45 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): is_superuser = request.user.is_superuser if is_superuser: data = [ - { - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 1, - "label": '本部门及以下数据权限' - }, - { - "value": 2, - "label": '本部门数据权限' - }, - { - "value": 3, - "label": '全部数据权限' - }, - { - "value": 4, - "label": '自定义数据权限' - } + {"value": 0, "label": '仅本人数据权限'}, + {"value": 1, "label": '本部门及以下数据权限'}, + {"value": 2, "label": '本部门数据权限'}, + {"value": 3, "label": '全部数据权限'}, + {"value": 4, "label": '自定义数据权限'} ] return DetailResponse(data=data) else: - data = [] + params = request.query_params + data = [{"value": 0, "label": '仅本人数据权限'}] role_list = request.user.role.values_list('id', flat=True) - if params := request.query_params: - if menu_button_id := params.get('menu_button', None): - role_queryset = RoleMenuButtonPermission.objects.filter( - role__in=role_list, menu_button__id=menu_button_id - ).values_list('data_range', flat=True) - data_range_list = list(set(role_queryset)) - for item in data_range_list: - if item == 0: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }] - elif item == 1: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, { - "value": 1, - "label": '本部门及以下数据权限' - }, - { - "value": 2, - "label": '本部门数据权限' - }] - elif item == 2: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 2, - "label": '本部门数据权限' - }] - elif item == 3: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 3, - "label": '全部数据权限' - }, ] - elif item == 4: - data = [{ - "value": 0, - "label": '仅本人数据权限' - }, - { - "value": 4, - "label": '自定义数据权限' - }] - else: - data = [] - return DetailResponse(data=data) - return ErrorResponse(msg="参数错误") + # 权限页面进入初始化获取所有的数据权限范围 + role_queryset = RoleMenuButtonPermission.objects.filter( + role__in=role_list + ).values_list('data_range', flat=True) + # 通过按钮小齿轮获取指定按钮的权限 + if menu_button_id := params.get('menu_button', None): + role_queryset = RoleMenuButtonPermission.objects.filter( + role__in=role_list, menu_button__id=menu_button_id + ).values_list('data_range', flat=True) + + data_range_list = list(set(role_queryset)) + for item in data_range_list: + if item == 0: + data = data + elif item == 1: + data.extend([ + {"value": 1, "label": '本部门及以下数据权限'}, + {"value": 2, "label": '本部门数据权限'} + ]) + elif item == 2: + data.extend([{"value": 2, "label": '本部门数据权限'}]) + elif item == 3: + data.extend([{"value": 3, "label": '全部数据权限'}]) + elif item == 4: + data.extend([{"value": 4, "label": '自定义数据权限'}]) + else: + data = [] + return DetailResponse(data=data) @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def role_to_dept_all(self, request): @@ -344,23 +303,22 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): :param request: :return: """ - params = request.query_params is_superuser = request.user.is_superuser - if is_superuser: - queryset = Dept.objects.values('id', 'name', 'parent') - else: - if not params: - return ErrorResponse(msg="参数错误") - menu_button = params.get('menu_button') - if menu_button is None: - return ErrorResponse(msg="参数错误") - role_list = request.user.role.values_list('id', flat=True) - queryset = RoleMenuButtonPermission.objects.filter(role__in=role_list, menu_button=None).values( - dept_id=F('dept__id'), - name=F('dept__name'), - parent=F('dept__parent') - ) - return DetailResponse(data=queryset) + params = request.query_params + role_id = params.get('role') + menu_button_id = params.get('menu_button') + dept_checked = RoleMenuButtonPermission.objects.filter( + role_id=role_id, menu_button_id=menu_button_id + ).values_list('dept', flat=True) + dept_list = Dept.objects.values('id', 'name', 'parent') + data = { + 'depts': [], + 'dept_checked': dept_checked + } + for dept in dept_list: + dept["disabled"] = not (is_superuser | dept["id"] in dept_checked) + data['depts'].append(dept) + return DetailResponse(data=data) @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def menu_to_button(self, request): diff --git a/web/src/views/system/login/component/account.vue b/web/src/views/system/login/component/account.vue index ee4e64fa..def80eb7 100644 --- a/web/src/views/system/login/component/account.vue +++ b/web/src/views/system/login/component/account.vue @@ -80,8 +80,8 @@ export default defineComponent({ const state = reactive({ isShowPassword: false, ruleForm: { - username: '', - password: '', + username: 'superadmin', + password: 'admin123456', captcha: '', captchaKey: '', captchaImgBase: '', diff --git a/web/src/views/system/role/components/PermissionComNew/api.ts b/web/src/views/system/role/components/PermissionComNew/api.ts index eee6d2a1..68793c06 100644 --- a/web/src/views/system/role/components/PermissionComNew/api.ts +++ b/web/src/views/system/role/components/PermissionComNew/api.ts @@ -40,10 +40,11 @@ export function getDataPermissionRangeAll() { method: 'get', }) } -export function getDataPermissionDept() { +export function getDataPermissionDept(query:object) { return request({ url: '/api/system/role_menu_button_permission/role_to_dept_all/', - method: 'get' + method: 'get', + params:query }) } diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 7770b05b..3babb8e4 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -124,6 +124,7 @@ watch( (val) => { drawerVisible.value = val; getMenuBtnPermission() + getDataPermissionRangeLable() } ); @@ -144,9 +145,10 @@ let menuCurrent = ref>({}); let menuBtnCurrent = ref(-1); let dialogVisible = ref(false); let dataPermissionRange = ref([]); +let dataPermissionRangeLabel = ref([]); const formatDataRange = computed(() => { return function (datarange: number) { - const findItem = dataPermissionRange.value.find((i) => i.value === datarange); + const findItem = dataPermissionRangeLabel.value.find((i) => i.value === datarange); return findItem?.label || '' } }) @@ -158,6 +160,11 @@ const getMenuBtnPermission = async () => { const resMenu = await getRolePremission({ role: props.roleId }) menuData.value = resMenu.data } +// 获取按钮的数据权限下拉选项 +const getDataPermissionRangeLable = async () => { + const resRange = await getDataPermissionRange({ role: props.roleId }) + dataPermissionRangeLabel.value = resRange.data; +} const fetchData = async (btnId) => { try { @@ -170,9 +177,9 @@ const fetchData = async (btnId) => { } }; -const handleCollapseChange = (val: number) => { - collapseCurrent.value = [val]; -}; +// const handleCollapseChange = (val: number) => { +// collapseCurrent.value = [val]; +// }; /** * 设置按钮数据权限 @@ -194,9 +201,10 @@ const handleColumnChange = (val: boolean, record: MenusType, btnType: string) => const handlePermissionRangeChange = async (val: number) => { if (val === 4) { - const res = await getDataPermissionDept(); - const data = XEUtils.toArrayTree(res.data, { parentKey: 'parent', strict: false }); - deptData.value = data; + const res = await getDataPermissionDept({ role: props.roleId,menu_button:menuBtnCurrent.value }); + const depts = XEUtils.toArrayTree(res.data.depts, { parentKey: 'parent', strict: false }); + deptData.value = depts; + customDataPermission.value = res.data.dept_checked; } }; -- Gitee From 1b8a502d6695fc121f07c89c491b6786e195ea4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 28 Jun 2024 15:36:38 +0800 Subject: [PATCH 21/44] =?UTF-8?q?fix(role=5Fper=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复第一次选择自定义数据权限无法设置的bug --- backend/dvadmin/system/views/role_menu_button_permission.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 4c933f4b..a3e85001 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -313,10 +313,11 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): dept_list = Dept.objects.values('id', 'name', 'parent') data = { 'depts': [], - 'dept_checked': dept_checked + 'dept_checked': [] if dept_checked.exists() else dept_checked } + for dept in dept_list: - dept["disabled"] = not (is_superuser | dept["id"] in dept_checked) + dept["disabled"] = False if is_superuser else dept["id"] not in dept_checked data['depts'].append(dept) return DetailResponse(data=data) -- Gitee From 0779cc1a842a071736996f74a356bfe2bec09a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 28 Jun 2024 15:46:44 +0800 Subject: [PATCH 22/44] =?UTF-8?q?fix(role=5Fper=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复第一次选择自定义数据权限无法设置的bug --- .../dvadmin/system/views/role_menu_button_permission.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 4c933f4b..b53c31df 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -307,16 +307,17 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): params = request.query_params role_id = params.get('role') menu_button_id = params.get('menu_button') - dept_checked = RoleMenuButtonPermission.objects.filter( + dept_checked = RoleMenuButtonPermission.objects.get( role_id=role_id, menu_button_id=menu_button_id - ).values_list('dept', flat=True) + ).dept.all().values_list('id', flat=True) dept_list = Dept.objects.values('id', 'name', 'parent') data = { 'depts': [], - 'dept_checked': dept_checked + 'dept_checked': dept_checked if dept_checked.exists() else [] } + for dept in dept_list: - dept["disabled"] = not (is_superuser | dept["id"] in dept_checked) + dept["disabled"] = False if is_superuser else dept["id"] not in dept_checked data['depts'].append(dept) return DetailResponse(data=data) -- Gitee From 8c7e8aee9fa4b00450a7bc40272136dff2f5da1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 28 Jun 2024 16:22:16 +0800 Subject: [PATCH 23/44] =?UTF-8?q?feat(role=5Fper=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、点击权限小齿轮,自动带出默认值 --- .../role/components/PermissionComNew/index.vue | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 3babb8e4..29a8ab3f 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -29,7 +29,7 @@ :label="btn.value">
{{ btn.data_range !== null ? `${btn.name}(${formatDataRange(btn.data_range)})` : btn.name }} - + @@ -166,7 +166,7 @@ const getDataPermissionRangeLable = async () => { dataPermissionRangeLabel.value = resRange.data; } -const fetchData = async (btnId) => { +const fetchData = async (btnId:number) => { try { const resRange = await getDataPermissionRange({menu_button:btnId}); if (resRange?.code === 2000) { @@ -186,11 +186,13 @@ const fetchData = async (btnId) => { * @param record 当前菜单 * @param btnType 按钮类型 */ -const handleSettingClick = (record: MenusType, btnId: number) => { +const handleSettingClick = (record: MenusType, btn: MenusType['btns'][number]) => { menuCurrent.value = record; - menuBtnCurrent.value = btnId; + menuBtnCurrent.value = btn.id; dialogVisible.value = true; - fetchData(btnId) + dataPermission.value =btn.data_range; + handlePermissionRangeChange(btn.data_range) + fetchData( btn.id) }; const handleColumnChange = (val: boolean, record: MenusType, btnType: string) => { -- Gitee From 4a26e1476aaa99cb4c15df4a02346980491bd1ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Fri, 28 Jun 2024 21:06:24 +0800 Subject: [PATCH 24/44] =?UTF-8?q?feat:=20=E6=B8=85=E9=99=A4=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E8=B4=A6=E5=8F=B7=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/views/system/login/component/account.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/views/system/login/component/account.vue b/web/src/views/system/login/component/account.vue index def80eb7..ee4e64fa 100644 --- a/web/src/views/system/login/component/account.vue +++ b/web/src/views/system/login/component/account.vue @@ -80,8 +80,8 @@ export default defineComponent({ const state = reactive({ isShowPassword: false, ruleForm: { - username: 'superadmin', - password: 'admin123456', + username: '', + password: '', captcha: '', captchaKey: '', captchaImgBase: '', -- Gitee From c2b0c3f25baa8bf8d5ff7cd2e35350096e179f60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 28 Jun 2024 23:35:05 +0800 Subject: [PATCH 25/44] =?UTF-8?q?feat(role=5Fmenu=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复无法保存菜单授权bug - 列权限增加禁用状态的逻辑判断 --- .../views/role_menu_button_permission.py | 41 ++++++++++-------- .../components/PermissionComNew/index.vue | 39 +++++++++-------- .../role/components/PermissionComNew/types.ts | 43 ++++++++----------- 3 files changed, 62 insertions(+), 61 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 94012541..9ab1a95e 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -209,23 +209,24 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): menu_list = RoleMenuPermission.objects.filter(role__in=role_id_list).values_list('menu__id', flat=True) # 当前角色已授权的菜单 - menu_queryset = Menu.objects.filter(id__in=menu_list).prefetch_related('menuPermission').prefetch_related('menufield_set') + menu_queryset = Menu.objects.filter(id__in=menu_list).prefetch_related('menuPermission').prefetch_related( + 'menufield_set') result = [] for menu_item in menu_queryset: isCheck = RoleMenuPermission.objects.filter( - menu_id=menu_item.id, - role_id=current_role - ).exists() + menu_id=menu_item.id, + role_id=current_role + ).exists() dicts = { 'name': menu_item.name, 'id': menu_item.id, 'parent': menu_item.parent.id if menu_item.parent else None, - 'isCheck':isCheck, + 'isCheck': isCheck, 'btns': [], 'columns': [] } for mb_item in menu_item.menuPermission.all(): - rolemenubuttonpermission_queryset =RoleMenuButtonPermission.objects.filter( + rolemenubuttonpermission_queryset = RoleMenuButtonPermission.objects.filter( menu_button_id=mb_item.id, role_id=current_role ).first() @@ -240,22 +241,27 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): 'isCheck': bool(rolemenubuttonpermission_queryset), } ) + for column_item in menu_item.menufield_set.all(): fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first() + query = fieldpermission_queryset.is_query if fieldpermission_queryset else None + create = fieldpermission_queryset.is_create if fieldpermission_queryset else None + update = fieldpermission_queryset.is_update if fieldpermission_queryset else None dicts['columns'].append({ - 'id':column_item.id, - 'field_name':column_item.field_name, - 'title':column_item.title, - 'is_query':fieldpermission_queryset.is_query, - 'is_create':fieldpermission_queryset.is_create, - 'is_update':fieldpermission_queryset.is_update - }) + 'id': column_item.id, + 'field_name': column_item.field_name, + 'title': column_item.title, + 'is_query': query, + 'is_create': create, + 'is_update': update, + 'query_disabled': False if is_superuser else not query, + 'create_disabled': False if is_superuser else not create, + 'update_disabled': False if is_superuser else not update, + }) + print(dicts['columns']) result.append(dicts) return DetailResponse(data=result) - - - @action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated]) def set_role_premission(self, request, pk): """ @@ -268,7 +274,7 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): RoleMenuPermission.objects.filter(role=pk).delete() RoleMenuButtonPermission.objects.filter(role=pk).delete() for item in body: - for menu in item["menus"]: + for menu in item["children"]: if menu.get('isCheck'): menu_parent = Menu.get_all_parent(menu.get('id')) role_menu_permission_list = [] @@ -283,6 +289,7 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): data_range=data_range) instance.dept.set(btn.get('dept', [])) for col in menu.get('columns'): + print(col) FieldPermission.objects.update_or_create(role_id=pk, field_id=col.get('id'), defaults={ 'is_query': col.get('is_query'), diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 7c5f681d..c90c3f1f 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -20,7 +20,7 @@ - + 页面显示权限
@@ -55,7 +55,8 @@
  • {{ c_item.title }}
    - +
  • @@ -99,7 +100,7 @@ import { setRolePremission, setBtnDatarange, } from './api'; -import { MenuDataType, MenusType, DataPermissionRangeType, CustomDataPermissionDeptType } from './types'; +import { MenuDataType, DataPermissionRangeType, CustomDataPermissionDeptType } from './types'; import { ElMessage } from 'element-plus' const props = defineProps({ @@ -159,6 +160,7 @@ let customDataPermission = ref([]); const getMenuBtnPermission = async () => { const resMenu = await getRolePermission({ role: props.roleId }) menuData.value = resMenu + } // 获取按钮的数据权限下拉选项 const getDataPermissionRangeLable = async () => { @@ -166,9 +168,9 @@ const getDataPermissionRangeLable = async () => { dataPermissionRangeLabel.value = resRange.data; } -const fetchData = async (btnId:number) => { +const fetchData = async (btnId: number) => { try { - const resRange = await getDataPermissionRange({menu_button:btnId}); + const resRange = await getDataPermissionRange({ menu_button: btnId }); if (resRange?.code === 2000) { dataPermissionRange.value = resRange.data; } @@ -186,16 +188,16 @@ const fetchData = async (btnId:number) => { * @param record 当前菜单 * @param btnType 按钮类型 */ -const handleSettingClick = (record: MenusType, btn: MenusType['btns'][number]) => { +const handleSettingClick = (record: MenuDataType, btn: MenuDataType['btns'][number]) => { menuCurrent.value = record; menuBtnCurrent.value = btn.id; dialogVisible.value = true; - dataPermission.value =btn.data_range; + dataPermission.value = btn.data_range; handlePermissionRangeChange(btn.data_range) - fetchData( btn.id) + fetchData(btn.id) }; -const handleColumnChange = (val: boolean, record: MenusType, btnType: string) => { +const handleColumnChange = (val: boolean, record: MenuDataType, btnType: string) => { for (const iterator of record.columns) { iterator[btnType] = val; } @@ -203,8 +205,8 @@ const handleColumnChange = (val: boolean, record: MenusType, btnType: string) => const handlePermissionRangeChange = async (val: number) => { if (val === 4) { - const res = await getDataPermissionDept({ role: props.roleId,menu_button:menuBtnCurrent.value }); - const depts = XEUtils.toArrayTree(res.data.depts, { parentKey: 'parent', strict: false }); + const res = await getDataPermissionDept({ role: props.roleId, menu_button: menuBtnCurrent.value }); + const depts = XEUtils.toArrayTree(res.data.depts, { parentKey: 'parent', strict: false }); deptData.value = depts; customDataPermission.value = res.data.dept_checked; } @@ -218,10 +220,8 @@ const handleDialogConfirm = () => { errorNotification('请选择'); return; } - - //if (dataPermission.value !== 4) {} for (const item of menuData.value) { - for (const iterator of item.menus) { + for (const iterator of item.children) { if (iterator.id === menuCurrent.value.id) { for (const btn of iterator.btns) { if (btn.id === menuBtnCurrent.value) { @@ -243,7 +243,7 @@ const handleDialogClose = () => { dataPermission.value = null; }; -//保存权限 +//保存菜单授权 const handleSavePermission = () => { setRolePremission(props.roleId, menuData.value).then((res: any) => { ElMessage({ @@ -254,10 +254,11 @@ const handleSavePermission = () => { } const column = reactive({ - header: [{ value: 'is_create', label: '新增可见' }, { value: 'is_update', label: '编辑可见' }, { - value: 'is_query', - label: '列表可见' - }] + header: [ + { value: 'is_create', label: '新增可见',disabled:'create_disabled'}, + { value: 'is_update', label: '编辑可见' ,disabled:'update_disabled'}, + { value: 'is_query', label: '列表可见',disabled:'query_disabled' } + ] }) onMounted(() => { diff --git a/web/src/views/system/role/components/PermissionComNew/types.ts b/web/src/views/system/role/components/PermissionComNew/types.ts index 64268103..5afc5c0d 100644 --- a/web/src/views/system/role/components/PermissionComNew/types.ts +++ b/web/src/views/system/role/components/PermissionComNew/types.ts @@ -1,36 +1,29 @@ export interface DataPermissionRangeType { - label: string; - value: number; + label: string; + value: number; } export interface CustomDataPermissionDeptType { - id: number; - name: string; - patent: number; - children: CustomDataPermissionDeptType[] + id: number; + name: string; + patent: number; + children: CustomDataPermissionDeptType[]; } export interface CustomDataPermissionMenuType { - id: number; - name: string; - is_catalog: boolean; - menuPermission: { id: number; name: string; value: string }[] | null; - columns: { id: number; name: string; title: string }[] | null; - children: CustomDataPermissionMenuType[] -} - -export interface MenusType{ - id: string; - name: string; - isCheck: boolean; - radio: string; - btns: { id:number,name: string; value: string; isCheck: boolean; data_range: number; dept:object; name:string }[]; - columns: { [key: string]: boolean | string; }[] + id: number; + name: string; + is_catalog: boolean; + menuPermission: { id: number; name: string; value: string }[] | null; + columns: { id: number; name: string; title: string }[] | null; + children: CustomDataPermissionMenuType[]; } export interface MenuDataType { - id: string; - name: string; - menus:MenusType[]; + id: string; + name: string; + isCheck: boolean; + btns: { id: number; name: string; value: string; isCheck: boolean; data_range: number; dept: object }[]; + columns: { [key: string]: boolean | string; }[]; + children: MenuDataType[]; } - -- Gitee From 314d7d79c2237ee92c8decba74a79425597c9182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 28 Jun 2024 23:46:26 +0800 Subject: [PATCH 26/44] =?UTF-8?q?feat(role=5Fmenu=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 清除后端打印 - 统一变量名 --- .../dvadmin/system/views/role_menu_button_permission.py | 8 +++----- .../system/role/components/PermissionComNew/index.vue | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 9ab1a95e..6be6a471 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -254,11 +254,10 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): 'is_query': query, 'is_create': create, 'is_update': update, - 'query_disabled': False if is_superuser else not query, - 'create_disabled': False if is_superuser else not create, - 'update_disabled': False if is_superuser else not update, + 'disabled_query': False if is_superuser else not query, + 'disabled_create': False if is_superuser else not create, + 'disabled_update': False if is_superuser else not update, }) - print(dicts['columns']) result.append(dicts) return DetailResponse(data=result) @@ -289,7 +288,6 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): data_range=data_range) instance.dept.set(btn.get('dept', [])) for col in menu.get('columns'): - print(col) FieldPermission.objects.update_or_create(role_id=pk, field_id=col.get('id'), defaults={ 'is_query': col.get('is_query'), diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index c90c3f1f..31ca9541 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -255,9 +255,9 @@ const handleSavePermission = () => { const column = reactive({ header: [ - { value: 'is_create', label: '新增可见',disabled:'create_disabled'}, - { value: 'is_update', label: '编辑可见' ,disabled:'update_disabled'}, - { value: 'is_query', label: '列表可见',disabled:'query_disabled' } + { value: 'is_create', label: '新增可见',disabled:'disabled_create'}, + { value: 'is_update', label: '编辑可见' ,disabled:'disabled_update'}, + { value: 'is_query', label: '列表可见',disabled:'disabled_query' } ] }) -- Gitee From d03a40d04fe9b957830389eda0ddee31e479bf23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Sat, 29 Jun 2024 11:46:45 +0800 Subject: [PATCH 27/44] =?UTF-8?q?feat(role=5Fmenu=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复非管理员角色给其他角色分配权限的bug - 修复列权限禁用判断逻辑 - 修复自定义数据权限部门判断逻辑 --- .../views/role_menu_button_permission.py | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 6be6a471..1965b3c9 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -198,6 +198,8 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): params = request.query_params # 需要授权的角色信息 current_role = params.get('role', None) + # 当前登录用户的角色 + role_list = request.user.role.values_list('id', flat=True) if current_role is None: return ErrorResponse(msg='参数错误') is_superuser = request.user.is_superuser @@ -243,20 +245,27 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): ) for column_item in menu_item.menufield_set.all(): + # 需要授权角色已拥有的列权限 fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first() - query = fieldpermission_queryset.is_query if fieldpermission_queryset else None - create = fieldpermission_queryset.is_create if fieldpermission_queryset else None - update = fieldpermission_queryset.is_update if fieldpermission_queryset else None + is_query = fieldpermission_queryset.is_query if fieldpermission_queryset else None + is_create = fieldpermission_queryset.is_create if fieldpermission_queryset else None + is_update = fieldpermission_queryset.is_update if fieldpermission_queryset else None + # 当前登录用户角色可分配的列权限 + fieldpermission_queryset_disabled = column_item.menu_field.filter(role_id__in=role_list).first() + disabled_query = fieldpermission_queryset_disabled.is_query if fieldpermission_queryset else None + disabled_create = fieldpermission_queryset_disabled.is_create if fieldpermission_queryset else None + disabled_update = fieldpermission_queryset_disabled.is_update if fieldpermission_queryset else None + dicts['columns'].append({ 'id': column_item.id, 'field_name': column_item.field_name, 'title': column_item.title, - 'is_query': query, - 'is_create': create, - 'is_update': update, - 'disabled_query': False if is_superuser else not query, - 'disabled_create': False if is_superuser else not create, - 'disabled_update': False if is_superuser else not update, + 'is_query': is_query, + 'is_create': is_create, + 'is_update': is_update, + 'disabled_query': False if is_superuser else not disabled_query, + 'disabled_create': False if is_superuser else not disabled_create, + 'disabled_update': False if is_superuser else not disabled_update, }) result.append(dicts) return DetailResponse(data=result) @@ -375,11 +384,21 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): """ is_superuser = request.user.is_superuser params = request.query_params - role_id = params.get('role') + # 需要授权的角色信息 + role_id = params.get('role', None) + # 当前登录用户的角色 + role_list = request.user.role.values_list('id', flat=True) + menu_button_id = params.get('menu_button') + # 当前授权的角色已有的自定义部门权限 dept_checked = RoleMenuButtonPermission.objects.filter( role_id=role_id, menu_button_id=menu_button_id ).values_list('dept', flat=True) + # 当前登录用户角色可以分配的自定义部门权限 + dept_checked_disabled = RoleMenuButtonPermission.objects.filter( + role_id__in=role_list, menu_button_id=menu_button_id + ).values_list('dept', flat=True) + dept_list = Dept.objects.values('id', 'name', 'parent') data = { 'depts': [], @@ -387,7 +406,7 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): } for dept in dept_list: - dept["disabled"] = False if is_superuser else dept["id"] not in dept_checked + dept["disabled"] = False if is_superuser else dept["id"] not in dept_checked_disabled data['depts'].append(dept) return DetailResponse(data=data) -- Gitee From 453d1e38757b69c6f2d4455beed9c67bcdb0c26d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Sat, 29 Jun 2024 13:30:18 +0800 Subject: [PATCH 28/44] =?UTF-8?q?feat(role=5Fmenu=5F20240628):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化保存菜单按钮错误bug - 优化非管理员角色给其他角色分配列权限禁用逻辑 - 优化按钮自定义数据权限后端逻辑 --- .../views/role_menu_button_permission.py | 18 +++-------- .../components/PermissionComNew/index.vue | 32 ++++++++++++++----- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 1965b3c9..e26d7eff 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -241,9 +241,11 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): if rolemenubuttonpermission_queryset else None, 'isCheck': bool(rolemenubuttonpermission_queryset), + 'dept': rolemenubuttonpermission_queryset.dept.all().values_list('id', flat=True) + if rolemenubuttonpermission_queryset + else [], } ) - for column_item in menu_item.menufield_set.all(): # 需要授权角色已拥有的列权限 fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first() @@ -384,30 +386,20 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): """ is_superuser = request.user.is_superuser params = request.query_params - # 需要授权的角色信息 - role_id = params.get('role', None) # 当前登录用户的角色 role_list = request.user.role.values_list('id', flat=True) menu_button_id = params.get('menu_button') - # 当前授权的角色已有的自定义部门权限 - dept_checked = RoleMenuButtonPermission.objects.filter( - role_id=role_id, menu_button_id=menu_button_id - ).values_list('dept', flat=True) # 当前登录用户角色可以分配的自定义部门权限 dept_checked_disabled = RoleMenuButtonPermission.objects.filter( role_id__in=role_list, menu_button_id=menu_button_id ).values_list('dept', flat=True) - dept_list = Dept.objects.values('id', 'name', 'parent') - data = { - 'depts': [], - 'dept_checked': [i for i in dept_checked if i is not None] - } + data = [] for dept in dept_list: dept["disabled"] = False if is_superuser else dept["id"] not in dept_checked_disabled - data['depts'].append(dept) + data.append(dept) return DetailResponse(data=data) @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 31ca9541..0b1ca194 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -46,7 +46,8 @@ 字段
    - + {{ head.label }}
    @@ -168,6 +169,10 @@ const getDataPermissionRangeLable = async () => { dataPermissionRangeLabel.value = resRange.data; } +/** + * 获取按钮数据权限下拉选项 + * @param btnId 按钮id + */ const fetchData = async (btnId: number) => { try { const resRange = await getDataPermissionRange({ menu_button: btnId }); @@ -197,18 +202,29 @@ const handleSettingClick = (record: MenuDataType, btn: MenuDataType['btns'][numb fetchData(btn.id) }; -const handleColumnChange = (val: boolean, record: MenuDataType, btnType: string) => { +/** + * 设置列权限 + * @param val 是否选中 + * @param record 当前菜单 + * @param btnType 按钮类型 + * @param disabledType 禁用类型 + */ +const handleColumnChange = (val: boolean, record: MenuDataType, btnType: string, disabledType: string) => { for (const iterator of record.columns) { - iterator[btnType] = val; + iterator[btnType] = iterator[disabledType] ? iterator[btnType] : val; } }; +/** + * 数据权限设置 + */ const handlePermissionRangeChange = async (val: number) => { if (val === 4) { const res = await getDataPermissionDept({ role: props.roleId, menu_button: menuBtnCurrent.value }); - const depts = XEUtils.toArrayTree(res.data.depts, { parentKey: 'parent', strict: false }); + const depts = XEUtils.toArrayTree(res.data, { parentKey: 'parent', strict: false }); deptData.value = depts; - customDataPermission.value = res.data.dept_checked; + const btnObj = XEUtils.find(menuCurrent.value.btns, item => item.id === menuBtnCurrent.value) + customDataPermission.value = btnObj.dept; } }; @@ -255,9 +271,9 @@ const handleSavePermission = () => { const column = reactive({ header: [ - { value: 'is_create', label: '新增可见',disabled:'disabled_create'}, - { value: 'is_update', label: '编辑可见' ,disabled:'disabled_update'}, - { value: 'is_query', label: '列表可见',disabled:'disabled_query' } + { value: 'is_create', label: '新增可见', disabled: 'disabled_create' }, + { value: 'is_update', label: '编辑可见', disabled: 'disabled_update' }, + { value: 'is_query', label: '列表可见', disabled: 'disabled_query' } ] }) -- Gitee From e1d9f555c83f2916964f7f76f459ab54ff8101fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Sat, 29 Jun 2024 14:46:37 +0800 Subject: [PATCH 29/44] =?UTF-8?q?feat(20240629=5Frole=5Fmenu):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=8F=9C=E5=8D=95=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化在新增修改菜单的时候,父级菜单tree只显示目录 --- .../menu/components/MenuFormCom/index.vue | 114 ++--- web/src/views/system/menu/types.ts | 2 +- .../PermissionComNew/index copy.vue | 420 ++++++++++++++++++ .../components/PermissionComNew/index.vue | 2 +- 4 files changed, 480 insertions(+), 58 deletions(-) create mode 100644 web/src/views/system/role/components/PermissionComNew/index copy.vue diff --git a/web/src/views/system/menu/components/MenuFormCom/index.vue b/web/src/views/system/menu/components/MenuFormCom/index.vue index 5fa4abae..bb7ac328 100644 --- a/web/src/views/system/menu/components/MenuFormCom/index.vue +++ b/web/src/views/system/menu/components/MenuFormCom/index.vue @@ -10,21 +10,12 @@ - + - + @@ -35,12 +26,14 @@ - + - + @@ -48,46 +41,45 @@ - + - + + + + + + + + + + + - - - - - - - - - - - +
    - + - + @@ -96,7 +88,8 @@ - +
    @@ -118,6 +111,8 @@ import { lazyLoadMenu, AddObj, UpdateObj } from '../../api'; import { successNotification } from '/@/utils/message'; import { MenuFormDataType, MenuTreeItemType, ComponentFileItem, APIResponseData } from '../../types'; import type Node from 'element-plus/es/components/tree/src/model/node'; +import { log } from 'console'; +import XEUtils from 'xe-utils'; interface IProps { initFormData: Partial | null; @@ -148,14 +143,14 @@ const validateWebPath = (rule: any, value: string, callback: Function) => { }; const validateLinkUrl = (rule: any, value: string, callback: Function) => { - let pattern = /^\/.*?/; - let patternUrl = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/; - const reg = pattern.test(value) || patternUrl.test(value) - if (reg) { - callback(); - } else { - callback(new Error('请输入正确的地址')); - } + let pattern = /^\/.*?/; + let patternUrl = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/; + const reg = pattern.test(value) || patternUrl.test(value) + if (reg) { + callback(); + } else { + callback(new Error('请输入正确的地址')); + } }; const props = withDefaults(defineProps(), { @@ -172,7 +167,7 @@ const rules = reactive({ name: [{ required: true, message: '菜单名称必填', trigger: 'blur' }], component: [{ required: true, message: '请输入组件地址', trigger: 'blur' }], component_name: [{ required: true, message: '请输入组件名称', trigger: 'blur' }], - link_url: [{ required: true, message: '请输入外链接地址',validator:validateLinkUrl, trigger: 'blur' }], + link_url: [{ required: true, message: '请输入外链接地址', validator: validateLinkUrl, trigger: 'blur' }], }); let deptDefaultList = ref([]); @@ -189,9 +184,9 @@ let menuFormData = reactive({ description: '', is_catalog: false, is_link: false, - is_iframe: false, - is_affix: false, - link_url:'' + is_iframe: false, + is_affix: false, + link_url: '' }); let menuBtnLoading = ref(false); @@ -210,9 +205,9 @@ const setMenuFormData = () => { menuFormData.description = props.initFormData?.description || ''; menuFormData.is_catalog = !!props.initFormData.is_catalog; menuFormData.is_link = !!props.initFormData.is_link; - menuFormData.is_iframe =!!props.initFormData.is_iframe; - menuFormData.is_affix =!!props.initFormData.is_affix; - menuFormData.link_url =props.initFormData.link_url; + menuFormData.is_iframe = !!props.initFormData.is_iframe; + menuFormData.is_affix = !!props.initFormData.is_affix; + menuFormData.link_url = props.initFormData.link_url; } }; @@ -246,7 +241,7 @@ const createFilter = (queryString: string) => { const handleTreeLoad = (node: Node, resolve: Function) => { if (node.level !== 0) { lazyLoadMenu({ parent: node.data.id }).then((res: APIResponseData) => { - resolve(res.data); + resolve(XEUtils.filter(res.data, (i: MenuTreeItemType) => i.is_catalog)); }); } }; @@ -278,9 +273,14 @@ const handleCancel = (type: string = '') => { formRef.value?.resetFields(); }; +/** + * 初始化 + */ onMounted(async () => { props.treeData.map((item) => { - deptDefaultList.value.push(item); + if (item.is_catalog) { + deptDefaultList.value.push(item); + } }); setMenuFormData(); }); @@ -290,6 +290,7 @@ onMounted(async () => { .menu-form-com { margin: 10px; overflow-y: auto; + .menu-form-alert { color: #fff; line-height: 24px; @@ -298,6 +299,7 @@ onMounted(async () => { border-radius: 4px; background-color: var(--el-color-primary); } + .menu-form-btns { padding-bottom: 10px; box-sizing: border-box; diff --git a/web/src/views/system/menu/types.ts b/web/src/views/system/menu/types.ts index 79754789..e99086c8 100644 --- a/web/src/views/system/menu/types.ts +++ b/web/src/views/system/menu/types.ts @@ -65,5 +65,5 @@ export interface MenuFormDataType { is_link: boolean; is_iframe:boolean; is_affix:boolean; - link_url: string; + link_url: string|undefined; } diff --git a/web/src/views/system/role/components/PermissionComNew/index copy.vue b/web/src/views/system/role/components/PermissionComNew/index copy.vue new file mode 100644 index 00000000..0b1ca194 --- /dev/null +++ b/web/src/views/system/role/components/PermissionComNew/index copy.vue @@ -0,0 +1,420 @@ + + + + + + + diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 0b1ca194..1e98eadd 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -160,7 +160,7 @@ let customDataPermission = ref([]); //获取菜单,按钮,权限 const getMenuBtnPermission = async () => { const resMenu = await getRolePermission({ role: props.roleId }) - menuData.value = resMenu + menuData.value = resMenu } // 获取按钮的数据权限下拉选项 -- Gitee From 1879d0d2fd2641b82788c1db62ab7c3d781ce8f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Sat, 29 Jun 2024 06:49:54 +0000 Subject: [PATCH 30/44] =?UTF-8?q?update=20web/src/views/system/menu/compon?= =?UTF-8?q?ents/MenuFormCom/index.vue.=20=E4=BC=98=E5=8C=96=E5=9C=A8?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9=E8=8F=9C=E5=8D=95=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=EF=BC=8C=E7=88=B6=E7=BA=A7=E8=8F=9C=E5=8D=95?= =?UTF-8?q?tree=E5=8F=AA=E6=98=BE=E7=A4=BA=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- web/src/views/system/menu/components/MenuFormCom/index.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/web/src/views/system/menu/components/MenuFormCom/index.vue b/web/src/views/system/menu/components/MenuFormCom/index.vue index 5fa4abae..37dff847 100644 --- a/web/src/views/system/menu/components/MenuFormCom/index.vue +++ b/web/src/views/system/menu/components/MenuFormCom/index.vue @@ -111,6 +111,7 @@ - - - - diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 1e98eadd..9e12dfbb 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -1,205 +1,244 @@ -- Gitee From 9215cfd1055602e4350c166138b8130bba863d1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Sun, 30 Jun 2024 05:37:10 +0000 Subject: [PATCH 32/44] =?UTF-8?q?update=20web/src/views/system/menu/compon?= =?UTF-8?q?ents/MenuFormCom/index.vue.=20XEUtils=20=E5=8C=85=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- web/src/views/system/menu/components/MenuFormCom/index.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/web/src/views/system/menu/components/MenuFormCom/index.vue b/web/src/views/system/menu/components/MenuFormCom/index.vue index 15591b53..d958a62e 100644 --- a/web/src/views/system/menu/components/MenuFormCom/index.vue +++ b/web/src/views/system/menu/components/MenuFormCom/index.vue @@ -112,8 +112,6 @@ import { lazyLoadMenu, AddObj, UpdateObj } from '../../api'; import { successNotification } from '/@/utils/message'; import { MenuFormDataType, MenuTreeItemType, ComponentFileItem, APIResponseData } from '../../types'; import type Node from 'element-plus/es/components/tree/src/model/node'; -import { log } from 'console'; -import XEUtils from 'xe-utils'; interface IProps { initFormData: Partial | null; -- Gitee From 68d31dc515f69a964fc6c70f5e24ca6def08b6d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Sun, 30 Jun 2024 06:36:50 +0000 Subject: [PATCH 33/44] =?UTF-8?q?update=20web/src/views/system/role/compon?= =?UTF-8?q?ents/PermissionComNew/index.vue.=20=E4=BF=AE=E5=A4=8D=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=9D=83=E9=99=90=E4=BF=9D=E5=AD=98=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- .../role/components/PermissionComNew/index.vue | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 9e12dfbb..b1da73fd 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -275,18 +275,12 @@ const handleDialogConfirm = () => { errorNotification('请选择'); return; } - for (const item of menuData.value) { - for (const iterator of item.children) { - if (iterator.id === menuCurrent.value.id) { - for (const btn of iterator.btns) { - if (btn.id === menuBtnCurrent.value) { - const findItem = dataPermissionRange.value.find((i) => i.value === dataPermission.value); - btn.data_range = findItem?.value || 0; - if (btn.data_range === 4) { - btn.dept = customDataPermission.value; - } - } - } + for (const btn of menuCurrent.value?.btns || []) { + if (btn.id === menuBtnCurrent.value) { + const findItem = dataPermissionRange.value.find((i) => i.value === dataPermission.value); + btn.data_range = findItem?.value || 0; + if (btn.data_range === 4) { + btn.dept = customDataPermission.value; } } } -- Gitee From 03f467abfa485597471db8b1bd5a8fa824dfb869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Sun, 30 Jun 2024 06:46:26 +0000 Subject: [PATCH 34/44] =?UTF-8?q?update=20backend/dvadmin/system/views/rol?= =?UTF-8?q?e=5Fmenu=5Fbutton=5Fpermission.py.=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=88=97=E6=9D=83=E9=99=90BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- .../system/views/role_menu_button_permission.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 755ff80e..3ee596df 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -249,14 +249,14 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): for column_item in menu_item.menufield_set.all(): # 需要授权角色已拥有的列权限 fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first() - is_query = fieldpermission_queryset.is_query if fieldpermission_queryset else None - is_create = fieldpermission_queryset.is_create if fieldpermission_queryset else None - is_update = fieldpermission_queryset.is_update if fieldpermission_queryset else None + is_query = fieldpermission_queryset.is_query if fieldpermission_queryset else False + is_create = fieldpermission_queryset.is_create if fieldpermission_queryset else False + is_update = fieldpermission_queryset.is_update if fieldpermission_queryset else False # 当前登录用户角色可分配的列权限 fieldpermission_queryset_disabled = column_item.menu_field.filter(role_id__in=role_list).first() - disabled_query = fieldpermission_queryset_disabled.is_query if fieldpermission_queryset else None - disabled_create = fieldpermission_queryset_disabled.is_create if fieldpermission_queryset else None - disabled_update = fieldpermission_queryset_disabled.is_update if fieldpermission_queryset else None + disabled_query = fieldpermission_queryset_disabled.is_query if fieldpermission_queryset_disabled else True + disabled_create = fieldpermission_queryset_disabled.is_create if fieldpermission_queryset_disabled else True + disabled_update = fieldpermission_queryset_disabled.is_update if fieldpermission_queryset_disabled else True dicts['columns'].append({ 'id': column_item.id, -- Gitee From 438480b2f1c9c14b6c86a5b64bc29b75c8df1d8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Mon, 1 Jul 2024 15:47:34 +0800 Subject: [PATCH 35/44] =?UTF-8?q?feat(20240701=5FFieldPermission):=20?= =?UTF-8?q?=E5=88=97=E6=9D=83=E9=99=90=E7=AE=A1=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 地区管理:增加列权限管控 - 登录日志:增加列权限管控 --- backend/dvadmin/system/urls.py | 5 +++-- backend/dvadmin/system/views/area.py | 7 +++++-- backend/dvadmin/system/views/login_log.py | 5 +++-- web/src/views/system/areas/api.ts | 6 ++++++ web/src/views/system/areas/index.vue | 13 ++++++++++--- web/src/views/system/log/loginLog/api.ts | 7 +++++++ web/src/views/system/log/loginLog/index.vue | 13 ++++++++++--- web/src/views/system/whiteList/crud.tsx | 8 +++----- 8 files changed, 47 insertions(+), 17 deletions(-) diff --git a/backend/dvadmin/system/urls.py b/backend/dvadmin/system/urls.py index 8d215071..a41e0486 100644 --- a/backend/dvadmin/system/urls.py +++ b/backend/dvadmin/system/urls.py @@ -35,6 +35,7 @@ system_url.register(r'message_center', MessageCenterViewSet) system_url.register(r'role_menu_button_permission', RoleMenuButtonPermissionViewSet) system_url.register(r'role_menu_permission', RoleMenuPermissionViewSet) system_url.register(r'column', MenuFieldViewSet) +system_url.register(r'login_log', LoginLogViewSet) urlpatterns = [ @@ -44,8 +45,8 @@ urlpatterns = [ path('system_config/get_association_table/', SystemConfigViewSet.as_view({'get': 'get_association_table'})), path('system_config/get_table_data//', SystemConfigViewSet.as_view({'get': 'get_table_data'})), path('system_config/get_relation_info/', SystemConfigViewSet.as_view({'get': 'get_relation_info'})), - path('login_log/', LoginLogViewSet.as_view({'get': 'list'})), - path('login_log//', LoginLogViewSet.as_view({'get': 'retrieve'})), + # path('login_log/', LoginLogViewSet.as_view({'get': 'list'})), + # path('login_log//', LoginLogViewSet.as_view({'get': 'retrieve'})), path('dept_lazy_tree/', DeptViewSet.as_view({'get': 'dept_lazy_tree'})), path('clause/privacy.html', PrivacyView.as_view()), path('clause/terms_service.html', TermsServiceView.as_view()), diff --git a/backend/dvadmin/system/views/area.py b/backend/dvadmin/system/views/area.py index dfa23532..3a727282 100644 --- a/backend/dvadmin/system/views/area.py +++ b/backend/dvadmin/system/views/area.py @@ -3,6 +3,7 @@ from django.db.models import Q from rest_framework import serializers from dvadmin.system.models import Area +from dvadmin.utils.field_permission import FieldPermissionMixin from dvadmin.utils.json_response import SuccessResponse from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -14,13 +15,16 @@ class AreaSerializer(CustomModelSerializer): """ pcode_count = serializers.SerializerMethodField(read_only=True) hasChild = serializers.SerializerMethodField() + def get_pcode_count(self, instance: Area): return Area.objects.filter(pcode=instance).count() + def get_hasChild(self, instance): hasChild = Area.objects.filter(pcode=instance.code) if hasChild: return True return False + class Meta: model = Area fields = "__all__" @@ -37,7 +41,7 @@ class AreaCreateUpdateSerializer(CustomModelSerializer): fields = '__all__' -class AreaViewSet(CustomModelViewSet): +class AreaViewSet(CustomModelViewSet, FieldPermissionMixin): """ 地区管理接口 list:查询 @@ -65,4 +69,3 @@ class AreaViewSet(CustomModelViewSet): else: queryset = self.queryset.filter(enable=True) return queryset - diff --git a/backend/dvadmin/system/views/login_log.py b/backend/dvadmin/system/views/login_log.py index d362ceaf..4d8bf74a 100644 --- a/backend/dvadmin/system/views/login_log.py +++ b/backend/dvadmin/system/views/login_log.py @@ -7,6 +7,7 @@ @Remark: 按钮权限管理 """ from dvadmin.system.models import LoginLog +from dvadmin.utils.field_permission import FieldPermissionMixin from dvadmin.utils.serializers import CustomModelSerializer from dvadmin.utils.viewset import CustomModelViewSet @@ -22,7 +23,7 @@ class LoginLogSerializer(CustomModelSerializer): read_only_fields = ["id"] -class LoginLogViewSet(CustomModelViewSet): +class LoginLogViewSet(CustomModelViewSet, FieldPermissionMixin): """ 登录日志接口 list:查询 @@ -33,4 +34,4 @@ class LoginLogViewSet(CustomModelViewSet): """ queryset = LoginLog.objects.all() serializer_class = LoginLogSerializer - extra_filter_class = [] + # extra_filter_class = [] diff --git a/web/src/views/system/areas/api.ts b/web/src/views/system/areas/api.ts index bad818bd..f2560589 100644 --- a/web/src/views/system/areas/api.ts +++ b/web/src/views/system/areas/api.ts @@ -39,3 +39,9 @@ export function DelObj(id: DelReq) { data: { id }, }); } +export function GetPermission() { + return request({ + url: apiPrefix + 'field_permission/', + method: 'get', + }); +} diff --git a/web/src/views/system/areas/index.vue b/web/src/views/system/areas/index.vue index 51c6c772..8201f7ec 100644 --- a/web/src/views/system/areas/index.vue +++ b/web/src/views/system/areas/index.vue @@ -5,14 +5,21 @@ diff --git a/web/src/views/system/log/loginLog/api.ts b/web/src/views/system/log/loginLog/api.ts index defefc49..273aa90b 100644 --- a/web/src/views/system/log/loginLog/api.ts +++ b/web/src/views/system/log/loginLog/api.ts @@ -39,3 +39,10 @@ export function DelObj(id: DelReq) { data: { id }, }); } + +export function GetPermission() { + return request({ + url: apiPrefix + 'field_permission/', + method: 'get', + }); +} diff --git a/web/src/views/system/log/loginLog/index.vue b/web/src/views/system/log/loginLog/index.vue index 618e6cf0..924429bb 100644 --- a/web/src/views/system/log/loginLog/index.vue +++ b/web/src/views/system/log/loginLog/index.vue @@ -5,14 +5,21 @@ diff --git a/web/src/views/system/whiteList/crud.tsx b/web/src/views/system/whiteList/crud.tsx index 7104cdae..33059c91 100644 --- a/web/src/views/system/whiteList/crud.tsx +++ b/web/src/views/system/whiteList/crud.tsx @@ -200,11 +200,9 @@ export const createCrudOptions = function ({crudExpose}: CreateCrudOptionsProps) component: { span: 24, props: { - elProps: { - allowCreate: true, - filterable: true, - clearable: true, - }, + allowCreate: true, + filterable: true, + clearable: true, }, }, itemProps: { -- Gitee From bba4472009b0c6ca9c946348b8f82149e42a35db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Mon, 1 Jul 2024 10:11:11 +0000 Subject: [PATCH 36/44] update backend/dvadmin/system/views/menu_button.py. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- backend/dvadmin/system/views/menu_button.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/dvadmin/system/views/menu_button.py b/backend/dvadmin/system/views/menu_button.py index 6ad1a0c0..d290bb1c 100644 --- a/backend/dvadmin/system/views/menu_button.py +++ b/backend/dvadmin/system/views/menu_button.py @@ -94,14 +94,14 @@ class MenuButtonViewSet(CustomModelViewSet): """ menu_obj = Menu.objects.filter(id=request.data['menu']).first() result_list = [ - {'menu': menu_obj.id, 'name': '新增', 'value': f'{menu_obj.component_name}:Create', 'api': f'/api{menu_obj.component_name}/', 'method': 1}, - {'menu': menu_obj.id, 'name': '删除', 'value': f'{menu_obj.component_name}:Delete', 'api': f'/api{menu_obj.component_name}/{{id}}/', 'method': 3}, - {'menu': menu_obj.id, 'name': '编辑', 'value': f'{menu_obj.component_name}:Update', 'api': f'/api{menu_obj.component_name}/{{id}}/', 'method': 2}, - {'menu': menu_obj.id, 'name': '查询', 'value': f'{menu_obj.component_name}:Search', 'api': f'/api{menu_obj.component_name}/', 'method': 0}, - {'menu': menu_obj.id, 'name': '详情', 'value': f'{menu_obj.component_name}:Retrieve', 'api': f'/api{menu_obj.component_name}/{{id}}/', 'method': 0}, - {'menu': menu_obj.id, 'name': '复制', 'value': f'{menu_obj.component_name}:Copy', 'api': f'/api{menu_obj.component_name}/', 'method': 1}, - {'menu': menu_obj.id, 'name': '导入', 'value': f'{menu_obj.component_name}:Import', 'api': f'/api{menu_obj.component_name}/import_data/', 'method': 1}, - {'menu': menu_obj.id, 'name': '导出', 'value': f'{menu_obj.component_name}:Import', 'api': f'/api{menu_obj.component_name}/export_data/', 'method': 1},] + {'menu': menu_obj.id, 'name': '新增', 'value': f'{menu_obj.component_name}:Create', 'api': f'/api/{menu_obj.component_name}/', 'method': 1}, + {'menu': menu_obj.id, 'name': '删除', 'value': f'{menu_obj.component_name}:Delete', 'api': f'/api/{menu_obj.component_name}/{{id}}/', 'method': 3}, + {'menu': menu_obj.id, 'name': '编辑', 'value': f'{menu_obj.component_name}:Update', 'api': f'/api/{menu_obj.component_name}/{{id}}/', 'method': 2}, + {'menu': menu_obj.id, 'name': '查询', 'value': f'{menu_obj.component_name}:Search', 'api': f'/api/{menu_obj.component_name}/', 'method': 0}, + {'menu': menu_obj.id, 'name': '详情', 'value': f'{menu_obj.component_name}:Retrieve', 'api': f'/api/{menu_obj.component_name}/{{id}}/', 'method': 0}, + {'menu': menu_obj.id, 'name': '复制', 'value': f'{menu_obj.component_name}:Copy', 'api': f'/api/{menu_obj.component_name}/', 'method': 1}, + {'menu': menu_obj.id, 'name': '导入', 'value': f'{menu_obj.component_name}:Import', 'api': f'/api/{menu_obj.component_name}/import_data/', 'method': 1}, + {'menu': menu_obj.id, 'name': '导出', 'value': f'{menu_obj.component_name}:Export', 'api': f'/api{menu_obj.component_name}/export_data/', 'method': 1},] serializer = self.get_serializer(data=result_list, many=True) serializer.is_valid(raise_exception=True) serializer.save() -- Gitee From de603df07cf6e134eea3171f29fb3c1630c40d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Wed, 3 Jul 2024 15:12:30 +0800 Subject: [PATCH 37/44] =?UTF-8?q?fix(20240703=5FmesCenter):=20=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化了前端index和crud - 修复“我的接收”在点击查看,不显示目标内容bug --- .../dvadmin/system/views/message_center.py | 39 +++++++ web/src/views/system/messageCenter/crud.tsx | 102 ++++++++---------- web/src/views/system/messageCenter/index.vue | 56 +++++----- 3 files changed, 110 insertions(+), 87 deletions(-) diff --git a/backend/dvadmin/system/views/message_center.py b/backend/dvadmin/system/views/message_center.py index 96b23c33..d46209f6 100644 --- a/backend/dvadmin/system/views/message_center.py +++ b/backend/dvadmin/system/views/message_center.py @@ -80,6 +80,9 @@ class MessageCenterTargetUserListSerializer(CustomModelSerializer): """ 目标用户序列化器-序列化器 """ + role_info = DynamicSerializerMethodField() + user_info = DynamicSerializerMethodField() + dept_info = DynamicSerializerMethodField() is_read = serializers.SerializerMethodField() def get_is_read(self, instance): @@ -90,6 +93,42 @@ class MessageCenterTargetUserListSerializer(CustomModelSerializer): return queryset.is_read return False + def get_role_info(self, instance, parsed_query): + roles = instance.target_role.all() + # You can do what ever you want in here + # `parsed_query` param is passed to BookSerializer to allow further querying + from dvadmin.system.views.role import RoleSerializer + serializer = RoleSerializer( + roles, + many=True, + parsed_query=parsed_query + ) + return serializer.data + + def get_user_info(self, instance, parsed_query): + users = instance.target_user.all() + # You can do what ever you want in here + # `parsed_query` param is passed to BookSerializer to allow further querying + from dvadmin.system.views.user import UserSerializer + serializer = UserSerializer( + users, + many=True, + parsed_query=parsed_query + ) + return serializer.data + + def get_dept_info(self, instance, parsed_query): + dept = instance.target_dept.all() + # You can do what ever you want in here + # `parsed_query` param is passed to BookSerializer to allow further querying + from dvadmin.system.views.dept import DeptSerializer + serializer = DeptSerializer( + dept, + many=True, + parsed_query=parsed_query + ) + return serializer.data + class Meta: model = MessageCenter fields = "__all__" diff --git a/web/src/views/system/messageCenter/crud.tsx b/web/src/views/system/messageCenter/crud.tsx index 57331940..dddc1a65 100644 --- a/web/src/views/system/messageCenter/crud.tsx +++ b/web/src/views/system/messageCenter/crud.tsx @@ -1,46 +1,38 @@ import * as api from './api'; -import {dict, useCompute, PageQuery, AddReq, DelReq, EditReq, CrudExpose, CrudOptions} from '@fast-crud/fast-crud'; +import { dict, useCompute, PageQuery, AddReq, DelReq, EditReq, CreateCrudOptionsProps, CreateCrudOptionsRet } from '@fast-crud/fast-crud'; import tableSelector from '/@/components/tableSelector/index.vue'; -import {shallowRef, computed, ref, inject} from 'vue'; +import { shallowRef, computed } from 'vue'; import manyToMany from '/@/components/manyToMany/index.vue'; -import {auth} from '/@/utils/authFunction' -import {createCrudOptions as userCrudOptions } from "/@/views/system/user/crud"; -import {request} from '/@/utils/service' -const {compute} = useCompute(); +import { auth } from '/@/utils/authFunction'; +const { compute } = useCompute(); -interface CreateCrudOptionsTypes { - crudOptions: CrudOptions; -} - -export const createCrudOptions = function ({ - crudExpose, - tabActivted - }: { crudExpose: CrudExpose; tabActivted: any }): CreateCrudOptionsTypes { - const pageRequest = async (query: PageQuery) => { - if (tabActivted.value === 'receive') { - return await api.GetSelfReceive(query); - } - return await api.GetList(query); - }; - const editRequest = async ({form, row}: EditReq) => { - form.id = row.id; - return await api.UpdateObj(form); - }; - const delRequest = async ({row}: DelReq) => { - return await api.DelObj(row.id); - }; - const addRequest = async ({form}: AddReq) => { - return await api.AddObj(form); - }; +export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { + const { tabActivted } = context; //从context中获取tabActivted - const viewRequest = async ({row}: { row: any }) => { - return await api.GetObj(row.id); - }; + const pageRequest = async (query: PageQuery) => { + if (tabActivted.value === 'receive') { + return await api.GetSelfReceive(query); + } + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + form.id = row.id; + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; - const IsReadFunc = computed(() => { - return tabActivted.value === 'receive'; - }); + const viewRequest = async ({ row }: { row: any }) => { + return await api.GetObj(row.id); + }; + const IsReadFunc = computed(() => { + return tabActivted.value === 'receive'; + }); return { crudOptions: { @@ -50,27 +42,27 @@ export const createCrudOptions = function ({ editRequest, delRequest, }, - actionbar:{ - buttons:{ - add:{ - show:computed(() =>{ + actionbar: { + buttons: { + add: { + show: computed(() => { return tabActivted.value !== 'receive' && auth('messageCenter:Create'); - }) + }), }, - } + }, }, rowHandle: { - fixed:'right', - width:150, + fixed: 'right', + width: 150, buttons: { edit: { show: false, }, view: { - text:"查看", - type:'text', - iconRight:'View', - show:auth("messageCenter:Search"), + text: '查看', + type: 'text', + iconRight: 'View', + show: auth('messageCenter:Search'), click({ index, row }) { crudExpose.openView({ index, row }); if (tabActivted.value === 'receive') { @@ -82,7 +74,7 @@ export const createCrudOptions = function ({ remove: { iconRight: 'Delete', type: 'text', - show:auth('messageCenter:Delete') + show: auth('messageCenter:Delete'), }, }, }, @@ -99,7 +91,7 @@ export const createCrudOptions = function ({ show: true, }, type: ['text', 'colspan'], - column:{ + column: { minWidth: 120, }, form: { @@ -132,7 +124,7 @@ export const createCrudOptions = function ({ target_type: { title: '目标类型', type: ['dict-radio', 'colspan'], - column:{ + column: { minWidth: 120, }, dict: dict({ @@ -285,7 +277,7 @@ export const createCrudOptions = function ({ name: shallowRef(tableSelector), vModel: 'modelValue', displayLabel: compute(({ form }) => { - return form.target_dept_name; + return form.dept_info; }), tableConfig: { url: '/api/system/dept/all_dept/', @@ -297,7 +289,7 @@ export const createCrudOptions = function ({ { prop: 'name', label: '部门名称', - width: 150, + width: 150, }, { prop: 'status_label', @@ -349,7 +341,7 @@ export const createCrudOptions = function ({ }, ], component: { - disabled: true, + disabled: false, id: '1', // 当同一个页面有多个editor时,需要配置不同的id editorConfig: { // 是否只读 @@ -373,4 +365,4 @@ export const createCrudOptions = function ({ }, }, }; -}; +} diff --git a/web/src/views/system/messageCenter/index.vue b/web/src/views/system/messageCenter/index.vue index 54aec43b..946a8edb 100644 --- a/web/src/views/system/messageCenter/index.vue +++ b/web/src/views/system/messageCenter/index.vue @@ -1,43 +1,35 @@ -- Gitee From 27c9eff71670fd52676832eb29977c67f625fc6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Wed, 3 Jul 2024 09:21:24 +0000 Subject: [PATCH 38/44] =?UTF-8?q?update=20backend/dvadmin/system/views/fil?= =?UTF-8?q?e=5Flist.py.=20=E4=BF=AE=E5=A4=8Dlssuess=E9=97=AE=E9=A2=98(http?= =?UTF-8?q?s://gitee.com/huge-dream/django-vue3-admin/issues/IA8ROD)=20-?= =?UTF-8?q?=20=E9=99=84=E4=BB=B6=E7=AE=A1=E7=90=86=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=96=87=E4=BB=B6=E5=92=8C=E5=9B=BE=E7=89=87?= =?UTF-8?q?=20-=20=E5=AF=8C=E6=96=87=E6=9C=AC=E6=97=A0=E6=B3=95=E6=89=93?= =?UTF-8?q?=E5=BC=80=E6=96=87=E4=BB=B6=E5=92=8C=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- backend/dvadmin/system/views/file_list.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/dvadmin/system/views/file_list.py b/backend/dvadmin/system/views/file_list.py index c122f03f..c5956998 100644 --- a/backend/dvadmin/system/views/file_list.py +++ b/backend/dvadmin/system/views/file_list.py @@ -15,8 +15,8 @@ class FileSerializer(CustomModelSerializer): url = serializers.SerializerMethodField(read_only=True) def get_url(self, instance): - # return 'media/' + str(instance.url) - return instance.file_url or (f'media/{str(instance.url)}') + base_url = f"{self.request.scheme}://{self.request.get_host()}/" + return base_url + (instance.file_url or (f'media/{str(instance.url)}')) class Meta: model = FileList -- Gitee From 0dcf8ae7941e6364ed2242ca46db7ee722c887a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Thu, 4 Jul 2024 05:51:38 +0000 Subject: [PATCH 39/44] =?UTF-8?q?update=20backend/dvadmin/utils/models.py.?= =?UTF-8?q?=20=E8=B7=A8models=E5=BC=95=E7=94=A8=E6=A8=A1=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- backend/dvadmin/utils/models.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/dvadmin/utils/models.py b/backend/dvadmin/utils/models.py index fb0c2ba7..7073d0f9 100644 --- a/backend/dvadmin/utils/models.py +++ b/backend/dvadmin/utils/models.py @@ -117,9 +117,13 @@ def get_all_models_objects(model_name=None): def get_model_from_app(app_name): """获取模型里的字段""" model_module = import_module(app_name + '.models') + exclude_models = getattr(model_module, 'exclude_models', []) filter_model = [ - getattr(model_module, item) for item in dir(model_module) - if item != 'CoreModel' and issubclass(getattr(model_module, item).__class__, models.base.ModelBase) + value for key, value in model_module.__dict__.items() + if key != 'CoreModel' + and isinstance(value, type) + and issubclass(value, models.Model) + and key not in exclude_models ] model_list = [] for model in filter_model: -- Gitee From 71ca7370e214fb56738b3c45f0819bd13d6baa9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=A8=E5=AD=90-=E6=9D=8E?= <1537080775@qq.com> Date: Thu, 4 Jul 2024 14:56:42 +0000 Subject: [PATCH 40/44] update web/src/utils/columnPermission.ts. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 木子-李 <1537080775@qq.com> --- web/src/utils/columnPermission.ts | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/web/src/utils/columnPermission.ts b/web/src/utils/columnPermission.ts index 4a9d9f1d..aff14412 100644 --- a/web/src/utils/columnPermission.ts +++ b/web/src/utils/columnPermission.ts @@ -24,31 +24,17 @@ export const handleColumnPermission = async (func: Function, crudOptions: any,ex const columns = crudOptions.columns; const excludeColumns = ['_index','id', 'create_datetime', 'update_datetime'].concat(excludeColumn) for (let col in columns) { - if (excludeColumns.includes(col)) { - continue - }else{ - if (columns[col].column) { - columns[col].column.show = false - } else { - columns[col]['column'] = { - show: false - } - } - columns[col].addForm = { - show: false - } - columns[col].editForm = { - show: false - } - } - for (let item of res.data) { if (excludeColumns.includes(item.field_name)) { continue } else if(item.field_name === col) { columns[col].column.show = item['is_query'] // 如果列表不可见,则禁止在列设置中选择 - if(!item['is_query'])columns[col].column.columnSetDisabled = true + // 只有列表不可见,才修改列配置,这样才不影响默认的配置 + if(!item['is_query']){ + columns[col].column.show = false + columns[col].column.columnSetDisabled = true + } columns[col].addForm = { show: item['is_create'] } -- Gitee From 630ec1e774ca3b530abbce69480641d0ff1ed2c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 5 Jul 2024 10:24:07 +0800 Subject: [PATCH 41/44] =?UTF-8?q?feat(20240705=5FtableSelector):=20?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E9=80=89=E6=8B=A9=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增加树形结构懒加载 --- web/src/components/tableSelector/index.vue | 298 +++++++++++---------- 1 file changed, 153 insertions(+), 145 deletions(-) diff --git a/web/src/components/tableSelector/index.vue b/web/src/components/tableSelector/index.vue index 7ad3cad8..ab6ca7d0 100644 --- a/web/src/components/tableSelector/index.vue +++ b/web/src/components/tableSelector/index.vue @@ -1,203 +1,211 @@ -- Gitee From 6d587fc1e2761790c515553650f55eb5b29cfe3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 5 Jul 2024 17:24:36 +0800 Subject: [PATCH 42/44] =?UTF-8?q?feat(20240705=5Farea):=20=E5=9C=B0?= =?UTF-8?q?=E5=8C=BA=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化地区管理:增删改查 - 优化tableSelect组件:增加树形结构和懒加载 --- backend/dvadmin/system/views/area.py | 50 ++- web/src/components/tableSelector/index.vue | 4 +- web/src/utils/columnPermission.ts | 1 - web/src/views/system/areas/crud.tsx | 436 ++++++++++----------- 4 files changed, 237 insertions(+), 254 deletions(-) diff --git a/backend/dvadmin/system/views/area.py b/backend/dvadmin/system/views/area.py index 3a727282..7a19eb07 100644 --- a/backend/dvadmin/system/views/area.py +++ b/backend/dvadmin/system/views/area.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import pypinyin from django.db.models import Q from rest_framework import serializers @@ -15,6 +16,11 @@ class AreaSerializer(CustomModelSerializer): """ pcode_count = serializers.SerializerMethodField(read_only=True) hasChild = serializers.SerializerMethodField() + pcode_info = serializers.SerializerMethodField() + + def get_pcode_info(self, instance): + pcode = Area.objects.filter(code=instance.pcode_id).values("name", "code") + return pcode def get_pcode_count(self, instance: Area): return Area.objects.filter(pcode=instance).count() @@ -36,6 +42,18 @@ class AreaCreateUpdateSerializer(CustomModelSerializer): 地区管理 创建/更新时的列化器 """ + def to_internal_value(self, data): + pinyin = ''.join([''.join(i) for i in pypinyin.pinyin(data["name"], style=pypinyin.NORMAL)]) + data["level"] = 1 + data["pinyin"] = pinyin + data["initials"] = pinyin[0].upper() if pinyin else "#" + pcode = data["pcode"] if 'pcode' in data else None + if pcode: + pcode = Area.objects.get(pk=pcode) + data["pcode"] = pcode.code + data["level"] = pcode.level + 1 + return super().to_internal_value(data) + class Meta: model = Area fields = '__all__' @@ -52,20 +70,28 @@ class AreaViewSet(CustomModelViewSet, FieldPermissionMixin): """ queryset = Area.objects.all() serializer_class = AreaSerializer + create_serializer_class = AreaCreateUpdateSerializer + update_serializer_class = AreaCreateUpdateSerializer extra_filter_class = [] - def get_queryset(self): + def list(self, request, *args, **kwargs): self.request.query_params._mutable = True params = self.request.query_params - pcode = params.get('pcode', None) - page = params.get('page', None) - limit = params.get('limit', None) - if page: - del params['page'] - if limit: - del params['limit'] - if params and pcode: - queryset = self.queryset.filter(enable=True, pcode=pcode) - else: + known_params = {'page', 'limit', 'pcode'} + # 使用集合操作检查是否有未知参数 + other_params_exist = any(param not in known_params for param in params) + if other_params_exist: queryset = self.queryset.filter(enable=True) - return queryset + else: + pcode = params.get('pcode', None) + params['limit'] = 999 + if params and pcode: + queryset = self.queryset.filter(enable=True, pcode=pcode) + else: + queryset = self.queryset.filter(enable=True, level=1) + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True, request=request) + return self.get_paginated_response(serializer.data) + serializer = self.get_serializer(queryset, many=True, request=request) + return SuccessResponse(data=serializer.data, msg="获取成功") diff --git a/web/src/components/tableSelector/index.vue b/web/src/components/tableSelector/index.vue index ab6ca7d0..8e8c91a9 100644 --- a/web/src/components/tableSelector/index.vue +++ b/web/src/components/tableSelector/index.vue @@ -2,7 +2,7 @@ { const handleCurrentChange = (val: any) => { const { tableConfig } = props; if (!tableConfig.isMultiple && val) { - data.value = val[tableConfig.label]; + data.value = [val[tableConfig.label]]; emit('update:modelValue', val[tableConfig.value]); } }; diff --git a/web/src/utils/columnPermission.ts b/web/src/utils/columnPermission.ts index aff14412..7ef06de0 100644 --- a/web/src/utils/columnPermission.ts +++ b/web/src/utils/columnPermission.ts @@ -28,7 +28,6 @@ export const handleColumnPermission = async (func: Function, crudOptions: any,ex if (excludeColumns.includes(item.field_name)) { continue } else if(item.field_name === col) { - columns[col].column.show = item['is_query'] // 如果列表不可见,则禁止在列设置中选择 // 只有列表不可见,才修改列配置,这样才不影响默认的配置 if(!item['is_query']){ diff --git a/web/src/views/system/areas/crud.tsx b/web/src/views/system/areas/crud.tsx index 01d18602..1a1e47b0 100644 --- a/web/src/views/system/areas/crud.tsx +++ b/web/src/views/system/areas/crud.tsx @@ -1,244 +1,202 @@ import * as api from './api'; -import { - dict, - UserPageQuery, - AddReq, - DelReq, - EditReq, - compute, - CreateCrudOptionsProps, - CreateCrudOptionsRet -} from '@fast-crud/fast-crud'; -import {dictionary} from '/@/utils/dictionary'; -import {successMessage} from '/@/utils/message'; -import {auth} from "/@/utils/authFunction"; +import { dict, UserPageQuery, AddReq, DelReq, EditReq, compute, CreateCrudOptionsProps, CreateCrudOptionsRet } from '@fast-crud/fast-crud'; +import { dictionary } from '/@/utils/dictionary'; +import { successMessage } from '/@/utils/message'; +import { auth } from '/@/utils/authFunction'; +import tableSelector from '/@/components/tableSelector/index.vue'; +import { shallowRef } from 'vue'; -export const createCrudOptions = function ({crudExpose}: CreateCrudOptionsProps): CreateCrudOptionsRet { - const pageRequest = async (query: UserPageQuery) => { - return await api.GetList(query); - }; - const editRequest = async ({form, row}: EditReq) => { - form.id = row.id; - return await api.UpdateObj(form); - }; - const delRequest = async ({row}: DelReq) => { - return await api.DelObj(row.id); - }; - const addRequest = async ({form}: AddReq) => { - return await api.AddObj(form); - }; +export const createCrudOptions = function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet { + const pageRequest = async (query: UserPageQuery) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + form.id = row.id; + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; - /** - * 懒加载 - * @param row - * @returns {Promise} - */ - const loadContentMethod = (tree: any, treeNode: any, resolve: Function) => { - pageRequest({pcode: tree.code}).then((res: APIResponseData) => { - resolve(res.data); - }); - }; + /** + * 懒加载 + * @param row + * @returns {Promise} + */ + const loadContentMethod = (tree: any, treeNode: any, resolve: Function) => { + pageRequest({ pcode: tree.code }).then((res: APIResponseData) => { + resolve(res.data); + }); + }; - return { - crudOptions: { - request: { - pageRequest, - addRequest, - editRequest, - delRequest, - }, - actionbar: { - buttons: { - add: { - show: auth('area:Create'), - } - } - }, - rowHandle: { - //固定右侧 - fixed: 'right', - width: 200, - buttons: { - view: { - show: false, - }, - edit: { - iconRight: 'Edit', - type: 'text', - show: auth('area:Update') - }, - remove: { - iconRight: 'Delete', - type: 'text', - show: auth('area:Delete') - }, - }, - }, - pagination: { - show: false, - }, - table: { - rowKey: 'id', - lazy: true, - load: loadContentMethod, - treeProps: {children: 'children', hasChildren: 'hasChild'}, - }, - columns: { - _index: { - title: '序号', - form: {show: false}, - column: { - type: 'index', - align: 'center', - width: '70px', - columnSetDisabled: true, //禁止在列设置中选择 - }, - }, - // pcode: { - // title: '父级地区', - // show: false, - // search: { - // show: true, - // }, - // type: 'dict-tree', - // form: { - // component: { - // showAllLevels: false, // 仅显示最后一级 - // props: { - // elProps: { - // clearable: true, - // showAllLevels: false, // 仅显示最后一级 - // props: { - // checkStrictly: true, // 可以不需要选到最后一级 - // emitPath: false, - // clearable: true, - // }, - // }, - // }, - // }, - // }, - // }, - name: { - title: '名称', - search: { - show: true, - }, - treeNode: true, - type: 'input', - column: { - minWidth: 120, - }, - form: { - rules: [ - // 表单校验规则 - {required: true, message: '名称必填项'}, - ], - component: { - placeholder: '请输入名称', - }, - }, - }, - code: { - title: '地区编码', - search: { - show: true, - }, - type: 'input', - column: { - minWidth: 90, - }, - form: { - rules: [ - // 表单校验规则 - {required: true, message: '地区编码必填项'}, - ], - component: { - placeholder: '请输入地区编码', - }, - }, - }, - pinyin: { - title: '拼音', - search: { - disabled: true, - }, - type: 'input', - column: { - minWidth: 120, - }, - form: { - rules: [ - // 表单校验规则 - {required: true, message: '拼音必填项'}, - ], - component: { - placeholder: '请输入拼音', - }, - }, - }, - level: { - title: '地区层级', - search: { - disabled: true, - }, - type: 'input', - column: { - minWidth: 100, - }, - form: { - disabled: false, - rules: [ - // 表单校验规则 - {required: true, message: '拼音必填项'}, - ], - component: { - placeholder: '请输入拼音', - }, - }, - }, - initials: { - title: '首字母', - column: { - minWidth: 100, - }, - form: { - rules: [ - // 表单校验规则 - {required: true, message: '首字母必填项'}, - ], - - component: { - placeholder: '请输入首字母', - }, - }, - }, - enable: { - title: '是否启用', - search: { - show: true, - }, - type: 'dict-radio', - column: { - minWidth: 90, - component: { - name: 'fs-dict-switch', - activeText: '', - inactiveText: '', - style: '--el-switch-on-color: var(--el-color-primary); --el-switch-off-color: #dcdfe6', - onChange: compute((context) => { - return () => { - api.UpdateObj(context.row).then((res: APIResponseData) => { - successMessage(res.msg as string); - }); - }; - }), - }, - }, - dict: dict({ - data: dictionary('button_status_bool'), - }), - }, - }, - }, - }; + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add: { + show: auth('area:Create'), + }, + }, + }, + rowHandle: { + //固定右侧 + fixed: 'right', + width: 200, + buttons: { + view: { + show: false, + }, + edit: { + iconRight: 'Edit', + type: 'text', + show: auth('area:Update'), + }, + remove: { + iconRight: 'Delete', + type: 'text', + show: auth('area:Delete'), + }, + }, + }, + pagination: { + show: false, + }, + table: { + rowKey: 'id', + lazy: true, + load: loadContentMethod, + treeProps: { children: 'children', hasChildren: 'hasChild' }, + }, + columns: { + _index: { + title: '序号', + form: { show: false }, + column: { + type: 'index', + align: 'center', + width: '70px', + columnSetDisabled: true, //禁止在列设置中选择 + }, + }, + name: { + title: '名称', + search: { + show: true, + }, + treeNode: true, + type: 'input', + column: { + minWidth: 120, + }, + form: { + rules: [ + // 表单校验规则 + { required: true, message: '名称必填项' }, + ], + component: { + placeholder: '请输入名称', + }, + }, + }, + pcode: { + title: '父级地区', + search: { + disabled: true, + }, + width: 130, + type: 'table-selector', + form: { + component: { + name: shallowRef(tableSelector), + vModel: 'modelValue', + displayLabel: compute(({ row }) => { + if (row) { + return row.pcode_info; + } + return null; + }), + tableConfig: { + url: '/api/system/area/', + label: 'name', + value: 'id', + isTree: true, + isMultiple: false, + lazy: true, + load: loadContentMethod, + treeProps: { children: 'children', hasChildren: 'hasChild' }, + columns: [ + { + prop: 'name', + label: '地区', + width: 150, + }, + { + prop: 'code', + label: '地区编码', + }, + ], + }, + }, + }, + column: { + show: false, + }, + }, + code: { + title: '地区编码', + search: { + show: true, + }, + type: 'input', + column: { + minWidth: 90, + }, + form: { + rules: [ + // 表单校验规则 + { required: true, message: '地区编码必填项' }, + ], + component: { + placeholder: '请输入地区编码', + }, + }, + }, + enable: { + title: '是否启用', + search: { + show: true, + }, + type: 'dict-radio', + column: { + minWidth: 90, + component: { + name: 'fs-dict-switch', + activeText: '', + inactiveText: '', + style: '--el-switch-on-color: var(--el-color-primary); --el-switch-off-color: #dcdfe6', + onChange: compute((context) => { + return () => { + api.UpdateObj(context.row).then((res: APIResponseData) => { + successMessage(res.msg as string); + }); + }; + }), + }, + }, + dict: dict({ + data: dictionary('button_status_bool'), + }), + }, + }, + }, + }; }; -- Gitee From 6f8bae8d5ced721319250178351a0986f377f89a Mon Sep 17 00:00:00 2001 From: lxy <46486798@qq.com> Date: Mon, 8 Jul 2024 09:33:51 +0000 Subject: [PATCH 43/44] =?UTF-8?q?update=20backend/dvadmin/utils/middleware?= =?UTF-8?q?.py.=20=E5=BD=93=E5=90=8C=E4=B8=80=E6=97=B6=E5=88=BB=E8=BF=9B?= =?UTF-8?q?=E6=9D=A5=E5=A4=9A=E4=B8=AA=E8=AF=B7=E6=B1=82=E4=B8=94=E9=83=BD?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=AE=8C=E6=88=90=E5=93=8D=E5=BA=94=E6=97=B6?= =?UTF-8?q?=EF=BC=8Coperation=5Flog=5Fid=E4=BC=9A=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E8=BF=9B=E6=9D=A5=E7=9A=84?= =?UTF-8?q?ID=EF=BC=8C=E5=AF=BC=E8=87=B4=E4=B9=8B=E5=89=8D=E6=8C=89?= =?UTF-8?q?=E8=BF=9B=E6=9D=A5=E7=9A=84=E8=AF=B7=E6=B1=82=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=88=B0=E5=90=8C=E4=B8=80=E4=B8=AAid=E4=B8=8A=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lxy <46486798@qq.com> --- backend/dvadmin/utils/middleware.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/dvadmin/utils/middleware.py b/backend/dvadmin/utils/middleware.py index f4717a4d..6029c5a7 100644 --- a/backend/dvadmin/utils/middleware.py +++ b/backend/dvadmin/utils/middleware.py @@ -32,6 +32,14 @@ class ApiLoggingMiddleware(MiddlewareMixin): request.request_path = get_request_path(request) def __handle_response(self, request, response): + + # 判断有无log_id属性,使用All记录时,会出现此情况 + if request.request_data.get('log_id', None) is None: + return + + # 移除log_id,不记录此ID + log_id = request.request_data.pop('log_id') + # request_data,request_ip由PermissionInterfaceMiddleware中间件中添加的属性 body = getattr(request, 'request_data', {}) # 请求含有password则用*替换掉(暂时先用于所有接口的password请求参数) @@ -60,7 +68,7 @@ class ApiLoggingMiddleware(MiddlewareMixin): 'status': True if response.data.get('code') in [2000, ] else False, 'json_result': {"code": response.data.get('code'), "msg": response.data.get('msg')}, } - operation_log, creat = OperationLog.objects.update_or_create(defaults=info, id=self.operation_log_id) + operation_log, creat = OperationLog.objects.update_or_create(defaults=info, id=log_id) if not operation_log.request_modular and settings.API_MODEL_MAP.get(request.request_path, None): operation_log.request_modular = settings.API_MODEL_MAP[request.request_path] operation_log.save() @@ -71,7 +79,8 @@ class ApiLoggingMiddleware(MiddlewareMixin): if self.methods == 'ALL' or request.method in self.methods: log = OperationLog(request_modular=get_verbose_name(view_func.cls.queryset)) log.save() - self.operation_log_id = log.id + # self.operation_log_id = log.id + request.request_data['log_id'] = log.id return -- Gitee From 3dcef90bbe9ea0377898b3e461909c37fb4c2d68 Mon Sep 17 00:00:00 2001 From: lxy <46486798@qq.com> Date: Tue, 9 Jul 2024 03:56:45 +0000 Subject: [PATCH 44/44] =?UTF-8?q?update=20backend/dvadmin/utils/field=5Fpe?= =?UTF-8?q?rmission.py.=20=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AA=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E6=8B=A5=E6=9C=89=E5=A4=9A=E4=B8=AA=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9D=83=E9=99=90=EF=BC=8C=E5=AF=BC=E8=87=B4=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=9F=90=E4=BA=9B=E6=A8=A1=E5=9D=97=E6=B2=A1=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=A5=BD=E5=AF=BC=E8=87=B4=E7=9A=84=E6=97=A0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=88=E5=9C=B0=E5=8C=BA=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E3=80=81=E7=99=BB=E5=BD=95=E6=97=A5=E5=BF=97=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=9D=83=E9=99=90=EF=BC=8C=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=A4=9A=E4=B8=AA=E7=9B=B8=E5=90=8C=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=90=8D=E6=9D=83=E9=99=90=EF=BC=8C=E7=9B=B8?= =?UTF-8?q?=E5=90=8C=E5=AD=97=E6=AE=B5=E5=90=8D=E7=9A=84=E6=9D=83=E9=99=90?= =?UTF-8?q?True=E5=80=BC=E4=BF=9D=E7=95=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lxy <46486798@qq.com> --- backend/dvadmin/utils/field_permission.py | 33 +++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/backend/dvadmin/utils/field_permission.py b/backend/dvadmin/utils/field_permission.py index 20b4cb95..7c259f68 100644 --- a/backend/dvadmin/utils/field_permission.py +++ b/backend/dvadmin/utils/field_permission.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- + +from itertools import groupby + from django.db.models import F from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated @@ -35,4 +38,34 @@ class FieldPermissionMixin: data= FieldPermission.objects.filter( field__model=model['model'],role__in=roles ).values( 'is_create', 'is_query', 'is_update',field_name=F('field__field_name')) + + """ + 合并权限 + + 这段代码首先根据 field_name 对列表进行排序, + 然后使用 groupby 按 field_name 进行分组。 + 对于每个组,它创建一个新的字典 merged, + 并遍历组中的每个字典,将布尔值字段使用逻辑或(or)操作符进行合并(如果 merged 中还没有该字段,则默认为 False), + 其他字段(如 field_name)则直接取组的关键字(即 key) + """ + + # 使用field_name对列表进行分组, # groupby 需要先对列表进行排序,因为它只能对连续相同的元素进行分组。 + grouped = groupby(sorted(list(data), key=lambda x: x['field_name']), key=lambda x: x['field_name']) + + data = [] + + # 遍历分组,合并权限 + for key, group in grouped: + + # 初始化一个空字典来存储合并后的结果 + merged = {} + for item in group: + # 合并权限, True值优先 + merged['is_create'] = merged.get('is_create', False) or item['is_create'] + merged['is_query'] = merged.get('is_query', False) or item['is_query'] + merged['is_update'] = merged.get('is_update', False) or item['is_update'] + merged['field_name'] = key + + data.append(merged) + return DetailResponse(data=data) \ No newline at end of file -- Gitee