Browse Source

用户登陆

master
yanyan 3 years ago
parent
commit
7f58ddafa0
  1. 99
      lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/project/user/view.html
  2. 63
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/controller/WechatLoginController.java
  3. 60
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/domain/RawDataDO.java
  4. 63
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/domain/WechatLoginRequest.java
  5. 138
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/domain/WechatUser.java
  6. 23
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/mapper/WechatLoginMapper.java
  7. 27
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/service/WechatService.java
  8. 198
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/service/impl/WechatServiceImpl.java
  9. 70
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/utils/HttpClientUtils.java
  10. 1
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/resources/mapper/SceneMedalMapper.xml
  11. 104
      lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/resources/mapper/WechatLoginMapper.xml

99
lib/EmergencyService/zdxtEmergencyBootStart/src/main/resources/templates/project/user/view.html

@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="zdxtInclude :: header('登陆记录')"/>
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="col-sm-12 search-collapse">
<form id="formId">
<div class="select-list">
<ul>
<li>
<p>昵称:</p>
<input type="text" name="nickname"/>
</li>
<li>
<a class="btn btn-success btn-rounded btn-sm" onclick="$.table.search()"><i
class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-reset btn-rounded btn-sm" onclick="reset()"><i
class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group">
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</div>
<th:block th:include="zdxtInclude :: footer"/>
<script th:inline="javascript">
var editFlag = [[${@permission.hasPermi('project:user:edit')}]];
var removeFlag = [[${@permission.hasPermi('project:user:remove')}]];
var detailFlag = [[${@permission.hasPermi('project:user:detail')}]];
var prefix = ctx + "small/wechat";
$(function () {
var options = {
url: prefix + "/list",
createUrl: prefix + "/add/{}",
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
exportUrl: prefix + "/export",
detailUrl: prefix + "/detail/{guid}",
modalName: "主页",
columns: [{
checkbox: true
},
{
field: 'guid',
title: 'id'
},
{
field: 'nickname',
title: '昵称'
},
{
field: 'gender',
title: '性别'
},
{
field: 'city',
title: '城市'
},
{
field: 'creator',
title: '创建人'
},
{
field: 'createTime',
title: '创建时间'
},
{
title: '操作',
align: 'center',
formatter: function (value, row, index) {
var actions = [];
//actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.guid + '\')"><i class="fa fa-edit"></i>编辑</a> ');
return actions.join('');
}
}]
};
$.table.init(options);
});
function reset() {
$("[name='nickname']").val("");
$.table.search()
}
</script>
</body>
</html>

63
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/controller/WechatLoginController.java

@ -0,0 +1,63 @@
package com.zdxt.knowledge.controller;
import com.zdxt.common.controller.BaseController;
import com.zdxt.common.util.TableDataInfo;
import com.zdxt.knowledge.domain.WechatLoginRequest;
import com.zdxt.knowledge.domain.WechatUser;
import com.zdxt.knowledge.service.WechatService;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 请填写功能名称Controller
*
* @author ruoyi
* @date 2023-01-23
*/
@Controller
@RequestMapping("/small/wechat")
public class WechatLoginController extends BaseController {
@Autowired
private WechatService wechatService;
private String prefix = "project/user";
@RequiresPermissions("project:user:view")
@GetMapping("/view")
public String view() {
return prefix + "/view";
}
/**
* 查询
*/
@RequiresPermissions("project:user:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(WechatUser wechatUser) {
startPage();
List<WechatUser> list = wechatService.selectList(wechatUser);
return getDataTable(list);
}
/**
* 登入
*/
@ApiOperation(value = "登入接口", httpMethod = "POST")
@PostMapping("/login")
@ResponseBody
public Map<String, Object> login(@Validated @RequestBody WechatLoginRequest loginRequest) throws Exception {
Map<String, Object> userInfoMap = wechatService.getUserInfoMap(loginRequest);
return userInfoMap;
}
}

60
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/domain/RawDataDO.java

@ -0,0 +1,60 @@
package com.zdxt.knowledge.domain;
import java.io.Serializable;
public class RawDataDO implements Serializable {
private String nickName;
private String avatarUrl;
private Integer gender;
private String city;
private String country;
private String province;
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
}

63
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/domain/WechatLoginRequest.java

@ -0,0 +1,63 @@
package com.zdxt.knowledge.domain;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
public class WechatLoginRequest implements Serializable {
@ApiModelProperty(value = "微信code", required = true)
private String code;
@ApiModelProperty(value = "用户非敏感字段")
private String rawData;
@ApiModelProperty(value = "签名")
private String signature;
@ApiModelProperty(value = "用户敏感字段")
private String encryptedData;
@ApiModelProperty(value = "解密向量")
private String iv;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getRawData() {
return rawData;
}
public void setRawData(String rawData) {
this.rawData = rawData;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getEncryptedData() {
return encryptedData;
}
public void setEncryptedData(String encryptedData) {
this.encryptedData = encryptedData;
}
public String getIv() {
return iv;
}
public void setIv(String iv) {
this.iv = iv;
}
}

138
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/domain/WechatUser.java

@ -0,0 +1,138 @@
package com.zdxt.knowledge.domain;
import java.io.Serializable;
import java.util.Date;
public class WechatUser implements Serializable {
private static final long serialVersionUID = 1L;
private String guid;
private String token;
private String nickname;
private String avatarUrl;
private Integer gender;
private String country;
private String province;
private String city;
private String mobile;
private String openId;
private String unionId;
private String creator;
private Date createTime;
public String getGuid() {
return guid;
}
public void setGuid(String guid) {
this.guid = guid;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getOpenId() {
return openId;
}
public void setOpenId(String openId) {
this.openId = openId;
}
public String getUnionId() {
return unionId;
}
public void setUnionId(String unionId) {
this.unionId = unionId;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}

23
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/mapper/WechatLoginMapper.java

@ -0,0 +1,23 @@
package com.zdxt.knowledge.mapper;
import com.zdxt.knowledge.domain.WechatUser;
import java.util.List;
/**
* Mapper接口
*
* @author ruoyi
* @date 2023-12-26
*/
public interface WechatLoginMapper {
public List<WechatUser> selectList(WechatUser wechatUser);
public WechatUser getByOpenId(String openId);
public int insertUser(WechatUser wechatUser);
public int updateByOpenId(WechatUser wechatUser);
}

27
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/service/WechatService.java

@ -0,0 +1,27 @@
package com.zdxt.knowledge.service;
import com.zdxt.knowledge.domain.WechatLoginRequest;
import com.zdxt.knowledge.domain.WechatUser;
import java.util.List;
import java.util.Map;
/**
* Service接口
*
* @author ruoyi
* @date 2023-01-23
*/
public interface WechatService {
public List<WechatUser> selectList(WechatUser wechatUser);
/**
* 登陆
*
* @param loginRequest
* @return 集合
*/
Map<String, Object> getUserInfoMap(WechatLoginRequest loginRequest) throws Exception;
}

198
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/service/impl/WechatServiceImpl.java

@ -0,0 +1,198 @@
package com.zdxt.knowledge.service.impl;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zdxt.common.util.StringUtils;
import com.zdxt.knowledge.domain.RawDataDO;
import com.zdxt.knowledge.domain.WechatLoginRequest;
import com.zdxt.knowledge.domain.WechatUser;
import com.zdxt.knowledge.mapper.WechatLoginMapper;
import com.zdxt.knowledge.service.WechatService;
import com.zdxt.knowledge.utils.HttpClientUtils;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
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.List;
import java.util.Map;
/**
* Service业务层处理
*
* @author ruoyi
* @date 2023-01-23
*/
@Service
@Slf4j
public class WechatServiceImpl implements WechatService {
@Autowired
private WechatLoginMapper wechatLoginMapper;
private static final String REQUEST_URL = "https://api.weixin.qq.com/sns/jscode2session";
private static final String APPID = "wx93ec514a5c456507";
private static final String SECRET = "f5a3f295dbee3cc1c2f73b9a324c2eb2";
private static final String GRANT_TYPE = "authorization_code";
@Override
public List<WechatUser> selectList(WechatUser wechatUser) {
return wechatLoginMapper.selectList(wechatUser);
}
@Override
public Map<String, Object> getUserInfoMap(WechatLoginRequest loginRequest) throws Exception {
Map<String, Object> userInfoMap = new HashMap<>();
log.info("Start get SessionKey,loginRequest的数据为:" + JSONObject.toJSONString(loginRequest));
JSONObject sessionKeyOpenId = getSessionKeyOrOpenId(loginRequest.getCode());
Assert.isTrue(sessionKeyOpenId != null, "获取sessionKeyOpenId出错");
// 获取openId && sessionKey
String openId = sessionKeyOpenId.getString("openid");
Assert.isTrue(openId != null, "获取openId出错");
String sessionKey = sessionKeyOpenId.getString("session_key");
WechatUser insertOrUpdateDO = buildWechatUserAuthInfoDO(loginRequest, openId, sessionKey);
// 根据code保存openId和sessionKey
JSONObject sessionObj = new JSONObject();
sessionObj.put("openId", openId);
sessionObj.put("sessionKey", sessionKey);
// 这里的set方法使用Redis,key自行替换,10表示10天
// stringJedisClientTem.set(WechatRedisPrefixConstant.USER_OPPEN_ID_AND_SESSION_KEY_PREFIX + loginRequest.getCode(),
// sessionObj.toJSONString(), 10, TimeUnit.DAYS);
// 根据openid查询用户
WechatUser user = wechatLoginMapper.getByOpenId(openId);
if (user == null) {
// 用户不存在,insert用户,这里加了个分布式锁,防止insert重复用户
// if (setLock(WechatRedisPrefixConstant.INSERT_USER_DISTRIBUTED_LOCK_PREFIX + openId, "1", 10)) {
// // 用户入库
// insertOrUpdateDO.setToken(getToken());
// wechatLoginMapper.insertUser(insertOrUpdateDO);
// userInfoMap.put("token", insertOrUpdateDO.getToken());
// }
insertOrUpdateDO.setGuid(StringUtils.getUUID());
insertOrUpdateDO.setCreator("SYSTEM");
insertOrUpdateDO.setToken(getToken(insertOrUpdateDO.getGuid(),insertOrUpdateDO.getNickname()));
wechatLoginMapper.insertUser(insertOrUpdateDO);
userInfoMap.put("token", insertOrUpdateDO.getToken());
} else {
userInfoMap.put("token", user.getToken());
// 已存在,做已存在的处理,如更新用户的头像,昵称等,根据openID更新
wechatLoginMapper.updateByOpenId(insertOrUpdateDO);
}
return userInfoMap;
}
private JSONObject getSessionKeyOrOpenId(String code) throws Exception {
// String apiUrl = StrUtil.format("https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code", APPID, SECRET, code);
// String body = HttpRequest.get(apiUrl).execute().body();
Map<String, String> requestUrlParam = new HashMap<>();
// 小程序appId
requestUrlParam.put("appid", APPID);
// 小程序secret
requestUrlParam.put("secret", SECRET);
// 小程序端返回的code
requestUrlParam.put("js_code", code);
// 默认参数
requestUrlParam.put("grant_type", GRANT_TYPE);
// 发送post请求读取调用微信接口获取openid用户唯一标识
String result = HttpClientUtils.doPost(REQUEST_URL, requestUrlParam);
return JSON.parseObject(result);
}
private WechatUser buildWechatUserAuthInfoDO(WechatLoginRequest loginRequest, String sessionKey, String openId) {
WechatUser wechatUserDO = new WechatUser();
wechatUserDO.setOpenId(openId);
if (loginRequest.getRawData() != null) {
RawDataDO rawDataDO = JSON.parseObject(loginRequest.getRawData(), RawDataDO.class);
wechatUserDO.setNickname(rawDataDO.getNickName());
wechatUserDO.setAvatarUrl(rawDataDO.getAvatarUrl());
wechatUserDO.setGender(rawDataDO.getGender());
wechatUserDO.setCity(rawDataDO.getCity());
wechatUserDO.setCountry(rawDataDO.getCountry());
wechatUserDO.setProvince(rawDataDO.getProvince());
}
// 解密加密信息,获取unionID
if (loginRequest.getEncryptedData() != null) {
JSONObject encryptedData = getEncryptedData(loginRequest.getEncryptedData(), sessionKey, loginRequest.getIv());
if (encryptedData != null) {
String unionId = encryptedData.getString("unionId");
String phone = encryptedData.getString("phoneNumber");
wechatUserDO.setUnionId(unionId);
}
}
return wechatUserDO;
}
private JSONObject getEncryptedData(String encryptedData, String sessionkey, String iv) {
// 被加密的数据
byte[] dataByte = Base64.decode(encryptedData);
// 加密秘钥
byte[] keyByte = Base64.decode(sessionkey);
// 偏移量
byte[] ivByte = Base64.decode(iv);
try {
// 如果密钥不足16位,那么就补足.这个if中的内容很重要
int base = 16;
if (keyByte.length % base != 0) {
int groups = keyByte.length / base + 1;
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 JSONObject.parseObject(result);
}
} catch (Exception e) {
log.error("解密加密信息报错", e.getMessage());
}
return null;
}
// private boolean setLock(String key, String value, long expire) throws Exception {
// boolean result = stringJedisClientTem.setNx(key, value, expire, TimeUnit.SECONDS);
// return result;
// }
private String getToken(String guid, String nickname) throws Exception {
// 写入用户信息
HashMap<String, Object> tokenMap = new HashMap<>();
tokenMap.put("userName",nickname);
tokenMap.put("id",guid);
// 生成token
//String token = JWTUtil.createToken(tokenMap,tokenKey.getBytes());
return StringUtils.getUUID();
}
}

70
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/java/com/zdxt/knowledge/utils/HttpClientUtils.java

@ -0,0 +1,70 @@
package com.zdxt.knowledge.utils;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class HttpClientUtils {
final static int TIMEOUT = 1000;
final static int TIMEOUT_MSEC = 5 * 1000;
public static String doPost(String url, Map<String, String> paramMap) throws IOException {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (paramMap != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (Map.Entry<String, String> param : paramMap.entrySet()) {
paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
httpPost.setConfig(builderRequestConfig());
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
throw e;
} finally {
try {
response.close();
} catch (IOException e) {
throw e;
}
}
return resultString;
}
private static RequestConfig builderRequestConfig() {
return RequestConfig.custom()
.setConnectTimeout(TIMEOUT_MSEC)
.setConnectionRequestTimeout(TIMEOUT_MSEC)
.setSocketTimeout(TIMEOUT_MSEC).build();
}
}

1
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/resources/mapper/SceneMedalMapper.xml

@ -32,7 +32,6 @@
<if test="name != null and name != ''">and name like concat('%', #{name}, '%')</if>
<if test="creator != null and creator != ''">and creator = #{creator}</if>
</where>
order by sort ASC
</select>
<select id="selectSceneMedalById" parameterType="String" resultMap="SceneMedalResult">

104
lib/EmergencyService/zdxtEmergencyKnowledgeService/src/main/resources/mapper/WechatLoginMapper.xml

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zdxt.knowledge.mapper.WechatLoginMapper">
<resultMap type="com.zdxt.knowledge.domain.WechatUser" id="WechatUserResult">
<result property="guid" column="guid"/>
<result property="token" column="token"/>
<result property="nickname" column="nickname"/>
<result property="avatarUrl" column="avatar_url"/>
<result property="gender" column="gender"/>
<result property="country" column="country"/>
<result property="province" column="province"/>
<result property="city" column="city"/>
<result property="mobile" column="mobile"/>
<result property="openId" column="open_id"/>
<result property="unionId" column="union_id"/>
<result property="creator" column="creator"/>
<result property="createTime" column="create_time"/>
</resultMap>
<sql id="selectWechatUserVo">
select guid,
token,
nickname,
avatar_url,
gender,
country,
province,
city,
mobile,
creator,
create_time,
open_id,
union_id
from wechat_user
</sql>
<select id="selectList" parameterType="WechatUser" resultMap="WechatUserResult">
<include refid="selectWechatUserVo"/>
<where>
<if test="nickname != null and nickname != ''">and `nickname` like concat('%', #{nickname}, '%')</if>
<if test="mobile != null and mobile != ''">and mobile = #{mobile}</if>
</where>
order by create_time ASC
</select>
<select id="getByOpenId" parameterType="String" resultMap="WechatUserResult">
<include refid="selectWechatUserVo"/>
where open_id = #{openId}
</select>
<insert id="insertUser" parameterType="WechatUser">
insert into wechat_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="guid != null ">guid,</if>
<if test="token != null and token != ''">`token`,</if>
<if test="nickname != null and nickname != ''">nickname,</if>
<if test="avatarUrl != null and avatarUrl != ''">avatar_url,</if>
<if test="gender != null and gender != ''">gender,</if>
<if test="country != null and country != ''">country,</if>
<if test="province != null and province != ''">province,</if>
<if test="city != null and city != ''">`city`,</if>
<if test="mobile != null and mobile != ''">mobile,</if>
<if test="creator != null and creator != ''">creator,</if>
<if test="createTime != null ">create_time,</if>
<if test="openId != null and openId != ''">open_id,</if>
<if test="unionId != null and unionId != ''">union_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="guid != null ">#{guid},</if>
<if test="token != null and token != ''">#{token},</if>
<if test="nickname != null and nickname != ''">#{nickname},</if>
<if test="avatarUrl != null and avatarUrl != ''">#{avatarUrl},</if>
<if test="gender != null and gender != ''">#{gender},</if>
<if test="country != null and country != ''">#{country},</if>
<if test="province != null and province != ''">#{province},</if>
<if test="city != null and city != ''">#{city},</if>
<if test="mobile != null and mobile != ''">#{mobile},</if>
<if test="creator != null and creator != ''">#{creator},</if>
<if test="createTime != null ">#{createTime},</if>
<if test="openId != null and openId != ''">#{openId},</if>
<if test="unionId != null and unionId != ''">#{unionId},</if>
</trim>
</insert>
<update id="updateByOpenId" parameterType="WechatUser">
update wechat_user
<trim prefix="SET" suffixOverrides=",">
<if test="token != null and token != ''">token = #{token},</if>
<if test="nickname != null and nickname != ''">nickname = #{nickname},</if>
<if test="avatarUrl != null and avatarUrl != ''">avatar_url = #{avatarUrl},</if>
<if test="gender != null and gender != ''">gender = #{gender},</if>
<if test="country != null and country != ''">country = #{country},</if>
<if test="province != null and province != ''">province = #{province},</if>
<if test="city != null and city != ''">city = #{city},</if>
<if test="mobile != null and mobile != ''">`mobile` = #{mobile},</if>
<if test="openId != null and openId != ''">open_id = #{openId},</if>
<if test="unionId != null and unionId != ''">union_id = #{unionId},</if>
</trim>
where guid = #{guid}
</update>
</mapper>
Loading…
Cancel
Save