package com.uas.sso.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.uas.account.entity.UserDetail; import com.uas.account.exception.AccountException; import com.uas.account.support.Page; import com.uas.account.util.AccountUtils; import com.uas.sso.common.util.HttpUtil; import com.uas.sso.core.Const; import com.uas.sso.core.Status; import com.uas.sso.entity.User; import com.uas.sso.entity.UserRecord; import com.uas.sso.entity.UserView; import com.uas.sso.entity.Userspace; import com.uas.sso.service.ApplyUserSpaceService; import com.uas.sso.service.UserService; import com.uas.sso.service.UserspaceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.ModelMap; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.Set; import static org.springframework.data.jpa.domain.AbstractPersistable_.id; /** * 用户信息管理controller * * @author wangmh * @date 2018/1/2 */ @RestController @RequestMapping("/api/user") public class UserManagerController extends BaseController { @Autowired private UserService userService; @Autowired private UserspaceService userspaceService; @Autowired private ApplyUserSpaceService applyUserSpaceService; /** * 用户信息新增、修改 * * @param userView * @return */ @RequestMapping(method = RequestMethod.POST) @ResponseBody public ModelMap apiSave(@RequestBody UserView userView, String appId) { if (userView == null || appId == null) { throw new AccountException("参数错误"); } User user = new User(); if (userView.getUserUU() != null) { user = userService.findOne(userView.getUserUU()); } return success(userService.save(user)); } /** * 校验手机号是否被注册 * * @param mobile 手机号 * @return */ @RequestMapping(value = "/checkMobile", method = RequestMethod.GET) public ModelMap checkMobile(String mobile) { return new ModelMap("hasRegister", userService.mobileHasRegistered(mobile)); } /** * 校验真实姓名是否被认证 * * @author wangmh * @date 2018/1/11 15:05 * @param realName 真实姓名 * @return */ @RequestMapping(value = "/realName/valid", method = RequestMethod.GET) public ModelMap realNameIsValid(String realName) { return success(new ModelMap("isValid", userService.realNameIsValid(realName))); } /** * 校验身份证号是否被认证 * * @author wangmh * @date 2018/1/11 15:06 * @param idCard 身份证号 * @return {"isValid", b} b为true说明已认证 */ @RequestMapping(value = "/idCard/valid", method = RequestMethod.GET) public ModelMap idCardIsValid(String idCard) { return success(new ModelMap("isValid", userService.idCardIsValid(idCard))); } /** * 根据企业uu号查询企业下所有用户信息 * @author wangmh * @date 2018/1/26 14:43 * @param page 当前页数 * @param size 每页大小 * @param spaceUU 企业uu号 * @return org.springframework.data.domain.Page, content 为用户信息集合 */ @RequestMapping(value = "/find/member", method = RequestMethod.GET) public ModelMap findMember(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, Long spaceUU) { return success(userService.findMemberBySpaceUU(page, size, spaceUU)); } /** * 根据用户uu号查询用户信息 * @author wangmh * @date 2018/1/26 14:46 * @param userUU 用户uu号 * @return 用户信息 */ @RequestMapping(value = "/info", method = RequestMethod.GET) public ModelMap findOne(@RequestParam Long userUU) { return success(userService.findOne(userUU)); } /** * 用户申请绑定企业 * * @author wangmh * @date 2018/1/31 18:22 * @param userUU 用户uu号 * @param spaceUU 企业uu奥 * @return 用户信息 */ @RequestMapping(value = "/apply/bind", method = RequestMethod.POST) public ModelMap bindUserSpace(@RequestParam Long userUU, Long spaceUU) { applyUserSpaceService.applyBindUserSpace(userUU, spaceUU); return success(); } /** * 根据用户uu号查询分页查询申请信息 * @param userUU 用户uu号 * @param page 当前页,默认值为1 * @param size 每页大小,默认值为20 * @return org.springframework.data.domain.Page,content为ApplyUserSpace集合 */ @RequestMapping(value = "/apply/info", method = RequestMethod.GET) public ModelMap findApplyInfo(Long userUU, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) { return success(applyUserSpaceService.findApplyByUserUU(userUU, page, size)); } /** * 用户解除绑定企业 * @param userUU 企业uu号 * @param spaceUU 企业uu号 * @return */ @RequestMapping(params = "_operate=unbind", method = RequestMethod.POST) public ModelMap unbindUserSpace(Long userUU, Long spaceUU) { if (StringUtils.isEmpty(userUU) || StringUtils.isEmpty(spaceUU)) { return error("参数错误"); } userService.unbindUserspace(userUU, spaceUU); return success(); } /** * 企业添加已注册用户 * @param userUU 企业uu号 * @param spaceUU 企业uu号 * @return */ @RequestMapping(params = "_operate=bind", method = RequestMethod.POST) public ModelMap addUser(Long userUU, Long spaceUU) { if (StringUtils.isEmpty(userUU) || StringUtils.isEmpty(spaceUU)) { return error("参数错误"); } userService.bindUserspace(userUU, spaceUU); return success(); } /** * 企业添加已注册用户 * @param user 用户信息 * @param spaceUU 企业uu号 * @return */ @RequestMapping(params = "_operate=add", method = RequestMethod.POST) public ModelMap addUser(User user, Long spaceUU) { // 参数判断 if (user == null || user.getUserUU() != null || spaceUU == null) { return error("参数错误"); } // 注册新用户,无密码则使用默认密码 if (StringUtils.isEmpty(user.getPassword())) { user.setPassword("111111"); } user = userService.register(user); // 绑定企业 userService.bindUserspace(user.getUserUU(), spaceUU); return success(user); } /** * 接口调用验证密码登录 * *
     * 这个比较特殊,指定应用可能密码为空,需要借用其他应用的密码来校验
     * 
* * @return */ @RequestMapping(params = "_operate=fuzzyCheck") public ModelMap apiFuzzyLogin(User user) { if (null == user || null == user.getPassword()) { return error("参数错误"); } if (!StringUtils.isEmpty(user.getMobile())) { User userInfo = userService.findByMobile(user.getMobile()); if (userInfo == null) { return error("未找到用户"); } // 允许应用在调用该接口前,已经将用户输入的明文加密为密文 String encryPwd = user.getPassword().length() >= 32 ? user.getPassword() : userService.getEncryPassword( Const.ENCRY_FORMAT, user.getPassword(), userInfo.getSalt()); if (encryPwd.equals(userInfo.getPassword())) { return success(); } return error("密码错误"); } return error("请填写手机号"); } @RequestMapping("/update/password/{userUU}/{spaceUU}") public ModelMap updatePassword(@PathVariable Long userUU, @PathVariable Long spaceUU, String password) { // 获取企业密钥 Userspace userspace = userspaceService.findOne(spaceUU); // 校验请求 checkRequest(userspace.getAccessSecret()); // 修改密码 userService.updatePassword(userUU, password); return success(); } /** * 数据从旧账户中心同步 * @return */ @RequestMapping(value = "/sync", method = RequestMethod.GET) public ModelMap sync(@RequestParam(defaultValue = "1") int pageNumber, @RequestParam(defaultValue = "20") int pageSize, @RequestParam(defaultValue = "true") boolean isAll) { Page pUsers = null; List repeatMobile = new ArrayList<>(); do { // 获取数据 try { pUsers = AccountUtils.findAllUserDetail(null, null, pageNumber++, pageSize); } catch (Exception e) { writerToFile("pageNumber" + (pageNumber-1), null, e.getMessage()); } int i = 1; String lastMobile = null; System.out.println("------------ start pageNumber:"+(pageNumber-1)+"pageSize"+pageSize+"-------------"); for (UserDetail detail : pUsers.getContent()) { try { // 将数据保存 if (lastMobile != null && lastMobile.equals(detail.getMobile())) { repeatMobile.add(lastMobile); } saveUser(detail); lastMobile = detail.getMobile(); System.out.println(((pageNumber - 2) * pageSize + i++) + "\t" + detail.getMobile() + "\t" + detail.getName()); } catch (Exception e) { writerToFile("pageNumber:"+(pageNumber-1)+"pageSize"+pageSize, detail.getMobile(), e.getMessage()); } } System.out.println("------------ end pageNumber:"+(pageNumber-1)+"pageSize"+pageSize+"-------------"); } while (isAll && (pUsers == null || !pUsers.isLast())); updateEmailUnique(); return success(repeatMobile); } private void updateEmailUnique() { List emails = userService.findRepeatEmail(); for (String email : emails) { List users = userService.findByEmail(email); for (int i = 0; i userInfos = AccountUtils.getUserInfoByUid(detail.getMobile()); boolean updateB2b = false; for (com.uas.account.entity.User userInfo : userInfos) { // 设置密码、盐值、uu号 if (userInfo.getAppId().equals("b2b")) { // 判断是否修改过有关b2b的数据 if (updateB2b) { continue; } // 用户uu号,盐值,密码都不为空则认为是正确的数据 if (!StringUtils.isEmpty(userInfo.getDialectUID()) && !StringUtils.isEmpty(userInfo.getSalt()) && !StringUtils.isEmpty(userInfo.getPassword())) { user.setUserUU(Long.parseLong(userInfo.getDialectUID())); user.setPassword(userInfo.getPassword()); user.setSalt(userInfo.getSalt()); updateB2b = true; } } // 设置imId if (StringUtils.isEmpty(user.getImId()) && userInfo.getAppId().equals("im")) { user.setImId(userInfo.getDialectUID()); continue; } } // 没有uu号先记录,而外处理,不能自动生成 if (StringUtils.isEmpty(user.getUserUU())) { // 去b2b 获取,手机号为自动生成的则用邮箱 Long userUU = getUserUUFromB2B(user.getMobile().startsWith("mobile") ? user.getEmail() : user.getMobile()); user.setUserUU(userUU); } // 密码为空处理 if (StringUtils.isEmpty(user.getPassword())) { user.setPassword(userService.getEncryPassword(Const.ENCRY_FORMAT, "111111", user.getSalt())); } userService.save(user); UserRecord userRecord = new UserRecord(); userRecord.setLastLoginTime(StringUtils.isEmpty(detail.getLastLoginTime()) ? null : new Timestamp(detail.getLastLoginTime())); userRecord.setUserUU(user.getUserUU()); userService.save(userRecord); } private Long getUserUUFromB2B(String keyword) { String url = "http://192.168.253.66:8090/platform-b2b"; url = url + "/searchUser"; Long userUU = null; try { HttpUtil.ResponseWrap responseWrap = HttpUtil.doGet(url, new ModelMap("keyWord", keyword)); if (responseWrap.isSuccess()) { JSONObject userInfo = JSON.parseObject(responseWrap.getContent()); userUU = (Long) userInfo.get("userUU"); } } catch (Exception e) { e.printStackTrace(); writerToFile(keyword, "获取"+keyword+"uu号", e.getMessage()); } return userUU; } /** * 写入日志 * @param mobile 用户手机号 * @param message 错误信息 */ private void writerToFile(String id, String mobile, String message) { FileWriter fw = null; try { //如果文件存在,则追加内容;如果文件不存在,则创建文件 File f=new File("logs/user.log"); fw = new FileWriter(f, true); } catch (IOException e) { e.printStackTrace(); } PrintWriter pw = new PrintWriter(fw); pw.println(id + "\t" + mobile + "\t" + message); pw.flush(); try { fw.flush(); pw.close(); fw.close(); } catch (IOException e) { e.printStackTrace(); } } }