From 3fdeef031212105937bfadb922f6021f2749b273 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 24 Oct 2022 13:22:58 +0800 Subject: [PATCH 01/11] =?UTF-8?q?feat(=E5=B9=B3=E5=8F=B0=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?):=20=E9=A3=9E=E4=B9=A6=E5=9B=BD=E9=99=85=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/auth/api/AuthApi.java | 4 + .../io/dataease/auth/server/AuthServer.java | 8 + .../auth/service/AuthUserService.java | 4 + .../service/impl/AuthUserServiceImpl.java | 15 ++ .../auth/service/impl/ShiroServiceImpl.java | 4 + .../controller/sys/SysUserController.java | 16 +- .../controller/sys/response/AuthBindDTO.java | 2 + .../main/java/io/dataease/ext/AuthMapper.java | 1 + .../main/java/io/dataease/ext/AuthMapper.xml | 10 + .../plugins/server/XDingtalkServer.java | 2 +- .../dataease/plugins/server/XLarkServer.java | 2 +- .../plugins/server/XLarksuiteServer.java | 206 ++++++++++++++++++ .../dataease/plugins/server/XWecomServer.java | 2 +- .../dataease/service/sys/SysUserService.java | 37 +++- .../main/resources/db/migration/V42__1.16.sql | 3 + frontend/src/api/user.js | 7 + frontend/src/lang/en.js | 4 +- frontend/src/lang/tw.js | 4 +- frontend/src/lang/zh.js | 4 +- frontend/src/views/login/index.vue | 31 ++- 20 files changed, 346 insertions(+), 20 deletions(-) create mode 100644 backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java diff --git a/backend/src/main/java/io/dataease/auth/api/AuthApi.java b/backend/src/main/java/io/dataease/auth/api/AuthApi.java index e4b2df95b5..aeaee10e13 100644 --- a/backend/src/main/java/io/dataease/auth/api/AuthApi.java +++ b/backend/src/main/java/io/dataease/auth/api/AuthApi.java @@ -75,6 +75,10 @@ public interface AuthApi { @PostMapping("/isOpenLark") boolean isOpenLark(); + @ApiOperation("是否开启国际飞书") + @PostMapping("/isOpenLarksuite") + boolean isOpenLarksuite(); + @ApiIgnore @PostMapping("/isPluginLoaded") boolean isPluginLoaded(); 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 e4282473a2..ac43dc69ce 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -337,6 +337,14 @@ public class AuthServer implements AuthApi { return authUserService.supportLark(); } + @Override + public boolean isOpenLarksuite() { + Boolean licValid = PluginUtils.licValid(); + if (!licValid) + return false; + return authUserService.supportLarksuite(); + } + @Override public boolean isPluginLoaded() { Boolean licValid = PluginUtils.licValid(); diff --git a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java index a9df96a6e8..ba9d201031 100644 --- a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java +++ b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java @@ -23,6 +23,8 @@ public interface AuthUserService { SysUserEntity getUserByDingtalkId(String dingtalkId); SysUserEntity getUserByLarkId(String larkId); + SysUserEntity getUserByLarksuiteId(String larksuiteId); + List roles(Long userId); List permissions(Long userId); @@ -43,6 +45,8 @@ public interface AuthUserService { Boolean supportLark(); + Boolean supportLarksuite(); + Boolean supportLoginLimit(); Boolean pluginLoaded(); diff --git a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java index f862f84273..a148882cf5 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java @@ -21,6 +21,7 @@ import io.dataease.plugins.util.PluginUtils; import io.dataease.plugins.xpack.cas.service.CasXpackService; import io.dataease.plugins.xpack.dingtalk.service.DingtalkXpackService; import io.dataease.plugins.xpack.lark.service.LarkXpackService; +import io.dataease.plugins.xpack.larksuite.service.LarksuiteXpackService; import io.dataease.plugins.xpack.ldap.service.LdapXpackService; import io.dataease.plugins.xpack.loginlimit.dto.response.LoginLimitInfo; import io.dataease.plugins.xpack.loginlimit.service.LoginLimitXpackService; @@ -108,6 +109,11 @@ public class AuthUserServiceImpl implements AuthUserService { return authMapper.findLarkUser(larkId); } + @Override + public SysUserEntity getUserByLarksuiteId(String larksuiteId) { + return authMapper.findLarksuiteUser(larksuiteId); + } + @Override public List roles(Long userId) { return authMapper.roleCodes(userId); @@ -221,6 +227,15 @@ public class AuthUserServiceImpl implements AuthUserService { return larkXpackService.isOpen(); } + @Override + public Boolean supportLarksuite() { + Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LarksuiteXpackService.class)); + if (beansOfType.keySet().size() == 0) return false; + LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + if (ObjectUtils.isEmpty(larkXpackService)) return false; + return larkXpackService.isOpen(); + } + @Override public Boolean supportLoginLimit() { Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LoginLimitXpackService.class)); diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index a1a55baffa..b92517f050 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -86,6 +86,7 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/api/auth/isOpenWecom", ANON); filterChainDefinitionMap.put("/api/auth/isOpenDingtalk", ANON); filterChainDefinitionMap.put("/api/auth/isOpenLark", ANON); + filterChainDefinitionMap.put("/api/auth/isOpenLarksuite", ANON); filterChainDefinitionMap.put("/api/auth/getPublicKey", ANON); filterChainDefinitionMap.put("/api/pluginCommon/component/*", ANON); filterChainDefinitionMap.put("/api/pluginCommon/staticInfo/**", ANON); @@ -101,6 +102,9 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/plugin/lark/callBack*", ANON); filterChainDefinitionMap.put("/plugin/lark/bind*", ANON); filterChainDefinitionMap.put("/plugin/lark/getQrParam", ANON); + filterChainDefinitionMap.put("/plugin/larksuite/callBack*", ANON); + filterChainDefinitionMap.put("/plugin/larksuite/bind*", ANON); + filterChainDefinitionMap.put("/plugin/larksuite/getQrParam", ANON); filterChainDefinitionMap.put("/cas/reset/**", ANON); filterChainDefinitionMap.put("/unauth", ANON); diff --git a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java index 8c8f4d0f87..7d4a68bca3 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java @@ -56,6 +56,8 @@ public class SysUserController { private static final String DINGTALK = "dingtalk"; private static final String LARK = "lark"; + private static final String LARKSUITE = "larksuite"; + @Resource private SysUserService sysUserService; @@ -254,15 +256,18 @@ public class SysUserController { if (authUserService.supportLark() && StringUtils.isNotBlank(sysUserAssist.getLarkId())) { dto.setLarkBinded(true); } + if (authUserService.supportLarksuite() && StringUtils.isNotBlank(sysUserAssist.getLarksuiteId())) { + dto.setLarksuiteBinded(true); + } return dto; } @PostMapping("/unbindAssist/{type}") public void unbindAssist(@PathVariable("type") String type) { - Boolean valid = StringUtils.equals(WECOM, type) || StringUtils.equals(DINGTALK, type) || StringUtils.equals(LARK, type); + Boolean valid = StringUtils.equals(WECOM, type) || StringUtils.equals(DINGTALK, type) || StringUtils.equals(LARK, type) || StringUtils.equals(LARKSUITE, type); if (!valid) { - DEException.throwException("only [wecom, dingtalk, lark] is valid"); + DEException.throwException("only [wecom, dingtalk, lark, larksuite] is valid"); } Long userId = AuthUtils.getUser().getUserId(); SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); @@ -275,10 +280,13 @@ public class SysUserController { if (StringUtils.equals(LARK, type)) { sysUserAssist.setLarkId(null); } - if (StringUtils.isBlank(sysUserAssist.getWecomId()) && StringUtils.isBlank(sysUserAssist.getDingtalkId()) && StringUtils.isBlank(sysUserAssist.getLarkId())) { + if (StringUtils.equals(LARKSUITE, type)) { + sysUserAssist.setLarksuiteId(null); + } + if (StringUtils.isBlank(sysUserAssist.getWecomId()) && StringUtils.isBlank(sysUserAssist.getDingtalkId()) && StringUtils.isBlank(sysUserAssist.getLarkId()) && StringUtils.isBlank(sysUserAssist.getLarksuiteId())) { sysUserService.changeUserFrom(userId, 0); } - sysUserService.saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + sysUserService.saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId()); } diff --git a/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java b/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java index 0394961fe3..dcb2afcd1a 100644 --- a/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java +++ b/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java @@ -12,4 +12,6 @@ public class AuthBindDTO implements Serializable { private Boolean dingtalkBinded = false; private Boolean larkBinded = false; + + private Boolean larksuiteBinded = false; } diff --git a/backend/src/main/java/io/dataease/ext/AuthMapper.java b/backend/src/main/java/io/dataease/ext/AuthMapper.java index 763d41f414..5ddb83f600 100644 --- a/backend/src/main/java/io/dataease/ext/AuthMapper.java +++ b/backend/src/main/java/io/dataease/ext/AuthMapper.java @@ -37,5 +37,6 @@ public interface AuthMapper { SysUserEntity findWecomUser(@Param("wecomId") String wecomId); SysUserEntity findDingtalkUser(@Param("dingtalkId") String dingtalkId); SysUserEntity findLarkUser(@Param("larkId") String larkId); + SysUserEntity findLarksuiteUser(@Param("larksuiteId") String larksuiteId); } diff --git a/backend/src/main/java/io/dataease/ext/AuthMapper.xml b/backend/src/main/java/io/dataease/ext/AuthMapper.xml index ac07e54e79..dda18002af 100644 --- a/backend/src/main/java/io/dataease/ext/AuthMapper.xml +++ b/backend/src/main/java/io/dataease/ext/AuthMapper.xml @@ -137,4 +137,14 @@ where a.lark_id = #{larkId} + + diff --git a/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java b/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java index 27414e6836..9554458b8d 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java @@ -185,7 +185,7 @@ public class XDingtalkServer { sysUserAssist.setUserId(Long.parseLong(state)); } sysUserAssist.setDingtalkId(userId); - sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId()); response.sendRedirect(url); } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java b/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java index 9f51798be4..f473c6eed8 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java @@ -185,7 +185,7 @@ public class XLarkServer { sysUserAssist.setUserId(Long.parseLong(state)); } sysUserAssist.setLarkId(userId); - sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId()); response.sendRedirect(url); } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java b/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java new file mode 100644 index 0000000000..52223daff3 --- /dev/null +++ b/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java @@ -0,0 +1,206 @@ +package io.dataease.plugins.server; + +import io.dataease.auth.entity.SysUserEntity; +import io.dataease.auth.entity.TokenInfo; +import io.dataease.auth.service.AuthUserService; +import io.dataease.auth.util.JWTUtils; +import io.dataease.commons.constants.SysLogConstants; +import io.dataease.commons.exception.DEException; +import io.dataease.commons.utils.DeLogUtils; +import io.dataease.commons.utils.LogUtil; +import io.dataease.commons.utils.ServletUtils; +import io.dataease.plugins.common.base.domain.SysUserAssist; +import io.dataease.plugins.config.SpringContextUtil; +import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; +import io.dataease.plugins.xpack.lark.dto.entity.LarkQrResult; +import io.dataease.plugins.xpack.lark.dto.response.LarkInfo; +import io.dataease.plugins.xpack.larksuite.dto.entity.UserData; +import io.dataease.plugins.xpack.larksuite.dto.response.LarksuiteUserResult; +import io.dataease.plugins.xpack.larksuite.service.LarksuiteXpackService; +import io.dataease.service.sys.SysUserService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import springfox.documentation.annotations.ApiIgnore; + +import javax.annotation.Resource; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.List; +import java.util.Map; + +@ApiIgnore +@RequestMapping("/plugin/larksuite") +@Controller +public class XLarksuiteServer { + + @Resource + private AuthUserService authUserService; + @Resource + private SysUserService sysUserService; + + @ResponseBody + @GetMapping("/info") + public LarkInfo getLarkInfo() { + LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + return larkXpackService.info(); + } + + @ResponseBody + @RequiresPermissions("sysparam:read") + @PostMapping("/save") + public void save(@RequestBody List settings) { + LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + larkXpackService.save(settings); + } + + @ResponseBody + @PostMapping("/testConn") + public void testConn(@RequestBody LarkInfo larkInfo) { + LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + try { + larkXpackService.testConn(larkInfo); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @ResponseBody + @PostMapping("/getQrParam") + public LarkQrResult getQrParam() { + LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + return larkXpackService.getQrParam(); + } + + @GetMapping("/callBack") + public ModelAndView callBack(@RequestParam("code") String code, @RequestParam("state") String state) { + ModelAndView modelAndView = new ModelAndView("redirect:/"); + HttpServletResponse response = ServletUtils.response(); + LarksuiteXpackService larksuiteXpackService = null; + try { + Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LarksuiteXpackService.class)); + if (beansOfType.keySet().size() == 0) { + DEException.throwException("缺少国际飞书插件"); + } + larksuiteXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + Boolean isOpen = larksuiteXpackService.isOpen(); + if (!isOpen) { + DEException.throwException("未开启国际飞书"); + } + LarksuiteUserResult larksuiteUserResult = larksuiteXpackService.userInfo(code, state, false); + UserData larkUserInfo = larksuiteUserResult.getData(); + String username = larkUserInfo.getUser_id(); + SysUserEntity sysUserEntity = authUserService.getUserByLarksuiteId(username); + if (null == sysUserEntity) { + String email = StringUtils.isNotBlank(larkUserInfo.getEmail()) ? larkUserInfo.getEmail() : (username + "@larksuite.work"); + sysUserService.validateExistUser(username, larkUserInfo.getName(), email); + sysUserService.saveLarksuiteCUser(larkUserInfo, email); + sysUserEntity = authUserService.getUserByLarkId(username); + } + TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); + String realPwd = sysUserEntity.getPassword(); + String token = JWTUtils.sign(tokenInfo, realPwd); + ServletUtils.setToken(token); + + DeLogUtils.save(SysLogConstants.OPERATE_TYPE.LOGIN, SysLogConstants.SOURCE_TYPE.USER, sysUserEntity.getUserId(), null, null, null); + + Cookie cookie_token = new Cookie("Authorization", token); + cookie_token.setPath("/"); + + response.addCookie(cookie_token); + } catch (Exception e) { + + String msg = e.getMessage(); + if (null != e.getCause()) { + msg = e.getCause().getMessage(); + } + try { + msg = URLEncoder.encode(msg, "UTF-8"); + LogUtil.error(e); + Cookie cookie_error = new Cookie("LarksuiteError", msg); + cookie_error.setPath("/"); + response.addCookie(cookie_error); + return modelAndView; + } catch (UnsupportedEncodingException e1) { + e.printStackTrace(); + } + } + return modelAndView; + } + + private void bindError(HttpServletResponse response, String url, String errorMsg) { + Cookie cookie_error = new Cookie("LarksuiteError", errorMsg); + cookie_error.setPath("/"); + response.addCookie(cookie_error); + try { + response.sendRedirect(url); + } catch (IOException e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException(e); + } + } + + @GetMapping("/bind") + public void bind(@RequestParam("code") String code, @RequestParam("state") String state) { + + HttpServletResponse response = ServletUtils.response(); + String url = "/#person-info/index"; + + LarksuiteXpackService larksuiteXpackService = null; + try { + SysUserEntity userEntity = authUserService.getUserById(Long.parseLong(state)); + if (ObjectUtils.isEmpty(userEntity)) { + bindError(response, url, "绑定用户不存在"); + return; + } + SysUserAssist sysUserAssist = sysUserService.assistInfo(Long.parseLong(state)); + if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getLarksuiteId())) { + bindError(response, url, "目标用户已绑定其他国际飞书账号"); + return; + } + + Boolean isOpen = authUserService.supportLarksuite(); + if (!isOpen) { + DEException.throwException("未开启国际飞书"); + } + larksuiteXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + LarksuiteUserResult larksuiteUserResult = larksuiteXpackService.userInfo(code, state, true); + UserData larkUserInfo = larksuiteUserResult.getData(); + String userId = larkUserInfo.getUser_id(); + + + SysUserEntity sysUserEntity = authUserService.getUserByLarksuiteId(userId); + if (null != sysUserEntity) { + bindError(response, url, "当前国际飞书账号已绑定其他DE用户"); + return; + } + + if (ObjectUtils.isEmpty(sysUserAssist)) { + sysUserAssist = new SysUserAssist(); + sysUserAssist.setUserId(Long.parseLong(state)); + } + sysUserAssist.setLarksuiteId(userId); + sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId()); + response.sendRedirect(url); + } catch (Exception e) { + + String msg = e.getMessage(); + if (null != e.getCause()) { + msg = e.getCause().getMessage(); + } + try { + msg = URLEncoder.encode(msg, "UTF-8"); + LogUtil.error(e); + bindError(response, url, msg); + } catch (UnsupportedEncodingException e1) { + e.printStackTrace(); + } + } + } +} diff --git a/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java b/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java index 7ff7678cdb..738f4f73bc 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java @@ -193,7 +193,7 @@ public class XWecomServer { sysUserAssist.setUserId(Long.parseLong(state)); } sysUserAssist.setWecomId(userId); - sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId()); response.sendRedirect(url); } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/service/sys/SysUserService.java b/backend/src/main/java/io/dataease/service/sys/SysUserService.java index bc929fb6d1..466153a885 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -21,6 +21,7 @@ import io.dataease.plugins.common.base.mapper.SysUsersRolesMapper; import io.dataease.plugins.common.entity.XpackLdapUserEntity; import io.dataease.plugins.xpack.dingtalk.dto.response.DingUserEntity; import io.dataease.plugins.xpack.lark.dto.entity.LarkUserInfo; +import io.dataease.plugins.xpack.larksuite.dto.entity.UserData; import io.dataease.plugins.xpack.oidc.dto.SSOUserInfo; import org.apache.commons.collections4.CollectionUtils; @@ -107,7 +108,7 @@ public class SysUserService { SysUserAssist sysUserAssist = request.getSysUserAssist(); if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) { - saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId()); } return insert; @@ -157,7 +158,7 @@ public class SysUserService { sysUser.setIsAdmin(false); sysUser.setSub(userId); sysUserMapper.insert(sysUser); - Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), u.getUsername(), null, null)); + Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), u.getUsername(), null, null, null)); } @@ -180,7 +181,7 @@ public class SysUserService { sysUser.setSub(dingUserEntity.getUnionid()); sysUser.setPhone(dingUserEntity.getMobile()); sysUserMapper.insert(sysUser); - Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, u.getUsername(), null)); + Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, u.getUsername(), null, null)); } @Transactional @@ -202,7 +203,29 @@ public class SysUserService { sysUser.setSub(larkUserInfo.getSub()); sysUser.setPhone(larkUserInfo.getMobile()); sysUserMapper.insert(sysUser); - Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, null, u.getUsername())); + Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, null, u.getUsername(), null)); + } + + @Transactional + public void saveLarksuiteCUser(UserData larkUserInfo, String email) { + long now = System.currentTimeMillis(); + SysUser sysUser = new SysUser(); + + sysUser.setUsername(larkUserInfo.getUser_id()); + sysUser.setNickName(larkUserInfo.getName()); + sysUser.setEmail(email); + sysUser.setPassword(CodingUtil.md5(DEFAULT_PWD)); + sysUser.setCreateTime(now); + sysUser.setUpdateTime(now); + + sysUser.setEnabled(1L); + sysUser.setLanguage("zh_CN"); + sysUser.setFrom(7); + sysUser.setIsAdmin(false); + sysUser.setSub(larkUserInfo.getUnion_id()); + sysUser.setPhone(larkUserInfo.getMobile()); + sysUserMapper.insert(sysUser); + Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, null, null, u.getUsername())); } @Transactional @@ -299,7 +322,7 @@ public class SysUserService { SysUserAssist sysUserAssist = request.getSysUserAssist(); if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) { - saveAssist(user.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); + saveAssist(user.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId()); } return result; } @@ -550,12 +573,13 @@ public class SysUserService { sysUserAssistMapper.insertSelective(sysUserAssist); } - public void saveAssist(Long userId, String wecomId, String dingtlkId, String larkId) { + public void saveAssist(Long userId, String wecomId, String dingtlkId, String larkId, String larksuiteId) { SysUserAssist existAssist = sysUserAssistMapper.selectByPrimaryKey(userId); if (ObjectUtils.isNotEmpty(existAssist)) { existAssist.setWecomId(wecomId); existAssist.setDingtalkId(dingtlkId); existAssist.setLarkId(larkId); + existAssist.setLarksuiteId(larksuiteId); sysUserAssistMapper.updateByPrimaryKey(existAssist); return; } @@ -564,6 +588,7 @@ public class SysUserService { sysUserAssist.setWecomId(wecomId); sysUserAssist.setDingtalkId(dingtlkId); sysUserAssist.setLarkId(larkId); + sysUserAssist.setLarksuiteId(larksuiteId); sysUserAssistMapper.insert(sysUserAssist); } diff --git a/backend/src/main/resources/db/migration/V42__1.16.sql b/backend/src/main/resources/db/migration/V42__1.16.sql index 2423350791..75d3e058f8 100644 --- a/backend/src/main/resources/db/migration/V42__1.16.sql +++ b/backend/src/main/resources/db/migration/V42__1.16.sql @@ -14,3 +14,6 @@ ALTER TABLE `sys_task_email` ADD COLUMN `view_data_range` VARCHAR(255) NULL DEFA UPDATE `sys_msg_type` set `type_name` = 'i18n_msg_type_dataset_sync_failed' WHERE (`msg_type_id` = 6); + +ALTER TABLE `sys_user_assist` +ADD COLUMN `larksuite_id` VARCHAR(255) NULL DEFAULT NULL AFTER `lark_id`; diff --git a/frontend/src/api/user.js b/frontend/src/api/user.js index 6899c6726d..32d2067307 100644 --- a/frontend/src/api/user.js +++ b/frontend/src/api/user.js @@ -121,6 +121,13 @@ export function larkStatus() { }) } +export function larksuiteStatus() { + return request({ + url: '/api/auth/isOpenLarksuite', + method: 'post' + }) +} + export function pluginLoaded() { return request({ url: '/api/auth/isPluginLoaded', diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 804ddce80d..191845c079 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -2361,7 +2361,8 @@ export default { channel_email_msg: 'Email', channel_wecom_msg: 'Wecom', channel_dingtalk_msg: 'Dingtalk', - channel_lark_msg: 'Lark' + channel_lark_msg: 'Lark', + channel_larksuite_msg: 'Larksuite' }, denumberrange: { label: 'Number range', @@ -2477,6 +2478,7 @@ export default { wecom: 'Wecom', dingtalk: 'Dingtalk', lark: 'Lark', + larksuite: 'Larksuite', pixel: 'Pixel', default: 'Default', custom: 'Custom', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 6f69214e79..c0e2870d0c 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -2362,7 +2362,8 @@ export default { channel_email_msg: '郵件提醒', channel_wecom_msg: '企業微信', channel_dingtalk_msg: '釘釘提醒', - channel_lark_msg: '飛書提醒' + channel_lark_msg: '飛書提醒', + channel_larksuite_msg: '國際飛書' }, denumberrange: { label: '數值區間', @@ -2478,6 +2479,7 @@ export default { wecom: '企業微信', dingtalk: '釘釘', lark: '飛書', + larksuite: '國際飛書', pixel: '分辨率', default: '默認', custom: '自定義', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 73d7733c38..d4bf01b025 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -2362,7 +2362,8 @@ export default { channel_email_msg: '邮件提醒', channel_wecom_msg: '企业微信', channel_dingtalk_msg: '钉钉提醒', - channel_lark_msg: '飞书提醒' + channel_lark_msg: '飞书提醒', + channel_larksuite_msg: '国际飞书' }, denumberrange: { label: '数值区间', @@ -2478,6 +2479,7 @@ export default { wecom: '企业微信', dingtalk: '钉钉', lark: '飞书', + larksuite: '国际飞书', pixel: '分辨率', default: '默认', custom: '自定义', diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue index bac3dee230..56e1e88565 100644 --- a/frontend/src/views/login/index.vue +++ b/frontend/src/views/login/index.vue @@ -75,6 +75,11 @@ :label="2" size="mini" >OIDC + Larksuite @@ -187,6 +192,12 @@ component-name="SSOComponent" /> + +
import { encrypt } from '@/utils/rsaEncrypt' -import { ldapStatus, oidcStatus, getPublicKey, pluginLoaded, defaultLoginType, wecomStatus, dingtalkStatus, larkStatus } from '@/api/user' +import { ldapStatus, oidcStatus, getPublicKey, pluginLoaded, defaultLoginType, wecomStatus, dingtalkStatus, larkStatus, larksuiteStatus } from '@/api/user' import { getSysUI } from '@/utils/auth' import { changeFavicon } from '@/utils/index' import { initTheme } from '@/utils/ThemeUtil' @@ -248,10 +259,10 @@ export default { return this.$store.state.user.loginMsg }, qrTypes() { - return this.loginTypes && this.loginTypes.filter(item => item > 3) || [] + return this.loginTypes && this.loginTypes.filter(item => item > 3 && item < 7) || [] }, radioTypes() { - return this.loginTypes && this.loginTypes.filter(item => item < 4) || [] + return this.loginTypes && this.loginTypes.filter(item => item < 4 || item > 6) || [] } }, watch: { @@ -312,6 +323,13 @@ export default { this.setDefaultType() }) + larksuiteStatus().then(res => { + if (res.success && res.data) { + this.loginTypes.push(7) + } + this.setDefaultType() + }) + getPublicKey().then(res => { if (res.success && res.data) { // 保存公钥 @@ -391,6 +409,9 @@ export default { clearLarkMsg() { Cookies.remove('LarkError') }, + clearLarksuiteMsg() { + Cookies.remove('LarksuiteError') + }, showLoginImage(uiInfo) { this.uiInfo = getSysUI() if (!this.uiInfo || Object.keys(this.uiInfo).length === 0) { @@ -427,6 +448,7 @@ export default { this.clearWecomMsg() this.clearDingtalkMsg() this.clearLarkMsg() + this.clearLarksuiteMsg() this.$refs.loginForm.validate(valid => { if (valid) { this.loading = true @@ -447,8 +469,9 @@ export default { }) }, changeLoginType(val) { - if (val !== 2) return + if (val !== 2 && val !== 7) return this.clearOidcMsg() + this.clearLarksuiteMsg() this.$nextTick(() => { }) From c01d44f2804cd2eb8724a393e075083a327f7bf6 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 24 Oct 2022 14:42:37 +0800 Subject: [PATCH 02/11] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=8B=BC?= =?UTF-8?q?=E5=86=99=E9=94=99=E8=AF=AF=EF=BC=8C=E6=A0=BC=E5=BC=8F=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/sys/SysUserController.java | 8 +- .../controller/sys/response/AuthBindDTO.java | 8 +- .../main/java/io/dataease/ext/AuthMapper.xml | 151 ++++++++++++------ .../main/resources/db/migration/V42__1.16.sql | 32 ++-- 4 files changed, 135 insertions(+), 64 deletions(-) diff --git a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java index 7d4a68bca3..b528f45bb3 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java @@ -248,16 +248,16 @@ public class SysUserController { AuthBindDTO dto = new AuthBindDTO(); if (ObjectUtils.isEmpty(sysUserAssist)) return dto; if (authUserService.supportWecom() && StringUtils.isNotBlank(sysUserAssist.getWecomId())) { - dto.setWecomBinded(true); + dto.setWecomBound(true); } if (authUserService.supportDingtalk() && StringUtils.isNotBlank(sysUserAssist.getDingtalkId())) { - dto.setDingtalkBinded(true); + dto.setDingtalkBound(true); } if (authUserService.supportLark() && StringUtils.isNotBlank(sysUserAssist.getLarkId())) { - dto.setLarkBinded(true); + dto.setLarkBound(true); } if (authUserService.supportLarksuite() && StringUtils.isNotBlank(sysUserAssist.getLarksuiteId())) { - dto.setLarksuiteBinded(true); + dto.setLarksuiteBound(true); } return dto; } diff --git a/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java b/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java index dcb2afcd1a..b01f031a67 100644 --- a/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java +++ b/backend/src/main/java/io/dataease/controller/sys/response/AuthBindDTO.java @@ -7,11 +7,11 @@ import java.io.Serializable; @Data public class AuthBindDTO implements Serializable { - private Boolean wecomBinded = false; + private Boolean wecomBound = false; - private Boolean dingtalkBinded = false; + private Boolean dingtalkBound = false; - private Boolean larkBinded = false; + private Boolean larkBound = false; - private Boolean larksuiteBinded = false; + private Boolean larksuiteBound = false; } diff --git a/backend/src/main/java/io/dataease/ext/AuthMapper.xml b/backend/src/main/java/io/dataease/ext/AuthMapper.xml index dda18002af..9710597aa6 100644 --- a/backend/src/main/java/io/dataease/ext/AuthMapper.xml +++ b/backend/src/main/java/io/dataease/ext/AuthMapper.xml @@ -23,8 +23,7 @@ diff --git a/backend/src/main/resources/db/migration/V42__1.16.sql b/backend/src/main/resources/db/migration/V42__1.16.sql index 75d3e058f8..7644233454 100644 --- a/backend/src/main/resources/db/migration/V42__1.16.sql +++ b/backend/src/main/resources/db/migration/V42__1.16.sql @@ -1,19 +1,33 @@ -UPDATE `sys_menu` set `component` = REPLACE(`component`, 'SysParam', 'sysParam') where (`component` like '%SysParam%'); +UPDATE `sys_menu` +set `component` = REPLACE(`component`, 'SysParam', 'sysParam') +where (`component` like '%SysParam%'); -UPDATE `sys_menu` set `component` = REPLACE(`component`, 'privateForm', 'PrivateForm') where (`component` like '%privateForm%'); +UPDATE `sys_menu` +set `component` = REPLACE(`component`, 'privateForm', 'PrivateForm') +where (`component` like '%privateForm%'); -UPDATE `sys_menu` set `component` = REPLACE(`component`, 'personPwd', 'PersonPwd') where (`component` like '%personPwd%'); +UPDATE `sys_menu` +set `component` = REPLACE(`component`, 'personPwd', 'PersonPwd') +where (`component` like '%personPwd%'); -UPDATE `sys_menu` set `component` = REPLACE(`component`, 'dataset', 'Dataset') where (`component` = 'system/task/dataset'); +UPDATE `sys_menu` +set `component` = REPLACE(`component`, 'dataset', 'Dataset') +where (`component` = 'system/task/dataset'); -UPDATE `sys_menu` set `component` = REPLACE(`component`, 'form', 'Form') where (`component` = 'system/task/form'); +UPDATE `sys_menu` +set `component` = REPLACE(`component`, 'form', 'Form') +where (`component` = 'system/task/form'); -ALTER TABLE `dataset_table_field` ADD COLUMN `date_format` VARCHAR(255) NULL AFTER `accuracy`; +ALTER TABLE `dataset_table_field` + ADD COLUMN `date_format` VARCHAR(255) NULL AFTER `accuracy`; -ALTER TABLE `sys_task_email` ADD COLUMN `view_data_range` VARCHAR(255) NULL DEFAULT 'view' AFTER `reci_users`; +ALTER TABLE `sys_task_email` + ADD COLUMN `view_data_range` VARCHAR(255) NULL DEFAULT 'view' AFTER `reci_users`; -UPDATE `sys_msg_type` set `type_name` = 'i18n_msg_type_dataset_sync_failed' WHERE (`msg_type_id` = 6); +UPDATE `sys_msg_type` +set `type_name` = 'i18n_msg_type_dataset_sync_failed' +WHERE (`msg_type_id` = 6); ALTER TABLE `sys_user_assist` -ADD COLUMN `larksuite_id` VARCHAR(255) NULL DEFAULT NULL AFTER `lark_id`; + ADD COLUMN `larksuite_id` VARCHAR(255) NULL DEFAULT NULL AFTER `lark_id`; From 570af17d2675662a6da74489ffddae332eea908c Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Mon, 24 Oct 2022 14:51:27 +0800 Subject: [PATCH 03/11] =?UTF-8?q?feat(=E4=BB=AA=E8=A1=A8=E6=9D=BF):=20?= =?UTF-8?q?=E4=BB=AA=E8=A1=A8=E6=9D=BFTab=E7=BB=84=E4=BB=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=A7=BB=E5=85=A5=E7=A7=BB=E5=87=BA=E8=87=AA=E7=94=B1?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/DeDrag/index.vue | 26 ++++++++++--------- frontend/src/components/canvas/DeCanvas.vue | 1 - .../canvas/components/Editor/DeEditor.vue | 1 - .../src/components/widget/DeWidget/DeTabs.vue | 8 ------ frontend/src/store/index.js | 2 -- 5 files changed, 14 insertions(+), 24 deletions(-) diff --git a/frontend/src/components/DeDrag/index.vue b/frontend/src/components/DeDrag/index.vue index 227387ac25..0ecc9460aa 100644 --- a/frontend/src/components/DeDrag/index.vue +++ b/frontend/src/components/DeDrag/index.vue @@ -434,10 +434,10 @@ export default { } }, computed: { - parentWidthOffset(){ - if(this.canvasId==='canvas-main'){ + parentWidthOffset() { + if (this.canvasId === 'canvas-main') { return 0 - }else{ + } else { return this.parentWidthTabOffset } }, @@ -677,7 +677,9 @@ export default { 'tabMoveInActiveId', 'tabActiveTabNameMap', 'mousePointShadowMap', - 'tabMoveOutComponentId' + 'tabMoveOutComponentId', + 'tabCollisionActiveId', + 'tabMoveInActiveId' ]) }, watch: { @@ -1495,14 +1497,14 @@ export default { const targetCanvasScale = this.curCanvasScaleMap['canvas-main'] // 按照阴影位置定位 this.element.style.left = (this.mousePointShadowMap.mouseX - (this.mousePointShadowMap.width)) / targetCanvasScale.scalePointWidth - this.element.style.top = (this.mousePointShadowMap.mouseY - (this.mousePointShadowMap.height / 2))/ targetCanvasScale.scalePointHeight - this.element.style.width = this.mousePointShadowMap.width/ targetCanvasScale.scalePointWidth - this.element.style.height = this.mousePointShadowMap.height/ targetCanvasScale.scalePointHeight + this.element.style.top = (this.mousePointShadowMap.mouseY - (this.mousePointShadowMap.height / 2)) / targetCanvasScale.scalePointHeight + this.element.style.width = this.mousePointShadowMap.width / targetCanvasScale.scalePointWidth + this.element.style.height = this.mousePointShadowMap.height / targetCanvasScale.scalePointHeight if (this.element.auxiliaryMatrix) { this.element.x = Math.round(this.element.style.left / targetCanvasScale.matrixStyleOriginWidth) + 1 this.element.y = Math.round(this.element.style.top / targetCanvasScale.matrixStyleOriginHeight) + 1 - this.element.sizex = Math.round(this.element.style.width /targetCanvasScale.matrixStyleOriginWidth) + this.element.sizex = Math.round(this.element.style.width / targetCanvasScale.matrixStyleOriginWidth) this.element.sizey = Math.round(this.element.style.height / targetCanvasScale.matrixStyleOriginHeight) this.recordMatrixCurShadowStyle(targetCanvasScale) } @@ -1922,8 +1924,8 @@ export default { const left = this.left const width = this.width const height = this.height - // tab 移入检测开启 - if (this.isTabMoveCheck) { + // tab 移入检测开启 tab组件不能相互移入另一个tab组件 + if (this.isTabMoveCheck && this.element.type !== 'de-tabs') { const nodes = this.$el.parentNode.childNodes // 获取当前父节点下所有子节点 for (const item of nodes) { if ( @@ -1953,7 +1955,7 @@ export default { const brAndBr = (collisionT + collisionH) >= (top + height) && (collisionL + collisionW) >= (left + width) if (tfAndTf && bfAndBf && trAndTr && brAndBr) { this.$store.commit('setTabCollisionActiveId', item.getAttribute('component-id')) - } else { + } else if (this.tabCollisionActiveId === item.getAttribute('component-id')) { this.$store.commit('setTabCollisionActiveId', null) } @@ -1974,7 +1976,7 @@ export default { const activeBrAndBr = (activeT + activeH) >= (top + height) && (activeL + activeW) >= (left + width) if (activeTfAndTf && activeBfAndBf && activeTrAndTr && activeBrAndBr) { this.$store.commit('setTabMoveInActiveId', item.getAttribute('component-id')) - } else { + } else if (this.tabMoveInActiveId === item.getAttribute('component-id')) { this.$store.commit('setTabMoveInActiveId', null) } diff --git a/frontend/src/components/canvas/DeCanvas.vue b/frontend/src/components/canvas/DeCanvas.vue index 30dd77c57e..0b42e9dcc1 100644 --- a/frontend/src/components/canvas/DeCanvas.vue +++ b/frontend/src/components/canvas/DeCanvas.vue @@ -268,7 +268,6 @@ export default { }) }, handleDragOver(e) { - // console.log("handleDragOver-"+this.canvasId) e.preventDefault() e.dataTransfer.dropEffect = 'copy' this.$refs[this.editorRefName].handleDragOver(e) diff --git a/frontend/src/components/canvas/components/Editor/DeEditor.vue b/frontend/src/components/canvas/components/Editor/DeEditor.vue index 04f8c99dec..1a4297e1a7 100644 --- a/frontend/src/components/canvas/components/Editor/DeEditor.vue +++ b/frontend/src/components/canvas/components/Editor/DeEditor.vue @@ -1482,7 +1482,6 @@ export default { } }, handleDragOver(e) { - console.log('handleDragOver--x='+e.pageX+';y='+e.pageY) this.dragComponentInfo.shadowStyle.x = e.pageX - 220 this.dragComponentInfo.shadowStyle.y = e.pageY - 90 + this.scrollTop this.dragComponentInfo.style.left = this.dragComponentInfo.shadowStyle.x / this.scalePointWidth diff --git a/frontend/src/components/widget/DeWidget/DeTabs.vue b/frontend/src/components/widget/DeWidget/DeTabs.vue index da1c648dc1..0d72f45819 100644 --- a/frontend/src/components/widget/DeWidget/DeTabs.vue +++ b/frontend/src/components/widget/DeWidget/DeTabs.vue @@ -45,14 +45,6 @@ {{ $t('detabs.eidttitle') }} - - {{ $t('detabs.selectview') }} - - - - {{ $t('detabs.selectOthers') }} - - Date: Mon, 24 Oct 2022 14:59:32 +0800 Subject: [PATCH 04/11] =?UTF-8?q?fix:=20=E7=A7=BB=E5=8A=A8=E7=AB=AF?= =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mobile/src/components/amap-wx/js/util.js | 14 +++++++------- mobile/src/components/uni-link/uni-link.vue | 2 +- mobile/src/pages/tabBar/home/detail.nvue | 4 ++-- mobile/src/pages/tabBar/home/index.nvue | 12 ++++++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mobile/src/components/amap-wx/js/util.js b/mobile/src/components/amap-wx/js/util.js index cceeee0552..ea6075f3bf 100644 --- a/mobile/src/components/amap-wx/js/util.js +++ b/mobile/src/components/amap-wx/js/util.js @@ -58,7 +58,7 @@ const util = { /** * 关键字颜色变化 */ - serachNmme(val, name) { + searchNmme(val, name) { let namestr = new RegExp(val); let nameresult = `
@@ -94,7 +94,7 @@ const util = { dataHandle(item, val) { // 改变字体颜色 if (val) { - item.nameNodes = util.serachNmme(val, item.name); + item.nameNodes = util.searchNmme(val, item.name); } else { item.nameNodes = `
${item.name}
`; @@ -130,9 +130,9 @@ const util = { setHistory(val) { let searchHistory = uni.getStorageSync('search:history'); if (!searchHistory) searchHistory = []; - let serachData = {}; + let searchData = {}; if (typeof(val) === 'string') { - serachData = { + searchData = { adcode: [], address: [], city: [], @@ -143,18 +143,18 @@ const util = { typecode: [] }; } else { - serachData = val + searchData = val } // 判断数组是否存在,如果存在,那么将放到最前面 for (var i = 0; i < searchHistory.length; i++) { - if (searchHistory[i].name === serachData.name) { + if (searchHistory[i].name === searchData.name) { searchHistory.splice(i, 1); break; } } - searchHistory.unshift(util.dataHandle(serachData)); + searchHistory.unshift(util.dataHandle(searchData)); uni.setStorage({ key: 'search:history', data: searchHistory, diff --git a/mobile/src/components/uni-link/uni-link.vue b/mobile/src/components/uni-link/uni-link.vue index 27c5468e1a..05f3618284 100644 --- a/mobile/src/components/uni-link/uni-link.vue +++ b/mobile/src/components/uni-link/uni-link.vue @@ -25,7 +25,7 @@ * @tutorial https://ext.dcloud.net.cn/plugin?id=1182 * @property {String} href 点击后打开的外部网页url * @property {String} text 显示的文字 - * @property {String} downlaod H5平台下载文件名 + * @property {String} download H5平台下载文件名 * @property {Boolean} showUnderLine 是否显示下划线 * @property {String} copyTips 在小程序端复制链接时显示的提示语 * @property {String} color 链接文字颜色 diff --git a/mobile/src/pages/tabBar/home/detail.nvue b/mobile/src/pages/tabBar/home/detail.nvue index 3c27d40dfc..82183a8d87 100644 --- a/mobile/src/pages/tabBar/home/detail.nvue +++ b/mobile/src/pages/tabBar/home/detail.nvue @@ -116,7 +116,7 @@ index: 1 }) this.loadStarStatus() - this.caclViewHeight() + this.calcViewHeight() }, @@ -194,7 +194,7 @@ }) }, - caclViewHeight() { + calcViewHeight() { let systemInfo = uni.getSystemInfoSync() const h5Height = systemInfo.windowHeight - systemInfo.statusBarHeight if(systemInfo.navigationBarHeight) { diff --git a/mobile/src/pages/tabBar/home/index.nvue b/mobile/src/pages/tabBar/home/index.nvue index a1cd90c05e..e58af9b0a4 100644 --- a/mobile/src/pages/tabBar/home/index.nvue +++ b/mobile/src/pages/tabBar/home/index.nvue @@ -113,9 +113,9 @@ } requestHome({type: index, lastTime: activeTab.lastTime}).then(res => { - var datas = res.data.listObject - if(datas.length > 0) { - datas.forEach(item => { + var data = res.data.listObject + if(data.length > 0) { + data.forEach(item => { item.article_type = 1 item.image_url = '../../../static/yibiaobans.png' if(item.nickName) { @@ -124,11 +124,11 @@ if(item.time) item.rightText = formatHistoryDate(item.time) }) - activeTab.lastTime = datas[datas.length - 1].time + activeTab.lastTime = data[data.length - 1].time if(replace) { - activeTab.data = datas + activeTab.data = data }else { - activeTab.data = activeTab.data.concat(datas) + activeTab.data = activeTab.data.concat(data) } } From 93776973d8475fbdfd5febb4f08ca2a64b82adac Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 24 Oct 2022 17:31:36 +0800 Subject: [PATCH 05/11] =?UTF-8?q?perf(=E5=B9=B3=E5=8F=B0=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?):=20=E4=BC=98=E5=8C=96=E9=A3=9E=E4=B9=A6=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/plugins/server/XLarksuiteServer.java | 2 +- frontend/src/views/login/index.vue | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java b/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java index 52223daff3..64d9506cfb 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java @@ -101,7 +101,7 @@ public class XLarksuiteServer { String email = StringUtils.isNotBlank(larkUserInfo.getEmail()) ? larkUserInfo.getEmail() : (username + "@larksuite.work"); sysUserService.validateExistUser(username, larkUserInfo.getName(), email); sysUserService.saveLarksuiteCUser(larkUserInfo, email); - sysUserEntity = authUserService.getUserByLarkId(username); + sysUserEntity = authUserService.getUserByLarksuiteId(username); } TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); String realPwd = sysUserEntity.getPassword(); diff --git a/frontend/src/views/login/index.vue b/frontend/src/views/login/index.vue index 56e1e88565..e5881db818 100644 --- a/frontend/src/views/login/index.vue +++ b/frontend/src/views/login/index.vue @@ -379,6 +379,11 @@ export default { this.switchCodeIndex(6) } this.clearLarkMsg() + + if (Cookies.get('LarksuiteError')) { + this.$error(Cookies.get('LarksuiteError')) + } + this.clearLarksuiteMsg() }, methods: { From 716328444e8b08217de92edaa3188387930990f6 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Mon, 24 Oct 2022 17:33:31 +0800 Subject: [PATCH 06/11] =?UTF-8?q?feat(=E4=BB=AA=E8=A1=A8=E6=9D=BF):=20Tab?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=86=85=E7=9A=84=E8=BF=87=E6=BB=A4=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=BD=9C=E7=94=A8=E5=9F=9F=E4=BB=85=E9=99=90=E4=BA=8E?= =?UTF-8?q?=E5=BD=93=E5=89=8DTab=E9=A1=B5=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Editor/ComponentWrapper.vue | 6 +++++ .../canvas/components/Editor/DeEditor.vue | 14 +++++++---- .../canvas/components/Editor/Preview.vue | 5 +++- .../canvas/custom-component/UserView.vue | 4 ++++ .../src/components/dataease/DeOutWidget.vue | 5 ++++ .../src/components/widget/DeWidget/DeDate.vue | 5 ++++ .../widget/DeWidget/DeInputSearch.vue | 5 ++++ .../widget/DeWidget/DeNumberRange.vue | 5 ++++ .../components/widget/DeWidget/DeSelect.vue | 5 ++++ .../widget/DeWidget/DeSelectGrid.vue | 5 ++++ .../widget/DeWidget/DeSelectTree.vue | 5 ++++ frontend/src/store/index.js | 23 +++++++++++-------- 12 files changed, 71 insertions(+), 16 deletions(-) diff --git a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue index 030ca7e218..cf18c101c3 100644 --- a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue @@ -41,12 +41,14 @@ :in-screen="inScreen" :edit-mode="'preview'" :h="config.style.height" + :canvas-id="canvasId" /> 0 ? newX : 1 newY = newY > 0 ? newY : 1 - console.log("moveTabCollisionActive="+this.moveTabCollisionActive) if (this.moveTabCollisionActive) { return } diff --git a/frontend/src/components/canvas/components/Editor/Preview.vue b/frontend/src/components/canvas/components/Editor/Preview.vue index 8cbdc8b2ba..235c43e11b 100644 --- a/frontend/src/components/canvas/components/Editor/Preview.vue +++ b/frontend/src/components/canvas/components/Editor/Preview.vue @@ -43,6 +43,7 @@ :key="index" ref="viewWrapperChild" :config="item" + :canvas-id="canvasId" :source-config="componentData[index]" :search-count="searchCount" :in-screen="inScreen" @@ -440,7 +441,9 @@ export default { } else { this.scaleHeight = canvasHeight * 100 / this.canvasStyleData.height// 获取高度比 } - this.$store.commit('setPreviewCanvasScale', { scaleWidth: (this.scaleWidth / 100), scaleHeight: (this.scaleHeight / 100) }) + if(this.canvasId === 'canvas-main'){ + this.$store.commit('setPreviewCanvasScale', { scaleWidth: (this.scaleWidth / 100), scaleHeight: (this.scaleHeight / 100) }) + } this.handleScaleChange() }, resetID(data) { diff --git a/frontend/src/components/canvas/custom-component/UserView.vue b/frontend/src/components/canvas/custom-component/UserView.vue index a47f7cf719..9a0bd6ae43 100644 --- a/frontend/src/components/canvas/custom-component/UserView.vue +++ b/frontend/src/components/canvas/custom-component/UserView.vue @@ -216,6 +216,10 @@ export default { name: 'UserView', components: { UserViewDialog, DeRichTextView, LabelNormalText, PluginCom, ChartComponentS2, EditBarView, ChartComponent, TableNormal, LabelNormal, DrillPath, ChartComponentG2 }, props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: null diff --git a/frontend/src/components/dataease/DeOutWidget.vue b/frontend/src/components/dataease/DeOutWidget.vue index 46aa53326e..4d567a5a60 100644 --- a/frontend/src/components/dataease/DeOutWidget.vue +++ b/frontend/src/components/dataease/DeOutWidget.vue @@ -39,6 +39,7 @@ :is="element.component" v-if="element.type==='custom'" :id="'component' + element.id" + :canvas-id="canvasId" ref="deOutWidget" class="component-custom" :out-style="element.style" @@ -64,6 +65,10 @@ export default { name: 'DeOutWidget', mixins: [inputStyleMixin], props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: () => {} diff --git a/frontend/src/components/widget/DeWidget/DeDate.vue b/frontend/src/components/widget/DeWidget/DeDate.vue index f054608404..f28e8f5807 100644 --- a/frontend/src/components/widget/DeWidget/DeDate.vue +++ b/frontend/src/components/widget/DeWidget/DeDate.vue @@ -35,6 +35,10 @@ import customInput from '@/components/widget/DeWidget/customInput' export default { mixins: [customInput], props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: null @@ -221,6 +225,7 @@ export default { }, getCondition() { const param = { + canvasId: this.canvasId, component: this.element, value: this.formatFilterValue(), operator: this.operator diff --git a/frontend/src/components/widget/DeWidget/DeInputSearch.vue b/frontend/src/components/widget/DeWidget/DeInputSearch.vue index c09179631f..e54b9e554e 100644 --- a/frontend/src/components/widget/DeWidget/DeInputSearch.vue +++ b/frontend/src/components/widget/DeWidget/DeInputSearch.vue @@ -27,6 +27,10 @@ import bus from '@/utils/bus' export default { props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: null @@ -104,6 +108,7 @@ export default { }, getCondition() { const param = { + canvasId: this.canvasId, component: this.element, value: !this.value ? [] : Array.isArray(this.value) ? this.value : [this.value], operator: this.operator diff --git a/frontend/src/components/widget/DeWidget/DeNumberRange.vue b/frontend/src/components/widget/DeWidget/DeNumberRange.vue index cbaca4a51d..d3340508dd 100644 --- a/frontend/src/components/widget/DeWidget/DeNumberRange.vue +++ b/frontend/src/components/widget/DeWidget/DeNumberRange.vue @@ -47,6 +47,10 @@ import bus from '@/utils/bus' export default { props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: null @@ -230,6 +234,7 @@ export default { }, getCondition() { const param = { + canvasId: this.canvasId, component: this.element, value: [this.form.min, this.form.max], operator: this.operator diff --git a/frontend/src/components/widget/DeWidget/DeSelect.vue b/frontend/src/components/widget/DeWidget/DeSelect.vue index e63f7bcb96..ea96a77484 100644 --- a/frontend/src/components/widget/DeWidget/DeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeSelect.vue @@ -52,6 +52,10 @@ export default { components: { ElVisualSelect }, mixins: [customInput], props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: () => {} @@ -311,6 +315,7 @@ export default { }, getCondition() { const param = { + canvasId: this.canvasId, component: this.element, value: this.formatFilterValue(), operator: this.operator diff --git a/frontend/src/components/widget/DeWidget/DeSelectGrid.vue b/frontend/src/components/widget/DeWidget/DeSelectGrid.vue index d4f4c57ec4..75e7758c6f 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectGrid.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectGrid.vue @@ -73,6 +73,10 @@ import { attrsMap, styleAttrs, textSelectGridWidget } from '@/components/widget/ export default { props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: null @@ -312,6 +316,7 @@ export default { }, getCondition() { const param = { + canvasId: this.canvasId, component: this.element, value: this.formatFilterValue(), operator: this.operator diff --git a/frontend/src/components/widget/DeWidget/DeSelectTree.vue b/frontend/src/components/widget/DeWidget/DeSelectTree.vue index 96232638f2..77950175d1 100644 --- a/frontend/src/components/widget/DeWidget/DeSelectTree.vue +++ b/frontend/src/components/widget/DeWidget/DeSelectTree.vue @@ -36,6 +36,10 @@ export default { components: { ElTreeSelect }, mixins: [customInput], props: { + canvasId: { + type: String, + required: true + }, element: { type: Object, default: () => {} @@ -298,6 +302,7 @@ export default { const val = this.formatFilterValue() const param = { + canvasId: this.canvasId, component: this.element, value: val, operator: this.operator, diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index d16d0ea15f..5b220ff0d7 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -164,7 +164,7 @@ const data = { ...snapshot.mutations, ...lock.mutations, - setTabActiveTabNameMap(state, tabActiveInfo){ + setTabActiveTabNameMap(state, tabActiveInfo) { state.tabActiveTabNameMap[tabActiveInfo.tabId] = tabActiveInfo.activeTabName }, @@ -288,6 +288,13 @@ const data = { const vValid = valueValid(condition) // 1.根据componentId过滤 const filterComponentId = condition.componentId + const canvasId = data.canvasId + + //过滤时 主画布的过滤组件可以过滤所有的视图 + const canvasViewIds = state.componentData.filter(item => item.type === 'view' && (canvasId === 'canvas-main' || item.canvasId === canvasId)).map((itemView) => { + return itemView.propValue.viewId + }) + const canvasViewIdMatch = (viewId) => canvasViewIds && canvasViewIds.length > 0 && canvasViewIds.includes(viewId) // 2.循环每个Component 得到 三种情况 a增加b删除c无操作 const viewIdMatch = (viewIds, viewId) => !viewIds || viewIds.length === 0 || viewIds.includes(viewId) @@ -317,7 +324,7 @@ const data = { } if (!element.type || element.type !== 'view') continue const currentFilters = element.filters || [] - const vidMatch = viewIdMatch(condition.viewIds, element.propValue.viewId) + const vidMatch = viewIdMatch(condition.viewIds, element.propValue.viewId) && canvasViewIdMatch(element.propValue.viewId) let j = currentFilters.length while (j--) { const filter = currentFilters[j] @@ -484,12 +491,8 @@ const data = { } } }, - - deleteComponent(state, index) { - if (index === undefined) { - index = state.curComponentIndex - } - state.componentData.splice(index, 1) + deleteComponent(state) { + this.commit('deleteComponentWithId',state.curComponent.id) }, setLinkageInfo(state, targetLinkageInfo) { state.linkageSettingStatus = true @@ -752,13 +755,13 @@ const data = { setTabMoveOutComponentId(state, componentId) { state.tabMoveOutComponentId = componentId }, - clearTabMoveInfo(state){ + clearTabMoveInfo(state) { state.tabMoveInActiveId = null state.tabCollisionActiveId = null state.tabMoveOutActiveId = null state.tabMoveOutComponentId = null }, - setMousePointShadowMap(state,mousePoint){ + setMousePointShadowMap(state, mousePoint) { state.mousePointShadowMap.mouseX = mousePoint.mouseX state.mousePointShadowMap.mouseY = mousePoint.mouseY state.mousePointShadowMap.width = mousePoint.width From 6348dc69333b6b4ed1c1b01fdac62c8b582821ec Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Mon, 24 Oct 2022 18:05:23 +0800 Subject: [PATCH 07/11] =?UTF-8?q?refactor(=E4=BB=AA=E8=A1=A8=E6=9D=BF):=20?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E8=A7=86=E5=9B=BE=E9=BB=98=E8=AE=A4=E5=8A=A0?= =?UTF-8?q?=E5=88=B0=E4=B8=BB=E7=94=BB=E5=B8=83=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/panel/edit/index.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index f14c8c6664..143359d895 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -1297,6 +1297,8 @@ export default { component.x = 1 component.y = 1 } + component['canvasId'] = 'canvas-main' + component['canvasPid'] = '0' component.id = newComponentId // 统一设置背景信息 component.commonBackground = deepCopy(COMMON_BACKGROUND) From bf92ddaa4edbfe8bf8edb3c83d2822d1d134639d Mon Sep 17 00:00:00 2001 From: taojinlong Date: Tue, 25 Oct 2022 13:44:53 +0800 Subject: [PATCH 08/11] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E6=BA=90):=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20Kylin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/resources/db/migration/V42__1.16.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/main/resources/db/migration/V42__1.16.sql b/backend/src/main/resources/db/migration/V42__1.16.sql index 7644233454..4b3ab2f784 100644 --- a/backend/src/main/resources/db/migration/V42__1.16.sql +++ b/backend/src/main/resources/db/migration/V42__1.16.sql @@ -31,3 +31,5 @@ WHERE (`msg_type_id` = 6); ALTER TABLE `sys_user_assist` ADD COLUMN `larksuite_id` VARCHAR(255) NULL DEFAULT NULL AFTER `lark_id`; + +ALTER TABLE `dataset_table_field` CHANGE COLUMN `type` `type` VARCHAR(255) NOT NULL COMMENT '原始字段类型' ; From afa581c1d286b3e6d93eb7a2f4481c71ddfe9aa4 Mon Sep 17 00:00:00 2001 From: taojinlong Date: Tue, 25 Oct 2022 14:28:43 +0800 Subject: [PATCH 09/11] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E6=BA=90):=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20Kylin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/resources/db/migration/V42__1.16.sql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/src/main/resources/db/migration/V42__1.16.sql b/backend/src/main/resources/db/migration/V42__1.16.sql index 4b3ab2f784..db7fbd29ef 100644 --- a/backend/src/main/resources/db/migration/V42__1.16.sql +++ b/backend/src/main/resources/db/migration/V42__1.16.sql @@ -33,3 +33,8 @@ ALTER TABLE `sys_user_assist` ADD COLUMN `larksuite_id` VARCHAR(255) NULL DEFAULT NULL AFTER `lark_id`; ALTER TABLE `dataset_table_field` CHANGE COLUMN `type` `type` VARCHAR(255) NOT NULL COMMENT '原始字段类型' ; + +INSERT INTO `my_plugin` (`name`, `store`, `free`, `cost`, `category`, `descript`, `version`, `creator`, `load_mybatis`, + `install_time`, `module_name`, `ds_type`) +VALUES ('Apache Kylin 数据源插件', 'default', '0', '0', 'datasource', 'Apache Kylin 数据源插件', '1.0-SNAPSHOT', 'DATAEASE', '0', + '1650765903630', 'kylin-backend', 'kylin'); \ No newline at end of file From 0f3c4b558028224f83e814bcfdbeeb7b55034b3a Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Tue, 25 Oct 2022 16:03:24 +0800 Subject: [PATCH 10/11] =?UTF-8?q?perf(=E8=A7=86=E5=9B=BE-=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE):=20=E5=88=86=E7=A6=BB=E6=B8=90=E5=8F=98=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/GradientColorSelector/base.js | 71 +++++++++++++- .../GradientColorSelector/index.vue | 97 +++++++++++++------ frontend/src/lang/en.js | 3 + frontend/src/lang/tw.js | 3 + frontend/src/lang/zh.js | 3 + 5 files changed, 149 insertions(+), 28 deletions(-) diff --git a/frontend/src/components/GradientColorSelector/base.js b/frontend/src/components/GradientColorSelector/base.js index 557047a9a5..bf88a65f75 100644 --- a/frontend/src/components/GradientColorSelector/base.js +++ b/frontend/src/components/GradientColorSelector/base.js @@ -86,7 +86,7 @@ export const colorCases = [ export const gradientColorCases = [ { name: '渐变色1', - value: 'gradient1', + value: 'gradient1_continuous_gradient', colors: [ ['rgba(144,202,249,0.5)', 'rgba(1,87,155,0.9)'], ['rgba(127,222,234,1)', 'rgba(0,77,65,1)'], @@ -101,3 +101,72 @@ export const gradientColorCases = [ export const isGradientValue = value => { return value && gradientColorCases.some(item => item.value === value) } + +export const getColorType = value => { + if (value.endsWith('_split_gradient')) { + return 'split_gradient' + } + const cloneColorCases = JSON.parse(JSON.stringify(colorCases)) + if (cloneColorCases.some(item => item.value === value)) { + return 'simple' + } + return 'gradient' +} + +export const getMapColorCases = () => { + const cloneColorCases = JSON.parse(JSON.stringify(colorCases)) + return cloneColorCases.map(colorItem => { + const curColors = colorItem.colors + const len = curColors.length + const start = curColors[0] + const end = curColors[len - 1] + const itemResult = { + name: colorItem.name, + value: colorItem.value + '_split_gradient', + baseColors: [start, end], + colors: stepsColor(start, end, 9, 1) + } + return itemResult + }) +} + +export function stepsColor(start, end, steps, gamma) { + var i; var j; var ms; var me; var output = []; var so = [] + gamma = gamma || 1 + var normalize = function(channel) { + return Math.pow(channel / 255, gamma) + } + start = parseColor(start).map(normalize) + end = parseColor(end).map(normalize) + for (i = 0; i < steps; i++) { + ms = (steps - 1) === 0 ? 0 : (i / (steps - 1)) + me = 1 - ms + for (j = 0; j < 3; j++) { + so[j] = pad( + Math.round( + Math.pow(start[j] * me + end[j] * ms, 1 / gamma) * 255 + ).toString(16) + ) + } + output.push('#' + so.join('')) + } + function parseColor(hexStr) { + return hexStr.length === 4 + ? hexStr + .substr(1) + .split('') + .map(function(s) { + return 0x11 * parseInt(s, 16) + }) + : [hexStr.substr(1, 2), hexStr.substr(3, 2), hexStr.substr(5, 2)].map( + function(s) { + return parseInt(s, 16) + } + ) + } + function pad(s) { + return s.length === 1 ? '0' + s : s + } + return output +} + diff --git a/frontend/src/components/GradientColorSelector/index.vue b/frontend/src/components/GradientColorSelector/index.vue index 48da711b0d..6acae31b81 100644 --- a/frontend/src/components/GradientColorSelector/index.vue +++ b/frontend/src/components/GradientColorSelector/index.vue @@ -20,7 +20,7 @@ @@ -38,7 +38,7 @@
@@ -47,7 +47,7 @@ @tab-click="handleClick" > - + + @@ -132,7 +139,7 @@