diff --git a/backend/src/main/java/io/dataease/auth/annotation/DeCleaner.java b/backend/src/main/java/io/dataease/auth/annotation/DeCleaner.java new file mode 100644 index 0000000000..40f9c57c26 --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/annotation/DeCleaner.java @@ -0,0 +1,14 @@ +package io.dataease.auth.annotation; + +import io.dataease.commons.constants.DePermissionType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface DeCleaner { + DePermissionType value(); +} diff --git a/backend/src/main/java/io/dataease/auth/aop/DeCleanerAnnotationHandler.java b/backend/src/main/java/io/dataease/auth/aop/DeCleanerAnnotationHandler.java new file mode 100644 index 0000000000..276d43b1ca --- /dev/null +++ b/backend/src/main/java/io/dataease/auth/aop/DeCleanerAnnotationHandler.java @@ -0,0 +1,74 @@ +package io.dataease.auth.aop; + + +import io.dataease.auth.annotation.DeCleaner; +import io.dataease.auth.api.dto.CurrentUserDto; +import io.dataease.commons.constants.AuthConstants; +import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.utils.AuthUtils; +import io.dataease.commons.utils.LogUtil; +import io.dataease.listener.util.CacheUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +@Aspect +@Component +public class DeCleanerAnnotationHandler { + + @Around(value = "@annotation(io.dataease.auth.annotation.DeCleaner)") + public Object CleanerAround(ProceedingJoinPoint point) { + try { + CurrentUserDto user = AuthUtils.getUser(); + MethodSignature ms = (MethodSignature) point.getSignature(); + Method method = ms.getMethod(); + DeCleaner deCleaner = method.getAnnotation(DeCleaner.class); + DePermissionType type = deCleaner.value(); + switch (type.name()) { + case "DATASOURCE": + cleanDataSource(); + break; + case "DATASET": + cleanDataSet(); + break; + default: + cleanPanel(); + break; + } + return point.proceed(point.getArgs()); + + }catch (Throwable e) { + LogUtil.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + + public void cleanPanel() { + CurrentUserDto user = AuthUtils.getUser(); + CacheUtils.remove(AuthConstants.USER_PANEL_NAME, "user" + user.getUserId()); + CacheUtils.remove(AuthConstants.DEPT_PANEL_NAME, "dept" + user.getDeptId()); + user.getRoles().forEach(role -> { + CacheUtils.remove(AuthConstants.ROLE_PANEL_NAME, "role" + role.getId()); + }); + } + public void cleanDataSet() { + CurrentUserDto user = AuthUtils.getUser(); + CacheUtils.remove(AuthConstants.USER_DATASET_NAME, "user" + user.getUserId()); + CacheUtils.remove(AuthConstants.DEPT_DATASET_NAME, "dept" + user.getDeptId()); + user.getRoles().forEach(role -> { + CacheUtils.remove(AuthConstants.ROLE_DATASET_NAME, "role" + role.getId()); + }); + } + public void cleanDataSource() { + CurrentUserDto user = AuthUtils.getUser(); + CacheUtils.remove(AuthConstants.USER_LINK_NAME, "user" + user.getUserId()); + CacheUtils.remove(AuthConstants.DEPT_LINK_NAME, "dept" + user.getDeptId()); + user.getRoles().forEach(role -> { + CacheUtils.remove(AuthConstants.ROLE_LINK_NAME, "role" + role.getId()); + }); + } +} diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java index f900cd4bc1..3828fbe35a 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java @@ -1,12 +1,15 @@ package io.dataease.auth.service.impl; +import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.auth.entity.AuthItem; import io.dataease.auth.service.ExtAuthService; import io.dataease.base.domain.SysAuth; import io.dataease.base.mapper.ext.ExtAuthMapper; import io.dataease.commons.constants.AuthConstants; import io.dataease.commons.model.AuthURD; +import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.LogUtil; +import io.dataease.listener.util.CacheUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -146,4 +149,7 @@ public class ExtAuthServiceImpl implements ExtAuthService { public void clearRoleResource(Long roleId) { LogUtil.info("all permission resource of role {} is cleanning...", roleId); } + + + } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.xml index b0498ecded..2fb26a2579 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.xml @@ -40,7 +40,7 @@ sys_auth a LEFT JOIN sys_auth_detail d on d.auth_id = a.id WHERE - auth_source_type = 'datasource' + auth_source_type = 'link' AND auth_target_type = 'user' AND auth_target = #{userId} AND d.privilege_value = 1 @@ -80,7 +80,7 @@ sys_auth a LEFT JOIN sys_auth_detail d on d.auth_id = a.id WHERE - auth_source_type = 'datasource' + auth_source_type = 'link' AND auth_target_type = 'role' AND auth_target = #{roleId} AND d.privilege_value = 1 @@ -119,7 +119,7 @@ sys_auth a LEFT JOIN sys_auth_detail d on d.auth_id = a.id WHERE - auth_source_type = 'datasource' + auth_source_type = 'link' AND auth_target_type = 'dept' AND auth_target = #{deptId} AND d.privilege_value = 1 diff --git a/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java b/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java index 5fc77ab5cf..30a7f3a2df 100644 --- a/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/AuthUtils.java @@ -4,6 +4,7 @@ import io.dataease.auth.api.dto.CurrentRoleDto; import io.dataease.auth.api.dto.CurrentUserDto; import io.dataease.auth.entity.AuthItem; import io.dataease.auth.service.ExtAuthService; +import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.commons.model.AuthURD; import org.apache.commons.lang3.StringUtils; @@ -56,7 +57,7 @@ public class AuthUtils { Long deptId = user.getDeptId(); List roles = user.getRoles(); Set result = new HashSet<>(); - if (StringUtils.equals("link", type)) { + if (StringUtils.equals(DePermissionType.DATASOURCE.name().toLowerCase(), type)) { Set userSet = extAuthService.dataSourceIdByUser(userId).stream().collect(Collectors.toSet()); Set roleSet = roles.stream().map(role -> extAuthService.dataSourceIdByRole(role.getId())).flatMap(Collection::stream).collect(Collectors.toSet()); Set deptSet = extAuthService.dataSourceIdByDept(deptId).stream().collect(Collectors.toSet()); @@ -69,7 +70,7 @@ public class AuthUtils { return result; } - else if (StringUtils.equals("dataset", type)) { + else if (StringUtils.equals(DePermissionType.DATASET.name().toLowerCase(), type)) { Set userSet = extAuthService.dataSetIdByUser(userId).stream().collect(Collectors.toSet()); Set roleSet = roles.stream().map(role -> extAuthService.dataSetIdByRole(role.getId())).flatMap(Collection::stream).collect(Collectors.toSet()); Set deptSet = extAuthService.dataSetIdByDept(deptId).stream().collect(Collectors.toSet()); @@ -81,7 +82,7 @@ public class AuthUtils { }); return result; } - else if (StringUtils.equals("panel", type)) { + else if (StringUtils.equals(DePermissionType.PANEL.name().toLowerCase(), type)) { Set userSet = extAuthService.panelIdByUser(userId).stream().collect(Collectors.toSet()); Set roleSet = roles.stream().map(role -> extAuthService.panelIdByRole(role.getId())).flatMap(Collection::stream).collect(Collectors.toSet()); Set deptSet = extAuthService.panelIdByDept(deptId).stream().collect(Collectors.toSet()); diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java index 0a52e11796..f4cdcff78b 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetGroupController.java @@ -1,13 +1,19 @@ package io.dataease.controller.dataset; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.auth.annotation.DePermission; +import io.dataease.auth.annotation.DePermissions; import io.dataease.base.domain.DatasetGroup; +import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.controller.request.dataset.DataSetGroupRequest; import io.dataease.dto.dataset.DataSetGroupDTO; import io.dataease.service.dataset.DataSetGroupService; import io.dataease.service.dataset.ExtractDataService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @@ -28,12 +34,18 @@ public class DataSetGroupController { @Resource private ExtractDataService extractDataService; + @RequiresPermissions("data:read") + @DePermissions(value = { + @DePermission(type = DePermissionType.DATASET, value = "id"), + @DePermission(type = DePermissionType.DATASET, value = "pid", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) + }, logical = Logical.AND) @ApiOperation("保存") @PostMapping("/save") public DataSetGroupDTO save(@RequestBody DatasetGroup datasetGroup) { return dataSetGroupService.save(datasetGroup); } + @RequiresPermissions("data:read") @ApiOperation("查询树") @PostMapping("/tree") public List tree(@RequestBody DataSetGroupRequest datasetGroup) { @@ -46,6 +58,8 @@ public class DataSetGroupController { return dataSetGroupService.treeNode(datasetGroup); } + @RequiresPermissions("data:read") + @DePermission(type = DePermissionType.DATASET, level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) @ApiOperation("删除") @PostMapping("/delete/{id}") public void tree(@PathVariable String id) throws Exception { diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java index 54841a4805..1a23f7b32a 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableController.java @@ -1,9 +1,13 @@ package io.dataease.controller.dataset; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.auth.annotation.DePermission; +import io.dataease.auth.annotation.DePermissions; import io.dataease.base.domain.DatasetTable; import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.DatasetTableIncrementalConfig; +import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.controller.request.dataset.DataSetTableRequest; import io.dataease.controller.response.DataSetDetail; import io.dataease.dto.datasource.TableFiled; @@ -11,6 +15,8 @@ import io.dataease.dto.dataset.DataSetTableDTO; import io.dataease.dto.dataset.ExcelFileData; import io.dataease.service.dataset.DataSetTableService; import io.swagger.annotations.*; +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -30,12 +36,24 @@ public class DataSetTableController { @Resource private DataSetTableService dataSetTableService; + @RequiresPermissions("data:read") + @DePermissions(value = { + @DePermission(type = DePermissionType.DATASET, value = "id"), + @DePermission(type = DePermissionType.DATASET, value = "sceneId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE), + @DePermission(type = DePermissionType.DATASOURCE, value = "dataSourceId", level = ResourceAuthLevel.DATASET_LEVEL_USE) + }, logical = Logical.AND) @ApiOperation("批量保存") @PostMapping("batchAdd") public void batchAdd(@RequestBody List datasetTable) throws Exception { dataSetTableService.batchInsert(datasetTable); } + @RequiresPermissions("data:read") + @DePermissions(value = { + @DePermission(type = DePermissionType.DATASET, value = "id", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE), + @DePermission(type = DePermissionType.DATASET, value = "sceneId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE), + @DePermission(type = DePermissionType.DATASOURCE, value = "dataSourceId", level = ResourceAuthLevel.DATASET_LEVEL_USE) + }, logical = Logical.AND) @ApiOperation("更新") @PostMapping("update") public void save(@RequestBody DataSetTableRequest datasetTable) throws Exception { @@ -46,12 +64,19 @@ public class DataSetTableController { } } + @RequiresPermissions("data:read") + @DePermissions(value = { + @DePermission(type = DePermissionType.DATASET, value = "id", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE), + @DePermission(type = DePermissionType.DATASET, value = "sceneId", level = ResourceAuthLevel.DATASET_LEVEL_MANAGE), + @DePermission(type = DePermissionType.DATASOURCE, value = "dataSourceId", level = ResourceAuthLevel.DATASET_LEVEL_USE) + }, logical = Logical.AND) @ApiOperation("修改") @PostMapping("alter") public void alter(@RequestBody DataSetTableRequest request) throws Exception { dataSetTableService.alter(request); } + @DePermission(type = DePermissionType.DATASET, level = ResourceAuthLevel.DATASET_LEVEL_MANAGE) @ApiOperation("删除") @PostMapping("delete/{id}") public void delete(@ApiParam(name = "id", value = "数据集ID", required = true) @PathVariable String id) throws Exception { @@ -70,6 +95,7 @@ public class DataSetTableController { return dataSetTableService.listAndGroup(dataSetTableRequest); } + @DePermission(type = DePermissionType.DATASET, level = ResourceAuthLevel.DATASET_LEVEL_USE) @ApiOperation("详息") @PostMapping("get/{id}") public DatasetTable get(@ApiParam(name = "id", value = "数据集ID", required = true) @PathVariable String id) { diff --git a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java index df0015db1d..240ddb768a 100644 --- a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java +++ b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java @@ -3,7 +3,11 @@ package io.dataease.controller.datasource; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.auth.annotation.DePermission; +import io.dataease.auth.annotation.DePermissions; import io.dataease.base.domain.Datasource; +import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.PageUtils; import io.dataease.commons.utils.Pager; @@ -15,6 +19,8 @@ import io.dataease.service.datasource.DatasourceService; import io.dataease.dto.DatasourceDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.Logical; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @@ -31,18 +37,24 @@ public class DatasourceController { @Resource private DatasourceService datasourceService; + @RequiresPermissions("datasource:add") + @DePermission(type = DePermissionType.DATASOURCE, value = "id") @ApiOperation("新增数据源") @PostMapping("/add") public Datasource addDatasource(@RequestBody Datasource datasource) throws Exception{ return datasourceService.addDatasource(datasource); } + @RequiresPermissions("datasource:read") + @DePermission(type = DePermissionType.DATASOURCE, value = "id") @ApiOperation("验证数据源") @PostMapping("/validate") public ResultHolder validate(@RequestBody Datasource datasource) throws Exception { return datasourceService.validate(datasource); } + @RequiresPermissions("datasource:read") + @DePermission(type = DePermissionType.DATASOURCE) @ApiOperation("验证数据源") @GetMapping("/validate/{datasourceId}") public ResultHolder validate(@PathVariable String datasourceId) { @@ -64,6 +76,7 @@ public class DatasourceController { return getDatasourceList().stream().filter(datasourceDTO -> datasourceDTO.getType().equalsIgnoreCase(type)).collect(Collectors.toList()); } + @RequiresPermissions("datasource:read") @ApiIgnore @PostMapping("/list/{goPage}/{pageSize}") public Pager> getDatasourceList(@RequestBody BaseGridRequest request, @PathVariable int goPage, @PathVariable int pageSize) throws Exception { @@ -71,12 +84,15 @@ public class DatasourceController { return PageUtils.setPageInfo(page, datasourceService.gridQuery(request)); } + @DePermission(type = DePermissionType.DATASOURCE, level = ResourceAuthLevel.LINK_LEVEL_MANAGE) @ApiOperation("删除数据源") @PostMapping("/delete/{datasourceID}") public void deleteDatasource(@PathVariable(value = "datasourceID") String datasourceID) throws Exception { datasourceService.deleteDatasource(datasourceID); } + @RequiresPermissions("datasource:add") + @DePermission(type = DePermissionType.DATASOURCE, value = "id", level = ResourceAuthLevel.LINK_LEVEL_MANAGE) @ApiOperation("更新数据源") @PostMapping("/update") public void updateDatasource(@RequestBody Datasource Datasource) { diff --git a/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java b/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java index 00adf25aa8..e3751a563c 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java @@ -11,6 +11,7 @@ import io.dataease.service.FileService; import io.dataease.service.system.EmailService; import io.dataease.service.system.SystemParameterService; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -39,11 +40,13 @@ public class SystemParameterController { private EmailService emailService; + @RequiresPermissions("sysparam:read") @GetMapping("/mail/info") public MailInfo mailInfo() { return emailService.mailInfo(); } + @RequiresPermissions("sysparam:read") @GetMapping("/basic/info") public BasicInfo basicInfo() { return systemParameterService.basicInfo(); @@ -55,11 +58,13 @@ public class SystemParameterController { return StringUtils.isNotBlank(basicInfo.getFrontTimeOut()) ? Integer.parseInt(basicInfo.getFrontTimeOut()) : 10; } + @RequiresPermissions("sysparam:read") @PostMapping("/edit/email") public void editMail(@RequestBody List systemParameter) { emailService.editMail(systemParameter); } + @RequiresPermissions("sysparam:read") @PostMapping("/edit/basic") public void editBasic(@RequestBody List systemParameter) { systemParameterService.editBasic(systemParameter); @@ -76,6 +81,7 @@ public class SystemParameterController { } + @RequiresPermissions("sysparam:read") @GetMapping("/base/info") public List getBaseInfo() { return systemParameterService.getSystemParameterInfo(ParamConstants.Classify.BASE.getValue()); diff --git a/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java b/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java index 5e1ee1769d..df49eba490 100644 --- a/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/ThemeServer.java @@ -3,6 +3,7 @@ package io.dataease.plugins.server; import java.util.List; import org.apache.commons.lang3.ObjectUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -36,6 +37,7 @@ public class ThemeServer { return themeXpackService.queryItems(themeId); } + @RequiresPermissions("sysparam:read") @PostMapping("/save") public void save(@RequestPart("request") ThemeRequest request, @RequestPart(value = "file", required = false) MultipartFile bodyFile) { @@ -55,6 +57,7 @@ public class ThemeServer { } + @RequiresPermissions("sysparam:read") @PostMapping("/delete/{themeId}") public void delete(@PathVariable("themeId") int themeId) { ThemeXpackService themeXpackService = SpringContextUtil.getBean(ThemeXpackService.class); diff --git a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java index dbfce409a2..2aec82d079 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java @@ -14,6 +14,7 @@ import io.dataease.plugins.xpack.auth.dto.response.XpackSysAuthDetailDTO; import io.dataease.plugins.xpack.auth.dto.response.XpackVAuthModelDTO; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import io.dataease.plugins.xpack.auth.service.AuthXpackService; @@ -25,6 +26,7 @@ public class XAuthServer { private static final Set cacheTypes = new HashSet<>(); + @RequiresPermissions("auth:read") @PostMapping("/authModels") @I18n public List authModels(@RequestBody XpackBaseTreeRequest request) { @@ -33,12 +35,14 @@ public class XAuthServer { return sysAuthService.searchAuthModelTree(request, user.getUserId(), user.getIsAdmin()); } + @RequiresPermissions("auth:read") @PostMapping("/authDetails") public Map> authDetails(@RequestBody XpackSysAuthRequest request) { AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class); return sysAuthService.searchAuthDetails(request); } + @RequiresPermissions("auth:read") @GetMapping("/authDetailsModel/{authType}/{direction}") @I18n public List authDetailsModel(@PathVariable String authType, @PathVariable String direction) { @@ -54,6 +58,7 @@ public class XAuthServer { return authDetails; } + @RequiresPermissions("auth:read") @PostMapping("/authChange") public void authChange(@RequestBody XpackSysAuthRequest request) { AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class); diff --git a/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java b/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java index 76dc14c8eb..0c3b911405 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XDeptServer.java @@ -14,6 +14,7 @@ import io.dataease.plugins.xpack.dept.dto.response.XpackSysDept; import io.dataease.plugins.xpack.dept.service.DeptXpackService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @@ -66,6 +67,7 @@ public class XDeptServer { return nodes; } + @RequiresPermissions("dept:add") @ApiOperation("创建") @PostMapping("/create") public int create(@RequestBody XpackCreateDept dept){ @@ -73,6 +75,7 @@ public class XDeptServer { return deptService.add(dept); } + @RequiresPermissions("dept:del") @ApiOperation("删除") @PostMapping("/delete") public void delete(@RequestBody List requests){ @@ -83,6 +86,7 @@ public class XDeptServer { deptService.batchDelete(requests); } + @RequiresPermissions("dept:edit") @ApiOperation("更新") @PostMapping("/update") public int update(@RequestBody XpackCreateDept dept){ @@ -91,6 +95,7 @@ public class XDeptServer { } + @RequiresPermissions("dept:del") @ApiIgnore @ApiOperation("删除") @PostMapping("/nodesByDeptId/{deptId}") diff --git a/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java b/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java index 36e26fc1bb..b689183768 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XDisplayServer.java @@ -4,6 +4,7 @@ package io.dataease.plugins.server; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; import io.dataease.plugins.xpack.display.service.DisplayXpackService; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -22,6 +23,7 @@ public class XDisplayServer { return disPlayXpackService.systemSettings(); } + @RequiresPermissions("sysparam:read") @PostMapping(value="/save", consumes = {"multipart/form-data"}) public void saveUIInfo(@RequestPart("request") Map> systemParameterMap, @RequestPart(value = "files", required = false) List bodyFiles) throws Exception { DisplayXpackService disPlayXpackService = SpringContextUtil.getBean(DisplayXpackService.class); diff --git a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java index 31595ae413..317fe48079 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -20,6 +20,7 @@ import io.dataease.service.ScheduleService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -39,6 +40,7 @@ public class XEmailTaskServer { @Resource private PriorityThreadPoolExecutor priorityExecutor; + @RequiresPermissions("task-email:read") @PostMapping("/queryTasks/{goPage}/{pageSize}") public Pager> queryTask(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody XpackGridRequest request) { @@ -71,6 +73,7 @@ public class XEmailTaskServer { return listPager; } + @RequiresPermissions("task-email:add") @PostMapping("/save") public void save(@RequestBody XpackEmailCreate param) throws Exception { XpackEmailTaskRequest request = param.fillContent(); @@ -81,6 +84,7 @@ public class XEmailTaskServer { scheduleService.addSchedule(globalTask); } + @RequiresPermissions("task-email:read") @PostMapping("/queryForm/{taskId}") public XpackEmailCreate queryForm(@PathVariable Long taskId) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); @@ -141,6 +145,7 @@ public class XEmailTaskServer { } + @RequiresPermissions("task-email:del") @PostMapping("/delete/{taskId}") public void delete(@PathVariable Long taskId) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); diff --git a/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java b/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java index 2a6c2c7d6a..44f77c9833 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java @@ -6,6 +6,7 @@ import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; import io.dataease.plugins.xpack.ldap.dto.response.LdapInfo; import io.dataease.plugins.xpack.ldap.service.LdapXpackService; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -21,6 +22,7 @@ public class XLdapServer { return ldapXpackService.info(); } + @RequiresPermissions("sysparam:read") @PostMapping("/save") public void save(@RequestBody List settings) { LdapXpackService ldapXpackService = SpringContextUtil.getBean(LdapXpackService.class); diff --git a/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java index becea9e55a..bf600f0aae 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java @@ -5,6 +5,7 @@ import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; import io.dataease.plugins.xpack.oidc.service.OidcXpackService; import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; @@ -21,6 +22,7 @@ public class XOidcServer { return oidcXpackService.oidcSettings(); } + @RequiresPermissions("sysparam:read") @PostMapping("/save") public void save(@RequestBody List settings) { OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class); diff --git a/backend/src/main/java/io/dataease/plugins/server/XRoleServer.java b/backend/src/main/java/io/dataease/plugins/server/XRoleServer.java index e3ba4da452..200a00155f 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XRoleServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XRoleServer.java @@ -13,6 +13,7 @@ import io.dataease.plugins.xpack.role.dto.response.XpackRoleItemDto; import io.dataease.plugins.xpack.role.service.RoleXpackService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @@ -26,6 +27,7 @@ public class XRoleServer { @Autowired private ExtAuthService extAuthService; + @RequiresPermissions("role:add") @ApiOperation("新增角色") @PostMapping("/create") public void create(@RequestBody XpackRoleDto role){ @@ -34,6 +36,7 @@ public class XRoleServer { } + @RequiresPermissions("role:del") @ApiOperation("删除角色") @PostMapping("/delete/{roleId}") public void delete(@PathVariable("roleId") Long roleId){ @@ -43,6 +46,7 @@ public class XRoleServer { } + @RequiresPermissions("role:edit") @ApiOperation("更新角色") @PostMapping("/update") public void update(@RequestBody XpackRoleDto role){ @@ -50,6 +54,7 @@ public class XRoleServer { roleXpackService.update(role); } + @RequiresPermissions("role:read") @ApiOperation("分页查询") @PostMapping("/roleGrid/{goPage}/{pageSize}") public Pager> roleGrid(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody XpackGridRequest request) { diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java index 2a5f04ec2f..a6b42f3038 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetGroupService.java @@ -1,9 +1,11 @@ package io.dataease.service.dataset; +import io.dataease.auth.annotation.DeCleaner; import io.dataease.base.domain.DatasetGroup; import io.dataease.base.domain.DatasetGroupExample; import io.dataease.base.mapper.DatasetGroupMapper; import io.dataease.base.mapper.ext.ExtDataSetGroupMapper; +import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.TreeUtils; @@ -39,6 +41,7 @@ public class DataSetGroupService { @Resource private SysAuthService sysAuthService; + @DeCleaner(DePermissionType.DATASET) public DataSetGroupDTO save(DatasetGroup datasetGroup) { checkName(datasetGroup); if (StringUtils.isEmpty(datasetGroup.getId())) { diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java index c709074ebf..de0b6e37de 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -2,10 +2,12 @@ package io.dataease.service.datasource; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; +import io.dataease.auth.annotation.DeCleaner; import io.dataease.base.domain.*; import io.dataease.base.mapper.*; import io.dataease.base.mapper.ext.ExtDataSourceMapper; import io.dataease.base.mapper.ext.query.GridExample; +import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.exception.DEException; import io.dataease.commons.model.AuthURD; import io.dataease.commons.utils.AuthUtils; @@ -51,6 +53,7 @@ public class DatasourceService { @Resource private CommonThreadPool commonThreadPool; + @DeCleaner(DePermissionType.DATASOURCE) public Datasource addDatasource(Datasource datasource) throws Exception{ checkName(datasource); long currentTimeMillis = System.currentTimeMillis(); diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index eee054f986..a21b6c4551 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -1,5 +1,6 @@ package io.dataease.service.panel; +import io.dataease.auth.annotation.DeCleaner; import io.dataease.base.domain.*; import io.dataease.base.mapper.ChartViewMapper; import io.dataease.base.mapper.PanelGroupMapper; @@ -7,6 +8,7 @@ import io.dataease.base.mapper.VAuthModelMapper; import io.dataease.base.mapper.ext.ExtPanelGroupMapper; import io.dataease.base.mapper.ext.ExtPanelLinkJumpMapper; import io.dataease.base.mapper.ext.ExtVAuthModelMapper; +import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.constants.PanelConstants; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.TreeUtils; @@ -83,6 +85,7 @@ public class PanelGroupService { return TreeUtils.mergeTree(panelGroupDTOList, "default_panel"); } + @DeCleaner(DePermissionType.PANEL) @Transactional public PanelGroup saveOrUpdate(PanelGroupRequest request) { try { diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index 74903dd566..a2f3bd3cd1 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -16,8 +16,15 @@ {{ $t('chart.chart_error_tips') }} + - +
@@ -82,10 +89,11 @@ import ChartComponentG2 from '@/views/chart/components/ChartComponentG2' import EditBarView from '@/components/canvas/components/Editor/EditBarView' import { customAttrTrans, customStyleTrans, recursionTransObj } from '@/components/canvas/utils/style' import ChartComponentS2 from '@/views/chart/components/ChartComponentS2' - +import { pluginTypes } from '@/api/chart/chart' +import PluginCom from '@/views/system/plugin/PluginCom' export default { name: 'UserView', - components: { ChartComponentS2, EditBarView, ChartComponent, TableNormal, LabelNormal, DrillPath, ChartComponentG2 }, + components: { PluginCom, ChartComponentS2, EditBarView, ChartComponent, TableNormal, LabelNormal, DrillPath, ChartComponentG2 }, props: { element: { type: Object, @@ -108,6 +116,7 @@ export default { required: false, default: false }, + // eslint-disable-next-line vue/require-default-prop componentIndex: { type: Number, required: false @@ -153,7 +162,9 @@ export default { pre: null, preCanvasPanel: null, sourceCustomAttrStr: null, - sourceCustomStyleStr: null + sourceCustomStyleStr: null, + isPlugin: false, + plugins: [] } }, computed: { @@ -260,6 +271,7 @@ export default { }, watch: { + 'cfilters': { handler: function(val1, val2) { if (isChange(val1, val2) && !this.isFirstLoad) { @@ -320,6 +332,7 @@ export default { } }, 'chartType': function(newVal, oldVal) { + this.isPlugin = this.plugins.some(plugin => plugin.value === this.chart.type) if (newVal === 'map' && newVal !== oldVal) { this.initAreas() } @@ -334,6 +347,12 @@ export default { deep: true } }, + beforeCreate() { + pluginTypes().then(res => { + this.plugins = res.data + this.isPlugin = this.plugins.some(plugin => plugin.value === this.chart.type) + }) + }, created() { this.refId = uuid.v1 if (this.element && this.element.propValue && this.element.propValue.viewId) { diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 5a5221100a..17460c1dcc 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -1022,7 +1022,8 @@ export default { table_column_adapt: 'Adapt', table_column_custom: 'Custom', chart_table_pivot: 'Pivot Table', - table_pivot_row: 'Data Row' + table_pivot_row: 'Data Row', + field_error_tips: 'This field is changed(Include dimension、quota,field type,deleted),please edit again.' }, dataset: { sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 2c1451ad1e..8d27954f15 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -1022,7 +1022,8 @@ export default { table_column_adapt: '自適應', table_column_custom: '自定義', chart_table_pivot: '透視表', - table_pivot_row: '數據行' + table_pivot_row: '數據行', + field_error_tips: '該字段所對應的數據集原始字段發生變更(包括維度、指標,字段類型,字段被刪除等),建議重新編輯' }, dataset: { sheet_warn: '有多個 Sheet 頁,默認抽取第一個', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index bcd59ca48b..8706d7c50d 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -1024,7 +1024,8 @@ export default { table_column_adapt: '自适应', table_column_custom: '自定义', chart_table_pivot: '透视表', - table_pivot_row: '数据行' + table_pivot_row: '数据行', + field_error_tips: '该字段所对应的数据集原始字段发生变更(包括维度、指标,字段类型,字段被删除等),建议重新编辑' }, dataset: { sheet_warn: '有多个 Sheet 页,默认抽取第一个', diff --git a/frontend/src/views/chart/chart/common/common_table.js b/frontend/src/views/chart/chart/common/common_table.js index 5c0bc86d8d..8a98c6986a 100644 --- a/frontend/src/views/chart/chart/common/common_table.js +++ b/frontend/src/views/chart/chart/common/common_table.js @@ -106,7 +106,7 @@ export function getSize(chart) { size.cellCfg = { height: s.tableItemHeight } - if (!s.tableColumnMode || s.tableColumnMode === 'adapt') { + if (s.tableColumnMode && s.tableColumnMode === 'adapt') { delete size.cellCfg.width size.layoutWidthType = 'compact' } else { diff --git a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue index 8fded96dda..da927853f9 100644 --- a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue +++ b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue @@ -1,6 +1,6 @@ + + diff --git a/frontend/src/views/chart/components/drag-item/utils.js b/frontend/src/views/chart/components/drag-item/utils.js new file mode 100644 index 0000000000..8ed6a57939 --- /dev/null +++ b/frontend/src/views/chart/components/drag-item/utils.js @@ -0,0 +1,33 @@ +export function getItemType(dimensionData, quotaData, item) { + // 将item的字段在数据集维度、指标字段中查询一遍,如果遇到id不存在、字段类型不一致、维度指标不一致,则提示 + const status = item.groupType + let checked = false + if (status === 'd') { + for (let i = 0; i < dimensionData.length; i++) { + const ele = dimensionData[i] + if (ele.id === item.id && ele.deType === item.deType && ele.groupType === item.groupType) { + checked = true + break + } + } + } + if (status === 'q') { + for (let i = 0; i < quotaData.length; i++) { + const ele = quotaData[i] + if (ele.id === item.id && ele.deType === item.deType && ele.groupType === item.groupType) { + checked = true + break + } + } + } + + if (checked) { + if (status === 'd') { + return '' + } else if (status === 'q') { + return 'success' + } + } else { + return 'danger' + } +} diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 75abeb94f1..e7c85caaa6 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -271,6 +271,8 @@ :param="param" :index="index" :item="item" + :dimension-data="dimensionData" + :quota-data="quotaData" @onDimensionItemChange="dimensionItemChange" @onDimensionItemRemove="dimensionItemRemove" @editItemFilter="showDimensionEditFilter" @@ -323,6 +325,8 @@ :param="param" :index="index" :item="item" + :dimension-data="dimensionData" + :quota-data="quotaData" @onDimensionItemChange="dimensionItemChange" @onDimensionItemRemove="dimensionItemRemove" @editItemFilter="showDimensionEditFilter" @@ -376,6 +380,8 @@ :index="index" :item="item" :chart="chart" + :dimension-data="dimensionData" + :quota-data="quotaData" @onQuotaItemChange="quotaItemChange" @onQuotaItemRemove="quotaItemRemove" @editItemFilter="showQuotaEditFilter" @@ -413,6 +419,8 @@ :index="index" :item="item" :chart="chart" + :dimension-data="dimensionData" + :quota-data="quotaData" @onQuotaItemChange="quotaItemChange" @onQuotaItemRemove="quotaItemRemove" @editItemFilter="showQuotaEditFilter" @@ -450,6 +458,8 @@ :param="param" :index="index" :item="item" + :dimension-data="dimensionData" + :quota-data="quotaData" @onItemChange="stackItemChange" @onItemRemove="stackItemRemove" /> @@ -490,6 +500,8 @@ :param="param" :index="index" :item="item" + :dimension-data="dimensionData" + :quota-data="quotaData" @onItemChange="bubbleItemChange" @onItemRemove="bubbleItemRemove" /> @@ -522,6 +534,8 @@ :param="param" :index="index" :item="item" + :dimension-data="dimensionData" + :quota-data="quotaData" @onFilterItemRemove="filterItemRemove" @editItemFilter="showEditFilter" /> @@ -558,6 +572,8 @@ :param="param" :index="index" :item="item" + :dimension-data="dimensionData" + :quota-data="quotaData" @onDimensionItemChange="drillItemChange" @onDimensionItemRemove="drillItemRemove" /> @@ -568,7 +584,6 @@ - diff --git a/mobile/src/pages.json b/mobile/src/pages.json index 37fcdcbc57..247f83315a 100644 --- a/mobile/src/pages.json +++ b/mobile/src/pages.json @@ -27,19 +27,9 @@ "style": { "navigationBarTitleText": "", "app-plus": { - "titleNView": { - "type": "transparent", - "buttons": [{ - "type": "share" - }] - } - }, - "h5": { - "titleNView": { - "type": "transparent", - "buttons": [] - } - } + "titleNView": false, + "bounce": "none" + } } }, { diff --git a/mobile/src/pages/tabBar/home/detail.nvue b/mobile/src/pages/tabBar/home/detail.nvue index 9f92ddb352..f99e72806c 100644 --- a/mobile/src/pages/tabBar/home/detail.nvue +++ b/mobile/src/pages/tabBar/home/detail.nvue @@ -1,33 +1,36 @@