From 418c78fa837b9fdf4da4f34307f6cc7d94159805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=BE=89?= Date: Fri, 21 Feb 2025 17:11:41 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8=E5=A4=9A=E9=80=89=E5=9B=BE=E7=89=87=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8B=E6=97=A0=E6=B3=95=E5=88=A0=E9=99=A4=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/fileSelector/index.vue | 22 ++++++++----- web/src/views/system/fileList/crud.tsx | 40 +++++++++++------------ 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/web/src/components/fileSelector/index.vue b/web/src/components/fileSelector/index.vue index e07a919..96262e1 100644 --- a/web/src/components/fileSelector/index.vue +++ b/web/src/components/fileSelector/index.vue @@ -11,8 +11,14 @@
- +
+ + + + +
@@ -22,10 +28,6 @@
- - -
{ // all数据不能清,因为all只会在挂载的时候赋值一次 // listAllData.value = []; }; -const clear = () => { data.value = null; onDataChange(null); } - +const clear = () => { data.value = null; onDataChange(null); }; +const clearOne = (item: any) => { + let _l = (JSON.parse(JSON.stringify(data.value)) as any[]).filter((i:any)=> i !== item) + data.value = _l; + onDataChange(_l); +}; // 网络文件部分 const netLoading = ref(false); diff --git a/web/src/views/system/fileList/crud.tsx b/web/src/views/system/fileList/crud.tsx index 48143c4..83b8d08 100644 --- a/web/src/views/system/fileList/crud.tsx +++ b/web/src/views/system/fileList/crud.tsx @@ -228,26 +228,26 @@ export const createCrudOptions = function ({ crudExpose, context }: CreateCrudOp show: false } }, - fileselectortest: { - title: '文件选择器测试', - type: 'file-selector', - column: { - minWidth: 200 - }, - form: { - component: { - name: fileSelector, - vModel: 'modelValue', - tabsShow: 0b1111, - itemSize: 100, - multiple: true, - selectable: true, - showInput: true, - inputType: 'image', - valueKey: 'url', - } - } - } + // fileselectortest: { + // title: '文件选择器测试', + // type: 'file-selector', + // column: { + // minWidth: 200 + // }, + // form: { + // component: { + // name: fileSelector, + // vModel: 'modelValue', + // tabsShow: 0b1111, + // itemSize: 100, + // multiple: true, + // selectable: true, + // showInput: true, + // inputType: 'image', + // valueKey: 'url', + // } + // } + // } }, }, }; From b10c3ebdc0f3887a03b2df4fb08fd702d8d0f6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=BE=89?= Date: Mon, 24 Feb 2025 10:26:49 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E5=A4=8Dwindows=E4=B8=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=8F=8D=E6=96=9C=E6=9D=A0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/fileSelector/index.vue | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web/src/components/fileSelector/index.vue b/web/src/components/fileSelector/index.vue index 96262e1..bfa16a5 100644 --- a/web/src/components/fileSelector/index.vue +++ b/web/src/components/fileSelector/index.vue @@ -415,7 +415,14 @@ watch( const { ui } = useUi(); const formValidator = ui.formItem.injectFormItemContext(); const onDataChange = (value: any) => { - emit('update:modelValue', value); + console.log(value) + let _v; + if (typeof value === 'string') _v = value.replace(/\\/g, '/'); + else { + _v = []; + for (let i of value) _v.push(i.replace(/\\/g, '/')); + } + emit('update:modelValue', _v); formValidator.onChange(); formValidator.onBlur(); }; From 7fb219bb31570c4e8a90271ac375ed056472b001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=BE=89?= Date: Fri, 28 Feb 2025 18:42:28 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8=E4=BF=AE=E5=A4=8D=E6=B8=85=E7=A9=BA=E6=97=B6=E4=BC=9A?= =?UTF-8?q?=E6=8A=A5=E9=94=99null=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/fileSelector/index.vue | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/web/src/components/fileSelector/index.vue b/web/src/components/fileSelector/index.vue index bfa16a5..c8319aa 100644 --- a/web/src/components/fileSelector/index.vue +++ b/web/src/components/fileSelector/index.vue @@ -354,7 +354,7 @@ const clearState = () => { }; const clear = () => { data.value = null; onDataChange(null); }; const clearOne = (item: any) => { - let _l = (JSON.parse(JSON.stringify(data.value)) as any[]).filter((i:any)=> i !== item) + let _l = (JSON.parse(JSON.stringify(data.value)) as any[]).filter((i: any) => i !== item) data.value = _l; onDataChange(_l); }; @@ -415,12 +415,13 @@ watch( const { ui } = useUi(); const formValidator = ui.formItem.injectFormItemContext(); const onDataChange = (value: any) => { - console.log(value) - let _v; - if (typeof value === 'string') _v = value.replace(/\\/g, '/'); - else { - _v = []; - for (let i of value) _v.push(i.replace(/\\/g, '/')); + let _v = null; + if (value) { + if (typeof value === 'string') _v = value.replace(/\\/g, '/'); + else { + _v = []; + for (let i of value) _v.push(i.replace(/\\/g, '/')); + } } emit('update:modelValue', _v); formValidator.onChange(); From 036d8da9b6f5a4d12ada068a1a2db810bfc2f1c0 Mon Sep 17 00:00:00 2001 From: liqiang <1206709430@qq.com> Date: Sun, 2 Mar 2025 00:04:42 +0800 Subject: [PATCH 4/6] =?UTF-8?q?build(web):=20=E6=9B=B4=E6=96=B0=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E9=95=9C=E5=83=8F=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 dvadmin3-base-web 镜像版本从16.19-alpine升级到 18.20-alpine --- docker_env/web/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker_env/web/Dockerfile b/docker_env/web/Dockerfile index dc0cdb8..73fc4e7 100644 --- a/docker_env/web/Dockerfile +++ b/docker_env/web/Dockerfile @@ -1,4 +1,4 @@ -FROM registry.cn-zhangjiakou.aliyuncs.com/dvadmin-pro/dvadmin3-base-web:16.19-alpine +FROM registry.cn-zhangjiakou.aliyuncs.com/dvadmin-pro/dvadmin3-base-web:18.20-alpine WORKDIR /web/ COPY web/. . RUN yarn install --registry=https://registry.npmmirror.com From a030409c462841d2ac2d4b0b1fe4d0ba63f3363c Mon Sep 17 00:00:00 2001 From: liqiang <1206709430@qq.com> Date: Sun, 2 Mar 2025 00:05:44 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix(system):=20=E4=BF=AE=E5=A4=8D=E6=9D=83?= =?UTF-8?q?=E9=99=90=E8=8E=B7=E5=8F=96=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化权限查询逻辑,先判断菜单按钮对象是否存在 - 修复了在某些情况下可能导致权限获取失败的问题 --- backend/dvadmin/utils/filters.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/dvadmin/utils/filters.py b/backend/dvadmin/utils/filters.py index 4db96db..fa418be 100644 --- a/backend/dvadmin/utils/filters.py +++ b/backend/dvadmin/utils/filters.py @@ -22,7 +22,7 @@ from django_filters.rest_framework import DjangoFilterBackend from django_filters.utils import get_model_field from rest_framework.filters import BaseFilterBackend from django_filters.conf import settings -from dvadmin.system.models import Dept, ApiWhiteList, RoleMenuButtonPermission +from dvadmin.system.models import Dept, ApiWhiteList, RoleMenuButtonPermission, MenuButton from dvadmin.utils.models import CoreModel class CoreModelFilterBankend(BaseFilterBackend): @@ -149,13 +149,16 @@ class DataLevelPermissionsFilter(BaseFilterBackend): if _pk: # 判断是否是单例查询 re_api = re.sub(_pk,'{id}', api) role_id_list = request.user.role.values_list('id', flat=True) - role_permission_list=RoleMenuButtonPermission.objects.filter( - role__in=role_id_list, - role__status=1, - menu_button__api=re_api, - menu_button__method=method).values( - 'data_range' - ) + # 修复权限获取bug + menu_button_obj = MenuButton.objects.filter(api=re_api, method=method).first() + role_permission_list = [] + if menu_button_obj: + role_permission_list = RoleMenuButtonPermission.objects.filter( + role__in=role_id_list, + role__status=1, + menu_button=menu_button_obj).values( + 'data_range' + ) dataScope_list = [] # 权限范围列表 for ele in role_permission_list: # 判断用户是否为超级管理员角色/如果拥有[全部数据权限]则返回所有数据 From 2ab80758f0a6b20e658308699826dc27973fbd72 Mon Sep 17 00:00:00 2001 From: liqiang <1206709430@qq.com> Date: Sun, 2 Mar 2025 01:00:43 +0800 Subject: [PATCH 6/6] =?UTF-8?q?fix(permission):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=9D=83=E9=99=90=E8=8E=B7=E5=8F=96=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 MenuButton 查询结果改为 values_list,获取多个匹配项的 ID - 更新 RoleMenuButtonPermission 查询条件,支持多个菜单按钮 ID --- backend/dvadmin/utils/filters.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/dvadmin/utils/filters.py b/backend/dvadmin/utils/filters.py index fa418be..f61fc62 100644 --- a/backend/dvadmin/utils/filters.py +++ b/backend/dvadmin/utils/filters.py @@ -150,13 +150,13 @@ class DataLevelPermissionsFilter(BaseFilterBackend): re_api = re.sub(_pk,'{id}', api) role_id_list = request.user.role.values_list('id', flat=True) # 修复权限获取bug - menu_button_obj = MenuButton.objects.filter(api=re_api, method=method).first() + menu_button_ids = MenuButton.objects.filter(api=re_api,method=method).values_list('id', flat=True) role_permission_list = [] - if menu_button_obj: - role_permission_list = RoleMenuButtonPermission.objects.filter( + if menu_button_ids: + role_permission_list=RoleMenuButtonPermission.objects.filter( role__in=role_id_list, role__status=1, - menu_button=menu_button_obj).values( + menu_button_id__in=menu_button_ids).values( 'data_range' ) dataScope_list = [] # 权限范围列表