From ee323058161ea4ab7a556590529b1fbbc8fb92e7 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Wed, 26 Oct 2022 19:24:19 +0800
Subject: [PATCH 01/39] =?UTF-8?q?fix(=E7=99=BB=E5=87=BA):=20oidc=E5=AE=95?=
=?UTF-8?q?=E6=9C=BA=E5=90=8E=E6=97=A0=E6=B3=95=E9=80=80=E5=87=BA=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../io/dataease/auth/server/AuthServer.java | 25 +++++++++++++------
frontend/src/api/user.js | 6 +++--
frontend/src/lang/en.js | 4 +++
frontend/src/lang/tw.js | 4 +++
frontend/src/lang/zh.js | 4 +++
frontend/src/store/modules/user.js | 23 +++++++++++++++++
6 files changed, 57 insertions(+), 9 deletions(-)
diff --git a/backend/src/main/java/io/dataease/auth/server/AuthServer.java b/backend/src/main/java/io/dataease/auth/server/AuthServer.java
index ac43dc69ce..e86731d06f 100644
--- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java
+++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java
@@ -12,6 +12,7 @@ import io.dataease.auth.service.AuthUserService;
import io.dataease.auth.util.JWTUtils;
import io.dataease.auth.util.RsaUtil;
import io.dataease.commons.constants.SysLogConstants;
+import io.dataease.commons.exception.DEException;
import io.dataease.commons.utils.*;
import io.dataease.controller.sys.request.LdapAddRequest;
import io.dataease.exception.DataEaseException;
@@ -240,8 +241,13 @@ public class AuthServer implements AuthApi {
HttpServletRequest request = ServletUtils.request();
String idToken = request.getHeader("IdToken");
if (StringUtils.isNotBlank(idToken)) {
- OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
- oidcXpackService.logout(idToken);
+ try {
+ OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
+ oidcXpackService.logout(idToken);
+ } catch (Exception e) {
+ LogUtil.error(e.getMessage(), e);
+ DEException.throwException("oidc_logout_error");
+ }
}
}
@@ -253,11 +259,16 @@ public class AuthServer implements AuthApi {
String result = null;
Integer defaultLoginType = systemParameterService.defaultLoginType();
if (defaultLoginType == 3 && isOpenCas()) {
- HttpServletRequest request = ServletUtils.request();
- HttpSession session = request.getSession();
- session.invalidate();
- CasXpackService casXpackService = SpringContextUtil.getBean(CasXpackService.class);
- result = casXpackService.logout();
+ try {
+ HttpServletRequest request = ServletUtils.request();
+ HttpSession session = request.getSession();
+ session.invalidate();
+ CasXpackService casXpackService = SpringContextUtil.getBean(CasXpackService.class);
+ result = casXpackService.logout();
+ } catch (Exception e) {
+ LogUtil.error(e.getMessage(), e);
+ DEException.throwException("cas_logout_error");
+ }
}
try {
Long userId = JWTUtils.tokenInfoByToken(token).getUserId();
diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js
index 32d2067307..f7b0df9167 100644
--- a/frontend/src/api/user.js
+++ b/frontend/src/api/user.js
@@ -18,14 +18,16 @@ export function getInfo(token) {
export function logout() {
return request({
url: '/api/auth/logout',
- method: 'post'
+ method: 'post',
+ hideMsg: true
})
}
export function deLogout() {
return request({
url: '/api/auth/deLogout',
- method: 'post'
+ method: 'post',
+ hideMsg: true
})
}
diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js
index 9b9d4d14b0..2b396f403a 100644
--- a/frontend/src/lang/en.js
+++ b/frontend/src/lang/en.js
@@ -2626,5 +2626,9 @@ export default {
apply_logs: 'Apply logs',
app_group_delete_tips: 'Are you sure to delete this application category?',
app_group_delete_content: 'After deletion, all application templates in this category will also be deleted.'
+ },
+ logout: {
+ oidc_logout_error: 'OIDC failed to exit, do you continue to exit DataEase?',
+ cas_logout_error: 'CAS服务异常,请联系管理员!'
}
}
diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js
index ad78066c42..3e41d495c2 100644
--- a/frontend/src/lang/tw.js
+++ b/frontend/src/lang/tw.js
@@ -2627,5 +2627,9 @@ export default {
apply_logs: '應用記錄',
app_group_delete_tips: '確定刪除該應用分類嗎?',
app_group_delete_content: '刪除後,該分類中所有的應用模闆也將被刪除。'
+ },
+ logout: {
+ oidc_logout_error: 'OIDC退出失敗,是否繼續退出DataEase?',
+ cas_logout_error: 'CAS服務異常,請聯系管理員!'
}
}
diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js
index 009725ad24..86e6efae90 100644
--- a/frontend/src/lang/zh.js
+++ b/frontend/src/lang/zh.js
@@ -2627,5 +2627,9 @@ export default {
apply_logs: '应用记录',
app_group_delete_tips: '确定删除该应用分类吗?',
app_group_delete_content: '删除后,该分类中所有的应用模板也将被删除。'
+ },
+ logout: {
+ oidc_logout_error: 'OIDC退出失败,是否继续退出DataEase?',
+ cas_logout_error: 'The CAS service is abnormal, please contact the administrator!'
}
}
diff --git a/frontend/src/store/modules/user.js b/frontend/src/store/modules/user.js
index a14a2db029..5d8795d358 100644
--- a/frontend/src/store/modules/user.js
+++ b/frontend/src/store/modules/user.js
@@ -6,6 +6,7 @@ import { getLanguage } from '@/lang/index'
import Cookies from 'js-cookie'
import router from '@/router'
import i18n from '@/lang'
+import { $alert, $confirm } from '@/utils/message'
const getDefaultState = () => {
return {
token: getToken(),
@@ -146,6 +147,28 @@ const actions = {
resolve(res.data)
}).catch(error => {
reject(error)
+ if (error?.response?.data?.message) {
+ if (error.response.data.message === ('oidc_logout_error')) {
+ const message = i18n.t('logout.' + error.response.data.message)
+ $confirm(message, () => {
+ removeToken() // must remove token first
+ resetRouter()
+ commit('RESET_STATE')
+ window.location.href = '/'
+ }, {
+ confirmButtonText: i18n.t('commons.confirm')
+ })
+ }
+ if (error.response.data.message === ('cas_logout_error')) {
+ const message = i18n.t('logout.' + error.response.data.message)
+ $alert(message, () => {
+
+ }, {
+ confirmButtonText: i18n.t('commons.confirm'),
+ showClose: false
+ })
+ }
+ }
})
})
},
From 3cc6dd041b921926c5f1e653aae68264e4b40e95 Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Wed, 26 Oct 2022 19:34:56 +0800
Subject: [PATCH 02/39] =?UTF-8?q?feat(=E5=BA=94=E7=94=A8=E5=B8=82=E5=9C=BA?=
=?UTF-8?q?):=20=E4=B8=89=E6=96=B9=E5=BA=94=E7=94=A8=E5=AF=B9=E6=8E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/panel/AppLogController.java | 19 +-
.../panel/PanelGroupController.java | 14 +
.../request/dataset/DataSetGroupRequest.java | 2 +
.../panel/PanelAppTemplateApplyRequest.java | 6 +
.../dto/appTemplateMarket/AppLogGridDTO.java | 8 +
.../java/io/dataease/ext/ExtAppLogMapper.xml | 20 +-
.../io/dataease/ext/ExtDataSetGroupMapper.xml | 6 +-
.../panel/PanelAppTemplateService.java | 40 +-
.../service/panel/PanelGroupService.java | 67 ++-
.../service/panel/applog/AppLogService.java | 28 +
.../main/resources/db/migration/V42__1.16.sql | 11 +
frontend/src/api/appTemplateMarket/log.js | 13 +-
frontend/src/api/panel/panel.js | 29 +-
.../components/business/DeLayoutContent.vue | 2 +-
frontend/src/lang/en.js | 12 +-
frontend/src/lang/tw.js | 12 +-
frontend/src/lang/zh.js | 12 +-
.../panel/appTemplate/AppTemplateContent.vue | 535 ++++++++++++++++++
.../component/AppTemplateApply.vue | 54 ++
.../appTemplate/component/TemplateItem.vue | 130 ++++-
.../appTemplate/component/TemplateList.vue | 28 +-
.../src/views/panel/appTemplate/index.vue | 504 +----------------
.../component/AppMarketPreview.vue | 124 ++++
.../views/panel/appTemplateMarket/index.vue | 278 ++++-----
.../panel/appTemplateMarket/log/index.vue | 167 +++++-
.../src/views/panel/list/PanelViewShow.vue | 153 ++---
.../src/views/system/datasource/DsForm.vue | 380 +++++++++++--
27 files changed, 1835 insertions(+), 819 deletions(-)
create mode 100644 frontend/src/views/panel/appTemplate/AppTemplateContent.vue
create mode 100644 frontend/src/views/panel/appTemplate/component/AppTemplateApply.vue
create mode 100644 frontend/src/views/panel/appTemplateMarket/component/AppMarketPreview.vue
diff --git a/backend/src/main/java/io/dataease/controller/panel/AppLogController.java b/backend/src/main/java/io/dataease/controller/panel/AppLogController.java
index f388d18a78..45a547acf3 100644
--- a/backend/src/main/java/io/dataease/controller/panel/AppLogController.java
+++ b/backend/src/main/java/io/dataease/controller/panel/AppLogController.java
@@ -21,24 +21,31 @@ import java.util.List;
@RestController
@Api(tags = "应用市场:应用日志")
@ApiSupport(order = 220)
-@RequestMapping("/app/log")
+@RequestMapping("app/log")
public class AppLogController {
@Resource
- private AppLogService applogService;
+ private AppLogService appLogService;
@I18n
@ApiOperation("查询日志")
@PostMapping("/logGrid/{goPage}/{pageSize}")
@ApiImplicitParams({
- @ApiImplicitParam(paramType = "path", name = "goPage", value = "页码", required = true, dataType = "Integer"),
- @ApiImplicitParam(paramType = "path", name = "pageSize", value = "页容量", required = true, dataType = "Integer"),
- @ApiImplicitParam(name = "request", value = "查询条件", required = true)
+ @ApiImplicitParam(paramType = "path", name = "goPage", value = "页码", required = true, dataType = "Integer"),
+ @ApiImplicitParam(paramType = "path", name = "pageSize", value = "页容量", required = true, dataType = "Integer"),
+ @ApiImplicitParam(name = "request", value = "查询条件", required = true)
})
public Pager> logGrid(@PathVariable int goPage, @PathVariable int pageSize,
@RequestBody KeyGridRequest request) {
Page
{{ $t("user.clear_filter") }}
+ >{{ $t('user.clear_filter') }}
+
- {{ row.datasourceName }}
+ {{ row.datasourceName }}
+ {{ row.datasourceName }}
+ :label="$t('app_template.panel')"
+ >
+
+ {{ row.panelName }}
+ {{ row.panelName }}
+
+
{{ scope.row.applyTime | timestampFormatDate }}
+
+
+ {{ $t('commons.edit') }}
+
+ {{ $t('commons.delete') }}
+
+
+
@@ -132,6 +166,36 @@
@search="filterDraw"
/>
+
+
+
+
+
+
+
+
+ {{$t('app_template.log_resource_delete_tips')}}
+
+
+ {{ $t('commons.cancel') }}
+ {{ $t('commons.confirm') }}
+
+
@@ -144,10 +208,14 @@ import {
addOrder,
formatOrders
} from '@/utils/index'
-import { logGrid } from '@/api/appTemplateMarket/log'
+import { deleteLogAndResource, logGrid } from '@/api/appTemplateMarket/log'
+import { findOneWithParent } from '@/api/panel/panel'
+import AppTemplateApply from '@/views/panel/appTemplate/component/AppTemplateApply'
+import { deepCopy } from '@/components/canvas/utils/utils'
+
export default {
name: 'AppTemplateLog',
- components: { GridTable, filterUser },
+ components: { AppTemplateApply, GridTable, filterUser },
mixins: [keyEnter],
props: {
appTemplateId: {
@@ -162,6 +230,11 @@ export default {
},
data() {
return {
+ deleteConfirmDialog: false,
+ deleteItemInfo: {
+ deleteResource: false
+ },
+ operateWidth: 168,
columns: [],
paginationConfig: {
currentPage: 1,
@@ -194,6 +267,53 @@ export default {
this.resizeObserver()
},
methods: {
+ closeDel() {
+ this.deleteItemInfo = {
+ deleteResource: false
+ }
+ this.deleteConfirmDialog = false
+ },
+ confirmDel() {
+ deleteLogAndResource(this.deleteItemInfo).then(()=>{
+ this.closeDel()
+ this.search()
+ })
+ },
+ closeDraw() {
+ this.search()
+ },
+ editApply(item) {
+ const param = {
+ datasourceType: item.datasourceType,
+ logId: item.id,
+ panelId: item.panelId,
+ panelGroupPid: item.panelGroupPid,
+ datasourceId: item.datasourceId,
+ datasetGroupPid: item.datasetGroupPid,
+ datasetGroupId: item.datasetGroupId,
+ datasetGroupName: item.datasetGroupName,
+ panelName: item.panelName
+ }
+ this.$refs.templateEditApply.init(param)
+ },
+ goToDatasource(row) {
+
+ },
+ goPanel(row) {
+ findOneWithParent(row.panelId).then(rsp => {
+ this.$router.push({ name: 'panel', params: rsp.data })
+ })
+ },
+ edit() {
+
+ },
+ del(item) {
+ this.deleteItemInfo = {
+ ...item,
+ deleteResource: false
+ }
+ this.deleteConfirmDialog = true
+ },
applyNew() {
this.$emit('applyNew')
},
@@ -302,4 +422,13 @@ export default {
.table-container-filter {
height: calc(100% - 110px);
}
+
+.link-span {
+ color: #3370FF;
+ cursor: pointer;
+
+ &:hover {
+ text-decoration: underline;
+ }
+}
diff --git a/frontend/src/views/panel/list/PanelViewShow.vue b/frontend/src/views/panel/list/PanelViewShow.vue
index 106a7dbb4a..25279cdd46 100644
--- a/frontend/src/views/panel/list/PanelViewShow.vue
+++ b/frontend/src/views/panel/list/PanelViewShow.vue
@@ -17,7 +17,7 @@
style="border-bottom: 1px solid;border-bottom-color:#E6E6E6;"
>
-
+
-
+
{{ $t('panel.export_to_img') }}
+ {{ $t('panel.export_to_app') }}
@@ -304,6 +308,7 @@ export default {
},
data() {
return {
+ canvasInfoTemp: 'preview-temp-canvas-main',
canvasId: 'canvas-main',
showMain: true,
pdfTemplateSelectedIndex: 0,
@@ -405,7 +410,7 @@ export default {
saveToTemplate() {
this.dataLoading = true
setTimeout(() => {
- html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => {
+ html2canvas(document.getElementById(this.canvasInfoTemp)).then(canvas => {
this.templateSaveShow = true
this.dataLoading = false
const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.2是图片质量
@@ -430,7 +435,7 @@ export default {
_this.dataLoading = true
try {
_this.findStaticSource(function(staticResource) {
- html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => {
+ html2canvas(document.getElementById(_this.canvasInfoTemp)).then(canvas => {
_this.dataLoading = false
const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.1是图片质量
if (snapshot !== '') {
@@ -458,9 +463,9 @@ export default {
_this.dataLoading = true
try {
_this.findStaticSource(function(staticResource) {
- html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => {
+ html2canvas(document.getElementById(_this.canvasInfoTemp)).then(canvas => {
_this.dataLoading = false
- const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.1是图片质量
+ const snapshot = canvas.toDataURL('image/jpeg', 1) // 0.1是图片质量
if (snapshot !== '') {
const panelInfo = {
name: _this.$store.state.panel.panelInfo.name,
@@ -528,7 +533,7 @@ export default {
setTimeout(() => {
this.exporting = true
setTimeout(() => {
- const canvasID = document.getElementById('canvasInfoTemp')
+ const canvasID = document.getElementById(this.canvasInfoTemp)
const a = document.createElement('a')
html2canvas(canvasID).then(canvas => {
this.exporting = false
@@ -559,7 +564,7 @@ export default {
setTimeout(() => {
this.exporting = true
setTimeout(() => {
- html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => {
+ html2canvas(document.getElementById(this.canvasInfoTemp)).then(canvas => {
const snapshot = canvas.toDataURL('image/jpeg', 1) // 是图片质量
this.dataLoading = false
this.exporting = false
@@ -573,7 +578,7 @@ export default {
},
refreshTemplateInfo() {
this.templateInfo = {}
- html2canvas(document.getElementById('canvasInfoTemp')).then(canvas => {
+ html2canvas(document.getElementById(this.canvasInfoTemp)).then(canvas => {
const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.2是图片质量
if (snapshot !== '') {
this.templateInfo = {
@@ -623,7 +628,9 @@ export default {
if (this.showType === 1 && this.shareUserId !== null) {
const param = { userId: this.shareUserId }
proxyInitPanelData(this.panelInfo.id, param, null)
- } else { initPanelData(this.panelInfo.id, false) }
+ } else {
+ initPanelData(this.panelInfo.id, false)
+ }
},
changePublishState() {
if (this.panelInfo.status === 'publish') {
@@ -642,72 +649,76 @@ export default {
diff --git a/frontend/src/views/system/datasource/DsForm.vue b/frontend/src/views/system/datasource/DsForm.vue
index 96ca0ac5f0..0382ad2bee 100644
--- a/frontend/src/views/system/datasource/DsForm.vue
+++ b/frontend/src/views/system/datasource/DsForm.vue
@@ -1,9 +1,9 @@