Merge b2abdd25e6 into d8011d857a
This commit is contained in:
commit
5357062b79
|
|
@ -18,7 +18,9 @@
|
|||
package org.apache.dolphinscheduler.api.controller;
|
||||
|
||||
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_PLUGINS_ERROR;
|
||||
import static org.apache.dolphinscheduler.api.enums.Status.VERSION_INFO_STATE_ERROR;
|
||||
|
||||
import org.apache.dolphinscheduler.api.dto.ProductInfoDto;
|
||||
import org.apache.dolphinscheduler.api.exceptions.ApiException;
|
||||
import org.apache.dolphinscheduler.api.service.UiPluginService;
|
||||
import org.apache.dolphinscheduler.api.utils.Result;
|
||||
|
|
@ -27,22 +29,24 @@ import org.apache.dolphinscheduler.common.enums.PluginType;
|
|||
import org.apache.dolphinscheduler.dao.entity.User;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestAttribute;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.Parameters;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestAttribute;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import static org.apache.dolphinscheduler.api.enums.Status.*;
|
||||
|
||||
/**
|
||||
* ui plugin controller
|
||||
|
|
@ -85,4 +89,13 @@ public class UiPluginController extends BaseController {
|
|||
Map<String, Object> result = uiPluginService.queryUiPluginDetailById(pluginId);
|
||||
return returnDataList(result);
|
||||
}
|
||||
|
||||
@Operation(summary = "queryProductInfo", description = "QUERY_PRODUCT_INFO")
|
||||
@GetMapping(value = "/query-product-info")
|
||||
@ResponseStatus(HttpStatus.OK)
|
||||
@ApiException(VERSION_INFO_STATE_ERROR)
|
||||
public Result<ProductInfoDto> queryProductInfo() {
|
||||
ProductInfoDto result = uiPluginService.queryProductInfo();
|
||||
return Result.success(result);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.api.dto;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* ProductInfoDto
|
||||
*/
|
||||
@Data
|
||||
public class ProductInfoDto {
|
||||
|
||||
private String version;
|
||||
}
|
||||
|
|
@ -298,6 +298,7 @@ public enum Status {
|
|||
QUERY_PROJECT_PREFERENCE_ERROR(10302, "query project preference error", "查询项目偏好设置错误"),
|
||||
UPDATE_PROJECT_PREFERENCE_STATE_ERROR(10303, "Failed to update the state of the project preference", "更新项目偏好设置错误"),
|
||||
|
||||
VERSION_INFO_STATE_ERROR(10304, "Failed to obtain project version and address", "获取版本信息错误"),
|
||||
UDF_FUNCTION_NOT_EXIST(20001, "UDF function not found", "UDF函数不存在"),
|
||||
UDF_FUNCTION_EXISTS(20002, "UDF function already exists", "UDF函数已存在"),
|
||||
RESOURCE_NOT_EXIST(20004, "resource not exist", "资源不存在"),
|
||||
|
|
|
|||
|
|
@ -17,7 +17,9 @@
|
|||
|
||||
package org.apache.dolphinscheduler.api.service;
|
||||
|
||||
import org.apache.dolphinscheduler.api.dto.ProductInfoDto;
|
||||
import org.apache.dolphinscheduler.common.enums.PluginType;
|
||||
import org.apache.dolphinscheduler.dao.entity.User;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
|
@ -30,4 +32,6 @@ public interface UiPluginService {
|
|||
|
||||
Map<String, Object> queryUiPluginDetailById(int id);
|
||||
|
||||
ProductInfoDto queryProductInfo();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,11 +17,16 @@
|
|||
|
||||
package org.apache.dolphinscheduler.api.service.impl;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.dolphinscheduler.api.dto.ProductInfoDto;
|
||||
import org.apache.dolphinscheduler.api.enums.Status;
|
||||
import org.apache.dolphinscheduler.api.exceptions.ServiceException;
|
||||
import org.apache.dolphinscheduler.api.service.UiPluginService;
|
||||
import org.apache.dolphinscheduler.common.constants.Constants;
|
||||
import org.apache.dolphinscheduler.common.enums.PluginType;
|
||||
import org.apache.dolphinscheduler.dao.entity.DsVersion;
|
||||
import org.apache.dolphinscheduler.dao.entity.PluginDefine;
|
||||
import org.apache.dolphinscheduler.dao.entity.User;
|
||||
import org.apache.dolphinscheduler.dao.mapper.PluginDefineMapper;
|
||||
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
|
|
@ -32,9 +37,13 @@ import java.util.Map;
|
|||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
||||
import org.apache.dolphinscheduler.dao.repository.DsVersionDao;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
/**
|
||||
* ui plugin service impl
|
||||
*/
|
||||
|
|
@ -45,6 +54,16 @@ public class UiPluginServiceImpl extends BaseServiceImpl implements UiPluginServ
|
|||
@Autowired
|
||||
PluginDefineMapper pluginDefineMapper;
|
||||
|
||||
@Autowired
|
||||
private DsVersionDao dsVersionDao;
|
||||
|
||||
private String dsVersion;
|
||||
|
||||
@PostConstruct
|
||||
private void init() {
|
||||
dsVersion = dsVersionDao.selectVersion().map(DsVersion::getVersion).orElse("unknown");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> queryUiPluginsByType(PluginType pluginType) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
|
@ -82,4 +101,11 @@ public class UiPluginServiceImpl extends BaseServiceImpl implements UiPluginServ
|
|||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProductInfoDto queryProductInfo() {
|
||||
ProductInfoDto result = new ProductInfoDto();
|
||||
result.setVersion(dsVersion);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,17 +22,24 @@ import static org.mockito.ArgumentMatchers.any;
|
|||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import org.apache.dolphinscheduler.api.dto.ProductInfoDto;
|
||||
import org.apache.dolphinscheduler.api.enums.Status;
|
||||
import org.apache.dolphinscheduler.api.service.UiPluginService;
|
||||
import org.apache.dolphinscheduler.api.utils.Result;
|
||||
import org.apache.dolphinscheduler.common.constants.Constants;
|
||||
import org.apache.dolphinscheduler.common.enums.PluginType;
|
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils;
|
||||
import org.apache.dolphinscheduler.dao.entity.User;
|
||||
|
||||
import org.mockito.Mockito;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.test.web.servlet.MvcResult;
|
||||
|
|
@ -41,6 +48,9 @@ import org.springframework.util.MultiValueMap;
|
|||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* ui plugin controller test
|
||||
*/
|
||||
|
|
@ -91,4 +101,23 @@ public class UiPluginControllerTest extends AbstractControllerTest {
|
|||
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
|
||||
assertThat(actualResponseContent.toString()).isEqualTo(expectResponseContent.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryProductInfo() throws Exception {
|
||||
ProductInfoDto mockResult = new ProductInfoDto();
|
||||
Mockito.when(uiPluginService.queryProductInfo()).thenReturn(mockResult);
|
||||
|
||||
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
|
||||
paramsMap.add("userId", "1");
|
||||
|
||||
MvcResult mvcResult = mockMvc.perform(get("/ui-plugins/query-product-info")
|
||||
.header(SESSION_ID, sessionId)
|
||||
.params(paramsMap))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
|
||||
.andReturn();
|
||||
|
||||
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
|
||||
Assertions.assertEquals(Status.SUCCESS.getCode(), result.getCode().intValue());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@ export function useDropDown() {
|
|||
useLogout()
|
||||
} else if (key === 'password') {
|
||||
router.push({ path: '/password' })
|
||||
} else if (key === 'about') {
|
||||
router.push({ path: '/about' })
|
||||
} else if (key === 'profile') {
|
||||
router.push({ path: '/profile' })
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import {
|
|||
DesktopOutlined,
|
||||
SafetyCertificateOutlined,
|
||||
UserOutlined,
|
||||
SelectOutlined,
|
||||
LogoutOutlined,
|
||||
FundProjectionScreenOutlined,
|
||||
PartitionOutlined,
|
||||
|
|
@ -376,6 +377,11 @@ export function useDataList() {
|
|||
icon: renderIcon(KeyOutlined),
|
||||
disabled: userStore.getSecurityConfigType !== 'PASSWORD'
|
||||
},
|
||||
{
|
||||
label: t('user_dropdown.about'),
|
||||
key: 'about',
|
||||
icon: renderIcon(SelectOutlined),
|
||||
},
|
||||
{
|
||||
label: t('user_dropdown.logout'),
|
||||
key: 'logout',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export default {
|
||||
about: 'About',
|
||||
about_version: 'Product Version'
|
||||
}
|
||||
|
|
@ -32,6 +32,7 @@ import security from '@/locales/en_US/security'
|
|||
import theme from '@/locales/en_US/theme'
|
||||
import user_dropdown from '@/locales/en_US/user-dropdown'
|
||||
import ui_setting from '@/locales/en_US/ui_setting'
|
||||
import about from "@/locales/en_US/about";
|
||||
|
||||
export default {
|
||||
login,
|
||||
|
|
@ -41,6 +42,7 @@ export default {
|
|||
menu,
|
||||
home,
|
||||
password,
|
||||
about,
|
||||
profile,
|
||||
monitor,
|
||||
resource,
|
||||
|
|
|
|||
|
|
@ -18,5 +18,6 @@
|
|||
export default {
|
||||
profile: 'Profile',
|
||||
password: 'Password',
|
||||
about: 'About',
|
||||
logout: 'Logout'
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export default {
|
||||
about: '关于产品',
|
||||
about_version: '产品版本'
|
||||
}
|
||||
|
|
@ -32,6 +32,7 @@ import security from '@/locales/zh_CN/security'
|
|||
import theme from '@/locales/zh_CN/theme'
|
||||
import user_dropdown from '@/locales/zh_CN/user-dropdown'
|
||||
import ui_setting from '@/locales/zh_CN/ui_setting'
|
||||
import about from "@/locales/zh_CN/about";
|
||||
|
||||
export default {
|
||||
login,
|
||||
|
|
@ -41,6 +42,7 @@ export default {
|
|||
menu,
|
||||
home,
|
||||
password,
|
||||
about,
|
||||
profile,
|
||||
monitor,
|
||||
resource,
|
||||
|
|
|
|||
|
|
@ -18,5 +18,6 @@
|
|||
export default {
|
||||
profile: '用户信息',
|
||||
password: '密码管理',
|
||||
about: '产品信息',
|
||||
logout: '退出登录'
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,6 +68,15 @@ const basePage: RouteRecordRaw[] = [
|
|||
title: '用户信息',
|
||||
auth: []
|
||||
}
|
||||
},
|
||||
{
|
||||
path: '/about',
|
||||
name: 'about',
|
||||
component: components['about'],
|
||||
meta: {
|
||||
title: '产品信息',
|
||||
auth: []
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
|||
|
|
@ -32,3 +32,10 @@ export function queryUiPluginDetailById(id: IPluginId): any {
|
|||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function queryProductInfo(): any {
|
||||
return axios({
|
||||
url: '/ui-plugins/query-product-info',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import { defineComponent, onMounted, ref} from 'vue'
|
||||
import Card from '@/components/card'
|
||||
import { NSpace } from 'naive-ui'
|
||||
import { queryProductInfo } from '@/service/modules/ui-plugins'
|
||||
|
||||
const about = defineComponent({
|
||||
name: 'about',
|
||||
setup() {
|
||||
const info: any = ref('')
|
||||
const queryProduct = async () => {
|
||||
const productInfo = await queryProductInfo()
|
||||
if (!productInfo) throw Error()
|
||||
info.value = productInfo.version
|
||||
}
|
||||
onMounted( () => {
|
||||
queryProduct()
|
||||
})
|
||||
|
||||
return { queryProduct, info }
|
||||
},
|
||||
render() {
|
||||
const { t } = useI18n()
|
||||
const { info } = this
|
||||
return (
|
||||
<div>
|
||||
<Card
|
||||
title={t('about.about')}
|
||||
>
|
||||
<NSpace vertical>
|
||||
<NSpace align='center' >
|
||||
<span>{t('about.about_version')}</span>
|
||||
<div>{ info }</div>
|
||||
</NSpace>
|
||||
</NSpace>
|
||||
</Card>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
})
|
||||
export default about
|
||||
Loading…
Reference in New Issue