diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/auth/LoginFilter.java b/src/main/java/com/chaozhanggui/system/cashierservice/auth/LoginFilter.java new file mode 100644 index 0000000..99e13eb --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/auth/LoginFilter.java @@ -0,0 +1,127 @@ +package com.chaozhanggui.system.cashierservice.auth; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.chaozhanggui.system.cashierservice.redis.RedisCst; +import com.chaozhanggui.system.cashierservice.redis.RedisUtil; +import com.chaozhanggui.system.cashierservice.sign.CodeEnum; +import com.chaozhanggui.system.cashierservice.sign.Result; +import com.chaozhanggui.system.cashierservice.util.TokenUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * 登录的拦截器 + * 目前仅限APP使用 + */ +@Slf4j +@Component +@WebFilter(filterName = "LoginFilter", urlPatterns = "/*") +public class LoginFilter implements Filter { + + /** + * 不登录就可以访问的接口 + */ + private static final List NOT_LOGIN_URL = Arrays.asList( + // 忽略静态资源 + "css/**", + "js/**", + "cashierService/phoneValidateCode",//验证码 + "cashierService/login/**"//登录部分接口不校验 + ); + + @Autowired + private RedisUtil redisUtil; + + /** + * 登陆过滤器具体实现 + */ + @Override + public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) resp; + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json; charset=utf-8"); + // OPTIONS请求类型不做校验 + if (request.getMethod().equalsIgnoreCase("OPTIONS")) { + chain.doFilter(req, resp); + return; + } + // 获取请求地址 + String url = request.getRequestURI(); + // 不需要授权的接口直接访问的地址 + if (containsUrl(NOT_LOGIN_URL, url)) { + chain.doFilter(req, resp); + return; + } + String environment = request.getHeader("environment"); + //token校验目前只对app生效 + if(!environment.equals("app")){ + chain.doFilter(req, resp); + return; + } + // 判断用户TOKEN是否存在 + String token = request.getHeader("token"); + if (StringUtils.isBlank(token)) { + Result result = new Result(CodeEnum.TOKEN_EXEIST); + String jsonString = JSONObject.toJSONString(result); + JSONObject jsonObject = JSONObject.parseObject(jsonString, JSONObject.class); + response.getWriter().print(jsonObject); + response.getWriter().flush();//流里边的缓存刷出 + return; + } + //获取当前登录人的用户id + String loginName = TokenUtil.parseParamFromToken(token, "userId").toString(); + //获取redis中的token + String message = redisUtil.getMessage(RedisCst.ONLINE_APP_USER.concat(loginName)); + if(StringUtils.isBlank(message)){ + Result result = new Result(CodeEnum.TOKEN_EXPIRED); + String jsonString = JSONObject.toJSONString(result); + JSONObject jsonObject = JSONObject.parseObject(jsonString, JSONObject.class); + response.getWriter().print(jsonObject); + response.getWriter().flush();//流里边的缓存刷出 + return; + } + String redisToken = JSON.parseObject(message).getString("token"); + if (!token.equals(redisToken)) { + Result result = new Result(CodeEnum.TOKEN_EXPIRED); + String jsonString = JSONObject.toJSONString(result); + JSONObject jsonObject = JSONObject.parseObject(jsonString, JSONObject.class); + response.getWriter().print(jsonObject); + response.getWriter().flush();//流里边的缓存刷出 + return; + } + chain.doFilter(req, resp); + } + + /** + * 判断url请求是否配置在urls列表中 + */ + private boolean containsUrl(List urls, String url) { + if (urls == null || urls.isEmpty()) { + return false; + } + for (String s : urls) { + if (s.endsWith("**")) { + if (url.startsWith("/" + s.substring(0, s.length() - 2))) { + return true; + } + } else { + if (url.equals("/" + s)) { + return true; + } + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java index 4ab596e..4a9a57d 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java @@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.chaozhanggui.system.cashierservice.dao.TbMerchantAccountMapper; import com.chaozhanggui.system.cashierservice.entity.TbMerchantAccount; +import com.chaozhanggui.system.cashierservice.entity.TbUserInfo; import com.chaozhanggui.system.cashierservice.entity.dto.AuthUserDto; import com.chaozhanggui.system.cashierservice.entity.dto.OnlineUserDto; import com.chaozhanggui.system.cashierservice.service.LoginService; @@ -29,8 +30,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.Map; +import java.util.*; @CrossOrigin(origins = "*") @RestController @@ -89,11 +89,6 @@ public class LoginContoller { } - - - - - @RequestMapping("/wx/custom/login") public Result wxCustomLogin(HttpServletRequest request, @RequestBody Map map // , @@ -102,23 +97,23 @@ public class LoginContoller { ) { - if (ObjectUtil.isNull(map) || ObjectUtil.isEmpty(map)||!map.containsKey("code")||ObjectUtil.isEmpty(map.get("code"))) { + if (ObjectUtil.isNull(map) || ObjectUtil.isEmpty(map) || !map.containsKey("code") || ObjectUtil.isEmpty(map.get("code"))) { Result.fail("code不能为空"); } - String code=map.get("code").toString(); + String code = map.get("code").toString(); - String qrCode=map.get("qrCode"); + String qrCode = map.get("qrCode"); - String rawData=map.get("rawData"); + String rawData = map.get("rawData"); - String signature=map.get("signature"); + String signature = map.get("signature"); - String encryptedData=map.get("encryptedData"); + String encryptedData = map.get("encryptedData"); - String ivStr=map.get("iv"); + String ivStr = map.get("iv"); - String phone=map.get("phone"); + String phone = map.get("phone"); // 用户非敏感信息:rawData // 签名:signature @@ -136,11 +131,11 @@ public class LoginContoller { return Result.fail("签名校验失败"); } - String nickName = rawDataJson.getString( "nickName"); - String avatarUrl = rawDataJson.getString( "avatarUrl"); + String nickName = rawDataJson.getString("nickName"); + String avatarUrl = rawDataJson.getString("avatarUrl"); try { - return loginService.wxCustomLogin(openid, avatarUrl, nickName, phone,qrCode, IpUtil.getIpAddr(request)); + return loginService.wxCustomLogin(openid, avatarUrl, nickName, phone, qrCode, IpUtil.getIpAddr(request)); } catch (Exception e) { e.printStackTrace(); } @@ -151,16 +146,16 @@ public class LoginContoller { @RequestMapping("getPhoneNumber") - public Result getPhoneNumber(@RequestBody Map map){ + public Result getPhoneNumber(@RequestBody Map map) { - if (ObjectUtil.isNull(map) || ObjectUtil.isEmpty(map)||!map.containsKey("code")||ObjectUtil.isEmpty(map.get("code"))) { + if (ObjectUtil.isNull(map) || ObjectUtil.isEmpty(map) || !map.containsKey("code") || ObjectUtil.isEmpty(map.get("code"))) { Result.fail("code不能为空"); } - String code=map.get("code").toString(); + String code = map.get("code").toString(); - String encryptedData=map.get("encryptedData"); + String encryptedData = map.get("encryptedData"); - String ivStr=map.get("iv"); + String ivStr = map.get("iv"); JSONObject SessionKeyOpenId = WechatUtil.getSessionKeyOrOpenId(code, customAppId, customSecrete); @@ -168,11 +163,11 @@ public class LoginContoller { String openid = SessionKeyOpenId.getString("openid"); String sessionKey = SessionKeyOpenId.getString("session_key"); - String data= WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr); - if(ObjectUtil.isNotEmpty(data)&&JSONObject.parseObject(data).containsKey("phoneNumber")){ + String data = WxMaCryptUtils.decrypt(sessionKey, encryptedData, ivStr); + if (ObjectUtil.isNotEmpty(data) && JSONObject.parseObject(data).containsKey("phoneNumber")) { return Result.success(CodeEnum.SUCCESS, JSONObject.parseObject(data).get("phoneNumber")); } - return Result.fail("获取手机号失败"); + return Result.fail("获取手机号失败"); } @@ -196,34 +191,79 @@ public class LoginContoller { //生成token String token = StringUtil.genRandomNum(6) + StringUtil.getBillno() + StringUtil.genRandomNum(6); //存入redis - OnlineUserDto jwtUserDto = onlineUserService.save(merchantAccount.getName(), merchantAccount.getAccount(), Integer.valueOf(merchantAccount.getShopId()), token,merchantAccount.getStatus()); + OnlineUserDto jwtUserDto = onlineUserService.save(merchantAccount.getName(), merchantAccount.getAccount(), Integer.valueOf(merchantAccount.getShopId()), token, merchantAccount.getStatus()); //组装登录数据 Map authInfo = new HashMap(2) {{ - put("token", token); + put("token", token); put("user", jwtUserDto); }}; - return Result.success(CodeEnum.ENCRYPT,authInfo); + return Result.success(CodeEnum.ENCRYPT, authInfo); } /** * 获取会员码 + * * @param openId * @param token * @param id * @return */ @RequestMapping("createCardNo") - public Result createCardNo(@RequestHeader("openId") String openId,@RequestHeader("token") String token,@RequestHeader("id") String id){ - return loginService.createCardNo(id,openId); + public Result createCardNo(@RequestHeader("openId") String openId, @RequestHeader("token") String token, @RequestHeader("id") String id) { + return loginService.createCardNo(id, openId); } @GetMapping("/wx/userInfo") - public Result userInfo(@RequestParam("userId") Integer userId,@RequestParam("shopId") String shopId ){ - return loginService.userInfo(userId,shopId); + public Result userInfo(@RequestParam("userId") Integer userId, @RequestParam("shopId") String shopId) { + return loginService.userInfo(userId, shopId); } + /** + * 用户注册 + * + * @param phone 手机号 + * @param nickName 用户昵称 + * @param password 密码 + * @param code 验证码 + * @return + */ + @PostMapping("register") + public Result register(@RequestBody TbUserInfo userInfo) { + boolean tf = loginService.validate(userInfo.getCode(), userInfo.getTelephone()); + if (tf) { + return loginService.register(userInfo.getTelephone(), userInfo.getPassword(), userInfo.getNickName()); + } else { + return Result.fail("验证码校验失败"); + } + } + + + /** + * App登录用户端的请求接口 + * + * @param username 手机号 + * @param password 密码登录时使用 + * @param code 验证码登录时使用 + * @return + */ + @PostMapping("/app/login") + public Result applogin(@RequestBody AuthUserDto authUserDto) { + if (ObjectUtil.isNull(authUserDto.getCode())) { + //验证密码 + String mdPasswordString = MD5Utils.MD5Encode(authUserDto.getPassword(), "utf-8"); + return loginService.appLogin(authUserDto.getUsername(), mdPasswordString); + } else { + boolean tf = loginService.validate(authUserDto.getCode(), authUserDto.getUsername()); + if (tf) { + return loginService.appLogin(authUserDto.getUsername(), null); + } else { + return Result.fail("验证码输入有误"); + } + } + } + } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PhoneValidateCodeController.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PhoneValidateCodeController.java index d95f862..b37cd13 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/PhoneValidateCodeController.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/PhoneValidateCodeController.java @@ -7,8 +7,7 @@ import com.chaozhanggui.system.cashierservice.util.RedisUtils; import com.chaozhanggui.system.cashierservice.util.StringUtil; import com.chaozhanggui.system.cashierservice.util.ValidateCodeUtil; import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Lazy; -import org.springframework.data.redis.core.RedisTemplate; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -40,7 +39,9 @@ public class PhoneValidateCodeController { */ @GetMapping public Result verifyPhoneIsExist(@RequestParam String phone) { - + if (StringUtils.isBlank(phone)) { + return Result.fail("手机号不可为空!"); + } String random = StringUtil.random(6); validateCodeUtil.requestValidateCodeAli(phone, random); //存入缓存 diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbUserInfoMapper.java b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbUserInfoMapper.java index ba138d6..841dfa6 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbUserInfoMapper.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/dao/TbUserInfoMapper.java @@ -22,5 +22,20 @@ public interface TbUserInfoMapper { TbUserInfo selectByOpenId(String openId); + /** + * 通过手机号查询 + * @param phone + * @param source 公众号 WECHAT 小程序 WECHAT-APP 手机注册 TELEPHONE 移动端 APP + * @return + */ + TbUserInfo selectUserByPhone(String phone,String source); + + /** + * 查询来源为APP 未绑定微信用户的 用户数据 + * @param phone + * @return + */ + TbUserInfo selectByPhone(String phone); + } \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbUserInfo.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbUserInfo.java index 63acc56..fab566b 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbUserInfo.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbUserInfo.java @@ -5,6 +5,7 @@ import java.math.BigDecimal; public class TbUserInfo implements Serializable { private Integer id; + private Integer userId; private BigDecimal amount; @@ -93,6 +94,7 @@ public class TbUserInfo implements Serializable { private Long bindParentAt; private String grandParentId; + private String password; private String avatar = ""; @@ -475,4 +477,20 @@ public class TbUserInfo implements Serializable { public void setGrandParentId(String grandParentId) { this.grandParentId = grandParentId == null ? null : grandParentId.trim(); } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } } \ No newline at end of file diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java b/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java index 44b2ed2..26353e2 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java @@ -10,6 +10,7 @@ public class RedisCst { //在线用户 public static final String ONLINE_USER = "ONLINE_USER:"; + public static final String ONLINE_APP_USER = "ONLINE_APP_USER:"; public static final String TABLE_CART = "TABLE:CART:"; public static final String PRODUCT = "PRODUCT:"; diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java index 0731369..c8251d5 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/LoginService.java @@ -9,17 +9,16 @@ import com.chaozhanggui.system.cashierservice.redis.RedisCst; import com.chaozhanggui.system.cashierservice.redis.RedisUtil; import com.chaozhanggui.system.cashierservice.sign.CodeEnum; import com.chaozhanggui.system.cashierservice.sign.Result; +import com.chaozhanggui.system.cashierservice.util.MD5Utils; import com.chaozhanggui.system.cashierservice.util.TokenUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.util.*; @Service public class LoginService { @@ -52,11 +51,11 @@ public class LoginService { @Transactional(rollbackFor = Exception.class) - public Result wxCustomLogin(String openId,String headImage,String nickName,String telephone,String qrCode,String ip) throws Exception { + public Result wxCustomLogin(String openId, String headImage, String nickName, String telephone, String qrCode, String ip) throws Exception { - TbUserInfo userInfo= tbUserInfoMapper.selectByOpenId(openId); - if(ObjectUtil.isNull(userInfo)){ - userInfo=new TbUserInfo(); + TbUserInfo userInfo = tbUserInfoMapper.selectByOpenId(openId); + if (ObjectUtil.isNull(userInfo)) { + userInfo = new TbUserInfo(); userInfo.setAmount(BigDecimal.ZERO); userInfo.setChargeAmount(BigDecimal.ZERO); @@ -65,9 +64,9 @@ public class LoginService { userInfo.setConsumeAmount(BigDecimal.ZERO); userInfo.setTotalScore(0); userInfo.setLockScore(0); - userInfo.setHeadImg(ObjectUtil.isNotNull(headImage)?headImage:""); - userInfo.setNickName(ObjectUtil.isNotNull(nickName)?nickName:"微信用户"); - userInfo.setTelephone(ObjectUtil.isNotNull(telephone)?telephone:""); + userInfo.setHeadImg(ObjectUtil.isNotNull(headImage) ? headImage : ""); + userInfo.setNickName(ObjectUtil.isNotNull(nickName) ? nickName : "微信用户"); + userInfo.setTelephone(ObjectUtil.isNotNull(telephone) ? telephone : ""); userInfo.setMiniAppOpenId(openId); userInfo.setStatus(Byte.parseByte("1")); userInfo.setParentType("PERSON"); @@ -82,31 +81,39 @@ public class LoginService { userInfo.setUpdatedAt(System.currentTimeMillis()); tbUserInfoMapper.insert(userInfo); - }else { - userInfo.setHeadImg(ObjectUtil.isNotNull(headImage)?headImage:""); - userInfo.setNickName(ObjectUtil.isNotNull(nickName)?nickName:"微信用户"); - userInfo.setTelephone(ObjectUtil.isNotNull(telephone)?telephone:""); + } else { + userInfo.setHeadImg(ObjectUtil.isNotNull(headImage) ? headImage : ""); + userInfo.setNickName(ObjectUtil.isNotNull(nickName) ? nickName : "微信用户"); + userInfo.setTelephone(ObjectUtil.isNotNull(telephone) ? telephone : ""); tbUserInfoMapper.updateByPrimaryKeySelective(userInfo); } + //app与微信用户 互相关联 + if (ObjectUtil.isNotNull(telephone)) { + TbUserInfo appUser = tbUserInfoMapper.selectByPhone(telephone); + if (appUser != null) { + TbUserInfo wechatUser = tbUserInfoMapper.selectByOpenId(openId); + appUser.setUserId(wechatUser.getId()); + tbUserInfoMapper.updateByPrimaryKey(appUser); + wechatUser.setUserId(appUser.getId()); + tbUserInfoMapper.updateByPrimaryKey(wechatUser); + } + } + TbShopInfo tbShopInfo = null; + if (ObjectUtil.isEmpty(qrCode)) { + tbShopInfo = tbShopInfoMapper.selectByPhone(defaultPhone); - TbShopInfo tbShopInfo=null; - if(ObjectUtil.isEmpty(qrCode)){ - tbShopInfo=tbShopInfoMapper.selectByPhone(defaultPhone); - - - }else { - tbShopInfo= tbShopInfoMapper.selectByQrCode(qrCode); + } else { + tbShopInfo = tbShopInfoMapper.selectByQrCode(qrCode); } - - TbShopUser tbShopUser=null; - Map shopMap=new HashMap<>(); - if(ObjectUtil.isNotEmpty(tbShopInfo)){ - tbShopUser= tbShopUserMapper.selectByUserIdAndShopId(userInfo.getId().toString(),tbShopInfo.getId().toString()); - if(ObjectUtil.isEmpty(tbShopUser)){ - tbShopUser=new TbShopUser(); + TbShopUser tbShopUser = null; + Map shopMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(tbShopInfo)) { + tbShopUser = tbShopUserMapper.selectByUserIdAndShopId(userInfo.getId().toString(), tbShopInfo.getId().toString()); + if (ObjectUtil.isEmpty(tbShopUser)) { + tbShopUser = new TbShopUser(); tbShopUser.setAmount(BigDecimal.ZERO); tbShopUser.setCreditAmount(BigDecimal.ZERO); tbShopUser.setConsumeAmount(BigDecimal.ZERO); @@ -119,32 +126,31 @@ public class LoginService { tbShopUser.setCreatedAt(System.currentTimeMillis()); tbShopUserMapper.insert(tbShopUser); } - shopMap.put("shopId",tbShopUser.getShopId()); - shopMap.put("name",tbShopInfo.getShopName()); - shopMap.put("amount",BigDecimal.ZERO.toPlainString()); - shopMap.put("levelConsume",BigDecimal.ZERO.toPlainString()); + shopMap.put("shopId", tbShopUser.getShopId()); + shopMap.put("name", tbShopInfo.getShopName()); + shopMap.put("amount", BigDecimal.ZERO.toPlainString()); + shopMap.put("levelConsume", BigDecimal.ZERO.toPlainString()); } //生成token 信息 - String token = TokenUtil.generateToken(userInfo.getId(), userInfo.getMiniAppOpenId(), userInfo.getTelephone(),userInfo.getNickName()); + String token = TokenUtil.generateToken(userInfo.getId(), userInfo.getMiniAppOpenId(), userInfo.getTelephone(), userInfo.getNickName()); //存储登录记录 - TbToken tbToken = new TbToken(tbShopInfo.getId(), userInfo.getId(),"wx_lite", token, ip, "1", new Date()); + TbToken tbToken = new TbToken(tbShopInfo.getId(), userInfo.getId(), "wx_lite", token, ip, "1", new Date()); tbTokenMapper.insert(tbToken); - - Map map=new HashMap<>(); + Map map = new HashMap<>(); try { - map.put("token",token); - map.put("userInfo",userInfo); - map.put("shopUser",shopMap); - map.put("shopInfo",tbShopInfo); + map.put("token", token); + map.put("userInfo", userInfo); + map.put("shopUser", shopMap); + map.put("shopInfo", tbShopInfo); redisUtil.saveMessage(RedisCst.ONLINE_USER.concat(openId), JSON.toJSONString(map)); - return Result.success(CodeEnum.SUCCESS,map); + return Result.success(CodeEnum.SUCCESS, map); } catch (Exception e) { e.printStackTrace(); @@ -152,67 +158,159 @@ public class LoginService { return Result.fail("登录失败"); } + public Result register(String phone, String password, String nickName) { + TbUserInfo userInfo = tbUserInfoMapper.selectByPhone(phone); + if (ObjectUtil.isNull(userInfo)) { + userInfo = new TbUserInfo(); + userInfo.setAmount(BigDecimal.ZERO); + userInfo.setChargeAmount(BigDecimal.ZERO); + userInfo.setLineOfCredit(BigDecimal.ZERO); + userInfo.setConsumeNumber(0); + userInfo.setConsumeAmount(BigDecimal.ZERO); + userInfo.setTotalScore(0); + userInfo.setLockScore(0); + userInfo.setHeadImg(""); + userInfo.setNickName(nickName); + userInfo.setTelephone(phone); + userInfo.setStatus(Byte.parseByte("1")); + userInfo.setParentType("PERSON"); + userInfo.setIsResource(Byte.parseByte("0")); + userInfo.setIsOnline(Byte.parseByte("0")); + userInfo.setIsVip(Byte.parseByte("0")); + userInfo.setSourcePath("APP"); + userInfo.setIsAttentionMp(Byte.parseByte("0")); + userInfo.setSearchWord("||移动端用户"); + userInfo.setLastLogInAt(System.currentTimeMillis()); + userInfo.setCreatedAt(System.currentTimeMillis()); + userInfo.setUpdatedAt(System.currentTimeMillis()); + userInfo.setPassword(MD5Utils.MD5Encode(password, "UTF-8")); + tbUserInfoMapper.insert(userInfo); + } else { + return Result.fail("用户已注册"); + } + //app与微信小程序用户关联 - public Result createCardNo(String id,String openId){ - if(ObjectUtil.isEmpty(id)||ObjectUtil.isEmpty(openId)){ + TbUserInfo wechatUser = tbUserInfoMapper.selectUserByPhone(phone, "WECHAT-APP"); + if (wechatUser != null) { + TbUserInfo appUser = tbUserInfoMapper.selectByPhone(phone); + appUser.setUserId(wechatUser.getId()); + tbUserInfoMapper.updateByPrimaryKey(appUser); + wechatUser.setUserId(appUser.getId()); + tbUserInfoMapper.updateByPrimaryKey(wechatUser); + } + + return Result.success(CodeEnum.SUCCESS); + } + + /** + * 手机号 短信验证码 校验 + * + * @param code + * @param phone + * @return + */ + public boolean validate(String code, String phone) { + if (StringUtils.isNotBlank(code)) { + String message = redisUtil.getMessage(phone); + boolean tf = Objects.equals(code, message); + if (tf) { + redisUtil.deleteByKey(phone); + return true; + } + } + return false; + } + + @Transactional(rollbackFor = Exception.class) + public Result appLogin(String username, String password) { + TbUserInfo userInfo = tbUserInfoMapper.selectUserByPhone(username, "APP"); + if (ObjectUtil.isNull(userInfo)) { + return Result.fail("用户未注册"); + } + if (StringUtils.isNotBlank(password) && !password.equalsIgnoreCase(userInfo.getPassword())) { + return Result.fail("密码错误"); + } + //生成token 信息 + String token = null; + try { + token = TokenUtil.generateToken(userInfo.getId(), null, userInfo.getTelephone(), userInfo.getNickName()); + } catch (Exception e) { + throw new RuntimeException(e); + } + Map map = new HashMap<>(); + try { + map.put("token", token); + map.put("userInfo", userInfo); + redisUtil.saveMessage(RedisCst.ONLINE_APP_USER.concat(userInfo.getId()+""), JSON.toJSONString(map)); + return Result.success(CodeEnum.SUCCESS, map); + } catch (Exception e) { + e.printStackTrace(); + + } + return Result.fail("登录失败"); + } + + public Result createCardNo(String id, String openId) { + if (ObjectUtil.isEmpty(id) || ObjectUtil.isEmpty(openId)) { return Result.fail("head 信息不允许为空"); } - TbUserInfo userInfo= tbUserInfoMapper.selectByPrimaryKey(Integer.valueOf(id)); - if(userInfo==null||ObjectUtil.isEmpty(userInfo)){ - userInfo=tbUserInfoMapper.selectByOpenId(openId); + TbUserInfo userInfo = tbUserInfoMapper.selectByPrimaryKey(Integer.valueOf(id)); + if (userInfo == null || ObjectUtil.isEmpty(userInfo)) { + userInfo = tbUserInfoMapper.selectByOpenId(openId); } - if(userInfo==null||ObjectUtil.isEmpty(userInfo)){ + if (userInfo == null || ObjectUtil.isEmpty(userInfo)) { return Result.fail("用户信息不存在"); } - String cardNo= RandomUtil.randomNumbers(10); + String cardNo = RandomUtil.randomNumbers(10); userInfo.setCardNo(cardNo); userInfo.setUpdatedAt(System.currentTimeMillis()); tbUserInfoMapper.updateByPrimaryKeySelective(userInfo); - return Result.success(CodeEnum.SUCCESS,cardNo) ; + return Result.success(CodeEnum.SUCCESS, cardNo); } - public Result userInfo(Integer userId,String shopId){ + public Result userInfo(Integer userId, String shopId) { TbUserInfo tbUserInfo = tbUserInfoMapper.selectByPrimaryKey(userId); - if (tbUserInfo == null){ - return Result.success(CodeEnum.ENCRYPT,new ArrayList()); + if (tbUserInfo == null) { + return Result.success(CodeEnum.ENCRYPT, new ArrayList()); } - TbShopInfo tbShopInfo=null; - if(ObjectUtil.isEmpty(shopId)){ - tbShopInfo=tbShopInfoMapper.selectByPhone(defaultPhone); - }else { - tbShopInfo=tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId)); + TbShopInfo tbShopInfo = null; + if (ObjectUtil.isEmpty(shopId)) { + tbShopInfo = tbShopInfoMapper.selectByPhone(defaultPhone); + } else { + tbShopInfo = tbShopInfoMapper.selectByPrimaryKey(Integer.valueOf(shopId)); } - TbShopUser tbShopUser=null; - Map shopMap=new HashMap<>(); - if(ObjectUtil.isNotEmpty(tbShopInfo)){ - tbShopUser= tbShopUserMapper.selectByUserIdAndShopId(tbUserInfo.getId().toString(),tbShopInfo.getId().toString()); - shopMap.put("shopId",tbShopUser.getShopId()); - shopMap.put("name",tbShopInfo.getShopName()); - shopMap.put("amount",BigDecimal.ZERO.toPlainString()); - shopMap.put("levelConsume",BigDecimal.ZERO.toPlainString()); + TbShopUser tbShopUser = null; + Map shopMap = new HashMap<>(); + if (ObjectUtil.isNotEmpty(tbShopInfo)) { + tbShopUser = tbShopUserMapper.selectByUserIdAndShopId(tbUserInfo.getId().toString(), tbShopInfo.getId().toString()); + shopMap.put("shopId", tbShopUser.getShopId()); + shopMap.put("name", tbShopInfo.getShopName()); + shopMap.put("amount", BigDecimal.ZERO.toPlainString()); + shopMap.put("levelConsume", BigDecimal.ZERO.toPlainString()); } - Map map=new HashMap<>(); - map.put("userInfo",tbUserInfo); - map.put("shopUser",shopMap); - map.put("shopInfo",tbShopInfo); + Map map = new HashMap<>(); + map.put("userInfo", tbUserInfo); + map.put("shopUser", shopMap); + map.put("shopInfo", tbShopInfo); - return Result.success(CodeEnum.ENCRYPT,map); + return Result.success(CodeEnum.ENCRYPT, map); } - public static void main(String[] args){ - for(int i =0;i<10;i++){ + + public static void main(String[] args) { + for (int i = 0; i < 10; i++) { System.out.println(RandomUtil.randomNumbers(10)); } } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/OnlineUserService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/OnlineUserService.java index 4e6b8cf..d9300d0 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/OnlineUserService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/OnlineUserService.java @@ -38,7 +38,7 @@ public class OnlineUserService { onlineUserDto.setLoginTime(new Date()); onlineUserDto.setShopId(shopId); try { -// redisUtils.set("online-token-"+token, onlineUserDto, MILLIS_MINUTE); + redisUtils.set("online-token-"+token, onlineUserDto, MILLIS_MINUTE);//30分钟 }catch (Exception e){ throw new MsgException("登录错误"); } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java b/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java index b8f92de..dd1a367 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/sign/CodeEnum.java @@ -7,6 +7,8 @@ public enum CodeEnum { SUCCESS("0",false,"成功","success"), ENCRYPT("0",true,"成功","success"), FAIL("1",false,"失败","fail"), + TOKEN_EXEIST("-2",false,"token不能为空","fail"), + TOKEN_EXPIRED("-4",false,"账号已过期,请重新登陆","fail"), SIGN_FAIL("100013",false,"签名不正确","fail"), ORGAN_NO_EXEIST("100010",false,"机构代码不存在或状态异常,请联系服务商","fail"), diff --git a/src/main/resources/mapper/TbUserInfoMapper.xml b/src/main/resources/mapper/TbUserInfoMapper.xml index a52332a..4e494b9 100644 --- a/src/main/resources/mapper/TbUserInfoMapper.xml +++ b/src/main/resources/mapper/TbUserInfoMapper.xml @@ -3,6 +3,7 @@ + @@ -47,15 +48,16 @@ + - id, amount, charge_amount, line_of_credit, consume_amount, consume_number, total_score, + id,user_id, amount, charge_amount, line_of_credit, consume_amount, consume_number, total_score, lock_score, card_no, card_password, level_id, head_img, nick_name, telephone, wx_ma_app_id, birth_day, sex, mini_app_open_id, open_id, union_id, code, type, identify, status, parent_id, parent_level, parent_type, project_id, merchant_id, is_resource, is_online, is_vip, vip_effect_at, tips, source_path, is_sales_person, is_attention_mp, city, search_word, last_log_in_at, last_leave_at, created_at, updated_at, bind_parent_at, - grand_parent_id + grand_parent_id,password select * from tb_user_info where mini_app_open_id=#{openId} - + + + + + \ No newline at end of file