diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java index b92e26e..4a644a3 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java @@ -60,5 +60,15 @@ public class CacheConstants /** * 微信小程序的 session_key */ - public static final String wx_session_key_cache = "wx_session_key:"; + public static final String WX_SESSION_KEY_CACHE = "wx_session_key:"; + + /** + * 微信小程序 access_token + */ + public static final String WX_ACCESS_TOKEN_CACHE = "wx_access_token_cache:"; + + /** + * 微信小程序 access_token + */ + public static final long WX_ACCESS_TOKEN_EXPIRATION = 120; } diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxUserMember.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxUserMember.java index 2a685fc..f4d6776 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxUserMember.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/WxUserMember.java @@ -52,7 +52,7 @@ public class WxUserMember extends BaseEntity { private String openid; /** - * $column.columnComment + * unionid */ @Excel(name = "unionid") private String unionid; @@ -75,18 +75,6 @@ public class WxUserMember extends BaseEntity { @Excel(name = "手机") private String mobile; - /** - * 密码 - */ - @Excel(name = "密码") - private String password; - - /** - * 个人二维码 - */ - @Excel(name = "个人二维码") - private String userQr; - /** * 省id */ @@ -131,13 +119,13 @@ public class WxUserMember extends BaseEntity { private Date birthday; /** - * 1可以2不可以 + * 打卡:1可以2不可以 */ @Excel(name = "1可以2不可以") private Integer clock; /** - * 1可以2不可以 + * 活动:1可以2不可以 */ @Excel(name = "1可以2不可以") private Integer activity; @@ -148,11 +136,6 @@ public class WxUserMember extends BaseEntity { @Excel(name = "微信号") private String wechat; - /** - * 应该是邀请码来的 - */ - @Excel(name = "应该是邀请码来的") - private String code; /** * 1 未对接到中控 2已经对接 3对接失败 @@ -160,17 +143,16 @@ public class WxUserMember extends BaseEntity { @Excel(name = "1 未对接到中控 2已经对接 3对接失败") private Integer isAbutment; + /** - * $column.columnComment + * 是否完善信息: :0 未完善 1完善 */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") - private BigDecimal collagenDay; + private Integer isCompleteInformation; /** - * $column.columnComment + * 绑定的仪器数量 */ - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") - private BigDecimal collagenMount; + private Integer devicesNum; /** * 登陆时间 @@ -265,22 +247,6 @@ public class WxUserMember extends BaseEntity { return mobile; } - public void setPassword(String password) { - this.password = password; - } - - public String getPassword() { - return password; - } - - public void setUserQr(String userQr) { - this.userQr = userQr; - } - - public String getUserQr() { - return userQr; - } - public void setProvince(String province) { this.province = province; } @@ -337,13 +303,6 @@ public class WxUserMember extends BaseEntity { return wechat; } - public void setCode(String code) { - this.code = code; - } - - public String getCode() { - return code; - } public void setIsAbutment(Integer isAbutment) { this.isAbutment = isAbutment; @@ -353,22 +312,6 @@ public class WxUserMember extends BaseEntity { return isAbutment; } - public void setCollagenDay(BigDecimal collagenDay) { - this.collagenDay = collagenDay; - } - - public BigDecimal getCollagenDay() { - return collagenDay; - } - - public void setCollagenMount(BigDecimal collagenMount) { - this.collagenMount = collagenMount; - } - - public BigDecimal getCollagenMount() { - return collagenMount; - } - public void setLoginTime(Date loginTime) { this.loginTime = loginTime; } @@ -409,10 +352,26 @@ public class WxUserMember extends BaseEntity { this.areaId = areaId; } + public Integer getIsCompleteInformation() { + return isCompleteInformation; + } + + public void setIsCompleteInformation(Integer isCompleteInformation) { + this.isCompleteInformation = isCompleteInformation; + } + + public Integer getDevicesNum() { + return devicesNum; + } + + public void setDevicesNum(Integer devicesNum) { + this.devicesNum = devicesNum; + } + public WxUserMember() { } - public WxUserMember(Long id, String nickname, String headimg, String username, BigDecimal credit, String openid, String unionid, Integer userType, Integer level, String mobile, String password, String userQr, String provinceId, String province, String cityId, String city, String areaId, String area, Date birthday, Integer clock, Integer activity, String wechat, String code, Integer isAbutment, BigDecimal collagenDay, BigDecimal collagenMount, Date loginTime, Integer status) { + public WxUserMember(Long id, String nickname, String headimg, String username, BigDecimal credit, String openid, String unionid, Integer userType, Integer level, String mobile, String provinceId, String province, String cityId, String city, String areaId, String area, Date birthday, Integer clock, Integer activity, String wechat, Integer isAbutment, Integer isCompleteInformation, Integer devicesNum, Date loginTime, Integer status) { this.id = id; this.nickname = nickname; this.headimg = headimg; @@ -423,8 +382,6 @@ public class WxUserMember extends BaseEntity { this.userType = userType; this.level = level; this.mobile = mobile; - this.password = password; - this.userQr = userQr; this.provinceId = provinceId; this.province = province; this.cityId = cityId; @@ -435,45 +392,10 @@ public class WxUserMember extends BaseEntity { this.clock = clock; this.activity = activity; this.wechat = wechat; - this.code = code; this.isAbutment = isAbutment; - this.collagenDay = collagenDay; - this.collagenMount = collagenMount; + this.isCompleteInformation = isCompleteInformation; + this.devicesNum = devicesNum; this.loginTime = loginTime; this.status = status; } - - @Override - public String toString() { - return "WxUserMember{" + - "id=" + id + - ", nickname='" + nickname + '\'' + - ", headimg='" + headimg + '\'' + - ", username='" + username + '\'' + - ", credit=" + credit + - ", openid='" + openid + '\'' + - ", unionid='" + unionid + '\'' + - ", userType=" + userType + - ", level=" + level + - ", mobile='" + mobile + '\'' + - ", password='" + password + '\'' + - ", userQr='" + userQr + '\'' + - ", provinceId='" + provinceId + '\'' + - ", province='" + province + '\'' + - ", cityId='" + cityId + '\'' + - ", city='" + city + '\'' + - ", areaId='" + areaId + '\'' + - ", area='" + area + '\'' + - ", birthday=" + birthday + - ", clock=" + clock + - ", activity=" + activity + - ", wechat='" + wechat + '\'' + - ", code='" + code + '\'' + - ", isAbutment=" + isAbutment + - ", collagenDay=" + collagenDay + - ", collagenMount=" + collagenMount + - ", loginTime=" + loginTime + - ", status=" + status + - '}'; - } } diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserMemberVm.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserMemberVm.java new file mode 100644 index 0000000..5f59a09 --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/req/WxUserMemberVm.java @@ -0,0 +1,203 @@ +package com.flossom.common.core.domain.req; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.flossom.common.core.annotation.Excel; +import com.flossom.common.core.web.domain.BaseEntity; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 微信用户查询对象 + * + * @author flossom + * @date 2023-12-08 + */ +public class WxUserMemberVm { + + /** + * 用户编码 + */ + private Long id; + + /** + * 会员昵称 + */ + @Excel(name = "会员昵称") + private String nickname; + + + /** + * 积分起始 + */ + @Excel(name = "积分") + private Integer creditStart; + + /** + * 积分结束 + */ + private Integer creditEnd; + + /** + * 用户类型:0游客 1会员 + */ + @Excel(name = "用户类型:0游客 1会员") + private Integer userType; + + + /** + * 手机(多个手机号码,‘,’逗号隔开,号码数不足时,模糊匹配) + */ + @Excel(name = "手机") + private String mobile; + + /** + * 省id + */ + @Excel(name = "省id") + private String provinceId; + + + /** + * 市id + */ + @Excel(name = "市id") + private String cityId; + + + /** + * 区id + */ + @Excel(name = "区id") + private String areaId; + + /** + * 生日 + */ + @JsonFormat(pattern = "yyyy-MM-dd") + private Date birthday; + + /** + * 用户注册起始时间 + */ + private Date createTimeStart; + + /** + * 用户注册结束时间 + */ + private Date createTimeEnd; + + public WxUserMemberVm() { + } + + public WxUserMemberVm(Long id, String nickname, Integer creditStart, Integer creditEnd, Integer userType, String mobile, String provinceId, String cityId, String areaId, Date birthday, Date createTimeStart, Date createTimeEnd) { + this.id = id; + this.nickname = nickname; + this.creditStart = creditStart; + this.creditEnd = creditEnd; + this.userType = userType; + this.mobile = mobile; + this.provinceId = provinceId; + this.cityId = cityId; + this.areaId = areaId; + this.birthday = birthday; + this.createTimeStart = createTimeStart; + this.createTimeEnd = createTimeEnd; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getCreditStart() { + return creditStart; + } + + public void setCreditStart(Integer creditStart) { + this.creditStart = creditStart; + } + + public Integer getCreditEnd() { + return creditEnd; + } + + public void setCreditEnd(Integer creditEnd) { + this.creditEnd = creditEnd; + } + + public Integer getUserType() { + return userType; + } + + public void setUserType(Integer userType) { + this.userType = userType; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getProvinceId() { + return provinceId; + } + + public void setProvinceId(String provinceId) { + this.provinceId = provinceId; + } + + public String getCityId() { + return cityId; + } + + public void setCityId(String cityId) { + this.cityId = cityId; + } + + public String getAreaId() { + return areaId; + } + + public void setAreaId(String areaId) { + this.areaId = areaId; + } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + + public Date getCreateTimeStart() { + return createTimeStart; + } + + public void setCreateTimeStart(Date createTimeStart) { + this.createTimeStart = createTimeStart; + } + + public Date getCreateTimeEnd() { + return createTimeEnd; + } + + public void setCreateTimeEnd(Date createTimeEnd) { + this.createTimeEnd = createTimeEnd; + } +} diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserIntegralLogMapper.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserIntegralLogMapper.java index 5498227..3894731 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserIntegralLogMapper.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserIntegralLogMapper.java @@ -1,6 +1,7 @@ package com.flossom.common.core.mapper; import com.flossom.common.core.domain.entity.WxUserIntegralLog; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -59,4 +60,6 @@ public interface WxUserIntegralLogMapper * @return 结果 */ public int deleteWxUserIntegralLogByIds(Long[] ids); + + List obtainUserIntegral(@Param("userId") Long userId); } diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserMemberMapper.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserMemberMapper.java index 9234280..2e31f51 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserMemberMapper.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/WxUserMemberMapper.java @@ -2,6 +2,7 @@ package com.flossom.common.core.mapper; import com.flossom.common.core.domain.entity.WxUserMember; +import com.flossom.common.core.domain.req.WxUserMemberVm; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -72,4 +73,6 @@ public interface WxUserMemberMapper { WxUserMember selectWxUserMemberByOpenId(@Param("openid") String openid); void upgradeMember(@Param("phoneNumber") String phoneNumber, @Param("id") Integer id); + + List selectWxUserMemberListByVm(WxUserMemberVm wxUserMemberVm); } diff --git a/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserIntegralLogMapper.xml b/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserIntegralLogMapper.xml index ea059d6..c84bc8b 100644 --- a/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserIntegralLogMapper.xml +++ b/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserIntegralLogMapper.xml @@ -39,6 +39,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + insert into wx_user_integral_log diff --git a/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserMemberMapper.xml b/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserMemberMapper.xml index b1ad6d2..7880fa1 100644 --- a/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserMemberMapper.xml +++ b/flossom-common/flossom-common-core/src/main/resources/mapper/WxUserMemberMapper.xml @@ -15,8 +15,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - @@ -27,10 +25,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - + + @@ -41,7 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, nickname, headimg, username, credit, openid, unionid, user_type, level, mobile, password, user_qr, province_id, city_id, area_id, province, city, area, birthday, clock, activity, wechat, code, is_abutment, collagen_day, collagen_mount, login_time, status, create_by, create_time, update_by, update_time, remark from wx_user_member + select id, nickname, headimg, username, credit, openid, unionid, user_type, level, mobile, province_id, city_id, area_id, province, city, area, birthday, clock, activity, wechat, is_abutment, login_time, is_complete_information, devices_num, status, create_by, create_time, update_by, update_time, remark from wx_user_member @@ -87,6 +81,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE openid = #{openid} + + insert into wx_user_member @@ -99,8 +109,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" user_type, level, mobile, - password, - user_qr, province_id, city_id, area_id, @@ -111,10 +119,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" clock, activity, wechat, - code, is_abutment, - collagen_day, - collagen_mount, + is_complete_information, + devices_num, login_time, status, create_by, @@ -133,8 +140,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{userType}, #{level}, #{mobile}, - #{password}, - #{userQr}, #{provinceId}, #{cityId}, #{areaId}, @@ -145,10 +150,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{clock}, #{activity}, #{wechat}, - #{code}, #{isAbutment}, - #{collagenDay}, - #{collagenMount}, + #{isCompleteInformation}, + #{devicesNum}, #{loginTime}, #{status}, #{createBy}, @@ -171,8 +175,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" user_type = #{userType}, level = #{level}, mobile = #{mobile}, - password = #{password}, - user_qr = #{userQr}, province_id = #{provinceId}, city_id = #{cityId}, area_id = #{areaId}, @@ -183,11 +185,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" clock = #{clock}, activity = #{activity}, wechat = #{wechat}, - code = #{code}, is_abutment = #{isAbutment}, - collagen_day = #{collagenDay}, - collagen_mount = #{collagenMount}, login_time = #{loginTime}, + is_complete_information = #{isCompleteInformation}, + devices_num = #{devicesNum}, status = #{status}, create_by = #{createBy}, create_time = #{createTime}, diff --git a/flossom-common/flossom-common-security/src/main/java/com/flossom/common/security/service/TokenService.java b/flossom-common/flossom-common-security/src/main/java/com/flossom/common/security/service/TokenService.java index dbce0f2..f9f7bfd 100644 --- a/flossom-common/flossom-common-security/src/main/java/com/flossom/common/security/service/TokenService.java +++ b/flossom-common/flossom-common-security/src/main/java/com/flossom/common/security/service/TokenService.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.concurrent.TimeUnit; import javax.servlet.http.HttpServletRequest; +import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.common.security.utils.SecurityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -151,6 +152,10 @@ public class TokenService if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { refreshToken(loginUser); + // 判断是否是微信用户 + if(loginUser.getWxUserMember() != null) { + refreshSessionKey(loginUser); + } } } @@ -168,6 +173,21 @@ public class TokenService redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); } + /** + * 刷新session_key有效期 + * + * @param loginUser 登录信息 + */ + public void refreshSessionKey(LoginUser loginUser) + { + WxUserMember wxUserMember = loginUser.getWxUserMember(); + String sessionKey = redisService.getCacheObject(CacheConstants.WX_SESSION_KEY_CACHE + wxUserMember.getOpenid()); + if(StringUtils.isNotBlank(sessionKey)) { + redisService.setCacheObject(CacheConstants.WX_SESSION_KEY_CACHE + wxUserMember.getOpenid(), + sessionKey, CacheConstants.EXPIRATION, TimeUnit.MINUTES); + } + } + private String getTokenKey(String token) { return ACCESS_TOKEN + token; diff --git a/flossom-modules/flossom-mini-program/pom.xml b/flossom-modules/flossom-mini-program/pom.xml index bbce8c2..3344c69 100644 --- a/flossom-modules/flossom-mini-program/pom.xml +++ b/flossom-modules/flossom-mini-program/pom.xml @@ -91,6 +91,17 @@ 4.5.2 + + junit + junit + test + + + org.springframework.boot + spring-boot-starter-test + test + + diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java index c705df8..119a7d0 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java @@ -25,6 +25,9 @@ public class WxConfig { */ private String obtainPhoneUrl; + private String accessTokenUrl; + + public String getLoginUrl() { return loginUrl; } @@ -40,4 +43,12 @@ public class WxConfig { public void setObtainPhoneUrl(String obtainPhoneUrl) { this.obtainPhoneUrl = obtainPhoneUrl; } + + public String getAccessTokenUrl() { + return accessTokenUrl; + } + + public void setAccessTokenUrl(String accessTokenUrl) { + this.accessTokenUrl = accessTokenUrl; + } } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java index ff47d40..c21f86d 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java @@ -36,8 +36,7 @@ public class UserMemberController extends BaseController { */ @PostMapping("/upgradeMember") public AjaxResult upgradeMember(@RequestParam(value = "code") String code) throws Exception { - wxUserMemberService.upgradeMember(code); - return AjaxResult.success(); + return AjaxResult.success("获取成功", wxUserMemberService.upgradeMember(code)); } /** diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/WxUserIntegraController.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/WxUserIntegraController.java new file mode 100644 index 0000000..de5215e --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/WxUserIntegraController.java @@ -0,0 +1,39 @@ +package com.flossom.miniProgram.controller; + +import com.flossom.common.core.domain.entity.WxUserIntegralLog; +import com.flossom.common.core.web.controller.BaseController; +import com.flossom.common.core.web.domain.AjaxResult; +import com.flossom.common.core.web.page.TableDataInfo; +import com.flossom.miniProgram.service.IWxUserIntegralService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 微信用户积分 Controller + * + * @author flossom + * @date 2023-12-14 + */ +@RestController +@RequestMapping("/integralLog") +public class WxUserIntegraController extends BaseController { + + @Autowired + private IWxUserIntegralService wxUserIntegralLogService; + + + /** + * 获取用户积分列表 + * + * @return + */ + @GetMapping("/obtainUserIntegral") + public TableDataInfo obtainUserIntegral() { + startPage(); + List list = wxUserIntegralLogService.obtainUserIntegral(); + return getDataTable(list); + } + +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxAccessTokenRet.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxAccessTokenRet.java new file mode 100644 index 0000000..aab11bb --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxAccessTokenRet.java @@ -0,0 +1,64 @@ +package com.flossom.miniProgram.domain.vo; + +/** + * 登录响应结果 + */ +public class WxAccessTokenRet { + + private String access_token; + private String expires_in; + private Integer errcode; + private String errmsg; + + public WxAccessTokenRet() { + } + + public WxAccessTokenRet(String access_token, String expires_in, Integer errcode, String errmsg) { + this.access_token = access_token; + this.expires_in = expires_in; + this.errcode = errcode; + this.errmsg = errmsg; + } + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getExpires_in() { + return expires_in; + } + + public void setExpires_in(String expires_in) { + this.expires_in = expires_in; + } + + public Integer getErrcode() { + return errcode; + } + + public void setErrcode(Integer errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + @Override + public String toString() { + return "WxAccessTokenRet{" + + "access_token='" + access_token + '\'' + + ", expires_in='" + expires_in + '\'' + + ", errcode=" + errcode + + ", errmsg='" + errmsg + '\'' + + '}'; + } +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java index 1262412..5b4b0cb 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java @@ -5,25 +5,25 @@ package com.flossom.miniProgram.domain.vo; */ public class WxCode2PhoneRet { - private PhoneInfo phoneInfo; + private PhoneInfo phone_info; private Integer errcode; private String errmsg; public WxCode2PhoneRet() { } - public WxCode2PhoneRet(PhoneInfo phoneInfo, Integer errcode, String errmsg) { - this.phoneInfo = phoneInfo; + public WxCode2PhoneRet(PhoneInfo phone_info, Integer errcode, String errmsg) { + this.phone_info = phone_info; this.errcode = errcode; this.errmsg = errmsg; } public PhoneInfo getPhoneInfo() { - return phoneInfo; + return phone_info; } public void setPhoneInfo(PhoneInfo phoneInfo) { - this.phoneInfo = phoneInfo; + this.phone_info = phoneInfo; } public Integer getErrcode() { @@ -41,4 +41,13 @@ public class WxCode2PhoneRet { public void setErrmsg(String errmsg) { this.errmsg = errmsg; } + + @Override + public String toString() { + return "WxCode2PhoneRet{" + + "phoneInfo=" + phone_info + + ", errcode=" + errcode + + ", errmsg='" + errmsg + '\'' + + '}'; + } } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserIntegralService.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserIntegralService.java new file mode 100644 index 0000000..0cebe02 --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserIntegralService.java @@ -0,0 +1,11 @@ +package com.flossom.miniProgram.service; + +import com.flossom.common.core.domain.entity.WxUserIntegralLog; + +import java.util.List; + +public interface IWxUserIntegralService { + + List obtainUserIntegral(); + +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java index 2419195..b54128e 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java @@ -8,7 +8,7 @@ public interface IWxUserMemberService { LoginUserVo login(String code) throws Exception; - void upgradeMember(String code) throws Exception; + String upgradeMember(String code) throws Exception; void updateUser(UserMemberUpdateVo userMemberUpdateVo); } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserIntegralServiceImpl.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserIntegralServiceImpl.java new file mode 100644 index 0000000..fd38a59 --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserIntegralServiceImpl.java @@ -0,0 +1,25 @@ +package com.flossom.miniProgram.service.impl; + + +import com.flossom.common.core.domain.entity.WxUserIntegralLog; +import com.flossom.common.core.domain.entity.WxUserMember; +import com.flossom.common.core.mapper.WxUserIntegralLogMapper; +import com.flossom.common.security.utils.SecurityUtils; +import com.flossom.miniProgram.service.IWxUserIntegralService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class WxUserIntegralServiceImpl implements IWxUserIntegralService { + + @Autowired + private WxUserIntegralLogMapper wxUserIntegralLogMapper; + + @Override + public List obtainUserIntegral() { + WxUserMember wxUserMember = SecurityUtils.getLoginUser().getWxUserMember(); + return wxUserIntegralLogMapper.obtainUserIntegral(wxUserMember.getId()); + } +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java index 6d98143..1ee250c 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java @@ -1,29 +1,21 @@ package com.flossom.miniProgram.service.impl; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.flossom.common.core.constant.CacheConstants; import com.flossom.common.core.constant.UserConstants; -import com.flossom.common.core.domain.LoginBody; import com.flossom.common.core.domain.R; import com.flossom.common.core.domain.RegisterBody; import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.common.core.exception.ServiceException; import com.flossom.common.core.mapper.WxUserMemberMapper; import com.flossom.common.core.utils.DateUtils; -import com.flossom.common.core.web.domain.AjaxResult; +import com.flossom.common.core.utils.StringUtils; import com.flossom.common.redis.service.RedisService; import com.flossom.common.security.utils.SecurityUtils; -import com.flossom.miniProgram.domain.vo.LoginUserVo; -import com.flossom.miniProgram.domain.vo.UserMemberUpdateVo; -import com.flossom.miniProgram.domain.vo.WxCode2PhoneRet; -import com.flossom.miniProgram.domain.vo.WxCode2SessionRet; +import com.flossom.miniProgram.domain.vo.*; import com.flossom.miniProgram.service.IWxUserMemberService; import com.flossom.miniProgram.utils.MiniProgramUtils; import com.flossom.system.api.RemoteAuthService; -import com.flossom.system.api.RemoteUserService; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -50,13 +42,15 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { @Override public LoginUserVo login(String code) throws Exception { // 1、使用临时凭证 code 获取 appi + appsecret + unionid - WxCode2SessionRet wxCode2SessionRet = JSON.parseObject(MiniProgramUtils.getSessionKeyAndOpenId(code), WxCode2SessionRet.class); + String result = MiniProgramUtils.getSessionKeyAndOpenId(code); + logger.info("请求微信服务器获取openid和unionid,返回结果:{}", result); + WxCode2SessionRet wxCode2SessionRet = JSON.parseObject(result, WxCode2SessionRet.class); if (wxCode2SessionRet.getErrcode() != null) { logger.error(wxCode2SessionRet.getErrmsg()); throw new ServiceException("校验失败"); } - logger.info("openid", wxCode2SessionRet.getOpenid()); - logger.info("unionid", wxCode2SessionRet.getUnionid()); + logger.info("openid = {}", wxCode2SessionRet.getOpenid()); + logger.info("unionid = {}", wxCode2SessionRet.getUnionid()); // 2、根据 openid 查询用户信息 WxUserMember wxUserMember = wxUserMemberMapper.selectWxUserMemberByOpenId(wxCode2SessionRet.getOpenid()); @@ -68,9 +62,9 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { wxUserMember.setUnionid(wxCode2SessionRet.getUnionid()); wxUserMember.setLoginTime(DateUtils.getNowDate()); wxUserMember.setCreateTime(DateUtils.getNowDate()); - // 3.2、微信用户表注册 + // 2.2、微信用户表注册 wxUserMemberMapper.insertWxUserMember(wxUserMember); - // 3.3、系统表注册 + // 2.3、系统表注册 RegisterBody registerBody = new RegisterBody(); registerBody.setUsername(wxUserMember.getOpenid()); registerBody.setPassword(UserConstants.WX_SYSTEM_USER_PASSWORD); @@ -87,29 +81,40 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { logger.error("获取token失败:{}", loginResult.getMsg()); throw new ServiceException(loginResult.getMsg()); } - /** - * TODO: 暂时将session_key保存在redis,后期根据业务修改 + * TODO: 将 session_key 缓存在 redis,并且由于官方没有规定 session_key 的有效期,所以使用时候要注意如下: + * 当需要使用的时候,需要前端先判断微信的登录态是否过期(wx.checkSession()) + * 1、如果过期,重新调用登录接口获取新的 session_key + * 2、如果没过期,但由于security的拦截器会判断过期时间不足120分钟时会,会对session_key进行续期:{@link com.flossom.common.security.service.TokenService#refreshSessionKey} */ - redisService.setCacheObject(CacheConstants.wx_session_key_cache + wxUserMember.getOpenid(), + redisService.setCacheObject(CacheConstants.WX_SESSION_KEY_CACHE + wxUserMember.getOpenid(), wxCode2SessionRet.getSession_key(), CacheConstants.EXPIRATION, TimeUnit.MINUTES); // 4、返回登录信息 LoginUserVo loginUserVo = new LoginUserVo(); BeanUtils.copyProperties(wxUserMember, loginUserVo); loginUserVo.setToken(loginResult.getData().get("access_token")); - logger.info("登录用户信息:id = {}, username = {}", loginUserVo.getId(), loginUserVo.getUsername()); + logger.info("登录用户信息:id = {}, username = {}, token={}", loginUserVo.getId(), loginUserVo.getUsername(), loginUserVo.getToken()); return loginUserVo; } @Override - public void upgradeMember(String code) throws Exception { - WxCode2PhoneRet wxCode2PhoneRet = JSON.parseObject(MiniProgramUtils.getPhone(code), WxCode2PhoneRet.class); - if (wxCode2PhoneRet.getErrcode() != 200) { - logger.error("获取用户手机号码失败: ", wxCode2PhoneRet.getErrmsg()); + public String upgradeMember(String code) throws Exception { + String accessToken = MiniProgramUtils.getAccessToken(SecurityUtils.getLoginUser().getWxUserMember().getOpenid()); + if (StringUtils.isBlank(accessToken)) { + throw new ServiceException("获取用户手机号码失败"); + } + + // 获取手机号 + String result = MiniProgramUtils.getPhone(code, accessToken); + logger.info("请求微信服务器获取手机号码返回结果:{}", result); + WxCode2PhoneRet wxCode2PhoneRet = JSON.parseObject(result, WxCode2PhoneRet.class); + if (wxCode2PhoneRet.getErrcode() != 0) { + logger.error("获取用户手机号码失败: {}", wxCode2PhoneRet.getErrmsg()); throw new ServiceException("获取用户手机号码失败"); } wxUserMemberMapper.upgradeMember(wxCode2PhoneRet.getPhoneInfo().getPhoneNumber(), SecurityUtils.getWxUserId().intValue()); + return wxCode2PhoneRet.getPhoneInfo().getPhoneNumber(); } @Override diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java index 78c2b19..c8f70ad 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java @@ -1,13 +1,21 @@ package com.flossom.miniProgram.utils; +import com.alibaba.fastjson.JSON; +import com.flossom.common.core.constant.CacheConstants; import com.flossom.common.core.domain.entity.WxParameterSetting; import com.flossom.common.core.mapper.WxParameterSettingMapper; +import com.flossom.common.core.utils.StringUtils; +import com.flossom.common.redis.service.RedisService; import com.flossom.miniProgram.config.properties.WxConfig; +import com.flossom.miniProgram.domain.vo.WxAccessTokenRet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; /** * 小程序工具类 @@ -15,12 +23,17 @@ import java.util.Map; @Component public class MiniProgramUtils { + protected final static Logger logger = LoggerFactory.getLogger(MiniProgramUtils.class); + private static WxConfig wxConfig; private static WxParameterSettingMapper wxParameterSettingMapper; + private static RedisService redisService; + /** * 注入 微信配置mapper,获取 appId,appKey(该配置在数据库) + * * @param wxParameterSettingMapper */ @Autowired @@ -28,8 +41,14 @@ public class MiniProgramUtils { MiniProgramUtils.wxParameterSettingMapper = wxParameterSettingMapper; } + @Autowired + public void setRedisService(RedisService redisService) { + MiniProgramUtils.redisService = redisService; + } + /** * 注入 微信配置类,读取请求路径(该配置在 nacos) + * * @param wxConfig */ @Autowired @@ -85,11 +104,38 @@ public class MiniProgramUtils { * purePhoneNumber string 没有区号的手机号 * countryCode string 区号 */ - public static String getPhone(String code) throws Exception { + public static String getPhone(String code, String accessToken) throws Exception { Map params = new HashMap(); params.put("code", code); - return HttpClientUtils.postParameters(wxConfig.getObtainPhoneUrl(), params); + return HttpClientUtils.postParameters(wxConfig.getObtainPhoneUrl() + "?access_token=" + accessToken, JSON.toJSONString(params)); } + public static String getAccessToken(String openid) throws Exception { + /** + * TODO: 将 access_token 保存在 redis,官方定义说 access_token 的有效期暂定为 2个小时,使用注意事项: + * 1、从 redis 获取 access_token,存在则未过期,不存在则过期了,重新获取 access_token + */ + String accessToken = redisService.getCacheObject(CacheConstants.WX_ACCESS_TOKEN_CACHE + openid); + if (StringUtils.isBlank(accessToken)) { + // 获取 access_token + Map params = new HashMap(); + WxParameterSetting wxParameterSetting = wxParameterSettingMapper.selectWxParameterSettingById(1L); + params.put("appid", wxParameterSetting.getAppid()); + params.put("secret", wxParameterSetting.getAppkey()); + params.put("grant_type", "client_credential"); + String result = HttpClientUtils.getParameters(wxConfig.getAccessTokenUrl(), params); + logger.info("请求微信服务器获取access_token返回结果:{}", result); + WxAccessTokenRet wxAccessTokenRet = JSON.parseObject(result, WxAccessTokenRet.class); + if (wxAccessTokenRet.getErrcode() != null) { + logger.error("获取 access_token 失败: {}", wxAccessTokenRet.getErrmsg()); + return null; + } + // 保存缓存 + redisService.setCacheObject(CacheConstants.WX_ACCESS_TOKEN_CACHE + openid, + wxAccessTokenRet.getAccess_token(), CacheConstants.WX_ACCESS_TOKEN_EXPIRATION, TimeUnit.MINUTES); + return wxAccessTokenRet.getAccess_token(); + } + return accessToken; + } } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java index 8c231a4..42d27bb 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/controller/WxUserMemberController.java @@ -3,6 +3,7 @@ package com.flossom.system.controller; import javax.servlet.http.HttpServletResponse; import com.flossom.common.core.domain.entity.WxUserMember; +import com.flossom.common.core.domain.req.WxUserMemberVm; import com.flossom.common.core.utils.poi.ExcelUtil; import com.flossom.common.core.web.controller.BaseController; import com.flossom.common.core.web.domain.AjaxResult; @@ -31,8 +32,7 @@ import java.util.List; */ @RestController @RequestMapping("/member") -public class WxUserMemberController extends BaseController -{ +public class WxUserMemberController extends BaseController { @Autowired private IWxUserMemberService wxUserMemberService; @@ -41,10 +41,9 @@ public class WxUserMemberController extends BaseController */ @RequiresPermissions("system:member:list") @GetMapping("/list") - public TableDataInfo list(WxUserMember wxUserMember) - { + public TableDataInfo list(WxUserMemberVm wxUserMemberVm) { startPage(); - List list = wxUserMemberService.selectWxUserMemberList(wxUserMember); + List list = wxUserMemberService.selectWxUserMemberList(wxUserMemberVm); return getDataTable(list); } @@ -54,8 +53,7 @@ public class WxUserMemberController extends BaseController @RequiresPermissions("system:member:export") @Log(title = "用户", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, WxUserMember wxUserMember) - { + public void export(HttpServletResponse response, WxUserMember wxUserMember) { List list = wxUserMemberService.selectWxUserMemberList(wxUserMember); ExcelUtil util = new ExcelUtil(WxUserMember.class); util.exportExcel(response, list, "用户数据"); @@ -66,8 +64,7 @@ public class WxUserMemberController extends BaseController */ @RequiresPermissions("system:member:query") @GetMapping(value = "/{id}") - public AjaxResult getInfo(@PathVariable("id") Long id) - { + public AjaxResult getInfo(@PathVariable("id") Long id) { return success(wxUserMemberService.selectWxUserMemberById(id)); } @@ -77,8 +74,7 @@ public class WxUserMemberController extends BaseController @RequiresPermissions("system:member:add") @Log(title = "用户", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody WxUserMember wxUserMember) - { + public AjaxResult add(@RequestBody WxUserMember wxUserMember) { return toAjax(wxUserMemberService.insertWxUserMember(wxUserMember)); } @@ -88,8 +84,7 @@ public class WxUserMemberController extends BaseController @RequiresPermissions("system:member:edit") @Log(title = "用户", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody WxUserMember wxUserMember) - { + public AjaxResult edit(@RequestBody WxUserMember wxUserMember) { return toAjax(wxUserMemberService.updateWxUserMember(wxUserMember)); } @@ -98,9 +93,8 @@ public class WxUserMemberController extends BaseController */ @RequiresPermissions("system:member:remove") @Log(title = "用户", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public AjaxResult remove(@PathVariable Long[] ids) - { + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(wxUserMemberService.deleteWxUserMemberByIds(ids)); } } diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxUserMemberService.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxUserMemberService.java index bac2020..81368d4 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxUserMemberService.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/IWxUserMemberService.java @@ -2,6 +2,7 @@ package com.flossom.system.service; import com.flossom.common.core.domain.entity.WxUserMember; +import com.flossom.common.core.domain.req.WxUserMemberVm; import java.util.List; @@ -29,6 +30,14 @@ public interface IWxUserMemberService */ public List selectWxUserMemberList(WxUserMember wxUserMember); + /** + * 查询用户列表 + * + * @param wxUserMemberVm 用户 + * @return 用户集合 + */ + public List selectWxUserMemberList(WxUserMemberVm wxUserMemberVm); + /** * 新增用户 * diff --git a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java index f52d92a..1be52d5 100644 --- a/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java +++ b/flossom-modules/flossom-system/src/main/java/com/flossom/system/service/impl/WxUserMemberServiceImpl.java @@ -3,6 +3,7 @@ package com.flossom.system.service.impl; import java.util.List; import com.flossom.common.core.domain.entity.WxUserMember; +import com.flossom.common.core.domain.req.WxUserMemberVm; import com.flossom.common.core.mapper.WxUserMemberMapper; import com.flossom.common.core.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -45,6 +46,18 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService return wxUserMemberMapper.selectWxUserMemberList(wxUserMember); } + /** + * 查询用户列表 + * + * @param wxUserMemberVm 用户 + * @return 用户 + */ + @Override + public List selectWxUserMemberList(WxUserMemberVm wxUserMemberVm) + { + return wxUserMemberMapper.selectWxUserMemberListByVm(wxUserMemberVm); + } + /** * 新增用户 * diff --git a/flossom-ui/package.json b/flossom-ui/package.json index 2827a72..10bd79a 100644 --- a/flossom-ui/package.json +++ b/flossom-ui/package.json @@ -5,7 +5,7 @@ "author": "花至", "license": "MIT", "scripts": { - "dev": "vue-cli-service serve", + "dev": "set NODE_OPTIONS=--openssl-legacy-provider & vue-cli-service serve", "build:prod": "vue-cli-service build", "build:stage": "vue-cli-service build --mode staging", "preview": "node build/index.js --preview", diff --git a/flossom-ui/src/views/system/member/index.vue b/flossom-ui/src/views/system/member/index.vue index ce8db44..d375dcc 100644 --- a/flossom-ui/src/views/system/member/index.vue +++ b/flossom-ui/src/views/system/member/index.vue @@ -1,182 +1,82 @@