Commit 272909d3 by Cat
parents a6bb6ef0 75f3944a
......@@ -130,6 +130,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
//wx信息采集相关接口放行
.antMatchers("/wx/schoolInfo/**").permitAll()
.antMatchers("/wx/user/getToken").permitAll()
//钉钉免登录接口
.antMatchers("/dd/App/user/**").permitAll()
//开发一个接口字典
.antMatchers("/system/dict/data/type/**").permitAll()
// .antMatchers("/**").permitAll()
......
......@@ -20,6 +20,8 @@ public interface SysUserMapper {
*/
public List<SysUser> selectUserList(SysUser sysUser);
public List<SysUser> selectUserListTypeLogin(SysUser sysUser);
/**
* 根据条件分页查询已配用户角色列表
*
......
......@@ -74,7 +74,13 @@ public class SysUserServiceImpl implements ISysUserService {
public List<SysUser> selectUserList(SysUser user) {
return userMapper.selectUserList(user);
}
public List<SysUser> selectUserTypeList(SysUser user) {
return userMapper.selectUserList(user);
}
public List<SysUser> selectUserListTypeLogin(SysUser user) {
return userMapper.selectUserListTypeLogin(user);
}
/**
* 根据条件分页查询已分配用户角色列表
*
......
......@@ -94,6 +94,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
${params.dataScope}
</select>
<select id="selectUserListTypeLogin" parameterType="SysUser" resultMap="SysUserResult">
select u.user_id, u.dept_id, u.login_name, u.user_name,u.user_type, u.user_login_type, u.email, u.avatar, u.phonenumber, u.sex,u.salt,u.student_id, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
where u.del_flag = '0'
<if test="userLoginType != null and userLoginType != 0">
AND u.user_login_type = #{userLoginType}
</if>
<if test="userId != null and userId != 0">
AND u.user_id = #{userId}
</if>
<if test="userName != null and userName != ''">
AND u.user_name like concat('%', #{userName}, '%')
</if>
<if test="status != null and status != ''">
AND u.status = #{status}
</if>
<if test="phonenumber != null and phonenumber != ''">
AND u.phonenumber like concat('%', #{phonenumber}, '%')
</if>
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
AND date_format(u.create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
</if>
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
AND date_format(u.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
</if>
<if test="deptId != null and deptId != 0">
AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
</if>
</select>
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
select distinct u.user_id, u.dept_id, u.user_name, u.login_name, u.user_type,u.email, u.phonenumber, u.status, u.create_time
from sys_user u
......
......@@ -110,6 +110,11 @@ public class SchoolTeacherVO extends OurBaseEntity {
private Long userId;
private String ddUserId;
private String unionId;
/** 帐号状态(0正常 1停用) */
//@Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
private String status;
......
package yangtz.cs.liu.dingding.controller;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiUserGetuserinfoRequest;
import com.dingtalk.api.request.OapiV2UserGetRequest;
import com.dingtalk.api.response.OapiUserGetuserinfoResponse;
import com.dingtalk.api.response.OapiV2UserGetResponse;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.MpLoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.web.service.MpTokenService;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.system.service.impl.SysUserServiceImpl;
import com.taobao.api.ApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import yangtz.cs.liu.campus.domain.student.SchoolStudent;
import yangtz.cs.liu.campus.domain.student.SchoolStudentEducational;
import yangtz.cs.liu.campus.mapper.student.SchoolStudentMapper;
import yangtz.cs.liu.campus.service.impl.teacher.SchoolTeacherServiceImpl;
import yangtz.cs.liu.campus.service.student.ISchoolStudentEducationalService;
import yangtz.cs.liu.dingding.utils.AccessTokenUtils;
import yangtz.cs.liu.wechat.domain.WxLoginBody;
import yangtz.cs.liu.wechat.service.api.IWxLoginService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static yangtz.cs.liu.wechat.constant.LoginTypeConstant.TEACHER_LOGIN;
/**
*
* 企业内部应用免登
* @author openapi@dingtalk
* 2020-11-3
*/
@RestController
@RequestMapping("/dd/App/user")
public class DdAppLoginController {
@Autowired
private AccessTokenUtils accessTokenUtils;
@Autowired
private SysUserServiceImpl sysUserService;
@Autowired
private IWxLoginService wxLoginService;
@Autowired
private SchoolStudentMapper schoolStudentMapper;
@Autowired
private MpTokenService mpTokenService;
/**
*
* @param code
* @return
* ServiceResult
* 2020-11-3
*/
@RequestMapping(value = "/login", method = RequestMethod.GET)
public AjaxResult login (@RequestParam("code") String code , @RequestParam("roleType") String roleType) throws Exception {
// 获取access_token,注意正式代码要有异常流处理
String access_token= accessTokenUtils.getToken();
// 获取用户信息
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
request.setCode(code);
request.setHttpMethod("GET");
OapiUserGetuserinfoResponse response;
try {
response = client.execute(request, access_token);
} catch (ApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
Long errcode = response.getErrcode();
if (errcode != 0){
return AjaxResult.error(errcode.intValue(),response.getErrmsg());
}
// 查询得到当前用户的userId
// 获得到userId之后应用应该处理应用自身的登录会话管理(session),避免后续的业务交互(前端到应用服务端)每次都要重新获取用户身份,提升用户体验
String userId = response.getUserid();
// 查询得到当前用户的userId
// 获得到userId之后应用应该处理应用自身的登录会话管理(session),避免后续的业务交互(前端到应用服务端)每次都要重新获取用户身份,提升用户体验
if (StringUtils.isEmpty(userId)){
throw new ServiceException("免登码已失效,请重新获取");
}
//获取用户详细信息
Map<String, Object> userInfo = getUserInfo(userId, access_token);
String unionId = (String) userInfo.get("unionId");
SysUser sysUserVo = new SysUser();
sysUserVo.setUserLoginType(roleType);
sysUserVo.setPhonenumber(userInfo.get("phone").toString());
List<SysUser> sysUsers = sysUserService.selectUserListTypeLogin(sysUserVo);
if (sysUsers.isEmpty()){
throw new ServiceException("未查询到该用户信息");
}
SysUser sysUser = sysUsers.get(0);
WxLoginBody wxLoginBody = new WxLoginBody();
wxLoginBody.setPhonenumber(sysUser.getPhonenumber());
wxLoginBody.setType(sysUser.getUserLoginType());
wxLoginBody.setOpenId(unionId);
wxLoginBody.setParentTelephone(sysUser.getPhonenumber());
if (null != sysUser.getStudentId()){
SchoolStudent schoolStudent = schoolStudentMapper.selectByIdCard(sysUser.getStudentId().toString());
wxLoginBody.setStudentIdCard(schoolStudent.getIdCard());
}
wxLoginBody.setParentName(sysUser.getUserName());
wxLoginBody.setTeacherName(sysUser.getUserName());
MpLoginUser user = wxLoginService.ddApplogin(wxLoginBody);
if (StringUtils.isNull(user)) {
return AjaxResult.error("login error");
}
String userName = TEACHER_LOGIN.equals(user.getType()) ? user.getTeacherName() : user.getParentName();
AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
String token = mpTokenService.createToken(user);
return AjaxResult.success().put(Constants.TOKEN, token);
}
/**
* 获取当前手机号有几个角色
*/
@GetMapping("/getRole")
public AjaxResult getRole(@RequestParam("code") String code){
// 获取access_token,注意正式代码要有异常流处理
String access_token= accessTokenUtils.getToken();
// 获取用户信息
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
request.setCode(code);
request.setHttpMethod("GET");
OapiUserGetuserinfoResponse response;
try {
response = client.execute(request, access_token);
} catch (ApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
// 查询得到当前用户的userId
// 获得到userId之后应用应该处理应用自身的登录会话管理(session),避免后续的业务交互(前端到应用服务端)每次都要重新获取用户身份,提升用户体验
String userId = response.getUserid();
Map<String, Object> userInfo = getUserInfo(userId, access_token);
SysUser sysUser = new SysUser();
sysUser.setPhonenumber(userInfo.get("phone").toString());
List<SysUser> sysUsers = sysUserService.selectUserListTypeLogin(sysUser);
if (sysUsers.isEmpty()){
return AjaxResult.error("没有相关角色");
}else if (sysUsers.size() == 1 ){
List<Map<String,String>> mapList = new ArrayList<>();
Map<String,String> map = new HashMap<>();
if (null == sysUsers.get(0).getStudentId()){
map.put("name",sysUsers.get(0).getUserName());
map.put("userLoginType",sysUsers.get(0).getUserLoginType());
}else {
SchoolStudent schoolStudent = schoolStudentMapper.selectById(sysUsers.get(0).getStudentId());
map.put("name",sysUsers.get(0).getUserName());
map.put("userLoginType",sysUsers.get(0).getUserLoginType());
map.put("studentName",schoolStudent.getStudentName());
}
mapList.add(map);
return AjaxResult.success(mapList);
}else if (sysUsers.size()> 1){
List<Map<String,String>> mapList = new ArrayList<>();
sysUsers.forEach(date->{
Map<String,String> map = new HashMap<>();
if (null == date.getStudentId()){
map.put("name",date.getUserName());
map.put("userLoginType",date.getUserLoginType());
}else {
SchoolStudent schoolStudent = schoolStudentMapper.selectById(date.getStudentId());
map.put("name",date.getUserName());
map.put("userLoginType",date.getUserLoginType());
map.put("studentName",schoolStudent.getStudentName());
}
mapList.add(map);
});
return AjaxResult.success(mapList);
}
return AjaxResult.error("未找到用户信息");
}
/**
*
* @param userId
* @param token
* @return
*/
public Map<String,Object> getUserInfo(String userId,String token){
Map<String,Object> map = new HashMap<>();
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(userId);
OapiV2UserGetResponse rsp = client.execute(req, token);
OapiV2UserGetResponse.UserGetResponse result = rsp.getResult();
String name = result.getName();
String phone = result.getMobile();
String unionId = result.getUnionid();
map.put("userName",name);
map.put("phone",phone);
map.put("unionId",unionId);
} catch (ApiException e) {
e.printStackTrace();
}
return map;
}
}
......@@ -13,4 +13,5 @@ public interface IWxLoginService {
* 用户登录
*/
MpLoginUser login(WxLoginBody wxLoginBody);
MpLoginUser ddApplogin(WxLoginBody wxLoginBody);
}
......@@ -46,7 +46,61 @@ public class WxLoginServiceImpl implements IWxLoginService {
private Logger log = LoggerFactory.getLogger(WxLoginServiceImpl.class);
@Override
public MpLoginUser ddApplogin(WxLoginBody wxLoginBody) {
MpLoginUser mpLoginUser = null;
if (TEACHER_LOGIN.equals(wxLoginBody.getType())) {
SysUser sysUser = new SysUser();
sysUser.setUserLoginType(TEACHER_LOGIN);
sysUser.setPhonenumber(wxLoginBody.getPhonenumber());
SysUser user = userMapper.getUser(sysUser);
// 教职工登录
mpLoginUser = loadUserB(wxLoginBody, user);
} else if (PARENT_LOGIN.equals(wxLoginBody.getType())) {
SchoolStudentParent schoolStudentParent = schoolStudentParentMapper.selectUserByParentTel(wxLoginBody.getParentTelephone(), wxLoginBody.getStudentIdCard());
if(StringUtils.isNull(schoolStudentParent)){
throw new ServiceException("学生身份证号或家长手机号输入有误,请检查后重试");
}
mpLoginUser = loadUserByParent(wxLoginBody, schoolStudentParent);
}
return mpLoginUser;
}
public MpLoginUser loadUserB(WxLoginBody wxLoginBody, SysUser user) {
if (StringUtils.isNull(user)) {
throw new ServiceException("登录用户:" + wxLoginBody.getPhonenumber() + " 不存在");
}
if (UserStatus.DISABLE.getCode().equals(user.getDelFlag())) {
throw new ServiceException("对不起,登录用户:" + wxLoginBody.getPhonenumber() + " 已被删除");
} else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
throw new ServiceException("对不起,登录用户:" + wxLoginBody.getPhonenumber() + " 已停用");
}
LambdaQueryWrapper<SchoolTeacher> lqw = new LambdaQueryWrapper<>();
lqw.eq(SchoolTeacher::getId, user.getUserId());
SchoolTeacher schoolTeacher = schoolTeacherMapper.selectOne(lqw);
MpLoginUser loginUser = new MpLoginUser();
loginUser.setOpenId(wxLoginBody.getOpenId());
loginUser.setType(TEACHER_LOGIN);
loginUser.setEmployeeType(user.getEmployeeType());
loginUser.setUserId(user.getUserId());
loginUser.setTeacherId(schoolTeacher.getId());
loginUser.setTeacherName(schoolTeacher.getTeacherName());
loginUser.setTeacherIdCard(schoolTeacher.getIdCard());
loginUser.setTeacherPhonenumber(schoolTeacher.getTeacherTel());
loginUser.setAvatar(user.getAvatar());
/** 更新老师openId */
schoolTeacher.setOpenId(wxLoginBody.getOpenId());
schoolTeacherMapper.updateById(schoolTeacher);
/** 更新用户表openId */
SysUser sysUser = new SysUser();
sysUser.setUserId(user.getUserId());
sysUser.setOpenId(wxLoginBody.getOpenId());
userMapper.updateUser(sysUser);
return loginUser;
}
@Override
public MpLoginUser login(WxLoginBody wxLoginBody) {
MpLoginUser mpLoginUser = null;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment