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 a03fad7d85..e95563f748 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java @@ -24,6 +24,7 @@ import io.dataease.controller.sys.request.SysUserStateRequest; import io.dataease.controller.sys.response.RoleUserItem; import io.dataease.controller.sys.response.SysUserGridResponse; import io.dataease.plugins.common.base.domain.SysUser; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.service.sys.SysRoleService; import io.dataease.service.sys.SysUserService; import io.swagger.annotations.Api; @@ -66,7 +67,7 @@ public class SysUserController { @ApiImplicitParam(name = "request", value = "查询条件", required = true) }) public Pager> userGrid(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody KeyGridRequest request) { + @RequestBody KeyGridRequest request) { Page page = PageHelper.startPage(goPage, pageSize, true); List users = sysUserService.query(request); users.forEach(user -> { @@ -87,9 +88,9 @@ public class SysUserController { @RequiresPermissions("user:add") @PostMapping("/create") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.CREATE, - sourcetype = SysLogConstants.SOURCE_TYPE.USER, - value = "userId" + operatetype = SysLogConstants.OPERATE_TYPE.CREATE, + sourcetype = SysLogConstants.SOURCE_TYPE.USER, + value = "userId" ) public void create(@RequestBody SysUserCreateRequest request) { sysUserService.save(request); @@ -99,9 +100,9 @@ public class SysUserController { @RequiresPermissions("user:edit") @PostMapping("/update") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, - sourcetype = SysLogConstants.SOURCE_TYPE.USER, - value = "userId" + operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, + sourcetype = SysLogConstants.SOURCE_TYPE.USER, + value = "userId" ) public void update(@RequestBody SysUserCreateRequest request) { sysUserService.update(request); @@ -112,8 +113,8 @@ public class SysUserController { @PostMapping("/delete/{userId}") @ApiImplicitParam(paramType = "path", value = "用户ID", name = "userId", required = true, dataType = "Integer") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.DELETE, - sourcetype = SysLogConstants.SOURCE_TYPE.USER + operatetype = SysLogConstants.OPERATE_TYPE.DELETE, + sourcetype = SysLogConstants.SOURCE_TYPE.USER ) public void delete(@PathVariable("userId") Long userId) { sysUserService.delete(userId); @@ -124,9 +125,9 @@ public class SysUserController { @RequiresRoles("1") @PostMapping("/updateStatus") @DeLog( - operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, - sourcetype = SysLogConstants.SOURCE_TYPE.USER, - value = "userId" + operatetype = SysLogConstants.OPERATE_TYPE.MODIFY, + sourcetype = SysLogConstants.SOURCE_TYPE.USER, + value = "userId" ) public void updateStatus(@RequestBody SysUserStateRequest request) { sysUserService.updateStatus(request); @@ -201,7 +202,7 @@ public class SysUserController { @ApiImplicitParam(name = "request", value = "查询条件", required = true) }) public Pager> roleGrid(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody BaseGridRequest request) { + @RequestBody BaseGridRequest request) { Page page = PageHelper.startPage(goPage, pageSize, true); Pager> listPager = PageUtils.setPageInfo(page, sysRoleService.query(request)); return listPager; @@ -226,4 +227,9 @@ public class SysUserController { authUserService.unlockAccount(username, one.getFrom()); } + @PostMapping("/assistInfo/{userId}") + public SysUserAssist assistInfo(@PathVariable("userId") Long userId) { + return sysUserService.assistInfo(userId); + } + } diff --git a/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java b/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java index 69b63ee655..5ecc781fc7 100644 --- a/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java +++ b/backend/src/main/java/io/dataease/controller/sys/request/SysUserCreateRequest.java @@ -1,6 +1,7 @@ package io.dataease.controller.sys.request; import io.dataease.plugins.common.base.domain.SysUser; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -14,4 +15,7 @@ public class SysUserCreateRequest extends SysUser { @ApiModelProperty(value = "角色ID集合", required = true, position = 7) private List roleIds; + @ApiModelProperty(value = "辅助信息", required = false, position = 8) + private SysUserAssist sysUserAssist; + } diff --git a/backend/src/main/java/io/dataease/ext/ExtSysUserAssistMapper.java b/backend/src/main/java/io/dataease/ext/ExtSysUserAssistMapper.java deleted file mode 100644 index ad6d042a0b..0000000000 --- a/backend/src/main/java/io/dataease/ext/ExtSysUserAssistMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package io.dataease.ext; - -import io.dataease.plugins.common.base.domain.SysUserAssist; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -@Mapper -public interface ExtSysUserAssistMapper { - - @Insert("insert into sys_user_assist values(#{po.userId}, #{po.needFirstNoti})") - void save(@Param("po") SysUserAssist po); - - @Select("select * from sys_user_assist where user_id = #{userId}") - SysUserAssist query(@Param("userId") Long userId); -} diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index 2833af3d71..ce61fc0395 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -14,6 +14,7 @@ import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.job.sechedule.ScheduleManager; import io.dataease.job.sechedule.strategy.TaskHandler; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.common.entity.GlobalTaskEntity; import io.dataease.plugins.common.entity.GlobalTaskInstance; import io.dataease.plugins.config.SpringContextUtil; @@ -28,6 +29,7 @@ import io.dataease.plugins.xpack.lark.service.LarkXpackService; import io.dataease.plugins.xpack.wecom.dto.entity.WecomMsgResult; import io.dataease.plugins.xpack.wecom.service.WecomXpackService; import io.dataease.service.chart.ViewExportExcel; +import io.dataease.service.sys.SysUserService; import io.dataease.service.system.EmailService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -154,6 +156,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class); + SysUserService sysUserService = SpringContextUtil.getBean(SysUserService.class); try { XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); if (ObjectUtils.isEmpty(taskForm) || CronUtils.taskExpire(taskForm.getEndTime())) { @@ -215,17 +218,24 @@ public class EmailTaskHandler extends TaskHandler implements Job { for (int i = 0; i < channels.size(); i++) { String channel = channels.get(i); switch (channel) { - case "email" : + case "email": if (StringUtils.isNotBlank(recipients)) - emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); + emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); break; - case "wecom" : + case "wecom": if (SpringContextUtil.getBean(AuthUserService.class).supportWecom()) { - - List wecomUsers = reciLists.stream().filter(reci -> { + List wecomUsers = new ArrayList<>(); + for (int j = 0; j < reciLists.size(); j++) { + String reci = reciLists.get(j); SysUserEntity userBySub = userService.getUserBySub(reci, 4); - return ObjectUtils.isNotEmpty(userBySub); - }).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(userBySub)) continue; + Long userId = userBySub.getUserId(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isEmpty(sysUserAssist) || StringUtils.isBlank(sysUserAssist.getLarkId())) + continue; + wecomUsers.add(sysUserAssist.getLarkId()); + } + if (CollectionUtils.isNotEmpty(wecomUsers)) { WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); WecomMsgResult wecomMsgResult = wecomXpackService.pushOaMsg(wecomUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); @@ -236,12 +246,20 @@ public class EmailTaskHandler extends TaskHandler implements Job { } break; - case "dingtalk" : + case "dingtalk": if (SpringContextUtil.getBean(AuthUserService.class).supportDingtalk()) { - List dingTalkUsers = reciLists.stream().filter(reci -> { + List dingTalkUsers = new ArrayList<>(); + for (int j = 0; j < reciLists.size(); j++) { + String reci = reciLists.get(j); SysUserEntity userBySub = userService.getUserBySub(reci, 5); - return ObjectUtils.isNotEmpty(userBySub); - }).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(userBySub)) continue; + Long userId = userBySub.getUserId(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isEmpty(sysUserAssist) || StringUtils.isBlank(sysUserAssist.getLarkId())) + continue; + dingTalkUsers.add(sysUserAssist.getLarkId()); + } + if (CollectionUtils.isNotEmpty(dingTalkUsers)) { DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); DingtalkMsgResult dingtalkMsgResult = dingtalkXpackService.pushOaMsg(dingTalkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); @@ -252,12 +270,20 @@ public class EmailTaskHandler extends TaskHandler implements Job { } break; - case "lark" : + case "lark": if (SpringContextUtil.getBean(AuthUserService.class).supportLark()) { - List larkUsers = reciLists.stream().filter(reci -> { + List larkUsers = new ArrayList<>(); + for (int j = 0; j < reciLists.size(); j++) { + String reci = reciLists.get(j); SysUserEntity userBySub = userService.getUserBySub(reci, 6); - return ObjectUtils.isNotEmpty(userBySub); - }).collect(Collectors.toList()); + if (ObjectUtils.isEmpty(userBySub)) continue; + Long userId = userBySub.getUserId(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isEmpty(sysUserAssist) || StringUtils.isBlank(sysUserAssist.getLarkId())) + continue; + larkUsers.add(sysUserAssist.getLarkId()); + } + if (CollectionUtils.isNotEmpty(larkUsers)) { LarkXpackService larkXpackService = SpringContextUtil.getBean(LarkXpackService.class); LarkMsgResult larkMsgResult = larkXpackService.pushOaMsg(larkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java index 101bfd973a..3f428d71aa 100644 --- a/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendDingtalk.java @@ -1,13 +1,17 @@ package io.dataease.service.message.service.strategy; -import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.service.AuthUserService; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.dingtalk.service.DingtalkXpackService; import io.dataease.service.message.service.SendService; +import io.dataease.service.sys.SysUserService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -17,12 +21,14 @@ public class SendDingtalk implements SendService { @Autowired private AuthUserService authUserService; + @Resource + private SysUserService sysUserService; + @Override public void sendMsg(Long userId, Long typeId, String content, String param) { - SysUserEntity userEntity = authUserService.getUserById(userId); - - if (userEntity.getFrom() == 5 && authUserService.supportDingtalk()) { - String username = userEntity.getUsername(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) && authUserService.supportDingtalk()) { + String username = sysUserAssist.getDingtalkId(); DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); List userIds = new ArrayList<>(); userIds.add(username); diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java index 7793d4c7db..1c400ec3c9 100644 --- a/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendLark.java @@ -1,13 +1,17 @@ package io.dataease.service.message.service.strategy; -import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.service.AuthUserService; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.lark.service.LarkXpackService; import io.dataease.service.message.service.SendService; +import io.dataease.service.sys.SysUserService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -17,12 +21,14 @@ public class SendLark implements SendService { @Autowired private AuthUserService authUserService; + @Resource + private SysUserService sysUserService; + @Override public void sendMsg(Long userId, Long typeId, String content, String param) { - SysUserEntity userEntity = authUserService.getUserById(userId); - - if (userEntity.getFrom() == 6 && authUserService.supportLark()) { - String username = userEntity.getUsername(); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getLarkId()) && authUserService.supportLark()) { + String username = sysUserAssist.getLarkId(); LarkXpackService larkXpackService = SpringContextUtil.getBean(LarkXpackService.class); List userIds = new ArrayList<>(); userIds.add(username); diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java index de5481b561..4ccdf141e0 100644 --- a/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendWecom.java @@ -1,13 +1,17 @@ package io.dataease.service.message.service.strategy; -import io.dataease.auth.entity.SysUserEntity; import io.dataease.auth.service.AuthUserService; +import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.wecom.service.WecomXpackService; import io.dataease.service.message.service.SendService; +import io.dataease.service.sys.SysUserService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -16,12 +20,16 @@ public class SendWecom implements SendService { @Autowired private AuthUserService authUserService; + + @Resource + private SysUserService sysUserService; + @Override public void sendMsg(Long userId, Long typeId, String content, String param) { - SysUserEntity userEntity = authUserService.getUserById(userId); + SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); + if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getWecomId()) && authUserService.supportWecom()) { - if (userEntity.getFrom() == 4 && authUserService.supportWecom()) { - String username = userEntity.getUsername(); + String username = sysUserAssist.getWecomId(); WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); List userIds = new ArrayList<>(); userIds.add(username); 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 f9189d80f0..ab70cae6a5 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -5,7 +5,6 @@ import io.dataease.auth.service.AuthUserService; import io.dataease.auth.service.ExtAuthService; import io.dataease.commons.exception.DEException; import io.dataease.controller.sys.request.*; -import io.dataease.ext.ExtSysUserAssistMapper; import io.dataease.ext.ExtSysUserMapper; import io.dataease.ext.query.GridExample; import io.dataease.commons.constants.AuthConstants; @@ -16,6 +15,7 @@ import io.dataease.controller.sys.response.SysUserGridResponse; import io.dataease.controller.sys.response.SysUserRole; import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.*; +import io.dataease.plugins.common.base.mapper.SysUserAssistMapper; import io.dataease.plugins.common.base.mapper.SysUserMapper; import io.dataease.plugins.common.base.mapper.SysUsersRolesMapper; import io.dataease.plugins.common.entity.XpackLdapUserEntity; @@ -36,6 +36,7 @@ import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Service @@ -57,8 +58,9 @@ public class SysUserService { @Resource private ExtAuthService extAuthService; + @Resource - private ExtSysUserAssistMapper extSysUserAssistMapper; + private SysUserAssistMapper sysUserAssistMapper; @Resource private AuthUserService authUserService; @@ -99,8 +101,15 @@ public class SysUserService { } int insert = sysUserMapper.insert(user); SysUser dbUser = findOne(user); - request.setUserId(dbUser.getUserId()); - saveUserRoles(dbUser.getUserId(), request.getRoleIds());//插入用户角色关联 + Long userId = dbUser.getUserId(); + request.setUserId(userId); + saveUserRoles(userId, request.getRoleIds());//插入用户角色关联 + + 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()); + } + return insert; } @@ -125,12 +134,12 @@ public class SysUserService { // oidc默认角色是普通员工 List roleIds = new ArrayList(); roleIds.add(2L); - saveUserRoles( dbUser.getUserId(), roleIds); + saveUserRoles(dbUser.getUserId(), roleIds); } } @Transactional - public void saveWecomCUser(Map userMap , String userId, String email) { + public void saveWecomCUser(Map userMap, String userId, String email) { long now = System.currentTimeMillis(); SysUser sysUser = new SysUser(); @@ -148,6 +157,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)); } @@ -170,7 +180,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)); } @Transactional @@ -192,7 +202,7 @@ 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())); } @Transactional @@ -215,7 +225,7 @@ public class SysUserService { // oidc默认角色是普通员工 List roleIds = new ArrayList(); roleIds.add(2L); - saveUserRoles( dbUser.getUserId(), roleIds); + saveUserRoles(dbUser.getUserId(), roleIds); } } @@ -247,7 +257,7 @@ public class SysUserService { sysUserMapper.insert(sysUser); SysUser dbUser = findOne(sysUser); if (null != dbUser && null != dbUser.getUserId()) { - saveUserRoles( dbUser.getUserId(), request.getRoleIds()); + saveUserRoles(dbUser.getUserId(), request.getRoleIds()); } }); } @@ -285,7 +295,13 @@ public class SysUserService { saveUserRoles(user.getUserId(), request.getRoleIds());//再插入角色关联 if (ObjectUtils.isEmpty(user.getDeptId())) user.setDeptId(0L); authUserService.clearCache(user.getUserId()); - return sysUserMapper.updateByPrimaryKeySelective(user); + int result = sysUserMapper.updateByPrimaryKeySelective(user); + + 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()); + } + return result; } /** @@ -308,6 +324,7 @@ public class SysUserService { * 更新用户基本信息 * 只允许修改 email, nickname, phone * 防止此接口被恶意利用更改不允许更改的信息,新建SysUser对象并只设置部分值 + * * @param request * @return */ @@ -426,33 +443,34 @@ public class SysUserService { SysUserExample example = new SysUserExample(); example.createCriteria().andUsernameEqualTo(userName); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户ID【"+userName+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户ID【" + userName + "】已存在,请联系管理员"); } } + public void validateExistUser(String userName, String nickName, String email) { SysUserExample example = new SysUserExample(); if (StringUtils.isNotBlank(userName)) { example.createCriteria().andUsernameEqualTo(userName); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户ID【"+userName+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户ID【" + userName + "】已存在,请联系管理员"); } } if (StringUtils.isNotBlank(nickName)) { example.createCriteria().andNickNameEqualTo(nickName); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户姓名【"+nickName+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户姓名【" + nickName + "】已存在,请联系管理员"); } } example.clear(); if (StringUtils.isNotBlank(email)) { example.createCriteria().andEmailEqualTo(email); List users = sysUserMapper.selectByExample(example); - if(CollectionUtils.isNotEmpty(users)) { - throw new RuntimeException("用户邮箱【"+email+"】已存在,请联系管理员"); + if (CollectionUtils.isNotEmpty(users)) { + throw new RuntimeException("用户邮箱【" + email + "】已存在,请联系管理员"); } } } @@ -510,16 +528,43 @@ public class SysUserService { } public boolean needPwdNoti(Long userId) { - SysUserAssist userAssist = extSysUserAssistMapper.query(userId); + SysUserAssist userAssist = sysUserAssistMapper.selectByPrimaryKey(userId); return ObjectUtils.isEmpty(userAssist) || userAssist.getNeedFirstNoti(); } public void saveUserAssist(Boolean noti) { Long userId = AuthUtils.getUser().getUserId(); + SysUserAssist existAssist = sysUserAssistMapper.selectByPrimaryKey(userId); + if (ObjectUtils.isNotEmpty(existAssist)) { + existAssist.setNeedFirstNoti(noti); + sysUserAssistMapper.updateByPrimaryKey(existAssist); + return; + } SysUserAssist sysUserAssist = new SysUserAssist(); sysUserAssist.setUserId(userId); sysUserAssist.setNeedFirstNoti(noti); - extSysUserAssistMapper.save(sysUserAssist); + sysUserAssistMapper.insertSelective(sysUserAssist); + } + + public void saveAssist(Long userId, String wecomId, String dingtlkId, String larkId) { + SysUserAssist existAssist = sysUserAssistMapper.selectByPrimaryKey(userId); + if (ObjectUtils.isNotEmpty(existAssist)) { + existAssist.setWecomId(wecomId); + existAssist.setDingtalkId(dingtlkId); + existAssist.setLarkId(larkId); + sysUserAssistMapper.updateByPrimaryKey(existAssist); + return; + } + SysUserAssist sysUserAssist = new SysUserAssist(); + sysUserAssist.setUserId(userId); + sysUserAssist.setWecomId(wecomId); + sysUserAssist.setDingtalkId(dingtlkId); + sysUserAssist.setLarkId(larkId); + sysUserAssistMapper.insert(sysUserAssist); + } + + public SysUserAssist assistInfo(Long userId) { + return sysUserAssistMapper.selectByPrimaryKey(userId); } } diff --git a/backend/src/main/resources/db/migration/V40__1.15.sql b/backend/src/main/resources/db/migration/V40__1.15.sql index 0dbc5b1707..b4b31501c6 100644 --- a/backend/src/main/resources/db/migration/V40__1.15.sql +++ b/backend/src/main/resources/db/migration/V40__1.15.sql @@ -116,3 +116,8 @@ INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_typ INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('98d77463-38bb-11ed-8383-0242ac130005', 'f4e07708-26f1-4f42-9a4a-8e6dae63353c', 'i18n_auth_grant', 15, 0, 'grant', '基础权限-授权', 'admin', 1663661389000, NULL, NULL, NULL); INSERT INTO `sys_auth_detail` (`id`, `auth_id`, `privilege_name`, `privilege_type`, `privilege_value`, `privilege_extend`, `remark`, `create_user`, `create_time`, `update_time`, `copy_from`, `copy_id`) VALUES ('98d77856-38bb-11ed-8383-0242ac130005', 'f4e07708-26f1-4f42-9a4a-8e6dae63353c', 'i18n_auth_use', 1, 1, 'use', '基础权限-使用', 'admin', 1663661389000, NULL, NULL, NULL); +ALTER TABLE `sys_user_assist` + ADD COLUMN `wecom_id` varchar(255) NULL COMMENT '企业微信账号' AFTER `need_first_noti`, + ADD COLUMN `dingtalk_id` varchar(255) NULL COMMENT '钉钉账号' AFTER `wecom_id`, + ADD COLUMN `lark_id` varchar(255) NULL COMMENT '飞书账号' AFTER `dingtalk_id`; + diff --git a/frontend/src/api/system/datasource.js b/frontend/src/api/system/datasource.js index 8588a7fac0..647cb4445b 100644 --- a/frontend/src/api/system/datasource.js +++ b/frontend/src/api/system/datasource.js @@ -148,4 +148,11 @@ export function updateDriver(data) { }) } -export default { dsGrid, addDs, editDs, delDs, validateDs, listDatasource, getSchema } +export function getDatasourceDetail(id) { + return request({ + url: `/datasource/get/${id}`, + loading: true, + method: 'post', + }) +} +export default { getDatasourceDetail, dsGrid, addDs, editDs, delDs, validateDs, listDatasource, getSchema } diff --git a/frontend/src/api/system/user.js b/frontend/src/api/system/user.js index 4e4ee78512..cdfc543a6d 100644 --- a/frontend/src/api/system/user.js +++ b/frontend/src/api/system/user.js @@ -10,7 +10,8 @@ const pathMap = { updatePath: '/api/user/update', editPasswordPath: '/api/user/adminUpdatePwd', editStatusPath: '/api/user/updateStatus', - unlockPath: '/api/user/unlock/' + unlockPath: '/api/user/unlock/', + queryAssistPath: '/api/user/assistInfo/' } export function userLists(page, size, data) { return request({ @@ -142,4 +143,12 @@ export function unLock(username) { }) } -export default { editPassword, delUser, editUser, addUser, userLists, editStatus, personInfo, updatePerson, updatePersonPwd, allRoles, roleGrid, ldapUsers, saveLdapUser, existLdapUsers, unLock } +export function queryAssist(userId) { + return request({ + url: pathMap.queryAssistPath + userId, + method: 'post', + loading: false + }) +} + +export default { editPassword, delUser, editUser, addUser, userLists, editStatus, personInfo, updatePerson, updatePersonPwd, allRoles, roleGrid, ldapUsers, saveLdapUser, existLdapUsers, unLock, queryAssist } diff --git a/frontend/src/icons/svg/data-reference.svg b/frontend/src/icons/svg/data-reference.svg new file mode 100644 index 0000000000..b294b7c599 --- /dev/null +++ b/frontend/src/icons/svg/data-reference.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/icons/svg/reference-field.svg b/frontend/src/icons/svg/reference-field.svg new file mode 100644 index 0000000000..b311d14227 --- /dev/null +++ b/frontend/src/icons/svg/reference-field.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/icons/svg/reference-play.svg b/frontend/src/icons/svg/reference-play.svg new file mode 100644 index 0000000000..5a706247bd --- /dev/null +++ b/frontend/src/icons/svg/reference-play.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/frontend/src/icons/svg/reference-setting.svg b/frontend/src/icons/svg/reference-setting.svg new file mode 100644 index 0000000000..74107b66d3 --- /dev/null +++ b/frontend/src/icons/svg/reference-setting.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/icons/svg/reference-table.svg b/frontend/src/icons/svg/reference-table.svg new file mode 100644 index 0000000000..96a9732884 --- /dev/null +++ b/frontend/src/icons/svg/reference-table.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 15b7c31d3c..ea90af461c 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -132,11 +132,10 @@ export default { }, commons: { - unlock: 'Unlock', unlock_success: 'Unlock success', - uninstall:'Uninstall', + uninstall: 'Uninstall', no_result: 'No Result', manage_member: 'Managing members', @@ -525,7 +524,10 @@ export default { convert_to_dimension: 'Convert to Dimension', left_to_edit: 'Select the data table on the left to edit', cannot_be_duplicate: 'The dataset name cannot be duplicate', - set_saved_successfully: 'Data set saved successfully' + set_saved_successfully: 'Data set saved successfully', + to_start_using: 'Browse the contents of your database, tables and columns. Choose a database to get started.', + to_run_query: 'Click to run query', + the_running_results: 'You can view the running results' }, detabs: { eidttitle: 'Edit Title', @@ -671,7 +673,13 @@ export default { filter: 'Screen', list: 'List item', list_info: 'Please select the information to be displayed in the list', - sure_delete: 'Are you sure to delete this user?' + sure_delete: 'Are you sure to delete this user?', + wecom_id: 'Wecom Account', + dingtalk_id: 'Dingtalk Account', + lark_id: 'Lark Account', + input_wecom_id: 'Please input wecom account', + input_dingtalk_id: 'Please input dingtalk account', + input_lark_id: 'Please input lark account' }, ldap: { url: 'LDAP url', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index ed7a4863db..cb6c2df8eb 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -132,11 +132,10 @@ export default { }, commons: { - unlock: '解鎖', unlock_success: '解鎖成功', - uninstall:'卸载', + uninstall: '卸载', no_result: '没有找到相关内容', manage_member: '管理成員', @@ -525,7 +524,10 @@ export default { convert_to_dimension: '轉換為維度', left_to_edit: '選中左側的資料表可進行編輯', cannot_be_duplicate: '數据集名稱不允許重複', - set_saved_successfully: '數据集保存成功' + set_saved_successfully: '數据集保存成功', + to_start_using: '瀏覽您的數据庫,表和列的內容。 選擇一個數据庫即可開始使用。', + to_run_query: '點擊運行査詢', + the_running_results: '即可查看運行結果' }, detabs: { eidttitle: '編輯標題', @@ -671,7 +673,13 @@ export default { filter: '篩選', list: '列表項', list_info: '請選擇列表中要展示的信息', - sure_delete: '確定刪除該用戶嗎?' + sure_delete: '確定刪除該用戶嗎?', + wecom_id: '企業微信賬號', + dingtalk_id: '釘釘賬號', + lark_id: '飛書賬號', + input_wecom_id: '請輸入企業微信賬號', + input_dingtalk_id: '請輸入釘釘賬號', + input_lark_id: '請輸入飛書賬號' }, ldap: { url: 'LDAP地址', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 2179467cf2..511dba8785 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -134,7 +134,7 @@ export default { unlock: '解锁', unlock_success: '解锁成功', - uninstall:'卸载', + uninstall: '卸载', no_result: '没有找到相关内容', manage_member: '管理成员', @@ -523,7 +523,10 @@ export default { convert_to_dimension: '转换为维度', left_to_edit: '选中左侧的数据表可进行编辑', cannot_be_duplicate: '数据集名称不允许重复', - set_saved_successfully: '数据集保存成功' + set_saved_successfully: '数据集保存成功', + to_start_using: '浏览您的数据库,表和列的内容。 选择一个数据库即可开始使用。', + to_run_query: '点击运行查询', + the_running_results: '即可查看运行结果' }, detabs: { eidttitle: '编辑标题', @@ -669,7 +672,13 @@ export default { filter: '筛选', list: '列表项', list_info: '请选择列表中要展示的信息', - sure_delete: '确定删除该用户吗?' + sure_delete: '确定删除该用户吗?', + wecom_id: '企业微信账号', + dingtalk_id: '钉钉账号', + lark_id: '飞书账号', + input_wecom_id: '请输入企业微信账号', + input_dingtalk_id: '请输入钉钉账号', + input_lark_id: '请输入飞书账号' }, ldap: { url: 'LDAP地址', diff --git a/frontend/src/views/dataset/add/AddApi.vue b/frontend/src/views/dataset/add/AddApi.vue index 9c3c4e9ba9..8160b47e20 100644 --- a/frontend/src/views/dataset/add/AddApi.vue +++ b/frontend/src/views/dataset/add/AddApi.vue @@ -32,7 +32,6 @@ clearable />
- -
@@ -379,6 +377,7 @@ export default { display: flex; height: 100%; position: relative; + width: 100%; .arrow-right { position: absolute; diff --git a/frontend/src/views/dataset/add/AddDB.vue b/frontend/src/views/dataset/add/AddDB.vue index e89180b5dd..06d5c82607 100644 --- a/frontend/src/views/dataset/add/AddDB.vue +++ b/frontend/src/views/dataset/add/AddDB.vue @@ -33,7 +33,6 @@ clearable />
- -
@@ -282,14 +280,6 @@ export default { }, methods: { nameExsitValidator(activeIndex) { - if ( - !this.nameList || - this.nameList.length === 0 || - !this.checkDatasetName.includes(this.tableData[activeIndex].datasetName) - ) { - this.tableData[activeIndex].nameExsit = false - return - } this.tableData[activeIndex].nameExsit = this.nameList .concat(this.checkDatasetName) @@ -300,6 +290,8 @@ export default { this.tableData.forEach((ele, index) => { if (this.checkDatasetName.includes(ele.datasetName)) { this.nameExsitValidator(index) + } else { + ele.nameExsit = false; } }) }, @@ -402,6 +394,8 @@ export default { display: flex; height: 100%; position: relative; + width: 100%; + .arrow-right { position: absolute; diff --git a/frontend/src/views/dataset/add/AddExcel.vue b/frontend/src/views/dataset/add/AddExcel.vue index 0326710de0..7e29c5f224 100644 --- a/frontend/src/views/dataset/add/AddExcel.vue +++ b/frontend/src/views/dataset/add/AddExcel.vue @@ -1,7 +1,7 @@ diff --git a/frontend/src/views/system/datasource/DsConfiguration.vue b/frontend/src/views/system/datasource/DsConfiguration.vue index 96dc0f218c..7738935aa2 100644 --- a/frontend/src/views/system/datasource/DsConfiguration.vue +++ b/frontend/src/views/system/datasource/DsConfiguration.vue @@ -11,81 +11,91 @@ > @@ -94,7 +104,11 @@ :label="$t('datasource.host')" prop="configuration.host" > - + - + {{ $t("datasource.oracle_sid") }} + >{{ $t('datasource.oracle_sid') }} - {{ $t("datasource.oracle_service_name") }} + {{ $t('datasource.oracle_service_name') }} @@ -164,7 +182,7 @@ >

- {{ $t("datasource.kerbers_info") }} + {{ $t('datasource.kerbers_info') }}

@@ -183,7 +201,11 @@ " :label="$t('datasource.user_name')" > - + - + - + - + {{ $t("datasource.priority") + >{{ $t('datasource.priority') }} @@ -369,7 +403,7 @@ type="number" :min="0" > - + @@ -408,7 +442,7 @@ :rules="rule" >
- {{ $t("datasource.base_info") }} + {{ $t('datasource.base_info') }}
@@ -439,7 +473,7 @@
- {{ $t("datasource.req_param") }} + {{ $t('datasource.req_param') }}
@@ -462,7 +496,7 @@ :rules="rule" >
- {{ $t("datasource.column_info") }} + {{ $t('datasource.column_info') }}
+ \ No newline at end of file diff --git a/frontend/src/views/system/datasource/DsTree.vue b/frontend/src/views/system/datasource/DsTree.vue index fcb2d15f25..ac396184f0 100644 --- a/frontend/src/views/system/datasource/DsTree.vue +++ b/frontend/src/views/system/datasource/DsTree.vue @@ -246,7 +246,6 @@ import { import { ApplicationContext } from "@/utils/ApplicationContext"; import deTextarea from "@/components/deCustomCm/deTextarea.vue"; import msgCfm from "@/components/msgCfm"; - export default { name: "DsTree", mixins: [msgCfm], @@ -406,7 +405,6 @@ export default { } if (!(element.type in types)) { types[element.type] = []; - // newArr.push(...element, ...{ children: types[element.type] }) newArr.push({ id: element.type, name: element.typeDesc, @@ -415,7 +413,6 @@ export default { }); } types[element.type].push(element); - // newArr.children.push({ id: element.id, label: element.name }) } return newArr; }, @@ -449,8 +446,8 @@ export default { }, addDb({ type }) { this.$router.push({ - name: "datasource-form", - params: { type }, + path: "/ds-form", + query: { type }, }); }, addFolderWithType(data) { @@ -460,8 +457,8 @@ export default { this.editDriver = true; } else { this.$router.push({ - name: "datasource-form", - params: { type: data.id }, + path: "/ds-form", + query: { type: data.id }, }); } }, @@ -547,10 +544,13 @@ export default { }, switchMain(component, componentParam, tData, dsTypes) { if (component === "DsForm") { + const { id, type, showModel } = componentParam; this.$router.push({ - name: "datasource-form", - params: { - ...componentParam, + path: "/ds-form", + query: { + id, + type, + showModel, msgNodeId: this.msgNodeId, }, }); @@ -608,7 +608,6 @@ export default { .custom-tree-container { margin-top: 16px; } - .custom-tree-node { flex: 1; display: flex; @@ -618,7 +617,6 @@ export default { padding-right: 8px; width: 100%; } - .custom-tree-node-list { flex: 1; display: flex; @@ -627,33 +625,27 @@ export default { font-size: 14px; padding: 0 8px; width: calc(100% - 40px); - .child { /*display: none;*/ visibility: hidden; } - &:hover .child { /*display: inline;*/ visibility: visible; } } - .tree-list ::v-deep .el-tree-node__expand-icon.is-leaf { display: none; } - .tree-style { padding: 16px 24px; height: 100%; overflow-y: auto; - .title-text { line-height: 26px; color: #1f2329; margin-bottom: 16px; } - .title-operate { text-align: right; i { @@ -670,7 +662,6 @@ export default { display: flex; justify-content: space-between; flex-wrap: wrap; - .db-card { height: 193px; width: 270px; @@ -694,7 +685,6 @@ export default { padding: 8px 12px; border-top: 1px solid rgba(#1f2329, 0.15); } - &:hover { box-shadow: 0px 6px 24px rgba(31, 35, 41, 0.08); } diff --git a/frontend/src/views/system/datasource/dsTable.vue b/frontend/src/views/system/datasource/dsTable.vue index d6c1b4260b..3a1db9d51c 100644 --- a/frontend/src/views/system/datasource/dsTable.vue +++ b/frontend/src/views/system/datasource/dsTable.vue @@ -211,13 +211,11 @@ export default { line-height: 24px; color: var(--deTextPrimary, #1f2329); } - .table-container { height: calc(100% - 50px); } - .el-table__fixed-right::before { background: transparent; } } - + \ No newline at end of file diff --git a/frontend/src/views/system/datasource/form.vue b/frontend/src/views/system/datasource/form.vue index 1fa82629f4..0eec277ed7 100644 --- a/frontend/src/views/system/datasource/form.vue +++ b/frontend/src/views/system/datasource/form.vue @@ -4,10 +4,8 @@ \ No newline at end of file diff --git a/frontend/src/views/system/task/filterUserRecord.vue b/frontend/src/views/system/task/filterUserRecord.vue index b7ec0f0c78..3788b12815 100644 --- a/frontend/src/views/system/task/filterUserRecord.vue +++ b/frontend/src/views/system/task/filterUserRecord.vue @@ -200,6 +200,7 @@ export default { this.selectDatasets = []; this.datasetCahe = []; this.selectDatasetsCahe = []; + this.$refs.datasetTreeRef.filter(); this.$emit("search", [], []); }, clearOneFilter(index) { @@ -211,6 +212,9 @@ export default { } else { this[ele] = []; } + if (ele === 'activeDataset') { + this.$refs.datasetTreeRef.filter(); + } }); }, statusChange(value, type) { diff --git a/frontend/src/views/system/task/form.vue b/frontend/src/views/system/task/form.vue index 00e62591cc..1743dd271d 100644 --- a/frontend/src/views/system/task/form.vue +++ b/frontend/src/views/system/task/form.vue @@ -42,7 +42,7 @@
- + {{ $t("commons.default_pwd") + ":" + defaultPWD }} @@ -36,16 +36,16 @@ @@ -55,24 +55,24 @@ - + @@ -82,14 +82,13 @@ - - - - + + + @@ -100,37 +99,37 @@ prop="deptId" > - - - - - + + + + + @@ -165,14 +164,24 @@ /> + + + + + + + + + + + - + /> @@ -187,280 +196,328 @@