From dee5eb0518ed48dda39a294d4d1f1077584b0485 Mon Sep 17 00:00:00 2001 From: ChenYan <3139166962@qq.com> Date: Mon, 30 Dec 2024 14:47:34 +0800 Subject: [PATCH 1/9] =?UTF-8?q?build:=20=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcwl-common/pom.xml | 6 +- .../com/mcwl/common/config/QiNiuConfig.java | 41 ++++++++++++++ .../com/mcwl/common/interfaces/MaxMoney.java | 56 +++++++++++++++++++ .../com/mcwl/common/interfaces/MinMoney.java | 54 ++++++++++++++++++ .../mcwl/common/interfaces/ValidPhone.java | 34 +++++++++++ .../com/mcwl/common/utils/OrderCodeUtil.java | 45 +++++++++++++++ .../java/com/mcwl/common/utils/QiNiuUtil.java | 50 +++++++++++++++++ .../valid/MaxMoneyConstraintValidator.java | 29 ++++++++++ .../valid/MinMoneyConstraintValidator.java | 30 ++++++++++ .../com/mcwl/common/valid/PhoneValidator.java | 28 ++++++++++ 10 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 mcwl-common/src/main/java/com/mcwl/common/config/QiNiuConfig.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/interfaces/MaxMoney.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/interfaces/MinMoney.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/interfaces/ValidPhone.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/utils/OrderCodeUtil.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/utils/QiNiuUtil.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/valid/MaxMoneyConstraintValidator.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/valid/MinMoneyConstraintValidator.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/valid/PhoneValidator.java diff --git a/mcwl-common/pom.xml b/mcwl-common/pom.xml index e7b8731..b63b0df 100644 --- a/mcwl-common/pom.xml +++ b/mcwl-common/pom.xml @@ -63,7 +63,11 @@ org.apache.commons commons-lang3 - + + com.qiniu + qiniu-java-sdk + 7.4.0 + com.fasterxml.jackson.core diff --git a/mcwl-common/src/main/java/com/mcwl/common/config/QiNiuConfig.java b/mcwl-common/src/main/java/com/mcwl/common/config/QiNiuConfig.java new file mode 100644 index 0000000..8ebed53 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/config/QiNiuConfig.java @@ -0,0 +1,41 @@ +package com.mcwl.common.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 七牛云配置 + * + * @date 2024/5/5 下午5:01 + */ +@Component +@ConfigurationProperties(prefix = "oss.qiniu") +@Data +public class QiNiuConfig { + + /** + * AccessKey + */ + private String accessKey; + /** + * SecretKey + */ + private String secretKey; + /** + * 图片存储空间名 + */ + private String bucketPictureName; + /** + * 图片外链 + */ + private String domainPicture; + /** + * 文件存储空间名 + */ + private String bucketFileName; + /** + * 文件外链 + */ + private String domainFile; +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/interfaces/MaxMoney.java b/mcwl-common/src/main/java/com/mcwl/common/interfaces/MaxMoney.java new file mode 100644 index 0000000..48f7b8d --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/interfaces/MaxMoney.java @@ -0,0 +1,56 @@ + +package com.mcwl.common.interfaces; +/** + * @author 苏三,该项目是知识星球:java突击队 的内部项目 + * @date 2024/6/11 下午4:12 + */ + + + +import com.mcwl.common.valid.MaxMoneyConstraintValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 最大值约束. + * + * @author 苏三,该项目是知识星球:java突击队 的内部项目 + * @date 2024/6/11 下午4:13 + */ +@Target({ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = MaxMoneyConstraintValidator.class) +public @interface MaxMoney { + /** + * message. + * + * @return + */ + String message() default "{minMoney.message.error}"; + + /** + * max value. + * + * @return + */ + double value() default 0; + + /** + * group. + * + * @return + */ + Class[] groups() default {}; + + /** + * payload. + * + * @return + */ + Class[] payload() default {}; +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/interfaces/MinMoney.java b/mcwl-common/src/main/java/com/mcwl/common/interfaces/MinMoney.java new file mode 100644 index 0000000..56fd4d2 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/interfaces/MinMoney.java @@ -0,0 +1,54 @@ +package com.mcwl.common.interfaces; + +/** + * @date 2024/6/11 下午4:12 + */ + + +import com.mcwl.common.valid.MinMoneyConstraintValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 最小值约束. + * + + * @date 2024/6/11 下午4:13 + */ +@Target({ElementType.METHOD, ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = MinMoneyConstraintValidator.class) +public @interface MinMoney { + /** + * message. + * + * @return + */ + String message() default "{minMoney.message.error}"; + + /** + * min value. + * + * @return + */ + double value() default 0; + + /** + * group. + * + * @return + */ + Class[] groups() default {}; + + /** + * payload. + * + * @return + */ + Class[] payload() default {}; +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/interfaces/ValidPhone.java b/mcwl-common/src/main/java/com/mcwl/common/interfaces/ValidPhone.java new file mode 100644 index 0000000..4afe68e --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/interfaces/ValidPhone.java @@ -0,0 +1,34 @@ +package com.mcwl.common.interfaces; + +import com.mcwl.common.valid.PhoneValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +/** + * @author 苏三 + * @date 2024/9/24 下午3:09 + */ +@Documented +@Constraint(validatedBy = {PhoneValidator.class}) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ValidPhone { + /** + * 返回信息 + */ + String message() default "手机号码格式不正确"; + + /** + * 分组 + * @return + */ + Class[] groups() default {}; + + Class[] payload() default {}; +} + + + + diff --git a/mcwl-common/src/main/java/com/mcwl/common/utils/OrderCodeUtil.java b/mcwl-common/src/main/java/com/mcwl/common/utils/OrderCodeUtil.java new file mode 100644 index 0000000..89586aa --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/utils/OrderCodeUtil.java @@ -0,0 +1,45 @@ +package com.mcwl.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * 订单编号生成工具 + * + * @date 2024/5/30 下午6:02 + */ +public class OrderCodeUtil { + + public static final int ORDER_CODE_LENGTH = 24; + private static final String ORDER_CODE_DATA_FORMAT = "yyyyMMddHHmmss"; + private static final int ORDER_CODE_RANDOM_NUMBER = 10; + private static final int ORDER_CODE_RANDOM_LENGTH = 6; + + + /** + * 生成订单编号 + * + * @return 订单编号 + */ + public static String generateOrderCode() { + SimpleDateFormat dateFormat = new SimpleDateFormat(ORDER_CODE_DATA_FORMAT); + String random = getRandom(ORDER_CODE_RANDOM_LENGTH); + Date date = new Date(); + String time = dateFormat.format(date); + String code = "XS" + time + random; + while (code.length() < ORDER_CODE_LENGTH) { + code = code + 0; + } + return code; + } + + private static String getRandom(int len) { + Random r = new Random(); + StringBuilder rs = new StringBuilder(); + for (int i = 0; i < len; i++) { + rs.append(r.nextInt(ORDER_CODE_RANDOM_NUMBER)); + } + return rs.toString(); + } +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/utils/QiNiuUtil.java b/mcwl-common/src/main/java/com/mcwl/common/utils/QiNiuUtil.java new file mode 100644 index 0000000..f98571b --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/utils/QiNiuUtil.java @@ -0,0 +1,50 @@ +package com.mcwl.common.utils; + +import com.qiniu.http.Response; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.storage.model.DefaultPutRet; +import com.qiniu.util.Auth; +import com.google.gson.Gson; +import com.mcwl.common.config.QiNiuConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.InputStream; + + +/** + * 七牛云上传工具 + * + * @date 2024/5/5 下午5:02 + */ +@Component +public class QiNiuUtil { + public static final String IMAGE = "image"; + public static final String FILE = "file"; + + @Autowired + private QiNiuConfig qiNiuConfig; + + /** + * 将图片上传到七牛云 + */ + public String upload(InputStream file, String fileType, String fileContextType) throws Exception { + Configuration cfg = new Configuration(Region.region2()); + UploadManager uploadManager = new UploadManager(cfg); + Auth auth = Auth.create(qiNiuConfig.getAccessKey(), qiNiuConfig.getSecretKey()); + String upToken = null; + String path = null; + if (fileType.equals(IMAGE)) { + upToken = auth.uploadToken(qiNiuConfig.getBucketPictureName()); + path = qiNiuConfig.getDomainFile(); + } else if (fileType.equals(FILE)) { + upToken = auth.uploadToken(qiNiuConfig.getBucketFileName()); + path = qiNiuConfig.getDomainFile(); + } + Response response = uploadManager.put(file, null, upToken, null, fileContextType); + DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); + return path + putRet.key; + } +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/valid/MaxMoneyConstraintValidator.java b/mcwl-common/src/main/java/com/mcwl/common/valid/MaxMoneyConstraintValidator.java new file mode 100644 index 0000000..4ba54c5 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/valid/MaxMoneyConstraintValidator.java @@ -0,0 +1,29 @@ +package com.mcwl.common.valid; + + + +import com.mcwl.common.interfaces.MaxMoney; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.math.BigDecimal; + +/** + * 最大金额校验 + * @date 2024/6/11 下午4:13 + */ +public class MaxMoneyConstraintValidator implements ConstraintValidator { + + private MaxMoney constraint; + + @Override + public void initialize(MaxMoney constraint) { + this.constraint = constraint; + } + + @Override + public boolean isValid(BigDecimal value, ConstraintValidatorContext context) { + return value != null && value.doubleValue() < constraint.value(); + } + +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/valid/MinMoneyConstraintValidator.java b/mcwl-common/src/main/java/com/mcwl/common/valid/MinMoneyConstraintValidator.java new file mode 100644 index 0000000..7f8d90b --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/valid/MinMoneyConstraintValidator.java @@ -0,0 +1,30 @@ +package com.mcwl.common.valid; + + + +import com.mcwl.common.interfaces.MinMoney; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.math.BigDecimal; + +/** + * 最小金额校验 + * + * @date 2024/6/11 下午4:13 + */ +public class MinMoneyConstraintValidator implements ConstraintValidator { + + private MinMoney constraint; + + @Override + public void initialize(MinMoney constraint) { + this.constraint = constraint; + } + + @Override + public boolean isValid(BigDecimal value, ConstraintValidatorContext context) { + return value != null && value.doubleValue() >= constraint.value(); + } + +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/valid/PhoneValidator.java b/mcwl-common/src/main/java/com/mcwl/common/valid/PhoneValidator.java new file mode 100644 index 0000000..d0a9a9f --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/valid/PhoneValidator.java @@ -0,0 +1,28 @@ +package com.mcwl.common.valid; + + + +import com.mcwl.common.interfaces.ValidPhone; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Pattern; + +/** + * 手机号校验 + * + * @author 苏三 + * @date 2024/9/24 下午3:12 + */ +public class PhoneValidator implements ConstraintValidator { + private static final String PHONE_REGEX = "^1([38][0-9]|4[5-9]|5[0-3,5-9]|6[6]|7[0-8]|9[89])[0-9]{8}$"; + private final Pattern pattern = Pattern.compile(PHONE_REGEX); + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + return pattern.matcher(value).matches(); + } +} From 8e330577eefe515fe7287a3f7564729118c84fcb Mon Sep 17 00:00:00 2001 From: ChenYan <3139166962@qq.com> Date: Mon, 30 Dec 2024 14:51:23 +0800 Subject: [PATCH 2/9] build: --- mcwl-resource/pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/mcwl-resource/pom.xml b/mcwl-resource/pom.xml index a17ec97..24b7da7 100644 --- a/mcwl-resource/pom.xml +++ b/mcwl-resource/pom.xml @@ -8,9 +8,7 @@ mcwl 3.8.8 - mcwl-resource - resource资源中心模块 From c846cbcf50cad4ce264d85fd9e1eb37db5368427 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Mon, 30 Dec 2024 15:00:42 +0800 Subject: [PATCH 3/9] =?UTF-8?q?feat:=E6=88=91=E7=9A=84=E9=82=80=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcwl-admin/pom.xml | 19 ++- .../myInvitation/ConsumeController.java | 12 ++ .../myInvitation/InvitationController.java | 49 ++++++++ .../mcwl/common/constant/JwtConstants.java | 39 ++++++ .../java/com/mcwl/common/utils/JwtUtils.java | 114 ++++++++++++++++++ mcwl-myInvitation/pom.xml | 42 +++++++ .../mcwl/myInvitation/domain/Commission.java | 41 +++++++ .../com/mcwl/myInvitation/domain/Consume.java | 39 ++++++ .../mcwl/myInvitation/domain/Invitation.java | 39 ++++++ .../myInvitation/mapper/CommissionMapper.java | 13 ++ .../myInvitation/mapper/ConsumeMapper.java | 11 ++ .../myInvitation/mapper/InvitationMapper.java | 11 ++ .../service/CommissionService.java | 8 ++ .../myInvitation/service/ConsumeService.java | 8 ++ .../service/InvitationService.java | 14 +++ .../service/impl/CommissionServiceImpl.java | 16 +++ .../service/impl/ConsumeServiceImpl.java | 15 +++ .../service/impl/InvitationServiceImpl.java | 28 +++++ .../mapper/myInvitation/CommissionMapper.xml | 9 ++ .../mapper/myInvitation/ConsumeMapper.xml | 9 ++ .../mapper/myInvitation/InvitationMapper.xml | 9 ++ pom.xml | 1 + 22 files changed, 540 insertions(+), 6 deletions(-) create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/constant/JwtConstants.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/utils/JwtUtils.java create mode 100644 mcwl-myInvitation/pom.xml create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/CommissionMapper.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/ConsumeMapper.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/InvitationMapper.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/CommissionService.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/ConsumeService.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/InvitationService.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/CommissionServiceImpl.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/ConsumeServiceImpl.java create mode 100644 mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java create mode 100644 mcwl-myInvitation/src/main/resources/mapper/myInvitation/CommissionMapper.xml create mode 100644 mcwl-myInvitation/src/main/resources/mapper/myInvitation/ConsumeMapper.xml create mode 100644 mcwl-myInvitation/src/main/resources/mapper/myInvitation/InvitationMapper.xml diff --git a/mcwl-admin/pom.xml b/mcwl-admin/pom.xml index 34d1874..85736cc 100644 --- a/mcwl-admin/pom.xml +++ b/mcwl-admin/pom.xml @@ -55,6 +55,13 @@ mcwl-quartz + + + com.mcwl + mcwl-myInvitation + 3.8.8 + + com.mcwl @@ -80,15 +87,15 @@ - - org.apache.maven.plugins - maven-war-plugin - 3.1.0 + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 false ${project.artifactId} - - + + ${project.artifactId} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java new file mode 100644 index 0000000..ad4868f --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java @@ -0,0 +1,12 @@ +package com.mcwl.web.controller.myInvitation; + + +import org.springframework.web.bind.annotation.RestController; + +@RestController("/consume") +public class ConsumeController { + + + + +} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java new file mode 100644 index 0000000..94e3dd1 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java @@ -0,0 +1,49 @@ +package com.mcwl.web.controller.myInvitation; + + +import com.mcwl.common.annotation.Anonymous; +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.myInvitation.domain.Invitation; +import com.mcwl.myInvitation.service.InvitationService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +import static com.mcwl.common.core.domain.AjaxResult.success; + +@RestController("/invitation") +@RequiredArgsConstructor + +public class InvitationController { + + private final InvitationService invitationService; + + + @GetMapping("/getInvitationCode") + @Anonymous + public AjaxResult getInvitationCode() { + // 获取当前用户 + Long userId = SecurityUtils.getUserId(); + String invitationCode = invitationService.getInvitationCode(userId); + return success("操作成功", invitationCode); + } + + @GetMapping("/list") + public AjaxResult list() { + List list = invitationService.list(); + return success(list); + } + + @GetMapping("/getById") + public AjaxResult getById(Long id) { + Invitation invitation = invitationService.getById(id); + return success(invitation); + } + + + + +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/constant/JwtConstants.java b/mcwl-common/src/main/java/com/mcwl/common/constant/JwtConstants.java new file mode 100644 index 0000000..3833f60 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/constant/JwtConstants.java @@ -0,0 +1,39 @@ +package com.mcwl.common.constant; + +public class JwtConstants { + /** + * 用户ID字段 + */ + public static final String DETAILS_USER_ID = "user_id"; + + /** + * 用户名字段 + */ + public static final String DETAILS_USERNAME = "user_name"; + + /** + * 用户标识 + */ + public static final String USER_KEY = "user_key"; + + /** + * 令牌秘钥 + */ + public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; + + /** + * 手机 + */ + public static final String USER_PHONE = "user_phone"; + + + /** + * 用户token 的键的前缀 + */ + public static final String LOGIN_TOKEN = "login_token:"; + + /** + * token过期时间 1h = 60 * 60 * 1000L + */ + public static final Long EXPIRATION = 60 * 60 * 1000L; +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/utils/JwtUtils.java b/mcwl-common/src/main/java/com/mcwl/common/utils/JwtUtils.java new file mode 100644 index 0000000..8038062 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/utils/JwtUtils.java @@ -0,0 +1,114 @@ +package com.mcwl.common.utils; + +import com.mcwl.common.constant.JwtConstants; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.Map; + +/** + * @description: Jwt工具类 + * @author DongZl + */ +public class JwtUtils { + + /** + * 秘钥 + */ + public static String secret = JwtConstants.SECRET; + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + public static String createToken(Map claims){ + String token = Jwts.builder() + .addClaims(claims) + .signWith(SignatureAlgorithm.HS512, secret) + .setExpiration(new Date(System.currentTimeMillis() + JwtConstants.EXPIRATION)) + .compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + public static Claims parseToken(String token){ + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + /** + * 根据令牌获取用户标识 + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserKey(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户标识 + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserKey(Claims claims){ + return getValue(claims, JwtConstants.USER_KEY); + } + /** + * 根据令牌获取用户ID + * + * @param token 令牌 + * @return 用户ID + */ + public static String getUserId(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据身份信息获取用户ID + * + * @param claims 身份信息 + * @return 用户ID + */ + public static String getUserId(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USER_ID); + } + /** + * 根据令牌获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public static String getUserName(String token){ + Claims claims = parseToken(token); + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取用户名 + * + * @param claims 身份信息 + * @return 用户名 + */ + public static String getUserName(Claims claims){ + return getValue(claims, JwtConstants.DETAILS_USERNAME); + } + /** + * 根据身份信息获取键值 + * + * @param claims 身份信息 + * @param key 键 + * @return 值 + */ + public static String getValue(Claims claims, String key){ + Object obj = claims.get(key); + return obj == null ? "" : obj.toString(); + } +} diff --git a/mcwl-myInvitation/pom.xml b/mcwl-myInvitation/pom.xml new file mode 100644 index 0000000..4c77feb --- /dev/null +++ b/mcwl-myInvitation/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + com.mcwl + mcwl + 3.8.8 + + + mcwl-myInvitation + + + 8 + 8 + UTF-8 + 3.5.2 + + + + + + + com.mcwl + mcwl-common + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + \ No newline at end of file diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java new file mode 100644 index 0000000..bb7cd4a --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java @@ -0,0 +1,41 @@ +package com.mcwl.myInvitation.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; + +import java.util.Objects; + +// 提成表 +@Data +@TableName("commissions") +public class Commission extends BaseEntity { + + @TableId + private Long id; + + // 用户id + private Long userId; + + // 消费id + private Long consumeId; + + // 提成金额 + private Double amount; + + // 支付状态 + private Integer payStatus; + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Commission that = (Commission) o; + return Objects.equals(id, that.id) && Objects.equals(userId, that.userId) && Objects.equals(consumeId, that.consumeId) && Objects.equals(amount, that.amount) && Objects.equals(payStatus, that.payStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, userId, consumeId, amount, payStatus); + } +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java new file mode 100644 index 0000000..1cd9935 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java @@ -0,0 +1,39 @@ +package com.mcwl.myInvitation.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; + +import java.util.Date; +import java.util.Objects; + +// 消费表 +@Data +@TableName("consumes") +public class Consume extends BaseEntity { + + @TableId + private Long id; + + // 用户id + private Long userId; + + // 消费金额 + private Double amount; + + // 消费时间 + private Date consumeDate; + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Consume consume = (Consume) o; + return Objects.equals(id, consume.id) && Objects.equals(userId, consume.userId) && Objects.equals(amount, consume.amount) && Objects.equals(consumeDate, consume.consumeDate); + } + + @Override + public int hashCode() { + return Objects.hash(id, userId, amount, consumeDate); + } +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java new file mode 100644 index 0000000..3076d14 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java @@ -0,0 +1,39 @@ +package com.mcwl.myInvitation.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Objects; + +// 邀请表 +@Data +@TableName("invitations") +public class Invitation extends BaseEntity { + + @TableId + private Long id; + + // 邀请者 + private Long userId; + + // 被邀请者 + private Long userInviteId ; + + // 邀请码 + private String invitationCode; + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Invitation that = (Invitation) o; + return Objects.equals(id, that.id) && Objects.equals(userId, that.userId) && Objects.equals(userInviteId, that.userInviteId) && Objects.equals(invitationCode, that.invitationCode); + } + + @Override + public int hashCode() { + return Objects.hash(id, userId, userInviteId, invitationCode); + } +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/CommissionMapper.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/CommissionMapper.java new file mode 100644 index 0000000..0f6e4b3 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/CommissionMapper.java @@ -0,0 +1,13 @@ +package com.mcwl.myInvitation.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.myInvitation.domain.Commission; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface CommissionMapper extends BaseMapper { + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/ConsumeMapper.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/ConsumeMapper.java new file mode 100644 index 0000000..46dd641 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/ConsumeMapper.java @@ -0,0 +1,11 @@ +package com.mcwl.myInvitation.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.myInvitation.domain.Commission; +import com.mcwl.myInvitation.domain.Consume; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ConsumeMapper extends BaseMapper { + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/InvitationMapper.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/InvitationMapper.java new file mode 100644 index 0000000..4bb170a --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/mapper/InvitationMapper.java @@ -0,0 +1,11 @@ +package com.mcwl.myInvitation.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.myInvitation.domain.Commission; +import com.mcwl.myInvitation.domain.Invitation; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface InvitationMapper extends BaseMapper { + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/CommissionService.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/CommissionService.java new file mode 100644 index 0000000..fb41594 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/CommissionService.java @@ -0,0 +1,8 @@ +package com.mcwl.myInvitation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.myInvitation.domain.Commission; + +public interface CommissionService extends IService { + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/ConsumeService.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/ConsumeService.java new file mode 100644 index 0000000..9afdfd8 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/ConsumeService.java @@ -0,0 +1,8 @@ +package com.mcwl.myInvitation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.myInvitation.domain.Consume; + +public interface ConsumeService extends IService { + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/InvitationService.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/InvitationService.java new file mode 100644 index 0000000..d898219 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/InvitationService.java @@ -0,0 +1,14 @@ +package com.mcwl.myInvitation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.myInvitation.domain.Invitation; + +public interface InvitationService extends IService { + + /** + * 获取邀请码 + * @param userId 用户id + * @return 邀请码 + */ + String getInvitationCode(Long userId); +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/CommissionServiceImpl.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/CommissionServiceImpl.java new file mode 100644 index 0000000..8590de7 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/CommissionServiceImpl.java @@ -0,0 +1,16 @@ +package com.mcwl.myInvitation.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.myInvitation.domain.Commission; +import com.mcwl.myInvitation.mapper.CommissionMapper; +import com.mcwl.myInvitation.service.CommissionService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + + +@Service +@RequiredArgsConstructor +public class CommissionServiceImpl extends ServiceImpl implements CommissionService { + + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/ConsumeServiceImpl.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/ConsumeServiceImpl.java new file mode 100644 index 0000000..e3d5032 --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/ConsumeServiceImpl.java @@ -0,0 +1,15 @@ +package com.mcwl.myInvitation.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.myInvitation.domain.Consume; +import com.mcwl.myInvitation.mapper.ConsumeMapper; +import com.mcwl.myInvitation.service.ConsumeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ConsumeServiceImpl extends ServiceImpl implements ConsumeService { + + +} diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java new file mode 100644 index 0000000..7fb977b --- /dev/null +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/service/impl/InvitationServiceImpl.java @@ -0,0 +1,28 @@ +package com.mcwl.myInvitation.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.common.constant.JwtConstants; +import com.mcwl.common.utils.JwtUtils; +import com.mcwl.myInvitation.domain.Invitation; +import com.mcwl.myInvitation.mapper.InvitationMapper; +import com.mcwl.myInvitation.service.InvitationService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class InvitationServiceImpl extends ServiceImpl implements InvitationService { + + + @Override + public String getInvitationCode(Long userId) { + // 生成邀请码 + Map claims = new HashMap<>() ; + claims.put(JwtConstants.DETAILS_USER_ID, userId); + String invitationCode = JwtUtils.createToken(claims); + return invitationCode; + } +} diff --git a/mcwl-myInvitation/src/main/resources/mapper/myInvitation/CommissionMapper.xml b/mcwl-myInvitation/src/main/resources/mapper/myInvitation/CommissionMapper.xml new file mode 100644 index 0000000..a93c957 --- /dev/null +++ b/mcwl-myInvitation/src/main/resources/mapper/myInvitation/CommissionMapper.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/mcwl-myInvitation/src/main/resources/mapper/myInvitation/ConsumeMapper.xml b/mcwl-myInvitation/src/main/resources/mapper/myInvitation/ConsumeMapper.xml new file mode 100644 index 0000000..7eef87e --- /dev/null +++ b/mcwl-myInvitation/src/main/resources/mapper/myInvitation/ConsumeMapper.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/mcwl-myInvitation/src/main/resources/mapper/myInvitation/InvitationMapper.xml b/mcwl-myInvitation/src/main/resources/mapper/myInvitation/InvitationMapper.xml new file mode 100644 index 0000000..610e6fa --- /dev/null +++ b/mcwl-myInvitation/src/main/resources/mapper/myInvitation/InvitationMapper.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 38cb07c..a2a431f 100644 --- a/pom.xml +++ b/pom.xml @@ -228,6 +228,7 @@ mcwl-quartz mcwl-generator mcwl-common + mcwl-myInvitation pom From 200d7b810600374725972077db71072682b7d652 Mon Sep 17 00:00:00 2001 From: Diyu0904 <1819728964@qq.com> Date: Mon, 30 Dec 2024 16:52:24 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=20=E6=96=B0=E5=A2=9E=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=BC=82=E5=B8=B8=E7=B1=BB=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/system/SysDeptController.java | 22 ++-- .../controller/system/SysLoginController.java | 62 ++++++++-- .../controller/system/SysUserController.java | 26 ++--- mcwl-common/pom.xml | 7 ++ .../mcwl/common/constant/RedisConstants.java | 14 +++ .../core/domain/model/PhoneLoginBody.java | 25 ++++ .../com/mcwl/common/enums/ResultCode.java | 39 +++++++ .../common/exception/ErrorCodeException.java | 40 +++++++ .../java/com/mcwl/common/utils/CodeUtils.java | 29 +++++ .../mcwl/common/utils/uuid/TelSmsUtils.java | 87 ++++++++++++++ .../mcwl/framework/config/SecurityConfig.java | 26 ++++- .../core/OtherUserDetailsService.java | 16 +++ .../OtherLoginNotFoundException.java | 20 ++++ .../sms/SmsCodeAuthenticationToken.java | 74 ++++++++++++ .../SmsCodeByEmailAuthenticationProvider.java | 47 ++++++++ .../web/exception/GlobalExceptionHandler.java | 33 ++++-- .../web/service/SysLoginService.java | 109 ++++++++++++++++-- .../web/service/UserDetailsServiceImpl.java | 58 ++++++---- .../com/mcwl/system/mapper/SysUserMapper.java | 8 +- .../mcwl/system/service/ISysUserService.java | 52 +++++---- .../service/impl/SysUserServiceImpl.java | 33 +++--- .../resources/mapper/system/SysUserMapper.xml | 49 ++++---- 22 files changed, 729 insertions(+), 147 deletions(-) create mode 100644 mcwl-common/src/main/java/com/mcwl/common/constant/RedisConstants.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/core/domain/model/PhoneLoginBody.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/enums/ResultCode.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/exception/ErrorCodeException.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/utils/CodeUtils.java create mode 100644 mcwl-common/src/main/java/com/mcwl/common/utils/uuid/TelSmsUtils.java create mode 100644 mcwl-framework/src/main/java/com/mcwl/framework/security/core/OtherUserDetailsService.java create mode 100644 mcwl-framework/src/main/java/com/mcwl/framework/security/core/otherUserdetails/OtherLoginNotFoundException.java create mode 100644 mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeAuthenticationToken.java create mode 100644 mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeByEmailAuthenticationProvider.java diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysDeptController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysDeptController.java index 7e0e8a6..a26f29a 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysDeptController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysDeptController.java @@ -1,18 +1,5 @@ package com.mcwl.web.controller.system; -import java.util.List; -import org.apache.commons.lang3.ArrayUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.mcwl.common.annotation.Log; import com.mcwl.common.constant.UserConstants; import com.mcwl.common.core.controller.BaseController; @@ -21,10 +8,17 @@ import com.mcwl.common.core.domain.entity.SysDept; import com.mcwl.common.enums.BusinessType; import com.mcwl.common.utils.StringUtils; import com.mcwl.system.service.ISysDeptService; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 部门信息 - * + * * @author mcwl */ @RestController diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java index 6527955..0ea8c26 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java @@ -1,29 +1,38 @@ package com.mcwl.web.controller.system; -import java.util.List; -import java.util.Set; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import com.mcwl.common.annotation.Anonymous; import com.mcwl.common.constant.Constants; +import com.mcwl.common.constant.RedisConstants; import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.common.core.domain.entity.SysMenu; import com.mcwl.common.core.domain.entity.SysUser; import com.mcwl.common.core.domain.model.LoginBody; import com.mcwl.common.core.domain.model.LoginUser; +import com.mcwl.common.core.domain.model.PhoneLoginBody; +import com.mcwl.common.core.redis.RedisCache; +import com.mcwl.common.utils.CodeUtils; import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.common.utils.uuid.TelSmsUtils; import com.mcwl.framework.web.service.SysLoginService; import com.mcwl.framework.web.service.SysPermissionService; import com.mcwl.framework.web.service.TokenService; import com.mcwl.system.service.ISysMenuService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; /** * 登录验证 * * @author mcwl */ +@Slf4j @RestController public class SysLoginController { @@ -39,6 +48,31 @@ public class SysLoginController @Autowired private TokenService tokenService; + @Autowired + private RedisCache redisCache; + + + @Anonymous + @GetMapping("/getCode") + public AjaxResult code(@RequestParam String phone){ + + //生成验证码 + String s = CodeUtils.generateCaptcha(); + + log.info("获取到的验证码:{}",s); + //存储redis + redisCache.setCacheObject(RedisConstants.CODE_PHONE+phone,s,1, TimeUnit.MINUTES); + + //发送短信服务 + // 构建 sendDataMap + Map sendDataMap = new HashMap<>(); + sendDataMap.put("code:", s); + TelSmsUtils.sendSms(phone,"SMS_460535072",sendDataMap); + + return AjaxResult.success(); + + } + /** * 登录方法 * @@ -56,6 +90,20 @@ public class SysLoginController return ajax; } + + + @PostMapping("/phoneLogin") + @Anonymous + public AjaxResult phoneLogin(@RequestBody PhoneLoginBody phoneLoginBody){ + + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + String token = loginService.phoneLogin(phoneLoginBody.getPhone(),phoneLoginBody.getCode()); + ajax.put(Constants.TOKEN, token); + return ajax; + + } + /** * 获取用户信息 * diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysUserController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysUserController.java index 8336ba1..9158537 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysUserController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysUserController.java @@ -1,21 +1,5 @@ package com.mcwl.web.controller.system; -import java.util.List; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.ArrayUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; import com.mcwl.common.annotation.Log; import com.mcwl.common.core.controller.BaseController; import com.mcwl.common.core.domain.AjaxResult; @@ -31,6 +15,16 @@ import com.mcwl.system.service.ISysDeptService; import com.mcwl.system.service.ISysPostService; import com.mcwl.system.service.ISysRoleService; import com.mcwl.system.service.ISysUserService; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.stream.Collectors; /** * 用户信息 diff --git a/mcwl-common/pom.xml b/mcwl-common/pom.xml index 07add0c..64877f0 100644 --- a/mcwl-common/pom.xml +++ b/mcwl-common/pom.xml @@ -271,6 +271,13 @@ javax.servlet-api + + + com.aliyun + dysmsapi20170525 + 2.0.1 + + diff --git a/mcwl-common/src/main/java/com/mcwl/common/constant/RedisConstants.java b/mcwl-common/src/main/java/com/mcwl/common/constant/RedisConstants.java new file mode 100644 index 0000000..6010987 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/constant/RedisConstants.java @@ -0,0 +1,14 @@ +package com.mcwl.common.constant; + +/** + * redis存储前缀常量 + * + * @author DaiZibo + * @date 2024/12/28 + * @apiNote + */ + +public class RedisConstants { + + public static final String CODE_PHONE = "code_phone:"; +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/core/domain/model/PhoneLoginBody.java b/mcwl-common/src/main/java/com/mcwl/common/core/domain/model/PhoneLoginBody.java new file mode 100644 index 0000000..46ae635 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/core/domain/model/PhoneLoginBody.java @@ -0,0 +1,25 @@ +package com.mcwl.common.core.domain.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 手机号登录对象 + * + * @author DaiZibo + * @date 2024/12/28 + * @apiNote + */ + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class PhoneLoginBody { + + private String phone; + + private String code; +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/enums/ResultCode.java b/mcwl-common/src/main/java/com/mcwl/common/enums/ResultCode.java new file mode 100644 index 0000000..9bd8a71 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/enums/ResultCode.java @@ -0,0 +1,39 @@ +package com.mcwl.common.enums; + +/** + * 返回值状态码 + * + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +public enum ResultCode { + + SUCCESS(200),//成功 + + FAIL(400),//失败 + + FAIL_SIGN_IN(401),//登录失败 + + TOKEN_OVERDUE(402),//token过期 + + NOT_FOUND(404),//接口不存在 + + INTERNAL_SERVICE_ERROR(500);//服务器内部错误 + + private final Integer code; + + ResultCode(Integer code) { + this.code = code; + } + + private Integer code() { + return code; + } + + public Integer getCode() { + return code; + } + +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/exception/ErrorCodeException.java b/mcwl-common/src/main/java/com/mcwl/common/exception/ErrorCodeException.java new file mode 100644 index 0000000..6480741 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/exception/ErrorCodeException.java @@ -0,0 +1,40 @@ +package com.mcwl.common.exception; + +import com.mcwl.common.enums.ResultCode; + +/** + * 自定义异常类 + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +public class ErrorCodeException extends RuntimeException { + + private Integer code; + private String message; + + public ErrorCodeException(ResultCode resultCode, String msg) { + this.code = resultCode.getCode(); + this.message = msg; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} + diff --git a/mcwl-common/src/main/java/com/mcwl/common/utils/CodeUtils.java b/mcwl-common/src/main/java/com/mcwl/common/utils/CodeUtils.java new file mode 100644 index 0000000..39d4aad --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/utils/CodeUtils.java @@ -0,0 +1,29 @@ +package com.mcwl.common.utils; + +import java.util.Random; + +/** + * 验证码工具类 + * + * @author DaiZibo + * @date 2024/12/28 + * @apiNote + */ + +public class CodeUtils { + + /** + * 生成一个随机的4位数验证码 + * + * @return 返回生成的验证码字符串 + */ + public static String generateCaptcha() { + // 创建Random对象用于生成随机数 + Random random = new Random(); + // 生成1000到9999之间的随机整数(包括1000和9999) + int captcha = 1000 + random.nextInt(9000); + // 将整数转换为字符串并返回 + return String.valueOf(captcha); + } + +} diff --git a/mcwl-common/src/main/java/com/mcwl/common/utils/uuid/TelSmsUtils.java b/mcwl-common/src/main/java/com/mcwl/common/utils/uuid/TelSmsUtils.java new file mode 100644 index 0000000..20f0c25 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/utils/uuid/TelSmsUtils.java @@ -0,0 +1,87 @@ +package com.mcwl.common.utils.uuid; + +import com.alibaba.fastjson.JSONObject; +import com.aliyun.dysmsapi20170525.Client; +import com.aliyun.dysmsapi20170525.models.SendSmsRequest; +import com.aliyun.dysmsapi20170525.models.SendSmsResponse; +import com.aliyun.teaopenapi.models.Config; +import lombok.extern.log4j.Log4j2; + +import java.util.Map; + +/** + * 短信工具类 + */ +@Log4j2 +public class TelSmsUtils { + + /** + * 阿里云主账号AccessKey,accessKeySecret拥有所有API的访问权限 + */ + private static String accessKeyId = "LTAIEVXszCmcd1T5"; + private static String accessKeySecret = "2zHwciQXln8wExSEnkIYtRTSwLeRNd"; + + /** + * 短信访问域名 + */ + private static String endpoint = "dysmsapi.aliyuncs.com"; + /** + * 短信签名 + */ + private static String signName = "帝宇"; + + /** + * 实例化短信对象 + */ + private static Client client; + + static { + log.info("初始化短信服务开始"); + long startTime = System.currentTimeMillis(); + try { + client = initClient(); + log.info("初始化短信成功:{}",signName); + } catch (Exception e) { + e.printStackTrace(); + } + log.info("初始化短信服务结束:耗时:{}MS",(System.currentTimeMillis()-startTime)); + } + /** + * 初始化短信对象 + * @return + * @throws Exception + */ + private static Client initClient() throws Exception{ + Config config = new Config() + // 您的AccessKey ID + .setAccessKeyId(accessKeyId) + // 您的AccessKey Secret + .setAccessKeySecret(accessKeySecret); + // 访问的域名 + config.endpoint = endpoint; + return new Client(config); + } + + /** + * 发送单条短信 + * @param tel + * @param templateCode SMS_153991546 + * @param sendDataMap + */ + public static String sendSms(String tel , String templateCode , Map sendDataMap){ + SendSmsRequest sendSmsRequest = new SendSmsRequest() + .setPhoneNumbers(tel) + .setSignName(signName) + .setTemplateCode(templateCode) + .setTemplateParam(JSONObject.toJSONString(sendDataMap)); + SendSmsResponse sendSmsResponse = null; + try { + log.info("发送短信验证码:消息内容是:【{}】", JSONObject.toJSONString(sendDataMap)); + sendSmsResponse = client.sendSms(sendSmsRequest); + } catch (Exception e) { + log.error("短信发送异常,手机号:【{}】,短信内容:【{}】,异常信息:【{}】", tel, sendDataMap, e); + } + return JSONObject.toJSONString(sendSmsResponse.getBody()); + } + +} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java index 0f71304..e8b8e25 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java @@ -1,5 +1,11 @@ package com.mcwl.framework.config; +import com.mcwl.framework.config.properties.PermitAllUrlProperties; +import com.mcwl.framework.security.core.OtherUserDetailsService; +import com.mcwl.framework.security.filter.JwtAuthenticationTokenFilter; +import com.mcwl.framework.security.handle.AuthenticationEntryPointImpl; +import com.mcwl.framework.security.handle.LogoutSuccessHandlerImpl; +import com.mcwl.framework.security.sms.SmsCodeByEmailAuthenticationProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,10 +22,6 @@ import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.logout.LogoutFilter; import org.springframework.web.filter.CorsFilter; -import com.mcwl.framework.config.properties.PermitAllUrlProperties; -import com.mcwl.framework.security.filter.JwtAuthenticationTokenFilter; -import com.mcwl.framework.security.handle.AuthenticationEntryPointImpl; -import com.mcwl.framework.security.handle.LogoutSuccessHandlerImpl; /** * spring security配置 @@ -36,6 +38,13 @@ public class SecurityConfig @Autowired private UserDetailsService userDetailsService; + /** + * 自定义用户(手机号验证码)认证逻辑 + */ + @Autowired + private OtherUserDetailsService userDetailsServiceByPhone; + + /** * 认证失败处理类 */ @@ -78,6 +87,15 @@ public class SecurityConfig return new ProviderManager(daoAuthenticationProvider); } + + @Bean + public AuthenticationManager authenticationManagerPhone() { + SmsCodeByEmailAuthenticationProvider daoAuthenticationProvider = new SmsCodeByEmailAuthenticationProvider(); + daoAuthenticationProvider.setUserDetailsService(userDetailsServiceByPhone); + return new ProviderManager(daoAuthenticationProvider); + } + + /** * anyRequest | 匹配所有请求路径 * access | SpringEl表达式结果为true时可以访问 diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/security/core/OtherUserDetailsService.java b/mcwl-framework/src/main/java/com/mcwl/framework/security/core/OtherUserDetailsService.java new file mode 100644 index 0000000..aaeb109 --- /dev/null +++ b/mcwl-framework/src/main/java/com/mcwl/framework/security/core/OtherUserDetailsService.java @@ -0,0 +1,16 @@ +package com.mcwl.framework.security.core; + +import com.mcwl.framework.security.core.otherUserdetails.OtherLoginNotFoundException; +import org.springframework.security.core.userdetails.UserDetails; + +/** + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +public interface OtherUserDetailsService { + + UserDetails otherLoadUser(String o, int num) throws OtherLoginNotFoundException; + +} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/security/core/otherUserdetails/OtherLoginNotFoundException.java b/mcwl-framework/src/main/java/com/mcwl/framework/security/core/otherUserdetails/OtherLoginNotFoundException.java new file mode 100644 index 0000000..2fa5633 --- /dev/null +++ b/mcwl-framework/src/main/java/com/mcwl/framework/security/core/otherUserdetails/OtherLoginNotFoundException.java @@ -0,0 +1,20 @@ +package com.mcwl.framework.security.core.otherUserdetails; + +import org.springframework.security.core.AuthenticationException; + +/** + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + + +public class OtherLoginNotFoundException extends AuthenticationException { + public OtherLoginNotFoundException(String msg) { + super(msg); + } + + public OtherLoginNotFoundException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeAuthenticationToken.java b/mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeAuthenticationToken.java new file mode 100644 index 0000000..2db5cc6 --- /dev/null +++ b/mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeAuthenticationToken.java @@ -0,0 +1,74 @@ +package com.mcwl.framework.security.sms; + +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +import javax.security.auth.Subject; +import java.util.Collection; + +/** + * 短信登录 AuthenticationToken,模仿 UsernamePasswordAuthenticationToken 实现 + * + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +public class SmsCodeAuthenticationToken extends AbstractAuthenticationToken { + + private static final long serialVersionUID = 550L; + + /** + * 在 UsernamePasswordAuthenticationToken 中该字段代表登录的用户名, + * 在这里就代表登录的手机号码或邮箱 + */ + private final Object principal; + + /** + * 构建一个没有鉴权的 SmsCodeAuthenticationToken + */ + public SmsCodeAuthenticationToken(Object principal) { + super(null); + this.principal = principal; + setAuthenticated(false); + } + + /** + * 构建拥有鉴权的 SmsCodeAuthenticationToken + */ + public SmsCodeAuthenticationToken(Object principal, Collection authorities) { + super(authorities); + this.principal = principal; + super.setAuthenticated(true); + } + + @Override + public Object getCredentials() { + return null; + } + + @Override + public Object getPrincipal() { + return this.principal; + } + + @Override + public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { + if (isAuthenticated) { + throw new IllegalArgumentException( + "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead"); + } + + super.setAuthenticated(false); + } + + @Override + public void eraseCredentials() { + super.eraseCredentials(); + } + + @Override + public boolean implies(Subject subject) { + return super.implies(subject); + } +} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeByEmailAuthenticationProvider.java b/mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeByEmailAuthenticationProvider.java new file mode 100644 index 0000000..12a77e2 --- /dev/null +++ b/mcwl-framework/src/main/java/com/mcwl/framework/security/sms/SmsCodeByEmailAuthenticationProvider.java @@ -0,0 +1,47 @@ +package com.mcwl.framework.security.sms; + +import com.mcwl.framework.security.core.OtherUserDetailsService; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.AuthenticationException; + +/** + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + + +public class SmsCodeByEmailAuthenticationProvider implements AuthenticationProvider { + private OtherUserDetailsService userDetailsService; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + SmsCodeAuthenticationToken authenticationToken = (SmsCodeAuthenticationToken) authentication; + + String email = (String) authenticationToken.getPrincipal(); + UserDetails userDetails = userDetailsService.otherLoadUser(email, 1); + + // 此时鉴权成功后,应当重新 new 一个拥有鉴权的 authenticationResult 返回 + SmsCodeAuthenticationToken authenticationResult = new SmsCodeAuthenticationToken(userDetails, userDetails.getAuthorities()); + authenticationResult.setDetails(authenticationToken.getDetails()); + + return authenticationResult; + } + + + @Override + public boolean supports(Class authentication) { + // 判断 authentication 是不是 SmsCodeAuthenticationToken 的子类或子接口 + return SmsCodeAuthenticationToken.class.isAssignableFrom(authentication); + } + + public OtherUserDetailsService getUserDetailsService() { + return userDetailsService; + } + + public void setUserDetailsService(OtherUserDetailsService userDetailsService) { + this.userDetailsService = userDetailsService; + } +} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/web/exception/GlobalExceptionHandler.java b/mcwl-framework/src/main/java/com/mcwl/framework/web/exception/GlobalExceptionHandler.java index 11f0abf..b329f36 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/web/exception/GlobalExceptionHandler.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/web/exception/GlobalExceptionHandler.java @@ -1,6 +1,13 @@ package com.mcwl.framework.web.exception; -import javax.servlet.http.HttpServletRequest; +import com.mcwl.common.constant.HttpStatus; +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.core.text.Convert; +import com.mcwl.common.exception.DemoModeException; +import com.mcwl.common.exception.ErrorCodeException; +import com.mcwl.common.exception.ServiceException; +import com.mcwl.common.utils.StringUtils; +import com.mcwl.common.utils.html.EscapeUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; @@ -11,13 +18,8 @@ import org.springframework.web.bind.MissingPathVariableException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import com.mcwl.common.constant.HttpStatus; -import com.mcwl.common.core.domain.AjaxResult; -import com.mcwl.common.core.text.Convert; -import com.mcwl.common.exception.DemoModeException; -import com.mcwl.common.exception.ServiceException; -import com.mcwl.common.utils.StringUtils; -import com.mcwl.common.utils.html.EscapeUtil; + +import javax.servlet.http.HttpServletRequest; /** * 全局异常处理器 @@ -29,6 +31,21 @@ public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 仿照业务异常——自定义异常抛出 + */ + @ExceptionHandler(ErrorCodeException.class) + public AjaxResult UserDefinedException(ErrorCodeException e){ + System.out.println("StringUtils.isNull(e.getCode()):"+StringUtils.isNull(e.getCode())); + if (StringUtils.isNull(e.getCode())) + { + return AjaxResult.error(e.getMessage()); + } + return AjaxResult.error(e.getCode(), e.getMessage()); + } + + /** * 权限校验异常 */ diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/web/service/SysLoginService.java b/mcwl-framework/src/main/java/com/mcwl/framework/web/service/SysLoginService.java index 898be5b..9020493 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/web/service/SysLoginService.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/web/service/SysLoginService.java @@ -1,24 +1,16 @@ package com.mcwl.framework.web.service; -import javax.annotation.Resource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Component; import com.mcwl.common.constant.CacheConstants; import com.mcwl.common.constant.Constants; +import com.mcwl.common.constant.RedisConstants; import com.mcwl.common.constant.UserConstants; import com.mcwl.common.core.domain.entity.SysUser; import com.mcwl.common.core.domain.model.LoginUser; import com.mcwl.common.core.redis.RedisCache; +import com.mcwl.common.enums.ResultCode; +import com.mcwl.common.exception.ErrorCodeException; import com.mcwl.common.exception.ServiceException; -import com.mcwl.common.exception.user.BlackListException; -import com.mcwl.common.exception.user.CaptchaException; -import com.mcwl.common.exception.user.CaptchaExpireException; -import com.mcwl.common.exception.user.UserNotExistsException; -import com.mcwl.common.exception.user.UserPasswordNotMatchException; +import com.mcwl.common.exception.user.*; import com.mcwl.common.utils.DateUtils; import com.mcwl.common.utils.MessageUtils; import com.mcwl.common.utils.StringUtils; @@ -26,8 +18,17 @@ import com.mcwl.common.utils.ip.IpUtils; import com.mcwl.framework.manager.AsyncManager; import com.mcwl.framework.manager.factory.AsyncFactory; import com.mcwl.framework.security.context.AuthenticationContextHolder; +import com.mcwl.framework.security.sms.SmsCodeAuthenticationToken; import com.mcwl.system.service.ISysConfigService; import com.mcwl.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; /** * 登录校验方法 @@ -37,12 +38,19 @@ import com.mcwl.system.service.ISysUserService; @Component public class SysLoginService { + + @Autowired + private UserDetailsServiceImpl userDetailsService; + @Autowired private TokenService tokenService; @Resource private AuthenticationManager authenticationManager; + @Resource + private AuthenticationManager authenticationManagerPhone; + @Autowired private RedisCache redisCache; @@ -178,4 +186,81 @@ public class SysLoginService sysUser.setLoginDate(DateUtils.getNowDate()); userService.updateUserProfile(sysUser); } + + public String phoneLogin(String phone, String code) { + + //校验验证码 + validateCaptcha(phone, code); + + //根据手机号查询数据 + SysUser sysUser = userService.selectUserByPhone(phone); + if (sysUser == null){ + throw new UserNotExistsException(); + } + + // 登录前置校验 + otherLoginPreCheck(sysUser.getUserName()); + + // 用户验证 + Authentication authentication; + try { + SmsCodeAuthenticationToken smsCodeAuthenticationToken = new SmsCodeAuthenticationToken(sysUser.getPhonenumber()); + System.out.println(smsCodeAuthenticationToken); + AuthenticationContextHolder.setContext(smsCodeAuthenticationToken); + authentication = authenticationManagerPhone.authenticate(smsCodeAuthenticationToken); + } +// SmsCodeAuthenticationToken [Principal=admin, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]] + catch (Exception e) { + if (e instanceof BadCredentialsException) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } else { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + return tokenService.createToken(loginUser); + } + + private void validateCaptcha(String phone, String code) { + //校验验证码 + Object cacheObject = redisCache.getCacheObject(RedisConstants.CODE_PHONE + phone); + System.out.println("验证码:"+cacheObject); + if (cacheObject == null) { + // 处理未找到验证码的情况 + throw new ErrorCodeException(ResultCode.FAIL,"验证码已过期或未发送"); + } + + String c = (String) cacheObject; + if (!c.equals(code)){ + //验证码错误 + throw new ErrorCodeException(ResultCode.FAIL,"验证码错误"); + } + } + + public void otherLoginPreCheck(String username) { + // 用户名为空 错误 + if (StringUtils.isEmpty(username)) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); + throw new UserNotExistsException(); + } + // 用户名不在指定范围内 错误 + if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + // IP黑名单校验 + String blackStr = configService.selectConfigByKey("sys.login.blackIPList"); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked"))); + throw new BlackListException(); + } + } + } diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/web/service/UserDetailsServiceImpl.java b/mcwl-framework/src/main/java/com/mcwl/framework/web/service/UserDetailsServiceImpl.java index 3e3fd74..81af05a 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/web/service/UserDetailsServiceImpl.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/web/service/UserDetailsServiceImpl.java @@ -1,5 +1,13 @@ package com.mcwl.framework.web.service; +import com.mcwl.common.core.domain.entity.SysUser; +import com.mcwl.common.core.domain.model.LoginUser; +import com.mcwl.common.enums.UserStatus; +import com.mcwl.common.exception.ServiceException; +import com.mcwl.common.utils.MessageUtils; +import com.mcwl.common.utils.StringUtils; +import com.mcwl.framework.security.core.OtherUserDetailsService; +import com.mcwl.system.service.ISysUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -7,13 +15,6 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; -import com.mcwl.common.core.domain.entity.SysUser; -import com.mcwl.common.core.domain.model.LoginUser; -import com.mcwl.common.enums.UserStatus; -import com.mcwl.common.exception.ServiceException; -import com.mcwl.common.utils.MessageUtils; -import com.mcwl.common.utils.StringUtils; -import com.mcwl.system.service.ISysUserService; /** * 用户验证处理 @@ -21,10 +22,12 @@ import com.mcwl.system.service.ISysUserService; * @author mcwl */ @Service -public class UserDetailsServiceImpl implements UserDetailsService -{ +public class UserDetailsServiceImpl implements UserDetailsService, OtherUserDetailsService { private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); + private int num = 0; + + @Autowired private ISysUserService userService; @@ -35,32 +38,41 @@ public class UserDetailsServiceImpl implements UserDetailsService private SysPermissionService permissionService; @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException - { - SysUser user = userService.selectUserByUserName(username); - if (StringUtils.isNull(user)) - { + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + SysUser user = null; + if (num == 0 ){ + user = userService.selectUserByUserName(username); + }else { + user = userService.selectUserByPhone(username); + } + + if (StringUtils.isNull(user)) { log.info("登录用户:{} 不存在.", username); throw new ServiceException(MessageUtils.message("user.not.exists")); - } - else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) - { + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { log.info("登录用户:{} 已被删除.", username); throw new ServiceException(MessageUtils.message("user.password.delete")); - } - else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) - { + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { log.info("登录用户:{} 已被停用.", username); throw new ServiceException(MessageUtils.message("user.blocked")); } - passwordService.validate(user); +// passwordService.validate(user); + if (num == 0) { + passwordService.validate(user); + } + num = 0; return createLoginUser(user); } - public UserDetails createLoginUser(SysUser user) - { + public UserDetails createLoginUser(SysUser user) { return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); } + + @Override + public UserDetails otherLoadUser(String username, int num) throws UsernameNotFoundException { + this.num = num; + return loadUserByUsername(username); + } } diff --git a/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserMapper.java b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserMapper.java index eff16f6..447ec48 100644 --- a/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserMapper.java +++ b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserMapper.java @@ -1,8 +1,9 @@ package com.mcwl.system.mapper; -import java.util.List; -import org.apache.ibatis.annotations.Param; import com.mcwl.common.core.domain.entity.SysUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 用户表 数据层 @@ -124,4 +125,7 @@ public interface SysUserMapper * @return 结果 */ public SysUser checkEmailUnique(String email); + + SysUser selectUserByPhone(@Param("phone") String phone); + } diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserService.java b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserService.java index a0aee0f..d819f35 100644 --- a/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserService.java +++ b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserService.java @@ -1,18 +1,19 @@ package com.mcwl.system.service; -import java.util.List; import com.mcwl.common.core.domain.entity.SysUser; +import java.util.List; + /** * 用户 业务层 - * + * * @author mcwl */ public interface ISysUserService { /** * 根据条件分页查询用户列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -20,7 +21,7 @@ public interface ISysUserService /** * 根据条件分页查询已分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -28,7 +29,7 @@ public interface ISysUserService /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -36,7 +37,7 @@ public interface ISysUserService /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -44,7 +45,7 @@ public interface ISysUserService /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -52,7 +53,7 @@ public interface ISysUserService /** * 根据用户ID查询用户所属角色组 - * + * * @param userName 用户名 * @return 结果 */ @@ -60,7 +61,7 @@ public interface ISysUserService /** * 根据用户ID查询用户所属岗位组 - * + * * @param userName 用户名 * @return 结果 */ @@ -68,7 +69,7 @@ public interface ISysUserService /** * 校验用户名称是否唯一 - * + * * @param user 用户信息 * @return 结果 */ @@ -92,21 +93,21 @@ public interface ISysUserService /** * 校验用户是否允许操作 - * + * * @param user 用户信息 */ public void checkUserAllowed(SysUser user); /** * 校验用户是否有数据权限 - * + * * @param userId 用户id */ public void checkUserDataScope(Long userId); /** * 新增用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -114,7 +115,7 @@ public interface ISysUserService /** * 注册用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -122,7 +123,7 @@ public interface ISysUserService /** * 修改用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -130,7 +131,7 @@ public interface ISysUserService /** * 用户授权角色 - * + * * @param userId 用户ID * @param roleIds 角色组 */ @@ -138,7 +139,7 @@ public interface ISysUserService /** * 修改用户状态 - * + * * @param user 用户信息 * @return 结果 */ @@ -146,7 +147,7 @@ public interface ISysUserService /** * 修改用户基本信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -154,7 +155,7 @@ public interface ISysUserService /** * 修改用户头像 - * + * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 @@ -163,7 +164,7 @@ public interface ISysUserService /** * 重置用户密码 - * + * * @param user 用户信息 * @return 结果 */ @@ -171,7 +172,7 @@ public interface ISysUserService /** * 重置用户密码 - * + * * @param userName 用户名 * @param password 密码 * @return 结果 @@ -180,7 +181,7 @@ public interface ISysUserService /** * 通过用户ID删除用户 - * + * * @param userId 用户ID * @return 结果 */ @@ -188,7 +189,7 @@ public interface ISysUserService /** * 批量删除用户信息 - * + * * @param userIds 需要删除的用户ID * @return 结果 */ @@ -196,11 +197,14 @@ public interface ISysUserService /** * 导入用户数据 - * + * * @param userList 用户数据列表 * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 * @param operName 操作用户 * @return 结果 */ public String importUser(List userList, Boolean isUpdateSupport, String operName); + + SysUser selectUserByPhone(String phone); + } diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserServiceImpl.java b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserServiceImpl.java index b90b239..153ddcf 100644 --- a/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserServiceImpl.java +++ b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserServiceImpl.java @@ -1,15 +1,5 @@ package com.mcwl.system.service.impl; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import javax.validation.Validator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; import com.mcwl.common.annotation.DataScope; import com.mcwl.common.constant.UserConstants; import com.mcwl.common.core.domain.entity.SysRole; @@ -22,14 +12,21 @@ import com.mcwl.common.utils.spring.SpringUtils; import com.mcwl.system.domain.SysPost; import com.mcwl.system.domain.SysUserPost; import com.mcwl.system.domain.SysUserRole; -import com.mcwl.system.mapper.SysPostMapper; -import com.mcwl.system.mapper.SysRoleMapper; -import com.mcwl.system.mapper.SysUserMapper; -import com.mcwl.system.mapper.SysUserPostMapper; -import com.mcwl.system.mapper.SysUserRoleMapper; +import com.mcwl.system.mapper.*; import com.mcwl.system.service.ISysConfigService; import com.mcwl.system.service.ISysDeptService; import com.mcwl.system.service.ISysUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.validation.Validator; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -547,4 +544,10 @@ public class SysUserServiceImpl implements ISysUserService } return successMsg.toString(); } + + @Override + public SysUser selectUserByPhone(String phone) { + + return userMapper.selectUserByPhone(phone); + } } diff --git a/mcwl-system/src/main/resources/mapper/system/SysUserMapper.xml b/mcwl-system/src/main/resources/mapper/system/SysUserMapper.xml index d307724..6dc0cb2 100644 --- a/mcwl-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/mcwl-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -36,7 +36,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -45,9 +45,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, + select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status from sys_user u @@ -55,7 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" left join sys_user_role ur on u.user_id = ur.user_id left join sys_role r on r.role_id = ur.role_id - + - + - + - + - + - + - + - + - + + + insert into sys_user( user_id, @@ -173,7 +178,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" sysdate() ) - + update sys_user @@ -194,28 +199,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where user_id = #{userId} - + update sys_user set status = #{status} where user_id = #{userId} - + update sys_user set avatar = #{avatar} where user_name = #{userName} - + update sys_user set password = #{password} where user_name = #{userName} - + update sys_user set del_flag = '2' where user_id = #{userId} - + update sys_user set del_flag = '2' where user_id in #{userId} - + - - \ No newline at end of file + + From 13e5bf5bae8a329fad2fd88b9e242de94af1339f Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Mon, 30 Dec 2024 17:07:27 +0800 Subject: [PATCH 5/9] =?UTF-8?q?docs:=E6=B7=BB=E5=8A=A0mybatis-plus?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-druid.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/mcwl-admin/src/main/resources/application-druid.yml b/mcwl-admin/src/main/resources/application-druid.yml index 52d6bdd..98ecb56 100644 --- a/mcwl-admin/src/main/resources/application-druid.yml +++ b/mcwl-admin/src/main/resources/application-druid.yml @@ -59,3 +59,21 @@ spring: wall: config: multi-statement-allow: true +mybatis-plus: + # Mapper XML文件位置 + mapper-locations: classpath:mapper/**/*.xml + # 配置实体类所在的包名,MyBatis-Plus会自动扫描并注册为别名 + type-aliases-package: com.mcwl.**.mapper + # 全局配置 + global-config: + db-config: + # 主键生成策略 + id-type: auto + # 开启驼峰命名规则转换 + capital-mode: true + # 配置逻辑删除相关属性 + logic-delete-field: del_flag + logic-delete-value: '2' + logic-not-delete-value: '0' + # 数据库字段下划线命名规则 + table-underline: true \ No newline at end of file From 10d944174d4bf4a721b252e129e77522ee99cd9d Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Mon, 30 Dec 2024 17:20:20 +0800 Subject: [PATCH 6/9] =?UTF-8?q?style:=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mcwl/web/controller/myInvitation/InvitationController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java index 94e3dd1..8043992 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java @@ -23,7 +23,6 @@ public class InvitationController { @GetMapping("/getInvitationCode") - @Anonymous public AjaxResult getInvitationCode() { // 获取当前用户 Long userId = SecurityUtils.getUserId(); From 4fe40b47fb40e9fe03fae60d402f63491f8913d9 Mon Sep 17 00:00:00 2001 From: Diyu0904 <1819728964@qq.com> Date: Tue, 31 Dec 2024 14:56:32 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E6=96=B0=E5=A2=9Emybatis-plus=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=BE=AE=E4=BF=A1=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=E5=8F=91=E9=80=81=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcwl-admin/pom.xml | 13 +- .../rabbitmq/config/CodeMQConfig.java | 23 ++ .../rabbitmq/consumer/CodeConsumer.java | 24 ++ .../controller/system/SysLoginController.java | 21 +- .../web/controller/system/WXController.java | 117 +++++++ .../src/main/resources/application-druid.yml | 24 ++ mcwl-admin/src/main/resources/application.yml | 48 ++- .../main/resources/mybatis/mybatis-config.xml | 20 -- mcwl-common/pom.xml | 7 + .../mcwl/common/constant/CacheConstants.java | 9 +- .../mcwl/common/constant/QueueConstants.java | 15 + .../mcwl/framework/config/MyBatisConfig.java | 285 ++++++++++-------- .../framework/config/MybatisPlusConfig.java | 60 ++++ .../web/service/PermissionService.java | 7 +- .../system/domain/SysUserThirdAccount.java | 106 +++++++ .../mapper/SysUserThirdAccountMapper.java | 13 + .../service/ISysUserThirdAccountService.java | 15 + .../com/mcwl/system/service/IWXService.java | 14 + .../system/service/impl/IWXServiceImpl.java | 67 ++++ .../impl/SysUserThirdAccountServiceImpl.java | 50 +++ pom.xml | 7 + 21 files changed, 777 insertions(+), 168 deletions(-) create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/consumer/CodeConsumer.java create mode 100644 mcwl-admin/src/main/java/com/mcwl/web/controller/system/WXController.java delete mode 100644 mcwl-admin/src/main/resources/mybatis/mybatis-config.xml create mode 100644 mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java create mode 100644 mcwl-framework/src/main/java/com/mcwl/framework/config/MybatisPlusConfig.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/domain/SysUserThirdAccount.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserThirdAccountMapper.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/ISysUserThirdAccountService.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/IWXService.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/impl/IWXServiceImpl.java create mode 100644 mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserThirdAccountServiceImpl.java diff --git a/mcwl-admin/pom.xml b/mcwl-admin/pom.xml index 85736cc..ee4a6bb 100644 --- a/mcwl-admin/pom.xml +++ b/mcwl-admin/pom.xml @@ -37,7 +37,7 @@ 1.6.2 - + mysql mysql-connector-java @@ -68,6 +68,13 @@ mcwl-generator + + + org.springframework.boot + spring-boot-starter-amqp + 3.1.2 + + @@ -95,9 +102,9 @@ false ${project.artifactId} - + ${project.artifactId} - \ No newline at end of file + diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java new file mode 100644 index 0000000..1c6ac0e --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/config/CodeMQConfig.java @@ -0,0 +1,23 @@ +package com.mcwl.web.controller.rabbitmq.config; + +import com.mcwl.common.constant.QueueConstants; +import org.springframework.amqp.core.Queue; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 初始化发送短信服雾队列 + * + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +@Configuration +public class CodeMQConfig { + + @Bean + public Queue queue() { + return new Queue(QueueConstants.CODE_QUEUE, true); + } +} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/consumer/CodeConsumer.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/consumer/CodeConsumer.java new file mode 100644 index 0000000..4710bb5 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/rabbitmq/consumer/CodeConsumer.java @@ -0,0 +1,24 @@ +package com.mcwl.web.controller.rabbitmq.consumer; + +import com.mcwl.common.constant.QueueConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +/** + * 手机号登录短信验证码消费者 + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +@Slf4j +@Component +public class CodeConsumer { + + @RabbitListener(queues = QueueConstants.CODE_QUEUE) + public void code(String msg) { + + log.info("消费者获取到的数据:{}", msg); + } +} diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java index 0ea8c26..6300ff2 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/SysLoginController.java @@ -2,6 +2,7 @@ package com.mcwl.web.controller.system; import com.mcwl.common.annotation.Anonymous; import com.mcwl.common.constant.Constants; +import com.mcwl.common.constant.QueueConstants; import com.mcwl.common.constant.RedisConstants; import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.common.core.domain.entity.SysMenu; @@ -12,12 +13,13 @@ import com.mcwl.common.core.domain.model.PhoneLoginBody; import com.mcwl.common.core.redis.RedisCache; import com.mcwl.common.utils.CodeUtils; import com.mcwl.common.utils.SecurityUtils; -import com.mcwl.common.utils.uuid.TelSmsUtils; +import com.mcwl.common.utils.StringUtils; import com.mcwl.framework.web.service.SysLoginService; import com.mcwl.framework.web.service.SysPermissionService; import com.mcwl.framework.web.service.TokenService; import com.mcwl.system.service.ISysMenuService; import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -51,11 +53,24 @@ public class SysLoginController @Autowired private RedisCache redisCache; + @Autowired + private RabbitTemplate rabbitTemplate; + @Anonymous @GetMapping("/getCode") public AjaxResult code(@RequestParam String phone){ + if (StringUtils.isEmpty(phone)){ + return AjaxResult.error("请输入手机号"); + } + + //校验验证码是否存在 + if (redisCache.hasKey(RedisConstants.CODE_PHONE+phone)){ + + return AjaxResult.error("请勿重复发送"); + } + //生成验证码 String s = CodeUtils.generateCaptcha(); @@ -67,7 +82,9 @@ public class SysLoginController // 构建 sendDataMap Map sendDataMap = new HashMap<>(); sendDataMap.put("code:", s); - TelSmsUtils.sendSms(phone,"SMS_460535072",sendDataMap); +// TelSmsUtils.sendSms(phone,"SMS_460535072",sendDataMap); + + rabbitTemplate.convertAndSend(QueueConstants.CODE_QUEUE,s); return AjaxResult.success(); diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/system/WXController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/WXController.java new file mode 100644 index 0000000..8c87da4 --- /dev/null +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/system/WXController.java @@ -0,0 +1,117 @@ +package com.mcwl.web.controller.system; + +import com.mcwl.common.annotation.Anonymous; +import com.mcwl.common.constant.CacheConstants; +import com.mcwl.common.core.domain.AjaxResult; +import com.mcwl.common.core.domain.entity.SysUser; +import com.mcwl.common.core.domain.model.LoginUser; +import com.mcwl.common.core.redis.RedisCache; +import com.mcwl.common.utils.uuid.IdUtils; +import com.mcwl.framework.web.service.SysPermissionService; +import com.mcwl.framework.web.service.TokenService; +import com.mcwl.system.domain.SysUserThirdAccount; +import com.mcwl.system.service.ISysUserThirdAccountService; +import com.mcwl.system.service.IWXService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +/** + * 对接微信扫码登录 + * + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +@RestController +@RequestMapping("/wx") +public class WXController { + + @Autowired + private RedisCache redisCache; + + @Resource + private ISysUserThirdAccountService iSysUserThirdAccountService; + + @Resource + private IWXService iwxService; + + @Resource + private TokenService tokenService; + + @Resource + private SysPermissionService permissionService; + + + /** + * 扫码登录用uuid生成 + */ + @Anonymous + @GetMapping("/uuid/get") + public AjaxResult getUUID() throws IOException { + AjaxResult ajax = AjaxResult.success(); + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.WX_OPENID_KEY + uuid; + redisCache.setCacheObject(verifyKey, null, 1, TimeUnit.MINUTES); + ajax.put("uuid", uuid); + return ajax; + } + + /** + * uuid绑定openid + */ + @Anonymous + @GetMapping("/uuid/bind/openid") + public AjaxResult bindOpenid(@RequestParam("code") String code, @RequestParam("uuid") String uuid) throws IOException { + AjaxResult ajax = AjaxResult.success(); + SysUserThirdAccount user = iwxService.getOpenid(code); + String openid = user.getOpenid(); + String wxNickName = user.getOpenName(); + String verifyKey = CacheConstants.WX_OPENID_KEY + uuid; + long expire = redisCache.getExpire(verifyKey); + redisCache.setCacheObject(verifyKey, openid); + if (expire > 0) { + redisCache.expire(verifyKey, expire, TimeUnit.SECONDS); + } + ajax.put("openid", openid); + ajax.put("wxNickName", wxNickName); + return ajax; + } + + /** + * uuid登录 + */ + @Anonymous + @GetMapping("/uuid/login") + public AjaxResult loginByOpenId(@RequestParam("uuid") String uuid) throws IOException { + AjaxResult ajax = AjaxResult.success(); + String verifyKey = CacheConstants.WX_OPENID_KEY + uuid; + String openid = redisCache.getCacheObject(verifyKey); + ajax.put("status", 0); + System.out.println("openid:{}" + openid); + if (openid != null) { + SysUser user = iSysUserThirdAccountService.selectUserByOpenId(openid); + System.out.println("用户:{}" + user); + if (user == null) { + System.out.println("用户不存在"); + return AjaxResult.error("用户不存在"); + } + LoginUser loginUser = new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); + // 生成token + String token = tokenService.createToken(loginUser); + ajax.put("token", token); + ajax.put("status", 1); + redisCache.deleteObject(verifyKey); + } + + return ajax; + } + +} diff --git a/mcwl-admin/src/main/resources/application-druid.yml b/mcwl-admin/src/main/resources/application-druid.yml index 52d6bdd..5f3b9b8 100644 --- a/mcwl-admin/src/main/resources/application-druid.yml +++ b/mcwl-admin/src/main/resources/application-druid.yml @@ -1,5 +1,22 @@ # 数据源配置 spring: + #mq + rabbitmq: + host: 1.13.246.108 + port: 5672 + username: guest + password: guest + virtualHost: / + listener: + simple: + prefetch: 1 # 每次之能获取一条 + acknowledge-mode: manual # 设置消费端手动ack确认 + retry: + enabled: true # 是否支持重试 + # 生产者配置 + publisher-confirm-type: correlated #确认消息已发送到交换机(Exchange) + publisher-returns: true #确认消息已发送到队列(Queue) + datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver @@ -59,3 +76,10 @@ spring: wall: config: multi-statement-allow: true + +# 公众号配置 +wechat: + # 应用ID + appid: wx82d4c3c96f0ffa5b + # 应用密钥 + secret: abbabcf1da711a3bbd95387ec83edcac diff --git a/mcwl-admin/src/main/resources/application.yml b/mcwl-admin/src/main/resources/application.yml index fcc5e86..4485d30 100644 --- a/mcwl-admin/src/main/resources/application.yml +++ b/mcwl-admin/src/main/resources/application.yml @@ -97,14 +97,48 @@ token: # 令牌有效期(默认30分钟) expireTime: 30 -# MyBatis配置 -mybatis: - # 搜索指定包别名 - typeAliasesPackage: com.mcwl.**.domain - # 配置mapper的扫描,找到所有的mapper.xml映射文件 +# MyBatis Plus配置 +mybatis-plus: + # 不支持多包, 如有需要可在注解配置 或 提升扫包等级 + # 例如 com.**.**.mapper + mapperPackage: com.mcwl.**.mapper + # 对应的 XML 文件位置 mapperLocations: classpath*:mapper/**/*Mapper.xml - # 加载全局的配置文件 - configLocation: classpath:mybatis/mybatis-config.xml + # 实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.mcwl.**.domain + # 启动时是否检查 MyBatis XML 文件的存在,默认不检查 + checkConfigLocation: false + configuration: + # 自动驼峰命名规则(camel case)映射 + mapUnderscoreToCamelCase: true + # MyBatis 自动映射策略 + # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 + autoMappingBehavior: PARTIAL + # MyBatis 自动映射时未知列或未知属性处理策 + # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 + autoMappingUnknownColumnBehavior: NONE + # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl + # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl + # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl + logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl + global-config: + # 是否打印 Logo banner + banner: false + dbConfig: + # 主键类型 + # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID + idType: ASSIGN_ID + # 逻辑已删除值 + logicDeleteValue: 2 + # 逻辑未删除值 + logicNotDeleteValue: 0 + # 字段验证策略之 insert,在 insert 的时候的字段验证策略 + # IGNORED 忽略 NOT_NULL 非NULL NOT_EMPTY 非空 DEFAULT 默认 NEVER 不加入 SQL + insertStrategy: NOT_NULL + # 字段验证策略之 update,在 update 的时候的字段验证策略 + updateStrategy: NOT_NULL + # 字段验证策略之 select,在 select 的时候的字段验证策略既 wrapper 根据内部 entity 生成的 where 条件 + where-strategy: NOT_NULL # PageHelper分页插件 pagehelper: diff --git a/mcwl-admin/src/main/resources/mybatis/mybatis-config.xml b/mcwl-admin/src/main/resources/mybatis/mybatis-config.xml deleted file mode 100644 index ac47c03..0000000 --- a/mcwl-admin/src/main/resources/mybatis/mybatis-config.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/mcwl-common/pom.xml b/mcwl-common/pom.xml index 7eaba4a..8efb183 100644 --- a/mcwl-common/pom.xml +++ b/mcwl-common/pom.xml @@ -293,6 +293,13 @@ 2.0.1 + + + com.baomidou + mybatis-plus-boot-starter + 3.5.0 + + diff --git a/mcwl-common/src/main/java/com/mcwl/common/constant/CacheConstants.java b/mcwl-common/src/main/java/com/mcwl/common/constant/CacheConstants.java index 7b6297c..aa05d09 100644 --- a/mcwl-common/src/main/java/com/mcwl/common/constant/CacheConstants.java +++ b/mcwl-common/src/main/java/com/mcwl/common/constant/CacheConstants.java @@ -2,7 +2,7 @@ package com.mcwl.common.constant; /** * 缓存的key 常量 - * + * * @author mcwl */ public class CacheConstants @@ -41,4 +41,11 @@ public class CacheConstants * 登录账户密码错误次数 redis key */ public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + + /** + * 微信openid redis key + */ + public static final String WX_OPENID_KEY = "wx_openid:"; + + public static final String WE_CHAT = "we_chat"; } diff --git a/mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java b/mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java new file mode 100644 index 0000000..f1449ed --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/constant/QueueConstants.java @@ -0,0 +1,15 @@ +package com.mcwl.common.constant; + +/** + * rabbitmq队列常量 + * + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +public class QueueConstants { + + //发送手机号验证码短信的mq队列 + public static final String CODE_QUEUE = "codeQueue"; +} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/config/MyBatisConfig.java b/mcwl-framework/src/main/java/com/mcwl/framework/config/MyBatisConfig.java index dd66524..cf36daa 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/config/MyBatisConfig.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/config/MyBatisConfig.java @@ -1,132 +1,153 @@ -package com.mcwl.framework.config; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import javax.sql.DataSource; -import org.apache.ibatis.io.VFS; -import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.core.type.classreading.CachingMetadataReaderFactory; -import org.springframework.core.type.classreading.MetadataReader; -import org.springframework.core.type.classreading.MetadataReaderFactory; -import org.springframework.util.ClassUtils; -import com.mcwl.common.utils.StringUtils; - -/** - * Mybatis支持*匹配扫描包 - * - * @author mcwl - */ -@Configuration -public class MyBatisConfig -{ - @Autowired - private Environment env; - - static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; - - public static String setTypeAliasesPackage(String typeAliasesPackage) - { - ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); - MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); - List allResult = new ArrayList(); - try - { - for (String aliasesPackage : typeAliasesPackage.split(",")) - { - List result = new ArrayList(); - aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX - + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; - Resource[] resources = resolver.getResources(aliasesPackage); - if (resources != null && resources.length > 0) - { - MetadataReader metadataReader = null; - for (Resource resource : resources) - { - if (resource.isReadable()) - { - metadataReader = metadataReaderFactory.getMetadataReader(resource); - try - { - result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); - } - catch (ClassNotFoundException e) - { - e.printStackTrace(); - } - } - } - } - if (result.size() > 0) - { - HashSet hashResult = new HashSet(result); - allResult.addAll(hashResult); - } - } - if (allResult.size() > 0) - { - typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); - } - else - { - throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); - } - } - catch (IOException e) - { - e.printStackTrace(); - } - return typeAliasesPackage; - } - - public Resource[] resolveMapperLocations(String[] mapperLocations) - { - ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); - List resources = new ArrayList(); - if (mapperLocations != null) - { - for (String mapperLocation : mapperLocations) - { - try - { - Resource[] mappers = resourceResolver.getResources(mapperLocation); - resources.addAll(Arrays.asList(mappers)); - } - catch (IOException e) - { - // ignore - } - } - } - return resources.toArray(new Resource[resources.size()]); - } - - @Bean - public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception - { - String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); - String mapperLocations = env.getProperty("mybatis.mapperLocations"); - String configLocation = env.getProperty("mybatis.configLocation"); - typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); - VFS.addImplClass(SpringBootVFS.class); - - final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); - sessionFactory.setDataSource(dataSource); - sessionFactory.setTypeAliasesPackage(typeAliasesPackage); - sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); - sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); - return sessionFactory.getObject(); - } -} +//package com.mcwl.framework.config; +// +//import com.baomidou.mybatisplus.autoconfigure.SpringBootVFS; +//import org.apache.ibatis.io.VFS; +//import org.apache.ibatis.session.SqlSessionFactory; +//import org.mybatis.spring.SqlSessionFactoryBean; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.core.env.Environment; +//import org.springframework.core.io.DefaultResourceLoader; +//import org.springframework.core.io.Resource; +//import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +//import org.springframework.core.io.support.ResourcePatternResolver; +//import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +//import org.springframework.core.type.classreading.MetadataReader; +//import org.springframework.core.type.classreading.MetadataReaderFactory; +//import org.springframework.util.ClassUtils; +//import org.springframework.util.StringUtils; +// +//import javax.sql.DataSource; +//import java.io.IOException; +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.HashSet; +//import java.util.List; +// +///** +// * Mybatis支持*匹配扫描包 +// * +// * @author mcwl +// */ +//@Configuration +//public class MyBatisConfig +//{ +// @Autowired +// private Environment env; +// +// static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; +// +// public static String setTypeAliasesPackage(String typeAliasesPackage) +// { +// ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); +// MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); +// List allResult = new ArrayList(); +// try +// { +// for (String aliasesPackage : typeAliasesPackage.split(",")) +// { +// List result = new ArrayList(); +// aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +// + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; +// Resource[] resources = resolver.getResources(aliasesPackage); +// if (resources != null && resources.length > 0) +// { +// MetadataReader metadataReader = null; +// for (Resource resource : resources) +// { +// if (resource.isReadable()) +// { +// metadataReader = metadataReaderFactory.getMetadataReader(resource); +// try +// { +// result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); +// } +// catch (ClassNotFoundException e) +// { +// e.printStackTrace(); +// } +// } +// } +// } +// if (result.size() > 0) +// { +// HashSet hashResult = new HashSet(result); +// allResult.addAll(hashResult); +// } +// } +// if (allResult.size() > 0) +// { +// typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); +// } +// else +// { +// throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); +// } +// } +// catch (IOException e) +// { +// e.printStackTrace(); +// } +// return typeAliasesPackage; +// } +// +// public Resource[] resolveMapperLocations(String[] mapperLocations) +// { +// ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); +// List resources = new ArrayList(); +// if (mapperLocations != null) +// { +// for (String mapperLocation : mapperLocations) +// { +// try +// { +// Resource[] mappers = resourceResolver.getResources(mapperLocation); +// resources.addAll(Arrays.asList(mappers)); +// } +// catch (IOException e) +// { +// // ignore +// } +// } +// } +// return resources.toArray(new Resource[resources.size()]); +// } +// +// @Bean +// public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception +// { +// String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); +// String mapperLocations = env.getProperty("mybatis.mapperLocations"); +// String configLocation = env.getProperty("mybatis.configLocation"); +// typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); +// VFS.addImplClass(SpringBootVFS.class); +// +// final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); +// sessionFactory.setDataSource(dataSource); +// sessionFactory.setTypeAliasesPackage(typeAliasesPackage); +// sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); +// sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); +// return sessionFactory.getObject(); +// } +// +//// @Bean +//// public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception +//// { +//// String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); +//// String mapperLocations = env.getProperty("mybatis.mapperLocations"); +//// String configLocation = env.getProperty("mybatis.configLocation"); +//// typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); +//// VFS.addImplClass(SpringBootVFS.class); +//// +//// //final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); +//// // SqlSessionFactoryBean 替换为 ⬇ MybatisSqlSessionFactoryBean +//// final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); +//// sessionFactory.setDataSource(dataSource); +//// sessionFactory.setTypeAliasesPackage(typeAliasesPackage); +//// sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); +//// sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); +//// return sessionFactory.getObject(); +//// } +// +//} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/config/MybatisPlusConfig.java b/mcwl-framework/src/main/java/com/mcwl/framework/config/MybatisPlusConfig.java new file mode 100644 index 0000000..3c7e5a9 --- /dev/null +++ b/mcwl-framework/src/main/java/com/mcwl/framework/config/MybatisPlusConfig.java @@ -0,0 +1,60 @@ +package com.mcwl.framework.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * MybatisPlus + * @author DaiZibo + * @date 2024/12/31 + * @apiNote + */ + + +@EnableTransactionManagement(proxyTargetClass = true) +@Configuration +public class MybatisPlusConfig { + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + // 阻断插件 + interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); + return interceptor; + } + + /** + * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html + */ + public PaginationInnerInterceptor paginationInnerInterceptor() { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 设置数据库类型为mysql + paginationInnerInterceptor.setDbType(DbType.MYSQL); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInnerInterceptor.setMaxLimit(-1L); + return paginationInnerInterceptor; + } + + /** + * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { + return new OptimisticLockerInnerInterceptor(); + } + + /** + * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html + */ + public BlockAttackInnerInterceptor blockAttackInnerInterceptor() { + return new BlockAttackInnerInterceptor(); + } +} diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/web/service/PermissionService.java b/mcwl-framework/src/main/java/com/mcwl/framework/web/service/PermissionService.java index edfdf0f..4790c4f 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/web/service/PermissionService.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/web/service/PermissionService.java @@ -1,14 +1,15 @@ package com.mcwl.framework.web.service; -import java.util.Set; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; import com.mcwl.common.constant.Constants; import com.mcwl.common.core.domain.entity.SysRole; import com.mcwl.common.core.domain.model.LoginUser; import com.mcwl.common.utils.SecurityUtils; import com.mcwl.common.utils.StringUtils; import com.mcwl.framework.security.context.PermissionContextHolder; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.Set; /** * McWl首创 自定义权限实现,ss取自SpringSecurity首字母 diff --git a/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserThirdAccount.java b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserThirdAccount.java new file mode 100644 index 0000000..68d4b53 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/domain/SysUserThirdAccount.java @@ -0,0 +1,106 @@ +package com.mcwl.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 第三方登录表 + * + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +@TableName("sys_user_third_account") +public class SysUserThirdAccount { + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + @TableField(value = "user_id") + private Long userId; + + /** + * 第三方唯一ID + */ + @TableField(value = "openid") + private String openid; + + /** + * 第三方昵称 + */ + @TableField(value = "open_name") + private String openName; + + /** + * 第三方头像 + */ + @TableField(value = "src") + private String src; + + /** + * 第三方(qq/微信) + */ + @TableField(value = "bind_type") + private String bindType; + + /** + * 标志是否绑定 + */ + @TableField(value = "bind_flag") + private String bindFlag; + + /** + * 绑定时间 + */ + @TableField(value = "bind_date") + private Date bindDate; + + /** + * 创建者 + */ + @TableField(value = "create_by") + private String createBy; + + /** + * 创建时间 + */ + @TableField(value = "create_time") + private Date createTime; + + /** + * 更新着 + */ + @TableField(value = "update_by") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(value = "update_time") + private Date updateTime; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableField(value = "del_flag") + private Integer delFlag; +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserThirdAccountMapper.java b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserThirdAccountMapper.java new file mode 100644 index 0000000..8f33ec2 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/mapper/SysUserThirdAccountMapper.java @@ -0,0 +1,13 @@ +package com.mcwl.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.system.domain.SysUserThirdAccount; + +/** + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +public interface SysUserThirdAccountMapper extends BaseMapper { +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserThirdAccountService.java b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserThirdAccountService.java new file mode 100644 index 0000000..91230cc --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/ISysUserThirdAccountService.java @@ -0,0 +1,15 @@ +package com.mcwl.system.service; + +import com.mcwl.common.core.domain.entity.SysUser; + +/** + * 第三方登录表 + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +public interface ISysUserThirdAccountService { + SysUser selectUserByOpenId(String openid); + +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/IWXService.java b/mcwl-system/src/main/java/com/mcwl/system/service/IWXService.java new file mode 100644 index 0000000..a2a1a3b --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/IWXService.java @@ -0,0 +1,14 @@ +package com.mcwl.system.service; + +import com.mcwl.system.domain.SysUserThirdAccount; + +/** + * 微信登录业务层 + * @author DaiZibo + * @date 2024/12/31 + * @apiNote + */ + +public interface IWXService { + SysUserThirdAccount getOpenid(String code); +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/impl/IWXServiceImpl.java b/mcwl-system/src/main/java/com/mcwl/system/service/impl/IWXServiceImpl.java new file mode 100644 index 0000000..efc26f7 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/impl/IWXServiceImpl.java @@ -0,0 +1,67 @@ +package com.mcwl.system.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.mcwl.system.domain.SysUserThirdAccount; +import com.mcwl.system.service.IWXService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; + +/** + * 微信登录 业务处理层 + * + * @author DaiZibo + * @date 2024/12/31 + * @apiNote + */ + +@Service +public class IWXServiceImpl implements IWXService { + + @Value("${wechat.appid}") + private String appId; + + @Value("${wechat.secret}") + private String secret; + + @Override + public SysUserThirdAccount getOpenid(String code) { + + RestTemplate restTemplate = new RestTemplate(); + JSONObject jsonData = null; + + // 构建获取access_token的URL + String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + + "appid=" + appId + + "&secret=" + secret + + "&code=" + code + + "&grant_type=authorization_code"; + + System.out.println("url: " + url); + ResponseEntity responseEntity = restTemplate.getForEntity(url, String.class); + + System.out.println("responseEntity: " + responseEntity); + if (responseEntity.getStatusCodeValue() == 200 && responseEntity.getBody() != null) { + jsonData = JSONObject.parseObject(responseEntity.getBody()); + } + + String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?lang=zh_CN" + + "&access_token=" + jsonData.getString("access_token") + + "&openid=" + jsonData.getString("openid"); + + ResponseEntity responseUserEntity = restTemplate.getForEntity(userInfoUrl, String.class); + if (responseUserEntity.getStatusCodeValue() == 200 && responseUserEntity.getBody() != null) { + JSONObject jsonUserData = JSONObject.parseObject(new String(responseUserEntity.getBody().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + System.out.println("jsonUserData: " + jsonUserData); + SysUserThirdAccount sysUserThirdAccount = new SysUserThirdAccount(); + sysUserThirdAccount.setOpenid(jsonUserData.getString("openid")); + sysUserThirdAccount.setOpenName(jsonUserData.getString("nickname")); + return sysUserThirdAccount; + } + + return null; + } +} diff --git a/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserThirdAccountServiceImpl.java b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserThirdAccountServiceImpl.java new file mode 100644 index 0000000..b9a46d2 --- /dev/null +++ b/mcwl-system/src/main/java/com/mcwl/system/service/impl/SysUserThirdAccountServiceImpl.java @@ -0,0 +1,50 @@ +package com.mcwl.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mcwl.common.core.domain.entity.SysUser; +import com.mcwl.system.domain.SysUserThirdAccount; +import com.mcwl.system.mapper.SysUserThirdAccountMapper; +import com.mcwl.system.service.ISysUserService; +import com.mcwl.system.service.ISysUserThirdAccountService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 第三方登录表 业务层处理 + * @author DaiZibo + * @date 2024/12/30 + * @apiNote + */ + +@Service +public class SysUserThirdAccountServiceImpl implements ISysUserThirdAccountService { + + + @Resource + private ISysUserService sysUserService; + + @Resource + private SysUserThirdAccountMapper sysUserThirdAccountMapper; + + @Override + public SysUser selectUserByOpenId(String openid) { + + //根据openid查询第三方登录表数据 + LambdaQueryWrapper sysUserThirdAccountLambdaQueryWrapper = new LambdaQueryWrapper<>(); + sysUserThirdAccountLambdaQueryWrapper.eq(SysUserThirdAccount::getBindType,"WeChat"); + sysUserThirdAccountLambdaQueryWrapper.eq(SysUserThirdAccount::getOpenid,openid); + sysUserThirdAccountLambdaQueryWrapper.eq(SysUserThirdAccount::getDelFlag,0); + SysUserThirdAccount sysUserThirdAccount = sysUserThirdAccountMapper.selectOne(sysUserThirdAccountLambdaQueryWrapper); + + //未查询到返回空对象 + if (sysUserThirdAccount == null){ + + return new SysUser(); + } + + //根据信息查登录人信息 + return sysUserService.selectUserById(sysUserThirdAccount.getUserId()); + } + +} diff --git a/pom.xml b/pom.xml index bb609ff..b77ba50 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,13 @@ + + + com.baomidou + mybatis-plus-boot-starter + 3.5.0 + + org.springframework From a18a478b366c3254a6a1f1376d1203847d04cd9f Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Tue, 31 Dec 2024 15:05:15 +0800 Subject: [PATCH 8/9] =?UTF-8?q?style:=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcwl-admin/pom.xml | 12 ++++ .../main/java/com/mcwl/McWlApplication.java | 2 + .../myInvitation/ConsumeController.java | 4 +- .../myInvitation/InvitationController.java | 5 +- .../src/main/resources/application-druid.yml | 4 +- .../com/mcwl/memberCenter/MemberTest.java | 24 ++++++++ mcwl-memberCenter/pom.xml | 41 +++++++++++++ .../com/mcwl/memberCenter/domain/Member.java | 33 +++++++++++ .../mcwl/memberCenter/domain/UserMember.java | 59 +++++++++++++++++++ .../mcwl/memberCenter/enums/MemberMenu.java | 17 ++++++ .../memberCenter/mapper/MemberMapper.java | 11 ++++ .../memberCenter/mapper/UserMemberMapper.java | 9 +++ .../memberCenter/service/MemberService.java | 11 ++++ .../service/UserMemberService.java | 7 +++ .../service/impl/MemberServiceImpl.java | 14 +++++ .../service/impl/UserMemberServiceImpl.java | 11 ++++ .../main/resources/mapper/MemberMapper.xml | 9 +++ .../mcwl/myInvitation/domain/Commission.java | 3 + .../com/mcwl/myInvitation/domain/Consume.java | 3 + .../mcwl/myInvitation/domain/Invitation.java | 3 + pom.xml | 1 + 21 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java create mode 100644 mcwl-memberCenter/pom.xml create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/UserMemberMapper.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java create mode 100644 mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java create mode 100644 mcwl-memberCenter/src/main/resources/mapper/MemberMapper.xml diff --git a/mcwl-admin/pom.xml b/mcwl-admin/pom.xml index 85736cc..d54670c 100644 --- a/mcwl-admin/pom.xml +++ b/mcwl-admin/pom.xml @@ -62,6 +62,18 @@ 3.8.8 + + com.mcwl + mcwl-memberCenter + 3.8.8 + + + + org.springframework.boot + spring-boot-starter-test + test + + com.mcwl diff --git a/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java b/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java index bd02bff..9b2be11 100644 --- a/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java +++ b/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java @@ -1,5 +1,6 @@ package com.mcwl; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @@ -10,6 +11,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; * @author mcwl */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +@MapperScan(basePackages = "com.mcwl") public class McWlApplication { public static void main(String[] args) diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java index ad4868f..dbec591 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/ConsumeController.java @@ -1,9 +1,11 @@ package com.mcwl.web.controller.myInvitation; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -@RestController("/consume") +@RestController() +@RequestMapping("/consume") public class ConsumeController { diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java index 8043992..1d09926 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/myInvitation/InvitationController.java @@ -8,15 +8,16 @@ import com.mcwl.myInvitation.domain.Invitation; import com.mcwl.myInvitation.service.InvitationService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import static com.mcwl.common.core.domain.AjaxResult.success; -@RestController("/invitation") +@RestController() @RequiredArgsConstructor - +@RequestMapping("/invitation") public class InvitationController { private final InvitationService invitationService; diff --git a/mcwl-admin/src/main/resources/application-druid.yml b/mcwl-admin/src/main/resources/application-druid.yml index 98ecb56..abfa090 100644 --- a/mcwl-admin/src/main/resources/application-druid.yml +++ b/mcwl-admin/src/main/resources/application-druid.yml @@ -61,9 +61,9 @@ spring: multi-statement-allow: true mybatis-plus: # Mapper XML文件位置 - mapper-locations: classpath:mapper/**/*.xml + mapper-locations: classpath*:mapper/**/*.xml # 配置实体类所在的包名,MyBatis-Plus会自动扫描并注册为别名 - type-aliases-package: com.mcwl.**.mapper + type-aliases-package: com.mcwl.**.domain # 全局配置 global-config: db-config: diff --git a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java new file mode 100644 index 0000000..88b9416 --- /dev/null +++ b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberTest.java @@ -0,0 +1,24 @@ +package com.mcwl.memberCenter; + +import com.mcwl.McWlApplication; +import com.mcwl.memberCenter.service.MemberService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = McWlApplication.class) +public class MemberTest { + + + @Autowired + private MemberService memberService; + + @Test + public void memberServiceTest() { + System.out.println(memberService.list()); + } + +} diff --git a/mcwl-memberCenter/pom.xml b/mcwl-memberCenter/pom.xml new file mode 100644 index 0000000..4992997 --- /dev/null +++ b/mcwl-memberCenter/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + com.mcwl + mcwl + 3.8.8 + + + mcwl-memberCenter + + + 8 + 8 + UTF-8 + 3.5.2 + + + + + + com.mcwl + mcwl-common + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + \ No newline at end of file diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java new file mode 100644 index 0000000..735803a --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/Member.java @@ -0,0 +1,33 @@ +package com.mcwl.memberCenter.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Objects; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("mem_member") +public class Member extends BaseEntity { + + @TableId + private Long id; + + // 会员类型 + private String member_type; + + // 会员名称 + private String member_name; + + // 会员价格 + private Double unit_price; + + // 会员原价 + private Double original_price; + + // 删除标志(0代表存在 2代表删除) + private String delFlag; +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java new file mode 100644 index 0000000..6ec452f --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/domain/UserMember.java @@ -0,0 +1,59 @@ +package com.mcwl.memberCenter.domain; + + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mcwl.common.core.domain.BaseEntity; +import com.mcwl.memberCenter.enums.MemberMenu; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("mem_member") +public class UserMember extends BaseEntity { + + @TableId + private Long id; + + // 用户ID + private Long userId; + + // 会员ID + private Long memberId; + + // 会员开始时间 + private Date startDate; + + // 会员结束时间 + private Date endDate; + + // 会员积分 + private Integer points; + + // 订阅状态 active(活跃)、inactive(非活跃)、pending(待支付)和expired(过期) + @EnumValue + private MemberMenu subscriptionStatus; + + // 支付方式 + private String paymentMethod; + + // 上次支付时间 + private Date lastPaymentDate; + + // 下次计费时间 + private Date nextBillingDate; + + // 上次登录时间 + private Date lastLoginDate; + + // 状态(0:正常 1:禁用) + private String status; + + // 删除标志(0代表存在 2代表删除) + private String delFlag; + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java new file mode 100644 index 0000000..aabb0f9 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/enums/MemberMenu.java @@ -0,0 +1,17 @@ +package com.mcwl.memberCenter.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum MemberMenu { + MEMBER_CENTER_ACTIVE("active", "活跃"), + MEMBER_CENTER_INACTIVE("inactive", "非活跃"), + MEMBER_CENTER_PENDING("pending", "待支付"), + MEMBER_CENTER_EXPIRED("expired", "过期"); + + private final String name; + + private final String value; +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java new file mode 100644 index 0000000..c127692 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/MemberMapper.java @@ -0,0 +1,11 @@ +package com.mcwl.memberCenter.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.memberCenter.domain.Member; +import org.apache.ibatis.annotations.Mapper; + +//@Mapper +public interface MemberMapper extends BaseMapper { + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/UserMemberMapper.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/UserMemberMapper.java new file mode 100644 index 0000000..80311c6 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/mapper/UserMemberMapper.java @@ -0,0 +1,9 @@ +package com.mcwl.memberCenter.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mcwl.memberCenter.domain.UserMember; +import org.apache.ibatis.annotations.Mapper; + +//@Mapper +public interface UserMemberMapper extends BaseMapper { +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java new file mode 100644 index 0000000..41aaeaf --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/MemberService.java @@ -0,0 +1,11 @@ +package com.mcwl.memberCenter.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.memberCenter.domain.Member; + +import java.util.List; + +public interface MemberService extends IService { + + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java new file mode 100644 index 0000000..c079952 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/UserMemberService.java @@ -0,0 +1,7 @@ +package com.mcwl.memberCenter.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mcwl.memberCenter.domain.UserMember; + +public interface UserMemberService extends IService { +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java new file mode 100644 index 0000000..13dda34 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/MemberServiceImpl.java @@ -0,0 +1,14 @@ +package com.mcwl.memberCenter.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.memberCenter.domain.Member; +import com.mcwl.memberCenter.mapper.MemberMapper; +import com.mcwl.memberCenter.service.MemberService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MemberServiceImpl extends ServiceImpl implements MemberService { + +} diff --git a/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java new file mode 100644 index 0000000..2f9f891 --- /dev/null +++ b/mcwl-memberCenter/src/main/java/com/mcwl/memberCenter/service/impl/UserMemberServiceImpl.java @@ -0,0 +1,11 @@ +package com.mcwl.memberCenter.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mcwl.memberCenter.domain.UserMember; +import com.mcwl.memberCenter.mapper.UserMemberMapper; +import com.mcwl.memberCenter.service.UserMemberService; +import org.springframework.stereotype.Service; + +@Service +public class UserMemberServiceImpl extends ServiceImpl implements UserMemberService { +} diff --git a/mcwl-memberCenter/src/main/resources/mapper/MemberMapper.xml b/mcwl-memberCenter/src/main/resources/mapper/MemberMapper.xml new file mode 100644 index 0000000..ea8093a --- /dev/null +++ b/mcwl-memberCenter/src/main/resources/mapper/MemberMapper.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java index bb7cd4a..6d3307e 100644 --- a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Commission.java @@ -27,6 +27,9 @@ public class Commission extends BaseEntity { // 支付状态 private Integer payStatus; + // 删除标志(0代表存在 2代表删除) + private String delFlag; + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java index 1cd9935..4b661ac 100644 --- a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Consume.java @@ -25,6 +25,9 @@ public class Consume extends BaseEntity { // 消费时间 private Date consumeDate; + // 删除标志(0代表存在 2代表删除) + private String delFlag; + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java index 3076d14..5460377 100644 --- a/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java +++ b/mcwl-myInvitation/src/main/java/com/mcwl/myInvitation/domain/Invitation.java @@ -25,6 +25,9 @@ public class Invitation extends BaseEntity { // 邀请码 private String invitationCode; + // 删除标志(0代表存在 2代表删除) + private String delFlag; + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/pom.xml b/pom.xml index bb609ff..c2d583d 100644 --- a/pom.xml +++ b/pom.xml @@ -230,6 +230,7 @@ mcwl-common mcwl-myInvitation mcwl-resource + mcwl-memberCenter pom From 37b0e808927740c357e11088a32fc659be524547 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Tue, 31 Dec 2024 15:12:59 +0800 Subject: [PATCH 9/9] =?UTF-8?q?chore=EF=BC=9A=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mcwl/McWlApplication.java | 1 - .../src/main/resources/application-druid.yml | 18 ------------------ mcwl-admin/src/main/resources/application.yml | 9 ++++++--- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java b/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java index 9b2be11..4dd82af 100644 --- a/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java +++ b/mcwl-admin/src/main/java/com/mcwl/McWlApplication.java @@ -11,7 +11,6 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; * @author mcwl */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) -@MapperScan(basePackages = "com.mcwl") public class McWlApplication { public static void main(String[] args) diff --git a/mcwl-admin/src/main/resources/application-druid.yml b/mcwl-admin/src/main/resources/application-druid.yml index 7ddbcfe..a1c90fd 100644 --- a/mcwl-admin/src/main/resources/application-druid.yml +++ b/mcwl-admin/src/main/resources/application-druid.yml @@ -84,21 +84,3 @@ wechat: # 应用密钥 secret: abbabcf1da711a3bbd95387ec83edcac -mybatis-plus: - # Mapper XML文件位置 - mapper-locations: classpath*:mapper/**/*.xml - # 配置实体类所在的包名,MyBatis-Plus会自动扫描并注册为别名 - type-aliases-package: com.mcwl.**.domain - # 全局配置 - global-config: - db-config: - # 主键生成策略 - id-type: auto - # 开启驼峰命名规则转换 - capital-mode: true - # 配置逻辑删除相关属性 - logic-delete-field: del_flag - logic-delete-value: '2' - logic-not-delete-value: '0' - # 数据库字段下划线命名规则 - table-underline: true diff --git a/mcwl-admin/src/main/resources/application.yml b/mcwl-admin/src/main/resources/application.yml index 4485d30..4988aad 100644 --- a/mcwl-admin/src/main/resources/application.yml +++ b/mcwl-admin/src/main/resources/application.yml @@ -127,11 +127,14 @@ mybatis-plus: dbConfig: # 主键类型 # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID - idType: ASSIGN_ID + idType: auto + logic-delete-field: del_flag # 逻辑已删除值 - logicDeleteValue: 2 + logicDeleteValue: '2' # 逻辑未删除值 - logicNotDeleteValue: 0 + logicNotDeleteValue: '0' + # 数据库字段下划线命名规则 + table-underline: true # 字段验证策略之 insert,在 insert 的时候的字段验证策略 # IGNORED 忽略 NOT_NULL 非NULL NOT_EMPTY 非空 DEFAULT 默认 NEVER 不加入 SQL insertStrategy: NOT_NULL