From a0ee331fdc4a0abd037dd720769eca9420a91f12 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Wed, 3 Jan 2024 15:54:01 +0800 Subject: [PATCH 01/51] =?UTF-8?q?fix:=E3=80=90=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E3=80=91=E9=87=8D=E5=91=BD=E5=90=8D=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E4=B8=8E=E7=BC=96=E8=BE=91=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E5=90=8D=E7=A7=B0=E9=95=BF=E5=BA=A6=E9=99=90=E5=88=B6?= =?UTF-8?q?=E8=A7=84=E5=88=99=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../visualized/data/datasource/form/ApiHttpRequestDraw.vue | 2 +- .../src/views/visualized/data/datasource/form/EditorDetail.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue index c8b20e0c0c..c0088da9fd 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/ApiHttpRequestDraw.vue @@ -103,7 +103,7 @@ const rule = reactive({ }, { min: 2, - max: 25, + max: 64, message: t('datasource.input_limit_2_25', [2, 64]), trigger: 'blur' } diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue index e93bd17883..56a5c084f7 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue @@ -64,7 +64,7 @@ const defaultRule = { }, { min: 2, - max: 25, + max: 64, message: t('datasource.input_limit_2_25', [2, 64]), trigger: 'blur' } From 53c9d1731e53b2b013efbd5fdca3777c256d60e2 Mon Sep 17 00:00:00 2001 From: jianneng-fit2cloud Date: Wed, 10 Jan 2024 17:21:08 +0800 Subject: [PATCH 02/51] =?UTF-8?q?feat(=E7=B3=BB=E7=BB=9F=E7=AE=A1=E7=90=86?= =?UTF-8?q?-=E5=90=8C=E6=AD=A5=E7=AE=A1=E7=90=86):?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.添加目标数据源同步到数据准备 2.UI调整 --- .../main/resources/i18n/core_zh_CN.properties | 2 +- .../src/api/sync/syncDatasource.ts | 47 ++++ .../core-frontend/src/api/sync/syncSummary.ts | 26 ++ core/core-frontend/src/api/sync/syncTask.ts | 224 ++++++++++++++++++ .../core-frontend/src/api/sync/syncTaskLog.ts | 20 ++ .../svg/icon_sync_close_log_details.svg | 3 + .../src/assets/svg/icon_sync_datasource.svg | 16 ++ .../src/assets/svg/icon_sync_log_number.svg | 17 ++ .../assets/svg/icon_sync_logs_outlined.svg | 3 + .../svg/icon_sync_target_to_datasource.svg | 3 + .../src/assets/svg/icon_sync_task_number.svg | 17 ++ .../drawer-filter/src/DrawerTimeFilter.vue | 182 ++++++-------- .../components/drawer-main/src/DrawerMain.vue | 6 +- core/core-frontend/src/locales/zh-CN.ts | 51 ++++ sdk/api/api-sync/pom.xml | 20 ++ .../datasource/api/SyncDatasourceApi.java | 80 +++++++ .../api/sync/datasource/dto/DBTableDTO.java | 18 ++ .../datasource/dto/GetDatasourceRequest.java | 25 ++ .../datasource/dto/SyncDatasourceDTO.java | 61 +++++ .../sync/datasource/vo/SyncDatasourceVO.java | 57 +++++ .../api/sync/summary/api/SummaryApi.java | 26 ++ .../dataease/api/sync/task/api/TaskApi.java | 52 ++++ .../api/sync/task/api/TaskLogApi.java | 39 +++ .../io/dataease/api/sync/task/dto/Source.java | 23 ++ .../api/sync/task/dto/TableField.java | 22 ++ .../io/dataease/api/sync/task/dto/Target.java | 21 ++ .../api/sync/task/dto/TaskInfoDTO.java | 112 +++++++++ .../api/sync/task/vo/LogResultVO.java | 46 ++++ .../dataease/api/sync/task/vo/TaskInfoVO.java | 132 +++++++++++ .../dataease/api/sync/task/vo/TaskLogVO.java | 25 ++ sdk/api/pom.xml | 1 + .../dataease/constant/AuthResourceEnum.java | 2 +- 32 files changed, 1261 insertions(+), 118 deletions(-) create mode 100644 core/core-frontend/src/api/sync/syncDatasource.ts create mode 100644 core/core-frontend/src/api/sync/syncSummary.ts create mode 100644 core/core-frontend/src/api/sync/syncTask.ts create mode 100644 core/core-frontend/src/api/sync/syncTaskLog.ts create mode 100644 core/core-frontend/src/assets/svg/icon_sync_close_log_details.svg create mode 100644 core/core-frontend/src/assets/svg/icon_sync_datasource.svg create mode 100644 core/core-frontend/src/assets/svg/icon_sync_log_number.svg create mode 100644 core/core-frontend/src/assets/svg/icon_sync_logs_outlined.svg create mode 100644 core/core-frontend/src/assets/svg/icon_sync_target_to_datasource.svg create mode 100644 core/core-frontend/src/assets/svg/icon_sync_task_number.svg create mode 100644 sdk/api/api-sync/pom.xml create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/api/SyncDatasourceApi.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/DBTableDTO.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/GetDatasourceRequest.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/SyncDatasourceDTO.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/vo/SyncDatasourceVO.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/summary/api/SummaryApi.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskApi.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskLogApi.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Source.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TableField.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Target.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TaskInfoDTO.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskInfoVO.java create mode 100644 sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskLogVO.java diff --git a/core/core-backend/src/main/resources/i18n/core_zh_CN.properties b/core/core-backend/src/main/resources/i18n/core_zh_CN.properties index d2f6d4d8c5..926674c050 100644 --- a/core/core-backend/src/main/resources/i18n/core_zh_CN.properties +++ b/core/core-backend/src/main/resources/i18n/core_zh_CN.properties @@ -20,7 +20,7 @@ i18n_menu.org=\u7EC4\u7EC7\u7BA1\u7406 i18n_menu.auth=\u6743\u9650\u914D\u7F6E i18n_menu.sync=\u540C\u6B65\u7BA1\u7406 i18n_menu.summary=\u6982\u89C8 -i18n_menu.ds=\u6570\u636E\u6E90\u7BA1\u7406 +i18n_menu.ds=\u6570\u636e\u8fde\u63a5\u7ba1\u7406 i18n_menu.task=\u4EFB\u52A1\u7BA1\u7406 i18n_menu.embedded=\u5D4C\u5165\u5F0F\u7BA1\u7406 i18n_menu.platform=\u5E73\u53F0\u5BF9\u63A5 diff --git a/core/core-frontend/src/api/sync/syncDatasource.ts b/core/core-frontend/src/api/sync/syncDatasource.ts new file mode 100644 index 0000000000..5a9686c8fd --- /dev/null +++ b/core/core-frontend/src/api/sync/syncDatasource.ts @@ -0,0 +1,47 @@ +import request from '@/config/axios' + +export const sourceDsPageApi = (page: number, limit: number, data) => { + return request.post({ url: `/sync/datasource/source/pager/${page}/${limit}`, data }) +} + +export const targetDsPageApi = (page: number, limit: number, data) => { + return request.post({ url: `/sync/datasource/target/pager/${page}/${limit}`, data }) +} +export const latestUseApi = () => { + return request.post({ url: '/sync/datasource/latestUse', data: {} }) +} + +export const validateApi = data => { + return request.post({ url: '/sync/datasource/validate', data }) +} + +export const getSchemaApi = data => { + return request.post({ url: '/sync/datasource/getSchema', data }) +} + +export const saveApi = data => { + return request.post({ url: '/sync/datasource/save', data }) +} + +export const getByIdApi = (id: string) => { + return request.get({ url: `/sync/datasource/get/${id}` }) +} + +export const updateApi = data => { + return request.post({ url: '/sync/datasource/update', data }) +} + +export const deleteByIdApi = (id: string) => { + return request.post({ url: `/sync/datasource/delete/${id}` }) +} + +export const batchDelApi = (ids: string[]) => { + return request.post({ url: `/sync/datasource/batchDel`, data: ids }) +} + +/** + * 获取源数据库字段集合以及目标数据库数据类型集合 + */ +export const getFieldListApi = data => { + return request.post({ url: `/sync/datasource/fields`, data }) +} diff --git a/core/core-frontend/src/api/sync/syncSummary.ts b/core/core-frontend/src/api/sync/syncSummary.ts new file mode 100644 index 0000000000..801c83f963 --- /dev/null +++ b/core/core-frontend/src/api/sync/syncSummary.ts @@ -0,0 +1,26 @@ +import request from '@/config/axios' + +interface IResourceCount { + jobCount: number + datasourceCount: number + jobLogCount: number +} + +export const getResourceCount = () => { + return request + .get({ + url: 'sync/summary/resourceCount', + method: 'get' + }) + .then(res => { + return res.data as IResourceCount + }) +} + +export const getJobLogLienChartInfo = () => { + return request.post({ + url: '/sync/summary/logChartData', + method: 'post', + data: '' + }) +} diff --git a/core/core-frontend/src/api/sync/syncTask.ts b/core/core-frontend/src/api/sync/syncTask.ts new file mode 100644 index 0000000000..d359119601 --- /dev/null +++ b/core/core-frontend/src/api/sync/syncTask.ts @@ -0,0 +1,224 @@ +import request from '@/config/axios' + +export interface IGetTaskInfoReq { + id?: string + name?: string +} + +export interface ITaskInfoInsertReq { + [key: string]: any +} + +export interface ISchedulerOption { + interval: number + unit: string +} + +export interface ISource { + type: string + query: string + tables: string + datasourceId: string + tableExtract: string + dsTableList?: IDsTable[] + dsList?: [] + fieldList?: ITableField[] + targetFieldTypeList?: string[] + incrementCheckbox?: string + incrementField?: string +} + +export interface ITableField { + id: string + fieldSource: string + fieldName: string + fieldType: string + remarks: string + fieldSize: number + fieldPk: boolean + fieldIndex: boolean +} + +export interface ITargetProperty { + /** + * 启用分区on + */ + partitionEnable: string + /** + * 分区类型 + * DateRange 日期 + * NumberRange 数值 + * List 列 + */ + partitionType: string + /** + * 启用动态分区on + */ + dynamicPartitionEnable: string + /** + * 动态分区结束偏移量 + */ + dynamicPartitionEnd: number + /** + * 动态分区间隔单位 + * HOUR WEEK DAY MONTH YEAR + */ + dynamicPartitionTimeUnit: string + /** + * 手动分区列值 + * 多个以','隔开 + */ + manualPartitionColumnValue: string + /** + * 手动分区数值区间开始值 + */ + manualPartitionStart: number + /** + * 手动分区数值区间结束值 + */ + manualPartitionEnd: number + /** + * 手动分区数值区间间隔 + */ + manualPartitionInterval: number + /** + * 手动分区日期区间 + * 2023-09-08 - 2023-09-15 + */ + manualPartitionTimeRange: string + /** + * 手动分区日期区间间隔单位 + */ + manualPartitionTimeUnit: string + /** + * 分区字段 + */ + partitionColumn: string +} + +export interface ITarget { + createTable?: string + type: string + fieldList: ITableField[] + tableName: string + datasourceId: string + targetProperty: string + dsList?: [] + multipleSelection?: ITableField[] + property: ITargetProperty +} + +export class ITaskInfoRes { + id: string + + name: string + + schedulerType: string + + schedulerConf: string + + schedulerOption: ISchedulerOption + + taskKey: string + + desc: string + + executorTimeout: number + + executorFailRetryCount: number + + source: ISource + + target: ITarget + + status: string + startTime: string + stopTime: string + + constructor( + id: string, + name: string, + schedulerType: string, + schedulerConf: string, + taskKey: string, + desc: string, + executorTimeout: number, + executorFailRetryCount: number, + source: ISource, + target: ITarget, + status: string, + startTime: string, + stopTime: string, + schedulerOption: ISchedulerOption + ) { + this.id = id + this.name = name + this.schedulerType = schedulerType + this.schedulerConf = schedulerConf + this.taskKey = taskKey + this.desc = desc + this.executorTimeout = executorTimeout + this.executorFailRetryCount = executorFailRetryCount + this.source = source + this.target = target + this.status = status + this.startTime = startTime + this.stopTime = stopTime + this.schedulerOption = schedulerOption + } +} + +export interface ITaskInfoUpdateReq { + [key: string]: any +} + +export interface IDsTable { + datasourceId: string + name: string + remark: string + enableCheck: string + datasetPath: string +} + +export const getDatasourceListByTypeApi = (type: string) => { + return request.get({ url: `/sync/datasource/list/${type}` }) +} +export const getTaskInfoListApi = (current: number, size: number, data) => { + return request.post({ url: `/sync/task/pager/${current}/${size}`, data: data }) +} + +export const executeOneApi = (id: string) => { + return request.get({ url: `/sync/task/execute/${id}` }) +} + +export const startTaskApi = (id: string) => { + return request.get({ url: `/sync/task/start/${id}` }) +} + +export const stopTaskApi = (id: string) => { + return request.get({ url: `/sync/task/stop/${id}` }) +} + +export const addApi = (data: ITaskInfoInsertReq) => { + return request.post({ url: `/sync/task/add`, data: data }) +} + +export const removeApi = (taskId: string) => { + return request.delete({ url: `/sync/task/remove/${taskId}` }) +} + +export const batchRemoveApi = (taskIds: string[]) => { + return request.post({ url: `/sync/task/batch/del`, data: taskIds }) +} + +export const modifyApi = (data: ITaskInfoUpdateReq) => { + return request.post({ url: `/sync/task/update`, data: data }) +} + +export const findTaskInfoByIdApi = (taskId: string) => { + return request.get({ url: `/sync/task/get/${taskId}` }) +} + +export const getDatasourceTableListApi = (dsId: string) => { + return request.get({ url: `/sync/datasource/table/list/${dsId}` }) +} diff --git a/core/core-frontend/src/api/sync/syncTaskLog.ts b/core/core-frontend/src/api/sync/syncTaskLog.ts new file mode 100644 index 0000000000..d9b6ffc3f6 --- /dev/null +++ b/core/core-frontend/src/api/sync/syncTaskLog.ts @@ -0,0 +1,20 @@ +import request from '@/config/axios' + +export const getTaskLogListApi = (current: number, size: number, data: any) => { + return request.post({ + url: `/sync/task/log/pager/${current}/${size}`, + data: data + }) +} + +export const removeApi = (logId: string) => { + return request.delete({ url: `/sync/task/log/delete/${logId}` }) +} + +export const getTaskLogDetailApi = (logId: string, fromLineNum: number) => { + return request.get({ url: `/sync/task/log/detail/${logId}/${fromLineNum}` }) +} + +export const clear = (clearData: {}) => { + return request.post({ url: `/sync/task/log/clear`, data: clearData }) +} diff --git a/core/core-frontend/src/assets/svg/icon_sync_close_log_details.svg b/core/core-frontend/src/assets/svg/icon_sync_close_log_details.svg new file mode 100644 index 0000000000..7c0dc4cbc5 --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_sync_close_log_details.svg @@ -0,0 +1,3 @@ + + + diff --git a/core/core-frontend/src/assets/svg/icon_sync_datasource.svg b/core/core-frontend/src/assets/svg/icon_sync_datasource.svg new file mode 100644 index 0000000000..1e3fc9db1d --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_sync_datasource.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/core/core-frontend/src/assets/svg/icon_sync_log_number.svg b/core/core-frontend/src/assets/svg/icon_sync_log_number.svg new file mode 100644 index 0000000000..49869e0981 --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_sync_log_number.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/core/core-frontend/src/assets/svg/icon_sync_logs_outlined.svg b/core/core-frontend/src/assets/svg/icon_sync_logs_outlined.svg new file mode 100644 index 0000000000..e310452c05 --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_sync_logs_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/core/core-frontend/src/assets/svg/icon_sync_target_to_datasource.svg b/core/core-frontend/src/assets/svg/icon_sync_target_to_datasource.svg new file mode 100644 index 0000000000..d84bc12a9e --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_sync_target_to_datasource.svg @@ -0,0 +1,3 @@ + + + diff --git a/core/core-frontend/src/assets/svg/icon_sync_task_number.svg b/core/core-frontend/src/assets/svg/icon_sync_task_number.svg new file mode 100644 index 0000000000..bce4a1e198 --- /dev/null +++ b/core/core-frontend/src/assets/svg/icon_sync_task_number.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/core/core-frontend/src/components/drawer-filter/src/DrawerTimeFilter.vue b/core/core-frontend/src/components/drawer-filter/src/DrawerTimeFilter.vue index 8fd955d120..68ef025353 100644 --- a/core/core-frontend/src/components/drawer-filter/src/DrawerTimeFilter.vue +++ b/core/core-frontend/src/components/drawer-filter/src/DrawerTimeFilter.vue @@ -1,46 +1,66 @@ @@ -48,108 +68,42 @@ defineExpose({
{{ title }}
- {{ $t(ele.name) }} - - - - - - - - +
- diff --git a/core/core-frontend/src/components/drawer-main/src/DrawerMain.vue b/core/core-frontend/src/components/drawer-main/src/DrawerMain.vue index 14b167ef36..13853900ea 100644 --- a/core/core-frontend/src/components/drawer-main/src/DrawerMain.vue +++ b/core/core-frontend/src/components/drawer-main/src/DrawerMain.vue @@ -14,7 +14,8 @@ const props = defineProps({ type: propTypes.string, field: propTypes.string, option: propTypes.array, - title: propTypes.string + title: propTypes.string, + property: propTypes.shape({}) }) ), title: propTypes.string @@ -126,7 +127,8 @@ defineExpose({ :ref="el => (myRefs[index] = el)" v-if="component.type === 'time'" :title="component.title" - @filter-change="v => filterChange(v, component.field, 'eq')" + :property="component.property" + @filter-change="v => filterChange(v, component.field, component.operator)" /> diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 7c29dca6a3..82fd13f4f2 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -2131,5 +2131,56 @@ export default { template_manage: { name_already_exists_type: '分类名称已存在', the_same_category: '同一分类下,该模板名称已存在' + }, + sync_manage: { + title: '同步管理', + ds_search_placeholder: '搜索名称,描述' + }, + sync_datasource: { + title: '数据连接管理', + source_ds: '源数据源', + target_ds: '目标数据源', + add_source_ds: '@:common.add@:sync_datasource.source_ds', + add_target_ds: '@:common.add@:sync_datasource.target_ds', + name: '名称', + desc: '描述', + type: '类型', + status: '状态', + create_time: '创建时间', + update_time: '更新时间', + operation: '操作', + edit: '编辑', + delete: '删除', + confirm_batch_delete_target_ds: '确定删除{0}个目标数据源吗?', + confirm_batch_delete_source_ds: '确定删除{0}个源数据源吗?' + }, + sync_task: { + title: '任务管理', + list: '任务列表', + log_list: '任务日志', + add_task: '添加任务', + name: '名称', + desc: '描述', + status: '状态', + create_time: '创建时间', + update_time: '更新时间', + operation: '操作', + edit: '编辑', + delete: '删除', + start: '启动', + stop: '停止', + trigger_last_time: '上次执行时间', + trigger_next_time: '下次执行时间', + status_success: '成功', + status_running: '执行中', + status_failed: '失败', + status_stopped: '已停止', + status_waiting: '等待执行', + status_done: '执行结束', + status_suspend: '暂停', + running_one: '执行一次', + keep_going: '继续', + log: '日志', + show_log: '查看日志' } } diff --git a/sdk/api/api-sync/pom.xml b/sdk/api/api-sync/pom.xml new file mode 100644 index 0000000000..5e36463122 --- /dev/null +++ b/sdk/api/api-sync/pom.xml @@ -0,0 +1,20 @@ + + + + api + io.dataease + 2.1.0 + + 4.0.0 + + api-sync + + + 17 + 17 + UTF-8 + + + \ No newline at end of file diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/api/SyncDatasourceApi.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/api/SyncDatasourceApi.java new file mode 100644 index 0000000000..4e5d7c6cd5 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/api/SyncDatasourceApi.java @@ -0,0 +1,80 @@ +package io.dataease.api.sync.datasource.api; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.dataease.api.sync.datasource.dto.DBTableDTO; +import io.dataease.api.sync.datasource.dto.GetDatasourceRequest; +import io.dataease.api.sync.datasource.dto.SyncDatasourceDTO; +import io.dataease.api.sync.datasource.vo.SyncDatasourceVO; +import io.dataease.auth.DeApiPath; +import io.dataease.auth.DePermit; +import io.dataease.exception.DEException; +import io.dataease.request.BaseGridRequest; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; + +import static io.dataease.constant.AuthResourceEnum.SYNC_DATASOURCE; + +/** + * @author fit2cloud + * @date 2023/11/20 10:14 + **/ +@DeApiPath(value = "/sync/datasource", rt = SYNC_DATASOURCE) +public interface SyncDatasourceApi { + + @DePermit("m:read") + @PostMapping("/source/pager/{goPage}/{pageSize}") + IPage sourcePager(@PathVariable("goPage") int goPage, @PathVariable("pageSize") int pageSize, @RequestBody BaseGridRequest request); + + @DePermit("m:read") + @PostMapping("/target/pager/{goPage}/{pageSize}") + IPage targetPager(@PathVariable("goPage") int goPage, @PathVariable("pageSize") int pageSize, @RequestBody BaseGridRequest request); + + @PostMapping("/save") + void save(@RequestBody SyncDatasourceDTO dataSourceDTO) throws DEException; + + @PostMapping("/update") + void update(@RequestBody SyncDatasourceDTO dataSourceDTO) throws DEException; + + @PostMapping("/delete/{datasourceId}") + void delete(@PathVariable("datasourceId") String datasourceId) throws DEException; + + @GetMapping("/types") + Object datasourceTypes() throws DEException; + + @PostMapping("/validate") + String validate(@RequestBody SyncDatasourceDTO dataSourceDTO) throws DEException; + + @PostMapping("/getSchema") + List getSchema(@RequestBody SyncDatasourceDTO dataSourceDTO) throws DEException; + + @DePermit({"#p0+':manage'"}) + @GetMapping("/validate/{datasourceId}") + SyncDatasourceDTO validate(@PathVariable("datasourceId") String datasourceId) throws DEException; + + @PostMapping("/latestUse") + List latestUse(); + + @GetMapping("/get/{datasourceId}") + SyncDatasourceDTO get(@PathVariable("datasourceId") String datasourceId) throws DEException; + + @PostMapping("/batchDel") + void batchDel(@RequestBody List ids) throws DEException; + + @PostMapping("/fields") + Map getFields(@RequestBody GetDatasourceRequest getDsRequest) throws DEException ; + + @GetMapping("/list/{type}") + List listByType(@PathVariable("type") String type) throws DEException; + + @GetMapping("/table/list/{dsId}") + List getTableList(@PathVariable("dsId") String dsId) throws DEException; + + + + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/DBTableDTO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/DBTableDTO.java new file mode 100644 index 0000000000..a8112d8e26 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/DBTableDTO.java @@ -0,0 +1,18 @@ +package io.dataease.api.sync.datasource.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @Author gin + * @Date 2021/4/30 10:57 上午 + */ +@Getter +@Setter +public class DBTableDTO { + private String datasourceId; + private String name; + private String remark; + private boolean enableCheck; + private String datasetPath; +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/GetDatasourceRequest.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/GetDatasourceRequest.java new file mode 100644 index 0000000000..7387082ca2 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/GetDatasourceRequest.java @@ -0,0 +1,25 @@ +package io.dataease.api.sync.datasource.dto; + +import lombok.Data; + +@Data +public class GetDatasourceRequest extends SyncDatasourceDTO { + + /** + * 查询sql + */ + private String query; + /** + * 表名 + */ + private String table; + /** + * 表格的抽取数据方式 + */ + private boolean tableExtract; + /** + * 不为空时,获取源数据库表字段,将转换为doris的数据类型 + */ + private String targetDbType; + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/SyncDatasourceDTO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/SyncDatasourceDTO.java new file mode 100644 index 0000000000..8c8146f655 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/dto/SyncDatasourceDTO.java @@ -0,0 +1,61 @@ +package io.dataease.api.sync.datasource.dto; + +import lombok.Data; + +/** + * @author fit2cloud + * @date 2023/11/20 11:14 + **/ +@Data +public class SyncDatasourceDTO { + + /** + * ID + */ + private String id; + + /** + * 名称 + */ + private String name; + + /** + * 描述 + */ + private String desc; + + /** + * 类型 + */ + private String type; + + /** + * 详细信息 + */ + private String configuration; + + /** + * Create timestamp + */ + private Long createTime; + + /** + * Update timestamp + */ + private Long updateTime; + + /** + * 创建人ID + */ + private Long createBy; + private String createByUserName; + + /** + * 状态 + */ + private String status; + + private String statusRemark; + + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/vo/SyncDatasourceVO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/vo/SyncDatasourceVO.java new file mode 100644 index 0000000000..385b8a94ee --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/datasource/vo/SyncDatasourceVO.java @@ -0,0 +1,57 @@ +package io.dataease.api.sync.datasource.vo; + +import lombok.Data; + +/** + * @author fit2cloud + * @date 2023/11/20 11:18 + **/ +@Data +public class SyncDatasourceVO { + /** + * ID + */ + private String id; + + /** + * 名称 + */ + private String name; + + /** + * 描述 + */ + private String desc; + + /** + * 类型 + */ + private String type; + + /** + * 详细信息 + */ + private String configuration; + + /** + * Create timestamp + */ + private Long createTime; + + /** + * Update timestamp + */ + private Long updateTime; + + /** + * 创建人 + */ + private Long createBy; + private String createByName; + + /** + * 状态 + */ + private String status; + private String statusRemark; +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/summary/api/SummaryApi.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/summary/api/SummaryApi.java new file mode 100644 index 0000000000..9e83033c18 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/summary/api/SummaryApi.java @@ -0,0 +1,26 @@ +package io.dataease.api.sync.summary.api; + +import io.dataease.auth.DeApiPath; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Map; + +import static io.dataease.constant.AuthResourceEnum.SUMMARY; + +/** + * @author fit2cloud + * @date 2023/12/4 12:43 + **/ +@DeApiPath(value = "/sync/summary", rt = SUMMARY) +public interface SummaryApi { + + @GetMapping("/resourceCount") + Map resourceCount(); + + @PostMapping("/logChartData") + Map logChartData(@RequestBody String executeTaskLogDate); + + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskApi.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskApi.java new file mode 100644 index 0000000000..f272b1a919 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskApi.java @@ -0,0 +1,52 @@ +package io.dataease.api.sync.task.api; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.dataease.api.sync.task.dto.TaskInfoDTO; +import io.dataease.api.sync.task.vo.TaskInfoVO; +import io.dataease.auth.DeApiPath; +import io.dataease.exception.DEException; +import io.dataease.request.BaseGridRequest; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static io.dataease.constant.AuthResourceEnum.TASK; + +/** + * @author fit2cloud + * @date 2023/11/20 10:14 + **/ +@DeApiPath(value = "/sync/task", rt = TASK) +public interface TaskApi { + + @PostMapping("/pager/{goPage}/{pageSize}") + IPage pager(@PathVariable("goPage") int goPage, @PathVariable("pageSize") int pageSize, @RequestBody BaseGridRequest request); + + @PostMapping("/add") + void add(@RequestBody TaskInfoDTO jobInfo) throws DEException; + + @PostMapping("/update") + void update(@RequestBody TaskInfoDTO jobInfo) throws DEException; + + @DeleteMapping("/remove/{id}") + void remove(@PathVariable(value = "id") String id) throws DEException; + + @GetMapping("start/{id}") + void startJob(@PathVariable(value = "id") String id) throws DEException; + + @GetMapping("stop/{id}") + void stopJob(@PathVariable(value = "id") String id) throws DEException; + + @GetMapping("/get/{id}") + TaskInfoVO getOneById(@PathVariable(value = "id") String id) throws DEException; + + @GetMapping("/execute/{id}") + void execute(@PathVariable(value = "id") String id) throws DEException; + + @PostMapping("/batch/del") + void batchDelete(@RequestBody List ids) throws DEException; + + @GetMapping("/count") + Long count() throws DEException; + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskLogApi.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskLogApi.java new file mode 100644 index 0000000000..925eec1254 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/api/TaskLogApi.java @@ -0,0 +1,39 @@ +package io.dataease.api.sync.task.api; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.dataease.api.sync.task.vo.LogResultVO; +import io.dataease.api.sync.task.vo.TaskLogVO; +import io.dataease.auth.DeApiPath; +import io.dataease.request.BaseGridRequest; +import org.springframework.web.bind.annotation.*; + +import static io.dataease.constant.AuthResourceEnum.TASK_LOG; + +/** + * @author fit2cloud + * @date 2023/12/4 12:43 + **/ +@DeApiPath(value = "/sync/task/log", rt = TASK_LOG) +public interface TaskLogApi { + @PostMapping("/pager/{goPage}/{pageSize}") + IPage pager(@PathVariable("goPage") int goPage, @PathVariable("pageSize") int pageSize, @RequestBody BaseGridRequest request); + + @GetMapping("/detail/{logId}/{fromLineNum}") + LogResultVO logDetail(@PathVariable("logId") String logId, @PathVariable("fromLineNum") int fromLineNum); + + @PostMapping("/save") + void saveLog(@RequestBody TaskLogVO logDetail); + + @PostMapping("/update") + void updateLog(@RequestBody TaskLogVO logDetail); + + @DeleteMapping("/deleteByJobId/{jobId}") + void deleteByJobId(@PathVariable("jobId") String jobId); + + @DeleteMapping("/delete/{logId}") + void deleteById(@PathVariable("logId") String logId); + + @PostMapping("/clear") + void clearJobLog(@RequestBody TaskLogVO taskLogVO); + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Source.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Source.java new file mode 100644 index 0000000000..6c7c908c17 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Source.java @@ -0,0 +1,23 @@ +package io.dataease.api.sync.task.dto; + +import io.dataease.api.sync.datasource.dto.SyncDatasourceDTO; +import lombok.Data; + +import java.util.List; + + +/** + * @author fit2cloud + * @date 2023/8/10 16:38 + **/ +@Data +public class Source { + private String type; + private String query; + private String tables; + private SyncDatasourceDTO datasource; + private String datasourceId; + private String tableExtract; + private List fieldList; + private String incrementField; +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TableField.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TableField.java new file mode 100644 index 0000000000..ec6b79d07b --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TableField.java @@ -0,0 +1,22 @@ +package io.dataease.api.sync.task.dto; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author fit2cloud + */ +@Setter +@Getter +public class TableField { + private String fieldSource; + private String fieldName; + private String remarks; + private String fieldType; + private int fieldSize; + private boolean fieldPk; + private boolean fieldIndex; + private int accuracy; + private Object defaultValue; + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Target.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Target.java new file mode 100644 index 0000000000..66ab74ea5d --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/Target.java @@ -0,0 +1,21 @@ +package io.dataease.api.sync.task.dto; + +import io.dataease.api.sync.datasource.dto.SyncDatasourceDTO; +import lombok.Data; + +import java.util.List; + +/** + * @author fit2cloud + * @date 2023/8/10 16:39 + **/ +@Data +public class Target { + private String type; + private String createTable; + private List fieldList; + private String tableName; + private SyncDatasourceDTO datasource; + private String datasourceId; + private String targetProperty; +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TaskInfoDTO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TaskInfoDTO.java new file mode 100644 index 0000000000..03c05a7869 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/dto/TaskInfoDTO.java @@ -0,0 +1,112 @@ +package io.dataease.api.sync.task.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author fit2cloud + * @date 2023/11/28 17:17 + **/ +@Data +public class TaskInfoDTO { + private String id; + + private String name; + + /** + * 任务类型KEY + */ + private String jobKey; + + private String desc; + + private LocalDateTime createTime; + + private LocalDateTime modifyTime; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 修改人 + */ + private Long modifyBy; + + /** + * 任务参数 + */ + private String parameter; + + /** + * 扩展参数 + */ + private String extParameter; + + /** + * 当前任务状态 + * unexecuted未执行 currentTime=currentTime>=startTime,status=1 + * suspend暂停 stopTime>=currentTime>=startTime,status=0 + * done执行结束 currentTime>stopTime + * running执行中,通过当前任务的日志状态判断,如果有日志在执行中 + */ + private String status; + + /** + * 删除标识 + */ + private Boolean deleted; + + /** + * 任务执行超时时间 + */ + private Long executorTimeout; + + /** + * 任务执行失败重试次数 + */ + private Long executorFailRetryCount; + + /** + * 上次调度时间 + */ + private Long triggerLastTime; + + /** + * 下次次调度时间 + */ + private Long triggerNextTime; + + /** + * 调度类型,NONE,CRON,FIX_RATE,FIX_DELAY + */ + private String schedulerType; + + /** + * 调度配置,取决于调度类型 + */ + private String schedulerConf; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String stopTime; + + + /** + * 源数据源信息 + */ + private Source source; + /** + * 目标数据源信息 + */ + private Target target; +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java new file mode 100644 index 0000000000..58d62e9ee0 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java @@ -0,0 +1,46 @@ +package io.dataease.api.sync.task.vo; + +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 日志返回结果 + * + * @author fit2cloud + */ +@Getter +@Setter +@NoArgsConstructor +public class LogResultVO implements Serializable{ + + /** + * 日志开始行号 + */ + private int fromLineNum; + /** + * 日志结束行号 + */ + private int toLineNum; + /** + * 日志内容 + */ + private String logContent; + /** + * 是否是最后一行 + */ + private boolean isEnd; + + public LogResultVO(int fromLineNum, int toLineNum, String logContent, boolean isEnd) { + this.fromLineNum = fromLineNum; + this.toLineNum = toLineNum; + this.logContent = logContent; + this.isEnd = isEnd; + } + + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskInfoVO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskInfoVO.java new file mode 100644 index 0000000000..e814ac3fd5 --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskInfoVO.java @@ -0,0 +1,132 @@ +package io.dataease.api.sync.task.vo; + +import io.dataease.api.sync.task.dto.Source; +import io.dataease.api.sync.task.dto.Target; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author fit2cloud + * @date 2023/11/28 17:15 + **/ +@Data +public class TaskInfoVO { + + private String id; + + private String name; + + /** + * 任务类型KEY + */ + private String jobKey; + + private String desc; + + private LocalDateTime createTime; + + private LocalDateTime modifyTime; + + /** + * 创建人 + */ + private Long createBy;; + /** + * 创建人 + */ + private String userName; + + /** + * 任务参数 + */ + private String parameter; + + /** + * 扩展参数 + */ + private String extParameter; + + /** + * 任务状态 + * unexecuted未执行 currentTime=currentTime>=startTime,status=1 + * suspend暂停 stopTime>=currentTime>=startTime,status=0 + * done执行结束 currentTime>stopTime + * running执行中,通过当前任务的日志状态判断,如果有日志在执行中 + */ + private String status; + + /** + * 删除标识 + */ + private Boolean deleted; + + /** + * 任务执行超时时间 + */ + private Long executorTimeout; + + /** + * 任务执行失败重试次数 + */ + private Long executorFailRetryCount; + + /** + * 上次调度时间 + */ + private Long triggerLastTime; + + /** + * 下次次调度时间 + */ + private Long triggerNextTime; + + /** + * 调度类型,NONE,CRON,FIX_RATE,FIX_DELAY + */ + private String schedulerType; + + /** + * 调度配置,取决于调度类型 + */ + private String schedulerConf; + + /** + * 开始时间 + */ + private Long startTime; + + /** + * 结束时间 + */ + private Long stopTime; + + private Source source; + private Target target; + + /** + * 上次执行结果,获取任务最新的日志状态 + * running执行中 + * success + * fail失败 + */ + private String lastExecuteStatus; + private Long incrementValue; + + // 以下为日志信息 + private String logId; + private Long executorStartTime; + private Long executorEndTime; + private String executorMsg; + /** + * 成功SUCCESS,失败FAIL,执行中RUNNING + */ + private String logStatus; + + /** + * 在执行周期内 + */ + private boolean withinCycle; + +} diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskLogVO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskLogVO.java new file mode 100644 index 0000000000..44289bc91a --- /dev/null +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/TaskLogVO.java @@ -0,0 +1,25 @@ +package io.dataease.api.sync.task.vo; + +import lombok.Data; + +/** + * 任务日志 + * @author fit2cloud + * @date 2023/9/19 17:44 + **/ +@Data +public class TaskLogVO { + + private String id; + private String jobId; + private String jobName; + private String jobDesc; + private Long executorStartTime; + private Long executorEndTime; + private String status; + private String executorMsg; + private String executorAddress; + + private String clearType; + +} diff --git a/sdk/api/pom.xml b/sdk/api/pom.xml index 58186de6bd..d9f8c90c22 100644 --- a/sdk/api/pom.xml +++ b/sdk/api/pom.xml @@ -15,6 +15,7 @@ api-permissions api-base + api-sync diff --git a/sdk/common/src/main/java/io/dataease/constant/AuthResourceEnum.java b/sdk/common/src/main/java/io/dataease/constant/AuthResourceEnum.java index 093f3835ad..60270644d1 100644 --- a/sdk/common/src/main/java/io/dataease/constant/AuthResourceEnum.java +++ b/sdk/common/src/main/java/io/dataease/constant/AuthResourceEnum.java @@ -2,7 +2,7 @@ package io.dataease.constant; public enum AuthResourceEnum { - PANEL(2, 1), SCREEN(3, 2), DATASET(5, 3), DATASOURCE(6, 4), SYSTEM(7, 0), USER(8, 5), ROLE(8, 6), ORG(9, 7); + PANEL(2, 1), SCREEN(3, 2), DATASET(5, 3), DATASOURCE(6, 4), SYSTEM(7, 0), USER(8, 5), ROLE(8, 6), ORG(9, 7), SYNC_DATASOURCE(10, 8), TASK(11, 9),TASK_LOG(12, 10), SUMMARY(13, 11); private long menuId; From 7aa24c44201f3892769279061a749a342aeb0699 Mon Sep 17 00:00:00 2001 From: jianneng-fit2cloud <48425184+jianneng-fit2cloud@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:54:37 +0800 Subject: [PATCH 03/51] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdk/api/api-sync/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/api/api-sync/pom.xml b/sdk/api/api-sync/pom.xml index 5e36463122..240a25c022 100644 --- a/sdk/api/api-sync/pom.xml +++ b/sdk/api/api-sync/pom.xml @@ -5,7 +5,7 @@ api io.dataease - 2.1.0 + ${dataease.version} 4.0.0 @@ -17,4 +17,4 @@ UTF-8 - \ No newline at end of file + From c9685da1586ac2ff4842bfb89aadb39defd7e568 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 11 Jan 2024 14:43:23 +0800 Subject: [PATCH 04/51] =?UTF-8?q?perf:=20=E7=A7=BB=E9=99=A4hutool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/manage/ChartDataManage.java | 12 +- .../chart/server/ChartDataServer.java | 19 +- .../dataease/chart/utils/ChartDataBuild.java | 4 +- .../dataset/manage/DatasetGroupManage.java | 15 +- .../manage/DatasetTableFieldManage.java | 2 - .../datasource/manage/DataSourceManage.java | 4 +- .../datasource/server/DatasourceServer.java | 9 +- .../io/dataease/map/manage/MapManage.java | 9 +- .../io/dataease/menu/manage/MenuManage.java | 6 +- .../operation/manage/CoreOptRecentManage.java | 4 +- .../manage/CoreVisualizationManage.java | 12 +- .../manage/VisualizationStoreManage.java | 4 +- .../server/StaticResourceServer.java | 9 +- de-xpack | 2 +- pom.xml | 11 -- .../permissions/auth/dto/BusiPerEditor.java | 2 + .../auth/dto/BusiTargetPerCreator.java | 3 + .../permissions/auth/dto/MenuPerEditor.java | 2 + .../auth/dto/MenuTargetPerCreator.java | 2 + .../permissions/auth/dto/PermissionBO.java | 2 + .../dto/DatasetRowPermissionsTreeRequest.java | 2 + .../api/permissions/role/vo/RoleDetailVO.java | 2 + .../api/permissions/user/dto/UserEditor.java | 2 + .../auth/interceptor/CorsInterceptor.java | 7 +- .../java/io/dataease/doc/SwaggerConfig.java | 11 +- .../java/io/dataease/utils/DeReflectUtil.java | 19 ++ .../main/java/io/dataease/utils/IDUtils.java | 10 +- .../main/java/io/dataease/utils/RsaUtils.java | 172 +++++++++++++++--- .../java/io/dataease/utils/SnowFlake.java | 89 +++++++++ .../dataease/utils/StaticResourceUtils.java | 21 +-- .../io/dataease/utils/SystemSettingUtils.java | 4 +- .../java/io/dataease/utils/TreeUtils.java | 12 +- .../io/dataease/utils/WhitelistUtils.java | 3 +- 33 files changed, 360 insertions(+), 127 deletions(-) create mode 100644 sdk/common/src/main/java/io/dataease/utils/DeReflectUtil.java create mode 100644 sdk/common/src/main/java/io/dataease/utils/SnowFlake.java diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java index 7faaa1e829..0db9a5d4e9 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java @@ -1,6 +1,5 @@ package io.dataease.chart.manage; -import cn.hutool.core.collection.CollectionUtil; import io.dataease.api.chart.dto.*; import io.dataease.api.chart.request.ChartDrillRequest; import io.dataease.api.chart.request.ChartExtRequest; @@ -32,12 +31,13 @@ import io.dataease.system.manage.CorePermissionManage; import io.dataease.utils.BeanUtils; import io.dataease.utils.JsonUtil; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; @@ -246,7 +246,7 @@ public class ChartDataManage { boolean hasParameters = false; List sqlVariables = datasetGroupManage.getSqlParams(Arrays.asList(view.getTableId())); - if (CollectionUtil.isNotEmpty(sqlVariables)) { + if (CollectionUtils.isNotEmpty(sqlVariables)) { for (SqlVariableDetails parameter : Optional.ofNullable(request.getParameters()).orElse(new ArrayList<>())) { String parameterId = StringUtils.endsWith(parameter.getId(), START_END_SEPARATOR) ? parameter.getId().split(START_END_SEPARATOR)[0] : parameter.getId(); if (sqlVariables.stream().map(SqlVariableDetails::getId).collect(Collectors.toList()).contains(parameterId)) { @@ -1146,8 +1146,8 @@ public class ChartDataManage { getIndex += xAxis.size(); } if (StringUtils.equalsIgnoreCase(fieldType, "extStack")) { - int xAxisSize = CollectionUtil.size(view.getXAxis()); - int extSize = CollectionUtil.size(view.getXAxisExt()); + int xAxisSize = CollectionUtils.size(view.getXAxis()); + int extSize = CollectionUtils.size(view.getXAxisExt()); index += xAxisSize + extSize; getIndex += xAxisSize + extSize; } @@ -1326,7 +1326,7 @@ public class ChartDataManage { } public void saveChartViewFromVisualization(String checkData, Long sceneId, Map chartViewsInfo) { - if (!CollectionUtils.isEmpty(chartViewsInfo)) { + if (!MapUtils.isEmpty(chartViewsInfo)) { chartViewsInfo.forEach((key, chartViewDTO) -> { if (checkData.indexOf(chartViewDTO.getId() + "") > -1) { try { diff --git a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java index edcd4f7759..3df134d2d6 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java +++ b/core/core-backend/src/main/java/io/dataease/chart/server/ChartDataServer.java @@ -1,6 +1,5 @@ package io.dataease.chart.server; -import cn.hutool.core.util.ArrayUtil; import io.dataease.api.chart.ChartDataApi; import io.dataease.api.chart.dto.ChartViewDTO; import io.dataease.api.chart.dto.ViewDetailField; @@ -15,18 +14,14 @@ import io.dataease.visualization.manage.VisualizationTemplateExtendDataManage; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.hssf.usermodel.HSSFClientAnchor; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.springframework.util.Base64Utils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; @@ -50,9 +45,9 @@ public class ChartDataServer implements ChartDataApi { public ChartViewDTO getData(ChartViewDTO chartViewDTO) throws Exception { try { // 从模板数据获取 - if(CommonConstants.VIEW_DATA_FROM.TEMPLATE.equalsIgnoreCase(chartViewDTO.getDataFrom())){ - return extendDataManage.getChartDataInfo(chartViewDTO.getId(),chartViewDTO); - }else{ + if (CommonConstants.VIEW_DATA_FROM.TEMPLATE.equalsIgnoreCase(chartViewDTO.getDataFrom())) { + return extendDataManage.getChartDataInfo(chartViewDTO.getId(), chartViewDTO); + } else { return chartDataManage.calcData(chartViewDTO); } } catch (Exception e) { @@ -85,7 +80,7 @@ public class ChartDataServer implements ChartDataApi { @Override public void innerExportDetails(ChartExcelRequest request, HttpServletResponse response) throws Exception { - OutputStream outputStream = response.getOutputStream(); + OutputStream outputStream = response.getOutputStream(); try { findExcelData(request); List details = request.getDetails(); @@ -114,7 +109,7 @@ public class ChartDataServer implements ChartDataApi { Boolean mergeHead = false; ViewDetailField[] detailFields = request.getDetailFields(); - if (ArrayUtil.isNotEmpty(detailFields)) { + if (ArrayUtils.isNotEmpty(detailFields)) { cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); @@ -199,7 +194,7 @@ public class ChartDataServer implements ChartDataApi { } else if (cellValObj != null) { try { // with DataType - if ((excelTypes[j].equals(DeTypeConstants.DE_INT) || excelTypes[j] .equals(DeTypeConstants.DE_FLOAT) ) && StringUtils.isNotEmpty(cellValObj.toString())) { + if ((excelTypes[j].equals(DeTypeConstants.DE_INT) || excelTypes[j].equals(DeTypeConstants.DE_FLOAT)) && StringUtils.isNotEmpty(cellValObj.toString())) { cell.setCellValue(Double.valueOf(cellValObj.toString())); } else { cell.setCellValue(cellValObj.toString()); diff --git a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java index 7dfa8e7fe1..0e6f826ecc 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java +++ b/core/core-backend/src/main/java/io/dataease/chart/utils/ChartDataBuild.java @@ -1,8 +1,8 @@ package io.dataease.chart.utils; -import cn.hutool.core.util.ArrayUtil; import io.dataease.api.chart.dto.*; import io.dataease.utils.IDUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -1004,7 +1004,7 @@ public class ChartDataBuild { Map map = transTableNormal(fields, null, data, desensitizationList); List> tableRow = (List>) map.get("tableRow"); final int xEndIndex = detailIndex; - Map> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> ArrayUtil.join(ArrayUtil.sub(item, 0, xEndIndex), "-de-", "(", ")"))); + Map> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> "(" + StringUtils.join(ArrayUtils.subarray(item, 0, xEndIndex), "-de-") + ")")); tableRow.forEach(row -> { String key = xAxis.stream().map(x -> String.format(format, row.get(x.getDataeaseName()).toString())).collect(Collectors.joining("-de-")); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java index 1258586555..cc81808666 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetGroupManage.java @@ -1,6 +1,5 @@ package io.dataease.dataset.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.type.TypeReference; import io.dataease.api.dataset.dto.DatasetTableDTO; @@ -32,6 +31,7 @@ import io.dataease.operation.manage.CoreOptRecentManage; import io.dataease.system.manage.CoreUserManage; import io.dataease.utils.*; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -211,7 +211,7 @@ public class DatasetGroupManage { List nodes = new ArrayList<>(); if (ObjectUtils.isEmpty(request.getLeaf()) || !request.getLeaf()) nodes.add(rootNode()); List bos = pos.stream().map(this::convert).toList(); - if (CollectionUtil.isNotEmpty(bos)) { + if (CollectionUtils.isNotEmpty(bos)) { nodes.addAll(bos); } return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false); @@ -449,10 +449,11 @@ public class DatasetGroupManage { for (CoreDatasetTable datasetTable : datasetTables) { if (StringUtils.isNotEmpty(datasetTable.getSqlVariableDetails())) { List defaultsSqlVariableDetails = JsonUtil.parseList(datasetTable.getSqlVariableDetails(), listTypeReference); - if (CollectionUtil.isNotEmpty(defaultsSqlVariableDetails)) { + if (CollectionUtils.isNotEmpty(defaultsSqlVariableDetails)) { List fullName = new ArrayList<>(); geFullName(id, fullName); - List finalFullName = CollectionUtil.reverse(fullName); + Collections.reverse(fullName); + List finalFullName = fullName; defaultsSqlVariableDetails.forEach(sqlVariableDetails -> { sqlVariableDetails.setDatasetGroupId(id); sqlVariableDetails.setDatasetTableId(datasetTable.getId()); @@ -500,13 +501,13 @@ public class DatasetGroupManage { public List getDetailWithPerm(List ids) { var result = new ArrayList(); - if (CollectionUtil.isNotEmpty(ids)) { + if (CollectionUtils.isNotEmpty(ids)) { var dsList = coreDatasetGroupMapper.selectBatchIds(ids); - if (CollectionUtil.isNotEmpty(dsList)) { + if (CollectionUtils.isNotEmpty(dsList)) { dsList.forEach(ds -> { DatasetTableDTO dto = new DatasetTableDTO(); BeanUtils.copyBean(dto, ds); - var fields = datasetTableFieldManage.listFieldsWithPermissions(ds.getId()); + var fields = datasetTableFieldManage.listFieldsWithPermissions(ds.getId()); List dimensionList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "d")).toList(); List quotaList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "q")).toList(); Map> map = new LinkedHashMap<>(); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java index 08bf01ada9..2266e16989 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java @@ -1,9 +1,7 @@ package io.dataease.dataset.manage; -import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.api.chart.dto.ColumnPermissionItem; -import io.dataease.auth.bo.TokenUserBO; import io.dataease.dataset.dao.auto.entity.CoreDatasetTableField; import io.dataease.dataset.dao.auto.mapper.CoreDatasetGroupMapper; import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; diff --git a/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java b/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java index a26fe93b95..8b0da25485 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/manage/DataSourceManage.java @@ -1,6 +1,5 @@ package io.dataease.datasource.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import io.dataease.api.ds.vo.DatasourceDTO; @@ -19,6 +18,7 @@ import io.dataease.operation.manage.CoreOptRecentManage; import io.dataease.utils.AuthUtils; import io.dataease.utils.TreeUtils; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -65,7 +65,7 @@ public class DataSourceManage { List nodes = new ArrayList<>(); List pos = dataSourceExtMapper.selectList(queryWrapper); if (ObjectUtils.isEmpty(request.getLeaf()) || !request.getLeaf()) nodes.add(rootNode()); - if (CollectionUtil.isNotEmpty(pos)) { + if (CollectionUtils.isNotEmpty(pos)) { nodes.addAll(pos.stream().map(this::convert).toList()); } return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java index 7296453e33..454e1f80be 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java @@ -1,6 +1,5 @@ package io.dataease.datasource.server; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -42,13 +41,13 @@ import io.dataease.system.dao.auto.entity.CoreSysSetting; import io.dataease.system.manage.CoreUserManage; import io.dataease.utils.*; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.quartz.JobDataMap; import org.quartz.JobKey; import org.quartz.TriggerKey; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -168,7 +167,7 @@ public class DatasourceServer implements DatasourceApi { ids.add(busiNodeVO.getId()); } } - if (CollectionUtil.isNotEmpty(busiNodeVO.getChildren())) { + if (CollectionUtils.isNotEmpty(busiNodeVO.getChildren())) { filterDs(busiNodeVO.getChildren(), ids, type, id); } } @@ -184,14 +183,14 @@ public class DatasourceServer implements DatasourceApi { List ids = new ArrayList<>(); filterDs(busiNodeVOS, ids, dataSourceDTO.getType(), dataSourceDTO.getId()); - if (CollectionUtil.isEmpty(ids)) { + if (CollectionUtils.isEmpty(ids)) { return false; } QueryWrapper wrapper = new QueryWrapper<>(); wrapper.in("id", ids); List datasources = datasourceMapper.selectList(wrapper); - if (CollectionUtil.isEmpty(datasources)) { + if (CollectionUtils.isEmpty(datasources)) { return false; } dataSourceDTO.setConfiguration(new String(Base64.getDecoder().decode(dataSourceDTO.getConfiguration()))); diff --git a/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java b/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java index b49278b60b..a5dcb5efef 100644 --- a/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java +++ b/core/core-backend/src/main/java/io/dataease/map/manage/MapManage.java @@ -1,7 +1,5 @@ package io.dataease.map.manage; -import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.io.FileUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.api.map.dto.GeometryNodeCreator; import io.dataease.api.map.vo.AreaNode; @@ -14,6 +12,7 @@ import io.dataease.map.dao.ext.entity.CoreAreaCustom; import io.dataease.map.dao.ext.mapper.CoreAreaCustomMapper; import io.dataease.utils.BeanUtils; import io.dataease.utils.CommonBeanFactory; +import io.dataease.utils.FileUtils; import io.dataease.utils.LogUtil; import jakarta.annotation.Resource; import org.apache.commons.collections4.CollectionUtils; @@ -32,7 +31,6 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; -import java.util.stream.Stream; import static io.dataease.constant.CacheConstant.CommonCacheConstant.WORLD_MAP_CACHE; @@ -114,7 +112,8 @@ public class MapManage { if (ObjectUtils.isEmpty(file) || file.isEmpty()) { DEException.throwException("geometry file is require"); } - String suffix = FileUtil.getSuffix(file.getOriginalFilename()); + + String suffix = FileUtils.getExtensionName(file.getOriginalFilename()); if (!StringUtils.equalsIgnoreCase("json", suffix)) { DEException.throwException("仅支持json格式文件"); } @@ -164,7 +163,7 @@ public class MapManage { } List codeResultList = new ArrayList<>(); codeResultList.add(code); - childTreeIdList(ListUtil.of(code), codeResultList); + childTreeIdList(List.of(code), codeResultList); coreAreaCustomMapper.deleteBatchIds(codeResultList); codeResultList.forEach(id -> { File file = buildGeoFile(id); diff --git a/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java b/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java index b5434e11c9..f5e3296bfa 100644 --- a/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java +++ b/core/core-backend/src/main/java/io/dataease/menu/manage/MenuManage.java @@ -1,6 +1,5 @@ package io.dataease.menu.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.api.menu.vo.MenuMeta; import io.dataease.api.menu.vo.MenuVO; @@ -10,6 +9,7 @@ import io.dataease.menu.dao.auto.entity.CoreMenu; import io.dataease.menu.dao.auto.mapper.CoreMenuMapper; import io.dataease.utils.BeanUtils; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -61,10 +61,10 @@ public class MenuManage { for (MenuTreeNode menuTreeNode : roots) { MenuVO vo = convert(menuTreeNode); List children = null; - if (CollectionUtil.isNotEmpty(children = menuTreeNode.getChildren())) { + if (CollectionUtils.isNotEmpty(children = menuTreeNode.getChildren())) { vo.setChildren(convertTree(children)); } - if (CollectionUtil.isNotEmpty(vo.getChildren()) || menuTreeNode.getType() != 1) { + if (CollectionUtils.isNotEmpty(vo.getChildren()) || menuTreeNode.getType() != 1) { result.add(vo); } } diff --git a/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java b/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java index ff332a523e..f9e8283684 100644 --- a/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java +++ b/core/core-backend/src/main/java/io/dataease/operation/manage/CoreOptRecentManage.java @@ -1,12 +1,12 @@ package io.dataease.operation.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import io.dataease.commons.constants.OptConstants; import io.dataease.operation.dao.auto.entity.CoreOptRecent; import io.dataease.operation.dao.auto.mapper.CoreOptRecentMapper; import io.dataease.utils.AuthUtils; import io.dataease.utils.IDUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -64,7 +64,7 @@ public class CoreOptRecentManage { queryWrapper.eq("resource_type", OptConstants.OPT_RESOURCE_TYPE.TEMPLATE); queryWrapper.eq("uid", uid); List result = coreStoreMapper.selectList(queryWrapper); - if (CollectionUtil.isNotEmpty(result)) { + if (CollectionUtils.isNotEmpty(result)) { return result.stream().collect(Collectors.toMap(CoreOptRecent::getResourceName, CoreOptRecent::getTime)); } else { return new HashMap<>(); diff --git a/core/core-backend/src/main/java/io/dataease/visualization/manage/CoreVisualizationManage.java b/core/core-backend/src/main/java/io/dataease/visualization/manage/CoreVisualizationManage.java index 26aae651f9..ee57ce584b 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/manage/CoreVisualizationManage.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/manage/CoreVisualizationManage.java @@ -1,6 +1,5 @@ package io.dataease.visualization.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -24,6 +23,7 @@ import io.dataease.visualization.dao.ext.po.VisualizationNodePO; import io.dataease.visualization.dao.ext.po.VisualizationResourcePO; import io.dataease.visualization.dto.VisualizationNodeBO; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -56,12 +56,12 @@ public class CoreVisualizationManage { } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("delete_flag", false); - queryWrapper.ne("pid",-1); + queryWrapper.ne("pid", -1); queryWrapper.eq(ObjectUtils.isNotEmpty(request.getLeaf()), "node_type", ObjectUtils.isNotEmpty(request.getLeaf()) && request.getLeaf() ? "leaf" : "folder"); queryWrapper.eq("type", request.getBusiFlag()); queryWrapper.orderByDesc("create_time"); List pos = extMapper.queryNodes(queryWrapper); - if (CollectionUtil.isNotEmpty(pos)) { + if (CollectionUtils.isNotEmpty(pos)) { nodes.addAll(pos.stream().map(this::convert).toList()); } return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false); @@ -81,7 +81,7 @@ public class CoreVisualizationManage { if (isTopNode(tempPid)) continue; delIds.add(tempPid); List childrenIdList = extMapper.queryChildrenId(tempPid); - if (CollectionUtil.isNotEmpty(childrenIdList)) { + if (CollectionUtils.isNotEmpty(childrenIdList)) { childrenIdList.forEach(kid -> { if (!delIds.contains(kid)) { stack.add(kid); @@ -112,7 +112,7 @@ public class CoreVisualizationManage { return preInnerSave(visualizationInfo); } - public Long preInnerSave(DataVisualizationInfo visualizationInfo){ + public Long preInnerSave(DataVisualizationInfo visualizationInfo) { if (visualizationInfo.getId() == null) { Long id = IDUtils.snowID(); visualizationInfo.setId(id); @@ -169,7 +169,7 @@ public class CoreVisualizationManage { } List formatResult(List pos) { - if (CollectionUtil.isEmpty(pos)) { + if (CollectionUtils.isEmpty(pos)) { return new ArrayList<>(); } return pos.stream().map(po -> diff --git a/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java b/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java index 55d55cda18..730939dc3a 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/manage/VisualizationStoreManage.java @@ -1,6 +1,5 @@ package io.dataease.visualization.manage; -import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -18,6 +17,7 @@ import io.dataease.visualization.dao.auto.mapper.CoreStoreMapper; import io.dataease.visualization.dao.ext.mapper.CoreStoreExtMapper; import io.dataease.visualization.dao.ext.po.StorePO; import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -84,7 +84,7 @@ public class VisualizationStoreManage { } public List formatResult(List pos) { - if (CollectionUtil.isEmpty(pos)) return new ArrayList<>(); + if (CollectionUtils.isEmpty(pos)) return new ArrayList<>(); return pos.stream().map(po -> new VisualizationStoreVO( po.getStoreId(), po.getResourceId(), po.getName(), diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java index 6b07a3ea63..840efa6350 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/StaticResourceServer.java @@ -1,8 +1,6 @@ package io.dataease.visualization.server; -import cn.hutool.core.codec.Base64Decoder; -import cn.hutool.core.collection.CollectionUtil; import io.dataease.api.visualization.StaticResourceApi; import io.dataease.api.visualization.request.StaticResourceRequest; import io.dataease.exception.DEException; @@ -10,8 +8,10 @@ import io.dataease.utils.FileUtils; import io.dataease.utils.JsonUtil; import io.dataease.utils.LogUtil; import io.dataease.utils.StaticResourceUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.util.Assert; +import org.springframework.util.Base64Utils; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -89,17 +89,18 @@ public class StaticResourceServer implements StaticResourceApi { } else { if (StringUtils.isNotEmpty(content)) { Files.createFile(uploadPath); - FileCopyUtils.copy(Base64Decoder.decode(content), Files.newOutputStream(uploadPath)); + FileCopyUtils.copy(Base64Utils.decodeFromString(content), Files.newOutputStream(uploadPath)); } } } catch (Exception e) { LogUtil.error("template static resource save error" + e.getMessage()); } } + @Override public Map findResourceAsBase64(StaticResourceRequest resourceRequest) { Map result = new HashMap<>(); - if (CollectionUtil.isNotEmpty(resourceRequest.getResourcePathList())) { + if (CollectionUtils.isNotEmpty(resourceRequest.getResourcePathList())) { for (String path : resourceRequest.getResourcePathList()) { String value = StaticResourceUtils.getImgFileToBase64(path.substring(path.lastIndexOf("/") + 1, path.length())); result.put(path, value); diff --git a/de-xpack b/de-xpack index d17d3775de..8b37827744 160000 --- a/de-xpack +++ b/de-xpack @@ -1 +1 @@ -Subproject commit d17d3775defcb7bbe2603121a417982a0811af4f +Subproject commit 8b378277440ec171aa960a537274017d0609551b diff --git a/pom.xml b/pom.xml index 017a46cfd1..32c41a8018 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,6 @@ 3.12.1 2.3 3.1.0 - 5.8.24 3.10.8 1.74 4.13.2 @@ -116,16 +115,6 @@ org.projectlombok lombok - - cn.hutool - hutool-core - ${hutool.version} - - - cn.hutool - hutool-crypto - ${hutool.version} - org.bouncycastle diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiPerEditor.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiPerEditor.java index e6d7f8e681..b2fba32d5c 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiPerEditor.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiPerEditor.java @@ -3,10 +3,12 @@ package io.dataease.api.permissions.auth.dto; import io.dataease.api.permissions.auth.vo.PermissionItem; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; import java.util.List; +@EqualsAndHashCode(callSuper = true) @Schema(description = "业务权限编辑器") @Data public class BusiPerEditor extends BusiPermissionRequest implements Serializable { diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiTargetPerCreator.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiTargetPerCreator.java index 9a0d30e0ea..ffe61ec87f 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiTargetPerCreator.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/BusiTargetPerCreator.java @@ -2,6 +2,9 @@ package io.dataease.api.permissions.auth.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) @Schema(description = "资源权限构造器") @Data public class BusiTargetPerCreator extends MenuTargetPerCreator{ diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuPerEditor.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuPerEditor.java index b228cb5805..2de268c7fc 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuPerEditor.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuPerEditor.java @@ -3,11 +3,13 @@ package io.dataease.api.permissions.auth.dto; import io.dataease.api.permissions.auth.vo.PermissionItem; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serial; import java.io.Serializable; import java.util.List; +@EqualsAndHashCode(callSuper = true) @Schema(description = "菜单权限编辑器") @Data public class MenuPerEditor extends MenuPermissionRequest implements Serializable { diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuTargetPerCreator.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuTargetPerCreator.java index f3b5d3aa24..9389ec11c8 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuTargetPerCreator.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/MenuTargetPerCreator.java @@ -3,8 +3,10 @@ package io.dataease.api.permissions.auth.dto; import io.dataease.api.permissions.auth.vo.PermissionItem; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.List; +@EqualsAndHashCode(callSuper = true) @Schema(description = "菜单权限构造器") @Data public class MenuTargetPerCreator extends TargetPerCreator{ diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/PermissionBO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/PermissionBO.java index 7a99449bde..03f4968cc1 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/PermissionBO.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/auth/dto/PermissionBO.java @@ -2,8 +2,10 @@ package io.dataease.api.permissions.auth.dto; import io.dataease.api.permissions.auth.vo.PermissionItem; import lombok.Data; +import lombok.EqualsAndHashCode; +@EqualsAndHashCode(callSuper = true) @Data public class PermissionBO extends PermissionItem { diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/dto/DatasetRowPermissionsTreeRequest.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/dto/DatasetRowPermissionsTreeRequest.java index 2f6ff53749..942be9b826 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/dto/DatasetRowPermissionsTreeRequest.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/dataset/dto/DatasetRowPermissionsTreeRequest.java @@ -1,11 +1,13 @@ package io.dataease.api.permissions.dataset.dto; import lombok.Data; +import lombok.EqualsAndHashCode; /** * @Author gin * @Date 2022/7/19 20:23 */ +@EqualsAndHashCode(callSuper = true) @Data public class DatasetRowPermissionsTreeRequest extends DataSetRowPermissionsTreeDTO { public String orderBy; diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/role/vo/RoleDetailVO.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/role/vo/RoleDetailVO.java index cc712d1e98..ec53c0d7f7 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/role/vo/RoleDetailVO.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/role/vo/RoleDetailVO.java @@ -5,7 +5,9 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.dataease.api.permissions.role.dto.RoleCreator; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; +@EqualsAndHashCode(callSuper = true) @Schema(description = "角色详情VO") @Data public class RoleDetailVO extends RoleCreator { diff --git a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/dto/UserEditor.java b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/dto/UserEditor.java index d108aabcc2..614072e687 100644 --- a/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/dto/UserEditor.java +++ b/sdk/api/api-permissions/src/main/java/io/dataease/api/permissions/user/dto/UserEditor.java @@ -2,9 +2,11 @@ package io.dataease.api.permissions.user.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serial; +@EqualsAndHashCode(callSuper = true) @Schema(description = "用户编辑器") @Data public class UserEditor extends UserCreator{ diff --git a/sdk/common/src/main/java/io/dataease/auth/interceptor/CorsInterceptor.java b/sdk/common/src/main/java/io/dataease/auth/interceptor/CorsInterceptor.java index d53e809fcd..97078d3ac4 100644 --- a/sdk/common/src/main/java/io/dataease/auth/interceptor/CorsInterceptor.java +++ b/sdk/common/src/main/java/io/dataease/auth/interceptor/CorsInterceptor.java @@ -1,15 +1,17 @@ package io.dataease.auth.interceptor; -import cn.hutool.core.util.ReflectUtil; import io.dataease.utils.CommonBeanFactory; +import io.dataease.utils.DeReflectUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; +import org.springframework.util.ReflectionUtils; import org.springframework.web.servlet.HandlerInterceptor; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -51,7 +53,8 @@ public class CorsInterceptor implements HandlerInterceptor { bean = CommonBeanFactory.getBean(aClass); } if (ObjectUtils.isNotEmpty(bean)) { - Object result = ReflectUtil.invoke(bean, methodName); + Method method = DeReflectUtil.findMethod(aClass, methodName); + Object result = ReflectionUtils.invokeMethod(method, bean); if (ObjectUtils.isNotEmpty(result)) { List list = (List) result; if (CollectionUtils.isNotEmpty(list)) { diff --git a/sdk/common/src/main/java/io/dataease/doc/SwaggerConfig.java b/sdk/common/src/main/java/io/dataease/doc/SwaggerConfig.java index 52e38fbeee..09f55c0926 100644 --- a/sdk/common/src/main/java/io/dataease/doc/SwaggerConfig.java +++ b/sdk/common/src/main/java/io/dataease/doc/SwaggerConfig.java @@ -1,9 +1,9 @@ package io.dataease.doc; -import cn.hutool.core.util.RandomUtil; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; +import org.apache.commons.lang3.RandomUtils; import org.springdoc.core.customizers.GlobalOpenApiCustomizer; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.beans.factory.annotation.Value; @@ -22,10 +22,10 @@ public class SwaggerConfig { @Bean public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() { return openApi -> { - if (openApi.getTags()!=null){ + if (openApi.getTags() != null) { openApi.getTags().forEach(tag -> { - Map map=new HashMap<>(); - map.put("x-order", RandomUtil.randomInt(0,100)); + Map map = new HashMap<>(); + map.put("x-order", RandomUtils.nextInt(0, 100)); tag.setExtensions(map); }); } @@ -48,7 +48,6 @@ public class SwaggerConfig { } - @Bean public GroupedOpenApi visualizationApi() { return GroupedOpenApi.builder().group("1-visualization").displayName("可视化管理").packagesToScan("io.dataease.visualization").build(); @@ -89,6 +88,4 @@ public class SwaggerConfig { } - - } diff --git a/sdk/common/src/main/java/io/dataease/utils/DeReflectUtil.java b/sdk/common/src/main/java/io/dataease/utils/DeReflectUtil.java new file mode 100644 index 0000000000..3a261e1b40 --- /dev/null +++ b/sdk/common/src/main/java/io/dataease/utils/DeReflectUtil.java @@ -0,0 +1,19 @@ +package io.dataease.utils; + +import org.apache.commons.lang3.ArrayUtils; + +import java.lang.reflect.Method; + +public class DeReflectUtil { + + public static Method findMethod(Class cla, String methodName) { + Method[] methods = cla.getMethods(); + if (ArrayUtils.isEmpty(methods)) return null; + for (Method method : methods) { + if (method.getName().equals(methodName)){ + return method; + } + } + return null; + } +} diff --git a/sdk/common/src/main/java/io/dataease/utils/IDUtils.java b/sdk/common/src/main/java/io/dataease/utils/IDUtils.java index e27dd4feed..e362279d63 100644 --- a/sdk/common/src/main/java/io/dataease/utils/IDUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/IDUtils.java @@ -1,18 +1,20 @@ package io.dataease.utils; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.RandomUtil; + import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.RandomStringUtils; public class IDUtils { + private static SnowFlake snowFlake = new SnowFlake(1, 1); + public static String randomID(Integer num) { num = ObjectUtils.isEmpty(num) ? 16 : num; - return RandomUtil.randomString(16); + return RandomStringUtils.randomAlphanumeric(num); } // 主键请不要使用字符串 推荐雪花算法 public static Long snowID() { - return IdUtil.getSnowflakeNextId(); + return snowFlake.nextId(); } } diff --git a/sdk/common/src/main/java/io/dataease/utils/RsaUtils.java b/sdk/common/src/main/java/io/dataease/utils/RsaUtils.java index 93c5f1c843..b5c781a9a7 100644 --- a/sdk/common/src/main/java/io/dataease/utils/RsaUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/RsaUtils.java @@ -1,23 +1,42 @@ package io.dataease.utils; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.crypto.asymmetric.KeyType; -import cn.hutool.crypto.asymmetric.RSA; -import cn.hutool.crypto.symmetric.AES; + +import io.dataease.exception.DEException; import io.dataease.model.RSAModel; import io.dataease.rsa.dao.entity.CoreRsa; import io.dataease.rsa.manage.RsaManage; import jakarta.annotation.Resource; -import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.springframework.stereotype.Component; import org.springframework.util.Base64Utils; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; -import java.security.Security; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; @Component public class RsaUtils { + static { + if (ObjectUtils.isNotEmpty(Security.getProvider("BC"))) { + Security.removeProvider("BC"); + } + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + } + + + private static final int MAX_ENCRYPT_BLOCK = 117; + + private static final int MAX_DECRYPT_BLOCK = 128; + private static final String PK_SEPARATOR = "-pk_separator-"; private static RsaManage rsaManage; @@ -27,20 +46,108 @@ public class RsaUtils { RsaUtils.rsaManage = rsaManage; } + private static KeyPair getKeyPair() { + KeyPairGenerator generator = null; + try { + generator = KeyPairGenerator.getInstance("RSA"); + } catch (NoSuchAlgorithmException e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException(e); + } + generator.initialize(1024); + return generator.generateKeyPair(); + } + + private static PrivateKey getPrivateKey(String privateKey) { + KeyFactory keyFactory = null; + try { + keyFactory = KeyFactory.getInstance("RSA"); + byte[] decodedKey = Base64.decodeBase64(privateKey.getBytes()); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey); + return keyFactory.generatePrivate(keySpec); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + + private static PublicKey getPublicKey(String publicKey) { + KeyFactory keyFactory = null; + try { + keyFactory = KeyFactory.getInstance("RSA"); + byte[] decodedKey = Base64.decodeBase64(publicKey.getBytes()); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedKey); + return keyFactory.generatePublic(keySpec); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + + private static String encrypt(String data, PublicKey publicKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + int inputLen = data.getBytes().length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offset = 0; + byte[] cache; + int i = 0; + while (inputLen - offset > 0) { + if (inputLen - offset > MAX_ENCRYPT_BLOCK) { + cache = cipher.doFinal(data.getBytes(), offset, MAX_ENCRYPT_BLOCK); + } else { + cache = cipher.doFinal(data.getBytes(), offset, inputLen - offset); + } + out.write(cache, 0, cache.length); + i++; + offset = i * MAX_ENCRYPT_BLOCK; + } + byte[] encryptedData = out.toByteArray(); + out.close(); + return Base64.encodeBase64String(encryptedData); + } + + private static String decrypt(String data, PrivateKey privateKey) throws Exception { + Cipher cipher = Cipher.getInstance("RSA"); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + byte[] dataBytes = Base64.decodeBase64(data); + int inputLen = dataBytes.length; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + int offset = 0; + byte[] cache; + int i = 0; + while (inputLen - offset > 0) { + if (inputLen - offset > MAX_DECRYPT_BLOCK) { + cache = cipher.doFinal(dataBytes, offset, MAX_DECRYPT_BLOCK); + } else { + cache = cipher.doFinal(dataBytes, offset, inputLen - offset); + } + out.write(cache, 0, cache.length); + i++; + offset = i * MAX_DECRYPT_BLOCK; + } + out.close(); + return out.toString(StandardCharsets.UTF_8); + } + public static RSAModel generate() { - RSA rsa = new RSA(); - String privateKeyBase64 = rsa.getPrivateKeyBase64(); - String publicKeyBase64 = rsa.getPublicKeyBase64(); + KeyPair keyPair = getKeyPair(); + String privateKey = new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded())); + String publicKey = new String(Base64.encodeBase64(keyPair.getPublic().getEncoded())); RSAModel rsaModel = new RSAModel(); - rsaModel.setPrivateKey(privateKeyBase64); - rsaModel.setPublicKey(publicKeyBase64); + rsaModel.setPrivateKey(privateKey); + rsaModel.setPublicKey(publicKey); rsaModel.setAesKey(generateAesKey()); return rsaModel; } public static String decryptStr(String data, String privateKey) { - RSA rsa = new RSA(privateKey, null); - return rsa.decryptStr(data, KeyType.PrivateKey); + try { + return decrypt(data, getPrivateKey(privateKey)); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + throw new RuntimeException(e); + } } public static String decryptStr(String data) { @@ -48,8 +155,12 @@ public class RsaUtils { } public static String encryptStr(String data) { - RSA rsa = new RSA(privateKey(), publicKey()); - return rsa.encryptBase64(data, KeyType.PublicKey); + try { + return encrypt(data, getPublicKey(publicKey())); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + throw new RuntimeException(e); + } } public static String privateKey() { @@ -61,23 +172,40 @@ public class RsaUtils { CoreRsa coreRsa = rsaManage.query(); String publicKey = coreRsa.getPublicKey(); String aesKey = coreRsa.getAesKey(); - // Security.addProvider(new BouncyCastleProvider()); - String pk = ascEncrypt(publicKey, aesKey); + String pk = ascEncrypt(publicKey, aesKey).replaceAll("[\\s*\t\n\r]", ""); String separator = Base64Utils.encodeToUrlSafeString(PK_SEPARATOR.getBytes(StandardCharsets.UTF_8)); return pk + separator + aesKey; } private static final String IV_KEY = "0000000000000000"; + private static String generateAesKey() { - return RandomUtil.randomString(16); + return RandomStringUtils.randomAlphanumeric(16); } + private static String ascEncrypt(String message, String key) { - byte[] baseKey = key.getBytes(StandardCharsets.UTF_8); + /*byte[] baseKey = key.getBytes(StandardCharsets.UTF_8); byte[] ivBytes = IV_KEY.getBytes(StandardCharsets.UTF_8); AES aes = new AES("CBC", "PKCS7Padding", baseKey, ivBytes); byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8); - return Base64Utils.encodeToString(aes.encrypt(messageBytes)); + return Base64Utils.encodeToString(aes.encrypt(messageBytes));*/ + + Cipher cipher = null; + try { + byte[] baseKey = key.getBytes(StandardCharsets.UTF_8); + byte[] ivBytes = IV_KEY.getBytes(StandardCharsets.UTF_8); + byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8); + cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); + // 根据secretKey(密钥)的字节内容,"恢复"秘钥对象 + SecretKey keySpec = new SecretKeySpec(baseKey, "AES"); + IvParameterSpec ivps = new IvParameterSpec(ivBytes); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps); + byte[] data = cipher.doFinal(messageBytes); + return Base64.encodeBase64String(data); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } - - } diff --git a/sdk/common/src/main/java/io/dataease/utils/SnowFlake.java b/sdk/common/src/main/java/io/dataease/utils/SnowFlake.java new file mode 100644 index 0000000000..e820f58e13 --- /dev/null +++ b/sdk/common/src/main/java/io/dataease/utils/SnowFlake.java @@ -0,0 +1,89 @@ +package io.dataease.utils; + +public class SnowFlake { + + /** + * 起始的时间戳 + */ + private final static long START_STMP = 1480166465631L; + + /** + * 每一部分占用的位数 + */ + private final static long SEQUENCE_BIT = 12; //序列号占用的位数 + private final static long MACHINE_BIT = 5; //机器标识占用的位数 + private final static long DATACENTER_BIT = 5;//数据中心占用的位数 + + /** + * 每一部分的最大值 + */ + private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); + private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); + private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); + + /** + * 每一部分向左的位移 + */ + private final static long MACHINE_LEFT = SEQUENCE_BIT; + private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; + private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; + + private long datacenterId; //数据中心 + private long machineId; //机器标识 + private long sequence = 0L; //序列号 + private long lastStmp = -1L;//上一次时间戳 + + public SnowFlake(long datacenterId, long machineId) { + if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) { + throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0"); + } + if (machineId > MAX_MACHINE_NUM || machineId < 0) { + throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0"); + } + this.datacenterId = datacenterId; + this.machineId = machineId; + } + + /** + * 产生下一个ID + * + * @return + */ + public synchronized long nextId() { + long currStmp = getNewstmp(); + if (currStmp < lastStmp) { + throw new RuntimeException("Clock moved backwards. Refusing to generate id"); + } + + if (currStmp == lastStmp) { + //相同毫秒内,序列号自增 + sequence = (sequence + 1) & MAX_SEQUENCE; + //同一毫秒的序列数已经达到最大 + if (sequence == 0L) { + currStmp = getNextMill(); + } + } else { + //不同毫秒内,序列号置为0 + sequence = 0L; + } + + lastStmp = currStmp; + + return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分 + | datacenterId << DATACENTER_LEFT //数据中心部分 + | machineId << MACHINE_LEFT //机器标识部分 + | sequence; //序列号部分 + } + + private long getNextMill() { + long mill = getNewstmp(); + while (mill <= lastStmp) { + mill = getNewstmp(); + } + return mill; + } + + private long getNewstmp() { + return System.currentTimeMillis(); + } +} diff --git a/sdk/common/src/main/java/io/dataease/utils/StaticResourceUtils.java b/sdk/common/src/main/java/io/dataease/utils/StaticResourceUtils.java index 713f6e0d03..7736aa3e04 100644 --- a/sdk/common/src/main/java/io/dataease/utils/StaticResourceUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/StaticResourceUtils.java @@ -1,9 +1,10 @@ package io.dataease.utils; -import cn.hutool.core.codec.Base64Encoder; import org.apache.commons.lang3.StringUtils; import org.springframework.lang.NonNull; import org.springframework.util.Assert; +import org.springframework.util.Base64Utils; + import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -12,7 +13,7 @@ import static io.dataease.constant.StaticResourceConstants.*; public class StaticResourceUtils { - private final static String FILE_BASE_PATH = USER_HOME+ FILE_SEPARATOR+UPLOAD_URL_PREFIX; + private final static String FILE_BASE_PATH = USER_HOME + FILE_SEPARATOR + UPLOAD_URL_PREFIX; public static String ensureBoth(@NonNull String string, @NonNull String bothfix) { return ensureBoth(string, bothfix, bothfix); @@ -53,8 +54,7 @@ public class StaticResourceUtils { } /** - * - * @param imgFile local storage path + * @param imgFile local storage path * @return */ public static String getImgFileToBase64(String imgFile) { @@ -63,7 +63,7 @@ public class StaticResourceUtils { byte[] buffer = null; //Read picture byte array try { - inputStream = new FileInputStream(FILE_BASE_PATH+FILE_SEPARATOR+imgFile); + inputStream = new FileInputStream(FILE_BASE_PATH + FILE_SEPARATOR + imgFile); int count = 0; while (count == 0) { count = inputStream.available(); @@ -72,9 +72,9 @@ public class StaticResourceUtils { inputStream.read(buffer); } catch (IOException e) { LogUtil.error(e); - }catch (Exception e){ + } catch (Exception e) { LogUtil.error(e); - }finally { + } finally { if (inputStream != null) { try { // Close InputStream @@ -85,10 +85,9 @@ public class StaticResourceUtils { } } // Encode byte array as Base64 - if(buffer!=null){ - - return Base64Encoder.encode(buffer); - }else{ + if (buffer != null) { + return Base64Utils.encodeToString(buffer); + } else { return null; } } diff --git a/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java b/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java index 27676b29b3..9629897394 100644 --- a/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/SystemSettingUtils.java @@ -1,6 +1,5 @@ package io.dataease.utils; -import cn.hutool.core.collection.ListUtil; import io.dataease.constant.XpackSettingConstants; import java.util.List; @@ -8,7 +7,8 @@ import java.util.List; public class SystemSettingUtils { public static boolean xpackSetting(String pkey) { - List xpackSettingList = ListUtil.toList(XpackSettingConstants.AUTO_CREATE_USER); + + List xpackSettingList = List.of(XpackSettingConstants.AUTO_CREATE_USER); return xpackSettingList.contains(pkey); } } diff --git a/sdk/common/src/main/java/io/dataease/utils/TreeUtils.java b/sdk/common/src/main/java/io/dataease/utils/TreeUtils.java index 9e6ded00a5..d9e8f71182 100644 --- a/sdk/common/src/main/java/io/dataease/utils/TreeUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/TreeUtils.java @@ -1,14 +1,12 @@ package io.dataease.utils; -import cn.hutool.core.collection.CollectionUtil; import io.dataease.model.ITreeBase; import io.dataease.model.TreeBaseModel; import io.dataease.model.TreeModel; import io.dataease.model.TreeResultModel; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Arrays; @@ -38,21 +36,21 @@ public class TreeUtils { List existedList = new ArrayList<>(); modelList.forEach(po -> { List children = null; - if (CollectionUtil.isNotEmpty(children = childMap.get(po.getId()))) { + if (CollectionUtils.isNotEmpty(children = childMap.get(po.getId()))) { po.setChildren(children); existedList.addAll(children.stream().map(TreeModel::getId).toList()); } }); - if (CollectionUtil.isEmpty(modelList)) { + if (CollectionUtils.isEmpty(modelList)) { return null; } List floatingList = modelList.stream().filter(node -> !isRoot(node) && !existedList.contains(node.getId())).toList(); - if (CollectionUtil.isNotEmpty(existedList)) { + if (CollectionUtils.isNotEmpty(existedList)) { modelResult = modelList.stream().filter(node -> !existedList.contains(node.getId())).toList(); } else { modelResult = modelList; } - if (rootExist.get() && CollectionUtil.isNotEmpty(floatingList)) { + if (rootExist.get() && CollectionUtils.isNotEmpty(floatingList)) { modelResult = modelResult.stream().filter(TreeUtils::isRoot).collect(Collectors.toList()); TreeModel root = modelResult.get(0); if (root.getChildren() == null) { diff --git a/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java b/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java index e8f0c2a772..c565c568ae 100644 --- a/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java +++ b/sdk/common/src/main/java/io/dataease/utils/WhitelistUtils.java @@ -1,6 +1,5 @@ package io.dataease.utils; -import cn.hutool.core.collection.ListUtil; import io.dataease.constant.AuthConstant; import org.apache.commons.lang3.StringUtils; @@ -8,7 +7,7 @@ import java.util.List; public class WhitelistUtils { - public static List WHITE_PATH = ListUtil.of( + public static List WHITE_PATH = List.of( "/login/localLogin", "/apisix/check", "/dekey", From 78a7a6fa542aeb1c0900d9e28465a51dcf203e7c Mon Sep 17 00:00:00 2001 From: jianneng-fit2cloud Date: Thu, 11 Jan 2024 15:06:30 +0800 Subject: [PATCH 05/51] =?UTF-8?q?fix:=20=E5=8E=BB=E6=8E=89=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E5=8C=85=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/api/sync/task/vo/LogResultVO.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java index 58d62e9ee0..f69791bfc3 100644 --- a/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java +++ b/sdk/api/api-sync/src/main/java/io/dataease/api/sync/task/vo/LogResultVO.java @@ -1,13 +1,8 @@ package io.dataease.api.sync.task.vo; -import lombok.Data; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; -import java.io.Serial; -import java.io.Serializable; - /** * 日志返回结果 * @@ -15,8 +10,7 @@ import java.io.Serializable; */ @Getter @Setter -@NoArgsConstructor -public class LogResultVO implements Serializable{ +public class LogResultVO { /** * 日志开始行号 @@ -35,6 +29,10 @@ public class LogResultVO implements Serializable{ */ private boolean isEnd; + public LogResultVO() { + + } + public LogResultVO(int fromLineNum, int toLineNum, String logContent, boolean isEnd) { this.fromLineNum = fromLineNum; this.toLineNum = toLineNum; From 1a0083d2851c51d5f5ddb0ffb67a013a7262b264 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 11 Jan 2024 15:09:17 +0800 Subject: [PATCH 06/51] =?UTF-8?q?refactor:=20=E7=94=BB=E5=B8=83=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/DataVisualizationServer.java | 10 ++++ .../data-visualization/canvas/CanvasCore.vue | 54 ++++++++++++++++++- .../data-visualization/canvas/DePreview.vue | 8 +-- .../component-background/CanvasBackground.vue | 22 +++++++- .../src/components/watermark/watermark.ts | 19 ++++--- .../modules/data-visualization/dvMain.ts | 9 ++-- core/core-frontend/src/utils/canvasUtils.ts | 2 +- .../src/views/canvas/DeCanvas.vue | 34 +++++++++++- .../views/visualized/data/dataset/index.vue | 2 +- .../src/views/watermark/ParamsTips.vue | 5 +- .../src/views/watermark/index.vue | 1 + .../visualization/vo/DataVisualizationVO.java | 2 +- 12 files changed, 147 insertions(+), 21 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java index 96175826df..1c7f630dfd 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java @@ -117,6 +117,11 @@ public class DataVisualizationServer implements DataVisualizationApi { DataVisualizationInfo visualizationInfo = new DataVisualizationInfo(); BeanUtils.copyBean(visualizationInfo, request); visualizationInfo.setNodeType(request.getNodeType() == null ? DataVisualizationConstants.NODE_TYPE.LEAF : request.getNodeType()); + if(request.getSelfWatermarkStatus() != null && request.getSelfWatermarkStatus()){ + visualizationInfo.setSelfWatermarkStatus(1); + }else{ + visualizationInfo.setSelfWatermarkStatus(0); + } Long newDvId = coreVisualizationManage.innerSave(visualizationInfo); //保存视图信 chartDataManage.saveChartViewFromVisualization(request.getComponentData(), newDvId, request.getCanvasViewInfo()); @@ -132,6 +137,11 @@ public class DataVisualizationServer implements DataVisualizationApi { } DataVisualizationInfo visualizationInfo = new DataVisualizationInfo(); BeanUtils.copyBean(visualizationInfo, request); + if(request.getSelfWatermarkStatus() != null && request.getSelfWatermarkStatus()){ + visualizationInfo.setSelfWatermarkStatus(1); + }else{ + visualizationInfo.setSelfWatermarkStatus(0); + } if(DataVisualizationConstants.RESOURCE_OPT_TYPE.COPY.equals(request.getOptType())){ // 复制更新 新建权限插入 visualizationInfoMapper.deleteById(dvId); diff --git a/core/core-frontend/src/components/data-visualization/canvas/CanvasCore.vue b/core/core-frontend/src/components/data-visualization/canvas/CanvasCore.vue index 7b0dfbff02..6111d2cb07 100644 --- a/core/core-frontend/src/components/data-visualization/canvas/CanvasCore.vue +++ b/core/core-frontend/src/components/data-visualization/canvas/CanvasCore.vue @@ -15,7 +15,7 @@ import MarkLine from './MarkLine.vue' import Area from './Area.vue' import eventBus from '@/utils/eventBus' import { changeStyleWithScale } from '@/utils/translate' -import { ref, onMounted, computed, toRefs, nextTick, onBeforeUnmount } from 'vue' +import { ref, onMounted, computed, toRefs, nextTick, onBeforeUnmount, watch } from 'vue' import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain' import { composeStoreWithOut } from '@/store/modules/data-visualization/compose' import { contextmenuStoreWithOut } from '@/store/modules/data-visualization/contextmenu' @@ -39,6 +39,8 @@ import { adaptCurThemeCommonStyle } from '@/utils/canvasStyle' import LinkageSet from '@/components/visualization/LinkageSet.vue' import PointShadow from '@/components/data-visualization/canvas/PointShadow.vue' import DragInfo from '@/components/visualization/common/DragInfo.vue' +import { activeWatermark } from '@/components/watermark/watermark' +import { personInfoApi } from '@/api/user' const snapshotStore = snapshotStoreWithOut() const dvMainStore = dvMainStoreWithOut() const composeStore = composeStoreWithOut() @@ -155,6 +157,7 @@ const props = defineProps({ default: true } }) +const userInfo = ref(null) const { baseWidth, @@ -192,6 +195,51 @@ const linkJumpRef = ref(null) const linkageRef = ref(null) const mainDomId = ref('editor-' + canvasId.value) +watch( + () => dvInfo.value, + () => { + initWatermark() + }, + { deep: true } +) + +watch( + () => canvasStyleData.value, + () => { + initWatermark() + }, + { deep: true } +) + +const initWatermark = (waterDomId = 'editor-canvas-main') => { + if (dvInfo.value.watermarkInfo && isMainCanvas(canvasId.value)) { + const scale = dashboardActive.value ? 1 : curScale.value + if (userInfo.value) { + activeWatermark( + dvInfo.value.watermarkInfo.settingContent, + userInfo.value, + waterDomId, + canvasId.value, + dvInfo.value.selfWatermarkStatus, + scale + ) + } else { + const method = personInfoApi + method().then(res => { + userInfo.value = res.data + activeWatermark( + dvInfo.value.watermarkInfo.settingContent, + userInfo.value, + waterDomId, + canvasId.value, + dvInfo.value.selfWatermarkStatus, + scale + ) + }) + } + } +} + const dragInfoShow = computed(() => { return ( dvInfo.value.type === 'dashboard' && @@ -942,6 +990,9 @@ const cellInit = () => { } const canvasSizeInit = () => { + if (isMainCanvas(canvasId.value)) { + initWatermark() + } cellInit() reCalcCellWidth() } @@ -1233,6 +1284,7 @@ const markLineShow = computed(() => isMainCanvas(canvasId.value)) onMounted(() => { if (isMainCanvas(canvasId.value)) { initSnapshotTimer() + initWatermark() } // 获取编辑器元素 composeStore.getEditor(canvasId.value) diff --git a/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue b/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue index 3fe0f5b403..a1423b3cda 100644 --- a/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue +++ b/core/core-frontend/src/components/data-visualization/canvas/DePreview.vue @@ -188,7 +188,8 @@ const initWatermark = (waterDomId = 'preview-canvas-main') => { userInfo.value, waterDomId, canvasId.value, - dvInfo.value.watermarkOpen + dvInfo.value.selfWatermarkStatus, + scaleWidth.value / 100 ) } else { const method = personInfoApi @@ -199,7 +200,8 @@ const initWatermark = (waterDomId = 'preview-canvas-main') => { userInfo.value, waterDomId, canvasId.value, - dvInfo.value.watermarkOpen + dvInfo.value.selfWatermarkStatus, + scaleWidth.value / 100 ) }) } @@ -213,8 +215,8 @@ onMounted(() => { const erd = elementResizeDetectorMaker() erd.listenTo(document.getElementById(domId), () => { restore() + initWatermark() }) - initWatermark() }) onBeforeUnmount(() => { diff --git a/core/core-frontend/src/components/visualization/component-background/CanvasBackground.vue b/core/core-frontend/src/components/visualization/component-background/CanvasBackground.vue index 329de8b308..889862f618 100644 --- a/core/core-frontend/src/components/visualization/component-background/CanvasBackground.vue +++ b/core/core-frontend/src/components/visualization/component-background/CanvasBackground.vue @@ -14,6 +14,16 @@ @change="reUpload" /> + + + 水印 + + import { COLOR_PANEL } from '@/views/chart/components/editor/util/chart' -import { onMounted, reactive, ref, watch } from 'vue' +import { computed, onMounted, reactive, ref, watch } from 'vue' import { imgUrlTrans } from '@/utils/imgUtils' import { snapshotStoreWithOut } from '@/store/modules/data-visualization/snapshot' import { beforeUploadCheck, uploadFileResult } from '@/api/staticResource' @@ -123,7 +133,7 @@ const files = ref(null) const maxImageSize = 15000000 const dvMainStore = dvMainStoreWithOut() -const { canvasStyleData } = storeToRefs(dvMainStore) +const { canvasStyleData, dvInfo } = storeToRefs(dvMainStore) withDefaults( defineProps<{ @@ -145,6 +155,14 @@ const state = reactive({ predefineColors: COLOR_PANEL }) +const showWatermarkSetting = computed(() => { + return ( + dvInfo.value.watermarkInfo && + dvInfo.value.watermarkInfo?.settingContent?.enable && + dvInfo.value.watermarkInfo?.settingContent?.enablePanelCustom + ) +}) + const goFile = () => { files.value.click() } diff --git a/core/core-frontend/src/components/watermark/watermark.ts b/core/core-frontend/src/components/watermark/watermark.ts index 54f8557463..125e92ae10 100644 --- a/core/core-frontend/src/components/watermark/watermark.ts +++ b/core/core-frontend/src/components/watermark/watermark.ts @@ -145,7 +145,14 @@ export function getNow() { return time } -export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, watermarkOpen) { +export function activeWatermark( + watermarkForm, + userLoginInfo, + domId, + canvasId, + selfWatermarkStatus, + scale = 1 +) { // 清理历史水印 const historyWatermarkDom = document.getElementById('de-watermark-server') if (historyWatermarkDom) { @@ -155,7 +162,7 @@ export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, w !( canvasId === 'canvas-main' && ((watermarkForm.enable && !watermarkForm.enablePanelCustom) || - (watermarkForm.enable && watermarkOpen)) + (watermarkForm.enable && selfWatermarkStatus)) ) ) { return @@ -183,11 +190,11 @@ export function activeWatermark(watermarkForm, userLoginInfo, domId, canvasId, w } const settings = { watermark_txt: watermark_txt, - watermark_width: watermark_width, + watermark_width: watermark_width * scale, watermark_color: watermarkForm.watermark_color, - watermark_x_space: watermarkForm.watermark_x_space, - watermark_y_space: watermarkForm.watermark_y_space, - watermark_fontsize: watermarkForm.watermark_fontsize + 'px' + watermark_x_space: watermarkForm.watermark_x_space * scale, + watermark_y_space: watermarkForm.watermark_y_space * scale, + watermark_fontsize: watermarkForm.watermark_fontsize * scale + 'px' } watermark(settings, domId) } diff --git a/core/core-frontend/src/store/modules/data-visualization/dvMain.ts b/core/core-frontend/src/store/modules/data-visualization/dvMain.ts index dba7db38c1..0ed6f0c9ea 100644 --- a/core/core-frontend/src/store/modules/data-visualization/dvMain.ts +++ b/core/core-frontend/src/store/modules/data-visualization/dvMain.ts @@ -58,6 +58,7 @@ export const dvMainStore = defineStore('dataVisualization', { pid: null, status: null, selfWatermarkStatus: null, + watermarkInfo: {}, type: null }, // 图表信息 @@ -861,8 +862,8 @@ export const dvMainStore = defineStore('dataVisualization', { pid: null, status: null, selfWatermarkStatus: null, - type: null, - watermarkInfo: null + watermarkInfo: {}, + type: null } }, setViewDataDetails(viewId, dataInfo) { @@ -899,7 +900,8 @@ export const dvMainStore = defineStore('dataVisualization', { pid: pid, type: dvType, status: 1, - selfWatermarkStatus: 0 + selfWatermarkStatus: true, + watermarkInfo: {} } const canvasStyleDataNew = dvType === 'dashboard' @@ -921,6 +923,7 @@ export const dvMainStore = defineStore('dataVisualization', { pid: null, status: null, selfWatermarkStatus: null, + watermarkInfo: {}, type: null } this.canvasStyleData = { ...deepCopy(DEFAULT_CANVAS_STYLE_DATA_DARK), backgroundColor: null } diff --git a/core/core-frontend/src/utils/canvasUtils.ts b/core/core-frontend/src/utils/canvasUtils.ts index 0ea921e542..242edfa343 100644 --- a/core/core-frontend/src/utils/canvasUtils.ts +++ b/core/core-frontend/src/utils/canvasUtils.ts @@ -90,7 +90,7 @@ export function initCanvasDataPrepare(dvId, busiFlag, callBack) { name: canvasInfo.name, pid: canvasInfo.pid, status: canvasInfo.status, - watermarkOpen: canvasInfo.selfWatermarkStatus, + selfWatermarkStatus: canvasInfo.selfWatermarkStatus, type: canvasInfo.type, creatorName: canvasInfo.creatorName, updateName: canvasInfo.updateName, diff --git a/core/core-frontend/src/views/canvas/DeCanvas.vue b/core/core-frontend/src/views/canvas/DeCanvas.vue index 02b101b8b0..fbea5b1caa 100644 --- a/core/core-frontend/src/views/canvas/DeCanvas.vue +++ b/core/core-frontend/src/views/canvas/DeCanvas.vue @@ -11,6 +11,8 @@ import { getCanvasStyle, syncShapeItemStyle } from '@/utils/style' import { adaptCurThemeCommonStyle } from '@/utils/canvasStyle' import CanvasCore from '@/components/data-visualization/canvas/CanvasCore.vue' import { isMainCanvas } from '@/utils/canvasUtils' +import { activeWatermark } from '@/components/watermark/watermark' +import { personInfoApi } from '@/api/user' // change-begin const props = defineProps({ @@ -42,10 +44,11 @@ const domId = ref('de-canvas-' + canvasId.value) const dvMainStore = dvMainStoreWithOut() const snapshotStore = snapshotStoreWithOut() -const { pcMatrixCount, curOriginThemes } = storeToRefs(dvMainStore) +const { pcMatrixCount, curOriginThemes, dvInfo } = storeToRefs(dvMainStore) const canvasOut = ref(null) const canvasInner = ref(null) const canvasInitStatus = ref(false) +const userInfo = ref(null) const state = reactive({ screenWidth: 1920, @@ -59,6 +62,7 @@ const renderState = ref(false) // 仪表板默认 const baseMarginLeft = ref(0) const baseMarginTop = ref(0) const cyGridster = ref(null) +const editDomId = ref('edit-' + canvasId.value) const editStyle = computed(() => { if (canvasStyleData.value && isMainCanvas(canvasId.value)) { @@ -187,6 +191,32 @@ const moveOutFromTab = component => { }, 500) } +const initWatermark = (waterDomId = 'edit-canvas-main') => { + // if (dvInfo.value.watermarkInfo && isMainCanvas(canvasId.value)) { + // if (userInfo.value) { + // activeWatermark( + // dvInfo.value.watermarkInfo.settingContent, + // userInfo.value, + // waterDomId, + // canvasId.value, + // dvInfo.value.selfWatermarkStatus + // ) + // } else { + // const method = personInfoApi + // method().then(res => { + // userInfo.value = res.data + // activeWatermark( + // dvInfo.value.watermarkInfo.settingContent, + // userInfo.value, + // waterDomId, + // canvasId.value, + // dvInfo.value.selfWatermarkStatus + // ) + // }) + // } + // } +} + // 全局监听按键事件 onMounted(() => { window.addEventListener('resize', canvasSizeInit) @@ -242,7 +272,7 @@ defineExpose({ - + @@ -29,5 +31,6 @@ const { t } = useI18n() position: absolute; right: 10px; z-index: 10; + top: 5px; } diff --git a/core/core-frontend/src/views/watermark/index.vue b/core/core-frontend/src/views/watermark/index.vue index 0d023a5b47..b2f69fb9c0 100644 --- a/core/core-frontend/src/views/watermark/index.vue +++ b/core/core-frontend/src/views/watermark/index.vue @@ -113,6 +113,7 @@ import { ElMessage } from 'element-plus-secondary/es' import { personInfoApi } from '@/api/user' import { getNow, watermark } from '@/components/watermark/watermark' import { useI18n } from '@/hooks/web/useI18n' +import ParamsTips from '@/views/watermark/ParamsTips.vue' const { t } = useI18n() const state = reactive({ diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java index c13f28eb05..67c596c04c 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java @@ -74,7 +74,7 @@ public class DataVisualizationVO implements Serializable { /** * 是否单独打开水印 0-关闭 1-开启 */ - private Integer selfWatermarkStatus; + private Boolean selfWatermarkStatus; /** * 排序 From c75cb1ae48d24d65d908a38986e54d1ec291784c Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 11 Jan 2024 15:12:05 +0800 Subject: [PATCH 07/51] =?UTF-8?q?revert:=20=E5=8E=BB=E6=8E=89=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/canvas/DeCanvas.vue | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/core/core-frontend/src/views/canvas/DeCanvas.vue b/core/core-frontend/src/views/canvas/DeCanvas.vue index fbea5b1caa..c7db334f85 100644 --- a/core/core-frontend/src/views/canvas/DeCanvas.vue +++ b/core/core-frontend/src/views/canvas/DeCanvas.vue @@ -11,8 +11,6 @@ import { getCanvasStyle, syncShapeItemStyle } from '@/utils/style' import { adaptCurThemeCommonStyle } from '@/utils/canvasStyle' import CanvasCore from '@/components/data-visualization/canvas/CanvasCore.vue' import { isMainCanvas } from '@/utils/canvasUtils' -import { activeWatermark } from '@/components/watermark/watermark' -import { personInfoApi } from '@/api/user' // change-begin const props = defineProps({ @@ -191,32 +189,6 @@ const moveOutFromTab = component => { }, 500) } -const initWatermark = (waterDomId = 'edit-canvas-main') => { - // if (dvInfo.value.watermarkInfo && isMainCanvas(canvasId.value)) { - // if (userInfo.value) { - // activeWatermark( - // dvInfo.value.watermarkInfo.settingContent, - // userInfo.value, - // waterDomId, - // canvasId.value, - // dvInfo.value.selfWatermarkStatus - // ) - // } else { - // const method = personInfoApi - // method().then(res => { - // userInfo.value = res.data - // activeWatermark( - // dvInfo.value.watermarkInfo.settingContent, - // userInfo.value, - // waterDomId, - // canvasId.value, - // dvInfo.value.selfWatermarkStatus - // ) - // }) - // } - // } -} - // 全局监听按键事件 onMounted(() => { window.addEventListener('resize', canvasSizeInit) From 12380fe830ad1ec3ba63e2fef5e57073fef893a4 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 11 Jan 2024 15:28:20 +0800 Subject: [PATCH 08/51] =?UTF-8?q?perf:=20=E4=BB=BB=E5=8A=A1=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E8=8F=9C=E5=8D=95=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- de-xpack | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/de-xpack b/de-xpack index 8b37827744..2937e3c57b 160000 --- a/de-xpack +++ b/de-xpack @@ -1 +1 @@ -Subproject commit 8b378277440ec171aa960a537274017d0609551b +Subproject commit 2937e3c57b6db56dd7ab4dd706d70eb9b076d06a From 1ef0a58e79d9100dc98d2f9caf3217b26b0d4972 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 11 Jan 2024 15:48:19 +0800 Subject: [PATCH 09/51] =?UTF-8?q?refactor(=E6=95=B0=E6=8D=AE=E5=A4=A7?= =?UTF-8?q?=E5=B1=8F):=20=E8=B0=83=E6=95=B4=E5=B1=8F=E5=B9=95=E5=B0=BA?= =?UTF-8?q?=E5=AF=B8=E7=9A=84=E4=B8=8A=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/data-visualization/CanvasAttr.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-frontend/src/components/data-visualization/CanvasAttr.vue b/core/core-frontend/src/components/data-visualization/CanvasAttr.vue index 14a7e741f5..8fa8f48fb9 100644 --- a/core/core-frontend/src/components/data-visualization/CanvasAttr.vue +++ b/core/core-frontend/src/components/data-visualization/CanvasAttr.vue @@ -66,7 +66,7 @@ onMounted(() => { effect="dark" size="middle" :min="600" - :max="4096" + :max="100000" v-model="canvasStyleData.width" @change="onBaseChange" controls-position="right" @@ -79,7 +79,7 @@ onMounted(() => { effect="dark" size="middle" :min="600" - :max="4096" + :max="100000" v-model="canvasStyleData.height" @change="onBaseChange" controls-position="right" From cc4af0d42327db046abb557ef4f21e9dfac1c09f Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Thu, 11 Jan 2024 15:55:05 +0800 Subject: [PATCH 10/51] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0Tab?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E5=AD=97=E7=AC=A6=E9=99=90=E5=88=B6=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E4=B8=BA50?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core-frontend/src/custom-component/de-tabs/Component.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-frontend/src/custom-component/de-tabs/Component.vue b/core/core-frontend/src/custom-component/de-tabs/Component.vue index b06848a8b3..093f4b86a0 100644 --- a/core/core-frontend/src/custom-component/de-tabs/Component.vue +++ b/core/core-frontend/src/custom-component/de-tabs/Component.vue @@ -84,7 +84,7 @@ >