feat(平台对接): 飞书国际版

This commit is contained in:
fit2cloud-chenyw 2022-10-24 13:22:58 +08:00
parent 1afce94dc5
commit 3fdeef0312
20 changed files with 346 additions and 20 deletions

View File

@ -75,6 +75,10 @@ public interface AuthApi {
@PostMapping("/isOpenLark") @PostMapping("/isOpenLark")
boolean isOpenLark(); boolean isOpenLark();
@ApiOperation("是否开启国际飞书")
@PostMapping("/isOpenLarksuite")
boolean isOpenLarksuite();
@ApiIgnore @ApiIgnore
@PostMapping("/isPluginLoaded") @PostMapping("/isPluginLoaded")
boolean isPluginLoaded(); boolean isPluginLoaded();

View File

@ -337,6 +337,14 @@ public class AuthServer implements AuthApi {
return authUserService.supportLark(); return authUserService.supportLark();
} }
@Override
public boolean isOpenLarksuite() {
Boolean licValid = PluginUtils.licValid();
if (!licValid)
return false;
return authUserService.supportLarksuite();
}
@Override @Override
public boolean isPluginLoaded() { public boolean isPluginLoaded() {
Boolean licValid = PluginUtils.licValid(); Boolean licValid = PluginUtils.licValid();

View File

@ -23,6 +23,8 @@ public interface AuthUserService {
SysUserEntity getUserByDingtalkId(String dingtalkId); SysUserEntity getUserByDingtalkId(String dingtalkId);
SysUserEntity getUserByLarkId(String larkId); SysUserEntity getUserByLarkId(String larkId);
SysUserEntity getUserByLarksuiteId(String larksuiteId);
List<String> roles(Long userId); List<String> roles(Long userId);
List<String> permissions(Long userId); List<String> permissions(Long userId);
@ -43,6 +45,8 @@ public interface AuthUserService {
Boolean supportLark(); Boolean supportLark();
Boolean supportLarksuite();
Boolean supportLoginLimit(); Boolean supportLoginLimit();
Boolean pluginLoaded(); Boolean pluginLoaded();

View File

@ -21,6 +21,7 @@ import io.dataease.plugins.util.PluginUtils;
import io.dataease.plugins.xpack.cas.service.CasXpackService; import io.dataease.plugins.xpack.cas.service.CasXpackService;
import io.dataease.plugins.xpack.dingtalk.service.DingtalkXpackService; import io.dataease.plugins.xpack.dingtalk.service.DingtalkXpackService;
import io.dataease.plugins.xpack.lark.service.LarkXpackService; import io.dataease.plugins.xpack.lark.service.LarkXpackService;
import io.dataease.plugins.xpack.larksuite.service.LarksuiteXpackService;
import io.dataease.plugins.xpack.ldap.service.LdapXpackService; import io.dataease.plugins.xpack.ldap.service.LdapXpackService;
import io.dataease.plugins.xpack.loginlimit.dto.response.LoginLimitInfo; import io.dataease.plugins.xpack.loginlimit.dto.response.LoginLimitInfo;
import io.dataease.plugins.xpack.loginlimit.service.LoginLimitXpackService; import io.dataease.plugins.xpack.loginlimit.service.LoginLimitXpackService;
@ -108,6 +109,11 @@ public class AuthUserServiceImpl implements AuthUserService {
return authMapper.findLarkUser(larkId); return authMapper.findLarkUser(larkId);
} }
@Override
public SysUserEntity getUserByLarksuiteId(String larksuiteId) {
return authMapper.findLarksuiteUser(larksuiteId);
}
@Override @Override
public List<String> roles(Long userId) { public List<String> roles(Long userId) {
return authMapper.roleCodes(userId); return authMapper.roleCodes(userId);
@ -221,6 +227,15 @@ public class AuthUserServiceImpl implements AuthUserService {
return larkXpackService.isOpen(); return larkXpackService.isOpen();
} }
@Override
public Boolean supportLarksuite() {
Map<String, LarksuiteXpackService> beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LarksuiteXpackService.class));
if (beansOfType.keySet().size() == 0) return false;
LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class);
if (ObjectUtils.isEmpty(larkXpackService)) return false;
return larkXpackService.isOpen();
}
@Override @Override
public Boolean supportLoginLimit() { public Boolean supportLoginLimit() {
Map<String, LoginLimitXpackService> beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LoginLimitXpackService.class)); Map<String, LoginLimitXpackService> beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LoginLimitXpackService.class));

View File

@ -86,6 +86,7 @@ public class ShiroServiceImpl implements ShiroService {
filterChainDefinitionMap.put("/api/auth/isOpenWecom", ANON); filterChainDefinitionMap.put("/api/auth/isOpenWecom", ANON);
filterChainDefinitionMap.put("/api/auth/isOpenDingtalk", ANON); filterChainDefinitionMap.put("/api/auth/isOpenDingtalk", ANON);
filterChainDefinitionMap.put("/api/auth/isOpenLark", ANON); filterChainDefinitionMap.put("/api/auth/isOpenLark", ANON);
filterChainDefinitionMap.put("/api/auth/isOpenLarksuite", ANON);
filterChainDefinitionMap.put("/api/auth/getPublicKey", ANON); filterChainDefinitionMap.put("/api/auth/getPublicKey", ANON);
filterChainDefinitionMap.put("/api/pluginCommon/component/*", ANON); filterChainDefinitionMap.put("/api/pluginCommon/component/*", ANON);
filterChainDefinitionMap.put("/api/pluginCommon/staticInfo/**", ANON); filterChainDefinitionMap.put("/api/pluginCommon/staticInfo/**", ANON);
@ -101,6 +102,9 @@ public class ShiroServiceImpl implements ShiroService {
filterChainDefinitionMap.put("/plugin/lark/callBack*", ANON); filterChainDefinitionMap.put("/plugin/lark/callBack*", ANON);
filterChainDefinitionMap.put("/plugin/lark/bind*", ANON); filterChainDefinitionMap.put("/plugin/lark/bind*", ANON);
filterChainDefinitionMap.put("/plugin/lark/getQrParam", ANON); filterChainDefinitionMap.put("/plugin/lark/getQrParam", ANON);
filterChainDefinitionMap.put("/plugin/larksuite/callBack*", ANON);
filterChainDefinitionMap.put("/plugin/larksuite/bind*", ANON);
filterChainDefinitionMap.put("/plugin/larksuite/getQrParam", ANON);
filterChainDefinitionMap.put("/cas/reset/**", ANON); filterChainDefinitionMap.put("/cas/reset/**", ANON);
filterChainDefinitionMap.put("/unauth", ANON); filterChainDefinitionMap.put("/unauth", ANON);

View File

@ -56,6 +56,8 @@ public class SysUserController {
private static final String DINGTALK = "dingtalk"; private static final String DINGTALK = "dingtalk";
private static final String LARK = "lark"; private static final String LARK = "lark";
private static final String LARKSUITE = "larksuite";
@Resource @Resource
private SysUserService sysUserService; private SysUserService sysUserService;
@ -254,15 +256,18 @@ public class SysUserController {
if (authUserService.supportLark() && StringUtils.isNotBlank(sysUserAssist.getLarkId())) { if (authUserService.supportLark() && StringUtils.isNotBlank(sysUserAssist.getLarkId())) {
dto.setLarkBinded(true); dto.setLarkBinded(true);
} }
if (authUserService.supportLarksuite() && StringUtils.isNotBlank(sysUserAssist.getLarksuiteId())) {
dto.setLarksuiteBinded(true);
}
return dto; return dto;
} }
@PostMapping("/unbindAssist/{type}") @PostMapping("/unbindAssist/{type}")
public void unbindAssist(@PathVariable("type") String type) { public void unbindAssist(@PathVariable("type") String type) {
Boolean valid = StringUtils.equals(WECOM, type) || StringUtils.equals(DINGTALK, type) || StringUtils.equals(LARK, type); Boolean valid = StringUtils.equals(WECOM, type) || StringUtils.equals(DINGTALK, type) || StringUtils.equals(LARK, type) || StringUtils.equals(LARKSUITE, type);
if (!valid) { if (!valid) {
DEException.throwException("only [wecom, dingtalk, lark] is valid"); DEException.throwException("only [wecom, dingtalk, lark, larksuite] is valid");
} }
Long userId = AuthUtils.getUser().getUserId(); Long userId = AuthUtils.getUser().getUserId();
SysUserAssist sysUserAssist = sysUserService.assistInfo(userId); SysUserAssist sysUserAssist = sysUserService.assistInfo(userId);
@ -275,10 +280,13 @@ public class SysUserController {
if (StringUtils.equals(LARK, type)) { if (StringUtils.equals(LARK, type)) {
sysUserAssist.setLarkId(null); sysUserAssist.setLarkId(null);
} }
if (StringUtils.isBlank(sysUserAssist.getWecomId()) && StringUtils.isBlank(sysUserAssist.getDingtalkId()) && StringUtils.isBlank(sysUserAssist.getLarkId())) { if (StringUtils.equals(LARKSUITE, type)) {
sysUserAssist.setLarksuiteId(null);
}
if (StringUtils.isBlank(sysUserAssist.getWecomId()) && StringUtils.isBlank(sysUserAssist.getDingtalkId()) && StringUtils.isBlank(sysUserAssist.getLarkId()) && StringUtils.isBlank(sysUserAssist.getLarksuiteId())) {
sysUserService.changeUserFrom(userId, 0); sysUserService.changeUserFrom(userId, 0);
} }
sysUserService.saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); sysUserService.saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId());
} }

View File

@ -12,4 +12,6 @@ public class AuthBindDTO implements Serializable {
private Boolean dingtalkBinded = false; private Boolean dingtalkBinded = false;
private Boolean larkBinded = false; private Boolean larkBinded = false;
private Boolean larksuiteBinded = false;
} }

View File

@ -37,5 +37,6 @@ public interface AuthMapper {
SysUserEntity findWecomUser(@Param("wecomId") String wecomId); SysUserEntity findWecomUser(@Param("wecomId") String wecomId);
SysUserEntity findDingtalkUser(@Param("dingtalkId") String dingtalkId); SysUserEntity findDingtalkUser(@Param("dingtalkId") String dingtalkId);
SysUserEntity findLarkUser(@Param("larkId") String larkId); SysUserEntity findLarkUser(@Param("larkId") String larkId);
SysUserEntity findLarksuiteUser(@Param("larksuiteId") String larksuiteId);
} }

View File

@ -137,4 +137,14 @@
where a.lark_id = #{larkId} where a.lark_id = #{larkId}
</select> </select>
<select id="findLarksuiteUser" resultMap="baseMap">
select
u.user_id, username,nick_name, dept_id, password, enabled,email, phone, language ,is_admin, `from`
from
sys_user_assist a
left join
sys_user u on u.user_id = a.user_id
where a.larksuite_id = #{larksuiteId}
</select>
</mapper> </mapper>

View File

@ -185,7 +185,7 @@ public class XDingtalkServer {
sysUserAssist.setUserId(Long.parseLong(state)); sysUserAssist.setUserId(Long.parseLong(state));
} }
sysUserAssist.setDingtalkId(userId); sysUserAssist.setDingtalkId(userId);
sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId());
response.sendRedirect(url); response.sendRedirect(url);
} catch (Exception e) { } catch (Exception e) {

View File

@ -185,7 +185,7 @@ public class XLarkServer {
sysUserAssist.setUserId(Long.parseLong(state)); sysUserAssist.setUserId(Long.parseLong(state));
} }
sysUserAssist.setLarkId(userId); sysUserAssist.setLarkId(userId);
sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId());
response.sendRedirect(url); response.sendRedirect(url);
} catch (Exception e) { } catch (Exception e) {

View File

@ -0,0 +1,206 @@
package io.dataease.plugins.server;
import io.dataease.auth.entity.SysUserEntity;
import io.dataease.auth.entity.TokenInfo;
import io.dataease.auth.service.AuthUserService;
import io.dataease.auth.util.JWTUtils;
import io.dataease.commons.constants.SysLogConstants;
import io.dataease.commons.exception.DEException;
import io.dataease.commons.utils.DeLogUtils;
import io.dataease.commons.utils.LogUtil;
import io.dataease.commons.utils.ServletUtils;
import io.dataease.plugins.common.base.domain.SysUserAssist;
import io.dataease.plugins.config.SpringContextUtil;
import io.dataease.plugins.xpack.display.dto.response.SysSettingDto;
import io.dataease.plugins.xpack.lark.dto.entity.LarkQrResult;
import io.dataease.plugins.xpack.lark.dto.response.LarkInfo;
import io.dataease.plugins.xpack.larksuite.dto.entity.UserData;
import io.dataease.plugins.xpack.larksuite.dto.response.LarksuiteUserResult;
import io.dataease.plugins.xpack.larksuite.service.LarksuiteXpackService;
import io.dataease.service.sys.SysUserService;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
@ApiIgnore
@RequestMapping("/plugin/larksuite")
@Controller
public class XLarksuiteServer {
@Resource
private AuthUserService authUserService;
@Resource
private SysUserService sysUserService;
@ResponseBody
@GetMapping("/info")
public LarkInfo getLarkInfo() {
LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class);
return larkXpackService.info();
}
@ResponseBody
@RequiresPermissions("sysparam:read")
@PostMapping("/save")
public void save(@RequestBody List<SysSettingDto> settings) {
LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class);
larkXpackService.save(settings);
}
@ResponseBody
@PostMapping("/testConn")
public void testConn(@RequestBody LarkInfo larkInfo) {
LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class);
try {
larkXpackService.testConn(larkInfo);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@ResponseBody
@PostMapping("/getQrParam")
public LarkQrResult getQrParam() {
LarksuiteXpackService larkXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class);
return larkXpackService.getQrParam();
}
@GetMapping("/callBack")
public ModelAndView callBack(@RequestParam("code") String code, @RequestParam("state") String state) {
ModelAndView modelAndView = new ModelAndView("redirect:/");
HttpServletResponse response = ServletUtils.response();
LarksuiteXpackService larksuiteXpackService = null;
try {
Map<String, LarksuiteXpackService> beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LarksuiteXpackService.class));
if (beansOfType.keySet().size() == 0) {
DEException.throwException("缺少国际飞书插件");
}
larksuiteXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class);
Boolean isOpen = larksuiteXpackService.isOpen();
if (!isOpen) {
DEException.throwException("未开启国际飞书");
}
LarksuiteUserResult larksuiteUserResult = larksuiteXpackService.userInfo(code, state, false);
UserData larkUserInfo = larksuiteUserResult.getData();
String username = larkUserInfo.getUser_id();
SysUserEntity sysUserEntity = authUserService.getUserByLarksuiteId(username);
if (null == sysUserEntity) {
String email = StringUtils.isNotBlank(larkUserInfo.getEmail()) ? larkUserInfo.getEmail() : (username + "@larksuite.work");
sysUserService.validateExistUser(username, larkUserInfo.getName(), email);
sysUserService.saveLarksuiteCUser(larkUserInfo, email);
sysUserEntity = authUserService.getUserByLarkId(username);
}
TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build();
String realPwd = sysUserEntity.getPassword();
String token = JWTUtils.sign(tokenInfo, realPwd);
ServletUtils.setToken(token);
DeLogUtils.save(SysLogConstants.OPERATE_TYPE.LOGIN, SysLogConstants.SOURCE_TYPE.USER, sysUserEntity.getUserId(), null, null, null);
Cookie cookie_token = new Cookie("Authorization", token);
cookie_token.setPath("/");
response.addCookie(cookie_token);
} catch (Exception e) {
String msg = e.getMessage();
if (null != e.getCause()) {
msg = e.getCause().getMessage();
}
try {
msg = URLEncoder.encode(msg, "UTF-8");
LogUtil.error(e);
Cookie cookie_error = new Cookie("LarksuiteError", msg);
cookie_error.setPath("/");
response.addCookie(cookie_error);
return modelAndView;
} catch (UnsupportedEncodingException e1) {
e.printStackTrace();
}
}
return modelAndView;
}
private void bindError(HttpServletResponse response, String url, String errorMsg) {
Cookie cookie_error = new Cookie("LarksuiteError", errorMsg);
cookie_error.setPath("/");
response.addCookie(cookie_error);
try {
response.sendRedirect(url);
} catch (IOException e) {
LogUtil.error(e.getMessage(), e);
DEException.throwException(e);
}
}
@GetMapping("/bind")
public void bind(@RequestParam("code") String code, @RequestParam("state") String state) {
HttpServletResponse response = ServletUtils.response();
String url = "/#person-info/index";
LarksuiteXpackService larksuiteXpackService = null;
try {
SysUserEntity userEntity = authUserService.getUserById(Long.parseLong(state));
if (ObjectUtils.isEmpty(userEntity)) {
bindError(response, url, "绑定用户不存在");
return;
}
SysUserAssist sysUserAssist = sysUserService.assistInfo(Long.parseLong(state));
if (ObjectUtils.isNotEmpty(sysUserAssist) && StringUtils.isNotBlank(sysUserAssist.getLarksuiteId())) {
bindError(response, url, "目标用户已绑定其他国际飞书账号");
return;
}
Boolean isOpen = authUserService.supportLarksuite();
if (!isOpen) {
DEException.throwException("未开启国际飞书");
}
larksuiteXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class);
LarksuiteUserResult larksuiteUserResult = larksuiteXpackService.userInfo(code, state, true);
UserData larkUserInfo = larksuiteUserResult.getData();
String userId = larkUserInfo.getUser_id();
SysUserEntity sysUserEntity = authUserService.getUserByLarksuiteId(userId);
if (null != sysUserEntity) {
bindError(response, url, "当前国际飞书账号已绑定其他DE用户");
return;
}
if (ObjectUtils.isEmpty(sysUserAssist)) {
sysUserAssist = new SysUserAssist();
sysUserAssist.setUserId(Long.parseLong(state));
}
sysUserAssist.setLarksuiteId(userId);
sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId());
response.sendRedirect(url);
} catch (Exception e) {
String msg = e.getMessage();
if (null != e.getCause()) {
msg = e.getCause().getMessage();
}
try {
msg = URLEncoder.encode(msg, "UTF-8");
LogUtil.error(e);
bindError(response, url, msg);
} catch (UnsupportedEncodingException e1) {
e.printStackTrace();
}
}
}
}

View File

@ -193,7 +193,7 @@ public class XWecomServer {
sysUserAssist.setUserId(Long.parseLong(state)); sysUserAssist.setUserId(Long.parseLong(state));
} }
sysUserAssist.setWecomId(userId); sysUserAssist.setWecomId(userId);
sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); sysUserService.saveAssist(sysUserAssist.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId());
response.sendRedirect(url); response.sendRedirect(url);
} catch (Exception e) { } catch (Exception e) {

View File

@ -21,6 +21,7 @@ import io.dataease.plugins.common.base.mapper.SysUsersRolesMapper;
import io.dataease.plugins.common.entity.XpackLdapUserEntity; import io.dataease.plugins.common.entity.XpackLdapUserEntity;
import io.dataease.plugins.xpack.dingtalk.dto.response.DingUserEntity; import io.dataease.plugins.xpack.dingtalk.dto.response.DingUserEntity;
import io.dataease.plugins.xpack.lark.dto.entity.LarkUserInfo; import io.dataease.plugins.xpack.lark.dto.entity.LarkUserInfo;
import io.dataease.plugins.xpack.larksuite.dto.entity.UserData;
import io.dataease.plugins.xpack.oidc.dto.SSOUserInfo; import io.dataease.plugins.xpack.oidc.dto.SSOUserInfo;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@ -107,7 +108,7 @@ public class SysUserService {
SysUserAssist sysUserAssist = request.getSysUserAssist(); SysUserAssist sysUserAssist = request.getSysUserAssist();
if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) { if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) {
saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); saveAssist(userId, sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId());
} }
return insert; return insert;
@ -157,7 +158,7 @@ public class SysUserService {
sysUser.setIsAdmin(false); sysUser.setIsAdmin(false);
sysUser.setSub(userId); sysUser.setSub(userId);
sysUserMapper.insert(sysUser); sysUserMapper.insert(sysUser);
Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), u.getUsername(), null, null)); Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), u.getUsername(), null, null, null));
} }
@ -180,7 +181,7 @@ public class SysUserService {
sysUser.setSub(dingUserEntity.getUnionid()); sysUser.setSub(dingUserEntity.getUnionid());
sysUser.setPhone(dingUserEntity.getMobile()); sysUser.setPhone(dingUserEntity.getMobile());
sysUserMapper.insert(sysUser); sysUserMapper.insert(sysUser);
Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, u.getUsername(), null)); Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, u.getUsername(), null, null));
} }
@Transactional @Transactional
@ -202,7 +203,29 @@ public class SysUserService {
sysUser.setSub(larkUserInfo.getSub()); sysUser.setSub(larkUserInfo.getSub());
sysUser.setPhone(larkUserInfo.getMobile()); sysUser.setPhone(larkUserInfo.getMobile());
sysUserMapper.insert(sysUser); sysUserMapper.insert(sysUser);
Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, null, u.getUsername())); Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, null, u.getUsername(), null));
}
@Transactional
public void saveLarksuiteCUser(UserData larkUserInfo, String email) {
long now = System.currentTimeMillis();
SysUser sysUser = new SysUser();
sysUser.setUsername(larkUserInfo.getUser_id());
sysUser.setNickName(larkUserInfo.getName());
sysUser.setEmail(email);
sysUser.setPassword(CodingUtil.md5(DEFAULT_PWD));
sysUser.setCreateTime(now);
sysUser.setUpdateTime(now);
sysUser.setEnabled(1L);
sysUser.setLanguage("zh_CN");
sysUser.setFrom(7);
sysUser.setIsAdmin(false);
sysUser.setSub(larkUserInfo.getUnion_id());
sysUser.setPhone(larkUserInfo.getMobile());
sysUserMapper.insert(sysUser);
Optional.ofNullable(findOne(sysUser)).ifPresent(u -> saveAssist(u.getUserId(), null, null, null, u.getUsername()));
} }
@Transactional @Transactional
@ -299,7 +322,7 @@ public class SysUserService {
SysUserAssist sysUserAssist = request.getSysUserAssist(); SysUserAssist sysUserAssist = request.getSysUserAssist();
if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) { if (ObjectUtils.isNotEmpty(sysUserAssist) && (StringUtils.isNotBlank(sysUserAssist.getWecomId()) || StringUtils.isNotBlank(sysUserAssist.getDingtalkId()) || StringUtils.isNotBlank(sysUserAssist.getLarkId()))) {
saveAssist(user.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId()); saveAssist(user.getUserId(), sysUserAssist.getWecomId(), sysUserAssist.getDingtalkId(), sysUserAssist.getLarkId(), sysUserAssist.getLarksuiteId());
} }
return result; return result;
} }
@ -550,12 +573,13 @@ public class SysUserService {
sysUserAssistMapper.insertSelective(sysUserAssist); sysUserAssistMapper.insertSelective(sysUserAssist);
} }
public void saveAssist(Long userId, String wecomId, String dingtlkId, String larkId) { public void saveAssist(Long userId, String wecomId, String dingtlkId, String larkId, String larksuiteId) {
SysUserAssist existAssist = sysUserAssistMapper.selectByPrimaryKey(userId); SysUserAssist existAssist = sysUserAssistMapper.selectByPrimaryKey(userId);
if (ObjectUtils.isNotEmpty(existAssist)) { if (ObjectUtils.isNotEmpty(existAssist)) {
existAssist.setWecomId(wecomId); existAssist.setWecomId(wecomId);
existAssist.setDingtalkId(dingtlkId); existAssist.setDingtalkId(dingtlkId);
existAssist.setLarkId(larkId); existAssist.setLarkId(larkId);
existAssist.setLarksuiteId(larksuiteId);
sysUserAssistMapper.updateByPrimaryKey(existAssist); sysUserAssistMapper.updateByPrimaryKey(existAssist);
return; return;
} }
@ -564,6 +588,7 @@ public class SysUserService {
sysUserAssist.setWecomId(wecomId); sysUserAssist.setWecomId(wecomId);
sysUserAssist.setDingtalkId(dingtlkId); sysUserAssist.setDingtalkId(dingtlkId);
sysUserAssist.setLarkId(larkId); sysUserAssist.setLarkId(larkId);
sysUserAssist.setLarksuiteId(larksuiteId);
sysUserAssistMapper.insert(sysUserAssist); sysUserAssistMapper.insert(sysUserAssist);
} }

View File

@ -14,3 +14,6 @@ ALTER TABLE `sys_task_email` ADD COLUMN `view_data_range` VARCHAR(255) NULL DEFA
UPDATE `sys_msg_type` set `type_name` = 'i18n_msg_type_dataset_sync_failed' WHERE (`msg_type_id` = 6); UPDATE `sys_msg_type` set `type_name` = 'i18n_msg_type_dataset_sync_failed' WHERE (`msg_type_id` = 6);
ALTER TABLE `sys_user_assist`
ADD COLUMN `larksuite_id` VARCHAR(255) NULL DEFAULT NULL AFTER `lark_id`;

View File

@ -121,6 +121,13 @@ export function larkStatus() {
}) })
} }
export function larksuiteStatus() {
return request({
url: '/api/auth/isOpenLarksuite',
method: 'post'
})
}
export function pluginLoaded() { export function pluginLoaded() {
return request({ return request({
url: '/api/auth/isPluginLoaded', url: '/api/auth/isPluginLoaded',

View File

@ -2361,7 +2361,8 @@ export default {
channel_email_msg: 'Email', channel_email_msg: 'Email',
channel_wecom_msg: 'Wecom', channel_wecom_msg: 'Wecom',
channel_dingtalk_msg: 'Dingtalk', channel_dingtalk_msg: 'Dingtalk',
channel_lark_msg: 'Lark' channel_lark_msg: 'Lark',
channel_larksuite_msg: 'Larksuite'
}, },
denumberrange: { denumberrange: {
label: 'Number range', label: 'Number range',
@ -2477,6 +2478,7 @@ export default {
wecom: 'Wecom', wecom: 'Wecom',
dingtalk: 'Dingtalk', dingtalk: 'Dingtalk',
lark: 'Lark', lark: 'Lark',
larksuite: 'Larksuite',
pixel: 'Pixel', pixel: 'Pixel',
default: 'Default', default: 'Default',
custom: 'Custom', custom: 'Custom',

View File

@ -2362,7 +2362,8 @@ export default {
channel_email_msg: '郵件提醒', channel_email_msg: '郵件提醒',
channel_wecom_msg: '企業微信', channel_wecom_msg: '企業微信',
channel_dingtalk_msg: '釘釘提醒', channel_dingtalk_msg: '釘釘提醒',
channel_lark_msg: '飛書提醒' channel_lark_msg: '飛書提醒',
channel_larksuite_msg: '國際飛書'
}, },
denumberrange: { denumberrange: {
label: '數值區間', label: '數值區間',
@ -2478,6 +2479,7 @@ export default {
wecom: '企業微信', wecom: '企業微信',
dingtalk: '釘釘', dingtalk: '釘釘',
lark: '飛書', lark: '飛書',
larksuite: '國際飛書',
pixel: '分辨率', pixel: '分辨率',
default: '默認', default: '默認',
custom: '自定義', custom: '自定義',

View File

@ -2362,7 +2362,8 @@ export default {
channel_email_msg: '邮件提醒', channel_email_msg: '邮件提醒',
channel_wecom_msg: '企业微信', channel_wecom_msg: '企业微信',
channel_dingtalk_msg: '钉钉提醒', channel_dingtalk_msg: '钉钉提醒',
channel_lark_msg: '飞书提醒' channel_lark_msg: '飞书提醒',
channel_larksuite_msg: '国际飞书'
}, },
denumberrange: { denumberrange: {
label: '数值区间', label: '数值区间',
@ -2478,6 +2479,7 @@ export default {
wecom: '企业微信', wecom: '企业微信',
dingtalk: '钉钉', dingtalk: '钉钉',
lark: '飞书', lark: '飞书',
larksuite: '国际飞书',
pixel: '分辨率', pixel: '分辨率',
default: '默认', default: '默认',
custom: '自定义', custom: '自定义',

View File

@ -75,6 +75,11 @@
:label="2" :label="2"
size="mini" size="mini"
>OIDC</el-radio> >OIDC</el-radio>
<el-radio
v-if="loginTypes.includes(7)"
:label="7"
size="mini"
>Larksuite</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item prop="username"> <el-form-item prop="username">
@ -187,6 +192,12 @@
component-name="SSOComponent" component-name="SSOComponent"
/> />
<plugin-com
v-if="loginTypes.includes(7) && loginForm.loginType === 7"
ref="LarksuiteQr"
component-name="LarksuiteQr"
/>
</div> </div>
<div <div
v-if="showFoot" v-if="showFoot"
@ -199,7 +210,7 @@
<script> <script>
import { encrypt } from '@/utils/rsaEncrypt' import { encrypt } from '@/utils/rsaEncrypt'
import { ldapStatus, oidcStatus, getPublicKey, pluginLoaded, defaultLoginType, wecomStatus, dingtalkStatus, larkStatus } from '@/api/user' import { ldapStatus, oidcStatus, getPublicKey, pluginLoaded, defaultLoginType, wecomStatus, dingtalkStatus, larkStatus, larksuiteStatus } from '@/api/user'
import { getSysUI } from '@/utils/auth' import { getSysUI } from '@/utils/auth'
import { changeFavicon } from '@/utils/index' import { changeFavicon } from '@/utils/index'
import { initTheme } from '@/utils/ThemeUtil' import { initTheme } from '@/utils/ThemeUtil'
@ -248,10 +259,10 @@ export default {
return this.$store.state.user.loginMsg return this.$store.state.user.loginMsg
}, },
qrTypes() { qrTypes() {
return this.loginTypes && this.loginTypes.filter(item => item > 3) || [] return this.loginTypes && this.loginTypes.filter(item => item > 3 && item < 7) || []
}, },
radioTypes() { radioTypes() {
return this.loginTypes && this.loginTypes.filter(item => item < 4) || [] return this.loginTypes && this.loginTypes.filter(item => item < 4 || item > 6) || []
} }
}, },
watch: { watch: {
@ -312,6 +323,13 @@ export default {
this.setDefaultType() this.setDefaultType()
}) })
larksuiteStatus().then(res => {
if (res.success && res.data) {
this.loginTypes.push(7)
}
this.setDefaultType()
})
getPublicKey().then(res => { getPublicKey().then(res => {
if (res.success && res.data) { if (res.success && res.data) {
// //
@ -391,6 +409,9 @@ export default {
clearLarkMsg() { clearLarkMsg() {
Cookies.remove('LarkError') Cookies.remove('LarkError')
}, },
clearLarksuiteMsg() {
Cookies.remove('LarksuiteError')
},
showLoginImage(uiInfo) { showLoginImage(uiInfo) {
this.uiInfo = getSysUI() this.uiInfo = getSysUI()
if (!this.uiInfo || Object.keys(this.uiInfo).length === 0) { if (!this.uiInfo || Object.keys(this.uiInfo).length === 0) {
@ -427,6 +448,7 @@ export default {
this.clearWecomMsg() this.clearWecomMsg()
this.clearDingtalkMsg() this.clearDingtalkMsg()
this.clearLarkMsg() this.clearLarkMsg()
this.clearLarksuiteMsg()
this.$refs.loginForm.validate(valid => { this.$refs.loginForm.validate(valid => {
if (valid) { if (valid) {
this.loading = true this.loading = true
@ -447,8 +469,9 @@ export default {
}) })
}, },
changeLoginType(val) { changeLoginType(val) {
if (val !== 2) return if (val !== 2 && val !== 7) return
this.clearOidcMsg() this.clearOidcMsg()
this.clearLarksuiteMsg()
this.$nextTick(() => { this.$nextTick(() => {
}) })