UserManagerController.java 15 KB

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