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 + } +}