1.创建步骤
1.POM.XML文件 1.parent标签 2.依赖项 3.插件
2.主启动类
3.POJO 路径jt-common\src\main\java\com\jt\pojo的POJO 全部复制 com.jt.pojo
4.VO jt-common\src\main\java\com\jt\vo 全部复制 com.jt.vo
5.Mapper 只写UserMapper的层级
6.Service
7.Controller
8.Mapper接口的代理
9.粘贴复制配置文件!!!
2.登录实现
2.1添加事件
说明:为登录按钮添加点击事件
2.2登录步骤
1.再次校验用户的数据是否有效
2.发起Ajax请求实现用户登录请求. username/password post请求
3.在后端服务器 通过username/password 进行数据的查询.
结果 1.有数据 用户名密码正确. 2.无数据 用户名或密码错误
4.后端将数据处理完成之后,返回特定的数据. 告知前端 数据处理情况(回执!!!)
status=200 代表操作成功!!! status=201 表示业务操作失败
5.前端通过JS判断服务器的回执. 如果状态码等于200 提示用户登录成功, 否则告知用户用户名或 密码错误.
6.一般为了校验用户是否登录,会返回一个特殊的密钥-TOKEN(密文),如果没有密钥则需要重新登录.
2.2.1登录中token的判断
设定路由导航
左侧菜单展现业务实现:
利用MP实现分页
额外配置的配置类
设定POJO属性 什么时候实现自动填充
MP对外暴露了一个自动填充的接口MetaObjectHandler ,用户只需要实现该接口,并且重写其中的方法.即可以实现自动填充的功能.
三级菜单功能展示
1.将表数据进行封装
/*
* 1.准备Map集合,实现数据封装
* Map<key,value> = Map<parentId,List<ItemCat>>
* 2.封装业务说明
* map中key--parentId
* 不存在: 可以存储该key
* 同时封装一个List集合,将自己作为第一个元素封装到其中
* 存在: 根据key获取所有子级集合,将自己追加进去 形成第二个元素
* */
//通过Map集合进行数据封装
public Map<Integer,List<ItemCat>> itemCatMap(){
//1.定义Map集合
Map<Integer,List<ItemCat>> map = new HashMap<>();
//2.查询所有的数据信息 1-2-3
List<ItemCat> list = itemCatMapper.selectList(null);
for (ItemCat itemCat : list){
int parentId = itemCat.getParentId();//获取父级ID
if (map.containsKey(parentId)){//判断集合中是否已经有parentId
//有key 获取list集合 将自己追加到集合中
List<ItemCat> exeList = map.get(parentId);//引用对象
exeList.add(itemCat);
}else {
//没有key,将自己封装为第一个list元素
List<ItemCat> firstList = new ArrayList<>();
firstList.add(itemCat);
map.put(parentId, firstList);
}
}
return map;
}
//二级菜单展现,被一级菜单所包含
public List<ItemCat> getTwoList(Map<Integer,List<ItemCat>> map){
List<ItemCat> oneList = map.get(0);
for (ItemCat oneitemCat : oneList){//查询二级 parentId=1级ID
List<ItemCat> twoList = map.get(oneitemCat.getId());
oneitemCat.setChildren(twoList);
}
//二级嵌套在一级集合中,所有永远返回的都是1级
return oneList;
}
//根据前端传来的参数,选择展示的是几级菜单内容
@Override
public List<ItemCat> findItemCatList(Integer level) {
long startTime = System.currentTimeMillis();
Map<Integer, List<ItemCat>> map = itemCatMap();
//1.如果level=1,说明获取一级商品分类信息 parent_id=0
if (level == 1){
return map.get(0);
}
if (level == 2){//获取一级和二级菜单信息
return getTwoList(map);
}
//3.获取三级菜单信息
//3.1获取二级商品分类信息 BUG:有的数据可能没有子级 如何处理
List<ItemCat> oneList = getTwoList(map);
for (ItemCat oneItemCat : oneList){
//从一级集合中,获取二级菜单列表
List<ItemCat> twoList = oneItemCat.getChildren();
//bug解决: 如果该元素没有2级列表,则跳过本次循环,执行下一次操作
if(twoList == null || twoList.size()==0){
continue;
}
for(ItemCat twoItemCat : twoList){
//查询三级商品分类 条件:parentId=2级ID
List<ItemCat> threeList = map.get(twoItemCat.getId());
twoItemCat.setChildren(threeList);
}
}
long endTime = System.currentTimeMillis();
System.out.println("耗时:"+(endTime - startTime)+"毫秒");
return oneList;
}
删除表
/*
* 策略: 如果是父级,则应该删除子集
* @param itemCat
* */
@Override
@Transactional //添加事务控制
public void deleteItemCat(ItemCat itemCat) {
//1.判断是否为三级菜单
if (itemCat.getLevel() == 3){
//如果是三级,直接删除
itemCatMapper.deleteById(itemCat.getId());
return; //程序终止
}
//2.检查菜单是否为二级
if (itemCat.getLevel() == 2){
//应该先删除三级 根据parent_id=2级ID即可
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id", itemCat.getId());
itemCatMapper.delete(queryWrapper);
//再删除2级菜单
itemCatMapper.deleteById(itemCat.getId());
return;
}
//删除1级商品分类信息
//1.首先获取商品2级信息 parent_id=1级ID
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id", itemCat.getId());
List<ItemCat> twolist = itemCatMapper.selectList(queryWrapper);
for (ItemCat twolistCat : twolist){
queryWrapper.clear();
queryWrapper.eq("parent_id", twolistCat.getId());
itemCatMapper.delete(queryWrapper);//删除3级菜单
itemCatMapper.deleteById(twolistCat.getId());//删除2级
}
itemCatMapper.deleteById(itemCat.getId());//删除1级
}