diff --git a/muyu-common/pom.xml b/muyu-common/pom.xml
index 07d68ce..907c08f 100644
--- a/muyu-common/pom.xml
+++ b/muyu-common/pom.xml
@@ -77,18 +77,18 @@
mysql-connector-java
8.0.33
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.5.4.1
+
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.2
-
-
- com.github.pagehelper
- pagehelper-spring-boot-starter
- 1.4.1
-
org.springframework.boot
@@ -104,6 +104,13 @@
org.projectlombok
lombok
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
diff --git a/muyu-common/src/main/java/com/muyu/common/config/MybatisPlusConfig.java b/muyu-common/src/main/java/com/muyu/common/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..5a6ee89
--- /dev/null
+++ b/muyu-common/src/main/java/com/muyu/common/config/MybatisPlusConfig.java
@@ -0,0 +1,30 @@
+package com.muyu.common.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author DongZl
+ * @description: Mybatis-Plus配置
+ * @Date 2024-1-10 下午 05:12
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+ public MybatisPlusConfig () {
+ System.out.println("初始化-----------");
+ }
+
+ /**
+ * 添加分页插件
+ */
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+ return interceptor;
+ }
+}
diff --git a/muyu-common/src/main/java/com/muyu/common/domain/UserInfo.java b/muyu-common/src/main/java/com/muyu/common/domain/UserInfo.java
new file mode 100644
index 0000000..00b55eb
--- /dev/null
+++ b/muyu-common/src/main/java/com/muyu/common/domain/UserInfo.java
@@ -0,0 +1,55 @@
+package com.muyu.common.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 com.muyu.common.domain.request.user.UserAddReq;
+import com.muyu.common.utils.IdUtils;
+import com.muyu.common.utils.SecurityUtils;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author DongZl
+ * @description: 用户信息
+ * @Date 2024-1-10 下午 03:35
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName(value = "user_info")
+public class UserInfo {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+ /**
+ * 用户名
+ */
+ @TableField(value = "user_name")
+ private String userName;
+ /**
+ * 密码
+ */
+ private String password;
+ /**
+ * 盐
+ */
+ private String salt;
+
+ public static UserInfo addBuild (UserAddReq userAddReq) {
+ String salt = IdUtils.genId();
+ String passwordSalt = SecurityUtils.encryptPassword(userAddReq.getPassword(), salt);
+ return UserInfo.builder()
+ .userName(userAddReq.getUserName())
+ .password(passwordSalt)
+ .salt(salt)
+ .build();
+ }
+}
diff --git a/muyu-common/src/main/java/com/muyu/common/domain/request/user/UserAddReq.java b/muyu-common/src/main/java/com/muyu/common/domain/request/user/UserAddReq.java
new file mode 100644
index 0000000..a8c17b5
--- /dev/null
+++ b/muyu-common/src/main/java/com/muyu/common/domain/request/user/UserAddReq.java
@@ -0,0 +1,32 @@
+package com.muyu.common.domain.request.user;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * @author DongZl
+ * @description: 用户添加请求对象
+ * @Date 2024-1-10 下午 08:02
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserAddReq {
+
+ @NotEmpty(message = "用户名称不可为空")
+ @Pattern(regexp = "(?=.*[A-Za-z]\\d).{6,16}$", message = "用户名称不合法,因为6-16位的大小写英文和数字组成")
+ private String userName;
+
+ @NotEmpty(message = "用户密码不可为空")
+ @Pattern(regexp = "(?=.*[A-Za-z]\\d).{8,16}$", message = "用户密码不合法,因为8-16位的大小写英文和数字组成")
+ private String password;
+}
diff --git a/muyu-common/src/main/java/com/muyu/common/handler/GlobalExceptionHandler.java b/muyu-common/src/main/java/com/muyu/common/handler/GlobalExceptionHandler.java
new file mode 100644
index 0000000..0205af9
--- /dev/null
+++ b/muyu-common/src/main/java/com/muyu/common/handler/GlobalExceptionHandler.java
@@ -0,0 +1,31 @@
+package com.muyu.common.handler;
+
+import com.alibaba.fastjson.JSONObject;
+import com.muyu.common.result.Result;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * @author DongZl
+ * @description: 全局异常处理
+ * @Date 2024-1-10 下午 08:49
+ */
+@RestControllerAdvice
+@Configuration
+public class GlobalExceptionHandler {
+
+ @ExceptionHandler(value = MethodArgumentNotValidException.class)
+ public Result runtimeException (MethodArgumentNotValidException exception) {
+ return Result.error(
+ JSONObject.toJSONString(
+ exception.getBindingResult().getAllErrors()
+ .stream()
+ .map(ObjectError::getDefaultMessage)
+ .toList()
+ )
+ );
+ }
+}
diff --git a/muyu-common/src/main/java/com/muyu/common/utils/IdUtils.java b/muyu-common/src/main/java/com/muyu/common/utils/IdUtils.java
new file mode 100644
index 0000000..b2a0487
--- /dev/null
+++ b/muyu-common/src/main/java/com/muyu/common/utils/IdUtils.java
@@ -0,0 +1,19 @@
+package com.muyu.common.utils;
+
+import java.util.UUID;
+
+/**
+ * @author DongZl
+ * @description: ID生成工具类
+ * @Date 2024-1-10 下午 08:26
+ */
+public class IdUtils {
+
+ /**
+ * 生成UUID
+ * @return UUID
+ */
+ public static String genId(){
+ return UUID.randomUUID().toString().replace("-", "");
+ }
+}
diff --git a/muyu-common/src/main/java/com/muyu/common/utils/SecurityUtils.java b/muyu-common/src/main/java/com/muyu/common/utils/SecurityUtils.java
new file mode 100644
index 0000000..a946ec5
--- /dev/null
+++ b/muyu-common/src/main/java/com/muyu/common/utils/SecurityUtils.java
@@ -0,0 +1,54 @@
+package com.muyu.common.utils;
+
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+
+/**
+ * 安全服务工具类
+ *
+ * @author ruoyi
+ */
+public class SecurityUtils {
+
+
+ /**
+ * 生成BCryptPasswordEncoder密码
+ *
+ * @param password 密码
+ *
+ * @return 加密字符串
+ */
+ public static String encryptPassword (String password, String salt) {
+ return encryptMD5(password, salt);
+ }
+
+ /**
+ * 判断密码是否相同
+ *
+ * @param rawPassword 真实密码
+ * @param encodedPassword 加密后字符
+ *
+ * @return 结果
+ */
+ public static boolean matchesPassword (String rawPassword, String salt, String encodedPassword) {
+ return encryptMD5(rawPassword, salt).equals(encodedPassword);
+ }
+
+ /**
+ * 计算字符串的MD5加密值,并返回Base64编码的字符串。
+ * @param password 要加密的字符串
+ * @return 加密后的Base64编码字符串
+ */
+ public static String encryptMD5(String password, String salt) {
+ try {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update((password + salt).getBytes()); // 加盐处理
+ byte[] digest = md.digest();
+ return Base64.getEncoder().encodeToString(digest);
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/muyu-modules/muyu-system/src/main/java/com/muyu/system/SystemApplication.java b/muyu-modules/muyu-system/src/main/java/com/muyu/system/SystemApplication.java
index cb4f21d..cb4b246 100644
--- a/muyu-modules/muyu-system/src/main/java/com/muyu/system/SystemApplication.java
+++ b/muyu-modules/muyu-system/src/main/java/com/muyu/system/SystemApplication.java
@@ -1,9 +1,13 @@
package com.muyu.system;
+import com.muyu.common.config.MybatisPlusConfig;
+import com.muyu.common.handler.GlobalExceptionHandler;
+import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Import;
/**
* @author DongZl
@@ -12,6 +16,8 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients( basePackages = {"com.muyu.**"})
@EnableDiscoveryClient
+@MapperScan("com.muyu.system.mapper")
+@Import({MybatisPlusConfig.class, GlobalExceptionHandler.class})
public class SystemApplication {
public static void main(String[] args) {
SpringApplication.run(SystemApplication.class);
diff --git a/muyu-modules/muyu-system/src/main/java/com/muyu/system/controller/UserInfoController.java b/muyu-modules/muyu-system/src/main/java/com/muyu/system/controller/UserInfoController.java
new file mode 100644
index 0000000..b2ff906
--- /dev/null
+++ b/muyu-modules/muyu-system/src/main/java/com/muyu/system/controller/UserInfoController.java
@@ -0,0 +1,37 @@
+package com.muyu.system.controller;
+
+import com.muyu.common.domain.UserInfo;
+import com.muyu.common.domain.request.user.UserAddReq;
+import com.muyu.common.result.Result;
+import com.muyu.system.service.UserInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author DongZl
+ * @description: 用户控制层
+ * @Date 2024-1-10 下午 07:57
+ */
+@RestController
+@RequestMapping("/user")
+public class UserInfoController {
+
+ @Autowired
+ private UserInfoService userInfoService;
+
+ /**
+ * 添加用户
+ * @return
+ */
+ @PostMapping()
+ public Result add(@RequestBody @Validated UserAddReq userAddReq){
+ userInfoService.save(
+ UserInfo.addBuild(userAddReq)
+ );
+ return Result.success();
+ }
+}
diff --git a/muyu-modules/muyu-system/src/main/java/com/muyu/system/mapper/UserInfoMapper.java b/muyu-modules/muyu-system/src/main/java/com/muyu/system/mapper/UserInfoMapper.java
new file mode 100644
index 0000000..e4f4557
--- /dev/null
+++ b/muyu-modules/muyu-system/src/main/java/com/muyu/system/mapper/UserInfoMapper.java
@@ -0,0 +1,15 @@
+package com.muyu.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.muyu.common.domain.UserInfo;
+
+import java.util.List;
+
+/**
+ * @author DongZl
+ * @description: 用户信息plus持久层
+ * @Date 2024-1-10 下午 04:57
+ */
+public interface UserInfoMapper extends BaseMapper {
+
+}
diff --git a/muyu-modules/muyu-system/src/main/java/com/muyu/system/service/UserInfoService.java b/muyu-modules/muyu-system/src/main/java/com/muyu/system/service/UserInfoService.java
new file mode 100644
index 0000000..7cc316f
--- /dev/null
+++ b/muyu-modules/muyu-system/src/main/java/com/muyu/system/service/UserInfoService.java
@@ -0,0 +1,12 @@
+package com.muyu.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.muyu.common.domain.UserInfo;
+
+/**
+ * @author DongZl
+ * @description: 用户业务层
+ * @Date 2024-1-10 下午 07:41
+ */
+public interface UserInfoService extends IService {
+}
diff --git a/muyu-modules/muyu-system/src/main/java/com/muyu/system/service/UserInfoServiceImpl.java b/muyu-modules/muyu-system/src/main/java/com/muyu/system/service/UserInfoServiceImpl.java
new file mode 100644
index 0000000..68b7d8b
--- /dev/null
+++ b/muyu-modules/muyu-system/src/main/java/com/muyu/system/service/UserInfoServiceImpl.java
@@ -0,0 +1,17 @@
+package com.muyu.system.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.muyu.common.domain.UserInfo;
+import com.muyu.system.mapper.UserInfoMapper;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author DongZl
+ * @description: 用户业务实现类
+ * @Date 2024-1-10 下午 07:42
+ */
+@Service
+public class UserInfoServiceImpl extends ServiceImpl
+ implements UserInfoService {
+
+}
diff --git a/muyu-modules/muyu-system/src/main/resources/mapper/UserInfoMapper.xml b/muyu-modules/muyu-system/src/main/resources/mapper/UserInfoMapper.xml
new file mode 100644
index 0000000..dd4cd7e
--- /dev/null
+++ b/muyu-modules/muyu-system/src/main/resources/mapper/UserInfoMapper.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/muyu-modules/muyu-system/src/test/java/com/muyu/test/UserInfoTest.java b/muyu-modules/muyu-system/src/test/java/com/muyu/test/UserInfoTest.java
new file mode 100644
index 0000000..a56e092
--- /dev/null
+++ b/muyu-modules/muyu-system/src/test/java/com/muyu/test/UserInfoTest.java
@@ -0,0 +1,54 @@
+package com.muyu.test;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.muyu.common.domain.UserInfo;
+import com.muyu.system.SystemApplication;
+import com.muyu.system.mapper.UserInfoMapper;
+import com.muyu.system.service.UserInfoService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+
+/**
+ * @author DongZl
+ * @description: 用户测试
+ * @Date 2024-1-10 下午 03:40
+ */
+@SpringBootTest(classes = SystemApplication.class)
+public class UserInfoTest {
+
+ @Autowired
+ private UserInfoMapper userInfoMapper;
+
+ @Autowired
+ private UserInfoService userInfoService;
+
+ @Test
+ public void userInfoSave(){
+ userInfoMapper.insert(UserInfo.builder()
+ .userName("张三5")
+ .password("123456")
+ .salt("1245")
+ .build());
+
+ }
+
+ @Test
+ public void userInfoListTest(){
+ IPage page = new Page<>(1,2);
+ LambdaQueryWrapper userInfoQuery = new LambdaQueryWrapper<>();
+ userInfoQuery.like(UserInfo::getUserName, "张三");
+ userInfoQuery.gt(UserInfo::getId, 5);
+ List userInfoList = userInfoMapper.selectList(page, userInfoQuery);
+ System.out.println(page.getTotal());
+ System.out.println(userInfoList);
+ }
+ @Test
+ public void userInfoGetOneTest(){
+// userInfoPlusMapper.selecoid
+ }
+}