diff --git a/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java b/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java index 03210c35df..782416b29a 100644 --- a/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java +++ b/backend/src/main/java/io/dataease/plugins/server/RowPermissionsController.java @@ -4,6 +4,7 @@ import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.dataease.commons.utils.PageUtils; import io.dataease.commons.utils.Pager; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.entity.XpackConditionEntity; import io.dataease.plugins.common.entity.XpackGridRequest; import io.dataease.plugins.config.SpringContextUtil; @@ -11,6 +12,7 @@ import io.dataease.plugins.xpack.auth.dto.request.DataSetRowPermissionsDTO; import io.dataease.plugins.xpack.auth.dto.request.DatasetRowPermissions; import io.dataease.plugins.xpack.auth.service.RowPermissionService; import io.swagger.annotations.ApiOperation; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; @@ -24,6 +26,13 @@ public class RowPermissionsController { @PostMapping("save") public void save(@RequestBody DatasetRowPermissions datasetRowPermissions) throws Exception { RowPermissionService rowPermissionService = SpringContextUtil.getBean(RowPermissionService.class); + DataSetRowPermissionsDTO request = new DataSetRowPermissionsDTO(); + request.setAuthTargetType(datasetRowPermissions.getAuthTargetType()); + request.setAuthTargetId(datasetRowPermissions.getAuthTargetId()); + request.setDatasetFieldId(datasetRowPermissions.getDatasetFieldId()); + if(!CollectionUtils.isEmpty(rowPermissionService.searchRowPermissions(request))){ + throw new Exception(Translator.get("i18n_rp_exist")); + } rowPermissionService.save(datasetRowPermissions); } diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index d374217845..73b1fa82b3 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -504,6 +504,9 @@ public class DataSetTableService { List customFilter = new ArrayList<>(); for (DatasetRowPermissions datasetRowPermissions : rowPermissions(datasetTable.getId(), user)) { ChartFieldCustomFilterDTO dto = new ChartFieldCustomFilterDTO(); + if(StringUtils.isEmpty(datasetRowPermissions.getDatasetFieldId())){ + continue; + } DatasetTableField field = getFieldById(fields, datasetRowPermissions.getDatasetFieldId()); if (field == null) { continue; @@ -512,6 +515,9 @@ public class DataSetTableService { dto.setId(field.getId()); dto.setFilterType(datasetRowPermissions.getFilterType()); if (datasetRowPermissions.getFilterType().equalsIgnoreCase("logic")) { + if(StringUtils.isEmpty(datasetRowPermissions.getFilter())){ + continue; + } List lists = JSONObject.parseArray(datasetRowPermissions.getFilter(), ChartCustomFilterItemDTO.class); lists.forEach(chartCustomFilterDTO -> { chartCustomFilterDTO.setFieldId(field.getId()); @@ -520,6 +526,9 @@ public class DataSetTableService { dto.setLogic(datasetRowPermissions.getLogic()); customFilter.add(dto); } else { + if(StringUtils.isEmpty(datasetRowPermissions.getEnumCheckField())){ + continue; + } dto.setEnumCheckField(Arrays.asList(datasetRowPermissions.getEnumCheckField().split(",").clone())); customFilter.add(dto); } diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index de2d2dfdd5..8a7ed5cdd5 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -296,4 +296,5 @@ i18n_sql_error=SQL Error: i18n_invalid_ds=Invalid Datasource 任务管理=Task Manager 数据同步=Data Sync -定时报告=Regular report \ No newline at end of file +定时报告=Regular report +i18n_rp_exist=Row permission of the same type already exists \ No newline at end of file diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 301f998c00..10b984dd9d 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -295,4 +295,5 @@ i18n_sql_error=SQL 错误: i18n_invalid_ds=无效数据源 任务管理=任务管理 数据同步=数据同步 -定时报告=定时报告 \ No newline at end of file +定时报告=定时报告 +i18n_rp_exist=已有同类型的行权限存在 \ No newline at end of file diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 9c65f0c845..1cff76bac6 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -298,4 +298,5 @@ i18n_sql_error=SQL 錯誤: i18n_invalid_ds=無效數據源 任务管理=任務管理 数据同步=數據同步 -定时报告=定時報告 \ No newline at end of file +定时报告=定時報告 +i18n_rp_exist=已有同類型餓行權限存在 \ No newline at end of file diff --git a/frontend/src/permission.js b/frontend/src/permission.js index e10d9f53e2..34b6ec4644 100644 --- a/frontend/src/permission.js +++ b/frontend/src/permission.js @@ -3,19 +3,34 @@ import store from './store' // import { Message } from 'element-ui' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style -import { getToken } from '@/utils/auth' // get token from cookie +import { + getToken +} from '@/utils/auth' // get token from cookie import getPageTitle from '@/utils/get-page-title' -import { buildMenus } from '@/api/system/menu' -import { filterAsyncRouter } from '@/store/modules/permission' +import { + buildMenus +} from '@/api/system/menu' +import { + filterAsyncRouter +} from '@/store/modules/permission' +import { + isMobile +} from '@/utils/index' // import bus from './utils/bus' -NProgress.configure({ showSpinner: false }) // NProgress Configuration +NProgress.configure({ + showSpinner: false +}) // NProgress Configuration const whiteList = ['/login', '/401', '/404', '/delink', '/nolic'] // no redirect whitelist router.beforeEach(async(to, from, next) => { // start progress bar NProgress.start() + if (isMobile()) { + window.location.href = window.origin + '/app.html' + NProgress.done() + } // set page title document.title = getPageTitle(to.meta.title) @@ -25,7 +40,9 @@ router.beforeEach(async(to, from, next) => { if (hasToken) { if (to.path === '/login') { // if is logged in, redirect to the home page - next({ path: '/' }) + next({ + path: '/' + }) NProgress.done() } else { const hasGetUserInfo = store.getters.name @@ -77,11 +94,18 @@ export const loadMenus = (next, to) => { const datas = res.data const filterDatas = filterRouter(datas) const asyncRouter = filterAsyncRouter(filterDatas) - asyncRouter.push({ path: '*', redirect: '/404', hidden: true }) + asyncRouter.push({ + path: '*', + redirect: '/404', + hidden: true + }) store.dispatch('permission/GenerateRoutes', asyncRouter).then(() => { // 存储路由 router.addRoutes(asyncRouter) if (pathValid(to.path, asyncRouter)) { - next({ ...to, replace: true }) + next({ + ...to, + replace: true + }) } else { next('/') } diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index fc64745598..522d66097f 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -1,4 +1,3 @@ - import Cookies from 'js-cookie' export function timeSection(date, type) { if (!date) { @@ -98,7 +97,9 @@ export function parseTime(time, cFormat) { const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { const value = formatObj[key] // Note: getDay() returns 0 on Sunday - if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } + if (key === 'a') { + return ['日', '一', '二', '三', '四', '五', '六'][value] + } return value.toString().padStart(2, '0') }) return time_str @@ -115,19 +116,19 @@ export function hasClass(ele, cls) { } /** - * Add class to element - * @param {HTMLElement} elm - * @param {string} cls - */ + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ export function addClass(ele, cls) { if (!hasClass(ele, cls)) ele.className += ' ' + cls } /** - * Remove class from element - * @param {HTMLElement} elm - * @param {string} cls - */ + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ export function removeClass(ele, cls) { if (hasClass(ele, cls)) { const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') @@ -189,12 +190,12 @@ export function param2Obj(url) { } return JSON.parse( '{"' + - decodeURIComponent(search) - .replace(/"/g, '\\"') - .replace(/&/g, '","') - .replace(/=/g, '":"') - .replace(/\+/g, ' ') + - '"}' + decodeURIComponent(search) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + .replace(/\+/g, ' ') + + '"}' ) } @@ -216,7 +217,9 @@ export function formatCondition(param) { if (!param) { return null } - const result = { conditions: [] } + const result = { + conditions: [] + } // eslint-disable-next-line no-unused-vars for (const [key, value] of Object.entries(param)) { result.conditions.push(value) @@ -273,13 +276,19 @@ export function getQueryVariable(variable) { if (!query) { query = Cookies.get(variable) } - if (query !== undefined){ + if (query !== undefined) { const vars = query.split('&') for (var i = 0; i < vars.length; i++) { const pair = vars[i].split('=') - if (pair[0] === variable) { return pair[1] } + if (pair[0] === variable) { + return pair[1] + } } } return (false) } +export function isMobile() { + const flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i) + return flag +}