9ef20ad208522b072f32f947ca92f5a6a455a5e3.svn-base 10 KB

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