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 extends Payload>[] 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 extends Payload>[] 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 extends Payload>[] 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 extends GrantedAuthority> 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