UserManagerController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. package com.uas.sso.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.uas.account.entity.UserDetail;
  5. import com.uas.account.exception.AccountException;
  6. import com.uas.account.support.Page;
  7. import com.uas.account.util.AccountUtils;
  8. import com.uas.sso.common.util.HttpUtil;
  9. import com.uas.sso.core.Const;
  10. import com.uas.sso.core.Status;
  11. import com.uas.sso.entity.*;
  12. import com.uas.sso.service.ApplyUserSpaceService;
  13. import com.uas.sso.service.UserService;
  14. import com.uas.sso.service.UserspaceService;
  15. import org.apache.commons.codec.binary.Base64;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.ui.ModelMap;
  18. import org.springframework.util.StringUtils;
  19. import org.springframework.web.bind.annotation.*;
  20. import java.io.*;
  21. import java.sql.Timestamp;
  22. import java.text.SimpleDateFormat;
  23. import java.util.ArrayList;
  24. import java.util.Date;
  25. import java.util.List;
  26. import java.util.Set;
  27. /**
  28. * 用户信息管理controller
  29. *
  30. * @author wangmh
  31. * @date 2018/1/2
  32. */
  33. @RestController
  34. @RequestMapping("/api/user")
  35. public class UserManagerController extends BaseController {
  36. @Autowired
  37. private UserService userService;
  38. @Autowired
  39. private UserspaceService userspaceService;
  40. @Autowired
  41. private ApplyUserSpaceService applyUserSpaceService;
  42. /**
  43. * 用户信息新增、修改
  44. *
  45. * @param userView
  46. * @return
  47. */
  48. @RequestMapping(method = RequestMethod.POST)
  49. @ResponseBody
  50. public ModelMap apiSave(@RequestBody UserView userView, String appId) {
  51. if (userView == null || appId == null) {
  52. throw new AccountException("参数错误");
  53. }
  54. User user = new User();
  55. if (userView.getUserUU() != null) {
  56. user = userService.findOne(userView.getUserUU());
  57. }
  58. return success(userService.save(user));
  59. }
  60. /**
  61. * 校验手机号是否被注册
  62. *
  63. * @param mobile 手机号
  64. * @return
  65. */
  66. @RequestMapping(value = "/checkMobile", method = RequestMethod.GET)
  67. public ModelMap checkMobile(String mobile) {
  68. return new ModelMap("hasRegister", userService.mobileHasRegistered(mobile));
  69. }
  70. /**
  71. * 校验手机号是否被注册
  72. *
  73. * @param email 手机号
  74. * @return
  75. */
  76. @RequestMapping(value = "/checkEmail", method = RequestMethod.GET)
  77. public ModelMap checkEmail(String email) {
  78. return new ModelMap("hasRegister", userService.emailHasRegistered(email));
  79. }
  80. /**
  81. * 校验真实姓名是否被认证
  82. *
  83. * @author wangmh
  84. * @date 2018/1/11 15:05
  85. * @param realName 真实姓名
  86. * @return
  87. */
  88. @RequestMapping(value = "/realName/valid", method = RequestMethod.GET)
  89. public ModelMap realNameIsValid(String realName) {
  90. return success(new ModelMap("isValid", userService.realNameIsValid(realName)));
  91. }
  92. /**
  93. * 校验身份证号是否被认证
  94. *
  95. * @author wangmh
  96. * @date 2018/1/11 15:06
  97. * @param idCard 身份证号
  98. * @return {"isValid", b} b为true说明已认证
  99. */
  100. @RequestMapping(value = "/idCard/valid", method = RequestMethod.GET)
  101. public ModelMap idCardIsValid(String idCard) {
  102. return success(new ModelMap("isValid", userService.idCardIsValid(idCard)));
  103. }
  104. /**
  105. * 根据企业uu号查询企业下所有用户信息
  106. * @author wangmh
  107. * @date 2018/1/26 14:43
  108. * @param page 当前页数
  109. * @param size 每页大小
  110. * @param spaceUU 企业uu号
  111. * @return org.springframework.data.domain.Page, content 为用户信息集合
  112. */
  113. @RequestMapping(value = "/find/member", method = RequestMethod.GET)
  114. public ModelMap findMember(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, Long spaceUU) {
  115. return success(userService.findMemberBySpaceUU(page, size, spaceUU));
  116. }
  117. /**
  118. * 根据用户uu号查询用户信息
  119. * @author wangmh
  120. * @date 2018/1/26 14:46
  121. * @param userUU 用户uu号
  122. * @return 用户信息
  123. */
  124. @RequestMapping(value = "/info", method = RequestMethod.GET)
  125. public ModelMap findOne(@RequestParam Long userUU) {
  126. return success(userService.findOne(userUU));
  127. }
  128. /**
  129. * 用户申请绑定企业
  130. *
  131. * @author wangmh
  132. * @date 2018/1/31 18:22
  133. * @param userUU 用户uu号
  134. * @param spaceUU 企业uu奥
  135. * @return 用户信息
  136. */
  137. @RequestMapping(value = "/apply/bind", method = RequestMethod.POST)
  138. public ModelMap bindUserSpace(@RequestParam Long userUU, Long spaceUU) {
  139. applyUserSpaceService.applyBindUserSpace(userUU, spaceUU);
  140. User user = userService.findOne(userUU);
  141. Userspace userspace = userspaceService.findOne(spaceUU);
  142. // 发送邮箱通知管理员
  143. SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
  144. ModelMap data = new ModelMap();
  145. data.put("username", user.getVipName());
  146. data.put("time", format.format(new Date()));
  147. data.put("enName", userspace.getSpaceName());
  148. sendEmail("templateForSendMailWhenApplyUserSpace", userspace.getAdmin().getEmail(), data);
  149. // 发送短信通知管理员
  150. sendSms("templateForSendSmsWhenApplyUserSpace", userspace.getAdmin().getMobile(), user.getVipName(), format.format(new Date()), userspace.getSpaceName());
  151. return success();
  152. }
  153. /**
  154. * 根据用户uu号查询分页查询申请信息
  155. * @param userUU 用户uu号
  156. * @param page 当前页,默认值为1
  157. * @param size 每页大小,默认值为20
  158. * @return org.springframework.data.domain.Page,content为ApplyUserSpace集合
  159. */
  160. @RequestMapping(value = "/apply/info", method = RequestMethod.GET)
  161. public ModelMap findApplyInfo(Long userUU, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) {
  162. return success(applyUserSpaceService.findApplyByUserUU(userUU, page, size));
  163. }
  164. /**
  165. * 用户解除绑定企业
  166. * @param userUU 企业uu号
  167. * @param spaceUU 企业uu号
  168. * @return
  169. */
  170. @RequestMapping(params = "_operate=unbind", method = RequestMethod.POST)
  171. public ModelMap unbindUserSpace(Long userUU, Long spaceUU) {
  172. if (StringUtils.isEmpty(userUU) || StringUtils.isEmpty(spaceUU)) {
  173. return error("参数错误");
  174. }
  175. userService.unbindUserspace(userUU, spaceUU);
  176. return success();
  177. }
  178. /**
  179. * 企业添加已注册用户
  180. * @param userUU 企业uu号
  181. * @param spaceUU 企业uu号
  182. * @return
  183. */
  184. @RequestMapping(params = "_operate=bind", method = RequestMethod.POST)
  185. public ModelMap addUser(String appId, Long userUU, Long spaceUU) {
  186. if (StringUtils.isEmpty(userUU) || StringUtils.isEmpty(spaceUU)) {
  187. return error("参数错误");
  188. }
  189. userService.bindUserspace(appId, userUU, spaceUU);
  190. return success();
  191. }
  192. /**
  193. * 企业添加已注册用户
  194. * @param user 用户信息
  195. * @param spaceUU 企业uu号
  196. * @return
  197. */
  198. @RequestMapping(params = "_operate=add", method = RequestMethod.POST)
  199. public ModelMap addUser(String appId, User user, Long spaceUU) {
  200. // 参数判断
  201. if (user == null || user.getUserUU() != null || spaceUU == null) {
  202. return error("参数错误");
  203. }
  204. // 根据手机号判断用户是否为新用户,新用户注册,旧用户绑定
  205. User oldUser = userService.findByMobile(user.getMobile());
  206. if (oldUser == null) {
  207. // 注册新用户,无密码则使用默认密码
  208. if (StringUtils.isEmpty(user.getPassword())) {
  209. user.setPassword("111111");
  210. }
  211. user = userService.register(user);
  212. } else {
  213. user = oldUser;
  214. }
  215. // 绑定企业
  216. userService.bindUserspace(appId, user.getUserUU(), spaceUU);
  217. return success(user);
  218. }
  219. /**
  220. * 接口调用验证密码登录
  221. *
  222. * <pre>
  223. * 这个比较特殊,指定应用可能密码为空,需要借用其他应用的密码来校验
  224. * </pre>
  225. *
  226. * @return
  227. */
  228. @RequestMapping(params = "_operate=fuzzyCheck")
  229. public ModelMap apiFuzzyLogin(User user) {
  230. if (null == user || null == user.getPassword()) {
  231. return error("参数错误");
  232. }
  233. if (!StringUtils.isEmpty(user.getMobile())) {
  234. User userInfo = userService.findByMobile(user.getMobile());
  235. if (userInfo == null) {
  236. return error("未找到用户");
  237. }
  238. // 允许应用在调用该接口前,已经将用户输入的明文加密为密文
  239. String encryPwd = user.getPassword().length() >= 32 ? user.getPassword() : userService.getEncryPassword(
  240. Const.ENCRY_FORMAT, user.getPassword(), userInfo.getSalt());
  241. if (encryPwd.equals(userInfo.getPassword())) {
  242. return success();
  243. }
  244. return error("密码错误");
  245. }
  246. return error("请填写手机号");
  247. }
  248. @RequestMapping(value = "/update/password/{userUU}/{spaceUU}", method = RequestMethod.POST)
  249. public ModelMap updatePassword(@PathVariable Long userUU, @PathVariable Long spaceUU, String password) {
  250. // 获取企业密钥
  251. Userspace userspace = userspaceService.findOne(spaceUU);
  252. // 校验请求
  253. checkRequest(userspace.getAccessSecret());
  254. // 修改密码
  255. userService.updatePassword(userUU, password);
  256. return success();
  257. }
  258. /**
  259. * 众创商机导入注册
  260. * @param user 用户信息(主要是用户名,手机号,邮箱和密码,密码base64加密)
  261. * @return
  262. */
  263. @RequestMapping(value = "/sysUserdata/uuzc", method = RequestMethod.POST)
  264. public ModelMap uuzcRegister(User user) {
  265. // 校验手机号
  266. checkMobile(user.getMobile(), null);
  267. // 用户名不能为空
  268. if (StringUtils.isEmpty(user.getVipName())) {
  269. return error("用户名不能为空");
  270. }
  271. // 获取密码
  272. try {
  273. String pwd = new String(Base64.decodeBase64(user.getPassword().getBytes("utf-8")), "utf-8");
  274. user.setPassword(pwd);
  275. } catch (UnsupportedEncodingException e) {
  276. e.printStackTrace();
  277. }
  278. // 传来的值可能带有uu号,去除uu号
  279. user.setUserUU(null);
  280. user = userService.register(user);
  281. return success(user.getUserUU());
  282. }
  283. @RequestMapping(value = "/getUserByToken", method = RequestMethod.GET)
  284. public ModelMap findUserByToken(String token) {
  285. Token existToken = tokenService.findOne(token);
  286. if (existToken == null) {
  287. return error("验证过期");
  288. }
  289. ModelMap data = (ModelMap) existToken.getBind();
  290. User user = userService.findOne((Long) data.get("userUU"));
  291. return success(user);
  292. }
  293. /**
  294. * APP端
  295. * @return
  296. */
  297. @RequestMapping("/getSpace")
  298. public ModelMap getSpace(String mobile) {
  299. User user = userService.findByMobile(mobile);
  300. Set<Userspace> userSpaces = user.getUserSpaces();
  301. ModelMap data = new ModelMap(user);
  302. data.put("spaces", userSpaces);
  303. return data;
  304. }
  305. /**
  306. * 数据从旧账户中心同步
  307. * @return
  308. */
  309. @RequestMapping(value = "/sync", method = RequestMethod.GET)
  310. public ModelMap sync(@RequestParam(defaultValue = "1") int pageNumber, @RequestParam(defaultValue = "20") int pageSize, @RequestParam(defaultValue = "true") boolean isAll, String mobile) {
  311. Page<UserDetail> pUsers = null;
  312. List<String> repeatMobile = new ArrayList<>();
  313. String lastMobile = null;
  314. do {
  315. // 获取数据
  316. try {
  317. pUsers = AccountUtils.findAllUserDetail(null, mobile, pageNumber++, pageSize);
  318. } catch (Exception e) {
  319. writerToFile("pageNumber" + (pageNumber-1), null, e.getMessage());
  320. }
  321. int i = 1;
  322. System.out.println("------------ start pageNumber:"+(pageNumber-1)+" pageSize:"+pageSize+"-------------");
  323. for (UserDetail detail : pUsers.getContent()) {
  324. try {
  325. // 将数据保存
  326. if (lastMobile != null && lastMobile.equals(detail.getMobile())) {
  327. repeatMobile.add(lastMobile);
  328. }
  329. saveUser(detail);
  330. lastMobile = detail.getMobile();
  331. System.out.println(((pageNumber - 2) * pageSize + i++) + "\t" + detail.getMobile() + "\t" + detail.getName());
  332. } catch (Exception e) {
  333. writerToFile((pageNumber-1) + "\t" + i++, detail.getMobile(), e.getMessage());
  334. }
  335. }
  336. System.out.println("------------ end pageNumber:"+(pageNumber-1)+"pageSize"+pageSize+"-------------");
  337. } while (isAll && (pUsers == null || !pUsers.isLast()));
  338. // updateEmailUnique();
  339. return success(repeatMobile);
  340. }
  341. private void updateEmailUnique() {
  342. List<String> emails = userService.findRepeatEmail();
  343. for (String email : emails) {
  344. List<User> users = userService.findByEmail(email);
  345. for (int i = 0; i<users.size(); i++) {
  346. User user = users.get(i);
  347. user.setEmail(email + Const.REPEAT_SEPARATOR + (i + 1));
  348. user.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
  349. userService.save(user);
  350. }
  351. }
  352. }
  353. public void saveUser(UserDetail detail) throws Exception {
  354. User user = new User();
  355. if (StringUtils.isEmpty(detail.getMobile()) && StringUtils.isEmpty(detail.getEmail())) {
  356. return;
  357. }
  358. // 手机号判空,正则判断
  359. if (StringUtils.isEmpty(detail.getMobile())) {
  360. user.setMobile("mobile" + System.currentTimeMillis());
  361. user.setMobileValidCode((short) Status.NOT_APPLYING.getCode());
  362. } else {
  363. user.setMobile(detail.getMobile().trim());
  364. user.setMobileValidCode(user.getMobile().matches(Const.REGEXP_MOBILE_CONTINENT) ? (short) Status.AUTHENTICATED.getCode() : (short) Status.NOT_APPLYING.getCode());
  365. }
  366. // 邮箱判空,正则判断
  367. if (StringUtils.isEmpty(detail.getEmail())) {
  368. user.setEmail(null);
  369. user.setEmailValidCode((short) Status.NOT_APPLYING.getCode());
  370. } else {
  371. user.setEmail(detail.getEmail().trim());
  372. user.setEmailValidCode(user.getEmail().matches(Const.REGEXP_MOBILE_CONTINENT) ? (short) Status.AUTHENTICATED.getCode() : (short) Status.NOT_APPLYING.getCode());
  373. }
  374. // 身份认证状态未申请
  375. user.setIdentityValidCode((short) Status.NOT_APPLYING.getCode());
  376. // 注册时间,现在时间
  377. user.setRegisterDate(new Timestamp(System.currentTimeMillis()));
  378. // 无用户名则为用户加时间戳
  379. user.setVipName(StringUtils.isEmpty(detail.getName()) ? "用户"+System.currentTimeMillis() : detail.getName().trim());
  380. // 获取密码,uu号,颜值,IMID
  381. List<com.uas.account.entity.User> userInfos = AccountUtils.getUserInfoByUid(detail.getMobile());
  382. boolean updateB2b = false;
  383. for (com.uas.account.entity.User userInfo : userInfos) {
  384. // 设置密码、盐值、uu号
  385. if (userInfo.getAppId().equals("b2b")) {
  386. // 判断是否修改过有关b2b的数据
  387. if (updateB2b) {
  388. continue;
  389. }
  390. // 用户uu号,盐值,密码都不为空则认为是正确的数据
  391. if (!StringUtils.isEmpty(userInfo.getDialectUID()) && !StringUtils.isEmpty(userInfo.getSalt()) && !StringUtils.isEmpty(userInfo.getPassword())) {
  392. user.setUserUU(Long.parseLong(userInfo.getDialectUID()));
  393. user.setPassword(userInfo.getPassword());
  394. user.setSalt(userInfo.getSalt());
  395. updateB2b = true;
  396. }
  397. }
  398. // 设置imId
  399. if (StringUtils.isEmpty(user.getImId()) && userInfo.getAppId().equals("im")) {
  400. user.setImId(userInfo.getDialectUID());
  401. continue;
  402. }
  403. }
  404. // 没有uu号先记录,而外处理,不能自动生成
  405. if (StringUtils.isEmpty(user.getUserUU())) {
  406. // 去b2b 获取,手机号为自动生成的则用邮箱
  407. Long userUU = getUserUUFromB2B(user.getMobile().startsWith("mobile") ? user.getEmail() : user.getMobile());
  408. user.setUserUU(userUU);
  409. }
  410. // 密码为空处理
  411. if (StringUtils.isEmpty(user.getPassword())) {
  412. user.setPassword(userService.getEncryPassword(Const.ENCRY_FORMAT, "111111", user.getSalt()));
  413. }
  414. userService.save(user);
  415. UserRecord userRecord = new UserRecord();
  416. userRecord.setLastLoginTime(StringUtils.isEmpty(detail.getLastLoginTime()) ? null : new Timestamp(detail.getLastLoginTime()));
  417. userRecord.setUserUU(user.getUserUU());
  418. userService.save(userRecord);
  419. }
  420. private Long getUserUUFromB2B(String keyword) {
  421. String url = "http://10.1.51.50:8090/platform-b2b";
  422. url = url + "/account/user/searchUser";
  423. Long userUU = null;
  424. try {
  425. HttpUtil.ResponseWrap responseWrap = HttpUtil.doGet(url, new ModelMap("keyWord", keyword));
  426. if (responseWrap.isSuccess()) {
  427. JSONObject userInfo = JSON.parseObject(responseWrap.getContent());
  428. userUU = Long.valueOf(userInfo.get("userUU").toString());
  429. }
  430. } catch (Exception e) {
  431. e.printStackTrace();
  432. writerToFile(keyword, "获取"+keyword+"uu号", e.getMessage());
  433. }
  434. return userUU;
  435. }
  436. /**
  437. * 写入日志
  438. * @param mobile 用户手机号
  439. * @param message 错误信息
  440. */
  441. private void writerToFile(String id, String mobile, String message) {
  442. FileWriter fw = null;
  443. try {
  444. //如果文件存在,则追加内容;如果文件不存在,则创建文件
  445. File f=new File("logs/user.log");
  446. fw = new FileWriter(f, true);
  447. } catch (IOException e) {
  448. e.printStackTrace();
  449. }
  450. PrintWriter pw = new PrintWriter(fw);
  451. pw.println(id + "\t" + mobile + "\t" + message);
  452. pw.flush();
  453. try {
  454. fw.flush();
  455. pw.close();
  456. fw.close();
  457. } catch (IOException e) {
  458. e.printStackTrace();
  459. }
  460. }
  461. @RequestMapping(value = "/getToken", method = RequestMethod.GET)
  462. @ResponseBody
  463. public ModelMap getToken(Long userUU, Long spaceUU) {
  464. ModelMap data = new ModelMap();
  465. data.put("userUU", userUU);
  466. data.put("spaceUU", spaceUU);
  467. Token token = new Token(data);
  468. tokenService.save(token);
  469. return success(token.getId());
  470. }
  471. }