This is an automated email from the ASF dual-hosted git repository. benjobs pushed a commit to branch sso in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git
commit 1acd2a87f910f8d758a5a8a60f3c101eb3242cef Author: benjobs <[email protected]> AuthorDate: Sat Jul 1 14:44:55 2023 +0800 sso login improvement --- .../system/authentication/ShiroService.java | 7 +- .../system/controller/PassportController.java | 64 ++++++------- .../console/system/controller/SsoController.java | 51 ++-------- .../console/system/service/PassportService.java | 21 +++++ .../console/system/service/UserService.java | 2 + .../system/service/impl/UserServiceImpl.java | 39 ++++++++ .../src/api/flink/resource/index.ts | 1 - .../src/api/system/passport.ts | 56 +++++++++++ .../src/api/system/user.ts | 43 +-------- .../src/locales/lang/en/setting/yarnQueue.ts | 3 +- .../src/locales/lang/en/system/user.ts | 5 +- .../src/locales/lang/zh-CN/setting/yarnQueue.ts | 3 +- .../src/locales/lang/zh-CN/system/user.ts | 4 +- .../src/router/guard/ssoGuard.ts | 2 +- .../src/store/modules/lock.ts | 4 +- .../src/store/modules/user.ts | 6 +- .../src/views/base/login/LoginForm.vue | 23 ++++- .../src/views/flink/app/EditStreamPark.vue | 6 +- .../components/AppView/StopApplicationModal.vue | 4 +- .../flink/app/hooks/useCreateAndEditSchema.ts | 5 +- .../src/views/flink/app/hooks/useCreateSchema.ts | 8 +- .../src/views/flink/app/hooks/useFlinkRender.tsx | 71 +++++++------- .../src/views/flink/app/utils/index.ts | 13 ++- .../src/views/flink/resource/View.vue | 35 +++---- .../views/flink/resource/components/Resource.vue | 38 ++++---- .../flink/resource/components/ResourceDrawer.vue | 37 ++++---- .../src/views/flink/resource/useResourceRender.tsx | 55 +++++------ .../src/views/setting/FlinkHome/index.vue | 12 +-- .../views/system/user/components/UserDrawer.vue | 105 ++++++++++++--------- .../src/views/system/user/user.data.ts | 4 +- 30 files changed, 371 insertions(+), 356 deletions(-) diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroService.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroService.java index 2abe1bbac..e55126d30 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroService.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/authentication/ShiroService.java @@ -44,7 +44,7 @@ public class ShiroService { @PostConstruct public void init() { - AbstractShiroFilter shiroFilter = null; + AbstractShiroFilter shiroFilter; try { shiroFilter = shiroFilterFactoryBean.getObject(); } catch (Exception e) { @@ -86,9 +86,8 @@ public class ShiroService { shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); filterChainDefinitionMap.forEach( (key, value) -> { - String url = key; - String chainDefinition = value.trim(); - filterChainManager.createChain(url, chainDefinition); + String chainDefinition = value.trim(); + filterChainManager.createChain(key, chainDefinition); }); } } diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java index bfb5f819c..a19cf7bc8 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/PassportController.java @@ -17,24 +17,19 @@ package org.apache.streampark.console.system.controller; -import org.apache.streampark.common.util.DateUtils; -import org.apache.streampark.console.base.domain.ResponseCode; +import lombok.extern.slf4j.Slf4j; import org.apache.streampark.console.base.domain.RestResponse; -import org.apache.streampark.console.base.properties.ShiroProperties; -import org.apache.streampark.console.base.util.WebUtils; -import org.apache.streampark.console.system.authentication.JWTToken; -import org.apache.streampark.console.system.authentication.JWTUtil; import org.apache.streampark.console.system.entity.User; import org.apache.streampark.console.system.security.Authenticator; import org.apache.streampark.console.system.service.UserService; -import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -42,10 +37,12 @@ import org.springframework.web.bind.annotation.RestController; import javax.validation.constraints.NotBlank; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; import java.util.Map; @Tag(name = "PASSPORT_TAG") +@Slf4j @Validated @RestController @RequestMapping("passport") @@ -53,10 +50,28 @@ public class PassportController { @Autowired private UserService userService; - @Autowired private ShiroProperties properties; - @Autowired private Authenticator authenticator; + @Value("${sso.enable:#{false}}") + private Boolean ssoEnable; + + @Value("${ldap.enable:#{false}}") + private Boolean ldapEnable; + + @Operation(summary = "SigninType") + @PostMapping("signtype") + public RestResponse type() { + List<String> types = new ArrayList<>(); + types.add("password"); + if (ssoEnable) { + types.add("sso"); + } + if (ldapEnable) { + types.add("ldap"); + } + return RestResponse.success(types); + } + @Operation(summary = "Signin") @PostMapping("signin") public RestResponse signin( @@ -70,33 +85,8 @@ public class PassportController { } User user = authenticator.authenticate(username, password, loginType); - - if (user == null) { - return RestResponse.success().put("code", 0); - } - - if (User.STATUS_LOCK.equals(user.getStatus())) { - return RestResponse.success().put("code", 1); - } - - // set team - userService.fillInTeam(user); - - // no team. - if (user.getLastTeamId() == null) { - return RestResponse.success().data(user.getUserId()).put("code", ResponseCode.CODE_FORBIDDEN); - } - - this.userService.updateLoginTime(username); - String token = WebUtils.encryptToken(JWTUtil.sign(user.getUserId(), username)); - LocalDateTime expireTime = LocalDateTime.now().plusSeconds(properties.getJwtTimeOut()); - String expireTimeStr = DateUtils.formatFullTime(expireTime); - JWTToken jwtToken = new JWTToken(token, expireTimeStr); - String userId = RandomStringUtils.randomAlphanumeric(20); - user.setId(userId); - Map<String, Object> userInfo = - userService.generateFrontendUserInfo(user, user.getLastTeamId(), jwtToken); - return new RestResponse().data(userInfo); + Map<String, Object> userInfo = userService.getLoginUserInfo(user); + return RestResponse.success(userInfo); } @Operation(summary = "Signout") diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/SsoController.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/SsoController.java index f40b22376..8dabdfda2 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/SsoController.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/controller/SsoController.java @@ -17,20 +17,13 @@ package org.apache.streampark.console.system.controller; -import org.apache.streampark.common.util.DateUtils; -import org.apache.streampark.console.base.domain.ResponseCode; import org.apache.streampark.console.base.domain.RestResponse; import org.apache.streampark.console.base.exception.ApiAlertException; -import org.apache.streampark.console.base.properties.ShiroProperties; -import org.apache.streampark.console.base.util.WebUtils; import org.apache.streampark.console.core.enums.LoginType; -import org.apache.streampark.console.system.authentication.JWTToken; -import org.apache.streampark.console.system.authentication.JWTUtil; import org.apache.streampark.console.system.entity.User; import org.apache.streampark.console.system.security.Authenticator; import org.apache.streampark.console.system.service.UserService; -import org.apache.commons.lang3.RandomStringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.Subject; @@ -45,12 +38,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -60,8 +48,6 @@ import java.util.Map; public class SsoController { @Autowired private UserService userService; - @Autowired private ShiroProperties properties; - @Autowired private Authenticator authenticator; @Value("${pac4j.properties.principalNameAttribute:#{null}}") @@ -71,7 +57,7 @@ public class SsoController { private Boolean ssoEnable; @GetMapping("signin") - public ModelAndView signin(RedirectAttributes attributes) throws Exception { + public ModelAndView signin() throws Exception { // Redirect to home page with identity String url = "/#/?from=sso"; return new ModelAndView("redirect:" + url); @@ -79,7 +65,7 @@ public class SsoController { @GetMapping("token") @ResponseBody - public RestResponse token(HttpServletRequest request, HttpServletResponse response) + public RestResponse token() throws Exception { if (!ssoEnable) { throw new ApiAlertException( @@ -97,38 +83,13 @@ public class SsoController { if (principal.getName() == null) { log.error( "Please configure correct principalNameAttribute from UserProfile: " - + principal.toString()); + + principal); throw new ApiAlertException("Please configure the correct Principal Name Attribute"); } + User user = authenticator.authenticate(principal.getName(), null, LoginType.SSO.toString()); - return this.login(user.getUsername(), user); + Map<String, Object> userInfo = userService.getLoginUserInfo(user); + return RestResponse.success(userInfo); } - private RestResponse login(String username, User user) throws Exception { - if (user == null) { - return RestResponse.success().put("code", 0); - } - - if (User.STATUS_LOCK.equals(user.getStatus())) { - return RestResponse.success().put("code", 1); - } - - userService.fillInTeam(user); - - // no team. - if (user.getLastTeamId() == null) { - return RestResponse.success().data(user.getUserId()).put("code", ResponseCode.CODE_FORBIDDEN); - } - - this.userService.updateLoginTime(username); - String token = WebUtils.encryptToken(JWTUtil.sign(user.getUserId(), username)); - LocalDateTime expireTime = LocalDateTime.now().plusSeconds(properties.getJwtTimeOut()); - String expireTimeStr = DateUtils.formatFullTime(expireTime); - JWTToken jwtToken = new JWTToken(token, expireTimeStr); - String userId = RandomStringUtils.randomAlphanumeric(20); - user.setId(userId); - Map<String, Object> userInfo = - userService.generateFrontendUserInfo(user, user.getLastTeamId(), jwtToken); - return new RestResponse().data(userInfo); - } } diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/PassportService.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/PassportService.java new file mode 100644 index 000000000..0307de144 --- /dev/null +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/PassportService.java @@ -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. + */ + +package org.apache.streampark.console.system.service; + +public interface PassportService { +} diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/UserService.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/UserService.java index 6cd179a87..cb347c621 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/UserService.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/UserService.java @@ -113,4 +113,6 @@ public interface UserService extends IService<User> { Map<String, Object> generateFrontendUserInfo(User user, Long teamId, JWTToken token); void transferResource(Long userId, Long targetUserId); + + Map<String, Object> getLoginUserInfo(User user); } diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/impl/UserServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/impl/UserServiceImpl.java index afe3d169d..7f25d4e8e 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/impl/UserServiceImpl.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/system/service/impl/UserServiceImpl.java @@ -17,14 +17,20 @@ package org.apache.streampark.console.system.service.impl; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.streampark.common.util.DateUtils; import org.apache.streampark.common.util.Utils; +import org.apache.streampark.console.base.domain.ResponseCode; import org.apache.streampark.console.base.domain.RestRequest; import org.apache.streampark.console.base.domain.RestResponse; import org.apache.streampark.console.base.exception.ApiAlertException; +import org.apache.streampark.console.base.properties.ShiroProperties; import org.apache.streampark.console.base.util.ShaHashUtils; +import org.apache.streampark.console.base.util.WebUtils; import org.apache.streampark.console.core.service.ApplicationService; import org.apache.streampark.console.core.service.ResourceService; import org.apache.streampark.console.system.authentication.JWTToken; +import org.apache.streampark.console.system.authentication.JWTUtil; import org.apache.streampark.console.system.entity.Team; import org.apache.streampark.console.system.entity.User; import org.apache.streampark.console.system.mapper.UserMapper; @@ -47,6 +53,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Nullable; +import java.time.LocalDateTime; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -68,6 +75,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us @Autowired private ResourceService resourceService; + @Autowired private ShiroProperties shiroProperties; + @Override public User findByName(String username) { LambdaQueryWrapper<User> queryWrapper = @@ -269,4 +278,34 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us applicationService.changeOwnership(userId, targetUserId); resourceService.changeOwnership(userId, targetUserId); } + + @Override + public Map<String, Object> getLoginUserInfo(User user) { + + if (user == null) { + return RestResponse.success().put("code", 0); + } + + if (User.STATUS_LOCK.equals(user.getStatus())) { + return RestResponse.success().put("code", 1); + } + + // set team + fillInTeam(user); + + // no team. + if (user.getLastTeamId() == null) { + return RestResponse.success().data(user.getUserId()).put("code", ResponseCode.CODE_FORBIDDEN); + } + + updateLoginTime(user.getUsername()); + String token = WebUtils.encryptToken(JWTUtil.sign(user.getUserId(), user.getUsername())); + LocalDateTime expireTime = LocalDateTime.now().plusSeconds(shiroProperties.getJwtTimeOut()); + String expireTimeStr = DateUtils.formatFullTime(expireTime); + JWTToken jwtToken = new JWTToken(token, expireTimeStr); + String userId = RandomStringUtils.randomAlphanumeric(20); + user.setId(userId); + Map<String, Object> userInfo = generateFrontendUserInfo(user, user.getLastTeamId(), jwtToken); + return new RestResponse().data(userInfo); + } } diff --git a/streampark-console/streampark-console-webapp/src/api/flink/resource/index.ts b/streampark-console/streampark-console-webapp/src/api/flink/resource/index.ts index 3fc106fd3..1b279c7a6 100644 --- a/streampark-console/streampark-console-webapp/src/api/flink/resource/index.ts +++ b/streampark-console/streampark-console-webapp/src/api/flink/resource/index.ts @@ -76,4 +76,3 @@ export function fetchResourceDelete(data: ResourceDeleteParam): Promise<AxiosRes export function fetchTeamResource(data: Recordable): Promise<ResourceListRecord[]> { return defHttp.post({ url: RESOURCE_API.LIST, data }); } - diff --git a/streampark-console/streampark-console-webapp/src/api/system/passport.ts b/streampark-console/streampark-console-webapp/src/api/system/passport.ts new file mode 100644 index 000000000..f6428a286 --- /dev/null +++ b/streampark-console/streampark-console-webapp/src/api/system/passport.ts @@ -0,0 +1,56 @@ +/* + * 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 + * + * https://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 { AxiosResponse } from 'axios'; +import { defHttp } from '/@/utils/http/axios'; +import { LoginParams, LoginResultModel } from './model/userModel'; + +import { ErrorMessageMode, Result } from '/#/axios'; + +enum Api { + SIGN_IN = '/passport/signin', + SIGN_OUT = '/passport/signout', + SIGN_TYPE = '/passport/signtype', + SSO_TOKEN = '/sso/token', +} + +/** + * @description: user login api + * @return {Promise<AxiosResponse<Result<LoginResultModel>>>} + */ +export function signin( + data: LoginParams, + mode: ErrorMessageMode = 'modal', +): Promise<AxiosResponse<Result<LoginResultModel>>> { + return defHttp.post( + { url: Api.SIGN_IN, data }, + { isReturnNativeResponse: true, errorMessageMode: mode }, + ); +} + +export function signout() { + return defHttp.post({ url: Api.SIGN_OUT }); +} + +export function fetchSignType(): Promise<String[]> { + return defHttp.post({ url: Api.SIGN_TYPE }); +} + +export function fetchSsoToken(): Promise<LoginResultModel> { + return defHttp.get({ + url: Api.SSO_TOKEN, + }); +} diff --git a/streampark-console/streampark-console-webapp/src/api/system/user.ts b/streampark-console/streampark-console-webapp/src/api/system/user.ts index cf2d5df2e..1d94bb8e7 100644 --- a/streampark-console/streampark-console-webapp/src/api/system/user.ts +++ b/streampark-console/streampark-console-webapp/src/api/system/user.ts @@ -17,21 +17,13 @@ import { UserInfo } from '/#/store'; import { AxiosResponse } from 'axios'; import { defHttp } from '/@/utils/http/axios'; -import { - LoginParams, - LoginResultModel, - GetUserInfoModel, - TeamSetResponse, - UserListRecord, -} from './model/userModel'; +import { GetUserInfoModel, TeamSetResponse, UserListRecord } from './model/userModel'; -import { ErrorMessageMode, Result } from '/#/axios'; +import { Result } from '/#/axios'; import { BasicTableParams } from '../model/baseModel'; enum Api { Login = '/passport/signin', - Logout = '/passport/signout', - GetUserInfo = '/getUserInfo', GetPermCode = '/getPermCode', UserList = '/user/list', NoTokenUsers = '/user/getNoTokenUser', @@ -44,30 +36,8 @@ enum Api { INIT_TEAM = '/user/initTeam', APP_OWNERS = '/user/appOwners', TransferUserResource = '/user/transferResource', - SSO_TOKEN = '/sso/token', } -/** - * @description: user login api - * @return {Promise<AxiosResponse<Result<LoginResultModel>>>} - */ -export function loginApi( - data: LoginParams, - mode: ErrorMessageMode = 'modal', -): Promise<AxiosResponse<Result<LoginResultModel>>> { - return defHttp.post( - { url: Api.Login, data }, - { isReturnNativeResponse: true, errorMessageMode: mode }, - ); -} - -/** - * @description: getUserInfo - * @return {Promise<GetUserInfoModel>} - */ -export function getUserInfo(): Promise<GetUserInfoModel> { - return defHttp.get({ url: Api.GetUserInfo }, { errorMessageMode: 'none' }); -} /** * get user permission code list * @returns {Promise<string[]>} @@ -76,9 +46,6 @@ export function getPermCode(): Promise<string[]> { return defHttp.get({ url: Api.GetPermCode }); } -export function doLogout() { - return defHttp.post({ url: Api.Logout }); -} /** * get user list * @param {BasicTableParams} data @@ -153,9 +120,3 @@ export function transferUserResource(data: { }): Promise<TeamSetResponse> { return defHttp.put({ url: Api.TransferUserResource, data }); } - -export function fetchSsoToken(): Promise<LoginResultModel> { - return defHttp.get({ - url: Api.SSO_TOKEN, - }); -} diff --git a/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/yarnQueue.ts b/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/yarnQueue.ts index dff659561..0d4fc31ad 100644 --- a/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/yarnQueue.ts +++ b/streampark-console/streampark-console-webapp/src/locales/lang/en/setting/yarnQueue.ts @@ -27,7 +27,8 @@ export default { yarnQueueLabelExpression: "Please input queue label like {'{queue} or {queue}@{lab1,...}'}", description: 'Please input the description of the queue.', }, - selectionHint: "Quick-set 'yarn.application.name' and 'yarn.application.node-label'. Please contact admins to add queue by the 'Settings' -> 'Yarn Queue' page if no available queues.", + selectionHint: + "Quick-set 'yarn.application.name' and 'yarn.application.node-label'. Please contact admins to add queue by the 'Settings' -> 'Yarn Queue' page if no available queues.", checkResult: { emptyHint: 'Queue label can not be empty.', invalidFormatHint: 'Invalid queue label format', diff --git a/streampark-console/streampark-console-webapp/src/locales/lang/en/system/user.ts b/streampark-console/streampark-console-webapp/src/locales/lang/en/system/user.ts index d056b4300..c94203973 100644 --- a/streampark-console/streampark-console-webapp/src/locales/lang/en/system/user.ts +++ b/streampark-console/streampark-console-webapp/src/locales/lang/en/system/user.ts @@ -44,7 +44,8 @@ export default { edit: 'Edit User', view: 'View User', notice: 'Notice', - transferResource: 'Please transfer the resources of the user who needs to be disabled to a new user' + transferResource: + 'Please transfer the resources of the user who needs to be disabled to a new user', }, roleInfo: 'Role Info', modifyTime: 'Not yet modified', @@ -54,5 +55,5 @@ export default { locked: 'locked', effective: 'effective', resetSucceeded: 'Reset Succeeded', - newPasswordTip: "The new password is: ", + newPasswordTip: 'The new password is: ', }; diff --git a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/yarnQueue.ts b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/yarnQueue.ts index 9ecc9186a..d620073aa 100644 --- a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/yarnQueue.ts +++ b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/setting/yarnQueue.ts @@ -27,7 +27,8 @@ export default { yarnQueueLabelExpression: "请输入队列,如 {'{queue} 或 {queue}@{lab1,...}'}", description: '请输入描述', }, - selectionHint: "用来快速设置 'yarn.application.name' 与 'yarn.application.node-label'。如果没有可用队列请联系管理员在 'Settings' -> 'Yarn Queue' 页面中创建", + selectionHint: + "用来快速设置 'yarn.application.name' 与 'yarn.application.node-label'。如果没有可用队列请联系管理员在 'Settings' -> 'Yarn Queue' 页面中创建", checkResult: { emptyHint: '队列标签不能为空', invalidFormatHint: '队列标签格式错误', diff --git a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/system/user.ts b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/system/user.ts index 5e092dcde..d012e5493 100644 --- a/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/system/user.ts +++ b/streampark-console/streampark-console-webapp/src/locales/lang/zh-CN/system/user.ts @@ -44,7 +44,7 @@ export default { edit: '编辑用户', view: '查看用户', notice: '提示', - transferResource: '请将需要被禁用的用户资源转移到新的用户上' + transferResource: '请将需要被禁用的用户资源转移到新的用户上', }, roleInfo: '角色信息', modifyTime: '尚未修改', @@ -54,5 +54,5 @@ export default { locked: '锁定', effective: '有效', resetSucceeded: '重置成功', - newPasswordTip: "新的密码为:", + newPasswordTip: '新的密码为:', }; diff --git a/streampark-console/streampark-console-webapp/src/router/guard/ssoGuard.ts b/streampark-console/streampark-console-webapp/src/router/guard/ssoGuard.ts index 92927427b..bb34d2cea 100644 --- a/streampark-console/streampark-console-webapp/src/router/guard/ssoGuard.ts +++ b/streampark-console/streampark-console-webapp/src/router/guard/ssoGuard.ts @@ -15,7 +15,7 @@ * limitations under the License. */ import type { Router } from 'vue-router'; -import { fetchSsoToken } from '/@/api/system/user'; +import { fetchSsoToken } from '/@/api/system/passport'; import { APP_TEAMID_KEY_ } from '/@/enums/cacheEnum'; import { PageEnum } from '/@/enums/pageEnum'; import { useUserStoreWithOut } from '/@/store/modules/user'; diff --git a/streampark-console/streampark-console-webapp/src/store/modules/lock.ts b/streampark-console/streampark-console-webapp/src/store/modules/lock.ts index 2a428d6c9..008f9dea2 100644 --- a/streampark-console/streampark-console-webapp/src/store/modules/lock.ts +++ b/streampark-console/streampark-console-webapp/src/store/modules/lock.ts @@ -21,7 +21,7 @@ import { defineStore } from 'pinia'; import { LOCK_INFO_KEY } from '/@/enums/cacheEnum'; import { Persistent } from '/@/utils/cache/persistent'; import { useUserStore } from './user'; -import { loginApi } from '/@/api/system/user'; +import { signin } from '/@/api/system/passport'; interface LockState { lockInfo: Nullable<LockInfo>; @@ -57,7 +57,7 @@ export const useLockStore = defineStore({ try { const username = userStore.getUserInfo?.username; const loginType = userStore.getUserInfo?.loginType; - const { data } = await loginApi( + const { data } = await signin( { username, password: password!, diff --git a/streampark-console/streampark-console-webapp/src/store/modules/user.ts b/streampark-console/streampark-console-webapp/src/store/modules/user.ts index caf354214..5528a0304 100644 --- a/streampark-console/streampark-console-webapp/src/store/modules/user.ts +++ b/streampark-console/streampark-console-webapp/src/store/modules/user.ts @@ -28,7 +28,9 @@ import { USER_INFO_KEY, } from '/@/enums/cacheEnum'; import { getAuthCache, setAuthCache } from '/@/utils/auth'; -import { doLogout, fetchInitUserTeam, fetchSetUserTeam } from '/@/api/system/user'; +import { signout } from '/@/api/system/passport'; +import { fetchInitUserTeam, fetchSetUserTeam } from '/@/api/system/user'; + import { useI18n } from '/@/hooks/web/useI18n'; import { useMessage } from '/@/hooks/web/useMessage'; import { router } from '/@/router'; @@ -208,7 +210,7 @@ export const useUserStore = defineStore({ async logout(goLogin = false) { if (this.getToken) { try { - await doLogout(); + await signout(); } catch { console.log('Token cancellation failed'); } diff --git a/streampark-console/streampark-console-webapp/src/views/base/login/LoginForm.vue b/streampark-console/streampark-console-webapp/src/views/base/login/LoginForm.vue index 2da26b2f4..af62ebe33 100644 --- a/streampark-console/streampark-console-webapp/src/views/base/login/LoginForm.vue +++ b/streampark-console/streampark-console-webapp/src/views/base/login/LoginForm.vue @@ -53,6 +53,7 @@ </template> </InputPassword> </FormItem> + <FormItem class="enter-x"> <Button type="primary" @@ -65,19 +66,21 @@ {{ loginText.buttonText }} </Button> </FormItem> + <FormItem class="enter-x text-left"> - <Button :href="SSO_LOGIN_PATH" type="link"> + <Button :href="SSO_LOGIN_PATH" type="link" v-if="enableSSO"> {{ t('sys.login.ssoSignIn') }} </Button> - <Button type="link" class="float-right" @click="changeLoginType"> + <Button type="link" class="float-right" @click="changeLoginType" v-if="enableLDAP"> {{ loginText.linkText }} </Button> </FormItem> + </Form> <TeamModal v-model:visible="modelVisible" :userId="userId" @success="handleTeamSuccess" /> </template> <script lang="ts" setup> - import { reactive, ref, unref, computed } from 'vue'; + import { reactive, ref, unref, computed, onMounted } from 'vue'; import { UserOutlined, LockOutlined } from '@ant-design/icons-vue'; import { Form, Input, Button } from 'ant-design-vue'; @@ -93,7 +96,7 @@ LoginTypeEnum, } from './useLogin'; import { useDesign } from '/@/hooks/web/useDesign'; - import { loginApi } from '/@/api/system/user'; + import { signin, fetchSignType } from '/@/api/system/passport'; import { APP_TEAMID_KEY_ } from '/@/enums/cacheEnum'; import TeamModal from './teamModal.vue'; import { fetchUserTeam } from '/@/api/system/member'; @@ -120,6 +123,9 @@ const userId = ref(''); const modelVisible = ref(false); const loginType = ref(LoginTypeEnum.PASSWORD); + const enableSSO = ref(false); + const enableLDAP = ref(false); + const formData = reactive<LoginForm>({ account: '', password: '', @@ -149,7 +155,7 @@ } async function handleLoginRequest(loginFormValue: LoginForm): Promise<Result<LoginResultModel>> { - const { data } = await loginApi( + const { data } = await signin( { password: loginFormValue.password, username: loginFormValue.account, @@ -215,6 +221,7 @@ modelVisible.value = false; handleLogin(); } + function changeLoginType() { if (loginType.value === LoginTypeEnum.PASSWORD) { loginType.value = LoginTypeEnum.LDAP; @@ -222,4 +229,10 @@ } loginType.value = LoginTypeEnum.PASSWORD; } + + onMounted(async () => { + const { data, code} = await fetchSignType(); + enableSSO.value = data.find((x) => x === 'sso') != undefined; + enableLDAP.value = data.find((x) => x === 'ldap') != undefined; + } </script> diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/EditStreamPark.vue b/streampark-console/streampark-console-webapp/src/views/flink/app/EditStreamPark.vue index fe9b18e4a..63b517f79 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/EditStreamPark.vue +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/EditStreamPark.vue @@ -27,11 +27,7 @@ import configOptions from './data/option'; import { fetchMain, fetchUpload, fetchUpdate, fetchGet } from '/@/api/flink/app/app'; import { useRoute } from 'vue-router'; - import { - getAppConfType, - handleSubmitParams, - handleTeamResource - } from './utils'; + import { getAppConfType, handleSubmitParams, handleTeamResource } from './utils'; import { fetchFlinkHistory } from '/@/api/flink/app/flinkSql'; import { decodeByBase64, encryptByBase64 } from '/@/utils/cipher'; import PomTemplateTab from './components/PodTemplate/PomTemplateTab.vue'; diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppView/StopApplicationModal.vue b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppView/StopApplicationModal.vue index 453b24e3e..8e2fbde87 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppView/StopApplicationModal.vue +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/components/AppView/StopApplicationModal.vue @@ -23,7 +23,6 @@ </script> <script setup lang="ts" name="StopApplicationModal"> - import { InputNumber } from 'ant-design-vue'; import { BasicForm, useForm } from '/@/components/Form'; import { SvgIcon } from '/@/components/Icon'; import { BasicModal, useModalInner } from '/@/components/Modal'; @@ -91,8 +90,7 @@ /* submit */ async function handleSubmit() { try { - const { stopSavePointed, customSavepoint, drain } = - (await validate()) as Recordable; + const { stopSavePointed, customSavepoint, drain } = (await validate()) as Recordable; const stopReq = { id: app.id, savePointed: stopSavePointed, diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts index 9281adbcc..4cf147ed4 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateAndEditSchema.ts @@ -54,7 +54,7 @@ import { AppTypeEnum, ClusterStateEnum, ExecModeEnum, JobTypeEnum } from '/@/enu import { isK8sExecMode } from '../utils'; import { useI18n } from '/@/hooks/web/useI18n'; import { fetchCheckHadoop } from '/@/api/flink/setting'; -import { fetchTeamResource } from "/@/api/flink/resource"; +import { fetchTeamResource } from '/@/api/flink/resource'; const { t } = useI18n(); export interface HistoryRecord { k8sNamespace: Array<string>; @@ -126,8 +126,7 @@ export const useCreateAndEditSchema = ( field: 'teamResource', label: t('flink.app.teamResource'), component: 'Select', - render: ({ model }) => - renderStreamParkResource( { model, resources: unref(teamResource) }, ), + render: ({ model }) => renderStreamParkResource({ model, resources: unref(teamResource) }), ifShow: ({ values }) => { if (edit?.appId) { return values.jobType == JobTypeEnum.SQL; diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts index a53726311..2b46d3499 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useCreateSchema.ts @@ -24,10 +24,7 @@ import { fetchMain, fetchName } from '/@/api/flink/app/app'; import { modules, fetchListConf, fetchListJars } from '/@/api/flink/project'; import { RuleObject } from 'ant-design-vue/lib/form'; import { StoreValue } from 'ant-design-vue/lib/form/interface'; -import { - renderResourceFrom, - renderStreamParkJarApp -} from './useFlinkRender'; +import { renderResourceFrom, renderStreamParkJarApp } from './useFlinkRender'; import { filterOption, getAppConfType } from '../utils'; import { useI18n } from '/@/hooks/web/useI18n'; const { t } = useI18n(); @@ -126,8 +123,7 @@ export const useCreateSchema = (dependencyRef: Ref) => { field: 'uploadJobJar', label: t('flink.app.selectJobJar'), component: 'Select', - render: ({ model }) => - renderStreamParkJarApp( { model, resources: unref(teamResource) }, ), + render: ({ model }) => renderStreamParkJarApp({ model, resources: unref(teamResource) }), ifShow: ({ values }) => values?.jobType !== 'sql' && values?.resourceFrom == 'upload', }, { diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useFlinkRender.tsx b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useFlinkRender.tsx index 1053b33f2..f47835368 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useFlinkRender.tsx +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/hooks/useFlinkRender.tsx @@ -43,7 +43,7 @@ import { CandidateTypeEnum, FailoverStrategyEnum } from '/@/enums/flinkEnum'; import { useI18n } from '/@/hooks/web/useI18n'; import { fetchYarnQueueList } from '/@/api/flink/setting/yarnQueue'; import { ApiSelect } from '/@/components/Form'; -import {ResourceTypeEnum} from "/@/views/flink/resource/resource.data"; +import { ResourceTypeEnum } from '/@/views/flink/resource/resource.data'; const { t } = useI18n(); /* render input dropdown component */ @@ -462,7 +462,7 @@ export const renderSqlHistory = ( )} <span style="color: darkgrey"> - <Icon icon="ant-design:clock-circle-outlined" /> + <Icon icon="ant-design:clock-circle-outlined" /> {ver.createTime} </span> </div> @@ -529,28 +529,26 @@ export const renderResourceFrom = (model: Recordable) => { ); }; -export const renderStreamParkResource = ({ model, resources },) => { - +export const renderStreamParkResource = ({ model, resources }) => { const renderOptions = () => { console.log('resources', resources); return (resources || []) - .filter((item) => item.resourceType !== ResourceTypeEnum.FLINK_APP ) + .filter((item) => item.resourceType !== ResourceTypeEnum.FLINK_APP) .map((resource) => { - return ( - <Select.Option - key={resource.id} - label={ resource.resourceType + '-' + resource.resourceName}> - <div> - <Tag color="green" style=";margin-left: 5px;" size="small"> - {resource.resourceType} - </Tag> - <span style="color: darkgrey"> - {resource.resourceName} - </span> - </div> - </Select.Option> - ); - }); + return ( + <Select.Option + key={resource.id} + label={resource.resourceType + '-' + resource.resourceName} + > + <div> + <Tag color="green" style=";margin-left: 5px;" size="small"> + {resource.resourceType} + </Tag> + <span style="color: darkgrey">{resource.resourceName}</span> + </div> + </Select.Option> + ); + }); }; return ( @@ -572,34 +570,29 @@ export const renderStreamParkResource = ({ model, resources },) => { ); }; -export const renderStreamParkJarApp = ({ model, resources },) => { - +export const renderStreamParkJarApp = ({ model, resources }) => { function handleAppChange(value: SelectValue) { const res = resources.filter((item) => item.id == value)[0]; - model.mainClass = res.mainClass + model.mainClass = res.mainClass; model.uploadJobJar = res.resourceName; } const renderOptions = () => { console.log('resources', resources); return (resources || []) - .filter((item) => item.resourceType == ResourceTypeEnum.FLINK_APP ) + .filter((item) => item.resourceType == ResourceTypeEnum.FLINK_APP) .map((resource) => { - return ( - <Select.Option - key={resource.id} - label={resource.resourceName}> - <div> - <Tag color="green" style=";margin-left: 5px;" size="small"> - {resource.resourceType} - </Tag> - <span style="color: darkgrey"> - {resource.resourceName} - </span> - </div> - </Select.Option> - ); - }); + return ( + <Select.Option key={resource.id} label={resource.resourceName}> + <div> + <Tag color="green" style=";margin-left: 5px;" size="small"> + {resource.resourceType} + </Tag> + <span style="color: darkgrey">{resource.resourceName}</span> + </div> + </Select.Option> + ); + }); }; return ( diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/utils/index.ts b/streampark-console/streampark-console-webapp/src/views/flink/app/utils/index.ts index 8e7eba47b..0af97df9e 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/utils/index.ts +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/utils/index.ts @@ -161,7 +161,10 @@ export function handleIsStart(app: Recordable, optionApps: Recordable) { } export function handleYarnQueue(values: Recordable) { - if (values.executionMode == ExecModeEnum.YARN_APPLICATION || values.executionMode == ExecModeEnum.YARN_PER_JOB) { + if ( + values.executionMode == ExecModeEnum.YARN_APPLICATION || + values.executionMode == ExecModeEnum.YARN_PER_JOB + ) { const queue = values['yarnQueue']; if (queue != null && queue !== '' && queue !== undefined) { return queue; @@ -313,8 +316,8 @@ export function isK8sExecMode(mode: number): boolean { } export function handleTeamResource(resource: string) { - if (resource != null && resource !== '') { - return JSON.parse(resource); - } - return []; + if (resource != null && resource !== '') { + return JSON.parse(resource); + } + return []; } diff --git a/streampark-console/streampark-console-webapp/src/views/flink/resource/View.vue b/streampark-console/streampark-console-webapp/src/views/flink/resource/View.vue index bc5fb08ff..09390c249 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/resource/View.vue +++ b/streampark-console/streampark-console-webapp/src/views/flink/resource/View.vue @@ -47,11 +47,7 @@ > CONNECTOR </Tag> - <Tag - class="bold-tag" - color="#79f379" - v-if="record.resourceType == ResourceTypeEnum.UDXF" - > + <Tag class="bold-tag" color="#79f379" v-if="record.resourceType == ResourceTypeEnum.UDXF"> UDXF </Tag> <Tag @@ -63,18 +59,10 @@ </Tag> </template> <template v-if="column.dataIndex === 'engineType'"> - <Tag - class="bold-tag" - color="#e65270" - v-if="record.engineType == EngineTypeEnum.FLINK" - > + <Tag class="bold-tag" color="#e65270" v-if="record.engineType == EngineTypeEnum.FLINK"> FLINK </Tag> - <Tag - class="bold-tag" - color="#f5be07" - v-if="record.engineType == EngineTypeEnum.SPARK" - > + <Tag class="bold-tag" color="#f5be07" v-if="record.engineType == EngineTypeEnum.SPARK"> SPARK </Tag> </template> @@ -102,7 +90,11 @@ </template> </template> </BasicTable> - <ResourceDrawer :teamResource="teamResource" @register="registerDrawer" @success="handleSuccess" /> + <ResourceDrawer + :teamResource="teamResource" + @register="registerDrawer" + @success="handleSuccess" + /> </div> </template> <script lang="ts"> @@ -112,7 +104,7 @@ </script> <script lang="ts" setup> -import {defineComponent, onMounted, ref} from 'vue'; + import { defineComponent, onMounted, ref } from 'vue'; import { BasicTable, useTable, TableAction, SorterResult } from '/@/components/Table'; import ResourceDrawer from './components/ResourceDrawer.vue'; import { useDrawer } from '/@/components/Drawer'; @@ -121,12 +113,8 @@ import {defineComponent, onMounted, ref} from 'vue'; import { useI18n } from '/@/hooks/web/useI18n'; import Icon from '/@/components/Icon'; import { useRouter } from 'vue-router'; - import { - fetchResourceDelete, - fetchResourceList, - fetchTeamResource - } from "/@/api/flink/resource"; - import { EngineTypeEnum, ResourceTypeEnum } from "/@/views/flink/resource/resource.data"; + import { fetchResourceDelete, fetchResourceList, fetchTeamResource } from '/@/api/flink/resource'; + import { EngineTypeEnum, ResourceTypeEnum } from '/@/views/flink/resource/resource.data'; import { Tag } from 'ant-design-vue'; const teamResource = ref<Array<any>>([]); @@ -216,5 +204,4 @@ import {defineComponent, onMounted, ref} from 'vue'; onMounted(async () => { updateTeamResource(); }); - </script> diff --git a/streampark-console/streampark-console-webapp/src/views/flink/resource/components/Resource.vue b/streampark-console/streampark-console-webapp/src/views/flink/resource/components/Resource.vue index 5e14f3b2c..d9fa91b9f 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/resource/components/Resource.vue +++ b/streampark-console/streampark-console-webapp/src/views/flink/resource/components/Resource.vue @@ -28,7 +28,7 @@ import { getMonacoOptions } from '/@/views/flink/app/data'; import { Icon } from '/@/components/Icon'; import { useMonaco } from '/@/hooks/web/useMonaco'; - import { Tabs, Alert, Tag, Space, Form } from 'ant-design-vue'; + import { Tabs, Alert, Tag, Space } from 'ant-design-vue'; import { useMessage } from '/@/hooks/web/useMessage'; import { fetchUpload } from '/@/api/flink/app/app'; import UploadJobJar from '/@/views/flink/app/components/UploadJobJar.vue'; @@ -142,7 +142,7 @@ const formData = new FormData(); formData.append('file', data.file); await fetchUpload(formData); - dependency.jar = {} + dependency.jar = {}; dependency.jar[data.file.name] = data.file.name; handleUpdateDependency(); } catch (error) { @@ -179,12 +179,12 @@ dependency.pom = {}; dependency.jar = {}; if (dataSource.pom === undefined) { - setContent(defaultValue) + setContent(defaultValue); } dataSource.pom?.map((pomRecord: DependencyType) => { const id = getId(pomRecord); dependency.pom[id] = pomRecord; - setContent(toPomString(pomRecord)) + setContent(toPomString(pomRecord)); }); dataSource.jar?.map((fileName: string) => { dependency.jar[fileName] = fileName; @@ -215,21 +215,6 @@ }); </script> -<style lang="less"> - @import url('/@/views/flink/app/styles/Add.less'); - .apply-pom { - z-index: 99; - position: absolute; - bottom: 20px; - float: right; - right: 20px; - cursor: pointer; - height: 26px; - padding: 0 12px; - font-size: 12px; - } -</style> - <template> <template v-if="props.formModel.resourceType == 'FLINK_APP'"> <UploadJobJar :custom-request="handleCustomDepsRequest" v-model:loading="loading" /> @@ -269,3 +254,18 @@ </Alert> </div> </template> + +<style lang="less"> + @import url('/@/views/flink/app/styles/Add.less'); + .apply-pom { + z-index: 99; + position: absolute; + bottom: 20px; + float: right; + right: 20px; + cursor: pointer; + height: 26px; + padding: 0 12px; + font-size: 12px; + } +</style> diff --git a/streampark-console/streampark-console-webapp/src/views/flink/resource/components/ResourceDrawer.vue b/streampark-console/streampark-console-webapp/src/views/flink/resource/components/ResourceDrawer.vue index 8f2d33339..2d217d3fe 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/resource/components/ResourceDrawer.vue +++ b/streampark-console/streampark-console-webapp/src/views/flink/resource/components/ResourceDrawer.vue @@ -28,11 +28,7 @@ </template> <BasicForm @register="registerForm" :schemas="getResourceFormSchema"> <template #resource="{ model, field }"> - <Resource - ref="resourceRef" - v-model:value="model[field]" - :form-model="model" - /> + <Resource ref="resourceRef" v-model:value="model[field]" :form-model="model" /> </template> </BasicForm> </BasicDrawer> @@ -44,19 +40,19 @@ </script> <script lang="ts" setup> - import { ref, h, computed, unref } from 'vue'; + import { ref, computed, unref } from 'vue'; import { BasicForm, FormSchema, useForm } from '/@/components/Form'; import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; import { Icon } from '/@/components/Icon'; import { useI18n } from '/@/hooks/web/useI18n'; import Resource from '/@/views/flink/resource/components/Resource.vue'; - import { fetchAddResource, fetchUpdateResource } from "/@/api/flink/resource"; - import { EngineTypeEnum } from "/@/views/flink/resource/resource.data"; + import { fetchAddResource, fetchUpdateResource } from '/@/api/flink/resource'; + import { EngineTypeEnum } from '/@/views/flink/resource/resource.data'; import { renderResourceType, - renderStreamParkResourceGroup - } from "/@/views/flink/resource/useResourceRender"; - import { useMessage } from "/@/hooks/web/useMessage"; + renderStreamParkResourceGroup, + } from '/@/views/flink/resource/useResourceRender'; + import { useMessage } from '/@/hooks/web/useMessage'; const emit = defineEmits(['success', 'register']); @@ -80,9 +76,10 @@ field: 'resourceType', label: t('flink.resource.resourceType'), component: 'Select', - render: ({ model }) => - renderResourceType( { model, }, ), - rules: [{ required: true, message: t('flink.resource.form.resourceTypeIsRequiredMessage') }], + render: ({ model }) => renderResourceType({ model }), + rules: [ + { required: true, message: t('flink.resource.form.resourceTypeIsRequiredMessage') }, + ], }, { field: 'engineType', @@ -111,7 +108,7 @@ label: t('flink.resource.resourceGroup'), component: 'Select', render: ({ model }) => - renderStreamParkResourceGroup( { model, resources: unref(props.teamResource) }, ), + renderStreamParkResourceGroup({ model, resources: unref(props.teamResource) }), ifShow: ({ values }) => values?.resourceType == 'GROUP', }, { @@ -148,7 +145,7 @@ wrapperCol: { lg: { span: 16, offset: 0 }, sm: { span: 17, offset: 0 } }, }); - const [registerDrawer, { setDrawerProps, changeLoading, closeDrawer }] = useDrawerInner( + const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner( async (data: Recordable) => { unref(resourceRef)?.setDefaultValue({}); resetFields(); @@ -159,12 +156,11 @@ setFieldsValue(data.record); if (data.record?.resourceType == 'GROUP') { - setFieldsValue({ resourceGroup: JSON.parse(data.record.resource || '[]')} ); + setFieldsValue({ resourceGroup: JSON.parse(data.record.resource || '[]') }); } else { - setFieldsValue({ dependency: data.record.resource}); + setFieldsValue({ dependency: data.record.resource }); unref(resourceRef)?.setDefaultValue(JSON.parse(data.record.resource || '{}')); } - } }, ); @@ -177,7 +173,7 @@ async function handleSubmit() { try { const values = await validate(); - let resourceJson: string = ''; + let resourceJson = ''; if (values.resourceType == 'GROUP') { resourceJson = JSON.stringify(values.resourceGroup); @@ -228,7 +224,6 @@ setDrawerProps({ confirmLoading: false }); } } - </script> <style lang="less"> diff --git a/streampark-console/streampark-console-webapp/src/views/flink/resource/useResourceRender.tsx b/streampark-console/streampark-console-webapp/src/views/flink/resource/useResourceRender.tsx index 86664de7e..57b2c077b 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/resource/useResourceRender.tsx +++ b/streampark-console/streampark-console-webapp/src/views/flink/resource/useResourceRender.tsx @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Select, Tag} from 'ant-design-vue'; +import { Select, Tag } from 'ant-design-vue'; import { useI18n } from '/@/hooks/web/useI18n'; -import { ResourceTypeEnum } from "/@/views/flink/resource/resource.data"; +import { ResourceTypeEnum } from '/@/views/flink/resource/resource.data'; import flinkAppSvg from '/@/assets/icons/flink2.svg'; import connectorSvg from '/@/assets/icons/connector.svg'; import udxfSvg from '/@/assets/icons/fx.svg'; @@ -26,8 +26,7 @@ import groupSvg from '/@/assets/icons/group.svg'; const { t } = useI18n(); /* render resource type label */ -export const renderResourceType = ({ model },) => { - +export const renderResourceType = ({ model }) => { const renderOptions = () => { const options = [ { label: 'Flink App', value: ResourceTypeEnum.FLINK_APP, src: flinkAppSvg }, @@ -36,27 +35,16 @@ export const renderResourceType = ({ model },) => { { label: 'Normal Jar', value: ResourceTypeEnum.NORMAL_JAR, src: normalJarSvg }, { label: 'Group', value: ResourceTypeEnum.GROUP, src: groupSvg }, ]; - return options - .map(( {label,value, src} ) => { - return ( - <Select.Option - key={ value } - label={ label } - > - <div> - <img - src={ src } - style="display: inline-block; width: 20px; height: 20px" - ></img> - <span - style="vertical-align: middle; margin-left: 5px;" - > - { label } - </span> - </div> - </Select.Option> - ); - }); + return options.map(({ label, value, src }) => { + return ( + <Select.Option key={value} label={label}> + <div> + <img src={src} style="display: inline-block; width: 20px; height: 20px"></img> + <span style="vertical-align: middle; margin-left: 5px;">{label}</span> + </div> + </Select.Option> + ); + }); }; return ( @@ -73,25 +61,26 @@ export const renderResourceType = ({ model },) => { ); }; -export const renderStreamParkResourceGroup = ({ model, resources },) => { - +export const renderStreamParkResourceGroup = ({ model, resources }) => { const renderOptions = () => { console.log('resources', resources); return (resources || []) - .filter((item) => item.resourceType !== ResourceTypeEnum.FLINK_APP - && item.resourceType !== ResourceTypeEnum.GROUP) + .filter( + (item) => + item.resourceType !== ResourceTypeEnum.FLINK_APP && + item.resourceType !== ResourceTypeEnum.GROUP, + ) .map((resource) => { return ( <Select.Option key={resource.id} - label={ resource.resourceType + '-' + resource.resourceName}> + label={resource.resourceType + '-' + resource.resourceName} + > <div> <Tag color="green" style=";margin-left: 5px;" size="small"> {resource.resourceType} </Tag> - <span style="color: darkgrey"> - {resource.resourceName} - </span> + <span style="color: darkgrey">{resource.resourceName}</span> </div> </Select.Option> ); diff --git a/streampark-console/streampark-console-webapp/src/views/setting/FlinkHome/index.vue b/streampark-console/streampark-console-webapp/src/views/setting/FlinkHome/index.vue index 04f33fe34..6715dd307 100644 --- a/streampark-console/streampark-console-webapp/src/views/setting/FlinkHome/index.vue +++ b/streampark-console/streampark-console-webapp/src/views/setting/FlinkHome/index.vue @@ -25,20 +25,14 @@ import { onMounted, ref } from 'vue'; import { useModal } from '/@/components/Modal'; import { SvgIcon } from '/@/components/Icon'; - import { - List, - Switch, - Card, - Popconfirm, - Tooltip - } from 'ant-design-vue'; + import { List, Switch, Card, Popconfirm, Tooltip } from 'ant-design-vue'; import { CheckOutlined, CloseOutlined, DeleteOutlined, EyeOutlined, EditOutlined, - PlusOutlined + PlusOutlined, } from '@ant-design/icons-vue'; import { FlinkEnvModal, FlinkEnvDrawer } from './components'; import { @@ -46,7 +40,7 @@ fetchDefaultSet, fetchFlinkEnv, fetchFlinkEnvRemove, - fetchFlinkInfo + fetchFlinkInfo, } from '/@/api/flink/setting/flinkEnv'; import { FlinkEnv } from '/@/api/flink/setting/types/flinkEnv.type'; import { useMessage } from '/@/hooks/web/useMessage'; diff --git a/streampark-console/streampark-console-webapp/src/views/system/user/components/UserDrawer.vue b/streampark-console/streampark-console-webapp/src/views/system/user/components/UserDrawer.vue index 564e0d211..66395d510 100644 --- a/streampark-console/streampark-console-webapp/src/views/system/user/components/UserDrawer.vue +++ b/streampark-console/streampark-console-webapp/src/views/system/user/components/UserDrawer.vue @@ -34,13 +34,13 @@ :ok-text="t('common.okText')" centered @ok="handleTransfer" - @cancel="transferModalVisible=false" + @cancel="transferModalVisible = false" > <template #title> <Icon icon="ant-design:swap-outlined" /> {{ t('system.user.form.notice') }} </template> - <BasicForm @register="transferForm" class="!mt-30px !ml-36px"/> + <BasicForm @register="transferForm" class="!mt-30px !ml-36px" /> </Modal> </template> <script lang="ts"> @@ -49,10 +49,10 @@ import { formSchema } from '../user.data'; import { FormTypeEnum } from '/@/enums/formEnum'; import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; - import {addUser, getUserList, transferUserResource, updateUser} from '/@/api/system/user'; + import { addUser, getUserList, transferUserResource, updateUser } from '/@/api/system/user'; import Icon from '/@/components/Icon'; import { useI18n } from '/@/hooks/web/useI18n'; - import { useUserStoreWithOut } from "/@/store/modules/user"; + import { useUserStoreWithOut } from '/@/store/modules/user'; import { Modal } from 'ant-design-vue'; export default defineComponent({ @@ -78,7 +78,7 @@ const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { formType.value = data.formType; - userInfo.value = data.record || {} + userInfo.value = data.record || {}; resetFields(); clearValidate(); updateSchema(formSchema(unref(formType))); @@ -94,36 +94,41 @@ } }); - const [transferForm, { resetFields: resetTransferFields, validate: transferValidate }] = useForm({ - layout: 'vertical', - showActionButtonGroup: false, - baseColProps: { lg: 22, md: 22 }, - schemas: [ - { - field: 'userId', - label: t('system.user.form.transferResource'), - component: 'ApiSelect', - componentProps: { - api: async () => { - let {records} = await getUserList({ page: 1, pageSize: 999999, teamId: userStore.getTeamId || '' }) - return records.filter( user => user.userId !== userInfo.value.userId ) + const [transferForm, { resetFields: resetTransferFields, validate: transferValidate }] = + useForm({ + layout: 'vertical', + showActionButtonGroup: false, + baseColProps: { lg: 22, md: 22 }, + schemas: [ + { + field: 'userId', + label: t('system.user.form.transferResource'), + component: 'ApiSelect', + componentProps: { + api: async () => { + let { records } = await getUserList({ + page: 1, + pageSize: 999999, + teamId: userStore.getTeamId || '', + }); + return records.filter((user) => user.userId !== userInfo.value.userId); + }, + labelField: 'username', + valueField: 'userId', + showSearch: false, + optionFilterGroup: 'username', + placeholder: t('system.member.userNameRequire'), }, - labelField: 'username', - valueField: 'userId', - showSearch: false, - optionFilterGroup: 'username', - placeholder: t('system.member.userNameRequire'), + rules: [ + { + required: true, + message: t('system.member.userNameRequire'), + trigger: 'blur', + }, + ], }, - rules: [ - { - required: true, - message: t('system.member.userNameRequire'), - trigger: 'blur', - }, - ], - } - ], - }); + ], + }); const getTitle = computed(() => { return { @@ -138,13 +143,13 @@ const values = await validate(); setDrawerProps({ confirmLoading: true }); if (unref(formType) === FormTypeEnum.Edit) { - const res: { needTransferResource: Boolean } = await updateUser(values) + const res: { needTransferResource: Boolean } = await updateUser(values); if (res?.needTransferResource) { - transferModalVisible.value = true - nextTick(resetTransferFields) - return + transferModalVisible.value = true; + nextTick(resetTransferFields); + return; } - }else{ + } else { await addUser(values); } closeDrawer(); @@ -157,18 +162,32 @@ async function handleTransfer() { try { const values = await transferValidate(); - transferModalLoading.value = true - await transferUserResource({ userId:userInfo.value.userId, targetUserId: values.userId }) + transferModalLoading.value = true; + await transferUserResource({ + userId: userInfo.value.userId, + targetUserId: values.userId, + }); emit('success'); - transferModalVisible.value = false + transferModalVisible.value = false; } catch (e) { console.error(e); } finally { - transferModalLoading.value = false + transferModalLoading.value = false; } } - return { t, registerDrawer, registerForm, transferForm, transferModalLoading, transferModalVisible, getTitle, handleSubmit, handleTransfer, closeDrawer }; + return { + t, + registerDrawer, + registerForm, + transferForm, + transferModalLoading, + transferModalVisible, + getTitle, + handleSubmit, + handleTransfer, + closeDrawer, + }; }, }); </script> diff --git a/streampark-console/streampark-console-webapp/src/views/system/user/user.data.ts b/streampark-console/streampark-console-webapp/src/views/system/user/user.data.ts index 57ab342b1..b01884559 100644 --- a/streampark-console/streampark-console-webapp/src/views/system/user/user.data.ts +++ b/streampark-console/streampark-console-webapp/src/views/system/user/user.data.ts @@ -151,10 +151,10 @@ export const formSchema = (formType: string): FormSchema[] => { component: 'Select', componentProps: { disabled: isView, - options: [ + options: [ { label: t('ADMIN'), value: UserTypeEnum.ADMIN }, { label: t('USER'), value: UserTypeEnum.USER }, - ] + ], }, rules: [{ required: true }], },
