server/admin/src/main/resources/application.yml
@@ -1,6 +1,6 @@ # 项目信息配置 project: name: 访客系统 name: 志邦业绩数字化赋能后台系统 version: 1.0.0 env: development # env: production server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCaseInfoResponse.java
@@ -16,7 +16,7 @@ /** * 收藏量 */ private String collectCount; private Integer collectCount; /** * 主图 */ @@ -42,6 +42,6 @@ /** * 浏览量 */ private String viewCount; private Integer viewCount; } server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectInfoResponse.java
@@ -14,7 +14,7 @@ /** * 收藏数 */ private String collectCount; private Integer collectCount; /** * 内容ID */ @@ -50,6 +50,6 @@ /** * 查看数 */ private String viewCount; private Integer viewCount; } server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTProductInfoResponse.java
@@ -16,7 +16,7 @@ * 详情页轮播图列表(多视角图) */ private String[] bannerImgList; private String collectCount; private Integer collectCount; /** * 详情页富文本(全屋定制遍历spaceList的富文本) */ @@ -41,7 +41,7 @@ private List<ZTSpaceInfoResponse> spaceList; private String subtitle; private String title; private String viewCount; private Integer viewCount; private String downloadCount; private String isTop; private String orgId; server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTProductNewsInfoResponse.java
@@ -16,7 +16,7 @@ * 详情页轮播图列表(多视角图) */ private String[] bannerImgList; private String collectCount; private Integer collectCount; /** * 详情页富文本(全屋定制遍历spaceList的富文本) */ @@ -41,7 +41,7 @@ private List<ZTSpaceInfoResponse> spaceList; private String subtitle; private String title; private String viewCount; private Integer viewCount; private String downloadCount; private String isTop; private String orgId; server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTRealcaseInfoResponse.java
@@ -14,7 +14,7 @@ public class ZTRealcaseInfoResponse implements Serializable { private String caseInfo; private String collectCount; private Integer collectCount; /** * 主图 */ @@ -36,7 +36,7 @@ * 标题 */ private String title; private String viewCount; private Integer viewCount; private String contentCategory; private String intro; server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTVideoInfoResponse.java
@@ -16,7 +16,7 @@ /** * 收藏数量 */ private long collectCount; private Integer collectCount; /** * 封面图 */ @@ -58,5 +58,5 @@ /** * 浏览数量 */ private String viewCount; private Integer viewCount; } server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTZbDecoInfoResponse.java
@@ -11,7 +11,7 @@ @Data public class ZTZbDecoInfoResponse implements Serializable { private String author; private long collectCount; private Integer collectCount; /** * 内容 */ @@ -46,5 +46,5 @@ * 标题 */ private String title; private String viewCount; private Integer viewCount; } server/service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
@@ -21,11 +21,14 @@ import com.doumee.dao.business.model.Member; import io.jsonwebtoken.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import javax.annotation.Resource; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; /** @@ -47,6 +50,8 @@ public class JwtTokenUtil { //Header 名称 public static final String HEADER_KEY = "token"; //Header 名称 public static final String BUSINESS_HEADER_KEY = "business_token"; //取值名称 public static final String UserId_Name = "AppUserId"; //取值名称 @@ -65,6 +70,24 @@ return generateToken(jwtPayLoad.getUserId(), expirationDate, jwtPayLoad.toMap()); } /** * 生成token,根据userId和默认过期时间 */ public static String generateTokenForZb(Long userId,String userType,String userInfo,RedisTemplate<String,Object> redisTemplate) { Long expiredSeconds = getExpireSeconds(); final Date expirationDate = new Date(System.currentTimeMillis() + expiredSeconds * 1000); return generateTokenZb(userId,userType,userInfo, expirationDate,redisTemplate); } public static String generateTokenZb(Long userId, String userType,String userInfo, Date expiredDate,RedisTemplate<String,Object> redisTemplate) { String tokenKey = UUID.randomUUID() + "_" + userId; redisTemplate.opsForValue().set(userType + "_" +tokenKey,userInfo); return tokenKey; } /** * 验证token是否失效 */ server/service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -65,27 +65,26 @@ HandlerMethod handlerMethod = (HandlerMethod) handler; Class<?> beanType = handlerMethod.getBeanType(); // Method method = handlerMethod.getMethod(); Boolean checkFlag = false; // 有 @LoginRequired 注解,需要登录认证 客户端使用 if (beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class)) { //获取token String token = request.getHeader(JwtTokenUtil.HEADER_KEY); // 从 http 请求头中取出 token if (StringUtils.isNotBlank(token)) { checkLogin(request,response); } else { if ((beanType.isAnnotationPresent(LoginRequired.class) || handlerMethod.hasMethodAnnotation(LoginRequired.class))) { String token = request.getHeader(JwtTokenUtil.HEADER_KEY); if(StringUtils.isBlank(token)){ throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); } if (StringUtils.isNotBlank(token)) { checkFlag = checkLogin(request,response,token); } // 有 @UserLoginRequired 注解,需要登录认证 内部人员使用 } else if(beanType.isAnnotationPresent(UserLoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class)){ //ERP 业务注解 String token = request.getHeader(JwtTokenUtil.HEADER_KEY); if (StringUtils.isNotBlank(token)) { checkPersonnelLogin(request,response); } else { throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); } } if(beanType.isAnnotationPresent(UserLoginRequired.class) || handlerMethod.hasMethodAnnotation(UserLoginRequired.class)){ String token = request.getHeader(JwtTokenUtil.HEADER_KEY); if(StringUtils.isBlank(token)){ throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); } if (StringUtils.isNotBlank(token)) { checkFlag = checkPersonnelLogin(request,response,token); } } return true; } @@ -94,12 +93,9 @@ } public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){ String token = request.getHeader(JwtTokenUtil.HEADER_KEY); public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response,String token){ try { //获取账号ID Long memberId = JwtTokenUtil.getJwtPayLoad(token).getUserId(); String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.CUSTOMER+"_"+memberId); String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.CUSTOMER+"_"+token); if(StringUtils.isNotBlank(tokenRedis)){ if(!tokenRedis.equals(token)){ throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录"); @@ -107,7 +103,8 @@ }else{ throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录"); } Member member = dao.queryForObject(" select * from `member` where id = ? limit 1 ", new BeanPropertyRowMapper<>(Member.class),memberId ); Long memberId = getTokenId(token); Member member = dao.queryForObject(" select * from `member` where id = ? limit 1 ", new BeanPropertyRowMapper<>(Member.class),memberId); if(Objects.isNull(member)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } @@ -125,12 +122,9 @@ } } public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response){ String token = request.getHeader(JwtTokenUtil.HEADER_KEY); public Boolean checkPersonnelLogin(HttpServletRequest request, HttpServletResponse response,String token){ try { //获取账号ID Long userId = JwtTokenUtil.getJwtPayLoad(token).getUserId(); String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.BUSINESS+"_"+userId); String tokenRedis = (String) redisTemplate.opsForValue().get(ZTConstants.BUSINESS+"_"+token); if(StringUtils.isNotBlank(tokenRedis)){ if(!tokenRedis.equals(token)){ throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录"); @@ -138,6 +132,7 @@ }else{ throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录"); } Long userId = getTokenId(token); Users users = dao.queryForObject(" select * from `users` where id = ? limit 1 ", new BeanPropertyRowMapper<>(Users.class),userId); if(Objects.isNull(users)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); @@ -161,5 +156,14 @@ return new RestTemplate(); } public Long getTokenId(String token){ try { Integer lastIndex = token.lastIndexOf("_")+1; Long tokenId = Long.valueOf(token.substring(0,lastIndex)); return tokenId; }catch (Exception e){ throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录"); } } } server/service/src/main/java/com/doumee/dao/web/response/AccountResponse.java
@@ -24,6 +24,9 @@ @ApiModelProperty(value = "微信sessionKey") private String sessionKey; @ApiModelProperty(value = "手机号") private String phone; @ApiModelProperty(value = "用户信息 - 客户端") private Member member; server/service/src/main/java/com/doumee/service/business/UsersService.java
@@ -7,6 +7,7 @@ import com.doumee.dao.business.model.Users; import com.doumee.dao.web.reqeust.ContentShareImgDto; import com.doumee.dao.web.reqeust.EditUsersRequest; import com.doumee.dao.web.reqeust.WxPhoneRequest; import com.doumee.dao.web.response.AccountResponse; import org.springframework.web.multipart.MultipartFile; @@ -121,4 +122,6 @@ String getContentShareImg(Users loginUserInfo, ContentShareImgDto param); ZTBaseRequst logOff(Long userId); AccountResponse getWxMiniPhoneLogin(WxPhoneRequest wxPhoneRequest); } server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -275,7 +275,7 @@ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"获取openid失败!请联系管理员"); } // String openId = code; Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("OPENID", openId)); Member member = memberMapper.selectOne(new QueryWrapper<Member>().eq("OPENID", openId).isNotNull("phone")); Users users = new Users(); if(StringUtils.isBlank(iamId)){ users = usersMapper.selectOne(new QueryWrapper<Users>().lambda() @@ -535,8 +535,6 @@ } @Override public ZTBaseRequst logOff(Long memberId){ Member member = memberMapper.selectById(memberId); @@ -555,6 +553,7 @@ ztBaseRequst.setOpenId(member.getOpenid()); ztBaseRequst.setToken(member.getToken()); memberMapper.update(new UpdateWrapper<Member>().lambda() .set(Member::getOpenid,null) .set(Member::getPhone,null) .set(Member::getEditDate,new Date()) .eq(Member::getId,member.getId()) server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java
@@ -1,6 +1,7 @@ package com.doumee.service.business.impl; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.hutool.core.date.DateUnit; import com.alibaba.fastjson.JSONObject; import com.doumee.biz.system.SystemDictDataBiz; @@ -34,6 +35,7 @@ import com.doumee.dao.system.model.SystemUser; import com.doumee.dao.web.reqeust.EditUsersRequest; import com.doumee.dao.web.reqeust.ContentShareImgDto; import com.doumee.dao.web.reqeust.WxPhoneRequest; import com.doumee.dao.web.response.AccountResponse; import com.doumee.service.business.UsersService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -362,9 +364,10 @@ // } // smsEmailMapper.updateById(model); //创建token JwtPayLoad payLoad = new JwtPayLoad(users.getId(),Constants.ONE); String token = JwtTokenUtil.generateToken(payLoad); redisTemplate.opsForValue().set(ZTConstants.BUSINESS+"_"+users.getId(),token); // JwtPayLoad payLoad = new JwtPayLoad(users.getId(),Constants.ONE); // String token = JwtTokenUtil.generateToken(payLoad); // redisTemplate.opsForValue().set(ZTConstants.BUSINESS+"_"+users.getId(),token); String token = JwtTokenUtil.generateTokenForZb(users.getId(),ZTConstants.BUSINESS,"",redisTemplate); AccountResponse accountResponse = new AccountResponse(); accountResponse.setToken(token); accountResponse.setUsers(users); @@ -384,6 +387,7 @@ accountResponse.setSessionKey(session.getSessionKey()); Users users = usersMapper.selectOne(new QueryWrapper<Users>().lambda().eq(Users::getOpenid,openId).last("limit 1")); if(Objects.isNull(users)){ accountResponse.setSessionKey(session.getSessionKey()); return accountResponse; } if(!Constants.equalsInteger(users.getIsdeleted(),Constants.ZERO)){ @@ -400,6 +404,7 @@ redisTemplate.opsForValue().set(ZTConstants.BUSINESS+"_"+users.getId(),token); accountResponse.setToken(token); getUsersDetail(users); accountResponse.setSessionKey(session.getSessionKey()); accountResponse.setUsers(users); return accountResponse; } catch (WxErrorException e) { @@ -408,6 +413,36 @@ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员"); } @Override public AccountResponse getWxMiniPhoneLogin(WxPhoneRequest wxPhoneRequest){ try { WxMaPhoneNumberInfo userPhoneInfo = WxMiniConfig.wxPersonnelService.getUserService().getPhoneNoInfo( wxPhoneRequest.getSessionKey(), wxPhoneRequest.getEncryptedData(), wxPhoneRequest.getIv()); //获取手机号 String phone= userPhoneInfo.getPurePhoneNumber(); if(Objects.isNull(phone)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未获取到手机号"); } Users users = usersMapper.selectOne(new QueryWrapper<Users>().lambda() .eq(Users::getPhone,phone).last("limit 1")); AccountResponse accountResponse = new AccountResponse(); accountResponse.setPhone(phone); if(Objects.isNull(users)){ return accountResponse; } accountResponse.setUsers(users); //创建token JwtPayLoad payLoad = new JwtPayLoad(users.getId(),Constants.ZERO); String token = JwtTokenUtil.generateToken(payLoad); redisTemplate.opsForValue().set(ZTConstants.BUSINESS+"_"+users.getId(),token); return accountResponse; } catch (Exception e) { e.printStackTrace(); } throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"更新手机号失败"); } @Override public void bindingOpenid(String code,Long userId){ server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -1,6 +1,8 @@ package com.doumee.api.web; import com.doumee.config.Jwt.JwtTokenUtil; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Users; import com.doumee.service.business.MemberService; @@ -51,6 +53,9 @@ Object obj = this.getRequest().getAttribute(JwtTokenUtil.UserId_Name); return obj != null ? (Long) obj : null; } protected Long getUserId() { // if(isDebug){ // return 2L; @@ -61,7 +66,7 @@ protected Users getLoginUserInfo() { Long userId = getUserId(); if(userId== null){ return null; throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"未登录"); } Users user = usersService.findById(userId); return user; server/web/src/main/java/com/doumee/api/web/CustomerApi.java
@@ -92,6 +92,9 @@ return ApiResponse.success(memberService.wxLogin(code,iamId)); } @LoginRequired @ApiOperation(value = "获取手机号", notes = "客户端小程序") @PostMapping("/getWxMiniPhone") server/web/src/main/java/com/doumee/api/web/CustomerManageApi.java
@@ -3,6 +3,7 @@ import com.doumee.biz.zbom.ZbomCRMService; import com.doumee.biz.zbom.ZbomZhongTaiService; import com.doumee.config.annotation.LoginRequired; import com.doumee.config.annotation.UserLoginRequired; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.PageData; @@ -78,9 +79,11 @@ @UserLoginRequired @ApiOperation(value = "获取客户管理授权-列表跳转地址", notes = "获取客户管理授权跳转地址") @GetMapping("/getCrmAuthUrl") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true), @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "类型 0客户列表 1跳转新增意向客户", required = true) }) public ApiResponse<String> getCrmAuthUrl(@RequestParam Integer type) { server/web/src/main/java/com/doumee/api/web/PersonnelApi.java
@@ -19,10 +19,7 @@ import com.doumee.dao.business.model.Shop; import com.doumee.dao.business.model.SmsEmail; import com.doumee.dao.business.model.Users; import com.doumee.dao.web.reqeust.EditMemberRequest; import com.doumee.dao.web.reqeust.EditShopDTO; import com.doumee.dao.web.reqeust.EditUsersRequest; import com.doumee.dao.web.reqeust.ContentShareImgDto; import com.doumee.dao.web.reqeust.*; import com.doumee.dao.web.response.AccountResponse; import com.doumee.service.business.*; import io.swagger.annotations.Api; @@ -35,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.List; import java.util.Objects; @@ -88,7 +86,6 @@ } @ApiOperation(value = "手机号验证码登陆", notes = "员工端小程序") @GetMapping("/loginByPhone") @ApiImplicitParams({ @@ -112,6 +109,14 @@ return ApiResponse.success("操作成功"); } @ApiOperation(value = "手机号快捷登录", notes = "客户端小程序") @PostMapping("/getWxMiniPhoneLogin") public ApiResponse<AccountResponse> getWxMiniPhone(@Valid @RequestBody WxPhoneRequest wxPhoneRequest) { return ApiResponse.success("获取成功",usersService.getWxMiniPhoneLogin(wxPhoneRequest)); } @UserLoginRequired @ApiOperation(value = "获取个人信息详情", notes = "员工端小程序") @GetMapping("/getUserDetail") server/web/src/main/resources/application.yml
@@ -1,6 +1,6 @@ # 项目信息配置 project: name: 智能会议室小程序端 name: 志邦业绩数字化赋能小程序 version: 1.0.0 env: development # env: production