diff --git a/src/main/java/cn/itsource/config/interceptor/LoginInterceptor.java b/src/main/java/cn/itsource/config/interceptor/LoginInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..1625232ab6daa3f078d46b68ab52a970e4b48a32 --- /dev/null +++ b/src/main/java/cn/itsource/config/interceptor/LoginInterceptor.java @@ -0,0 +1,69 @@ +package cn.itsource.config.interceptor; + +import cn.hutool.core.util.StrUtil; +import cn.itsource.basic.util.AjaxResult; +import cn.itsource.basic.util.PetConstant; +import cn.itsource.basic.util.RedisService; +import cn.itsource.org.vo.LoginVo; +import com.alibaba.fastjson.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ResourceBundle; + +@Component //spring管理 +public class LoginInterceptor implements HandlerInterceptor { + + @Autowired + private RedisService redisService; + + /** + * 进入目标方法(Controller的方法)之前之前,false:拦截 true:放行 + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + //告诉浏览器我返回的数据按json来解析 + response.setContentType("application/json;charset=utf-8"); + + //1.从request获取token信息 + String token = request.getHeader("token"); + //2.如果token不存在,重新登录 + if (StrUtil.isBlank(token)){ + return extracted(response); + } + //3.拿到token,从redis里面获取登录信息 + LoginVo vo = redisService.getKeyObjectValue(token, LoginVo.class); + + //3.1如果没有获取到,重新登录 + if (vo == null){ + //ALT+SHIFT+M + return extracted(response); + } + + //4.重点:一定要刷新redis的登录信息,重新计时30min + redisService.setStringKeyAndValue(token,vo,30); + return true; + } + + /** + * 登录错误的公共返回 + * @param response + * @return + * @throws IOException + */ + private boolean extracted(HttpServletResponse response) throws IOException { + PrintWriter writer = response.getWriter(); + //1001 + AjaxResult loginResult = AjaxResult.createError(PetConstant.SYSTEM_LOGIN_TIMOUT, "给劳资去登录"); + + writer.write(JSONObject.toJSONString(loginResult)); + //拦截 + return false; + } +} diff --git a/src/main/java/cn/itsource/config/interceptor/PetHomeMvcConfig.java b/src/main/java/cn/itsource/config/interceptor/PetHomeMvcConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..4cbc471543a72e94ca5f96d7923caadb650a2241 --- /dev/null +++ b/src/main/java/cn/itsource/config/interceptor/PetHomeMvcConfig.java @@ -0,0 +1,35 @@ +package cn.itsource.config.interceptor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 声明这个springmvc的配置 + */ +@Configuration +public class PetHomeMvcConfig implements WebMvcConfigurer { + + @Autowired + private LoginInterceptor loginInterceptor; + + /** + * 注册拦截器 + * + * @param registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + //管理拦截器 + registry.addInterceptor(loginInterceptor) + .addPathPatterns("/**") //拦截所有 + .excludePathPatterns("/**/login", "/shop/settlement", "/file/**" + , "/user/**")//放行 + .excludePathPatterns("/swagger-resources/**" + , "/webjars/**" + , "/v2/**" + , "/swagger-ui.html/**");//放行swagger + + } +} diff --git a/src/main/java/cn/itsource/org/controller/LoginController.java b/src/main/java/cn/itsource/org/controller/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..0d8d8c696bc26c3c7a8d4e9fd2d81da3cfbad5d7 --- /dev/null +++ b/src/main/java/cn/itsource/org/controller/LoginController.java @@ -0,0 +1,48 @@ +package cn.itsource.org.controller; + +import cn.itsource.basic.util.AjaxResult; +import cn.itsource.org.dto.LoginDto; +import cn.itsource.org.service.IEmployeeService; +import cn.itsource.org.service.IUserService; +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; + +@RestController +public class LoginController { + + @Autowired + private IEmployeeService employeeService; + + @Autowired + private IUserService userService; + + /** + * 后台登录 + * @param loginDto + * @return + */ + @PostMapping("/system/login") + public AjaxResult login(@RequestBody LoginDto loginDto){ + + //登录业务 + return employeeService.login(loginDto); + } + + /** + * 用户系统登录 + * @param loginDto + * @return + */ + @PostMapping("/user/login") + public AjaxResult userLogin(@RequestBody LoginDto loginDto){ + + + //登录业务 + return userService.login(loginDto); + } + + +} diff --git a/src/main/java/cn/itsource/org/domain/Employee.java b/src/main/java/cn/itsource/org/domain/Employee.java index eec63c80257fb4efe4a89c541e7b434db083b7fb..13e1610b276227c61cb9482636e865b531bf9936 100644 --- a/src/main/java/cn/itsource/org/domain/Employee.java +++ b/src/main/java/cn/itsource/org/domain/Employee.java @@ -51,5 +51,7 @@ public class Employee extends BaseDomain implements CreatePassword { private Long parentId; //经理id private Long managerId; + //头像 + private String headImg; } diff --git a/src/main/java/cn/itsource/org/dto/LoginDto.java b/src/main/java/cn/itsource/org/dto/LoginDto.java new file mode 100644 index 0000000000000000000000000000000000000000..e77ad8a5fd621defb0442720d700711e4f4072b4 --- /dev/null +++ b/src/main/java/cn/itsource/org/dto/LoginDto.java @@ -0,0 +1,15 @@ +package cn.itsource.org.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LoginDto { + + //用户名 + private String username; + + //密码 + private String password; +} diff --git a/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java b/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java index 309fcef6d81df2e1aeb76159253a84c8fd1135de..ce2cf0de11ed41c11530cc7399a3a9ad74dbcf2f 100644 --- a/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java +++ b/src/main/java/cn/itsource/org/mapper/EmployeeMapper.java @@ -2,6 +2,7 @@ package cn.itsource.org.mapper; import cn.itsource.basic.basicmapper.BasicMapper; import cn.itsource.org.domain.Employee; +import cn.itsource.org.dto.LoginDto; import org.apache.ibatis.annotations.Select; import tk.mybatis.mapper.entity.Example; diff --git a/src/main/java/cn/itsource/org/mapper/UserMapper.java b/src/main/java/cn/itsource/org/mapper/UserMapper.java index a0bc9ce786a6f844b598b95ec0e9146db391e6c7..16c481ea92dff443398631e6c21c72979261fc14 100644 --- a/src/main/java/cn/itsource/org/mapper/UserMapper.java +++ b/src/main/java/cn/itsource/org/mapper/UserMapper.java @@ -2,6 +2,8 @@ package cn.itsource.org.mapper; import cn.itsource.basic.basicmapper.BasicMapper; import cn.itsource.org.domain.User; +import cn.itsource.org.dto.LoginDto; +import org.apache.ibatis.annotations.Select; import tk.mybatis.mapper.entity.Example; public interface UserMapper extends BasicMapper { @@ -17,4 +19,7 @@ public interface UserMapper extends BasicMapper { //查询 return this.selectOneByExample(example); } + + @Select("select * from t_user where username = #{username} or email = #{username} or phone = #{username}") + User findByUsername(LoginDto loginDto); } diff --git a/src/main/java/cn/itsource/org/service/IEmployeeService.java b/src/main/java/cn/itsource/org/service/IEmployeeService.java index 239c86cb45ddf7ee72bc6107a6c24c48d1f81c4c..dd47e2968d2e8a808d72098f1d01c8d463b39abd 100644 --- a/src/main/java/cn/itsource/org/service/IEmployeeService.java +++ b/src/main/java/cn/itsource/org/service/IEmployeeService.java @@ -1,8 +1,10 @@ package cn.itsource.org.service; import cn.itsource.basic.service.IBaseService; +import cn.itsource.basic.util.AjaxResult; import cn.itsource.basic.util.PageList; import cn.itsource.org.domain.Employee; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.query.EmployeeQuery; import java.util.List; @@ -19,4 +21,6 @@ public interface IEmployeeService extends IBaseService { Employee checkRepeatEmployee(Employee admin); + + AjaxResult login(LoginDto loginDto); } diff --git a/src/main/java/cn/itsource/org/service/IUserService.java b/src/main/java/cn/itsource/org/service/IUserService.java index d2433b845935e894859a3afae707f914987ba44f..da75d5ca65be001b32947ea083e84f34f26b98f3 100644 --- a/src/main/java/cn/itsource/org/service/IUserService.java +++ b/src/main/java/cn/itsource/org/service/IUserService.java @@ -3,6 +3,7 @@ package cn.itsource.org.service; import cn.itsource.basic.service.IBaseService; import cn.itsource.basic.util.AjaxResult; import cn.itsource.org.domain.User; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.query.UserQuery; import javax.servlet.http.HttpServletRequest; @@ -16,4 +17,5 @@ public interface IUserService extends IBaseService { AjaxResult registerUser(User user); + AjaxResult login(LoginDto loginDto); } diff --git a/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java b/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java index 564b21dbf1a3e71849cb6b6688f65e0e33a363dc..249f256149bc5c9a3b20ca63546104b4dcb32150 100644 --- a/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java +++ b/src/main/java/cn/itsource/org/service/impl/EmployeeServiceImpl.java @@ -1,26 +1,76 @@ package cn.itsource.org.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.MD5; import cn.itsource.basic.service.impl.BaseServiceImpl; +import cn.itsource.basic.util.AjaxResult; import cn.itsource.basic.util.PageList; +import cn.itsource.basic.util.RedisService; +import cn.itsource.config.exception.BusinessException; import cn.itsource.org.domain.Employee; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.mapper.EmployeeMapper; import cn.itsource.org.query.EmployeeQuery; import cn.itsource.org.service.IEmployeeService; import cn.itsource.org.service.IEmployeeService; +import cn.itsource.org.vo.LoginVo; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.sql.Struct; import java.util.List; @Service //spring管理 public class EmployeeServiceImpl extends BaseServiceImpl implements IEmployeeService { + //普通crud通过继承得到 @Autowired private EmployeeMapper employeeMapper; - //普通crud通过继承得到 + @Autowired + private RedisService redisService; + + + @Override + public AjaxResult login(LoginDto loginDto) { + + //1.验证参数 @NotBlack + + //2.根据用户名进行匹配 //账户名与密码不匹配,请重新输入 + Employee employee = BeanUtil.copyProperties(loginDto, Employee.class); + Employee dbEmployee = employeeMapper.checkRepeatEmployee(employee); + + //3.如果匹配不到,返回错误 + if (dbEmployee == null){ + throw new BusinessException("账户名与密码不匹配,请重新输入"); + } + //4.如果匹配到了,对进来的密码串加盐加密和数据库的加密串进行比对, + //4.1拿到数据库的盐值,再对页面传递过来的密码进行加密 + String pageMd5Pwd = MD5.create().setSalt(dbEmployee.getSalt().getBytes()).digestHex(loginDto.getPassword()); + + //5.比对不过,返回错误 pageMd5Pwd:页面密码加密串 dbEmployee.getPassword():数据库的加密串 + if (!StrUtil.equals(pageMd5Pwd,dbEmployee.getPassword())){ + throw new BusinessException("账户名与密码不匹配,请重新输入"); + } + + //6.成功,存放redis.setKv(token,用户信息,时间) + String token = IdUtil.fastSimpleUUID(); + //6.1封装成一个通用对象,用户系统和后台系统都可以用这个 + LoginVo loginVo = BeanUtil.copyProperties(dbEmployee, LoginVo.class); + loginVo.setToken(token); + + redisService.setStringKeyAndValue(token,loginVo,30); + //7.返回vo对象,vo专门用来返回值给前端页面的 + return AjaxResult.createSuccess(loginVo); + + } + + @Override public List findManagers() { @@ -32,4 +82,5 @@ public class EmployeeServiceImpl extends BaseServiceImpl return employeeMapper.checkRepeatEmployee(admin); } + } diff --git a/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java b/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java index 060f83cee51fbe8464d592a14b9fa56df6e09973..6f54cc5adc9498eea2c14ed6bc2124d384fff6f6 100644 --- a/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java +++ b/src/main/java/cn/itsource/org/service/impl/UserServiceImpl.java @@ -1,17 +1,22 @@ package cn.itsource.org.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.digest.MD5; import cn.itsource.basic.service.impl.BaseServiceImpl; import cn.itsource.basic.util.AjaxResult; import cn.itsource.basic.util.RedisService; import cn.itsource.basic.util.SendMessageService; import cn.itsource.config.exception.BusinessException; import cn.itsource.org.domain.User; +import cn.itsource.org.dto.LoginDto; import cn.itsource.org.mapper.UserMapper; import cn.itsource.org.query.UserQuery; import cn.itsource.org.service.IUserService; +import cn.itsource.org.vo.LoginVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +44,38 @@ public class UserServiceImpl extends BaseServiceImpl implements private SendMessageService sendMessageService; + @Override + public AjaxResult login(LoginDto loginDto) { + + //1.去t_user表匹配账户 + User dbUser = userMapper.findByUsername(loginDto); + + //2.如果user不存在,返回提示 + if (dbUser == null){ + throw new BusinessException("账户密码不匹配"); + } + + //4.如果匹配到了,对进来的密码串加盐加密和数据库的加密串进行比对, + //4.1拿到数据库的盐值,再对页面传递过来的密码进行加密 + String pageMd5Pwd = MD5.create().setSalt(dbUser.getSalt().getBytes()).digestHex(loginDto.getPassword()); + + //5.比对不过,返回错误 pageMd5Pwd:页面密码加密串 dbEmployee.getPassword():数据库的加密串 + if (!StrUtil.equals(pageMd5Pwd,dbUser.getPassword())){ + throw new BusinessException("账户名与密码不匹配,请重新输入"); + } + + //6.成功,存放redis.setKv(token,用户信息,时间) + String token = IdUtil.fastSimpleUUID(); + //6.1封装成一个通用对象,用户系统和后台系统都可以用这个 + LoginVo loginVo = BeanUtil.copyProperties(dbUser, LoginVo.class); + loginVo.setToken(token); + + redisService.setStringKeyAndValue(token,loginVo,30); + //7.返回vo对象,vo专门用来返回值给前端页面的 + return AjaxResult.createSuccess(loginVo); + + } + @Override public AjaxResult checkPhone(String phone) { //1.验证手机号合法性 @@ -141,6 +178,8 @@ public class UserServiceImpl extends BaseServiceImpl implements return AjaxResult.createSuccess(); } + + public static void main(String[] args) { log.info("[宠物乐园验证码]:{},手机号:{}","111","17736565658");//推荐 diff --git a/src/main/java/cn/itsource/org/vo/LoginVo.java b/src/main/java/cn/itsource/org/vo/LoginVo.java new file mode 100644 index 0000000000000000000000000000000000000000..d9e1b9d14321fe149e3fcd3f5c7dc636551bd1cb --- /dev/null +++ b/src/main/java/cn/itsource/org/vo/LoginVo.java @@ -0,0 +1,17 @@ +package cn.itsource.org.vo; + +import lombok.Data; + +/** + * 兼容用户系统和后台系统的公共登录对象 + */ +@Data +public class LoginVo { + + private String username; //用户名 + private String email;//邮箱 + private String phone;//手机号 + private String headImg;//头像 + private String token;//登录令牌 + +}