Pre Merge pull request !317 from tam/master

This commit is contained in:
tam 2021-09-14 09:02:08 +00:00 committed by Gitee
commit 15efaf5d1e
15 changed files with 957 additions and 3 deletions

View File

@ -61,6 +61,19 @@
<artifactId>ruoyi-generator</artifactId>
</dependency>
<!-- wxJava -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-wxapi</artifactId>
<version>3.7.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

View File

@ -2,6 +2,8 @@ package com.ruoyi.common.core.domain.model;
import java.util.Collection;
import java.util.Set;
import com.ruoyi.common.core.domain.entity.WxUser;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import com.fasterxml.jackson.annotation.JsonIgnore;
@ -71,6 +73,11 @@ public class LoginUser implements UserDetails
*/
private SysUser user;
/**
* 微信用户信息
*/
private WxUser wxUser;
public Long getUserId()
{
return userId;
@ -119,17 +126,21 @@ public class LoginUser implements UserDetails
this.permissions = permissions;
}
public LoginUser(WxUser wxUser){
this.wxUser = wxUser;
}
@JsonIgnore
@Override
public String getPassword()
{
return user.getPassword();
return user!=null ? user.getPassword() : wxUser.getPassword();
}
@Override
public String getUsername()
{
return user.getUserName();
return user!=null ? user.getUserName() : wxUser.getOpenId();
}
/**
@ -258,6 +269,14 @@ public class LoginUser implements UserDetails
this.user = user;
}
public WxUser getWxUser() {
return wxUser;
}
public void setWxUser(WxUser wxUser) {
this.wxUser = wxUser;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities()
{

View File

@ -58,6 +58,12 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-wxapi</artifactId>
<version>3.7.0</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求
.authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage").anonymous()
.antMatchers("/login", "/register", "/captchaImage", "/api/wx/login").anonymous()
.antMatchers(
HttpMethod.GET,
"/",

View File

@ -1,5 +1,8 @@
package com.ruoyi.framework.web.service;
import com.ruoyi.common.core.domain.entity.WxUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.wxapi.service.IWxUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@ -30,9 +33,31 @@ public class UserDetailsServiceImpl implements UserDetailsService
@Autowired
private SysPermissionService permissionService;
@Autowired
private IWxUserService wxUserService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
if (StringUtils.isNotEmpty(username) && username.startsWith("wx_openid_")){
String openId = username.replace("wx_openid_", "");
WxUser wxUser = wxUserService.selectWxUserByOpenId(openId);
wxUser.setPassword(SecurityUtils.encryptPassword(wxUser.getOpenId()));
if (StringUtils.isNull(wxUser))
{
log.info("登录用户:{} 不存在.", openId);
throw new ServiceException("登录用户不存在");
}
else if ("3".equals(wxUser.getStatus()))
{
log.info("登录用户:{} 已被停用.", openId);
throw new ServiceException("对不起,您的账号已停用");
}
return new LoginUser(wxUser);
}
SysUser user = userService.selectUserByUserName(username);
if (StringUtils.isNull(user))
{

33
ruoyi-wxapi/pom.xml Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.7.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-wxapi</artifactId>
<description>
wxapi系统模块
</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,124 @@
package com.ruoyi.wxapi.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 小程序设置对象 wx_app
*
* @author tgq
* @date 2021-09-01
*/
public class WxApp extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** id */
private Long id;
/** 小程序代号 */
@Excel(name = "小程序代号")
private String appCode;
/** 小程序名称 */
@Excel(name = "小程序名称")
private String appName;
/** 小程序id */
@Excel(name = "小程序id")
private String appId;
/** 小程序secret */
private String secret;
/** 服务器域名 */
@Excel(name = "服务器域名")
private String apiDomain;
/** 状态(1:正常,2:停用) */
@Excel(name = "状态(1:正常,2:停用)")
private String status;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setAppCode(String appCode)
{
this.appCode = appCode;
}
public String getAppCode()
{
return appCode;
}
public void setAppName(String appName)
{
this.appName = appName;
}
public String getAppName()
{
return appName;
}
public void setAppId(String appId)
{
this.appId = appId;
}
public String getAppId()
{
return appId;
}
public void setSecret(String secret)
{
this.secret = secret;
}
public String getSecret()
{
return secret;
}
public void setApiDomain(String apiDomain)
{
this.apiDomain = apiDomain;
}
public String getApiDomain()
{
return apiDomain;
}
public void setStatus(String status)
{
this.status = status;
}
public String getStatus()
{
return status;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("appCode", getAppCode())
.append("appName", getAppName())
.append("appId", getAppId())
.append("secret", getSecret())
.append("apiDomain", getApiDomain())
.append("status", getStatus())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.toString();
}
}

View File

@ -0,0 +1,69 @@
package com.ruoyi.wxapi.mapper;
import java.util.List;
import com.ruoyi.wxapi.domain.WxApp;
/**
* 小程序设置Mapper接口
*
* @author tgq
* @date 2021-09-01
*/
public interface WxAppMapper
{
/**
* 查询小程序设置
*
* @param id 小程序设置主键
* @return 小程序设置
*/
public WxApp selectWxAppById(Long id);
/**
* 查询小程序设置
*
* @param code 小程序code
* @return 小程序设置
*/
public WxApp selectWxAppByCode(String code);
/**
* 查询小程序设置列表
*
* @param wxApp 小程序设置
* @return 小程序设置集合
*/
public List<WxApp> selectWxAppList(WxApp wxApp);
/**
* 新增小程序设置
*
* @param wxApp 小程序设置
* @return 结果
*/
public int insertWxApp(WxApp wxApp);
/**
* 修改小程序设置
*
* @param wxApp 小程序设置
* @return 结果
*/
public int updateWxApp(WxApp wxApp);
/**
* 删除小程序设置
*
* @param id 小程序设置主键
* @return 结果
*/
public int deleteWxAppById(Long id);
/**
* 批量删除小程序设置
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteWxAppByIds(Long[] ids);
}

View File

@ -0,0 +1,69 @@
package com.ruoyi.wxapi.mapper;
import java.util.List;
import com.ruoyi.common.core.domain.entity.WxUser;
/**
* 小程序用户Mapper接口
*
* @author tgq
* @date 2021-09-01
*/
public interface WxUserMapper
{
/**
* 查询小程序用户
*
* @param id 小程序用户主键
* @return 小程序用户
*/
public WxUser selectWxUserById(Long id);
/**
* 查询小程序用户
*
* @param openId 小程序用户openId
* @return 小程序用户
*/
public WxUser selectWxUserByOpenId(String openId);
/**
* 查询小程序用户列表
*
* @param wxUser 小程序用户
* @return 小程序用户集合
*/
public List<WxUser> selectWxUserList(WxUser wxUser);
/**
* 新增小程序用户
*
* @param wxUser 小程序用户
* @return 结果
*/
public int insertWxUser(WxUser wxUser);
/**
* 修改小程序用户
*
* @param wxUser 小程序用户
* @return 结果
*/
public int updateWxUser(WxUser wxUser);
/**
* 删除小程序用户
*
* @param id 小程序用户主键
* @return 结果
*/
public int deleteWxUserById(Long id);
/**
* 批量删除小程序用户
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteWxUserByIds(Long[] ids);
}

View File

@ -0,0 +1,71 @@
package com.ruoyi.wxapi.service;
import java.util.List;
import cn.binarywang.wx.miniapp.api.WxMaService;
import com.ruoyi.wxapi.domain.WxApp;
/**
* 小程序设置Service接口
*
* @author tgq
* @date 2021-09-01
*/
public interface IWxAppService
{
/**
* 查询小程序设置
*
* @param id 小程序设置主键
* @return 小程序设置
*/
public WxApp selectWxAppById(Long id);
/**
* 查询小程序设置列表
*
* @param wxApp 小程序设置
* @return 小程序设置集合
*/
public List<WxApp> selectWxAppList(WxApp wxApp);
/**
* 新增小程序设置
*
* @param wxApp 小程序设置
* @return 结果
*/
public int insertWxApp(WxApp wxApp);
/**
* 修改小程序设置
*
* @param wxApp 小程序设置
* @return 结果
*/
public int updateWxApp(WxApp wxApp);
/**
* 批量删除小程序设置
*
* @param ids 需要删除的小程序设置主键集合
* @return 结果
*/
public int deleteWxAppByIds(Long[] ids);
/**
* 删除小程序设置信息
*
* @param id 小程序设置主键
* @return 结果
*/
public int deleteWxAppById(Long id);
/**
* 获取微信小程序服务
*
* @param code 小程序code
* @return 结果
*/
public WxMaService getMaService(String code);
}

View File

@ -0,0 +1,69 @@
package com.ruoyi.wxapi.service;
import java.util.List;
import com.ruoyi.common.core.domain.entity.WxUser;
/**
* 小程序用户Service接口
*
* @author tgq
* @date 2021-09-01
*/
public interface IWxUserService
{
/**
* 查询小程序用户
*
* @param id 小程序用户主键
* @return 小程序用户
*/
public WxUser selectWxUserById(Long id);
/**
* 查询小程序用户
*
* @param openId 小程序用户openId
* @return 小程序用户
*/
public WxUser selectWxUserByOpenId(String openId);
/**
* 查询小程序用户列表
*
* @param wxUser 小程序用户
* @return 小程序用户集合
*/
public List<WxUser> selectWxUserList(WxUser wxUser);
/**
* 新增小程序用户
*
* @param wxUser 小程序用户
* @return 结果
*/
public int insertWxUser(WxUser wxUser);
/**
* 修改小程序用户
*
* @param wxUser 小程序用户
* @return 结果
*/
public int updateWxUser(WxUser wxUser);
/**
* 批量删除小程序用户
*
* @param ids 需要删除的小程序用户主键集合
* @return 结果
*/
public int deleteWxUserByIds(Long[] ids);
/**
* 删除小程序用户信息
*
* @param id 小程序用户主键
* @return 结果
*/
public int deleteWxUserById(Long id);
}

View File

@ -0,0 +1,125 @@
package com.ruoyi.wxapi.service.impl;
import java.util.List;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.wxapi.mapper.WxAppMapper;
import com.ruoyi.wxapi.domain.WxApp;
import com.ruoyi.wxapi.service.IWxAppService;
/**
* 小程序设置Service业务层处理
*
* @author tgq
* @date 2021-09-01
*/
@Service
public class WxAppServiceImpl implements IWxAppService
{
@Autowired
private WxAppMapper wxAppMapper;
/**
* 查询小程序设置
*
* @param id 小程序设置主键
* @return 小程序设置
*/
@Override
public WxApp selectWxAppById(Long id)
{
return wxAppMapper.selectWxAppById(id);
}
/**
* 查询小程序设置列表
*
* @param wxApp 小程序设置
* @return 小程序设置
*/
@Override
public List<WxApp> selectWxAppList(WxApp wxApp)
{
return wxAppMapper.selectWxAppList(wxApp);
}
/**
* 新增小程序设置
*
* @param wxApp 小程序设置
* @return 结果
*/
@Override
public int insertWxApp(WxApp wxApp)
{
wxApp.setCreateTime(DateUtils.getNowDate());
return wxAppMapper.insertWxApp(wxApp);
}
/**
* 修改小程序设置
*
* @param wxApp 小程序设置
* @return 结果
*/
@Override
public int updateWxApp(WxApp wxApp)
{
wxApp.setUpdateTime(DateUtils.getNowDate());
return wxAppMapper.updateWxApp(wxApp);
}
/**
* 批量删除小程序设置
*
* @param ids 需要删除的小程序设置主键
* @return 结果
*/
@Override
public int deleteWxAppByIds(Long[] ids)
{
return wxAppMapper.deleteWxAppByIds(ids);
}
/**
* 删除小程序设置信息
*
* @param id 小程序设置主键
* @return 结果
*/
@Override
public int deleteWxAppById(Long id)
{
return wxAppMapper.deleteWxAppById(id);
}
/**
* 获取微信小程序服务
*
* @param code 小程序code
* @return 结果
*/
@Override
public WxMaService getMaService(String code) {
WxApp wxApp = wxAppMapper.selectWxAppByCode(code);
if (wxApp == null) {
throw new IllegalArgumentException(String.format("未找到对应appcode=[%s]的配置,请核实!", code));
}
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(wxApp.getAppId());
config.setSecret(wxApp.getSecret());
// config.setToken(null);
// config.setAesKey(null);
// config.setMsgDataFormat(null);
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(config);
return service;
}
}

View File

@ -0,0 +1,107 @@
package com.ruoyi.wxapi.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.wxapi.mapper.WxUserMapper;
import com.ruoyi.common.core.domain.entity.WxUser;
import com.ruoyi.wxapi.service.IWxUserService;
/**
* 小程序用户Service业务层处理
*
* @author tgq
* @date 2021-09-01
*/
@Service
public class WxUserServiceImpl implements IWxUserService
{
@Autowired
private WxUserMapper wxUserMapper;
/**
* 查询小程序用户
*
* @param id 小程序用户主键
* @return 小程序用户
*/
@Override
public WxUser selectWxUserById(Long id)
{
return wxUserMapper.selectWxUserById(id);
}
/**
* 查询小程序用户
*
* @param openId 小程序用户openId
* @return 小程序用户
*/
@Override
public WxUser selectWxUserByOpenId(String openId) {
return wxUserMapper.selectWxUserByOpenId(openId);
}
/**
* 查询小程序用户列表
*
* @param wxUser 小程序用户
* @return 小程序用户
*/
@Override
public List<WxUser> selectWxUserList(WxUser wxUser)
{
return wxUserMapper.selectWxUserList(wxUser);
}
/**
* 新增小程序用户
*
* @param wxUser 小程序用户
* @return 结果
*/
@Override
public int insertWxUser(WxUser wxUser)
{
wxUser.setCreateTime(DateUtils.getNowDate());
return wxUserMapper.insertWxUser(wxUser);
}
/**
* 修改小程序用户
*
* @param wxUser 小程序用户
* @return 结果
*/
@Override
public int updateWxUser(WxUser wxUser)
{
wxUser.setUpdateTime(DateUtils.getNowDate());
return wxUserMapper.updateWxUser(wxUser);
}
/**
* 批量删除小程序用户
*
* @param ids 需要删除的小程序用户主键
* @return 结果
*/
@Override
public int deleteWxUserByIds(Long[] ids)
{
return wxUserMapper.deleteWxUserByIds(ids);
}
/**
* 删除小程序用户信息
*
* @param id 小程序用户主键
* @return 结果
*/
@Override
public int deleteWxUserById(Long id)
{
return wxUserMapper.deleteWxUserById(id);
}
}

View File

@ -0,0 +1,101 @@
<?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.ruoyi.wxapi.mapper.WxAppMapper">
<resultMap type="WxApp" id="WxAppResult">
<result property="id" column="id" />
<result property="appCode" column="app_code" />
<result property="appName" column="app_name" />
<result property="appId" column="app_id" />
<result property="secret" column="secret" />
<result property="apiDomain" column="api_domain" />
<result property="status" column="status" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectWxAppVo">
select id, app_code, app_name, app_id, secret, api_domain, status, create_by, create_time, update_by, update_time from wx_app
</sql>
<select id="selectWxAppList" parameterType="WxApp" resultMap="WxAppResult">
<include refid="selectWxAppVo"/>
<where>
<if test="appCode != null and appCode != ''"> and app_code like concat('%', #{appCode}, '%')</if>
<if test="appName != null and appName != ''"> and app_name like concat('%', #{appName}, '%')</if>
<if test="status != null and status != ''"> and status = #{status}</if>
</where>
</select>
<select id="selectWxAppById" parameterType="Long" resultMap="WxAppResult">
<include refid="selectWxAppVo"/>
where id = #{id}
</select>
<select id="selectWxAppByCode" parameterType="String" resultMap="WxAppResult">
<include refid="selectWxAppVo"/>
where app_code = #{code}
</select>
<insert id="insertWxApp" parameterType="WxApp">
insert into wx_app
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="appCode != null">app_code,</if>
<if test="appName != null">app_name,</if>
<if test="appId != null">app_id,</if>
<if test="secret != null">secret,</if>
<if test="apiDomain != null">api_domain,</if>
<if test="status != null">status,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="appCode != null">#{appCode},</if>
<if test="appName != null">#{appName},</if>
<if test="appId != null">#{appId},</if>
<if test="secret != null">#{secret},</if>
<if test="apiDomain != null">#{apiDomain},</if>
<if test="status != null">#{status},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
</trim>
</insert>
<update id="updateWxApp" parameterType="WxApp">
update wx_app
<trim prefix="SET" suffixOverrides=",">
<if test="appCode != null">app_code = #{appCode},</if>
<if test="appName != null">app_name = #{appName},</if>
<if test="appId != null">app_id = #{appId},</if>
<if test="secret != null">secret = #{secret},</if>
<if test="apiDomain != null">api_domain = #{apiDomain},</if>
<if test="status != null">status = #{status},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteWxAppById" parameterType="Long">
delete from wx_app where id = #{id}
</delete>
<delete id="deleteWxAppByIds" parameterType="String">
delete from wx_app where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -0,0 +1,123 @@
<?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.ruoyi.wxapi.mapper.WxUserMapper">
<resultMap type="WxUser" id="WxUserResult">
<result property="id" column="id" />
<result property="unionId" column="union_id" />
<result property="openId" column="open_id" />
<result property="nickName" column="nick_name" />
<result property="name" column="name" />
<result property="status" column="status" />
<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="appId" column="app_id" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="selectWxUserVo">
select id, union_id, open_id, nick_name, name, status, avatar_url, gender, country, province, city, mobile, app_id, create_by, create_time, update_by, update_time from wx_user
</sql>
<select id="selectWxUserList" parameterType="WxUser" resultMap="WxUserResult">
<include refid="selectWxUserVo"/>
<where>
<if test="nickName != null and nickName != ''"> and nick_name like concat('%', #{nickName}, '%')</if>
<if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
<if test="status != null and status != ''"> and status = #{status}</if>
</where>
</select>
<select id="selectWxUserById" parameterType="Long" resultMap="WxUserResult">
<include refid="selectWxUserVo"/>
where id = #{id}
</select>
<select id="selectWxUserByOpenId" parameterType="String" resultMap="WxUserResult">
<include refid="selectWxUserVo"/>
where open_id = #{openId}
</select>
<insert id="insertWxUser" parameterType="WxUser" useGeneratedKeys="true" keyProperty="id">
insert into wx_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="unionId != null">union_id,</if>
<if test="openId != null and openId != ''">open_id,</if>
<if test="nickName != null and nickName != ''">nick_name,</if>
<if test="name != null and name != ''">name,</if>
<if test="status != null and status != ''">status,</if>
<if test="avatarUrl != null">avatar_url,</if>
<if test="gender != null">gender,</if>
<if test="country != null">country,</if>
<if test="province != null">province,</if>
<if test="city != null">city,</if>
<if test="mobile != null">mobile,</if>
<if test="appId != null">app_id,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="unionId != null">#{unionId},</if>
<if test="openId != null and openId != ''">#{openId},</if>
<if test="nickName != null and nickName != ''">#{nickName},</if>
<if test="name != null and name != ''">#{name},</if>
<if test="status != null and status != ''">#{status},</if>
<if test="avatarUrl != null">#{avatarUrl},</if>
<if test="gender != null">#{gender},</if>
<if test="country != null">#{country},</if>
<if test="province != null">#{province},</if>
<if test="city != null">#{city},</if>
<if test="mobile != null">#{mobile},</if>
<if test="appId != null">#{appId},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
</trim>
</insert>
<update id="updateWxUser" parameterType="WxUser">
update wx_user
<trim prefix="SET" suffixOverrides=",">
<if test="unionId != null">union_id = #{unionId},</if>
<if test="openId != null and openId != ''">open_id = #{openId},</if>
<if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
<if test="name != null and name != ''">name = #{name},</if>
<if test="status != null and status != ''">status = #{status},</if>
<if test="avatarUrl != null">avatar_url = #{avatarUrl},</if>
<if test="gender != null">gender = #{gender},</if>
<if test="country != null">country = #{country},</if>
<if test="province != null">province = #{province},</if>
<if test="city != null">city = #{city},</if>
<if test="mobile != null">mobile = #{mobile},</if>
<if test="appId != null">app_id = #{appId},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteWxUserById" parameterType="Long">
delete from wx_user where id = #{id}
</delete>
<delete id="deleteWxUserByIds" parameterType="String">
delete from wx_user where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>