Commit b548905e by xuwenhao

11.27新增功能

parent e26c48f5
......@@ -61,6 +61,32 @@
<artifactId>qianhe-generator</artifactId>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
<dependency>
<groupId>org.wso2.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.1.wso2v1</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.59</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
</dependencies>
<build>
......
......@@ -31,7 +31,6 @@ public class WaterGoodsController extends BaseController
/**
* 查询商品列表
*/
@PreAuthorize("@ss.hasPermi('system:goods:list')")
@GetMapping("/list")
public TableDataInfo list(WaterGoods waterGoods)
{
......@@ -43,7 +42,6 @@ public class WaterGoodsController extends BaseController
/**
* 导出商品列表
*/
@PreAuthorize("@ss.hasPermi('system:goods:export')")
@Log(title = "商品", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, WaterGoods waterGoods)
......@@ -56,7 +54,6 @@ public class WaterGoodsController extends BaseController
/**
* 获取商品详细信息
*/
@PreAuthorize("@ss.hasPermi('system:goods:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
......@@ -66,7 +63,6 @@ public class WaterGoodsController extends BaseController
/**
* 新增商品
*/
@PreAuthorize("@ss.hasPermi('system:goods:add')")
@Log(title = "商品", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody WaterGoods waterGoods)
......@@ -77,7 +73,6 @@ public class WaterGoodsController extends BaseController
/**
* 修改商品
*/
@PreAuthorize("@ss.hasPermi('system:goods:edit')")
@Log(title = "商品", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody WaterGoods waterGoods)
......@@ -88,7 +83,6 @@ public class WaterGoodsController extends BaseController
/**
* 删除商品
*/
@PreAuthorize("@ss.hasPermi('system:goods:remove')")
@Log(title = "商品", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
......
......@@ -31,7 +31,6 @@ public class WaterGoodsTypeController extends BaseController
/**
* 查询商品分类列表
*/
@PreAuthorize("@ss.hasPermi('system:type:list')")
@GetMapping("/list")
public TableDataInfo list(WaterGoodsType waterGoodsType)
{
......@@ -43,7 +42,6 @@ public class WaterGoodsTypeController extends BaseController
/**
* 导出商品分类列表
*/
@PreAuthorize("@ss.hasPermi('system:type:export')")
@Log(title = "商品分类", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, WaterGoodsType waterGoodsType)
......@@ -56,7 +54,6 @@ public class WaterGoodsTypeController extends BaseController
/**
* 获取商品分类详细信息
*/
@PreAuthorize("@ss.hasPermi('system:type:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
......@@ -66,7 +63,6 @@ public class WaterGoodsTypeController extends BaseController
/**
* 新增商品分类
*/
@PreAuthorize("@ss.hasPermi('system:type:add')")
@Log(title = "商品分类", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody WaterGoodsType waterGoodsType)
......@@ -77,7 +73,6 @@ public class WaterGoodsTypeController extends BaseController
/**
* 修改商品分类
*/
@PreAuthorize("@ss.hasPermi('system:type:edit')")
@Log(title = "商品分类", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody WaterGoodsType waterGoodsType)
......@@ -88,7 +83,6 @@ public class WaterGoodsTypeController extends BaseController
/**
* 删除商品分类
*/
@PreAuthorize("@ss.hasPermi('system:type:remove')")
@Log(title = "商品分类", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
......
......@@ -31,7 +31,6 @@ public class WaterOrderController extends BaseController
/**
* 查询订单列表
*/
@PreAuthorize("@ss.hasPermi('system:order:list')")
@GetMapping("/list")
public TableDataInfo list(WaterOrder waterOrder)
{
......@@ -43,7 +42,6 @@ public class WaterOrderController extends BaseController
/**
* 导出订单列表
*/
@PreAuthorize("@ss.hasPermi('system:order:export')")
@Log(title = "订单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, WaterOrder waterOrder)
......@@ -56,7 +54,6 @@ public class WaterOrderController extends BaseController
/**
* 获取订单详细信息
*/
@PreAuthorize("@ss.hasPermi('system:order:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
......@@ -66,7 +63,6 @@ public class WaterOrderController extends BaseController
/**
* 新增订单
*/
@PreAuthorize("@ss.hasPermi('system:order:add')")
@Log(title = "订单", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody WaterOrder waterOrder)
......@@ -77,7 +73,6 @@ public class WaterOrderController extends BaseController
/**
* 修改订单
*/
@PreAuthorize("@ss.hasPermi('system:order:edit')")
@Log(title = "订单", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody WaterOrder waterOrder)
......@@ -88,7 +83,6 @@ public class WaterOrderController extends BaseController
/**
* 删除订单
*/
@PreAuthorize("@ss.hasPermi('system:order:remove')")
@Log(title = "订单", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
......
......@@ -31,7 +31,6 @@ public class WaterStationController extends BaseController
/**
* 查询站点列表
*/
@PreAuthorize("@ss.hasPermi('system:station:list')")
@GetMapping("/list")
public TableDataInfo list(WaterStation waterStation)
{
......@@ -43,7 +42,6 @@ public class WaterStationController extends BaseController
/**
* 导出站点列表
*/
@PreAuthorize("@ss.hasPermi('system:station:export')")
@Log(title = "站点", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, WaterStation waterStation)
......@@ -56,7 +54,6 @@ public class WaterStationController extends BaseController
/**
* 获取站点详细信息
*/
@PreAuthorize("@ss.hasPermi('system:station:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
......@@ -66,7 +63,6 @@ public class WaterStationController extends BaseController
/**
* 新增站点
*/
@PreAuthorize("@ss.hasPermi('system:station:add')")
@Log(title = "站点", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody WaterStation waterStation)
......@@ -77,7 +73,6 @@ public class WaterStationController extends BaseController
/**
* 修改站点
*/
@PreAuthorize("@ss.hasPermi('system:station:edit')")
@Log(title = "站点", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody WaterStation waterStation)
......@@ -88,7 +83,6 @@ public class WaterStationController extends BaseController
/**
* 删除站点
*/
@PreAuthorize("@ss.hasPermi('system:station:remove')")
@Log(title = "站点", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
......
......@@ -31,7 +31,6 @@ public class WaterUserController extends BaseController
/**
* 查询用户列表
*/
@PreAuthorize("@ss.hasPermi('system:user:list')")
@GetMapping("/list")
public TableDataInfo list(WaterUser waterUser)
{
......@@ -43,7 +42,6 @@ public class WaterUserController extends BaseController
/**
* 导出用户列表
*/
@PreAuthorize("@ss.hasPermi('system:user:export')")
@Log(title = "用户", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, WaterUser waterUser)
......@@ -56,7 +54,6 @@ public class WaterUserController extends BaseController
/**
* 获取用户详细信息
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id)
{
......@@ -66,7 +63,6 @@ public class WaterUserController extends BaseController
/**
* 新增用户
*/
@PreAuthorize("@ss.hasPermi('system:user:add')")
@Log(title = "用户", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody WaterUser waterUser)
......@@ -77,7 +73,6 @@ public class WaterUserController extends BaseController
/**
* 修改用户
*/
@PreAuthorize("@ss.hasPermi('system:user:edit')")
@Log(title = "用户", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody WaterUser waterUser)
......@@ -88,7 +83,6 @@ public class WaterUserController extends BaseController
/**
* 删除用户
*/
@PreAuthorize("@ss.hasPermi('system:user:remove')")
@Log(title = "用户", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids)
......
package com.qianhe.system.controller.api;
import com.qianhe.common.constant.Constants;
import com.qianhe.common.core.domain.AjaxResult;
import com.qianhe.common.core.domain.model.MpLoginUser;
import com.qianhe.common.core.domain.model.WxLoginBody;
import com.qianhe.common.utils.MessageUtils;
import com.qianhe.common.utils.StringUtils;
import com.qianhe.framework.manager.AsyncManager;
import com.qianhe.framework.manager.factory.AsyncFactory;
import com.qianhe.framework.util.UserInfoUtil;
import com.qianhe.framework.web.service.MpTokenService;
import com.qianhe.system.domain.WaterUser;
import com.qianhe.system.service.api.IWxLoginService;
import com.qianhe.system.service.impl.WaterUserServiceImpl;
import com.qianhe.system.utils.WxUserInfoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import static com.qianhe.common.core.domain.AjaxResult.success;
@RestController
@RequestMapping("/wx")
public class WxLogin {
@Autowired
WxUserInfoUtils wxUserInfoUtils;
@Autowired
private WaterUserServiceImpl waterUserService;
@Autowired
private IWxLoginService wxLoginService;
@Autowired
private MpTokenService mpTokenService;
@Autowired
private UserInfoUtil userInfoUtil;
/**
* 获取用户openid和session_key
* @param code 微信临时登录凭证
* @return
*/
@GetMapping("/getWxLoginInfo")
public AjaxResult getWxLoginInfo(String code){
//根据code查询微信用户的openid和session_key
Map<String, String> wxLoginInfo = wxUserInfoUtils.getWxLoginInfo(code);
return AjaxResult.success(wxLoginInfo);
}
/**
*
* 获取微信用户手机号
*/
@GetMapping("/getPhoneNumber")
public AjaxResult getPhoneNumber(@RequestParam("code") String code){
String wxUserPhone = wxUserInfoUtils.getWxUserPhone(code);
return AjaxResult.success().put("phoneNumber",wxUserPhone);
}
/**
* 小程序登录
* @param code 微信登录临时凭证
* @return
*/
@GetMapping("/login")
public AjaxResult login(@RequestParam("code") String code){
AjaxResult ajaxResult = AjaxResult.success();
//根据code查询微信用户的openid和session_key
Map<String, String> wxLoginInfo = wxUserInfoUtils.getWxLoginInfo(code);
WxLoginBody wxLoginBody = new WxLoginBody();
wxLoginBody.setOpenId(wxLoginInfo.get("openId"));
MpLoginUser login = wxLoginService.login(wxLoginBody);
if (StringUtils.isNull(login)) {
return AjaxResult.error("login error");
}
ajaxResult.put("loginInfo",wxLoginInfo);
ajaxResult.put("isNewUser",login.getIsNewUser());
AsyncManager.me().execute(AsyncFactory.recordLogininfor(login.getNickName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
String token = mpTokenService.createToken(login);
ajaxResult.put(Constants.TOKEN, token);
return ajaxResult;
}
/**
* 修改用户信息
*/
@PostMapping("/updateUser")
public AjaxResult updateUser(@RequestBody WaterUser waterUser){
return success(waterUserService.updateUserByOpenId(waterUser));
}
/**
* 获取用户信息
* @return
*/
@GetMapping("/getUserInfo")
public AjaxResult getUserInfo(){
//获取当前登录用户openid
String openId = userInfoUtil.getOpenId();
Map<String,Object> map = new HashMap<>();
//根据openid查询用户信息
WaterUser waterUser = waterUserService.selectUserByOpenId(openId);
map.put("userId",waterUser.getId());
map.put("nickName",waterUser.getNickName());
map.put("phoneNum",waterUser.getPhoneNum());
map.put("stationName",waterUser.getStationName());
map.put("userType",waterUser.getUserType());
map.put("userGender",waterUser.getUserGender());
return AjaxResult.success(map);
}
}
package com.qianhe.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.qianhe.common.annotation.Excel;
import com.qianhe.common.core.domain.BaseEntity;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
/**
* 商品分类对象 water_goods_type
*
* @author qianhe
* @date 2023-11-23
*/
public class WaterGoodsType extends BaseEntity
@Data
public class WaterGoodsType
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** 名称 */
@Excel(name = "名称")
private String typeName;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setTypeName(String typeName)
{
this.typeName = typeName;
}
public String getTypeName()
{
return typeName;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("typeName", getTypeName())
.append("createTime", getCreateTime())
.toString();
}
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
......@@ -2,6 +2,7 @@ package com.qianhe.system.domain;
import com.qianhe.common.annotation.Excel;
import com.qianhe.common.core.domain.BaseEntity;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
......@@ -13,11 +14,12 @@ import java.math.BigDecimal;
* @author qianhe
* @date 2023-11-23
*/
@Data
public class WaterStation extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 站点名称 */
......
package com.qianhe.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.qianhe.common.annotation.Excel;
import com.qianhe.common.core.domain.BaseEntity;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
import java.util.List;
/**
* 用户对象 water_user
*
* @author qianhe
* @date 2023-11-23
*/
public class WaterUser extends BaseEntity
@Data
public class WaterUser
{
private static final long serialVersionUID = 1L;
/** 主键 */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** 昵称 */
......@@ -35,102 +44,17 @@ public class WaterUser extends BaseEntity
private String userType;
/** 性别(1男0女) */
@Excel(name = "性别(1男0女)")
@Excel(name = "性别", combo = {"男","女","未知"}, readConverterExp = "1=男,0=女,2=未知")
private Long userGender;
/** 状态(0逻辑删除) */
@Excel(name = "状态(0逻辑删除)")
private Long status;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 状态(1逻辑删除) */
private String status;
/** 微信小程序open_id */
@Excel(name = "微信小程序open_id")
private String openId;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setNickName(String nickName)
{
this.nickName = nickName;
}
public String getNickName()
{
return nickName;
}
public void setPhoneNum(Long phoneNum)
{
this.phoneNum = phoneNum;
}
public Long getPhoneNum()
{
return phoneNum;
}
public void setStationName(String stationName)
{
this.stationName = stationName;
}
public String getStationName()
{
return stationName;
}
public void setUserType(String userType)
{
this.userType = userType;
}
public String getUserType()
{
return userType;
}
public void setUserGender(Long userGender)
{
this.userGender = userGender;
}
public Long getUserGender()
{
return userGender;
}
public void setStatus(Long status)
{
this.status = status;
}
public Long getStatus()
{
return status;
}
public void setOpenId(String openId)
{
this.openId = openId;
}
public String getOpenId()
{
return openId;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("nickName", getNickName())
.append("phoneNum", getPhoneNum())
.append("stationName", getStationName())
.append("userType", getUserType())
.append("userGender", getUserGender())
.append("createTime", getCreateTime())
.append("status", getStatus())
.append("openId", getOpenId())
.toString();
}
}
package com.qianhe.system.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.qianhe.common.annotation.Excel;
import com.qianhe.common.core.domain.BaseEntity;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
......@@ -11,125 +14,33 @@ import org.apache.commons.lang3.builder.ToStringStyle;
* @author qianhe
* @date 2023-11-23
*/
public class WaterUserAddress extends BaseEntity
@Data
public class WaterUserAddress
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** 用户id */
@Excel(name = "用户id")
private Long waterUserId;
/** 详细地址 */
@Excel(name = "详细地址")
private String userAddress;
/** 省 */
@Excel(name = "省")
private String province;
/** 市 */
@Excel(name = "市")
private String city;
/** 区 */
@Excel(name = "区")
private String area;
/** 收货人姓名 */
@Excel(name = "收货人姓名")
private String name;
/** 收货人手机号 */
@Excel(name = "收货人手机号")
private Long phone;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setWaterUserId(Long waterUserId)
{
this.waterUserId = waterUserId;
}
public Long getWaterUserId()
{
return waterUserId;
}
public void setUserAddress(String userAddress)
{
this.userAddress = userAddress;
}
public String getUserAddress()
{
return userAddress;
}
public void setProvince(String province)
{
this.province = province;
}
public String getProvince()
{
return province;
}
public void setCity(String city)
{
this.city = city;
}
public String getCity()
{
return city;
}
public void setArea(String area)
{
this.area = area;
}
public String getArea()
{
return area;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setPhone(Long phone)
{
this.phone = phone;
}
public Long getPhone()
{
return phone;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("waterUserId", getWaterUserId())
.append("userAddress", getUserAddress())
.append("province", getProvince())
.append("city", getCity())
.append("area", getArea())
.append("name", getName())
.append("phone", getPhone())
.toString();
}
}
package com.qianhe.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qianhe.system.domain.WaterUserAddress;
import java.util.List;
/**
* 用户地址Mapper接口
*
*
* @author qianhe
* @date 2023-11-23
*/
public interface WaterUserAddressMapper
public interface WaterUserAddressMapper extends BaseMapper<WaterUserAddress>
{
/**
* 查询用户地址
*
*
* @param id 用户地址主键
* @return 用户地址
*/
......@@ -22,7 +23,7 @@ public interface WaterUserAddressMapper
/**
* 查询用户地址列表
*
*
* @param waterUserAddress 用户地址
* @return 用户地址集合
*/
......@@ -30,7 +31,7 @@ public interface WaterUserAddressMapper
/**
* 新增用户地址
*
*
* @param waterUserAddress 用户地址
* @return 结果
*/
......@@ -38,7 +39,7 @@ public interface WaterUserAddressMapper
/**
* 修改用户地址
*
*
* @param waterUserAddress 用户地址
* @return 结果
*/
......@@ -46,7 +47,7 @@ public interface WaterUserAddressMapper
/**
* 删除用户地址
*
*
* @param id 用户地址主键
* @return 结果
*/
......@@ -54,7 +55,7 @@ public interface WaterUserAddressMapper
/**
* 批量删除用户地址
*
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
......
package com.qianhe.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qianhe.common.core.domain.model.WxLoginBody;
import com.qianhe.system.domain.WaterUser;
import java.util.List;
/**
* 用户Mapper接口
*
*
* @author qianhe
* @date 2023-11-23
*/
public interface WaterUserMapper
public interface WaterUserMapper extends BaseMapper<WaterUser>
{
/**
* 查询用户
*
*
* @param id 用户主键
* @return 用户
*/
......@@ -22,7 +24,7 @@ public interface WaterUserMapper
/**
* 查询用户列表
*
*
* @param waterUser 用户
* @return 用户集合
*/
......@@ -30,7 +32,7 @@ public interface WaterUserMapper
/**
* 新增用户
*
*
* @param waterUser 用户
* @return 结果
*/
......@@ -38,7 +40,7 @@ public interface WaterUserMapper
/**
* 修改用户
*
*
* @param waterUser 用户
* @return 结果
*/
......@@ -46,7 +48,7 @@ public interface WaterUserMapper
/**
* 删除用户
*
*
* @param id 用户主键
* @return 结果
*/
......@@ -54,9 +56,31 @@ public interface WaterUserMapper
/**
* 批量删除用户
*
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteWaterUserByIds(Long[] ids);
/**
* 根据openId查询用户
* @param openId
* @return
*/
WaterUser selectUserByOpenId(String openId);
/**
* 根据openid修改用户信息
* @param waterUser
* @return
*/
int updateUserByOpenId(WaterUser waterUser);
/**
* 批量删除用户地址
*
* @param ids 需要删除的用户id集合
* @return 结果
*/
int deleteWaterUserAddressByIds(Long[] ids);
}
package com.qianhe.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qianhe.system.domain.WaterUserAddress;
import java.util.List;
/**
* 用户地址Service接口
*
*
* @author qianhe
* @date 2023-11-23
*/
public interface IWaterUserAddressService
public interface IWaterUserAddressService extends IService<WaterUserAddress>
{
/**
* 查询用户地址
*
*
* @param id 用户地址主键
* @return 用户地址
*/
......@@ -22,7 +23,7 @@ public interface IWaterUserAddressService
/**
* 查询用户地址列表
*
*
* @param waterUserAddress 用户地址
* @return 用户地址集合
*/
......@@ -30,7 +31,7 @@ public interface IWaterUserAddressService
/**
* 新增用户地址
*
*
* @param waterUserAddress 用户地址
* @return 结果
*/
......@@ -38,7 +39,7 @@ public interface IWaterUserAddressService
/**
* 修改用户地址
*
*
* @param waterUserAddress 用户地址
* @return 结果
*/
......@@ -46,7 +47,7 @@ public interface IWaterUserAddressService
/**
* 批量删除用户地址
*
*
* @param ids 需要删除的用户地址主键集合
* @return 结果
*/
......@@ -54,7 +55,7 @@ public interface IWaterUserAddressService
/**
* 删除用户地址信息
*
*
* @param id 用户地址主键
* @return 结果
*/
......
package com.qianhe.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qianhe.common.core.domain.model.WxLoginBody;
import com.qianhe.system.domain.WaterUser;
import com.qianhe.system.vo.WaterUserVo;
import java.util.List;
/**
* 用户Service接口
*
*
* @author qianhe
* @date 2023-11-23
*/
public interface IWaterUserService
public interface IWaterUserService extends IService<WaterUser>
{
/**
* 查询用户
*
*
* @param id 用户主键
* @return 用户
*/
public WaterUser selectWaterUserById(Long id);
public WaterUserVo selectWaterUserById(Long id);
/**
* 查询用户列表
*
*
* @param waterUser 用户
* @return 用户集合
*/
......@@ -30,7 +33,7 @@ public interface IWaterUserService
/**
* 新增用户
*
*
* @param waterUser 用户
* @return 结果
*/
......@@ -38,7 +41,7 @@ public interface IWaterUserService
/**
* 修改用户
*
*
* @param waterUser 用户
* @return 结果
*/
......@@ -46,7 +49,7 @@ public interface IWaterUserService
/**
* 批量删除用户
*
*
* @param ids 需要删除的用户主键集合
* @return 结果
*/
......@@ -54,9 +57,23 @@ public interface IWaterUserService
/**
* 删除用户信息
*
*
* @param id 用户主键
* @return 结果
*/
public int deleteWaterUserById(Long id);
/**
* 根据openid查询用户
* @param openId
* @return
*/
WaterUser selectUserByOpenId(String openId);
/**
* 根据openid修改用户信息
* @param waterUser
* @return
*/
int updateUserByOpenId(WaterUser waterUser);
}
package com.qianhe.system.service.api;
import com.qianhe.common.core.domain.model.MpLoginUser;
import com.qianhe.common.core.domain.model.WxLoginBody;
public interface IWxLoginService {
MpLoginUser login(WxLoginBody wxLoginBody);
}
package com.qianhe.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qianhe.system.domain.WaterUserAddress;
import com.qianhe.system.mapper.WaterUserAddressMapper;
import com.qianhe.system.service.IWaterUserAddressService;
......@@ -15,7 +16,7 @@ import java.util.List;
* @date 2023-11-23
*/
@Service
public class WaterUserAddressServiceImpl implements IWaterUserAddressService
public class WaterUserAddressServiceImpl extends ServiceImpl<WaterUserAddressMapper,WaterUserAddress> implements IWaterUserAddressService
{
@Autowired
private WaterUserAddressMapper waterUserAddressMapper;
......
package com.qianhe.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qianhe.common.core.domain.model.WxLoginBody;
import com.qianhe.common.utils.DateUtils;
import com.qianhe.system.domain.WaterUser;
import com.qianhe.system.domain.WaterUserAddress;
import com.qianhe.system.mapper.WaterUserAddressMapper;
import com.qianhe.system.mapper.WaterUserMapper;
import com.qianhe.system.service.IWaterUserService;
import com.qianhe.system.vo.WaterUserVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -16,10 +23,12 @@ import java.util.List;
* @date 2023-11-23
*/
@Service
public class WaterUserServiceImpl implements IWaterUserService
public class WaterUserServiceImpl extends ServiceImpl<WaterUserMapper,WaterUser> implements IWaterUserService
{
@Autowired
private WaterUserMapper waterUserMapper;
@Autowired
private WaterUserAddressMapper waterUserAddressMapper;
/**
* 查询用户
......@@ -28,9 +37,18 @@ public class WaterUserServiceImpl implements IWaterUserService
* @return 用户
*/
@Override
public WaterUser selectWaterUserById(Long id)
public WaterUserVo selectWaterUserById(Long id)
{
return waterUserMapper.selectWaterUserById(id);
//转vo
WaterUser waterUser = waterUserMapper.selectWaterUserById(id);
WaterUserVo waterUserVo = new WaterUserVo();
BeanUtils.copyProperties(waterUser,waterUserVo);
//查询用户地址信息
WaterUserAddress waterUserAddress = new WaterUserAddress();
waterUserAddress.setWaterUserId(id);
List<WaterUserAddress> waterUserAddresses = waterUserAddressMapper.selectWaterUserAddressList(waterUserAddress);
waterUserVo.setWaterUserAddressList(waterUserAddresses);
return waterUserVo;
}
/**
......@@ -79,6 +97,8 @@ public class WaterUserServiceImpl implements IWaterUserService
@Override
public int deleteWaterUserByIds(Long[] ids)
{
//删除用户地址信息
waterUserMapper.deleteWaterUserAddressByIds(ids);
return waterUserMapper.deleteWaterUserByIds(ids);
}
......@@ -93,4 +113,24 @@ public class WaterUserServiceImpl implements IWaterUserService
{
return waterUserMapper.deleteWaterUserById(id);
}
/**
* 根据openid查询用户
* @param openId
* @return
*/
@Override
public WaterUser selectUserByOpenId(String openId) {
return waterUserMapper.selectUserByOpenId(openId);
}
/**
* 根据openid修改用户信息
* @param waterUser
* @return
*/
@Override
public int updateUserByOpenId(WaterUser waterUser) {
return waterUserMapper.updateUserByOpenId(waterUser);
}
}
package com.qianhe.system.service.impl.api;
import com.qianhe.common.core.domain.model.MpLoginUser;
import com.qianhe.common.core.domain.model.WxLoginBody;
import com.qianhe.common.utils.DateUtils;
import com.qianhe.common.utils.StringUtils;
import com.qianhe.system.domain.WaterUser;
import com.qianhe.system.mapper.WaterUserMapper;
import com.qianhe.system.service.api.IWxLoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class WxLoginServiceImpl implements IWxLoginService {
@Autowired
private WaterUserMapper waterUserMapper;
@Override
public MpLoginUser login(WxLoginBody wxLoginBody) {
//根据用户openid查询用户是否存在
WaterUser user = waterUserMapper.selectUserByOpenId(wxLoginBody.getOpenId());
if (StringUtils.isNotNull(user)){
//存在
MpLoginUser loginUser = new MpLoginUser();
loginUser.setOpenId(wxLoginBody.getOpenId());
loginUser.setUserId(user.getId());
loginUser.setNickName(user.getNickName());
loginUser.setIsNewUser("0");
return loginUser;
}
//不存在,新增用户
WaterUser waterUser = new WaterUser();
waterUser.setNickName("微信用户");
waterUser.setOpenId(wxLoginBody.getOpenId());
waterUser.setCreateTime(DateUtils.getNowDate());
waterUserMapper.insertWaterUser(waterUser);
MpLoginUser loginUser = new MpLoginUser();
loginUser.setOpenId(wxLoginBody.getOpenId());
loginUser.setUserId(waterUser.getId());
loginUser.setNickName("微信用户");
loginUser.setIsNewUser("1");
return loginUser;
}
}
package com.qianhe.system.utils;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qianhe.common.core.redis.RedisCache;
import com.qianhe.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class AccessTokenUtils {
@Value("${wx.access-token-uri}")
private String accessTokenUri;
private static Logger log = LoggerFactory.getLogger(AccessTokenUtils.class);
@Autowired
public RedisCache redisCache;
/**
* 获取token
* @return
* @throws Exception
*/
public String getToken(){
String token = redisCache.getCacheObject("wx_access_token");
if (StringUtils.isEmpty(token)){
try {
String url = accessTokenUri;
// 利用hutool的http工具类请求获取access_token
String result = HttpUtil.get(url);
// 将结果解析为json
JSONObject jsonObject = JSONUtil.parseObj(result);
// 获取access_token
String accessToken = (String) jsonObject.get("access_token");
if (!StringUtils.isEmpty(accessToken)) {
token = accessToken;
log.info(accessToken);
// 将access_token存入redis
redisCache.setCacheObject("wx_access_token", accessToken, 7200, TimeUnit.MILLISECONDS);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
return token;
}
}
package com.qianhe.system.utils;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.AlgorithmParameters;
import java.security.Security;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Component
public class WxUserInfoUtils {
@Value("${wx.appId}")
private String appId;
@Value("${wx.appSecret}")
private String appSecret;
@Autowired
AccessTokenUtils accessTokenUtils;
private static Logger log = LoggerFactory.getLogger(WxUserInfoUtils.class);
/**
* 获取openid喝session_key
* @param code
* @return
*/
public Map<String, String> getWxLoginInfo(String code) {
//微信登录凭证校验
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code";
//利用hutool发起get请求
String result = HttpUtil.get(url);
//使用 hutool 解析json
JSONObject jsonObject = JSONUtil.parseObj(result);
//获取会话密钥
String session_key = (String) jsonObject.get("session_key");
//获取用户在开放平台的唯一标识符
String unionid = (String) jsonObject.get("unionid");
//获取用户唯一标识
String openid = (String) jsonObject.get("openid");
Map<String,String> map = new HashMap<>();
map.put("openid",openid);
map.put("session_key",session_key);
return map;
}
/**
* 获取用户手机号
*/
public String getWxUserPhone(String code){
//获取accessToken
String accessToken = accessTokenUtils.getToken();
//获取phone
String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"
+ "?access_token=" + accessToken;
Map<String, String> param = new HashMap<>();
param.put("code",code);
JSONObject wxJson = JSONUtil.parseObj(HttpClientUtil.doPost(url, param));
//返回手机号信息
JSONObject phone_info = JSONUtil.parseObj(wxJson.get("phone_info"));
//用户绑定的手机号(国外手机号会有区号)
String phoneNumber = (String) phone_info.get("phoneNumber");
return phoneNumber;
}
/**
* 解密用户手机号 (已废弃)
*
* @param encryptedData 包括敏感数据在内的完整用户信息的加密数据
* @param iv 加密算法的初始向量
*/
public String getMobile(String encryptedData, String sesskey, String iv) {
String result = decryptData(encryptedData, sesskey, iv);
if (result == null) {
return null;
}
Map<String, String> map = new JSONObject(result).toBean(Map.class);
return map.get("phoneNumber");
}
/**
* (已废弃)
* @param encryptedData
* @param sessionKey
* @param iv
* @return
*/
public String decryptData(String encryptedData, String sessionKey, String iv) {
// 被加密的数据
byte[] dataByte = Base64Utils.decode(encryptedData.getBytes());
// 加密秘钥
byte[] keyByte = Base64Utils.decode(sessionKey.getBytes());
// 偏移量
byte[] ivByte = Base64Utils.decode(iv.getBytes());
try {
// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
int base = 16;
if (keyByte.length % base != 0) {
int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
byte[] temp = new byte[groups * base];
Arrays.fill(temp, (byte) 0);
System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
keyByte = temp;
}
// 初始化
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
parameters.init(new IvParameterSpec(ivByte));
// 初始化
cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
byte[] resultByte = cipher.doFinal(dataByte);
if (null != resultByte && resultByte.length > 0) {
String result = new String(resultByte, "UTF-8");
return result;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
}
package com.qianhe.system.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.qianhe.common.annotation.Excel;
import com.qianhe.system.domain.WaterUserAddress;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class WaterUserVo {
/** 主键 */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/** 昵称 */
@Excel(name = "昵称")
private String nickName;
/** 手机号 */
@Excel(name = "手机号")
private Long phoneNum;
/** 站点名称 */
@Excel(name = "站点名称")
private String stationName;
/** 用户类型 */
@Excel(name = "用户类型")
private String userType;
/** 性别(1男0女) */
@Excel(name = "性别", combo = {"男","女","未知"}, readConverterExp = "1=男,0=女,2=未知")
private Long userGender;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 状态(1逻辑删除) */
private String status;
/** 微信小程序open_id */
private String openId;
private List<WaterUserAddress> waterUserAddressList;
}
......@@ -70,13 +70,13 @@ spring:
# redis 配置
redis:
# 地址
host: localhost
host: 1.116.38.25
# 端口,默认为6379
port: 6379
port: 7789
# 数据库索引
database: 0
database: 1
# 密码
password:
password: qianheRedis2021
# 连接超时时间
timeout: 10s
lettuce:
......@@ -129,3 +129,8 @@ xss:
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
wx:
appId: wxb51f4823578b94d3
appSecret: b9eaa65a8f2726710d0916e4b26936b6
access-token-uri: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${wx.appId}&secret=${wx.appSecret}
......@@ -3,7 +3,7 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qianhe.system.mapper.WaterUserMapper">
<resultMap type="WaterUser" id="WaterUserResult">
<result property="id" column="id" />
<result property="nickName" column="nick_name" />
......@@ -22,7 +22,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectWaterUserList" parameterType="WaterUser" resultMap="WaterUserResult">
<include refid="selectWaterUserVo"/>
<where>
<where>
status != 1
<if test="nickName != null and nickName != ''"> and nick_name like concat('%', #{nickName}, '%')</if>
<if test="phoneNum != null "> and phone_num = #{phoneNum}</if>
<if test="stationName != null and stationName != ''"> and station_name like concat('%', #{stationName}, '%')</if>
......@@ -32,12 +33,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="openId != null and openId != ''"> and open_id = #{openId}</if>
</where>
</select>
<select id="selectWaterUserById" parameterType="Long" resultMap="WaterUserResult">
<include refid="selectWaterUserVo"/>
where id = #{id}
</select>
<select id="selectUserByOpenId" parameterType="String" resultMap="WaterUserResult">
<include refid="selectWaterUserVo"/>
where open_id = #{openId}
</select>
<insert id="insertWaterUser" parameterType="WaterUser" useGeneratedKeys="true" keyProperty="id">
insert into water_user
<trim prefix="(" suffix=")" suffixOverrides=",">
......@@ -77,14 +83,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id}
</update>
<update id="updateUserByOpenId" parameterType="WaterUser">
update water_user
<trim prefix="SET" suffixOverrides=",">
<if test="nickName != null">nick_name = #{nickName},</if>
<if test="phoneNum != null">phone_num = #{phoneNum},</if>
<if test="stationName != null">station_name = #{stationName},</if>
<if test="userType != null">user_type = #{userType},</if>
<if test="userGender != null">user_gender = #{userGender},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="status != null">status = #{status},</if>
</trim>
where open_id = #{openId}
</update>
<delete id="deleteWaterUserById" parameterType="Long">
delete from water_user where id = #{id}
</delete>
<delete id="deleteWaterUserByIds" parameterType="String">
delete from water_user where id in
<update id="deleteWaterUserByIds" parameterType="String">
update water_user set status = '1' where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<delete id="deleteWaterUserAddressByIds" parameterType="String">
delete from water_user_address where water_user_id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
</mapper>
......@@ -126,6 +126,11 @@
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
package com.qianhe.common.core.domain.model;
import lombok.Data;
import java.util.Set;
@Data
public class MpLoginUser {
/**
* 登录类型
*/
String type;
/**
* openId
*/
String openId;
/**
* 用户昵称
*/
String nickName;
/**
* 电话号码
*/
Long phone;
/**
* 是否为新用户(1是,0否)
*/
String isNewUser;
/**
* 用户唯一标识
*/
private String mpToken;
/**
* 过期时间
*/
private Long expireTime;
/**
* 登录时间
*/
private Long loginTime;
/**
* 登录IP地址
*/
private String ipaddr;
/**
* 登录地点
*/
private String loginLocation;
/**
* 浏览器类型
*/
private String browser;
/**
* 操作系统
*/
private String os;
private Long userId;
/*
头像
*/
private String avatar;
/**
* 角色权限
*/
private Set<String> roles;
}
package com.qianhe.common.core.domain.model;
import lombok.Data;
@Data
public class WxLoginBody {
/**
* 登录类型
*/
String userType;
/**
* openId
*/
String openId;
/**
* 用户昵称
*/
String nickName;
/** 用户头像 */
private String avatar;
/**
* 用户电话
*/
String phone;
}
......@@ -112,6 +112,10 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
.authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage").permitAll()
//放行微信小程序相关接口
.antMatchers("/wx/getWxLoginInfo/**", "/wx/login/**", "/wx/getPhoneNumber/**", "/wx/getUserInfo","/wx/updateUser").permitAll()
//测试放行所有接口
.antMatchers("/system/**").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
......
......@@ -5,6 +5,10 @@ import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.qianhe.common.core.domain.model.MpLoginUser;
import com.qianhe.framework.util.UserInfoUtil;
import com.qianhe.framework.web.service.MpTokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
......@@ -27,10 +31,30 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
@Autowired
private TokenService tokenService;
@Autowired
private MpTokenService mpTokenService;
@Autowired
UserInfoUtil userInfoUtil;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException
{
//小程序登录
String mpToken = mpTokenService.getToken(request);
if (StringUtils.isNotEmpty(mpToken)) {
MpLoginUser mpLoginUser = mpTokenService.getMpLoginUser(mpToken);
userInfoUtil.setMpLoginUser(mpLoginUser);
if (StringUtils.isNotNull(mpLoginUser)) {
mpTokenService.verifyToken(mpLoginUser);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(mpLoginUser, null, null);
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
}
//PC端登录
LoginUser loginUser = tokenService.getLoginUser(request);
if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
{
......
package com.qianhe.framework.util;
import com.qianhe.common.core.domain.model.MpLoginUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class UserInfoUtil {
MpLoginUser mpLoginUser;
private Logger log = LoggerFactory.getLogger(UserInfoUtil.class);
public MpLoginUser getMpLoginUser() {
return mpLoginUser;
}
public void setMpLoginUser(MpLoginUser mpLoginUser) {
this.mpLoginUser = mpLoginUser;
}
public String getOpenId(){
return mpLoginUser.getOpenId();
}
public Long getUseId(){
return mpLoginUser.getUserId();
}
public void setUserId(Long userId){
mpLoginUser.setUserId(userId);
}
public Long getPhone(){
return mpLoginUser.getPhone();
}
public String getAvatar(){
return mpLoginUser.getAvatar();
}
}
package com.qianhe.framework.web.service;
import com.qianhe.common.core.domain.model.MpLoginUser;
import com.qianhe.common.core.redis.RedisCache;
import com.qianhe.common.utils.ServletUtils;
import com.qianhe.common.utils.StringUtils;
import com.qianhe.common.utils.ip.AddressUtils;
import com.qianhe.common.utils.ip.IpUtils;
import com.qianhe.common.utils.uuid.IdUtils;
import eu.bitwalker.useragentutils.UserAgent;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* token验证处理
*
* @author ruoyi
*/
@Component
public class MpTokenService {
// 令牌自定义标识
@Value("${token.header}")
private String header;
// 令牌秘钥
@Value("${token.secret}")
private String secret;
// 令牌有效期(默认30分钟)
@Value("${token.expireTime}")
private int expireTime;
protected static final long MILLIS_SECOND = 1000;
protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
private static final String MP_PREFIX = "Bearer ";
@Autowired
private RedisCache redisCache;
/**
* 获取用户身份信息
*
* @return 用户信息
*/
public MpLoginUser getMpLoginUser(String token)
{
// 获取请求携带的令牌
if (StringUtils.isNotEmpty(token))
{
try
{
Claims claims = parseToken(token);
// 解析对应的权限以及用户信息
String uuid = (String) claims.get(MP_PREFIX);
String userKey = getTokenKey(uuid);
MpLoginUser user = redisCache.getCacheObject(userKey);
return user;
}
catch (Exception e)
{
}
}
return null;
}
/**
* 设置用户身份信息
*/
public void setMpLoginUser(MpLoginUser mpLoginUser)
{
if (StringUtils.isNotNull(mpLoginUser) && StringUtils.isNotEmpty(mpLoginUser.getMpToken()))
{
refreshToken(mpLoginUser);
}
}
/**
* 删除用户身份信息
*/
public void delMpLoginUser(String token)
{
if (StringUtils.isNotEmpty(token))
{
// Claims claims = parseToken(token);
// String uuid = (String) claims.get(MP_PREFIX);
String userKey = getTokenKey(token);
redisCache.deleteObject(userKey);
}
}
/**
* 创建令牌
*
* @param mpLoginUser 微信用户信息
* @return 令牌
*/
public String createToken(MpLoginUser mpLoginUser)
{
String mpToken = IdUtils.fastUUID();
mpLoginUser.setMpToken(mpToken);
setUserAgent(mpLoginUser);
refreshToken(mpLoginUser);
Map<String, Object> claims = new HashMap<>();
claims.put(MP_PREFIX, mpToken);
return createToken(claims);
}
/**
* 验证令牌有效期,相差不足20分钟,自动刷新缓存
*
* @param mpLoginUser
* @return 令牌
*/
public void verifyToken(MpLoginUser mpLoginUser)
{
long expireTime = mpLoginUser.getExpireTime();
long currentTime = System.currentTimeMillis();
if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
{
refreshToken(mpLoginUser);
}
}
/**
* 刷新令牌有效期
*
* @param mpLoginUser 登录信息
*/
public void refreshToken(MpLoginUser mpLoginUser)
{
mpLoginUser.setLoginTime(System.currentTimeMillis());
mpLoginUser.setExpireTime(mpLoginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
// 根据uuid将loginUser缓存
String userKey = getTokenKey(mpLoginUser.getMpToken());
redisCache.setCacheObject(userKey, mpLoginUser, expireTime, TimeUnit.MINUTES);
}
/**
* 设置用户代理信息
*
* @param mpLoginUser 登录信息
*/
public void setUserAgent(MpLoginUser mpLoginUser)
{
UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
mpLoginUser.setIpaddr(ip);
mpLoginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
mpLoginUser.setBrowser(userAgent.getBrowser().getName());
mpLoginUser.setOs(userAgent.getOperatingSystem().getName());
}
/**
* 从数据声明生成令牌
*
* @param claims 数据声明
* @return 令牌
*/
private String createToken(Map<String, Object> claims)
{
String token = Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS512, secret).compact();
return token;
}
/**
* 从令牌中获取数据声明
*
* @param token 令牌
* @return 数据声明
*/
private Claims parseToken(String token)
{
return Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
}
/**
* 从令牌中获取用户名
*
* @param token 令牌
* @return 用户名
*/
public String getUsernameFromToken(String token)
{
Claims claims = parseToken(token);
return claims.getSubject();
}
/**
* 获取请求token
*
* @param request
* @return token
*/
public String getToken(HttpServletRequest request)
{
String token = request.getHeader(header);
if (StringUtils.isNotEmpty(token) && token.startsWith(MP_PREFIX))
{
return token.replace(MP_PREFIX, "");
}
return null;
}
private String getTokenKey(String uuid)
{
return "mp_token:" + uuid;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment