1.用户登录操作
1.1 关于token的说明
1.由于服务器需要标识已经登录的用户,所以服务器动态生成一个独一无二的token,返回给用户.
2.用户将token保存到本地,方便下次访问时携带.
2.业务实现步骤
1.实现用户登录
1.1创建controller
package com.jt.controller;
import com.jt.VO.SysResult;
import com.jt.pojo.User;
import com.jt.service.UserService;
import com.jt.service.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/user")
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
/**
* 创建Controller,使用PostMapping
* 1.前端传过来的是js对象需要使用@RequestBody接收参数
* 2.后端要返回一个UUID秘钥给前端使用SysResult接收
* **/
@PostMapping("/login")
public SysResult login(@RequestBody User user){
/***
* 1.用户传递的是明文,需要加密
* 查库后有两种可能:
* 1.有这个客户,则登录成功,并返回token
* 2.没有这个客户,则返回null值
* */
String token =userService.login(user);
if(token==null||token.length()==0)return null;
return SysResult.success(token);
}
}
1.2.创建Service层
package com.jt.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import java.util.List;
import java.util.UUID;
/***
* Service层,用来处理业务逻辑:
* 1.客户传来是明文需要加密后再操作
* */
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.selectList(null);
}
@Override
public String login(User user) {
/**
* 1.获取客户传来的参数
* 2.使用MD5进行加密,将客户明文改为密文
* 3.查询时有两种可能:
* 1.查询到了,需要生成一个秘钥返回给Controller
* 2.没查询到,需要结束当前方法,并返回一个null值
* **/
String password = user.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes());
user.setPassword(password);
QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
User user1 = userMapper.selectOne(queryWrapper);
if(user1==null){
return null;
}
String token = UUID.randomUUID().toString().replace("-", "");
return token;
}
}
2.获取左侧列表
2.1创建pojo的对象Rights
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
@TableName("rights")
public class Rights extends BasePojo{
private Integer id;
private String name;
private Integer parentId;
private String path;
private Integer level;
/**
* 用来表示该属性不存在用来存放2级菜单,不与数据库存在对象
* 关系映射
* **/
@TableField(exist = false)
private List<Rights> children;
}
2.2创建持久层
package com.jt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.Rights;
/**
* 实体层,由于要是用mp需要继承BaseMapper<Rights>*/
public interface RightsMapper extends BaseMapper<Rights> {
}
2.3创建接口service
package com.jt.service;
import com.jt.pojo.Rights;
import java.util.List;
public interface RightsService {
List<Rights> findAll();
}
2.4创建接口实现类
package com.jt.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.RightsMapper;
import com.jt.pojo.Rights;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class RightsServiceImpl implements RightsService{
@Autowired
private RightsMapper rightsMapper;
@Override
public List<Rights> findAll() {
return rightsMapper.selectList(null);
}
@Override
public List<Rights> getRightsList() {
/**
* 左侧菜单有两层
* 注:表中一级菜单的parent-id的id是二级菜单的parent-id
* 1.首先获取第一层菜单
* 2.遍历一级菜单通过“parent—id”获取二级菜单
* **/
QueryWrapper<Rights> queryWrapper = new QueryWrapper<>();
//获取一级菜单
queryWrapper.eq("parent_id", 0);
//获取到的一级菜单封装在一个List集合中
List<Rights> rightsList = rightsMapper.selectList(queryWrapper);
//遍历一级菜单
for (Rights oneList : rightsList) {
//清除上回查询条件
queryWrapper.clear();
//获取二级菜单
queryWrapper.eq("parent_id", oneList.getId());
//获取到的二级菜单封装在List集合中
List<Rights> twoList = rightsMapper.selectList(queryWrapper);
//将二级菜单放在一级菜单的Children集合中具体查看pojo中的字段
oneList.setChildren(twoList);
}
//返回一级菜单
return rightsList;
}
}
2.4创建接口实现类
package com.jt.controller;
import com.jt.VO.SysResult;
import com.jt.pojo.Rights;
import com.jt.service.RightsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/rights")
@CrossOrigin
public class RightsController {
@Autowired
private RightsService rightsService;
@GetMapping("/findAll")
public List<Rights> findAll(){
return rightsService.findAll();
}
/**
* 前端没有参数传递,需要获取左侧菜单,含有一级和二级菜单
* 使用List接收SERVICE传来的参数,将其封装好并交给SysResult
* **/
@GetMapping("/getRightsList")
public SysResult getRightsList(){
List<Rights> rightsList =
rightsService.getRightsList();
return SysResult.success(rightsList);
}
}
3.用户列表展现
3.1在VO中创建PageResult对象接收
package com.jt.VO;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
public class PageResult implements Serializable {
private String query;
private Integer pageNum;
private Integer pageSize;
private Long total;
private Object rows;
}
3.2在userController中创建用户列表的分页查询
@GetMapping("/list")
public SysResult list(PageResult pageResult){
/**
* 需求:实现用户列表的分页查询
* 传进来3个返回5个参数
* URL地址: http://localhost:8091/user/list?query=查询关键字&pageNum=1&pageSize=10
**/
pageResult = userService.list(pageResult);
return SysResult.success(pageResult);
}
}
3.3在UserServiceImpl中实现分页查询的业务逻辑
/**
* 使用MP进行分页查询
* 1.需要配置动态拼接的配置类
* 2.使用MY分页对象进行分页
* **/
@Override
public PageResult list(PageResult pageResult) {
/**
* 1.使用MY的selectPage查询
* 2.selectPage需要2个参数一个分页对象,另外一个条件构造器
* 3.创建分页工具,
* 4.创建条件构造器
* 5.pageResult封装查询结构并返回
* **/
//创建分页对象
IPage<User> page =
new Page<>(pageResult.getPageNum(), pageResult.getPageSize());
//判断用户是否有查询
boolean flag = StringUtils.hasLength(pageResult.getQuery());
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(flag,"username",pageResult.getQuery());
//分页查询
page = userMapper.selectPage(page, queryWrapper);
//封装分页对象
pageResult.setTotal(page.getTotal()).setRows(page.getRecords());
return pageResult;
}
3.4创建配置类
package com.jt.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;
import org.springframework.web.bind.annotation.CrossOrigin;
/**
* 使用MY的分页查询工具需要配置拦截器
* 作用:动态的拼装sql语句
* **/
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor =
new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor
(new PaginationInnerInterceptor(DbType.MARIADB));
return mybatisPlusInterceptor;
}
}
4.修改用户状态
4.1在userController中创建用户状态修改
/**
* 需求:修改用户状态
* 使用对象接收参数方便
* 返回一个SysResult对象
* **/
@PutMapping("/status/{id}/{status}")
public SysResult updateStatus(User user){
userService.updateStatus(user);
return SysResult.success();
}
4.2在userServiceImpl中实现业务
/**
* MY可以直接拼接sql将对象直接传入即可
* **/
@Override
public void updateStatus(User user) {
userMapper.updateById(user);
}