feat(新增): 用户注册完成

Signed-off-by: bunny <1319900154@qq.com>
This commit is contained in:
bunny 2024-03-27 23:11:17 +08:00
parent 98fac3ddb8
commit dd8d37e343
19 changed files with 205 additions and 38 deletions

View File

@ -22,7 +22,7 @@ public class WebMvcConfiguration extends WebMvcConfigurationSupport {
protected void addCorsMappings(CorsRegistry registry) { protected void addCorsMappings(CorsRegistry registry) {
log.info("WebMvcConfiguration===>开始跨域注册表..."); log.info("WebMvcConfiguration===>开始跨域注册表...");
registry.addMapping("/**")// 添加路径规则 registry.addMapping("/admin/**")// 添加路径规则
.allowCredentials(true)// 是否允许在跨域的情况下传递Cookie .allowCredentials(true)// 是否允许在跨域的情况下传递Cookie
.allowedOriginPatterns("*")// 允许请求来源的域规则 .allowedOriginPatterns("*")// 允许请求来源的域规则
.allowedMethods("*").allowedHeaders("*");// 允许所有的请求头 .allowedMethods("*").allowedHeaders("*");// 允许所有的请求头

View File

@ -4,7 +4,7 @@ import com.atguigu.exception.BunnyException;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
public class StringEmptyUtil { public class EmptyUtil {
/** /**
* 判断内容是否为空 * 判断内容是否为空
* *
@ -16,4 +16,16 @@ public class StringEmptyUtil {
throw new BunnyException(null, errorMessage); throw new BunnyException(null, errorMessage);
} }
} }
/**
* 判断内容是否为空
*
* @param val
* @param errorMessage 如果为空的错误信息
*/
public void isNotEmpty(Object val, String errorMessage) {
if (val != null) {
throw new BunnyException(null, errorMessage);
}
}
} }

View File

@ -25,4 +25,8 @@ public class MessageConstant {
public static final String FIND_ID_IS_NOT_EMPTY = "查询ID不能为空"; public static final String FIND_ID_IS_NOT_EMPTY = "查询ID不能为空";
public static final String MESSAGE_CODE_NOT_PASS = "短信验证码未过期"; public static final String MESSAGE_CODE_NOT_PASS = "短信验证码未过期";
public static final String MESSAGE_CODE_UNAUTHORIZED = "短信验证码未授权,请联系管理员"; public static final String MESSAGE_CODE_UNAUTHORIZED = "短信验证码未授权,请联系管理员";
public static final String VERIFICATION_CODE_ERROR = "验证码错误";
public static final String USER_DOES_NOT_EXIST = "用户不存在";
public static final String USER_DOES_IS_EXIST = "用户已存在";
public static final String VERIFICATION_CODE_IS_EMPTY = "请先发送验证码";
} }

View File

@ -4,7 +4,7 @@ import com.atguigu.constant.MessageConstant;
import com.atguigu.spzx.manger.mapper.BrandMapper; import com.atguigu.spzx.manger.mapper.BrandMapper;
import com.atguigu.spzx.manger.service.BrandService; import com.atguigu.spzx.manger.service.BrandService;
import com.atguigu.spzx.model.entity.product.Brand; import com.atguigu.spzx.model.entity.product.Brand;
import com.atguigu.utils.StringEmptyUtil; import com.atguigu.utils.EmptyUtil;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -18,7 +18,7 @@ public class BrandServiceImpl implements BrandService {
@Autowired @Autowired
private BrandMapper brandMapper; private BrandMapper brandMapper;
@Autowired @Autowired
private StringEmptyUtil emptyUtil; private EmptyUtil emptyUtil;
/** /**
* 品牌列表查询 * 品牌列表查询

View File

@ -7,7 +7,7 @@ import com.atguigu.spzx.manger.service.CategoryBrandService;
import com.atguigu.spzx.model.dto.product.CategoryBrandDto; import com.atguigu.spzx.model.dto.product.CategoryBrandDto;
import com.atguigu.spzx.model.entity.product.Brand; import com.atguigu.spzx.model.entity.product.Brand;
import com.atguigu.spzx.model.entity.product.CategoryBrand; import com.atguigu.spzx.model.entity.product.CategoryBrand;
import com.atguigu.utils.StringEmptyUtil; import com.atguigu.utils.EmptyUtil;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -21,7 +21,7 @@ public class CategoryBrandServiceImpl implements CategoryBrandService {
@Autowired @Autowired
private CategoryBrandMapper categoryBrandMapper; private CategoryBrandMapper categoryBrandMapper;
@Autowired @Autowired
private StringEmptyUtil emptyUtil; private EmptyUtil emptyUtil;
/** /**
* 分类品牌列表 * 分类品牌列表

View File

@ -5,7 +5,7 @@ import com.atguigu.exception.BunnyException;
import com.atguigu.spzx.manger.mapper.ProductSpecMapper; import com.atguigu.spzx.manger.mapper.ProductSpecMapper;
import com.atguigu.spzx.manger.service.ProductSpecService; import com.atguigu.spzx.manger.service.ProductSpecService;
import com.atguigu.spzx.model.entity.product.ProductSpec; import com.atguigu.spzx.model.entity.product.ProductSpec;
import com.atguigu.utils.StringEmptyUtil; import com.atguigu.utils.EmptyUtil;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -19,7 +19,7 @@ public class ProductSpecServiceImpl implements ProductSpecService {
@Autowired @Autowired
private ProductSpecMapper productSpecMapper; private ProductSpecMapper productSpecMapper;
@Autowired @Autowired
private StringEmptyUtil emptyUtil; private EmptyUtil emptyUtil;
/** /**
* 列表查询 * 列表查询

View File

@ -8,8 +8,8 @@ import com.atguigu.spzx.manger.service.SysMenuService;
import com.atguigu.spzx.manger.service.module.SysMenuServiceImplModule; import com.atguigu.spzx.manger.service.module.SysMenuServiceImplModule;
import com.atguigu.spzx.model.entity.system.SysMenu; import com.atguigu.spzx.model.entity.system.SysMenu;
import com.atguigu.spzx.model.vo.system.SysMenuVo; import com.atguigu.spzx.model.vo.system.SysMenuVo;
import com.atguigu.utils.EmptyUtil;
import com.atguigu.utils.MenuHelper; import com.atguigu.utils.MenuHelper;
import com.atguigu.utils.StringEmptyUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -20,7 +20,7 @@ public class SysMenuServiceImpl implements SysMenuService {
@Autowired @Autowired
private SysMenuMapper sysMenuMapper; private SysMenuMapper sysMenuMapper;
@Autowired @Autowired
private StringEmptyUtil emptyUtil; private EmptyUtil emptyUtil;
@Autowired @Autowired
private SysMenuServiceImplModule sysMenuServiceImplModule; private SysMenuServiceImplModule sysMenuServiceImplModule;

View File

@ -8,7 +8,7 @@ import com.atguigu.spzx.model.dto.system.AssginRoleDto;
import com.atguigu.spzx.model.dto.system.SysRoleDto; import com.atguigu.spzx.model.dto.system.SysRoleDto;
import com.atguigu.spzx.model.entity.system.SysRole; import com.atguigu.spzx.model.entity.system.SysRole;
import com.atguigu.spzx.model.vo.system.AllRolesVo; import com.atguigu.spzx.model.vo.system.AllRolesVo;
import com.atguigu.utils.StringEmptyUtil; import com.atguigu.utils.EmptyUtil;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -24,7 +24,7 @@ public class SysRoleServiceImpl implements SysRoleService {
@Autowired @Autowired
private SysRoleUserMapper sysRoleUserMapper; private SysRoleUserMapper sysRoleUserMapper;
@Autowired @Autowired
private StringEmptyUtil emptyUtil; private EmptyUtil emptyUtil;
/** /**
* 查询角色信息返回分页 * 查询角色信息返回分页

View File

@ -11,7 +11,7 @@ import com.atguigu.spzx.model.dto.system.SysUserDto;
import com.atguigu.spzx.model.entity.system.SysUser; import com.atguigu.spzx.model.entity.system.SysUser;
import com.atguigu.spzx.model.vo.result.ResultCodeEnum; import com.atguigu.spzx.model.vo.result.ResultCodeEnum;
import com.atguigu.spzx.model.vo.system.LoginVo; import com.atguigu.spzx.model.vo.system.LoginVo;
import com.atguigu.utils.StringEmptyUtil; import com.atguigu.utils.EmptyUtil;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@ -27,7 +27,7 @@ import java.util.concurrent.TimeUnit;
@Service @Service
public class SysUserServiceImpl implements SysUserService { public class SysUserServiceImpl implements SysUserService {
@Autowired @Autowired
StringEmptyUtil stringEmptyUtil; EmptyUtil emptyUtil;
@Autowired @Autowired
private SysUserMapper sysUserMapper; private SysUserMapper sysUserMapper;
@Autowired @Autowired
@ -47,11 +47,11 @@ public class SysUserServiceImpl implements SysUserService {
String key = loginDto.getCodeKey(); String key = loginDto.getCodeKey();
// 得到Redis中验证码 // 得到Redis中验证码
String code = (String) redisTemplate.opsForValue().get(key); String code = (String) redisTemplate.opsForValue().get(key);
stringEmptyUtil.isEmpty(userName, ExceptionConstant.USERNAME_IS_EMPTY); emptyUtil.isEmpty(userName, ExceptionConstant.USERNAME_IS_EMPTY);
stringEmptyUtil.isEmpty(password, ExceptionConstant.PASSWORD_IS_EMPTY); emptyUtil.isEmpty(password, ExceptionConstant.PASSWORD_IS_EMPTY);
stringEmptyUtil.isEmpty(captcha, ExceptionConstant.CAPTCHA_IS_EMPTY); emptyUtil.isEmpty(captcha, ExceptionConstant.CAPTCHA_IS_EMPTY);
stringEmptyUtil.isEmpty(key, ExceptionConstant.KEY_IS_EMPTY); emptyUtil.isEmpty(key, ExceptionConstant.KEY_IS_EMPTY);
stringEmptyUtil.isEmpty(code, ExceptionConstant.VERIFICATION_CODE_IS_EMPTY); emptyUtil.isEmpty(code, ExceptionConstant.VERIFICATION_CODE_IS_EMPTY);
// 验证码不匹配 // 验证码不匹配
assert code != null; assert code != null;
@ -115,7 +115,7 @@ public class SysUserServiceImpl implements SysUserService {
public void saveSysUser(SysUser sysUser) { public void saveSysUser(SysUser sysUser) {
// 判断用户名不能为空 // 判断用户名不能为空
String username = sysUser.getUserName(); String username = sysUser.getUserName();
stringEmptyUtil.isEmpty(username, "用户名不能为空"); emptyUtil.isEmpty(username, "用户名不能为空");
SysUser dbUser = sysUserMapper.selectByUsername(sysUser.getUserName()); SysUser dbUser = sysUserMapper.selectByUsername(sysUser.getUserName());
// 如果用户已存在 // 如果用户已存在
@ -139,7 +139,7 @@ public class SysUserServiceImpl implements SysUserService {
*/ */
@Override @Override
public void updateSysUser(SysUser sysUser) { public void updateSysUser(SysUser sysUser) {
stringEmptyUtil.isEmpty(sysUser.getId(), MessageConstant.UPDATE_ID_IS_NOT_EMPTY); emptyUtil.isEmpty(sysUser.getId(), MessageConstant.UPDATE_ID_IS_NOT_EMPTY);
sysUserMapper.updateSysUser(sysUser); sysUserMapper.updateSysUser(sysUser);
} }
@ -150,7 +150,7 @@ public class SysUserServiceImpl implements SysUserService {
*/ */
@Override @Override
public void deleteById(Long userId) { public void deleteById(Long userId) {
stringEmptyUtil.isEmpty(userId, MessageConstant.DELETE_ID_IS_NOT_EMPTY); emptyUtil.isEmpty(userId, MessageConstant.DELETE_ID_IS_NOT_EMPTY);
sysUserMapper.deleteById(userId); sysUserMapper.deleteById(userId);
} }
} }

View File

@ -4,9 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@Data @Data
@Schema(description="注册对象") @Schema(description = "注册对象")
public class UserRegisterDto { public class UserRegisterDto {
@Schema(description = "用户名") @Schema(description = "用户名")
private String username; private String username;
@ -17,6 +16,5 @@ public class UserRegisterDto {
private String nickName; private String nickName;
@Schema(description = "手机验证码") @Schema(description = "手机验证码")
private String code ; private String code;
} }

View File

@ -20,16 +20,16 @@ spring:
locator: locator:
enabled: true enabled: true
# 解决跨域 # 解决跨域
# globalcors: globalcors:
# cors-configurations: cors-configurations:
# '[/**]': '[/**]':
# allowedOriginPatterns: "*" allowedOriginPatterns: "*"
# # 允许请求中携带的头信息 # 允许请求中携带的头信息
# allowedHeaders: "*" allowedHeaders: "*"
# # 运行跨域的请求方式 # 运行跨域的请求方式
# allowedMethods: "*" allowedMethods: "*"
# # 跨域检测的有效期,单位s # 跨域检测的有效期,单位s
# maxAge: 36000 maxAge: 36000
# 路由 # 路由
routes: routes:
- id: service-product - id: service-product

View File

@ -34,7 +34,6 @@ public class IndexController {
List<Category> categoryList = categoryService.selectOneCategory(); List<Category> categoryList = categoryService.selectOneCategory();
// 根据销量排序获取前十条数据 // 根据销量排序获取前十条数据
List<ProductSku> productSkuList = productService.selectProductSkuBySale(); List<ProductSku> productSkuList = productService.selectProductSkuBySale();
IndexVo vo = IndexVo.builder().categoryList(categoryList).productSkuList(productSkuList).build(); IndexVo vo = IndexVo.builder().categoryList(categoryList).productSkuList(productSkuList).build();
return Result.success(vo); return Result.success(vo);
} }

View File

@ -1,11 +1,15 @@
package com.atguigu.user; package com.atguigu.user;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication @SpringBootApplication
@EnableCaching// 开启缓存注解
@MapperScan("com.atguigu.user.mapper")
@ComponentScan("com.atguigu") @ComponentScan("com.atguigu")
@Slf4j @Slf4j
public class UserApplication { public class UserApplication {

View File

@ -0,0 +1,27 @@
package com.atguigu.user.controller;
import com.atguigu.spzx.model.dto.h5.UserRegisterDto;
import com.atguigu.spzx.model.vo.result.Result;
import com.atguigu.user.service.UserInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
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;
@Tag(name = "会员用户接口")
@RestController
@RequestMapping("/api/user/userInfo")
public class UserInfoController {
@Autowired
private UserInfoService userInfoService;
@Operation(summary = "会员注册")
@PostMapping("register")
public Result<String> register(@RequestBody UserRegisterDto userRegisterDto) {
userInfoService.register(userRegisterDto);
return Result.success();
}
}

View File

@ -0,0 +1,22 @@
package com.atguigu.user.mapper;
import com.atguigu.spzx.model.entity.user.UserInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserInfoMapper {
/**
* 查询用户
*
* @param username 用户名
* @return 用户信息
*/
UserInfo selectByUsername(String username);
/**
* 保存用户信息
*
* @param userInfo 用户信息
*/
void save(UserInfo userInfo);
}

View File

@ -0,0 +1,12 @@
package com.atguigu.user.service;
import com.atguigu.spzx.model.dto.h5.UserRegisterDto;
public interface UserInfoService {
/**
* 会员注册
*
* @param userRegisterDto 注册对象
*/
void register(UserRegisterDto userRegisterDto);
}

View File

@ -0,0 +1,65 @@
package com.atguigu.user.service.impl;
import com.atguigu.constant.MessageConstant;
import com.atguigu.exception.BunnyException;
import com.atguigu.spzx.model.dto.h5.UserRegisterDto;
import com.atguigu.spzx.model.entity.user.UserInfo;
import com.atguigu.user.mapper.UserInfoMapper;
import com.atguigu.user.service.UserInfoService;
import com.atguigu.utils.EmptyUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import java.util.Objects;
@Service
public class UserInfoServiceImpl implements UserInfoService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private UserInfoMapper userInfoMapper;
@Autowired
private EmptyUtil emptyUtil;
/**
* 会员注册
*
* @param userRegisterDto 注册对象
*/
@Override
public void register(UserRegisterDto userRegisterDto) {
emptyUtil.isEmpty(userRegisterDto.getUsername(), MessageConstant.SAVE_DTO_IS_NULL);
// 获取数据
String username = userRegisterDto.getUsername();
String password = userRegisterDto.getPassword();
String code = userRegisterDto.getCode();
// 从Redis中获取发送的验证码
Object redisCode = redisTemplate.opsForValue().get(username);
emptyUtil.isEmpty(redisCode, MessageConstant.VERIFICATION_CODE_IS_EMPTY);
if (!Objects.equals(String.valueOf(redisCode), code)) {
throw new BunnyException(MessageConstant.VERIFICATION_CODE_ERROR);
}
// 校验用户名不能相同
UserInfo userInfo = userInfoMapper.selectByUsername(username);
emptyUtil.isNotEmpty(userInfo, MessageConstant.USER_DOES_IS_EXIST);
userInfo = new UserInfo();
BeanUtils.copyProperties(userRegisterDto, userInfo);
userInfo.setPassword(DigestUtils.md5DigestAsHex(password.getBytes()));
userInfo.setPhone(username);
userInfo.setStatus(1);
userInfo.setStatus(0);
userInfo.setAvatar("https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eoj0hHXhgJNOTSOFsS4uZs8x1ConecaVOB8eIl115xmJZcT4oCicvia7wMEufibKtTLqiaJeanU2Lpg3w/132");
// 保存用户信息
userInfoMapper.save(userInfo);
// 删除Redis中的数据
redisTemplate.delete(username);
}
}

View File

@ -37,7 +37,7 @@ logging:
mybatis: mybatis:
type-aliases-package: com.atguigu.spzx.model type-aliases-package: com.atguigu.spzx.model
mapper-locations: classpath:/mapper/*/*.xml mapper-locations: classpath:/mapper/*.xml
configuration: configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true map-underscore-to-camel-case: true

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.atguigu.user.mapper.UserInfoMapper">
<!-- 用于select查询公用抽取的列 -->
<sql id="columns">
id,username,password,nick_name,avatar,sex,phone,memo,open_id,union_id,last_login_ip,last_login_time,status,create_time,update_time,is_deleted
</sql>
<!-- 保存用户信息 -->
<insert id="save">
insert into user_info (id, username, password, nick_name, avatar, sex, phone, memo, open_id, union_id,
last_login_ip, last_login_time, status)
values (#{id}, #{username}, #{password}, #{nickName}, #{avatar}, #{sex}, #{phone}, #{memo}, #{openId},
#{unionId}, #{lastLoginIp}, #{lastLoginTime}, #{status})
</insert>
<!-- 查询用户 -->
<select id="selectByUsername" resultType="com.atguigu.spzx.model.entity.user.UserInfo">
select
<include refid="columns"/>
from user_info
where username = #{username}
</select>
</mapper>