b8a6e3d276a2ebf08c6e266102b00851d0f6ca99.svn-base 11 KB

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