6d71eb3b75e43417b4e613f95997d50005b5b3e6.svn-base 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. package com.iamberry.app.service;
  2. import java.text.MessageFormat;
  3. import java.util.Date;
  4. import java.util.List;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8. import org.springframework.stereotype.Service;
  9. import org.springframework.transaction.annotation.Transactional;
  10. import com.iamberry.app.config.Constants;
  11. import com.iamberry.app.config.ImberryConfig;
  12. import com.iamberry.app.core.dto.RemoteIpInfoDTO;
  13. import com.iamberry.app.core.dto.UserDTO;
  14. import com.iamberry.app.core.entity.User;
  15. import com.iamberry.app.face.UserService;
  16. import com.iamberry.app.tool.util.AES;
  17. import com.iamberry.app.tool.util.HttpUtility;
  18. import com.iamberry.app.tool.util.MD5;
  19. import com.iamberry.app.tool.util.TuyaConnector;
  20. import com.iamberry.app.tool.util.WebJsonTokenUtil;
  21. import com.iamberry.app.ulitity.Utility;
  22. /**
  23. * UserService
  24. *
  25. * @author Moon Cheng
  26. * @date 2016年3月23日 上午11:33:29
  27. */
  28. @Service
  29. public class UserServiceImpl extends BaseService implements UserService {
  30. private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
  31. /**
  32. * register
  33. *
  34. * @author Moon Cheng
  35. * @param phone 电话号码
  36. * @param password 密码
  37. * @param ip ip地址
  38. * @return User Information
  39. */
  40. @Transactional
  41. public User register(String phone, String password, String ip) {
  42. // 创建用户,填充数据
  43. User user = new User(phone, MD5.md5(password), new Date(), Constants.USER_SAVE_TEL);
  44. user.setUserTel(phone); // 完善手机号码
  45. String defaultName = phone.substring(0, 3) + "****" + phone.substring(7, 11); // 默认的昵称
  46. user.setDisplay_name(defaultName);
  47. user.setStatus_(Constants.USER_SAVE_TEL); // 当前用户的状态为已完善手机号码,待完善宝宝信息
  48. user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1")); // 设置宝宝生日
  49. RemoteIpInfoDTO dto = getLocation(ip);
  50. if (dto != null) {
  51. try {
  52. user.setLocation(dto.getCity());
  53. } catch (Exception e) {
  54. user.setLocation("深圳");
  55. }
  56. }
  57. // 在此,生成用户的保存区间,保证系统调用成功,通过手机号hash 定位当前区间
  58. // int interval = phone.hashCode() % 10;
  59. user.setCreated_on(new Date()); // 创建时间为当前时间
  60. userMapper.insertUser(user);
  61. if (user.getId() == null) {
  62. return null;
  63. }
  64. // 生成token
  65. String token = getEncToken(user.getId());
  66. user.setToken(token);
  67. user.setPassword(null);
  68. // 返回数据
  69. return user;
  70. }
  71. /**
  72. * thirdPartBindingPhone
  73. * @param phone
  74. * @param openId
  75. * @return
  76. */
  77. public User thirdPartBindingPhone(String phone, String openId) {
  78. // 判断用户是否存在
  79. User user = userMapper.selectUserByUsername(openId);
  80. if (user == null) {
  81. return null;
  82. }
  83. // 用户已经完善手机号码,不需要完善
  84. if (!user.getStatus_().equals(Constants.USER_NOW_INIT)) {
  85. return null;
  86. }
  87. // 根据手机号码,完善信息
  88. User db = new User();
  89. db.setUserTel(phone);
  90. db.setStatus_(Constants.USER_SAVE_TEL);
  91. db.setId(user.getId());
  92. // 判断手机号码是否存在账户信息,如果有,需要copy
  93. User tempUser = userMapper.getOtherUserByTel(phone, user.getId().intValue());
  94. if (tempUser != null) {
  95. // 需要copy信息
  96. db.setBaby_dob(tempUser.getBaby_dob());
  97. db.setBaby_gender(tempUser.getBaby_gender());
  98. db.setBaby_nickname(tempUser.getBaby_nickname());
  99. db.setStatus_(Constants.USER_ACTIVE);
  100. }
  101. // 执行修改
  102. int status = userMapper.updateUser(db);
  103. if (status > 0) {
  104. user.setUsername(phone);
  105. user.setPassword(null);
  106. } else {
  107. return null;
  108. }
  109. user.setStatus_(db.getStatus_());
  110. return user;
  111. }
  112. /**
  113. * findById
  114. * @param id
  115. * @return User
  116. */
  117. public User findById(Long id) {
  118. User user = userMapper.selectUserById(id);
  119. user.setPassword(null);
  120. return user;
  121. }
  122. /**
  123. * login
  124. *
  125. * @param phone
  126. * @param password
  127. * @param userAgent
  128. * @return
  129. */
  130. public Object login(String phone, String password) {
  131. User user = userMapper.selectUserByUsername(phone);
  132. if (user == null) {
  133. return -1;
  134. }
  135. if (!MD5.md5(password).equals(user.getPassword())) {
  136. return -2;
  137. }
  138. if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
  139. // 待完善宝宝信息
  140. user.setIs_perfect_user(2);
  141. }
  142. // 生成token
  143. String token = getEncToken(user.getId());
  144. // 将手机号码 -----> username
  145. user.setUsername(user.getUserTel());
  146. user.setToken(token);
  147. user.setPassword(null);
  148. // 注册涂鸦
  149. UserDTO dto = tuyaConnect(user);
  150. if (Constants.USER_NOW_INIT.equals(user.getStatus_())) {
  151. // 需要完善手机号码
  152. dto.setIs_perfect_user(1);
  153. } else if (Constants.USER_SAVE_TEL.equals(user.getStatus_())) {
  154. // 需要完善宝宝信息
  155. dto.setIs_perfect_user(2);
  156. } else {
  157. // 注册完成
  158. dto.setIs_perfect_user(3);
  159. }
  160. return dto;
  161. }
  162. /**
  163. * thirdPartLogin
  164. *
  165. * @param openId
  166. * @param extType
  167. * @param extName
  168. * @param extPicture
  169. * @return
  170. */
  171. public User thirdPartLogin(String openId, String extType, String extName, String extPicture, String ip) {
  172. User user = userMapper.selectUserByUsername(openId);
  173. if (user == null) {
  174. // 不存在,则自动注册,如果是第三方登录的用户,默认为刚初始化,需要完善手机号码、宝宝信息,账户才能正常使用
  175. user = new User(openId, MD5.md5(Constants.TUYA_DEFAULT_PASS), new Date(), Constants.USER_NOW_INIT);
  176. user.setExt_open_id(openId);
  177. user.setExt_type(extType);
  178. user.setBaby_dob(Utility.formatStringToDate("yyyy-MM-dd", "1970-1-1"));
  179. user.setDisplay_name(extName.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*"));
  180. user.setUserTel(""); // 手机号码默认为空
  181. RemoteIpInfoDTO dto = getLocation(ip);
  182. if (dto != null) {
  183. user.setLocation(dto.getCity());
  184. } else {
  185. user.setLocation("默认");
  186. }
  187. user.setDisplay_picture(extPicture);
  188. userMapper.insertUser(user);
  189. }
  190. // 获取token
  191. user.setToken(WebJsonTokenUtil.getToken(user.getId().intValue()));
  192. user.setPassword(null);
  193. if (!Constants.USER_NOW_INIT.equals(user.getStatus_())) {
  194. // 需要完善手机号码
  195. user.setUsername(user.getUserTel());
  196. }
  197. return user;
  198. }
  199. /**
  200. * updateUserInfo
  201. *
  202. * @param user
  203. * @param token
  204. * @return
  205. */
  206. public User updateUserInfo(User user, String token) {
  207. User userInfo = validateUserToken(token);
  208. if (userInfo == null) {
  209. return null;
  210. }
  211. /*if (!userInfo.getStatus_().equals(Constants.USER_SAVE_TEL)) {
  212. return null;
  213. }*/
  214. /**
  215. * 修改宝宝信息,只需要修改三个字段,宝宝昵称、宝宝性别、宝宝生日,其中默认 修改状态
  216. */
  217. if (user.getBaby_dob() != null) {
  218. user.setStatus_(Constants.USER_ACTIVE);
  219. }
  220. // 清楚token,防止修改
  221. user.setToken(null);
  222. // 修改
  223. user.setId(userInfo.getId());
  224. userMapper.updateUser(user);
  225. // 更新用户信息,并且返回
  226. userInfo.setPassword(null);
  227. userInfo.setBaby_dob(user.getBaby_dob());
  228. userInfo.setBaby_nickname(user.getBaby_nickname());
  229. userInfo.setBaby_gender(user.getBaby_gender());
  230. userInfo.setStatus_(Constants.USER_ACTIVE);
  231. userInfo.setToken(token);
  232. if(StringUtils.isNotEmpty(user.getDisplay_name())){
  233. userInfo.setDisplay_name(user.getDisplay_name());
  234. }
  235. return userInfo;
  236. }
  237. /**
  238. * updateDisplayPicture
  239. *
  240. * @author Moon Cheng
  241. * @param base64
  242. * @param token
  243. * @return
  244. */
  245. public String updateDisplayPicture(String imageURL, String token) {
  246. User userInfo = validateUserToken(token);
  247. if (userInfo == null) {
  248. return null;
  249. }
  250. /*if (userMapper.updateUserAvator(userInfo.getId(), base64) < 1) {
  251. userMapper.insertUserAvator(userInfo.getId(), base64);
  252. }*/
  253. // final String BASE_URL = "http://localhost/imberry-api";
  254. int status = userMapper.updateDisplayPicture(imageURL, userInfo.getId());
  255. if (status < 1) {
  256. return "ERROR";
  257. }
  258. return imageURL;
  259. }
  260. /**
  261. * changePhone
  262. *
  263. * @author Moon Cheng
  264. * @param phone
  265. * @param token
  266. * @return
  267. */
  268. public User changePhone(String phone, String token) {
  269. User userInfo = validateUserToken(token);
  270. if (userInfo == null) {
  271. return null;
  272. }
  273. // 修改绑定的手机号码
  274. User user = new User();
  275. user.setId(userInfo.getId());
  276. user.setUserTel(phone);
  277. userMapper.updateUser(user);
  278. userInfo = userMapper.selectUserById(userInfo.getId());
  279. userInfo.setPassword(null);
  280. return userInfo;
  281. }
  282. /**
  283. * resetPassWord
  284. *
  285. * @param oldPassword
  286. * @param newPassword
  287. * @param token
  288. * @return
  289. */
  290. public int changePassword(String oldPassword, String newPassword, String token) {
  291. int status = -1;
  292. User userInfo = validateUserToken(token);
  293. if (userInfo == null) {
  294. return -1;
  295. }
  296. User user = userMapper.validateUser(userInfo.getUsername(), MD5.md5(oldPassword));
  297. if (user == null) {
  298. return 0;
  299. }
  300. status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
  301. return status;
  302. }
  303. /**
  304. * changePassWord
  305. *
  306. * @param username,
  307. * newPassword
  308. * @param session
  309. * @return int
  310. */
  311. public int resetPassWord(String username, String newPassword) {
  312. int status = 0;
  313. User user = userMapper.selectUserByUsername(username);
  314. if (user == null) {
  315. return -3;
  316. }
  317. status = userMapper.changePassword(user.getId(), MD5.md5(newPassword));
  318. return status;
  319. }
  320. public UserDTO tuyaConnect(User user) {
  321. UserDTO userInfo = new UserDTO(user.getId(), user.getUsername(), user.getPassword(), user.getToken(), user.getDisplay_name(),
  322. user.getDisplay_picture(), user.getCreated_on(), user.getExt_open_id(), user.getExt_name(), user.getExt_type(),
  323. user.getLocation(), user.getBaby_nickname(), user.getBaby_dob(), user.getBaby_gender(), user.getStatus_());
  324. userInfo.setPassword(null);
  325. try {
  326. userInfo.setEncryptUsername(AES.encrypt(user.getUsername()));
  327. } catch (Exception e) {
  328. e.printStackTrace();
  329. }
  330. userInfo.setUserCode(Constants.TUYA_DEFAULT_PASS);
  331. // Tuya connection
  332. TuyaConnector.TuyaSyncConnect(userInfo.getEncryptUsername(), userInfo.getUserCode());
  333. return userInfo;
  334. }
  335. /**
  336. * getStartPage
  337. *
  338. * @return String
  339. */
  340. public String getStartPage() {
  341. return userMapper.selectConfig("start_page");
  342. }
  343. /**
  344. * getLocation
  345. *
  346. * @param ip
  347. * @return String
  348. */
  349. public RemoteIpInfoDTO getLocation(String ip) {
  350. RemoteIpInfoDTO remoteIpInfoDTO = new RemoteIpInfoDTO();
  351. if (ip.indexOf(",") != -1) {
  352. ip = ip.split(",")[0];
  353. }
  354. logger.info("IP为:" + ip);
  355. try {
  356. String result = HttpUtility.httpsGet(MessageFormat.format(ImberryConfig.SINA_IP_URL, ip));
  357. remoteIpInfoDTO = mapper.readValue(result, RemoteIpInfoDTO.class);
  358. } catch (Exception e) {
  359. }
  360. return remoteIpInfoDTO;
  361. }
  362. /**
  363. * getApkVersion
  364. *
  365. * @return
  366. */
  367. public String getApkVersion(){
  368. return userMapper.selectConfig("apk_version");
  369. }
  370. @Override
  371. public String selectUserAvator(Long id) {
  372. // TODO Auto-generated method stub
  373. return userMapper.selectUserAvator(id);
  374. }
  375. @Override
  376. public User selectUserByUsername(String username) {
  377. // TODO Auto-generated method stub
  378. return userMapper.selectUserByUsername(username);
  379. }
  380. @Override
  381. public List<User> getAll(int start, int end) {
  382. return null;
  383. }
  384. }