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-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 b63b0df..7eaba4a 100644
--- a/mcwl-common/pom.xml
+++ b/mcwl-common/pom.xml
@@ -286,6 +286,13 @@
javax.servlet-api
+
+
+ com.aliyun
+ dysmsapi20170525
+ 2.0.1
+
+
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/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/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-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-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/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资源中心模块
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
+
+
diff --git a/pom.xml b/pom.xml
index aa2fb2f..bb609ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -228,6 +228,7 @@
mcwl-quartz
mcwl-generator
mcwl-common
+ mcwl-myInvitation
mcwl-resource
pom
diff --git a/sql/mysql.sql b/sql/mysql.sql
index d696bef..4fd1ecf 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -1,7 +1,6 @@
-- ----------------------------
-- 0、 xxx
-- ----------------------------
-
-- create table xxx
-- (
-- post_id bigint(20) not null auto_increment comment '岗位ID',