package com.uas.sso.controller; import com.alibaba.fastjson.JSON; import com.uas.sso.AccountConfig; import com.uas.sso.SSOHelper; import com.uas.sso.SSOToken; import com.uas.sso.foreign.bihe.entity.BiHeInfo; import com.uas.sso.core.PasswordStrength; import com.uas.sso.core.Status; import com.uas.sso.core.Step; import com.uas.sso.core.Type; import com.uas.sso.entity.*; import com.uas.sso.logging.LoggerManager; import com.uas.sso.logging.RegisterBufferedLogger; import com.uas.sso.service.AppService; import com.uas.sso.service.UserAccountService; import com.uas.sso.service.UserService; import com.uas.sso.service.UserspaceService; import com.uas.sso.util.PasswordLevelUtils; import com.uas.sso.foreign.weixin.entity.OAuthInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import java.util.Optional; /** * 企业注册controller * * @author wangmh * @date 2018/1/4 */ @RequestMapping("/sso/userspace/register") @Controller public class UserspaceRegisterController extends BaseController { @Autowired private UserService userService; @Autowired private UserspaceService userspaceService; @Autowired private UserAccountService userAccountService; @Autowired private AppService appService; private RegisterBufferedLogger registerLogger = LoggerManager.getLogger(RegisterBufferedLogger.class); /** * 企业注册第一步,验证手机号 * * @param mobile 手机号 * @param code 验证码 * @param token 验证码tokenId * @return */ @RequestMapping(value = "/checkAdminTel", method = RequestMethod.POST) @ResponseBody public ModelMap checkAdminTel(String mobile, String code, String token, String appId) { // 校验验证码 checkMobileCode(token, mobile, code); // 设置返回数据 ModelMap data = new ModelMap(); User user = userService.findByMobile(mobile); if (user == null) { data.put("hasRegister", false); } else { data.put("hasRegister", true); data.put("hasEmail", !StringUtils.isEmpty(user.getEmail())); } request.getSession().setAttribute("mobile", mobile); // 删除token tokenService.delete(token); // 添加日志 appId = StringUtils.isEmpty(appId) ? AccountConfig.ACCOUNT_CENTER : appId; registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.FIRST.getValue(), "企业注册", mobile, appId); return success(data); } /** * 企业注册第二步,填写企业信息 * * @param userspace 企业信息 * @return */ @RequestMapping(method = RequestMethod.POST) @ResponseBody public ModelMap register(Userspace userspace, User user, String appId, String baseUrl, String t) { // 获取企业信息 String spaceName = userspace.getSpaceName(); String businessCode = userspace.getBusinessCode(); String adminName = user.getVipName(); String password = user.getPassword(); String adminEmail = user.getEmail(); // 校验参数 appId = StringUtils.isEmpty(appId) ? AccountConfig.ACCOUNT_CENTER : appId; String mobile = (String) request.getSession().getAttribute("mobile"); if (StringUtils.isEmpty(mobile)) { return error("请刷新后重试"); } if (StringUtils.isEmpty(spaceName)) { return error("请填写正确的企业名称"); } if (StringUtils.isEmpty(businessCode)) { return error("请填写正确的企业营业执照号"); } if (StringUtils.isEmpty(password)) { return error("密码不能为空"); } User admin = userService.findByMobile(mobile); if (admin == null) { // 新用户: 管理员名称,密码不能为空 if (StringUtils.isEmpty(adminName)) { return error("请填写正确的管理员名称"); } // 新用户要校验密码强度 PasswordStrength strength = PasswordLevelUtils.checkPasswordLevel(password); if (PasswordStrength.WEAK.getValue() == strength.getValue()) { return error("密码须为8-20字符的英文、数字混合"); } } // 设置企业管理员信息 if (admin == null) { // 新用户直接注册 admin = new User(); admin.setMobile(mobile); admin.setVipName(adminName); admin.setPassword(password); admin.setEmail(adminEmail); } else { // 老用户校验密码 userService.checkPassword(admin.getUserUU(), user.getPassword(), false); // 老用户邮箱不为已认证的话设置邮箱 if (admin.getEmailValidCode() != Status.AUTHENTICATED.getCode()) { admin.setEmail(adminEmail); admin.setEmailValidCode((short) Status.NOT_APPLYING.getCode()); } } // 设置第三方id if (!StringUtils.isEmpty(t)) { Token unionidToken = tokenService.findOne(t); Optional optionalMap = Optional.ofNullable(unionidToken).map(value -> (ModelMap) value.getBind()); String type = optionalMap.map(value -> (String) value.get("type")).orElse(null); switch (type) { case "weixin": admin.setWxUnionid(optionalMap.map(value -> (OAuthInfo) value.get("data")).map(OAuthInfo::getUnionid).orElse(null)); break; case "bihe": admin.setBhOpenId(optionalMap.map(value -> (BiHeInfo) value.get("data")).map(BiHeInfo::getOpenId).orElse(null)); break; default: break; } tokenService.delete(t); } // 企业注册 userspace.setAdmin(admin); userspace = userspaceService.register(userspace, appId); // 发送邮件和短信 ModelMap info = new ModelMap(); info.addAttribute("enname", userspace.getSpaceName()); info.addAttribute("enuu", userspace.getSpaceUU()); sendEmail("templateForSendMailAfterRegister", admin.getEmail(), info); sendSms("templateForSendSmsAfterRegister", admin.getMobile(), userspace.getSpaceName(), userspace.getSpaceUU()); // 添加日志 registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.SECOND.getValue(), "企业注册", userspace, appId); App app = appService.findOne(appId); if ("mall".equals(appId)) { UserAccount userAccount = userAccountService.findOneByUserUU(appId, admin.getUserUU(), userspace.getSpaceUU()); List loginUrls = appService.findAllLoginUrl(); ModelMap data = new ModelMap(); data.addAttribute("data", userAccount) .addAttribute("loginUrls", loginUrls) .addAttribute("currentUrl", baseUrl) .addAttribute("type", "mall"); SSOToken st = new SSOToken(request, userAccount.getMobile()); st.setData(JSON.toJSONString(userAccount)); SSOHelper.setSSOCookie(request, response, st, true); return success(data); } else if ("city".equals(appId) || "city".equals(app.getUserControl())) { UserAccount userAccount = userAccountService.findOneByUserUU(appId, admin.getUserUU(), userspace.getSpaceUU()); List loginUrls = appService.findAllLoginUrl(); ModelMap data = new ModelMap(); data.addAttribute("bgImage", "https://dfs.ubtob.com/group1/M00/88/AE/CgpkyFsPxC-ADHD8ACBM14PiAS8632.png") .addAttribute("type", "city"); data.addAttribute("data", userAccount) .addAttribute("loginUrls", loginUrls) .addAttribute("currentUrl", baseUrl); SSOToken st = new SSOToken(request, userAccount.getMobile()); st.setData(JSON.toJSONString(userAccount)); SSOHelper.setSSOCookie(request, response, st, true); return success(data); } return success(); } /** * 获取验证码 * * @param mobile 手机号 * @param mobileArea * @return success(tokenId) */ @RequestMapping(value = "/checkCode", method = RequestMethod.GET) @ResponseBody public ModelMap getCode(String mobile, String mobileArea) { // 校验手机号 checkMobile(mobile, mobileArea); // 获取验证码 String token = getMobileToken(mobile); // 设置返回数据 ModelMap data = new ModelMap(); data.put("token", token); data.put("code", request.getSession().getAttribute("code")); request.getSession().setAttribute("token", token); return data; } /** * 校验验证码 * * @param code 验证码 * @param token 验证码tokenId * @return 验证成功:success() */ @RequestMapping(value = "/checkCode", method = RequestMethod.POST) @ResponseBody public ModelMap checkCode(String token, String mobile, String code) { // 校验token是否正确 String sessionToken = (String) request.getSession().getAttribute("token"); if (StringUtils.isEmpty(sessionToken) || !sessionToken.equals(token)) { return error("请重新获取验证码"); } // 校验验证码 checkMobileCode(token, mobile, code); // 设置返回值 return success(); } }