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 e4872b8485..313845a1ee 100644 --- a/backend/src/main/java/io/dataease/auth/api/AuthApi.java +++ b/backend/src/main/java/io/dataease/auth/api/AuthApi.java @@ -31,7 +31,4 @@ public interface AuthApi { @PostMapping("/validateName") Boolean validateName(Map nameDto); - - @GetMapping("/test") - String test(); } diff --git a/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java index 8c679ef8a0..f4875ea80c 100644 --- a/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java +++ b/backend/src/main/java/io/dataease/auth/api/dto/DynamicMenuDto.java @@ -29,6 +29,8 @@ public class DynamicMenuDto implements Serializable { private Integer type; + private Integer menuSort; + private Boolean isPlugin; private Boolean noLayout; diff --git a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java index 719f6db9d9..c91dbe1ff3 100644 --- a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java +++ b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java @@ -19,7 +19,6 @@ import org.apache.shiro.subject.PrincipalCollection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; - import java.util.List; import java.util.Set; import java.util.stream.Collectors; diff --git a/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java b/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java index 83d4dc0e96..ade63a71ce 100644 --- a/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java +++ b/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java @@ -13,8 +13,6 @@ public class TokenInfo implements Serializable { private Long userId; - private Long lastLoginTime; - public String format(){ return username + "," +userId; } diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java index 48376db8c6..5f31bf8eea 100644 --- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java @@ -6,6 +6,7 @@ import io.dataease.auth.entity.TokenInfo; import io.dataease.auth.service.AuthUserService; import io.dataease.auth.util.JWTUtils; import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.commons.utils.LogUtil; import io.dataease.i18n.Translator; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; @@ -28,9 +29,6 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { public final static String expireMessage = "Login token is expire."; - /*@Autowired - private AuthUserService authUserService;*/ - /** * 判断用户是否想要登入。 @@ -52,22 +50,15 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { String authorization = httpServletRequest.getHeader("Authorization"); // 当没有出现登录超时 且需要刷新token 则执行刷新token if (JWTUtils.loginExpire(authorization)){ - throw new AuthenticationException(expireMessage); + throw new AuthenticationException(expireMessage); } if (JWTUtils.needRefresh(authorization)){ - String oldAuthorization = authorization; authorization = refreshToken(request, response); - JWTUtils.removeTokenExpire(oldAuthorization); } - // 删除老的操作时间 - JWTUtils.removeTokenExpire(authorization); - // 设置新的操作时间 - JWTUtils.addTokenExpire(authorization); JWTToken token = new JWTToken(authorization); Subject subject = getSubject(request, response); // 提交给realm进行登入,如果错误他会抛出异常并被捕获 subject.login(token); - return true; } @@ -82,10 +73,11 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { boolean loginSuccess = executeLogin(request, response); return loginSuccess; } catch (Exception e) { + LogUtil.error(e); if (e instanceof AuthenticationException && StringUtils.equals(e.getMessage(), expireMessage)){ - responseExpire(request, response); + responseExpire(request, response, e); }else { - response401(request, response); + tokenError(request, response, e); } } } @@ -107,14 +99,8 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { } String password = user.getPassword(); - // 删除老token操作时间 - // JWTUtils.removeTokenExpire(token); String newToken = JWTUtils.sign(tokenInfo, password); - // 记录新token操作时间 - JWTUtils.addTokenExpire(newToken); - JWTToken jwtToken = new JWTToken(newToken); - this.getSubject(request, response).login(jwtToken); // 设置响应的Header头新Token HttpServletResponse httpServletResponse = (HttpServletResponse) response; httpServletResponse.addHeader("Access-Control-Expose-Headers", "RefreshAuthorization"); @@ -141,29 +127,17 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { return super.preHandle(request, response); } - /** - * 将非法请求跳转到 /401 - */ - private void response401(ServletRequest req, ServletResponse resp) { - try { - HttpServletResponse httpServletResponse = (HttpServletResponse) resp; - httpServletResponse.addHeader("Access-Control-Expose-Headers", "authentication-status"); - httpServletResponse.setHeader("authentication-status", "invalid"); - httpServletResponse.setStatus(401); - } catch (Exception e) { - LOGGER.error(e.getMessage()); - } + + private void tokenError(ServletRequest req, ServletResponse resp, Exception e1) { + HttpServletResponse httpServletResponse = (HttpServletResponse) resp; + httpServletResponse.addHeader("Access-Control-Expose-Headers", "authentication-status"); + httpServletResponse.setHeader("authentication-status", "invalid"); } - private void responseExpire(ServletRequest req, ServletResponse resp) { - try { - HttpServletResponse httpServletResponse = (HttpServletResponse) resp; - httpServletResponse.addHeader("Access-Control-Expose-Headers", "authentication-status"); - httpServletResponse.setHeader("authentication-status", "login_expire"); - httpServletResponse.setStatus(401); - } catch (Exception e) { - LOGGER.error(e.getMessage()); - } + private void responseExpire(ServletRequest req, ServletResponse resp, Exception e1) { + HttpServletResponse httpServletResponse = (HttpServletResponse) resp; + httpServletResponse.addHeader("Access-Control-Expose-Headers", "authentication-status"); + httpServletResponse.setHeader("authentication-status", "login_expire"); } } 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 0f52b94437..4be4f80693 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -14,16 +14,14 @@ import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.CodingUtil; import io.dataease.commons.utils.ServletUtils; -/*import io.dataease.plugins.config.SpringContextUtil; - -import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; -import io.dataease.plugins.xpack.display.service.DisPlayXpackService;*/ +import io.dataease.i18n.Translator; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,11 +39,11 @@ public class AuthServer implements AuthApi { String password = loginDto.getPassword(); SysUserEntity user = authUserService.getUserByName(username); - if (ObjectUtils.isEmpty(user)){ - throw new RuntimeException("没有该用户!"); + if (ObjectUtils.isEmpty(user)) { + throw new RuntimeException(Translator.get("i18n_id_or_pwd_error")); } - if (user.getEnabled()==0){ - throw new RuntimeException("用户已经失效!"); + if (user.getEnabled() == 0) { + throw new RuntimeException(Translator.get("i18n_id_or_pwd_error")); } String realPwd = user.getPassword(); //私钥解密 @@ -53,14 +51,13 @@ public class AuthServer implements AuthApi { //md5加密 pwd = CodingUtil.md5(pwd); - if (!StringUtils.equals(pwd, realPwd)){ - throw new RuntimeException("密码错误!"); + if (!StringUtils.equals(pwd, realPwd)) { + throw new RuntimeException(Translator.get("i18n_id_or_pwd_error")); } - Map result = new HashMap<>(); - TokenInfo tokenInfo = TokenInfo.builder().userId(user.getUserId()).username(username).lastLoginTime(System.currentTimeMillis()).build(); + Map result = new HashMap<>(); + TokenInfo tokenInfo = TokenInfo.builder().userId(user.getUserId()).username(username).build(); String token = JWTUtils.sign(tokenInfo, realPwd); // 记录token操作时间 - JWTUtils.addTokenExpire(token); result.put("token", token); ServletUtils.setToken(token); return result; @@ -68,7 +65,7 @@ public class AuthServer implements AuthApi { @Override public CurrentUserDto userInfo() { - CurrentUserDto userDto = (CurrentUserDto)SecurityUtils.getSubject().getPrincipal(); + CurrentUserDto userDto = (CurrentUserDto) SecurityUtils.getSubject().getPrincipal(); if (ObjectUtils.isEmpty(userDto)) { String token = ServletUtils.getToken(); Long userId = JWTUtils.tokenInfoByToken(token).getUserId(); @@ -84,7 +81,7 @@ public class AuthServer implements AuthApi { } @Override - public String logout(){ + public String logout() { String token = ServletUtils.getToken(); Long userId = JWTUtils.tokenInfoByToken(token).getUserId(); authUserService.clearCache(userId); @@ -105,20 +102,5 @@ public class AuthServer implements AuthApi { return null; } - @Override - public String test() { - SysUserEntity userById = authUserService.getUserById(4L); - String nickName = userById.getNickName(); -// System.out.println(nickName); - /* Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(DisPlayXpackService.class); - for (Map.Entry entry : beansOfType.entrySet()) { - Object key = entry.getKey(); - DisPlayXpackService value = (DisPlayXpackService)entry.getValue(); - List sysSettingDtos = value.systemSettings(); - String name = entry.getValue().getClass().getName(); - System.out.println("key: "+ key + ", value: "+ name); - }*/ - return "apple"; - } } 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 bf468686b7..ab34315d8f 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 @@ -8,6 +8,7 @@ import io.dataease.base.mapper.ext.AuthMapper; import io.dataease.auth.service.AuthUserService; import io.dataease.base.mapper.ext.ExtPluginSysMenuMapper; import io.dataease.commons.constants.AuthConstants; +import io.dataease.commons.utils.LogUtil; import io.dataease.plugins.common.dto.PluginSysMenu; import io.dataease.plugins.util.PluginUtils; import org.apache.commons.collections4.CollectionUtils; @@ -17,7 +18,6 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -99,7 +99,7 @@ public class AuthUserServiceImpl implements AuthUserService { }) @Override public void clearCache(Long userId) { - + LogUtil.info("正在清除用户缓存【{}】",userId); } @Transactional diff --git a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java index 9b336f06f8..fde40b65c2 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; @Service public class DynamicMenuServiceImpl implements DynamicMenuService { @@ -35,6 +36,12 @@ public class DynamicMenuServiceImpl implements DynamicMenuService { List pluginDtos = pluginSysMenus.stream().map(this::convert).collect(Collectors.toList()); dynamicMenuDtos.addAll(pluginDtos); } + dynamicMenuDtos = dynamicMenuDtos.stream().sorted((s1, s2) -> { + int sortIndex1 = null == s1.getMenuSort() ? 999: s1.getMenuSort(); + int sortIndex2 = null == s2.getMenuSort() ? 999: s2.getMenuSort(); + return sortIndex1 - sortIndex2; + }).collect(Collectors.toList()); + dynamicMenuDtos.sort((s1, s2) -> s1.getHidden().compareTo(s2.getHidden())); List result = buildTree(dynamicMenuDtos); return result; } @@ -53,6 +60,7 @@ public class DynamicMenuServiceImpl implements DynamicMenuService { menuMeta.setIcon(sysMenu.getIcon()); dynamicMenuDto.setMeta(menuMeta); dynamicMenuDto.setPermission(sysMenu.getPermission()); + dynamicMenuDto.setMenuSort(sysMenu.getMenuSort()); dynamicMenuDto.setHidden(sysMenu.getHidden()); dynamicMenuDto.setIsPlugin(false); return dynamicMenuDto; @@ -71,6 +79,7 @@ public class DynamicMenuServiceImpl implements DynamicMenuService { menuMeta.setIcon(sysMenu.getIcon()); dynamicMenuDto.setMeta(menuMeta); dynamicMenuDto.setPermission(sysMenu.getPermission()); + dynamicMenuDto.setMenuSort(sysMenu.getMenuSort()); dynamicMenuDto.setHidden(sysMenu.getHidden()); dynamicMenuDto.setIsPlugin(true); dynamicMenuDto.setNoLayout(!!sysMenu.isNoLayout()); diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java index 7b25d06748..8b3b7e4c92 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -11,8 +11,7 @@ import io.dataease.commons.utils.CommonBeanFactory; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; + import org.springframework.core.env.Environment; import java.util.Date; @@ -24,7 +23,7 @@ public class JWTUtils { // token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token ) private static final long EXPIRE_TIME = 1*60*1000; // 登录间隔时间10min 超过这个时间强制重新登录 - private static long Login_Interval; + private static long Login_Interval; @@ -38,17 +37,10 @@ public class JWTUtils { public static boolean verify(String token, TokenInfo tokenInfo, String secret) { Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm) - .withClaim("lastLoginTime", tokenInfo.getLastLoginTime()) .withClaim("username", tokenInfo.getUsername()) .withClaim("userId", tokenInfo.getUserId()) .build(); verifier.verify(token); - if (loginExpire(token)){ - // 登录超时 - throw new AuthenticationException(JWTFilter.expireMessage); - // 前端拦截 登录超时状态 直接logout - //return false; - } return true; } @@ -60,11 +52,10 @@ public class JWTUtils { DecodedJWT jwt = JWT.decode(token); String username = jwt.getClaim("username").asString(); Long userId = jwt.getClaim("userId").asLong(); - Long lastLoginTime = jwt.getClaim("lastLoginTime").asLong(); - if (StringUtils.isEmpty(username) || ObjectUtils.isEmpty(userId) || ObjectUtils.isEmpty(lastLoginTime)){ + if (StringUtils.isEmpty(username) || ObjectUtils.isEmpty(userId) ){ throw new RuntimeException("token格式错误!"); } - TokenInfo tokenInfo = TokenInfo.builder().username(username).userId(userId).lastLoginTime(lastLoginTime).build(); + TokenInfo tokenInfo = TokenInfo.builder().username(username).userId(userId).build(); return tokenInfo; } @@ -84,15 +75,15 @@ public class JWTUtils { */ public static boolean loginExpire(String token){ if (Login_Interval==0) { + // 默认超时时间是8h int minute = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout", Integer.class, 8*60); // 分钟换算成毫秒 Login_Interval = minute * 1000 * 60; } - Long now = System.currentTimeMillis(); Long lastOperateTime = tokenLastOperateTime(token); - if (ObjectUtils.isEmpty(lastOperateTime)) return true; - boolean isExpire = false; + boolean isExpire = true; if (lastOperateTime != null) { + Long now = System.currentTimeMillis(); isExpire = now - lastOperateTime > Login_Interval; } return isExpire; @@ -109,7 +100,7 @@ public class JWTUtils { } /** - * 生成签名,1min后过期 + * 生成签名,5min后过期 * @param tokenInfo 用户信息 * @param secret 用户的密码 * @return 加密的token @@ -120,10 +111,8 @@ public class JWTUtils { Algorithm algorithm = Algorithm.HMAC256(secret); // 附带username信息 return JWT.create() - .withClaim("lastLoginTime", tokenInfo.getLastLoginTime()) .withClaim("username", tokenInfo.getUsername()) .withClaim("userId", tokenInfo.getUserId()) - .withClaim("exp", date) .withExpiresAt(date) .sign(algorithm); } catch (Exception e) { @@ -155,26 +144,9 @@ public class JWTUtils { * @return */ public static Long tokenLastOperateTime(String token){ - CacheManager cacheManager = CommonBeanFactory.getBean(CacheManager.class); - Cache tokens_expire = cacheManager.getCache("tokens_expire"); - Long expTime = tokens_expire.get(token, Long.class); - // System.out.println("get-------"+token+" :"+expTime); - return expTime; - } - - public static void removeTokenExpire(String token){ - // System.out.println("remove----"+token); - CacheManager cacheManager = CommonBeanFactory.getBean(CacheManager.class); - Cache tokens_expire = cacheManager.getCache("tokens_expire"); - tokens_expire.evict(token); - } - - public static void addTokenExpire(String token){ - CacheManager cacheManager = CommonBeanFactory.getBean(CacheManager.class); - Cache tokens_expire = cacheManager.getCache("tokens_expire"); - long now = System.currentTimeMillis(); - // System.out.println("add-------"+token+" :"+now); - tokens_expire.put(token, now); + DecodedJWT jwt = JWT.decode(token); + Date expiresAt = jwt.getExpiresAt(); + return expiresAt.getTime(); } } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml index 9d35845522..a345bfc4b0 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelGroupMapper.xml @@ -64,6 +64,9 @@ order by ${sort} + + order by panel_group.create_time desc + diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelTemplateMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelTemplateMapper.xml index 9782de83bd..01a45726fd 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelTemplateMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelTemplateMapper.xml @@ -83,6 +83,9 @@ order by ${sort} + + order by panel_template.create_time desc + diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java index b24a3973a3..85d7f46f6e 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.java @@ -1,12 +1,13 @@ package io.dataease.base.mapper.ext; +import io.dataease.dto.panel.PanelViewDto; import io.dataease.dto.panel.po.PanelViewPo; import java.util.List; public interface ExtPanelViewMapper { - List groups(String userId); + List groups(String userId); - List views(String userId); + List views(String userId); } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml index ff3d44bfa5..329278dc2c 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml @@ -2,7 +2,7 @@ - + @@ -12,7 +12,7 @@ SELECT auth.*, authCount.children_count AS children_count, IF (( authCount.children_count > 0 ), 0, 1 ) AS leaf - FROM (select get_grant_auths (#{modelType},#{createBy}) cids1) t1, - ( SELECT * FROM (select get_grant_auths (#{modelType},#{createBy}) cids2) t2 ,v_auth_model + FROM (select get_grant_auths (#{modelType},#{createBy}) c_auth_ids) t1, + ( SELECT * FROM (select GET_V_AUTH_MODEL_WITH_PARENT(get_grant_auths (#{modelType},#{createBy}),#{modelType}) c_auth_parent_ids) t2, + + (select GET_V_AUTH_MODEL_WITH_PARENT(#{id},#{modelType}) c_model_parent_ids) tmp, + + + (select GET_V_AUTH_MODEL_WITH_CHILDREN(#{id},#{modelType}) c_model_children_ids) tmc, + + + (select GET_V_AUTH_MODEL_WITH_PARENT ( (select GROUP_CONCAT(id) from + v_auth_model where model_type = #{modelType} and `name` like CONCAT('%', #{name},'%')) ,#{modelType}) c_model_parent_seartch_ids) tmsc, + + v_auth_model model_type = #{modelType} - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( cids2 ,#{modelType})) + and FIND_IN_SET(v_auth_model.id,c_auth_parent_ids) and v_auth_model.pid = #{pid} @@ -29,15 +41,14 @@ and v_auth_model.id = #{id} - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT(#{id},#{modelType})) + and FIND_IN_SET(v_auth_model.id,c_model_parent_ids) - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_CHILDREN(#{id},#{modelType})) + and FIND_IN_SET(v_auth_model.id,c_model_children_ids) - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( (select GROUP_CONCAT(id) from - v_auth_model where model_type = #{modelType} and `name` like CONCAT('%', #{name},'%')) ,#{modelType})) + and FIND_IN_SET(v_auth_model.id,c_model_parent_seartch_ids) @@ -51,11 +62,11 @@ count( 1 ) AS `children_count`, `authTemp`.`pid` AS `pid` FROM - ( SELECT * FROM (select get_grant_auths (#{modelType},#{createBy}) cids3) t3,v_auth_model + ( SELECT * FROM (select GET_V_AUTH_MODEL_WITH_PARENT(get_grant_auths (#{modelType},#{createBy}),#{modelType}) cids3) t3,v_auth_model model_type = #{modelType} - and FIND_IN_SET(v_auth_model.id,GET_V_AUTH_MODEL_WITH_PARENT ( cids3 ,#{modelType})) + and FIND_IN_SET(v_auth_model.id,cids3) ) authTemp @@ -65,7 +76,7 @@ auth.id = authCount.pid - (authCount.children_count>0 or FIND_IN_SET(auth.id,cids1) ) + (authCount.children_count>0 or FIND_IN_SET(auth.id,c_auth_ids) ) diff --git a/backend/src/main/java/io/dataease/controller/panel/server/StoreServer.java b/backend/src/main/java/io/dataease/controller/panel/server/StoreServer.java index 270c153980..24073a2b52 100644 --- a/backend/src/main/java/io/dataease/controller/panel/server/StoreServer.java +++ b/backend/src/main/java/io/dataease/controller/panel/server/StoreServer.java @@ -26,12 +26,7 @@ public class StoreServer implements StoreApi { } @Override - public void remove(String storeId) { - try { - Long id = Long.parseLong(storeId); - storeService.remove(id); - } catch (Exception e) { - storeService.removeByPanelId(storeId); - } + public void remove(String panelId) { + storeService.removeByPanelId(panelId); } } diff --git a/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java b/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java index 74ce250504..e2bdfbb171 100644 --- a/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java +++ b/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java @@ -3,6 +3,7 @@ package io.dataease.controller.panel.server; import io.dataease.base.domain.ChartView; import io.dataease.base.domain.ChartViewWithBLOBs; import io.dataease.commons.utils.AuthUtils; +import io.dataease.commons.utils.TreeUtils; import io.dataease.controller.panel.api.ViewApi; import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.base.ConditionEntity; @@ -10,6 +11,7 @@ import io.dataease.dto.panel.PanelViewDto; import io.dataease.dto.panel.po.PanelViewPo; import io.dataease.service.chart.ChartViewService; import io.dataease.service.panel.PanelViewService; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -35,10 +37,13 @@ public class ViewServer implements ViewApi { */ @Override public List treeWithAuth() { - List groups = panelViewService.groups(); - List views = panelViewService.views(); - List panelViewDtos = panelViewService.buildTree(groups, views); - return panelViewDtos; + List groups = panelViewService.groups(); + List views = panelViewService.views(); + if(CollectionUtils.isNotEmpty(groups)&&CollectionUtils.isNotEmpty(views)){ + groups.addAll(views); + } +// List panelViewDtos = panelViewService.buildTree(groups, views); + return TreeUtils.mergeTree(groups); } @Override diff --git a/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java b/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java index a8351668fd..cd7cbecd73 100644 --- a/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java +++ b/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java @@ -21,6 +21,7 @@ import io.dataease.dto.dataset.DataTableInfoDTO; import io.dataease.i18n.Translator; import io.dataease.service.dataset.DataSetGroupService; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -124,7 +125,11 @@ public class DatasourceService { dbTableDTO.setEnableCheck(false); List parents = dataSetGroupService.getParents(datasetTable.getSceneId()); StringBuilder stringBuilder = new StringBuilder(); - parents.forEach(ele -> stringBuilder.append(ele.getName()).append("/")); + parents.forEach(ele -> { + if (ObjectUtils.isNotEmpty(ele)) { + stringBuilder.append(ele.getName()).append("/"); + } + }); stringBuilder.append(datasetTable.getName()); dbTableDTO.setDatasetPath(stringBuilder.toString()); break; diff --git a/backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java b/backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java index 240064c6ad..c5a1c13c1e 100644 --- a/backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java +++ b/backend/src/main/java/io/dataease/dto/panel/PanelViewDto.java @@ -1,5 +1,6 @@ package io.dataease.dto.panel; +import io.dataease.commons.model.ITreeBase; import lombok.Data; import java.util.ArrayList; @@ -7,7 +8,7 @@ import java.util.List; import java.util.Optional; @Data -public class PanelViewDto { +public class PanelViewDto implements ITreeBase { private String id; diff --git a/backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java b/backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java index 661069b136..aa9b4fa013 100644 --- a/backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java +++ b/backend/src/main/java/io/dataease/dto/panel/po/PanelViewPo.java @@ -1,9 +1,10 @@ package io.dataease.dto.panel.po; +import io.dataease.commons.model.ITreeBase; import lombok.Data; @Data -public class PanelViewPo { +public class PanelViewPo{ private String id; diff --git a/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java b/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java index a090a92f77..bb91fe21ad 100644 --- a/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java +++ b/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java @@ -1,11 +1,9 @@ package io.dataease.plugins.config; import io.dataease.base.domain.MyPlugin; -import io.dataease.commons.utils.DeFileUtils; import io.dataease.commons.utils.LogUtil; import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.service.sys.PluginService; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; @@ -26,7 +24,7 @@ public class PluginRunner implements ApplicationRunner { @Override - public void run(ApplicationArguments args) throws Exception { + public void run(ApplicationArguments args) { // 执行加载插件逻辑 BaseGridRequest request = new BaseGridRequest(); List plugins = pluginService.query(request); @@ -45,17 +43,14 @@ public class PluginRunner implements ApplicationRunner { if (jarFile.exists()) { pluginService.loadJar(jarPath, plugin); }else { - LogUtil.error("插件错误"); + LogUtil.error("插件路径不存在 {} ", jarPath); } } catch (Exception e) { - e.printStackTrace(); + LogUtil.error(e); + //e.printStackTrace(); } }); } - private boolean isPluginJar(File file) { - String name = file.getName(); - return StringUtils.equals(DeFileUtils.getExtensionName(name), "jar"); - } } diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java index 04d99e6a0b..48755a72ca 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -82,6 +82,14 @@ public class DorisQueryProvider extends QueryProvider { } else { stringBuilder.append(f.getDataeaseName()); } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + stringBuilder.append("cast(").append(f.getDataeaseName()).append(" as decimal(20,0)) as ").append(f.getDataeaseName()); + } else if (f.getDeType() == 3) { + stringBuilder.append("cast(").append(f.getDataeaseName()).append(" as decimal(20,2)) as ").append(f.getDataeaseName()); + } else { + stringBuilder.append(f.getDataeaseName()); + } } else { if (f.getDeType() == 1) { stringBuilder.append("FROM_UNIXTIME(cast(").append(f.getDataeaseName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(f.getDataeaseName()); diff --git a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java index 9e78fe9863..095a8ecb5b 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -82,6 +82,14 @@ public class MysqlQueryProvider extends QueryProvider { } else { stringBuilder.append(f.getOriginName()); } + } else if (f.getDeExtractType() == 0) { + if (f.getDeType() == 2) { + stringBuilder.append("cast(").append(f.getOriginName()).append(" as decimal(20,0)) as ").append(f.getOriginName()); + } else if (f.getDeType() == 3) { + stringBuilder.append("cast(").append(f.getOriginName()).append(" as decimal(20,2)) as ").append(f.getOriginName()); + } else { + stringBuilder.append(f.getOriginName()); + } } else { if (f.getDeType() == 1) { stringBuilder.append("FROM_UNIXTIME(cast(").append(f.getOriginName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(f.getOriginName()); diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java index 0b57ac3677..7fccb515d7 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -813,6 +813,7 @@ public class DataSetTableService { if (cellTypeEnum.equals(CellType.STRING)) { if (cellType) { tableFiled.setFieldType("TEXT"); + tableFiled.setFieldSize(65533); } return cell.getStringCellValue(); } diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java index e99650b809..88659a2354 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java @@ -1,8 +1,6 @@ package io.dataease.service.dataset; -import io.dataease.base.domain.DatasetTableTask; -import io.dataease.base.domain.DatasetTableTaskExample; -import io.dataease.base.domain.DatasetTableTaskLog; +import io.dataease.base.domain.*; import io.dataease.base.mapper.DatasetTableTaskMapper; import io.dataease.commons.constants.JobStatus; import io.dataease.commons.constants.ScheduleType; @@ -38,7 +36,9 @@ public class DataSetTableTaskService { private DataSetTableService dataSetTableService; @Resource private ExtractDataService extractDataService; + public DatasetTableTask save(DataSetTaskRequest dataSetTaskRequest) throws Exception { + checkName(dataSetTaskRequest); DatasetTableTask datasetTableTask = dataSetTaskRequest.getDatasetTableTask(); dataSetTableService.saveIncrementalConfig(dataSetTaskRequest.getDatasetTableIncrementalConfig()); @@ -60,8 +60,8 @@ public class DataSetTableTaskService { datasetTableTask.setId(UUID.randomUUID().toString()); datasetTableTask.setCreateTime(System.currentTimeMillis()); // SIMPLE 类型,提前占位 - if(datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())){ - if(extractDataService.updateSyncStatus(dataSetTableService.get(datasetTableTask.getTableId()))){ + if (datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())) { + if (extractDataService.updateSyncStatus(dataSetTableService.get(datasetTableTask.getTableId()))) { throw new Exception(Translator.get("i18n_sync_job_exists")); }else { //write log @@ -119,4 +119,22 @@ public class DataSetTableTaskService { datasetTableTaskExample.setOrderByClause("create_time desc,name asc"); return datasetTableTaskMapper.selectByExample(datasetTableTaskExample); } + + private void checkName(DataSetTaskRequest dataSetTaskRequest) { + DatasetTableTaskExample datasetTableTaskExample = new DatasetTableTaskExample(); + DatasetTableTaskExample.Criteria criteria = datasetTableTaskExample.createCriteria(); + if (StringUtils.isNotEmpty(dataSetTaskRequest.getDatasetTableTask().getId())) { + criteria.andIdNotEqualTo(dataSetTaskRequest.getDatasetTableTask().getId()); + } + if (StringUtils.isNotEmpty(dataSetTaskRequest.getDatasetTableTask().getTableId())) { + criteria.andTableIdEqualTo(dataSetTaskRequest.getDatasetTableTask().getTableId()); + } + if (StringUtils.isNotEmpty(dataSetTaskRequest.getDatasetTableTask().getName())) { + criteria.andNameEqualTo(dataSetTaskRequest.getDatasetTableTask().getName()); + } + List list = datasetTableTaskMapper.selectByExample(datasetTableTaskExample); + if (list.size() > 0) { + throw new RuntimeException(Translator.get("i18n_task_name_repeat")); + } + } } diff --git a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java index 7118982df8..ba8424ea44 100644 --- a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -689,6 +689,7 @@ public class ExtractDataService { String tmp_code = code.replace("alterColumnTypeCode", needToChangeColumnType).replace("Column_Fields", String.join(",", datasetTableFields.stream().map(DatasetTableField::getOriginName).collect(Collectors.toList()))); if(isExcel){ tmp_code = tmp_code.replace("handleExcelIntColumn", handleExcelIntColumn); + tmp_code = tmp_code.replace("handleExcelWraps", handleExcelWraps); }else { tmp_code = tmp_code.replace("handleExcelIntColumn", ""); } @@ -746,6 +747,14 @@ public class ExtractDataService { " }catch (Exception e){}\n" + " }"; + private static String handleExcelWraps = " \n" + + " if(tmp != null ){\n" + + " tmp = tmp.trim();\n" + + " tmp = tmp.replaceAll(\"\\r\",\" \");\n" + + " tmp = tmp.replaceAll(\"\\n\",\" \");\n" + + " get(Fields.Out, filed).setValue(r, tmp);\n" + + " }"; + private static String code = "import org.pentaho.di.core.row.ValueMetaInterface;\n" + "import java.util.List;\n" + "import java.io.File;\n" + @@ -775,6 +784,7 @@ public class ExtractDataService { " List fileds = Arrays.asList(\"Column_Fields\".split(\",\"));\n" + " for (String filed : fileds) {\n" + " String tmp = get(Fields.In, filed).getString(r);\n" + + "handleExcelWraps \n" + "alterColumnTypeCode \n" + "handleExcelIntColumn \n" + " str = str + tmp;\n" + diff --git a/backend/src/main/java/io/dataease/service/panel/PanelViewService.java b/backend/src/main/java/io/dataease/service/panel/PanelViewService.java index 84992e6a21..7520493270 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelViewService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelViewService.java @@ -26,11 +26,11 @@ public class PanelViewService { private final static String SCENE_TYPE = "scene"; - public List groups(){ + public List groups(){ return extPanelViewMapper.groups(String.valueOf(AuthUtils.getUser().getUserId())); } - public List views(){ + public List views(){ return extPanelViewMapper.views(String.valueOf(AuthUtils.getUser().getUserId())); } diff --git a/backend/src/main/java/io/dataease/service/panel/StoreService.java b/backend/src/main/java/io/dataease/service/panel/StoreService.java index 9d3dbd3bae..de25085f3c 100644 --- a/backend/src/main/java/io/dataease/service/panel/StoreService.java +++ b/backend/src/main/java/io/dataease/service/panel/StoreService.java @@ -34,14 +34,15 @@ public class StoreService { } public void removeByPanelId(String panelId) { + Long userId = AuthUtils.getUser().getUserId(); PanelStoreExample panelStoreExample = new PanelStoreExample(); - panelStoreExample.createCriteria().andPanelGroupIdEqualTo(panelId); + panelStoreExample.createCriteria().andPanelGroupIdEqualTo(panelId).andUserIdEqualTo(userId); panelStoreMapper.deleteByExample(panelStoreExample); } - public void remove(Long storeId) { + /*public void remove(Long storeId) { panelStoreMapper.deleteByPrimaryKey(storeId); - } + }*/ /** * 按照当前用户ID查询收藏仪表板 diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml index 82848300e9..9491e0fa0d 100644 --- a/backend/src/main/resources/ehcache/ehcache.xml +++ b/backend/src/main/resources/ehcache/ehcache.xml @@ -29,7 +29,7 @@ - \ No newline at end of file diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index b2334f10f8..f4fff1974d 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -241,9 +241,11 @@ i18n_union_field_exists=The same field can't in two dataset i18n_cron_time_error=Start time can't greater then end time i18n_auth_source_be_canceled=This Auth Resource Already Be Canceled i18n_username_exists=ID is already exists -i18n_ds_name_exists=Datasource name exists +i18n_ds_name_exists=Datasource name used i18n_sync_job_exists=There is already a synchronization task running, please try again later i18n_datasource_check_fail=Invalid,please check config i18n_not_find_user=Can not find user. i18n_sql_not_empty=SQL can not be empty. -i18n_datasource_not_allow_delete_msg= datasets are using this data source and cannot be deleted \ No newline at end of file +i18n_datasource_not_allow_delete_msg= datasets are using this data source and cannot be deleted +i18n_task_name_repeat=Name is used in same data set +i18n_id_or_pwd_error=Invalid ID or password diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index ae5e27a5e6..6374cc3094 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -243,9 +243,11 @@ i18n_union_field_exists=两个数据集之间关联不能出现多次相同字 i18n_cron_time_error=开始时间不能大于结束时间 i18n_auth_source_be_canceled=当前资源授权权限已经被取消 i18n_username_exists=用户 ID 已存在 -i18n_ds_name_exists=数据源名称已存在 +i18n_ds_name_exists=数据源名称已被使用 i18n_sync_job_exists=已经有同步任务在运行,稍后重试 i18n_datasource_check_fail=校验失败,请检查配置信息 i18n_not_find_user=未找到用户 i18n_sql_not_empty=SQL 不能为空 -i18n_datasource_not_allow_delete_msg= 个数据集正在使用此数据源,无法删除 \ No newline at end of file +i18n_datasource_not_allow_delete_msg= 个数据集正在使用此数据源,无法删除 +i18n_task_name_repeat=同一数据集下任务名称已被使用 +i18n_id_or_pwd_error=无效的ID或密码 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 6e9048d929..db3c5a3b6e 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -243,9 +243,11 @@ i18n_union_field_exists=兩個數據集之間關聯不能出現多次相同字 i18n_cron_time_error=開始時間不能大於結束時間 i18n_auth_source_be_canceled=當前資源授權權限已經被取消 i18n_username_exists=用戶ID已存在 -i18n_ds_name_exists=數據源名稱已存在 +i18n_ds_name_exists=數據源名稱已被使用 i18n_sync_job_exists=已經有同步任務在運行,稍後重試 i18n_datasource_check_fail=校驗失敗,請檢查配置信息 i18n_not_find_user=未找到用戶 i18n_sql_not_empty=SQL 不能為空 -i18n_datasource_not_allow_delete_msg= 個數據集正在使用此數據源,無法刪除 \ No newline at end of file +i18n_datasource_not_allow_delete_msg= 個數據集正在使用此數據源,無法刪除 +i18n_task_name_repeat=同一數據集下任務名稱已被使用 +i18n_id_or_pwd_error=無效的ID或密碼 diff --git a/frontend/package.json b/frontend/package.json index 284ab8cb6b..abaab1bdb3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -38,6 +38,7 @@ "vue-axios": "3.2.4", "vue-clipboard2": "0.3.1", "vue-codemirror": "^4.0.6", + "vue-fullscreen": "^2.5.1", "vue-i18n": "7.3.2", "vue-router": "3.0.6", "vue-uuid": "2.0.2", diff --git a/frontend/src/api/panel/panel.js b/frontend/src/api/panel/panel.js index 4f78878e39..a4b0d4744d 100644 --- a/frontend/src/api/panel/panel.js +++ b/frontend/src/api/panel/panel.js @@ -30,7 +30,6 @@ export function querySubjectWithGroup(data) { return request({ url: '/panel/subject/querySubjectWithGroup', method: 'post', - loading: true, data }) } diff --git a/frontend/src/api/panel/view.js b/frontend/src/api/panel/view.js index 5f1dd33737..1c3f9c12c6 100644 --- a/frontend/src/api/panel/view.js +++ b/frontend/src/api/panel/view.js @@ -4,7 +4,6 @@ export function tree(data) { return request({ url: '/api/panelView/tree', method: 'post', - loading: true, data }) } diff --git a/frontend/src/api/system/template.js b/frontend/src/api/system/template.js index 11c99d2f7c..5b83b15bcb 100644 --- a/frontend/src/api/system/template.js +++ b/frontend/src/api/system/template.js @@ -18,7 +18,6 @@ export function showTemplateList(data) { return request({ url: '/template/templateList', data: data, - loading: true, method: 'post' }) } @@ -26,7 +25,6 @@ export function showTemplateList(data) { export function findOne(id) { return request({ url: '/template/findOne/' + id, - loading: true, method: 'get' }) } diff --git a/frontend/src/components/canvas/components/AttrList.vue b/frontend/src/components/canvas/components/AttrList.vue index e0c2f6c041..5f7a7cd829 100644 --- a/frontend/src/components/canvas/components/AttrList.vue +++ b/frontend/src/components/canvas/components/AttrList.vue @@ -108,7 +108,7 @@ export default { }, computed: { styleKeys() { - console.log(this.$store.state.curComponent.style) + // console.log(this.$store.state.curComponent.style) return this.$store.state.curComponent ? Object.keys(this.$store.state.curComponent.style) : [] }, curComponent() { diff --git a/frontend/src/components/canvas/components/Editor/PreviewFullScreen.vue b/frontend/src/components/canvas/components/Editor/PreviewFullScreen.vue index 2f72f7a33d..de99c92323 100644 --- a/frontend/src/components/canvas/components/Editor/PreviewFullScreen.vue +++ b/frontend/src/components/canvas/components/Editor/PreviewFullScreen.vue @@ -1,11 +1,8 @@ @@ -16,10 +13,21 @@ import bus from '@/utils/bus' export default { components: { Preview }, + data() { + return { + fullscreen: false + } + }, + mounted() { + this.fullscreen = false + this.$nextTick(() => (this.fullscreen = true)) + }, methods: { - close() { - bus.$emit('previewFullScreenClose') + fullscreenChange(fullscreen) { + if (!fullscreen) { + bus.$emit('previewFullScreenClose') + } } } } diff --git a/frontend/src/components/canvas/components/Editor/index.vue b/frontend/src/components/canvas/components/Editor/index.vue index 1f1024e2d3..7c5ef1d56c 100644 --- a/frontend/src/components/canvas/components/Editor/index.vue +++ b/frontend/src/components/canvas/components/Editor/index.vue @@ -152,7 +152,7 @@ export default { width: this.format(this.canvasStyleData.width, this.scaleWidth) + 'px', height: this.format(this.canvasStyleData.height, this.scaleHeight) + 'px' } - console.log('customStyle=>' + JSON.stringify(style)) + // console.log('customStyle=>' + JSON.stringify(style)) if (this.canvasStyleData.openCommonStyle) { if (this.canvasStyleData.panel.backgroundType === 'image' && this.canvasStyleData.panel.imageUrl) { @@ -160,7 +160,7 @@ export default { background: `url(${this.canvasStyleData.panel.imageUrl}) no-repeat`, ...style } - } else { + } else if (this.canvasStyleData.panel.backgroundType === 'color') { style = { background: this.canvasStyleData.panel.color, ...style @@ -401,7 +401,7 @@ export default { }, filterValueChange(value) { - console.log('emit:' + value) + // console.log('emit:' + value) }, setConditionValue(obj) { @@ -432,7 +432,7 @@ export default { this.executeSearch() }, executeSearch() { - console.log('当前查询条件是: ' + JSON.stringify(this.conditions)) + // console.log('当前查询条件是: ' + JSON.stringify(this.conditions)) }, format(value, scale) { // 自适应画布区域 返回原值 diff --git a/frontend/src/components/canvas/components/Toolbar.vue b/frontend/src/components/canvas/components/Toolbar.vue index 306fd10128..4679c963ba 100644 --- a/frontend/src/components/canvas/components/Toolbar.vue +++ b/frontend/src/components/canvas/components/Toolbar.vue @@ -43,7 +43,7 @@ - + diff --git a/frontend/src/components/widget/DeWidget/DeSelect.vue b/frontend/src/components/widget/DeWidget/DeSelect.vue index b3b131cdf9..267f116da4 100644 --- a/frontend/src/components/widget/DeWidget/DeSelect.vue +++ b/frontend/src/components/widget/DeWidget/DeSelect.vue @@ -69,13 +69,17 @@ export default { changeValue(value) { this.setCondition() // this.inDraw && this.$emit('set-condition-value', { component: this.element, value: [value], operator: this.operator }) + this.showNumber = false this.$nextTick(() => { + if (!this.$refs.deSelect.$refs.tags || !this.options.attrs.multiple) { + return + } const kids = this.$refs.deSelect.$refs.tags.children[0].children let contentWidth = 0 kids.forEach(kid => { contentWidth += kid.offsetWidth }) - this.showNumber = contentWidth > (this.$refs.deSelect.$refs.tags.clientWidth * 0.7) + this.showNumber = contentWidth > (this.$refs.deSelect.$refs.tags.clientWidth * 0.9) }) }, diff --git a/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js b/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js index c14bfd0801..f09e501732 100644 --- a/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/ButtonSureServiceImpl.js @@ -10,7 +10,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js b/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js index 96326c80ca..71069364de 100644 --- a/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/NumberSelectServiceImpl.js @@ -26,7 +26,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js index c3de32cb38..763c1b54e3 100644 --- a/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextInputServiceImpl.js @@ -22,7 +22,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js b/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js index 48f8f81b53..61d378baea 100644 --- a/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TextSelectServiceImpl.js @@ -27,7 +27,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js index 9fe15ef3f0..5c6f574448 100644 --- a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js @@ -24,7 +24,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js index b2a0385052..1e48393ed9 100644 --- a/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeDateServiceImpl.js @@ -22,7 +22,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js index 928eacae3e..beea3d0b01 100644 --- a/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeMonthServiceImpl.js @@ -22,7 +22,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/TimeQuarterServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeQuarterServiceImpl.js index afa531ed46..d03dc41d49 100644 --- a/frontend/src/components/widget/serviceImpl/TimeQuarterServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeQuarterServiceImpl.js @@ -20,7 +20,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js index 042a9a945a..3eb7836690 100644 --- a/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js +++ b/frontend/src/components/widget/serviceImpl/TimeYearServiceImpl.js @@ -22,7 +22,7 @@ const drawPanel = { type: 'custom', style: { width: 300, - height: 35, + height: 47, fontSize: 14, fontWeight: 500, lineHeight: '', diff --git a/frontend/src/icons/svg/lock_closed.svg b/frontend/src/icons/svg/lock_closed.svg index dca1104b21..547cdcae79 100644 --- a/frontend/src/icons/svg/lock_closed.svg +++ b/frontend/src/icons/svg/lock_closed.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/icons/svg/lock_open.svg b/frontend/src/icons/svg/lock_open.svg index ba982c4e48..7419287f2f 100644 --- a/frontend/src/icons/svg/lock_open.svg +++ b/frontend/src/icons/svg/lock_open.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index be2fd0c6f7..dc2027d4c3 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -283,7 +283,13 @@ export default { }, datasource: 'Datasource', char_can_not_more_50: 'Can not more 50 char', - share_success: 'Share Success' + share_success: 'Share Success', + input_id: 'Please input ID', + input_pwd: 'Please input password', + message_box: { + alert: 'Alert', + confirm: 'Confirm' + } }, documentation: { documentation: 'Documentation', @@ -821,7 +827,8 @@ export default { edit_field: 'Edit Field', preview_100_data: 'Show 100 lines data', invalid_table_check: 'Please sync data first.', - parse_error: 'Parse Error' + parse_error: 'Parse Error', + origin_field_type: 'Origin Type' }, datasource: { datasource: 'Data Source', @@ -899,6 +906,8 @@ export default { save_to_panel: 'Save to template', export_to_panel: 'Export to template', preview: 'Preview', + fullscreen_preview: 'Fullscreen Preview', + new_tab_preview: 'New Tab Preview', select_panel_from_left: 'Please select Dashboard from left', template_nale: 'Template name', template: 'Template', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 1ea23167ed..128ede0771 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -283,7 +283,13 @@ export default { }, datasource: '數據源', char_can_not_more_50: '不能超過50字符', - share_success: '分享成功' + share_success: '分享成功', + input_id: '請輸入ID', + input_pwd: '請輸入密碼', + message_box: { + alert: '警告', + confirm: '確認' + } }, documentation: { documentation: '文檔', @@ -659,7 +665,7 @@ export default { rose_radius: '園角', view_name: '視圖名稱', name_can_not_empty: '名稱不能為空', - template_can_not_empty: '请选择仪表盘', + template_can_not_empty: '请选择仪表板', custom_count: '記錄數', table_title_fontsize: '表頭字體大小', table_item_fontsize: '表格字體大小', @@ -821,7 +827,8 @@ export default { edit_field: '編輯自斷', preview_100_data: '顯示前100行數據', invalid_table_check: '非直連數據集請先完成數據同步', - parse_error: '解析錯誤' + parse_error: '解析錯誤', + origin_field_type: '原始類型' }, datasource: { datasource: '數據源', @@ -899,6 +906,8 @@ export default { save_to_panel: '保存為模板', export_to_panel: '導出為模板', preview: '預覽', + fullscreen_preview: '全屏预览', + new_tab_preview: '新Tab页预览', select_panel_from_left: '請從左側選擇儀表板', template_nale: '模板名稱', template: '模板', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index c5f4d753b4..c1791c934c 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -283,7 +283,13 @@ export default { }, datasource: '数据源', char_can_not_more_50: '不能超过50字符', - share_success: '分享成功' + share_success: '分享成功', + input_id: '请输入ID', + input_pwd: '请输入密码', + message_box: { + alert: '警告', + confirm: '确认' + } }, documentation: { documentation: '文档', @@ -659,7 +665,7 @@ export default { rose_radius: '圆角', view_name: '视图名称', name_can_not_empty: '名称不能为空', - template_can_not_empty: '请选择仪表盘', + template_can_not_empty: '请选择仪表版', custom_count: '记录数', table_title_fontsize: '表头字体大小', table_item_fontsize: '表格字体大小', @@ -821,7 +827,8 @@ export default { edit_field: '编辑字段', preview_100_data: '显示前100行数据', invalid_table_check: '非直连数据集请先完成数据同步', - parse_error: '解析错误' + parse_error: '解析错误', + origin_field_type: '原始类型' }, datasource: { datasource: '数据源', @@ -899,6 +906,8 @@ export default { save_to_panel: '保存为模板', export_to_panel: '导出为模板', preview: '预览', + fullscreen_preview: '全屏预览', + new_tab_preview: '新Tab页预览', select_panel_from_left: '请从左侧选择仪表板', template_nale: '模板名称', template: '模板', diff --git a/frontend/src/main.js b/frontend/src/main.js index 5b5b1f4277..2bef70b47d 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -37,6 +37,10 @@ Vue.use(UmyUi) import vcolorpicker from 'vcolorpicker' Vue.use(vcolorpicker) +// 全屏插件 +import fullscreen from 'vue-fullscreen' +Vue.use(fullscreen) + /** * If you don't want to use mock-server * you want to use MockJs for mock api diff --git a/frontend/src/permission.js b/frontend/src/permission.js index 2fae911066..dda02c2b86 100644 --- a/frontend/src/permission.js +++ b/frontend/src/permission.js @@ -124,9 +124,9 @@ const hasCurrentRouter = (locations, routers, index) => { // 根据权限过滤菜单 const filterRouter = routers => { const user_permissions = store.getters.permissions - if (!user_permissions || user_permissions.length === 0) { - return routers - } + // if (!user_permissions || user_permissions.length === 0) { + // return routers + // } const tempResults = routers.filter(router => hasPermission(router, user_permissions)) // 如果是一级菜单(目录) 没有字菜单 那就移除 return tempResults.filter(item => { diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js index 1133e95334..e3e39b01a8 100644 --- a/frontend/src/utils/request.js +++ b/frontend/src/utils/request.js @@ -57,7 +57,7 @@ const checkAuth = response => { if (response.headers['authentication-status'] === 'login_expire') { const message = i18n.t('login.expires') - store.dispatch('user/setLoginMsg', message) + // store.dispatch('user/setLoginMsg', message) $alert(message, () => { store.dispatch('user/logout').then(() => { location.reload() @@ -65,7 +65,7 @@ const checkAuth = response => { }) } - if (response.headers['authentication-status'] === 'invalid' || response.status === 401) { + if (response.headers['authentication-status'] === 'invalid') { const message = i18n.t('login.tokenError') $alert(message, () => { store.dispatch('user/logout').then(() => { @@ -85,59 +85,6 @@ const checkAuth = response => { } } -const checkPermission = response => { - // 请根据实际需求修改 - if (response.status === 404) { - location.href = '/404' - } - if (response.status === 401) { - location.href = '/401' - } -} - -// response interceptor -/** -service.interceptors.response.use( - response => { - const res = response.data - - // if the custom code is not 20000, it is judged as an error. - if (res.code !== 20000) { - Message({ - message: res.message || 'Error', - type: 'error', - duration: 5 * 1000 - }) - - // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; - if (res.code === 50008 || res.code === 50012 || res.code === 50014) { - // to re-login - MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', { - confirmButtonText: 'Re-Login', - cancelButtonText: 'Cancel', - type: 'warning' - }).then(() => { - store.dispatch('user/resetToken').then(() => { - location.reload() - }) - }) - } - return Promise.reject(new Error(res.message || 'Error')) - } else { - return res - } - }, - error => { - console.log('err' + error) // for debug - Message({ - message: error.message, - type: 'error', - duration: 5 * 1000 - }) - return Promise.reject(error) - } -) -*/ // 请根据实际需求修改 service.interceptors.response.use(response => { response.config.loading && tryHideLoading(store.getters.currentPath) @@ -148,12 +95,12 @@ service.interceptors.response.use(response => { let msg if (error.response) { checkAuth(error.response) - checkPermission(error.response) + // checkPermission(error.response) msg = error.response.data.message || error.response.data } else { msg = error.message } - !error.config.hideMsg && $error(msg) + !error.config.hideMsg && (!error.response.headers['authentication-status']) && $error(msg) return Promise.reject(error) }) export default service diff --git a/frontend/src/views/chart/chart/chart.js b/frontend/src/views/chart/chart/chart.js index 5710602587..f4a9a12c7f 100644 --- a/frontend/src/views/chart/chart/chart.js +++ b/frontend/src/views/chart/chart/chart.js @@ -104,9 +104,9 @@ export const BASE_BAR = { fontWeight: 'normal' } }, - // grid: { - // containLabel: true - // }, + grid: { + containLabel: true + }, tooltip: {}, legend: { show: true, @@ -136,9 +136,9 @@ export const HORIZONTAL_BAR = { fontWeight: 'normal' } }, - // grid: { - // containLabel: true - // }, + grid: { + containLabel: true + }, tooltip: {}, legend: { show: true, @@ -169,9 +169,9 @@ export const BASE_LINE = { fontWeight: 'normal' } }, - // grid: { - // containLabel: true - // }, + grid: { + containLabel: true + }, tooltip: {}, legend: { show: true, @@ -203,9 +203,9 @@ export const BASE_PIE = { fontWeight: 'normal' } }, - // grid: { - // containLabel: true - // }, + grid: { + containLabel: true + }, tooltip: {}, legend: { show: true, @@ -239,9 +239,9 @@ export const BASE_FUNNEL = { fontWeight: 'normal' } }, - // grid: { - // containLabel: true - // }, + grid: { + containLabel: true + }, tooltip: { trigger: 'item' }, @@ -298,9 +298,9 @@ export const BASE_RADAR = { fontWeight: 'normal' } }, - // grid: { - // containLabel: true - // }, + grid: { + containLabel: true + }, tooltip: {}, legend: { show: true, @@ -336,9 +336,9 @@ export const BASE_GAUGE = { fontWeight: 'normal' } }, - // grid: { - // containLabel: true - // }, + grid: { + containLabel: true + }, tooltip: {}, legend: { show: true, diff --git a/frontend/src/views/chart/group/Group.vue b/frontend/src/views/chart/group/Group.vue index 06d17d430f..d88ab7fb66 100644 --- a/frontend/src/views/chart/group/Group.vue +++ b/frontend/src/views/chart/group/Group.vue @@ -51,7 +51,7 @@ - {{ data.name }} + {{ data.name }} @@ -114,8 +114,8 @@ - - + + {{ currGroup.name }} @@ -153,7 +153,7 @@ - {{ data.name }} + {{ data.name }} @@ -680,4 +680,16 @@ export default { .form-item>>>.el-form-item__label{ font-size: 12px; } + + .scene-title{ + width: 100%; + display: flex; + } + .scene-title-name{ + width: 100%; + overflow: hidden; + display: inline-block; + white-space: nowrap; + text-overflow: ellipsis; + } diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 6b49d78479..144bcb4c12 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -38,7 +38,7 @@ @start="start1" > - + @@ -59,7 +59,7 @@ @start="start1" > - + @@ -101,49 +101,75 @@ @change="save(true,'chart')" >
- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - + + + + + + + + + + + + + + +
@@ -236,8 +262,8 @@ -
-
+
+
{{ $t('panel.error_data') }}
{{ httpRequest.msg }}
@@ -941,7 +967,10 @@ export default { background-color: white; display: block; word-break: break-all; - white-space: normal; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } .item-on-move { @@ -952,6 +981,10 @@ export default { color: #606266; /*background-color: rgba(35,46,64,.05);*/ background-color: white; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } .item + .item { @@ -1070,4 +1103,12 @@ export default { justify-content: space-between; align-items: center; } + .chart-error-class{ + text-align: center; + height: calc(100% - 84px); + display: flex; + align-items: center; + justify-content: center; + background-color: #ece7e7; + } diff --git a/frontend/src/views/dataset/common/DatasetCustomField.vue b/frontend/src/views/dataset/common/DatasetCustomField.vue index ce009078e9..1d5b174fa5 100644 --- a/frontend/src/views/dataset/common/DatasetCustomField.vue +++ b/frontend/src/views/dataset/common/DatasetCustomField.vue @@ -1,7 +1,7 @@