提交 10e30b18 作者: xiaowang

Merge branch 'develop' of http://git.mmcuav.cn/iuav/cms

# Conflicts:
#	kustomization/overlays/prod/kustomization.yaml
package com.mmc.iuav.user.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author 作者 geDuo
* @version 创建时间:2021年11月4日 下午2:38:36
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseAccountDTO implements Serializable {
private static final long serialVersionUID = -2979712090903806216L;
private Integer id;
private String uid;
private String accountPhone;
private String accountNo;
private String accountName;
private String tokenPort;
// @ApiModelProperty(value = "角色ID")
// private Integer roleId;
// @ApiModelProperty(value = "是否为管理角色:0否 1是")
// private Integer admin;// 是否为管理角色
// @ApiModelProperty(value = "是否为运营角色:0否 1是")
// private Integer operate;
// @ApiModelProperty(value = "是否PMC发货专员:0否 1是")
// private Integer pmc;
// @ApiModelProperty(value = "单位信息")
// private CompanyCacheDTO companyInfo;// 单位信息
}
package com.mmc.iuav.user.model.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午8:06:14
* @explain 类说明
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginSuccessDTO implements Serializable {
private static final long serialVersionUID = -1200834589953161925L;
private String token;
private Integer userAccountId;
private String accountNo;
private String uid;
private String phoneNum;
private String userName;
private String nickName;
// private RoleInfoDTO roleInfo;
}
......@@ -22,6 +22,8 @@ public class UserAccountSimpleDTO implements Serializable {
private Integer id;
@ApiModelProperty(value = "用户类型")
private Integer accountType;
@ApiModelProperty(value = "用户账号")
private String accountNo;
@ApiModelProperty(value = "用户uid")
private String uid;
@ApiModelProperty(value = "手机号")
......@@ -44,4 +46,6 @@ public class UserAccountSimpleDTO implements Serializable {
private Integer portType;
@ApiModelProperty(value = "企业认证状态, 0未通过,1通过")
private Integer companyAuthStatus;
@ApiModelProperty(value = "合作标签id")
private Integer cooperationTagId;
}
\ No newline at end of file
package com.mmc.iuav.user.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/5/24 15:09
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserSubInfoDTO implements Serializable {
private static final long serialVersionUID = 152531137248542030L;
@ApiModelProperty(value = "是否关注(0:否 1:是)-关注了才会有其他信息")
private Integer subscribe;
@ApiModelProperty(value = "openId")
private String openId;
@ApiModelProperty(value = "unionId")
private String unionId;
@ApiModelProperty(value = "昵称")
private String nickName;
}
package com.mmc.iuav.user.model.qo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.domain.Page;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @author: zj
* @Date: 2023/5/25 13:32
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BUserAccountQO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "关键字", required = false)
private String keyword;
@ApiModelProperty(value = "地区", required = false)
private String area;
@ApiModelProperty(value = "省份编码", required = false)
private Integer provinceCode;
@ApiModelProperty(value = "城市编码", required = false)
private Integer cityCode;
@ApiModelProperty(value = "县区编码", required = false)
private Integer districtCode;
@ApiModelProperty(value = "角色id", required = false)
private Integer roleId;
@ApiModelProperty(value = "账号状态:0禁用 1可用")
private Integer accountStatus;
@ApiModelProperty(value = "账号状态:0合伙人 1员工")
private Integer userType;
@ApiModelProperty(value = "用户id集合")
private List<Integer> userIds;
@ApiModelProperty(value = "推荐单位id")
private Integer rcdCompanyId;
@ApiModelProperty(value="单位集合", hidden = true)
private List<Integer> companys;
@ApiModelProperty(value = "页码", required = true)
@NotNull(message = "页码不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageNo;
@ApiModelProperty(value = "每页显示数", required = true)
@NotNull(message = "每页显示数不能为空", groups = Page.class)
@Min(value = 1, groups = Page.class)
private Integer pageSize;
public void buildCurrentPage() {
this.pageNo = (pageNo - 1) * pageSize;
}
}
package com.mmc.iuav.user.model.qo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/5/25 10:39
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginUserQO implements Serializable {
private static final long serialVersionUID = -6148830939265702460L;
@ApiModelProperty(value = "登录账号")
@NotNull(message = "登录账号不能为空")
private String accountNo;
@ApiModelProperty(value = "登录密码")
@NotNull(message = "登录密码不能为空")
private String passWord;
}
......@@ -22,4 +22,12 @@ public class AppUserSucVO implements Serializable {
private Integer userAccountId;
@ApiModelProperty(value = "token")
private String token;
@ApiModelProperty(value = "UID")
private String uid;
@ApiModelProperty(value = "手机号")
private String phoneNum;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "sessionKey")
private String sessionKey;
}
package com.mmc.iuav.user.model.vo;
import com.alibaba.fastjson2.JSONObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/5/23 17:18
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AppletMsgVO implements Serializable {
private static final long serialVersionUID = -8496071009977568319L;
@ApiModelProperty(value = "openid")
@NotBlank
private String touser;
@ApiModelProperty(value = "模板ID")
@NotBlank
private String template_id;
@ApiModelProperty(value = "点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。")
private String page;
@ApiModelProperty(value = "模板内容")
private JSONObject data;
@ApiModelProperty(value = "跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版")
private String miniprogram_state;
@ApiModelProperty(value = "默认为zh_CN")
private String lang;
}
package com.mmc.iuav.user.model.vo;
import com.mmc.iuav.group.Create;
import com.mmc.iuav.group.Update;
import com.mmc.iuav.group.UpdatePassword;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/5/25 11:15
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BUserAccountVO implements Serializable {
private static final long serialVersionUID = -5809674104674997410L;
@ApiModelProperty(value = "id")
@NotNull(message = "更新时ID不能为空", groups = {Update.class, UpdatePassword.class})
private Integer id;
@ApiModelProperty(value = "账号", example = "developer")
@NotEmpty(message = "账号不能为空", groups = {Create.class, Update.class})
private String accountNo;
@ApiModelProperty(value = "姓名", example = "张三丰")
@NotEmpty(message = "姓名不能为空", groups = {Create.class, Update.class})
private String userName;
@ApiModelProperty(value = "电话", example = "13700137000")
@NotEmpty(message = "创建,修改时电话不能为空", groups = {Create.class, Update.class})
private String phoneNum;
@ApiModelProperty(value = "密码", example = "123456")
@NotEmpty(message = "创建密码不能为空", groups = {Create.class, UpdatePassword.class})
private String passWord;
@ApiModelProperty(value = "确认密码", example = "123456")
@NotEmpty(message = "确认密码不能为空", groups = {Create.class, UpdatePassword.class})
private String alertPwd;
@ApiModelProperty(value = "备注", example = "一个备注")
private String remark;
@ApiModelProperty(value = "状态", example = "1")
@NotNull(message = "状态不能为空", groups = {Update.class})
private Integer accountStatus;
@ApiModelProperty(value = "角色", example = "1", hidden = true)
//@NotNull(message = "角色不能为空", groups = {Create.class, Update.class})
private Integer roleId;
@ApiModelProperty(value = "能控制的用户资源来源",hidden = true)
private Integer controlSource;
@ApiModelProperty(value = "电子邮箱", example = "220700100213@163.com")
@Email
private String email;
@ApiModelProperty(value = "所属公司ID",example = "1", hidden = true)
private Integer companyId;
@ApiModelProperty(value = "账号类型:0合伙人 1员工", example = "1", hidden = true)
private Integer userType;
@ApiModelProperty(value = "省份编码", required = false)
private Integer provinceCode;
@ApiModelProperty(value = "城市编码", required = false)
private Integer cityCode;
@ApiModelProperty(value = "县区编码", required = false)
private Integer districtCode;
}
package com.mmc.iuav.user.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author: zj
* @Date: 2023/5/23 19:25
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MsgData implements Serializable {
private static final long serialVersionUID = 1479503488297727536L;
private String value;
private String color = "#173177";// 字体颜色
}
\ No newline at end of file
......@@ -21,7 +21,6 @@ import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "com.mmc.iuav.user.model.vo.UserAccountVO", description = "用户信息")
public class UserAccountVO implements Serializable {
private static final long serialVersionUID = 7067111726018678883L;
@ApiModelProperty(value = "用户id")
......@@ -31,6 +30,8 @@ public class UserAccountVO implements Serializable {
private Integer accountType;
@ApiModelProperty(value = "用户uid")
private String uid;
@ApiModelProperty(value = "用户账号")
private String accountNo;
@ApiModelProperty(value = "手机号")
private String phoneNum;
@ApiModelProperty(value = "用户名称")
......@@ -54,5 +55,9 @@ public class UserAccountVO implements Serializable {
private Integer portType;
@ApiModelProperty(value = "注册时间")
private Date createTime;
@ApiModelProperty(value = "企业认证状态, 0未通过,1通过")
private Integer companyAuthStatus;
@ApiModelProperty(value = "合作标签id")
private Integer cooperationTagId;
}
package com.mmc.iuav.user.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @author: zj
* @Date: 2023/5/26 20:58
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserTagVO implements Serializable {
private static final long serialVersionUID = -2693784088480292773L;
private Integer id;
private Integer cooperationTagId;
private Integer userAccountId;
private Date createTime;
private Date updateTime;
}
......@@ -18,7 +18,6 @@ import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "com.mmc.iuav.user.model.vo.WxLoginVO", description = "登录参数")
public class WxLoginVO implements Serializable {
private static final long serialVersionUID = 2500957724470423989L;
@ApiModelProperty(value = "请求code")
......
package com.mmc.iuav.user.model.vo;
import com.alibaba.fastjson2.JSONObject;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.CollectionUtils;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
/**
* @author: zj
* @Date: 2023/5/23 19:24
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WxMsgVO implements Serializable {
private static final long serialVersionUID = 107288179600606045L;
@ApiModelProperty(value = "用户id-仅适用云享飞客户端")
private Integer userAccountId;
@ApiModelProperty(value = "公众号的openId")
private String openId;
@ApiModelProperty(value = "unionId-全局通用")
private String unionId;
@ApiModelProperty(value = "模板id")
@NotNull(message = "模板id不能为空")
private String templemteId;
@ApiModelProperty(value = "网页跳转连接")
private String url;
@ApiModelProperty(value = "小程序APPID")
private String wxAppltAppId;
@ApiModelProperty(value = "小程序跳转连接")
private String appletPath;
@ApiModelProperty(value = "标题")
private MsgData title;
@ApiModelProperty(value = "消息数组")
private List<MsgData> data;
@ApiModelProperty(value = "消息备注")
private MsgData remark;
public String buildMsgJson() {
JSONObject obj = new JSONObject();
obj.put("touser", this.openId);
obj.put("template_id", this.templemteId);
if (!StringUtils.isBlank(this.url)) {
obj.put("url", this.url);
}
if (!StringUtils.isBlank(this.wxAppltAppId) && !StringUtils.isBlank(this.appletPath)) {
JSONObject mini = new JSONObject();
mini.put("appid", this.wxAppltAppId);
mini.put("pagepath", this.appletPath);
obj.put("miniprogram", mini);
}
JSONObject jd = new JSONObject();
jd.put("first", this.convertMsg(title));
if (!CollectionUtils.isEmpty(this.data)) {
for (int i = 0; i < data.size(); i++) {
String key = "keyword" + (i + 1);
jd.put(key, this.convertMsg(data.get(i)));
}
}
if (this.remark != null && !StringUtils.isBlank(this.remark.getValue())) {
jd.put("remark", this.convertMsg(this.remark));
}
obj.put("data", jd);
return obj.toJSONString();
}
public JSONObject convertMsg(MsgData msg) {
JSONObject jb = new JSONObject();
jb.put("value", msg.getValue());
jb.put("color", msg.getColor());
return jb;
}
}
package com.mmc.iuav.auth;
import com.mmc.iuav.general.CodeUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import io.jsonwebtoken.*;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
......
......@@ -25,4 +25,8 @@ public class CodeUtil {
public static String randomCode(int i) {
return CodeUtil.getRandomNum(i);
}
public static String removeUserAccount() {
return "DELETE" + CodeUtil.getRandomNum(15);
}
}
package com.mmc.iuav.group;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月28日 下午5:37:44
* @explain 类说明
*/
public interface Create {
}
package com.mmc.iuav.group;
/**
* @author 作者 geDuo
* @version 创建时间:2021年9月18日 上午11:22:40
* @explain 类说明
*/
public interface Freeze {
}
package com.mmc.iuav.group;
/**
* author:zhenjie
* Date:2021/10/8
* time:16:26
*/
public interface UpdatePassword {
}
package com.mmc.iuav.http;
import com.mmc.iuav.response.BaseErrorInfoInterface;
import com.mmc.iuav.response.ResultEnum;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月13日 上午9:25:43
* @explain 类说明
*/
public class BizException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
protected String errorCode;
/**
* 错误信息
*/
protected String errorMsg;
public BizException() {
super();
}
public BizException(BaseErrorInfoInterface errorInfoInterface) {
super(errorInfoInterface.getResultCode());
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
}
public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {
super(errorInfoInterface.getResultCode(), cause);
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
}
public BizException(ResultEnum enums) {
super(enums.getResultCode());
this.errorCode = enums.getResultCode();
this.errorMsg = enums.getResultMsg();
}
public BizException(String errorMsg) {
super(errorMsg);
this.errorCode = "-1";
this.errorMsg = errorMsg;
}
public BizException(String errorCode, String errorMsg) {
super(errorCode);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public BizException(String errorCode, String errorMsg, Throwable cause) {
super(errorCode, cause);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
@Override
public String getMessage() {
return errorMsg;
}
@Override
public Throwable fillInStackTrace() {
return this;
}
}
package com.mmc.iuav.page;
import com.mmc.iuav.group.Freeze;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.domain.Page;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseInfoQO {
@ApiModelProperty(value = "开始时间")
private String startTime;
@ApiModelProperty(value = "结束时间")
private String endTime;
@ApiModelProperty(value = "页码")
@NotNull(message = "页码不能为空", groups = { Page.class, Freeze.class })
@Min(value = 1, groups = Page.class,message = "pageNo不能少于1")
private Integer pageNo;
@ApiModelProperty(value = "每页显示数")
@NotNull(message = "每页显示数不能为空", groups = { Page.class, Freeze.class })
@Min(value = 1, groups = Page.class,message = "pageSize不能少于1")
private Integer pageSize;
/**
* 初始化起始查询行并返回当前页
*/
public Integer buildCurrentPage() {
Integer pageNo = this.pageNo;
this.pageNo = (pageNo - 1) * pageSize;
return pageNo;
}
}
package com.mmc.iuav.page;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月28日 下午3:18:21
* @explain 分页工具类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult<T> implements Serializable{
private static final long serialVersionUID = -2848996493573325801L;
private int pageNo;// 分页起始页
private int pageSize;// 每页记录数
private T list;// 返回的记录集合
private long totalCount;// 总记录条数
private long totalPage;// 总页数
public static PageResult buildPage(int pageNo, int pageSize, int totalCount) {
PageResult page = new PageResult();
page.pageNo = pageNo;
page.pageSize = pageSize;
page.totalCount = totalCount;
page.totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1);
return page;
}
public static <T> PageResult buildPage(int pageNo, int pageSize, int totalCount, T list) {
PageResult page = PageResult.buildPage(pageNo, pageSize, totalCount);
page.setList(list);
return page;
}
public static PageResult buildPage(BaseInfoQO qo, int totalCount) {
PageResult page = new PageResult();
page.pageNo = qo.getPageNo();
Integer pageSize = qo.getPageSize();
page.pageSize = pageSize;
page.totalCount = totalCount;
page.totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1);
return page;
}
}
package com.mmc.iuav.page;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author 作者 geDuo
* @version 创建时间:2021年11月10日 上午11:40:34
* @explain 类说明
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TimePage implements Serializable {
private static final long serialVersionUID = -2530498038870578257L;
private int pageNo;// 分页起始页
private int pageSize;// 每页记录数
private long totalCount;// 总记录条数
private long totalPage;// 总页数
private long ctime;
public static TimePage buildPage(int pageNo, int pageSize, int totalCount, long ctime) {
TimePage page = new TimePage();
page.pageNo = pageNo;
page.pageSize = pageSize;
page.totalCount = totalCount;
page.totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1);
page.setCtime(ctime);
return page;
}
}
......@@ -14,8 +14,26 @@ public enum ResultEnum implements BaseErrorInfoInterface{
COMPANY_NOT_AUTH_ERROR("1001", "未进行企业认证"),
BUSINESS_LICENSE_CHECK_PARAMETER_ERROR("1002", "企业信息与营业执照信息不一致,请重新上传"),
LOGIN_ACCOUNT_NOT_EXIT_ERROR("5005", "账号不存在"),
LOGIN_PASSWORD_ERROR("5006", "密码错误"),
LOGIN_ACCOUNT_STATUS_ERROR("5008", "外部访问"),
//微信相关
PASSWORD_INCONSISTENT("5026", "新密码与确认密码不一致,请确认一致"),
WX_ACCESS_TOKEN_ERROR("5027", "获取微信AccessToken失败"),
APPLET_QR_CODE_CREATE_ERROR("5030", "生成小程序码错误:"),
AUTH_PHONE_NUMBER_ERROR("5031", "授权手机号失败"),
PWD_CREATE_ERROR("6001", "创建密码失败"),
PWD_CONPARED_ERROR("6002", "密码错误"), PWD_ALERT_ERROR("6003", "密码不一致"),
PWD_REQUEST_AUTH_ERROR("6003", "密码请求验证"),
APPLET_PORT_TYPE_ERROR("7001", "小程序端口类型错误"),
APPLET_LOGIN_ERROR("7002", "获取小程序登录失败");
APPLET_LOGIN_ERROR("7002", "获取小程序登录失败"),
UPDATE_USER_ACCOUNT_REPEAT("7003", "修改后的账户名已存在"),
ADD_USER_ACCOUNT_NAME_EXISTS("7004", "新增账户名已经存在");
/**
* 错误码
......
......@@ -90,6 +90,13 @@
<!-- <version>4.0.0</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/com.github.wxpay/wxpay-sdk -->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
</dependencies>
<build>
......
package com.mmc.iuav.user.auth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.security.SecureRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Implementation of PasswordEncoder that uses the BCrypt strong hashing function. Clients
* can optionally supply a "version" ($2a, $2b, $2y) and a "strength" (a.k.a. log rounds in BCrypt)
* and a SecureRandom instance. The larger the strength parameter the more work will have to be done
* (exponentially) to hash the passwords. The default value is 10.
*
*/
@Component
public class BCryptPasswordEncoder implements PasswordEncoder {
private Pattern BCRYPT_PATTERN = Pattern
.compile("\\A\\$2(a|y|b)?\\$(\\d\\d)\\$[./0-9A-Za-z]{53}");
private final Logger logger = LoggerFactory.getLogger(com.mmc.iuav.user.auth.BCryptPasswordEncoder.class);
private final int strength;
private final BCryptVersion version;
private final SecureRandom random;
public BCryptPasswordEncoder() {
this(-1);
}
/**
* @param strength the log rounds to use, between 4 and 31
*/
public BCryptPasswordEncoder(int strength) {
this(strength, null);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
*/
public BCryptPasswordEncoder(BCryptVersion version) {
this(version, null);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param random the secure random instance to use
*/
public BCryptPasswordEncoder(BCryptVersion version, SecureRandom random) {
this(version, -1, random);
}
/**
* @param strength the log rounds to use, between 4 and 31
* @param random the secure random instance to use
*/
public BCryptPasswordEncoder(int strength, SecureRandom random) {
this(BCryptVersion.$2A, strength, random);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param strength the log rounds to use, between 4 and 31
*/
public BCryptPasswordEncoder(BCryptVersion version, int strength) {
this(version, strength, null);
}
/**
* @param version the version of bcrypt, can be 2a,2b,2y
* @param strength the log rounds to use, between 4 and 31
* @param random the secure random instance to use
*/
public BCryptPasswordEncoder(BCryptVersion version, int strength, SecureRandom random) {
if (strength != -1 && (strength < BCrypt.MIN_LOG_ROUNDS || strength > BCrypt.MAX_LOG_ROUNDS)) {
throw new IllegalArgumentException("Bad strength");
}
this.version = version;
this.strength = strength == -1 ? 10 : strength;
this.random = random;
}
public String encode(CharSequence rawPassword) {
if (rawPassword == null) {
throw new IllegalArgumentException("rawPassword cannot be null");
}
String salt;
if (random != null) {
salt = BCrypt.gensalt(version.getVersion(), strength, random);
} else {
salt = BCrypt.gensalt(version.getVersion(), strength);
}
return BCrypt.hashpw(rawPassword.toString(), salt);
}
public boolean matches(CharSequence rawPassword, String encodedPassword) {
if (rawPassword == null) {
throw new IllegalArgumentException("rawPassword cannot be null");
}
if (encodedPassword == null || encodedPassword.length() == 0) {
logger.warn("Empty encoded password");
return false;
}
if (!BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
logger.warn("Encoded password does not look like BCrypt");
return false;
}
return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}
@Override
public boolean upgradeEncoding(String encodedPassword) {
if (encodedPassword == null || encodedPassword.length() == 0) {
logger.warn("Empty encoded password");
return false;
}
Matcher matcher = BCRYPT_PATTERN.matcher(encodedPassword);
if (!matcher.matches()) {
throw new IllegalArgumentException("Encoded password does not look like BCrypt: " + encodedPassword);
}
else {
int strength = Integer.parseInt(matcher.group(2));
return strength < this.strength;
}
}
/**
* Stores the default bcrypt version for use in configuration.
*
* @author Lin Feng
*/
public enum BCryptVersion {
$2A("$2a"),
$2Y("$2y"),
$2B("$2b");
private final String version;
BCryptVersion(String version) {
this.version = version;
}
public String getVersion() {
return this.version;
}
}
}
package com.mmc.iuav.user.auth;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import java.util.Objects;
/**
* Author: geDuo
* Date: 2022/6/2 17:26
*/
@Configuration
public class DataFilterYml {
@Bean
public static PropertySourcesPlaceholderConfigurer loadYml(){
PropertySourcesPlaceholderConfigurer configurer=new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml=new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("not-check.yml"));
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}
package com.mmc.iuav.user.auth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author: zj
* @Date: 2023/5/28 10:52
*/
@Configuration
public class MvcConfiguration implements WebMvcConfigurer {
@Autowired
private TokenCheckHandleInterceptor tokenCheckHandleInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(tokenCheckHandleInterceptor);
WebMvcConfigurer.super.addInterceptors(registry);
}
}
package com.mmc.iuav.user.auth;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.util.List;
/**
* @author: zj
* @Date: 2023/5/28 13:54
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "data-filter", ignoreUnknownFields = false)
@PropertySource("classpath:not-check.yml")
public class NotCheckUriConfig {
// 不需要验证token的请求地址
private List<String> notAuthPath;
// 不需要验证token的请求地址;// 不需要验证token的请求地址
private List<String> uploadPath;
}
package com.mmc.iuav.user.auth;
/**
* Service interface for encoding passwords.
*
* The preferred implementation is {@code BCryptPasswordEncoder}.
*
* @author Keith Donald
*/
public interface PasswordEncoder {
/**
* Encode the raw password. Generally, a good encoding algorithm applies a SHA-1 or
* greater hash combined with an 8-byte or greater randomly generated salt.
*/
String encode(CharSequence rawPassword);
/**
* Verify the encoded password obtained from storage matches the submitted raw
* password after it too is encoded. Returns true if the passwords match, false if
* they do not. The stored password itself is never decoded.
*
* @param rawPassword the raw password to encode and match
* @param encodedPassword the encoded password from storage to compare with
* @return true if the raw password, after encoding, matches the encoded password from
* storage
*/
boolean matches(CharSequence rawPassword, String encodedPassword);
/**
* Returns true if the encoded password should be encoded again for better security,
* else false. The default implementation always returns false.
* @param encodedPassword the encoded password to check
* @return true if the encoded password should be encoded again for better security,
* else false.
*/
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
package com.mmc.iuav.user.auth;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午4:39:06
* @explain 密码加密
*/
public class PwdUtil {
public static String securityPwd(String passWord) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(passWord.getBytes());
return new BigInteger(md.digest()).toString(32);
}
}
package com.mmc.iuav.user.auth;
import com.alibaba.fastjson2.JSONObject;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.util.PathUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
* @author: zj
* @Date: 2023/5/28 10:46
*/
@Component
public class TokenCheckHandleInterceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private NotCheckUriConfig notCheckUriConfig;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//扫码登录还没做好,暂时先注释
// String requestURI = request.getRequestURI();
// //根据uri确认是否要拦截
// if (!shouldFilter(requestURI)){
// return true;
// }
// String token = request.getHeader("token");
// String tokenJson = stringRedisTemplate.opsForValue().get(token);
//
// if (StringUtils.isBlank(tokenJson)){
// exceptionProcess(response);
// return false;
// }
// LoginSuccessDTO loginSuccessDTO = JSONObject.parseObject(tokenJson, LoginSuccessDTO.class);
// if (loginSuccessDTO != null){
// request.setAttribute("userAccountId", loginSuccessDTO.getUserAccountId());
// }
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
public void exceptionProcess(HttpServletResponse response) throws Exception{
response.setContentType("application/json;charset=utf-8");
PrintWriter writer=response.getWriter();
writer.write(ResultBody.error(ResultEnum.LOGIN_ACCOUNT_STATUS_ERROR).toString());
writer.close();
}
private boolean shouldFilter(String path) {
// 路径与配置的相匹配,则执行过滤
for (String pathPattern : notCheckUriConfig.getNotAuthPath()) {
if (PathUtil.isPathMatch(pathPattern, path)) {
// 如果匹配
return false;
}
}
return true;
}
}
......@@ -15,5 +15,10 @@ public class WxConstant {
public static final String OPEN_ID = "openid";
public static final String UNION_ID = "unionid";
public static final String SESSION_KEY = "session_key";
public final static String subscribe = "subscribe";
public final static String unsubscribe = "unsubscribe";
public static final String IUAV_MINI_PROGRAM_ACCESS_TOKEN = "IUAV_MINI_PROGRAM_ACCESS_TOKEN";
public static final String SHARE_FLY_SUB_ACCESS_TOKEN = "SHARE_FLY_SUB_ACCESS_TOKEN";
}
......@@ -2,6 +2,7 @@ package com.mmc.iuav.user.controller;
import com.mmc.iuav.group.Insert;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.qo.LoginUserQO;
import com.mmc.iuav.user.model.vo.AppUserSucVO;
import com.mmc.iuav.user.model.vo.WxLoginVO;
import com.mmc.iuav.user.service.AuthService;
......@@ -10,6 +11,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @author: zj
* @Date: 2023/5/15 15:50
......@@ -28,4 +31,19 @@ public class AuthController {
public ResultBody appletLogin(@Validated(value = {Insert.class})@RequestBody WxLoginVO wxLoginVO){
return authService.appletLogin(wxLoginVO);
}
@ApiOperation(value = "平台账号密码登录")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@PostMapping("backEndLogin")
public ResultBody backEndLogin(
@ApiParam(value = "账号登录QO", required = true) @Validated @RequestBody LoginUserQO param) {
return authService.backEndLogin(param);
}
@ApiOperation(value = "测试-小程序unionId登录/注册")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = AppUserSucVO.class) })
@PostMapping("testAppletLogin")
public ResultBody testAppletLogin(@RequestParam String unionId){
return authService.testAppletLogin(unionId);
}
}
package com.mmc.iuav.user.controller;
import com.mmc.iuav.group.Create;
import com.mmc.iuav.group.Update;
import com.mmc.iuav.group.UpdatePassword;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.dto.BaseAccountDTO;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.dto.UserAccountSimpleDTO;
import com.mmc.iuav.user.model.qo.BUserAccountQO;
import com.mmc.iuav.user.model.vo.BUserAccountVO;
import com.mmc.iuav.user.model.vo.UserAccountVO;
import com.mmc.iuav.user.service.UserAccountService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
* @author: zj
* @Date: 2023/5/25 11:22
*/
@Api(tags = "后台用户相关接口")
@RequestMapping("/back-user/")
@RestController
public class BackUserAccountController extends BaseController{
@Autowired
private UserAccountService userAccountService;
@ApiOperation(value = "账号-新增")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("insertBAccount")
public ResultBody insertBAccount(@Validated(value = {Create.class}) @RequestBody BUserAccountVO bUserAccountVO) {
return userAccountService.insertBAccount(bUserAccountVO);
}
@ApiOperation(value = "账号-修改")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("updateBAccount")
public ResultBody updateBAccount(@Validated(value = {Update.class}) @RequestBody BUserAccountVO bUserAccountVO) {
return userAccountService.updateBAccount(bUserAccountVO);
}
@ApiOperation(value = "账号-删除")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("removeBAccount")
public ResultBody removeBAccount(@RequestParam Integer userAccountId, HttpServletRequest request) {
return userAccountService.removeBAccount(userAccountId);
}
@ApiOperation(value = "账号-列表")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("listBAccountPage")
public ResultBody<UserAccountSimpleDTO> listBAccountPage(@ApiParam(value = "账号查询QO", required = true) @RequestBody BUserAccountQO bUserAccountQO) {
return userAccountService.listBAccountPage(bUserAccountQO);
}
@ApiOperation(value = "账号-用户列表-内部调用", hidden = true)
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = List.class)})
@PostMapping("feignListBAccountPage")
public List<UserAccountSimpleDTO> feignListBAccountPage(@ApiParam(value = "账号查询QO", required = true) @RequestBody BUserAccountQO bUserAccountQO) {
return userAccountService.feignListBAccountPage(bUserAccountQO);
}
@ApiOperation(value = "账号管理-修改密码")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("updatePassword")
public ResultBody updatePassword(@Validated(value = {UpdatePassword.class}) @RequestBody BUserAccountVO account)
throws NoSuchAlgorithmException {
return userAccountService.updatePassword(account);
}
@ApiOperation(value = "feign-验证用户密码")
@ApiIgnore
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("feignAuthUserPwd")
public ResultBody feignAuthUserPwd(@RequestParam(required = true) Integer id,
@RequestParam(required = true) String authPwd) {
return userAccountService.feignAuthUserPwd(id, authPwd);
}
@ApiOperation(value = "test")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("listTest")
public ResultBody listTest(HttpServletRequest request) {
return ResultBody.success();
}
}
package com.mmc.iuav.user.controller;
import com.alibaba.fastjson2.JSONObject;
import com.mmc.iuav.auth.JwtConstant;
import com.mmc.iuav.auth.JwtUtil;
import com.mmc.iuav.http.BizException;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.model.dto.BaseAccountDTO;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import io.jsonwebtoken.Claims;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.servlet.http.HttpServletRequest;
/**
* @author: zj
* @Date: 2023/5/25 18:11
*/
public abstract class BaseController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 解析token,获取用户信息
* @param request
* @return
*/
// public BaseAccountDTO getUserLoginInfo(HttpServletRequest request) {
// String token = request.getHeader("token");
// try {
// Claims claims = JwtUtil.parseJwt(token);
// String userId = claims.get(JwtConstant.USER_ACCOUNT_ID).toString();
//// String roleId = claims.get("").toString();
// String tokenType = claims.get(JwtConstant.TOKEN_TYPE).toString();
// return BaseAccountDTO.builder().id(Integer.parseInt(userId)).tokenPort(tokenType).build();
// }catch (Exception e){
// throw new BizException("Invalid token");
// }
// }
/**
* 使用token从redis获取用户信息
* @param request
* @return
*/
public LoginSuccessDTO getUserLoginInfoFromRedis(HttpServletRequest request) {
String token = request.getHeader("token");
String json = stringRedisTemplate.opsForValue().get(token);
if (StringUtils.isBlank(json)){
throw new BizException(ResultEnum.LOGIN_ACCOUNT_STATUS_ERROR);
}
LoginSuccessDTO loginSuccessDTO = JSONObject.parseObject(json, LoginSuccessDTO.class);
return loginSuccessDTO;
}
}
......@@ -35,4 +35,11 @@ public class CooperationController {
public ResultBody apply(@Validated(value = {Insert.class})@RequestBody UserApplyTagVO userApplyTagVO){
return cooperationService.apply(userApplyTagVO);
}
@ApiOperation(value = "后台设置小程序用户标签")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@GetMapping("changeUserTag")
public ResultBody changeUserTag(@RequestParam("userAccountId") Integer userAccountId, @RequestParam("cooperationTagId") Integer cooperationTagId) {
return cooperationService.changeUserTag(userAccountId, cooperationTagId);
}
}
package com.mmc.iuav.user.controller;
import com.mmc.iuav.group.Insert;
import com.mmc.iuav.group.Update;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.dto.UserAccountSimpleDTO;
import com.mmc.iuav.user.model.vo.AppUserSucVO;
import com.mmc.iuav.user.model.vo.UserAccountVO;
import com.mmc.iuav.user.model.vo.WxLoginVO;
import com.mmc.iuav.user.service.UserAccountService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
......@@ -25,7 +20,7 @@ import java.util.List;
@Api(tags = "账号相关接口")
@RequestMapping("/user-account/")
@RestController
public class UserAccountController {
public class UserAccountController extends BaseController{
@Autowired
private UserAccountService userAccountService;
......@@ -33,8 +28,8 @@ public class UserAccountController {
@ApiOperation(value = "获取用户信息")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserAccountVO.class) })
@GetMapping("info")
public UserAccountVO info(@RequestParam Integer userAccountId){
return userAccountService.getUserAccountById(userAccountId);
public ResultBody info(HttpServletRequest request) {
return ResultBody.success(userAccountService.getUserAccountById(this.getUserLoginInfoFromRedis(request).getUserAccountId()));
}
@ApiOperation(value = "修改用户信息")
......@@ -44,19 +39,26 @@ public class UserAccountController {
return userAccountService.update(userAccountVO);
}
@ApiOperation(value = "获取用户基本信息")
@ApiOperation(value = "获取用户基本信息", hidden = true)
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserAccountSimpleDTO.class) })
@GetMapping("feignGetUserSimpleInfo")
public UserAccountSimpleDTO feignGetUserSimpleInfo(@RequestParam Integer userAccountId){
return userAccountService.getUserSimpleInfo(userAccountId);
}
@ApiOperation(value = "根据用户地区查询后台用户id")
@ApiOperation(value = "根据用户地区查询后台用户id", hidden = true)
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserAccountSimpleDTO.class) })
@GetMapping("feignListUserAccountIds")
public List<Integer>feignListUserAccountIds(@RequestParam Integer provinceCode, @RequestParam(required = false) Integer cityCode, @RequestParam(required = false) Integer districtCode){
return userAccountService.feignListUserAccountIds(provinceCode, cityCode, districtCode);
}
@ApiOperation(value = "授权手机号")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = Integer.class) })
@GetMapping("getUserPhoneNumber")
public ResultBody getUserPhoneNumber(HttpServletRequest request,
@ApiParam(value = "授权手机号code", required = true) @RequestParam String code) {
return userAccountService.getUserPhoneNumber(this.getUserLoginInfoFromRedis(request).getUserAccountId(), code);
}
}
......@@ -2,16 +2,14 @@ package com.mmc.iuav.user.controller;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.service.WxService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author: zj
......@@ -20,7 +18,7 @@ import javax.servlet.http.HttpServletRequest;
@Api(tags = "微信相关接口")
@RequestMapping("/wx/")
@RestController
public class WxController {
public class WxController extends BaseController {
@Autowired
private WxService wxService;
......@@ -28,9 +26,50 @@ public class WxController {
@ApiOperation(value = "小程序-获取当前用户的小程序推荐码")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = String.class) })
@PostMapping("getAppletRcdCode")
public ResultBody getAppletRcdCode(HttpServletRequest request) {
return ResultBody.success();
// return wxService.getAppletCodeImgBase64(WxMsgDataConfig.USER_APPLET_PAGE_INDEX,
// WxHandler.createRcdScene(this.getCurrentUser(request).getId()));
public ResultBody getAppletRcdCode(HttpServletRequest request, @ApiParam(value = "小程序路径",example = "pages/welcome/index") @RequestParam String page) {
return wxService.getUnLimitedQRCode(page, "currentUserAccountId=" + this.getUserLoginInfoFromRedis(request).getUserAccountId());
}
@ApiOperation(value = "小程序-测试专用")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@PostMapping("testDemo")
public ResultBody testDemo() {
return ResultBody.success("app:" + "wxService.getAccessToken()" + "sub: " + wxService.getSubAccessToken());
}
/**
* https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html#method-http
* (有效期最长不超过30天)
*
* @param path
* smsCode=SMS00003&scene=7 scene:表示用户用户来源渠道
* @return
*/
@ApiOperation(value = "URL_Link")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = Integer.class) })
@GetMapping("createUrlLink")
public ResultBody createUrlLink(
@ApiParam(value = "小程序路径", required = false) @RequestParam(required = false) String path,
@ApiParam(value = "路径携带参数", required = false) @RequestParam(required = false) String query) {
return ResultBody.success(wxService.createUrlLink(path, query));
}
@ApiOperation(value = "监控微信公众号的事件变化通知", hidden = true)
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = String.class) })
@PostMapping("wxSendMessage")
public void wxSendMessage(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
System.out.println("##########接收到微信事件推送############");
String msg = wxService.receiveSubAccountEvents(req);
out.println(msg);
}
@ApiOperation(value = "生成小程序码")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@GetMapping("getAppletQRCode")
public ResultBody getAppletQRCode(@ApiParam(value = "小程序路径",example = "pages/welcome/index") @RequestParam String page,@ApiParam(value = "参数",example = "name=123&sex=456") @RequestParam String scene) {
return wxService.getUnLimitedQRCode(page, scene);
}
}
......@@ -2,6 +2,7 @@ package com.mmc.iuav.user.dao;
import com.mmc.iuav.user.entity.CooperationTagDO;
import com.mmc.iuav.user.entity.UserApplyTagDO;
import com.mmc.iuav.user.entity.UserTagDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
......@@ -36,4 +37,23 @@ public interface CooperationDao {
* @param userApplyTagDO
*/
void updateUserApplyTag(UserApplyTagDO userApplyTagDO);
/**
* 根据用户id查询渠道登记
* @param userAccountId
* @return
*/
UserTagDO getUserTag(Integer userAccountId);
/**
* 用户设置渠道等级
* @param userTagDO
*/
void insertUserTag(UserTagDO userTagDO);
/**
* 修改用户渠道等级
* @param userTagDO
*/
void updateUserTag(UserTagDO userTagDO);
}
package com.mmc.iuav.user.dao;
import com.mmc.iuav.user.entity.UserAccountDO;
import com.mmc.iuav.user.model.qo.BUserAccountQO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
......@@ -45,4 +46,62 @@ public interface UserServiceDao {
* @return
*/
List<Integer> listUserAccountIdsByDistrictCode(Integer provinceCode, Integer cityCode, Integer districtCode);
/**
* 登录账号密码查询用户信息
* @param accountNo
* @param passWord
* @return
*/
UserAccountDO getUserLoginInfo(String accountNo, String passWord);
/**
* 批量获取用户信息
* @param bUserAccountQO
* @return
*/
List<UserAccountDO> feignListBAccountPage(BUserAccountQO bUserAccountQO);
/**
* 删除用户
* @param removeNO
* @param userAccountId
*/
void removeUserAccount(String removeNO, Integer userAccountId);
/**
* 根据账号名称查询数量
* @param excludeId
* @param accountNo
* @return
*/
int countUserAccountNo(Integer excludeId, String accountNo);
/**
* 查询用户数量
* @param param
* @return
*/
int countListBAccountPage(BUserAccountQO param);
/**
* 查询用户信息
* @param param
* @return
*/
List<UserAccountDO> listBAccountPage(BUserAccountQO param);
/**
* 修改用户密码
* @param id
* @param passWord
*/
void updatePassword(Integer id, String passWord);
/**
* 获取用户密码
* @param id
* @return
*/
UserAccountDO getUserAuthPwdInfo(Integer id);
}
package com.mmc.iuav.user.dao;
import com.mmc.iuav.user.entity.UserSubInfoDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @author: zj
* @Date: 2023/5/24 15:00
*/
@Mapper
public interface UserSubInfoDao {
Integer countUserSubInfo(String openId);
UserSubInfoDO getUserSubInfo(String openId);
UserSubInfoDO getUserSubInfoById(Integer userAccountId);
UserSubInfoDO getUserSubInfoByUnionId(String unionId);
void insertUserSubInfo(UserSubInfoDO subInfo);
void removeUserSubInfo(String openId);
void updateUserSubInfo(UserSubInfoDO subInfo);
}
package com.mmc.iuav.user.entity;
import com.mmc.iuav.user.model.dto.UserAccountSimpleDTO;
import com.mmc.iuav.user.model.vo.BUserAccountVO;
import com.mmc.iuav.user.model.vo.UserAccountVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -19,7 +21,9 @@ import java.util.Date;
public class UserAccountDO implements Serializable {
private static final long serialVersionUID = 5007589179946146721L;
private Integer id;
private String accountNo;
private Integer accountType;
private String password;
private String uid;
private String phoneNum;
private String userName;
......@@ -36,6 +40,12 @@ public class UserAccountDO implements Serializable {
private Integer deleted;
private Date createTime;
private Date updateTime;
private Integer provinceCode;
private Integer cityCode;
private Integer districtCode;
private Integer cooperationTagId;
private Integer companyAuthStatus;
public UserAccountDO(UserAccountVO userAccountVO) {
this.id = userAccountVO.getId();
......@@ -50,15 +60,29 @@ public class UserAccountDO implements Serializable {
this.portType = userAccountVO.getPortType();
}
public UserAccountDO(BUserAccountVO bUserAccountVO) {
this.id = bUserAccountVO.getId();
this.accountNo = bUserAccountVO.getAccountNo();
this.phoneNum = bUserAccountVO.getPhoneNum();
this.userName = bUserAccountVO.getUserName();
this.email = bUserAccountVO.getEmail();
this.accountStatus = bUserAccountVO.getAccountStatus();
this.remark = bUserAccountVO.getRemark();
this.provinceCode = bUserAccountVO.getProvinceCode();
this.cityCode = bUserAccountVO.getCityCode();
this.districtCode = bUserAccountVO.getDistrictCode();
}
public UserAccountVO buildUserAccountVO() {
return UserAccountVO.builder().id(this.id).uid(this.uid).accountType(this.accountType).phoneNum(this.phoneNum).userName(this.userName).nickName(this.nickName)
return UserAccountVO.builder().id(this.id).uid(this.uid).accountNo(this.accountNo).accountType(this.accountType).phoneNum(this.phoneNum).userName(this.userName).nickName(this.nickName)
.userImg(this.userImg).userSex(this.userSex).email(this.email).source(this.source).accountStatus(this.accountStatus).remark(this.remark).portType(this.portType)
.createTime(this.createTime).build();
.createTime(this.createTime).companyAuthStatus(this.companyAuthStatus).cooperationTagId(this.cooperationTagId).build();
}
public UserAccountSimpleDTO buildUserAccountSimpleDTO() {
return UserAccountSimpleDTO.builder().id(this.id).uid(this.uid).accountType(this.accountType).phoneNum(this.phoneNum).userName(this.userName).nickName(this.nickName)
return UserAccountSimpleDTO.builder().id(this.id).uid(this.uid).accountNo(this.accountNo).accountType(this.accountType).phoneNum(this.phoneNum).userName(this.userName).nickName(this.nickName)
.userImg(this.userImg).userSex(this.userSex).email(this.email).source(this.source).accountStatus(this.accountStatus).portType(this.portType)
.companyAuthStatus(this.companyAuthStatus == null || this.companyAuthStatus != 1 ? 0 : 1).cooperationTagId(this.cooperationTagId)
.build();
}
}
package com.mmc.iuav.user.entity;
import com.mmc.iuav.user.model.dto.UserSubInfoDTO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @author: zj
* @Date: 2023/5/24 15:08
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserSubInfoDO implements Serializable {
private static final long serialVersionUID = 8534660282946889549L;
private Integer id;
private String openId;
private String unionId;
private String nickName;
private Integer regStatus;
private Integer deleted;
private Date createTime;
private Date updateTime;
public UserSubInfoDTO buildUserSbuInfoDTO() {
return UserSubInfoDTO.builder().openId(openId).unionId(unionId).subscribe(this.deleted == 0 ? 1 : 0).build();
}
}
package com.mmc.iuav.user.entity;
import com.mmc.iuav.user.model.vo.UserTagVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @author: zj
* @Date: 2023/5/26 20:55
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserTagDO implements Serializable {
private static final long serialVersionUID = -5355286947297870886L;
private Integer id;
private Integer cooperationTagId;
private Integer userAccountId;
private Integer deleted;
private Date createTime;
private Date updateTime;
public UserTagDO(UserTagVO userTagVO) {
this.id = userTagVO.getId();
this.userAccountId = userTagVO.getUserAccountId();
this.cooperationTagId = userTagVO.getCooperationTagId();
}
public UserTagVO buildUserTagVO() {
return UserTagVO.builder().id(this.id).cooperationTagId(this.cooperationTagId).userAccountId(this.userAccountId).build();
}
}
package com.mmc.iuav.user.enums;
/**
* @author 作者 geDuo
* @version 创建时间:2021年9月7日 下午3:06:26
* @explain 类说明
*/
public enum UserAccountStatus {
NORMAL(1, "正常可用"), DISABLE(0, "禁用");
UserAccountStatus(int accountStatus, String statusName) {
this.accountStatus = accountStatus;
this.statusName = statusName;
}
private Integer accountStatus;
private String statusName;
public Integer getAccountStatus() {
return accountStatus;
}
public void setAccountStatus(Integer accountStatus) {
this.accountStatus = accountStatus;
}
public String getStatusName() {
return statusName;
}
public void setStatusName(String statusName) {
this.statusName = statusName;
}
}
package com.mmc.iuav.user.service;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.qo.LoginUserQO;
import com.mmc.iuav.user.model.vo.WxLoginVO;
/**
......@@ -14,4 +15,18 @@ public interface AuthService {
* @return
*/
ResultBody appletLogin(WxLoginVO wxLoginVO);
/**
* 后台用户登录
* @param param
* @return
*/
ResultBody backEndLogin(LoginUserQO param);
/**
* 小程序用户登录
* @param unionId
* @return
*/
ResultBody testAppletLogin(String unionId);
}
......@@ -20,4 +20,12 @@ public interface CooperationService {
* @return
*/
ResultBody apply(UserApplyTagVO cooperationTagVO);
/**
* 后台用户设置小程序用户等级标签
* @param userAccountId
* @param cooperationTagId
* @return
*/
ResultBody changeUserTag(Integer userAccountId, Integer cooperationTagId);
}
......@@ -3,6 +3,9 @@ package com.mmc.iuav.user.service;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.entity.UserAccountDO;
import com.mmc.iuav.user.model.dto.UserAccountSimpleDTO;
import com.mmc.iuav.user.model.qo.BUserAccountQO;
import com.mmc.iuav.user.model.qo.LoginUserQO;
import com.mmc.iuav.user.model.vo.BUserAccountVO;
import com.mmc.iuav.user.model.vo.UserAccountVO;
import java.util.List;
......@@ -54,4 +57,70 @@ public interface UserAccountService {
* @return
*/
List<Integer> feignListUserAccountIds(Integer provinceCode, Integer cityCode, Integer districtCode);
/**
* 添加后台用户
* @param bUserAccountVO
* @return
*/
ResultBody insertBAccount(BUserAccountVO bUserAccountVO);
/**
* 删除用户信
* @param userAccountId
* @return
*/
ResultBody removeBAccount(Integer userAccountId);
/**
* 后台用户列表
* @param bUserAccountQO
* @return
*/
ResultBody listBAccountPage(BUserAccountQO bUserAccountQO);
/**
* 登录账号密码查询用户信息
* @param accountNo
* @param passWord
* @return
*/
UserAccountDO getUserLoginInfo(String accountNo, String passWord);
/**
* 内部获取用户列表
* @param bUserAccountQO
* @return
*/
List<UserAccountSimpleDTO> feignListBAccountPage(BUserAccountQO bUserAccountQO);
/**
* 修改用户信息
* @param bUserAccountVO
* @return
*/
ResultBody updateBAccount(BUserAccountVO bUserAccountVO);
/**
* 修改用户密码
* @param account
* @return
*/
ResultBody updatePassword(BUserAccountVO account);
/**
* 验证用户密码
* @param id
* @param authPwd
* @return
*/
ResultBody feignAuthUserPwd(Integer id, String authPwd);
/**
* 授权手机号
* @param id
* @param code
* @return
*/
ResultBody getUserPhoneNumber(Integer id, String code);
}
package com.mmc.iuav.user.service;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.user.model.vo.AppletMsgVO;
import com.mmc.iuav.user.model.vo.WxLoginVO;
import com.mmc.iuav.user.model.vo.WxMsgVO;
import javax.servlet.http.HttpServletRequest;
/**
* @author: zj
......@@ -20,4 +25,58 @@ public interface WxService {
* @return
*/
String pcLogin(WxLoginVO wxLoginVO);
/**
* 获取AccessToken
* @return
*/
String getAccessToken();
/**
* 获取公众号AccessToken
* @return
*/
String getSubAccessToken();
/**
* 监控微信公众号的事件变化通知
* @param request
*/
String receiveSubAccountEvents(HttpServletRequest request);
/**
* 公众号推送模板消息-不需要用户同意
* @return
*/
ResultBody sendSubTemplateMsg(WxMsgVO ws);
/**
* 获取不限制的小程序码
* @param path
* @param scene
*/
ResultBody getUnLimitedQRCode(String path, String scene);
/**
* 小程序推送订阅号消息-需用户同意订阅
* @param appletMsgVO
*/
ResultBody sendAppletMsg(AppletMsgVO appletMsgVO);
/**
* 生成小程序链接
* @param path
* @param query
* @return
*/
String createUrlLink(String path, String query);
/**
* 获取用户授权手机号
*
* @param id
* @param code
* @return
*/
String getUserPhoneNumber(Integer id, String code);
}
......@@ -7,8 +7,12 @@ import com.mmc.iuav.auth.JwtUtil;
import com.mmc.iuav.general.CodeUtil;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.auth.PwdUtil;
import com.mmc.iuav.user.constant.WxConstant;
import com.mmc.iuav.user.entity.UserAccountDO;
import com.mmc.iuav.user.enums.UserAccountStatus;
import com.mmc.iuav.user.model.dto.LoginSuccessDTO;
import com.mmc.iuav.user.model.qo.LoginUserQO;
import com.mmc.iuav.user.model.vo.AppUserSucVO;
import com.mmc.iuav.user.model.vo.UserAccountVO;
import com.mmc.iuav.user.model.vo.WxLoginVO;
......@@ -16,11 +20,15 @@ import com.mmc.iuav.user.service.AuthService;
import com.mmc.iuav.user.service.UserAccountService;
import com.mmc.iuav.user.service.WxService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author: zj
......@@ -36,48 +44,56 @@ public class AuthServiceImpl implements AuthService {
@Autowired
private UserAccountService userAccountService;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public ResultBody appletLogin(WxLoginVO wxLoginVO) {
String unionId;
String openId;
String sessionKey;
if (wxLoginVO.getFromPort().toString().equals(WxConstant.APP.toString())) {
//调用小程序登录接口,里面包含unionId
String appWxJson = wxService.appLogin(wxLoginVO);
log.error("wx appLogin msg==>" + appWxJson);
if (appWxJson == null) {
if (StringUtils.isBlank(appWxJson)) {
return ResultBody.error(ResultEnum.APPLET_PORT_TYPE_ERROR);
}
log.info("wx appLogin msg==>" + JSONObject.toJSONString(appWxJson));
JSONObject json = JSON.parseObject(appWxJson);
if (!json.containsKey(WxConstant.OPEN_ID) || !json.containsKey(WxConstant.SESSION_KEY)) {
log.error("wx appLogin error==>" + json);
log.error("wx appLogin error==>" + JSONObject.toJSONString(json));
return ResultBody.error(ResultEnum.APPLET_LOGIN_ERROR, json);
}
unionId = json.getString(WxConstant.UNION_ID);
openId = json.getString(WxConstant.OPEN_ID);
sessionKey = json.getString(WxConstant.SESSION_KEY);
}else if (wxLoginVO.getFromPort().equals(WxConstant.WEB)){
//获取access_token接口,里面包含unionId
String pcWxJson = wxService.pcLogin(wxLoginVO);
log.error("wx pcLogin msg==>" + pcWxJson);
if (pcWxJson == null) {
if (StringUtils.isBlank(pcWxJson)) {
return ResultBody.error(ResultEnum.APPLET_PORT_TYPE_ERROR);
}
log.info("wx pcLogin msg==>" + JSONObject.toJSONString(pcWxJson));
JSONObject json = JSON.parseObject(pcWxJson);
if (!json.containsKey(WxConstant.OPEN_ID) ||!json.containsKey(WxConstant.SESSION_KEY)) {
log.error("wx pcLogin error==>" + json);
log.error("wx pcLogin error==>" + JSONObject.toJSONString(json));
return ResultBody.error(ResultEnum.APPLET_LOGIN_ERROR, json);
}
unionId = json.getString(WxConstant.UNION_ID);
openId = json.getString(WxConstant.OPEN_ID);
sessionKey = json.getString(WxConstant.SESSION_KEY);
}else {
return ResultBody.error(ResultEnum.PARAM_ERROR);
}
//数据库查询用户信息
UserAccountVO userAccountVO = userAccountService.getUserAccountInfoByUnionId(unionId);
String uid = userAccountVO.getUid();
if (userAccountVO == null) {
UserAccountDO userAccountDO = new UserAccountDO();
userAccountDO.setUnionId(unionId);
userAccountDO.setOpenId(openId);
userAccountDO.setUid(CodeUtil.generateUserUID());
uid = CodeUtil.generateUserUID();
userAccountDO.setUid(uid);
userAccountDO.setAccountType(0);
userAccountDO.setPortType(100);
userAccountDO.setSource(wxLoginVO.getSource());
......@@ -86,10 +102,73 @@ public class AuthServiceImpl implements AuthService {
}
Map<String, Object> map = new HashMap<String, Object>();
map.put(JwtConstant.USER_ACCOUNT_ID, userAccountVO.getId());
map.put(JwtConstant.ROLE_ID, 0);
//map.put(JwtConstant.ROLE_ID, 0);
map.put(JwtConstant.TOKEN_TYPE, JwtConstant.IUAV_TOKEN);
String token = JwtUtil.createJwt(map);
return ResultBody.success(AppUserSucVO.builder().token(token).userAccountId(userAccountVO.getId()).build());
LoginSuccessDTO loginSuccessDTO = LoginSuccessDTO.builder().token(token).userAccountId(userAccountVO.getId()).accountNo(userAccountVO.getAccountNo()).uid(uid)
.userName(userAccountVO.getUserName()).nickName(userAccountVO.getNickName()).phoneNum(userAccountVO.getPhoneNum()).build();
stringRedisTemplate.opsForValue().set(
token, JSONObject.toJSONString(loginSuccessDTO),
JwtConstant.EXPIRATION, TimeUnit.MILLISECONDS);
return ResultBody.success(AppUserSucVO.builder().token(token).uid(userAccountVO.getUid()).phoneNum(userAccountVO.getPhoneNum())
.nickName(userAccountVO.getNickName()).userAccountId(userAccountVO.getId()).sessionKey(sessionKey).build());
}
@Override
public ResultBody backEndLogin(LoginUserQO param) {
//查询用户信息
UserAccountDO user = userAccountService.getUserLoginInfo(param.getAccountNo(), param.getPassWord());
System.out.println("login user:---------------->" + user.toString() );
if (user == null) {
return ResultBody.error(ResultEnum.LOGIN_ACCOUNT_NOT_EXIT_ERROR);
}
if (user.getAccountStatus() .equals(UserAccountStatus.DISABLE.getAccountStatus()) ) {
return ResultBody.error(ResultEnum.LOGIN_ACCOUNT_STATUS_ERROR);
}
String loginPwd = "";
try {
loginPwd = PwdUtil.securityPwd(param.getPassWord());
} catch (NoSuchAlgorithmException e) {
return ResultBody.error(ResultEnum.PWD_CONPARED_ERROR);
}
if (!loginPwd.equals(user.getPassword())) {
return ResultBody.error(ResultEnum.LOGIN_PASSWORD_ERROR);
}
Map<String, Object> map = new HashMap<String, Object>();
map.put(JwtConstant.USER_ACCOUNT_ID, user.getId());
//map.put(JwtConstant.ROLE_ID, 0);
map.put(JwtConstant.TOKEN_TYPE, JwtConstant.M_TOKEN);
String token = JwtUtil.createJwt(map);
LoginSuccessDTO loginSuccessDTO = LoginSuccessDTO.builder().token(token).userAccountId(user.getId()).accountNo(user.getAccountNo()).uid(user.getUid())
.userName(user.getUserName()).nickName(user.getNickName()).phoneNum(user.getPhoneNum()).build();
stringRedisTemplate.opsForValue().set(
token, JSONObject.toJSONString(loginSuccessDTO),
JwtConstant.EXPIRATION, TimeUnit.MILLISECONDS);
return ResultBody.success(LoginSuccessDTO.builder().token(token).userAccountId(user.getId()).accountNo(user.getAccountNo()).build());
}
@Override
public ResultBody testAppletLogin(String unionId) {
UserAccountVO userAccountVO = userAccountService.getUserAccountInfoByUnionId(unionId);
if (userAccountVO != null) {
Map<String, Object> map = new HashMap<String, Object>();
map.put(JwtConstant.USER_ACCOUNT_ID, userAccountVO.getId());
map.put(JwtConstant.TOKEN_TYPE, JwtConstant.IUAV_TOKEN);
String token = JwtUtil.createJwt(map);
LoginSuccessDTO loginSuccessDTO = LoginSuccessDTO.builder().token(token).userAccountId(userAccountVO.getId()).accountNo(userAccountVO.getAccountNo()).uid(userAccountVO.getUid())
.userName(userAccountVO.getUserName()).nickName(userAccountVO.getNickName()).phoneNum(userAccountVO.getPhoneNum()).build();
stringRedisTemplate.opsForValue().set(
token, JSONObject.toJSONString(loginSuccessDTO),
JwtConstant.EXPIRATION, TimeUnit.MILLISECONDS);
return ResultBody.success(AppUserSucVO.builder().token(token).uid(userAccountVO.getUid()).phoneNum(userAccountVO.getPhoneNum())
.nickName(userAccountVO.getNickName()).userAccountId(userAccountVO.getId()).build());
}
return ResultBody.error(ResultEnum.APPLET_LOGIN_ERROR);
}
}
......@@ -7,6 +7,7 @@ import com.mmc.iuav.user.dao.CooperationDao;
import com.mmc.iuav.user.entity.CompanyAuthDO;
import com.mmc.iuav.user.entity.CooperationTagDO;
import com.mmc.iuav.user.entity.UserApplyTagDO;
import com.mmc.iuav.user.entity.UserTagDO;
import com.mmc.iuav.user.model.vo.CooperationTagVO;
import com.mmc.iuav.user.model.vo.UserApplyTagVO;
import com.mmc.iuav.user.service.CooperationService;
......@@ -60,4 +61,20 @@ public class CooperationServiceImpl implements CooperationService {
cooperationDao.addApply(userApplyTagDO);
return ResultBody.success();
}
@Override
public ResultBody changeUserTag(Integer userAccountId, Integer cooperationTagId) {
UserTagDO userTagDO = cooperationDao.getUserTag(userAccountId);
if (userTagDO == null){
//直接插入
userTagDO = new UserTagDO();
userTagDO.setUserAccountId(userAccountId);
userTagDO.setCooperationTagId(cooperationTagId);
cooperationDao.insertUserTag(userTagDO);
}
//修改渠道等级
userTagDO.setCooperationTagId(cooperationTagId);
cooperationDao.updateUserTag(userTagDO);
return ResultBody.success();
}
}
package com.mmc.iuav.user.service.impl;
import com.mmc.iuav.general.CodeUtil;
import com.mmc.iuav.page.PageResult;
import com.mmc.iuav.response.ResultBody;
import com.mmc.iuav.response.ResultEnum;
import com.mmc.iuav.user.auth.PwdUtil;
import com.mmc.iuav.user.dao.CooperationDao;
import com.mmc.iuav.user.dao.UserServiceDao;
import com.mmc.iuav.user.entity.UserAccountDO;
import com.mmc.iuav.user.entity.UserTagDO;
import com.mmc.iuav.user.model.dto.UserAccountSimpleDTO;
import com.mmc.iuav.user.model.qo.BUserAccountQO;
import com.mmc.iuav.user.model.vo.BUserAccountVO;
import com.mmc.iuav.user.model.vo.CompanyAuthVO;
import com.mmc.iuav.user.model.vo.UserAccountVO;
import com.mmc.iuav.user.service.CompanyAuthService;
import com.mmc.iuav.user.service.UserAccountService;
import com.mmc.iuav.user.service.WxService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author: zj
......@@ -26,6 +38,12 @@ public class UserAccountServiceImpl implements UserAccountService {
@Autowired
private CompanyAuthService companyAuthService;
@Autowired
private CooperationDao cooperationDao;
@Autowired
private WxService wxService;
@Override
public UserAccountVO getUserAccountInfoByUnionId(String unionId) {
UserAccountDO userAccountDO = userServiceDao.getUserAccountInfoByUnionId(unionId);
......@@ -43,7 +61,20 @@ public class UserAccountServiceImpl implements UserAccountService {
@Override
public UserAccountVO getUserAccountById(Integer userAccountId) {
UserAccountDO userAccountDO = userServiceDao.getUserAccountById(userAccountId);
if (userAccountDO == null) {
return null;
}
UserAccountVO userAccountVO = userAccountDO.buildUserAccountVO();
CompanyAuthVO companyAuthVO = companyAuthService.getCompanyAuthByUId(userAccountId);
if (companyAuthVO != null) {
userAccountVO.setCompanyAuthStatus(companyAuthVO.getAuthStatus());
}else {
userAccountVO.setCompanyAuthStatus(0);
}
UserTagDO userTag = cooperationDao.getUserTag(userAccountId);
if (userTag != null){
userAccountVO.setCooperationTagId(userTag.getCooperationTagId());
}
return userAccountVO;
}
......@@ -64,6 +95,10 @@ public class UserAccountServiceImpl implements UserAccountService {
}else {
userAccountSimpleDTO.setCompanyAuthStatus(0);
}
UserTagDO userTag = cooperationDao.getUserTag(userAccountId);
if (userTag != null){
userAccountSimpleDTO.setCooperationTagId(userTag.getCooperationTagId());
}
return userAccountSimpleDTO;
}
......@@ -72,4 +107,130 @@ public class UserAccountServiceImpl implements UserAccountService {
List<Integer> ids = userServiceDao.listUserAccountIdsByDistrictCode(provinceCode, cityCode, districtCode);
return ids;
}
@Override
public ResultBody insertBAccount(BUserAccountVO bUserAccountVO) {
if (!bUserAccountVO.getPassWord().equals(bUserAccountVO.getAlertPwd())) {
// 两次密码不一致
return ResultBody.error(ResultEnum.PWD_ALERT_ERROR);
}
// 获取新增的账户名是否已经存在
int count = userServiceDao.countUserAccountNo(null, bUserAccountVO.getAccountNo());
if (count > 0) {
return ResultBody.error(ResultEnum.ADD_USER_ACCOUNT_NAME_EXISTS);
}
UserAccountDO userAccountDO = new UserAccountDO(bUserAccountVO);
try {
userAccountDO.setPassword(PwdUtil.securityPwd(bUserAccountVO.getPassWord()));
} catch (NoSuchAlgorithmException e) {
return ResultBody.error(ResultEnum.PWD_CREATE_ERROR);
}
userAccountDO.setUid(CodeUtil.generateUserUID());
userAccountDO.setAccountType(0);
userAccountDO.setPortType(0);
userAccountDO.setOpenId(userAccountDO.getUid());
userAccountDO.setUnionId(userAccountDO.getUid());
userServiceDao.insertUserAccount(userAccountDO);
return ResultBody.success();
}
@Override
public ResultBody removeBAccount(Integer userAccountId) {
String removeNO = CodeUtil.removeUserAccount();
userServiceDao.removeUserAccount(removeNO, userAccountId);
return ResultBody.success();
}
@Override
public ResultBody listBAccountPage(BUserAccountQO param) {
int count = userServiceDao.countListBAccountPage(param);
if (count == 0) {
return ResultBody.success(PageResult.buildPage(param.getPageNo(), param.getPageSize(), count));
}
Integer pageNo = param.getPageNo();
param.buildCurrentPage();
List<UserAccountDO> users = userServiceDao.listBAccountPage(param);
List<UserAccountVO> collect = users.stream().map(UserAccountDO::buildUserAccountVO).collect(Collectors.toList());
return ResultBody.success(PageResult.buildPage(pageNo, param.getPageSize(), count, collect));
}
@Override
public UserAccountDO getUserLoginInfo(String accountNo, String passWord) {
UserAccountDO userAccountDO = userServiceDao.getUserLoginInfo(accountNo, passWord);
return userAccountDO;
}
@Override
public List<UserAccountSimpleDTO> feignListBAccountPage(BUserAccountQO bUserAccountQO) {
List<UserAccountDO> list = userServiceDao.feignListBAccountPage(bUserAccountQO);
if (list == null) {
return null;
}
List<UserAccountSimpleDTO> accountSimpleDTOS = list.stream().map(UserAccountDO::buildUserAccountSimpleDTO).collect(Collectors.toList());
return accountSimpleDTOS;
}
@Override
public ResultBody updateBAccount(BUserAccountVO bUserAccountVO) {
// 判断账号是否重复
if (!StringUtils.isEmpty(bUserAccountVO.getAccountNo())) {
// 如果传入的名字不为空,就查找数据库,看名字是否重复
int count = userServiceDao.countUserAccountNo(bUserAccountVO.getId(), bUserAccountVO.getAccountNo());
if (count > 0) {
return ResultBody.error(ResultEnum.UPDATE_USER_ACCOUNT_REPEAT);
}
}
UserAccountDO userAccountDO = new UserAccountDO(bUserAccountVO);
userServiceDao.update(userAccountDO);
return ResultBody.success();
}
@Override
public ResultBody updatePassword(BUserAccountVO account) {
if (!account.getPassWord().equals(account.getAlertPwd())) {
return ResultBody.error(ResultEnum.PASSWORD_INCONSISTENT);
}
try {
account.setPassWord(PwdUtil.securityPwd(account.getPassWord()));
userServiceDao.updatePassword(account.getId(), account.getPassWord());
} catch (NoSuchAlgorithmException e) {
return ResultBody.error(ResultEnum.PWD_CONPARED_ERROR);
}
// RoleInfoDO roleInfo = roleInfoDao.getRoleInfoByUser(account.getId());// 查询账号的角色信息
// this.disableOneToken(account.getId(), roleInfo.getId(), JwtConstant.SXTB_ACCOUNT_TOKEN);
return ResultBody.success();
}
@Override
public ResultBody feignAuthUserPwd(Integer id, String authPwd) {
UserAccountDO account = userServiceDao.getUserAuthPwdInfo(id);
if (account == null) {
return ResultBody.error(ResultEnum.LOGIN_ACCOUNT_NOT_EXIT_ERROR);
}
String pwd = "";
try {
pwd = PwdUtil.securityPwd(authPwd);
} catch (NoSuchAlgorithmException e) {
return ResultBody.error(ResultEnum.PWD_CREATE_ERROR);
}
if (!pwd.equals(account.getPassword())) {
return ResultBody.error(ResultEnum.PWD_CONPARED_ERROR);
}
return ResultBody.success();
}
@Override
public ResultBody getUserPhoneNumber(Integer id, String code) {
String userPhoneNumber = wxService.getUserPhoneNumber(id, code);
if (StringUtils.isBlank(userPhoneNumber)){
return ResultBody.error(ResultEnum.AUTH_PHONE_NUMBER_ERROR);
}
System.out.println("userPhoneNumber:"+userPhoneNumber);
UserAccountDO userAccount = new UserAccountDO();
userAccount.setId(id);
userAccount.setPhoneNum(userPhoneNumber);
userServiceDao.update(userAccount);
return ResultBody.success();
}
}
package com.mmc.iuav.user.util;
import org.springframework.util.AntPathMatcher;
/**
* @author 作者 geDuo
* @version 创建时间:2021年8月31日 下午3:29:28
* @explain 解析地址类
*/
public class PathUtil {
private static AntPathMatcher matcher = new AntPathMatcher();
public static boolean isPathMatch(String pattern, String path) {
return matcher.match(pattern, path);
}
}
package com.mmc.iuav.user.util;
/**
* @author 作者 geDuo
* @version 创建时间:2021年10月15日 下午6:43:11
* @explain 类说明
*/
import com.alibaba.fastjson2.JSONObject;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Map;
public class WxApiUtil {
// 与接口配置信息中的Token要一致
private static final String token = "MMCDingYueHaoToken2020";
public static boolean checkSignature(String signature, String timestrap, String nonce) {
String[] arr = new String[] { token, timestrap, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuffer buf = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
buf.append(arr[i]);
}
String temp = getSha1(buf.toString());
return temp.equals(signature);
}
public static String getSha1(String str) {
if (null == str || str.length() == 0) {
return null;
}
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char[] buf = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byTemp = md[i];
buf[k++] = hexDigits[byTemp >>> 4 & 0xf];
buf[k++] = hexDigits[byTemp & 0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
/**
* 截取模板长度
*/
public static JSONObject buildMsgJson(JSONObject jsonObject) {
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
if (entry.getKey().startsWith("thing") && entry.getValue() != null) {
String json = JSONObject.toJSONString(entry.getValue());
JSONObject obj = JSONObject.parseObject(json);
String str = obj.getString("value");
if (str.length() > 20) {
obj.put("value", str.substring(0, 17) + "...");
entry.setValue(obj);
}
}
if (entry.getKey().startsWith("phrase") && entry.getValue() != null) {
String json = JSONObject.toJSONString(entry.getValue());
JSONObject obj = JSONObject.parseObject(json);
String str = obj.getString("value");
if (str.length() > 5) {
obj.put("value", str.substring(0, 5));
entry.setValue(obj);
}
}
if (entry.getKey().startsWith("character_string") && entry.getValue() != null) {
String json = JSONObject.toJSONString(entry.getValue());
JSONObject obj = JSONObject.parseObject(json);
String str = obj.getString("value");
if (str.length() > 32) {
obj.put("value", str.substring(0, 29) + "...");
entry.setValue(obj);
}
}
}
return jsonObject;
}
}
server:
port: 35150
servlet:
context-path: /userapp
#spring
spring:
application:
name: userapp
#Database
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-wz9dd796t4j1giz6t2o.mysql.rds.aliyuncs.com:3306/iuav_cms?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
url: jdbc:mysql://mysql.default:3306/iuav_cms?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: tmj
password: MMC@2022&MYSQL
# Druid数据源配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 10 #初始化连接池大小
min-idle: 10 #最小大小
max-active: 50 #最大大小
max-wait: 60000 #获取连接时最大等待时间,单位毫秒
time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
testOnBorrow: false #获取连接时执行检测,建议关闭,影响性能
testOnReturn: false #归还连接时执行检测,建议关闭,影响性能
pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
filter:
wall:
config:
multi-statement-allow: true
db-type: mysql
enabled: true
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #打开慢sql记录和延迟时间
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
enabled: true
stat-view-servlet:
enabled: true
login-username: druid
login-password: druid
jackson:
date-format: yyyy-MM-dd HH:mm:ss
#mybatis
mybatis:
executor-type: simple
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.mmc.iuav.user.entity
configuration:
map-underscore-to-camel-case: true
# druid:
# initial-size: 10 #初始化连接池大小
# min-idle: 10 #最小大小
# max-active: 50 #最大大小
# max-wait: 60000 #获取连接时最大等待时间,单位毫秒
# time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
# min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
# validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
# test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
# testOnBorrow: false #获取连接时执行检测,建议关闭,影响性能
# testOnReturn: false #归还连接时执行检测,建议关闭,影响性能
# pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
# filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
# filter:
# wall:
# config:
# multi-statement-allow: true
# db-type: mysql
# enabled: true
# connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #打开慢sql记录和延迟时间
# web-stat-filter:
# url-pattern: /*
# exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# enabled: true
# stat-view-servlet:
# enabled: true
# login-username: druid
# login-password: druid
redis:
database: 1
host: redis.default
password: MMC@2022&REDIS
port: 6379
wx:
sub:
......
#spring
spring:
#Database
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-wz9dd796t4j1giz6t2o.mysql.rds.aliyuncs.com:3306/iuav_cms?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: tmj
password: MMC@2022&MYSQL
# Druid数据源配置
type: com.alibaba.druid.pool.DruidDataSource
redis:
database: 1
host: r-wz9ke310fs684hacn1pd.redis.rds.aliyuncs.com
password: MMC@2022&REDIS
port: 6379
wx:
sub:
appid: wx5c6a105a0ddca4c5
secret: 96c75255dd26f82f8d55e15b59e101c7
app:
id: wx18b7883acd204278
secret: 28afe74ba373830237a8133a7431ee82
miniprogram-state: trial
env-version: trial
token-path: /userservlet/wechat/getAppletUserAccessToken
port: user
third-party:
ali:
app-code: 524b1864a88f47458c1061bae3811570
qcc:
app-key: 5015e664848d406ab1ca4b505c3da803
secret-key: 7C4DB8CCECC148175E46392CC0A1B410
\ No newline at end of file
#spring
spring:
#Database
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql.default:3306/iuav_cms?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: tmj
password: MMC@2022&MYSQL
# Druid数据源配置
type: com.alibaba.druid.pool.DruidDataSource
# druid:
# initial-size: 10 #初始化连接池大小
# min-idle: 10 #最小大小
# max-active: 50 #最大大小
# max-wait: 60000 #获取连接时最大等待时间,单位毫秒
# time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
# min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
# validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
# test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
# testOnBorrow: false #获取连接时执行检测,建议关闭,影响性能
# testOnReturn: false #归还连接时执行检测,建议关闭,影响性能
# pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
# filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
# filter:
# wall:
# config:
# multi-statement-allow: true
# db-type: mysql
# enabled: true
# connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #打开慢sql记录和延迟时间
# web-stat-filter:
# url-pattern: /*
# exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# enabled: true
# stat-view-servlet:
# enabled: true
# login-username: druid
# login-password: druid
redis:
database: 1
host: redis.default
password: MMC@2022&REDIS
port: 6379
wx:
sub:
appid: wx5c6a105a0ddca4c5
secret: 96c75255dd26f82f8d55e15b59e101c7
app:
id: wx18b7883acd204278
secret: 28afe74ba373830237a8133a7431ee82
miniprogram-state: formal
env-version: formal
token-path: /userservlet/wechat/getAppletUserAccessToken
port: user
third-party:
ali:
app-code: 524b1864a88f47458c1061bae3811570
qcc:
app-key: 5015e664848d406ab1ca4b505c3da803
secret-key: 7C4DB8CCECC148175E46392CC0A1B410
\ No newline at end of file
server:
port: 35150
servlet:
context-path: /userapp
#spring
spring:
application:
name: userapp
#Database
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://rm-wz9dd796t4j1giz6t.mysql.rds.aliyuncs.com:3306/iuav_cms?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: tmj
password: MMC@2022&MYSQL
# Druid数据源配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 10 #初始化连接池大小
min-idle: 10 #最小大小
max-active: 50 #最大大小
max-wait: 60000 #获取连接时最大等待时间,单位毫秒
time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
test-while-idle: true #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
testOnBorrow: false #获取连接时执行检测,建议关闭,影响性能
testOnReturn: false #归还连接时执行检测,建议关闭,影响性能
pool-prepared-statements: false #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
filters: stat,wall #配置扩展插件,常用的插件有=>stat:监控统计 log4j:日志 wall:防御sql注入
filter:
wall:
config:
multi-statement-allow: true
db-type: mysql
enabled: true
connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 #打开慢sql记录和延迟时间
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
enabled: true
stat-view-servlet:
enabled: true
login-username: druid
login-password: druid
jackson:
date-format: yyyy-MM-dd HH:mm:ss
#mybatis
mybatis:
executor-type: simple
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.mmc.iuav.user
configuration:
map-underscore-to-camel-case: true
wx:
sub:
appid: wx5c6a105a0ddca4c5
secret: 96c75255dd26f82f8d55e15b59e101c7
app:
id: wx18b7883acd204278
secret: 28afe74ba373830237a8133a7431ee82
miniprogram-state: trial
env-version: trial
token-path: /userservlet/wechat/getAppletUserAccessToken
port: user
third-party:
ali:
app-code: 524b1864a88f47458c1061bae3811570
qcc:
app-key: 5015e664848d406ab1ca4b505c3da803
secret-key: 7C4DB8CCECC148175E46392CC0A1B410
\ No newline at end of file
server:
port: 35150
servlet:
context-path: /userapp
spring:
profiles:
active: dev
active: local
application:
name: userapp
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
#mybatis
mybatis:
executor-type: simple
mapper-locations: classpath:mapper/**/*.xml
type-aliases-package: com.mmc.iuav.user
configuration:
map-underscore-to-camel-case: true
---
spring:
......@@ -10,7 +26,7 @@ spring:
---
spring:
profiles: beta
profiles: local
---
......
......@@ -9,6 +9,11 @@
values(#{cooperationTagId}, #{userAccountId}, #{applyName}, #{applyPhone}, #{remark}, NOW())
</insert>
<insert id="insertUserTag" useGeneratedKeys="true" parameterType="com.mmc.iuav.user.entity.UserTagDO" keyProperty="id">
insert into user_tag(user_account_id, cooperation_tag_id, create_time)
values(#{userAccountId}, #{cooperationTagId}, NOW());
</insert>
<update id="updateUserApplyTag" parameterType="com.mmc.iuav.user.entity.UserApplyTagDO">
UPDATE user_apply_tag
<set>
......@@ -34,6 +39,10 @@
WHERE id = #{id};
</update>
<update id="updateUserTag">
update user_tag set cooperation_tag_id = #{cooperationTagId} where id = #{id}
</update>
<select id="listTags" resultType="com.mmc.iuav.user.entity.CooperationTagDO">
select id, tag_name, tag_img, tag_description, create_time from cooperation_tag
</select>
......@@ -43,4 +52,10 @@
from user_apply_tag
where user_account_id = #{userAccountId} and is_deleted = 0
</select>
<select id="getUserTag" resultType="com.mmc.iuav.user.entity.UserTagDO">
select id, user_account_id, cooperation_tag_id,is_deleted as deleted, create_time, update_time
from user_tag
where user_account_id = #{userAccountId} and is_deleted = 0
</select>
</mapper>
\ No newline at end of file
......@@ -27,13 +27,16 @@
<insert id="insertUserAccount" parameterType="com.mmc.iuav.user.entity.UserAccountDO"
useGeneratedKeys="true" keyProperty="id">
insert into user_account(account_type, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, remark, port_type, create_time)
values(#{accountType}, #{uid}, #{phoneNum}, #{userName}, #{nickName}, #{userImg}, #{openId}, #{unionId}, #{userSex}, #{email}, #{source}, #{remark}, #{portType}, NOW())
insert into user_account(account_type, uid, account_no, pass_word, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source,province_code, city_code, district_code, remark, port_type, create_time)
values(#{accountType}, #{uid}, #{accountNo}, #{password}, #{phoneNum}, #{userName}, #{nickName}, #{userImg}, #{openId}, #{unionId}, #{userSex}, #{email}, #{source}, #{provinceCode}, #{cityCode}, #{districtCode}, #{remark}, #{portType}, NOW())
</insert>
<update id="update" parameterType="com.mmc.iuav.user.entity.UserAccountDO">
update user_account
<set>
<if test="accountNo != null">
account_no = #{accountNo},
</if>
<if test="phoneNum != null">
phone_num = #{phoneNum},
</if>
......@@ -55,6 +58,15 @@
<if test="accountStatus != null">
account_status = #{accountStatus},
</if>
<if test="provinceCode != null">
province_code = #{provinceCode},
</if>
<if test="cityCode != null">
city_code = #{cityCode},
</if>
<if test="districtCode != null">
district_code = #{districtCode},
</if>
<if test="remark != null">
remark = #{remark},
</if>
......@@ -67,6 +79,16 @@
</where>
</update>
<update id="removeUserAccount">
update user_account set is_deleted = 1, union_id = #{removeNO} where id = #{userAccountId}
</update>
<update id="updatePassword">
update user_account
set pass_word=#{passWord}
where id = #{id}
</update>
<select id="getUserAccountInfoByUnionId" resultType="com.mmc.iuav.user.entity.UserAccountDO">
select id, account_type, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted, create_time, update_time
......@@ -94,4 +116,101 @@
and district_code = #{districtCode}
</if>
</select>
<select id="getUserLoginInfo" resultType="com.mmc.iuav.user.entity.UserAccountDO">
select ua.id,
ua.uid,
ua.account_no,
ua.phone_num,
ua.pass_word,
ua.account_status,
ua.account_type,
ua.user_name
from user_account ua
where ua.is_deleted = 0
and BINARY ua.account_no = #{accountNo}
</select>
<select id="feignListBAccountPage" resultType="com.mmc.iuav.user.entity.UserAccountDO" parameterType="com.mmc.iuav.user.model.qo.BUserAccountQO">
select ua.id, ua.account_type, ua.account_no, ua.uid, ua.phone_num, ua.user_name, ua.nick_name, ua.user_img, ua.open_id, ua.union_id, ua.user_sex, ua.email, ua.source, ua.account_status, ua.remark,
ua.port_type, ua.is_deleted as deleted, ua.create_time, ua.update_time, ut.cooperation_tag_id, ca.auth_status as companyAuthStatus
from user_account ua left join user_tag ut on ua.id = ut.user_account_id left join company_auth ca on ua.id = ca.user_account_id
where ua.is_deleted = 0
<if test=" userIds != null ">
<foreach collection="userIds" item="id" open="and ua.id in (" close=")" separator=",">
#{id}
</foreach>
</if>
<if test="provinceCode != null">
and ua.province_code = #{provinceCode}
</if>
<if test="cityCode != null">
and ua.city_code = #{cityCode}
</if>
<if test="districtCode != null">
and ua.district_code = #{districtCode}
</if>
</select>
<select id="countUserAccountNo" resultType="java.lang.Integer">
select count(*) from user_account
where account_no = #{accountNo} and is_deleted = 0 and port_type = 0
<if test="excludeId != null">
and id != #{excludeId}
</if>
</select>
<select id="countListBAccountPage" resultType="java.lang.Integer" parameterType="com.mmc.iuav.user.model.qo.BUserAccountQO">
select count(*) from user_account
where is_deleted = 0 and port_type = 0
<if test=" keyword != null and keyword != '' ">
and ( account_no like CONCAT("%",#{keyword},"%") or
user_name like CONCAT("%",#{keyword},"%") )
</if>
<if test="provinceCode != null">
and province_code = #{provinceCode}
</if>
<if test="cityCode != null">
and city_code = #{cityCode}
</if>
<if test="districtCode != null">
and district_code = #{districtCode}
</if>
<if test="accountStatus != null">
and account_status = #{accountStatus}
</if>
</select>
<select id="listBAccountPage" resultType="com.mmc.iuav.user.entity.UserAccountDO" parameterType="com.mmc.iuav.user.model.qo.BUserAccountQO">
select id, account_type, account_no, uid, phone_num, user_name, nick_name, user_img, open_id, union_id, user_sex, email, source, account_status, remark,
port_type, is_deleted as deleted, create_time, update_time
from user_account
where is_deleted = 0 and port_type = 0
<if test=" keyword != null and keyword != '' ">
and ( account_no like CONCAT("%",#{keyword},"%") or
user_name like CONCAT("%",#{keyword},"%") )
</if>
<if test="provinceCode != null">
and province_code = #{provinceCode}
</if>
<if test="cityCode != null">
and city_code = #{cityCode}
</if>
<if test="districtCode != null">
and district_code = #{districtCode}
</if>
<if test="accountStatus != null">
and account_status = #{accountStatus}
</if>
</select>
<select id="getUserAuthPwdInfo" resultType="com.mmc.iuav.user.entity.UserAccountDO">
select id,
account_no,
pass_word
from user_account
where is_deleted = 0
and id =
#{id}
</select>
</mapper>
\ No newline at end of file
<?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.mmc.iuav.user.dao.UserSubInfoDao">
<resultMap id="userSubInfoResultMap" type="com.mmc.iuav.user.entity.UserSubInfoDO">
<id property="id" column="id" />
<result property="openId" column="open_id" />
<result property="unionId" column="union_id" />
<result property="nickName" column="nick_name" />
<result property="regStatus" column="reg_status" />
<result property="deleted" column="is_deleted" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
</resultMap>
<select id="getUserSubInfo" resultMap="userSubInfoResultMap" parameterType="String">
select u.id,u.open_id,u.union_id,u.nick_name,u.reg_status,
u.is_deleted,u.create_time,u.update_time
from user_sub_info u
where u.open_id = #{openId}
</select>
<select id="getUserSubInfoById" resultMap="userSubInfoResultMap" parameterType="Integer">
select usi.id,usi.open_id,usi.union_id,usi.nick_name,usi.is_deleted
from user_account ua
inner join user_sub_info usi on usi.union_id=ua.union_id
where usi.is_deleted=0 and ua.is_deleted=0
and ua.user_account_id = #{userAccountId}
</select>
<select id="getUserSubInfoByUnionId" resultMap="userSubInfoResultMap" parameterType="String">
select usi.id,usi.open_id,usi.union_id,usi.nick_name,usi.is_deleted
from user_sub_info usi
where usi.union_id = #{unionId} and usi.is_deleted=0
</select>
<select id="countUserSubInfo" resultType="Integer" parameterType="String">
select count(*)
from user_sub_info u
where u.open_id = #{openId} and is_deleted = 0
</select>
<insert id="insertUserSubInfo" useGeneratedKeys="true"
keyProperty="id" parameterType="com.mmc.iuav.user.entity.UserSubInfoDO">
insert into user_sub_info
(
open_id,union_id,nick_name,reg_status,is_deleted,create_time,update_time
)
values
(
#{openId},#{unionId},#{nickName},#{regStatus},#{deleted},#{createTime},#{updateTime}
)
</insert>
<update id="removeUserSubInfo" parameterType="String">
update user_sub_info
set is_deleted = 1
where open_id = #{openId}
</update>
<update id="updateUserSubInfo"
parameterType="com.mmc.iuav.user.entity.UserSubInfoDO">
update user_sub_info
<set>
<if test="unionId != null and unionId != '' ">
union_id = #{unionId},
</if>
<if test="nickName != null">
nick_name = #{nickName},
</if>
<if test="regStatus != null">
reg_status = #{regStatus},
</if>
</set>
where open_id = #{openId}
</update>
</mapper>
\ No newline at end of file
data-filter:
uploadPath: #不需要解析的body参数的地址
- /xxx/x
not-auth-path:
- /userapp/v2/**
- /userapp/doc.html
- /userapp/swagger-resources/**
- /userapp/webjars/**
- /userapp/auth/testAppletLogin
- /userapp/auth/backEndLogin
- /userapp/auth/testAppletLogin
- /userapp/cooperation/listTag
# application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: cms-application
namespace: argocd
spec:
project: default # 项目名
source:
repoURL: http://git.mmcuav.cn/iuav/cms.git
targetRevision: HEAD #develop master # 分支名
path: kustomization/overlays/dev # 资源文件路径
destination:
server: https://kubernetes.default.svc # API Server 地址
namespace: dev # 部署应用的命名空间
# 默认情况下每 3 分钟会检测 Git 仓库一次
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
selfHeal: true
prune: true
......@@ -17,4 +17,4 @@ patches:
images:
- name: REGISTRY/NAMESPACE/IMAGE:TAG
newName: mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/cms
newTag: 85d0adbe8cda52581b8cbb2fb430a91820dff33a
newTag: 13be77b9442adcdd8179b15401887443f494edca
......@@ -3,4 +3,4 @@ kind: ConfigMap
metadata:
name: cms-map
data:
SPRING_PROFILES_ACTIVE: dev
\ No newline at end of file
SPRING_PROFILES_ACTIVE: prod
\ No newline at end of file
apiVersion: apps/v1
kind: Deployment
metadata:
name: cms-deployment
spec:
replicas: 1
# template:
# spec:
# nodeName: master
# nodeSelector:
# on-master: "true"
# affinity:
# podAntiAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# - labelSelector:
# matchExpressions:
# - key: nodeName
# operator: Eq
# values:
# - master
......@@ -17,4 +17,4 @@ patches:
images:
- name: REGISTRY/NAMESPACE/IMAGE:TAG
newName: mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly/cms
newTag: eb2992a6c0a32c5c4dd7d66b494543d8ef6ded12
newTag: ebb48a7ba127ab0f86962957ea75d69cad41e870
......@@ -98,6 +98,11 @@
<version>5.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<!-- 标识 SpringCloud 的版本 -->
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论