说在前面的话

本节基本上没有用到新的知识点。主要还是对数据库的增删改查以及创建了一个新的内容模块。

新增商品分类

由于easyUI的Tree需要三个字段(Id、state、text),

[{
"id": 1,
"text": "Node 1",
"state": "closed"
},{
"id": 2,
"text": "Node 2",
"state": "closed"
}]

因此做了一个工具类EasyUITreeNode ,方便调用返回对象。

public class EasyUITreeNode implements Serializable{

	private long id;
private String text;
private String state;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
} }

当页面加载后自动获取tree目录,此时parent_id为空,因此我们再后台设置一下若parent_id为空,则默认为0.0为一级目录.

	@RequestMapping("/content/category/list")
@ResponseBody
public List<EasyUITreeNode> getContentCat(@RequestParam(defaultValue="0",name="id")Long parent_id){
return contentCatService.getContentCategory(parent_id); }

service层:

	@Override
public List<EasyUITreeNode> getContentCategory(Long id) {
TbContentCategoryExample example = new TbContentCategoryExample();
example.createCriteria().andParentIdEqualTo(id);
List<TbContentCategory> list = contentCategoryMapper.selectByExample(example);
List<EasyUITreeNode> results = new ArrayList<>();
for (TbContentCategory l : list) {
EasyUITreeNode easyUITreeNode = new EasyUITreeNode();
easyUITreeNode.setId(l.getId());
easyUITreeNode.setState(l.getIsParent()?"closed":"open");
easyUITreeNode.setText(l.getName());
results.add(easyUITreeNode);
}
return results;
}

创建分类url:/content/category/create

逻辑介绍:当用户右击contentCategory的节点时,激发了js效果,则显示添加、重命名、删除三个选项。



当用户点击添加时,contentCategory在选择的节点上创建一个新的叶子节点,并且把该节点的id设置为0,parentId设置为叶子节点的父节点(用户点击的节点),text设置为“新建分类”,然后在整个tree中寻找id为0的节点,然后把该节点设置为可编辑状态

如图:

当用户结束编辑时(onAfterEdit),触发了onAfterEdit事件(此事件可能被两种情况触发1、创建新节点;2、重命名节点)若是第一种情况,则节点的id为0,所以进行判断,若节点的id为0,则向服务器发送创建节点请求,反之发送更改节点请求。

创建节点的请求需要发送parentId和name,若成功,系统需要返回该节点的id和status(用e3result对象返回),然后再把id的值(id=0新创建的节点id都为0)改为新的id的值(服务器返回的值)。

更改节点的请求发送本节点的id和text即可。

代码如图:



service层:

当该节点创建新的节点后,该节点一定是父亲节点(isparent=true),新的节点必须是叶子节点(isparent=false),因此service需要进行两步

	//创建内容管理节点
@Override
public E3Result createNodeCat(Long parentId, String name) {
//补充数据
TbContentCategory record = new TbContentCategory();
record.setCreated(new Date());
record.setIsParent(false);//新建的一定是叶子节点
record.setName(name);
record.setParentId(parentId);
record.setSortOrder(1);//默认1排序
record.setStatus(1);//可选值:1(正常),2(删除)',
record.setUpdated(new Date());
//添加数据(设置了select LAST_INSERT_ID())
contentCategoryMapper.insertSelective(record);
//把它的父亲节点变成is_parent
TbContentCategoryExample example = new TbContentCategoryExample();
Criteria createCriteria = example.createCriteria();
createCriteria.andIdEqualTo(parentId);
//创建一个category对象,除了isparent为true,其他都为null
TbContentCategory category = new TbContentCategory();
category.setIsParent(true);
//只修改不为空的数据
//把父节点更改的isparent改为true
contentCategoryMapper.updateByExampleSelective(category, example);
return E3Result.ok(record);
}

controller层:

	//创建新的节点
@RequestMapping("/content/category/create")
@ResponseBody
public E3Result createNodeCat(Long parentId,String name){
return contentCatService.createNodeCat(parentId, name);
}

修改商品分类

修改商品逻辑同上,直接贴代码

service层:

@Override
public void updateNodeCat(Long id, String name) {
TbContentCategoryExample example = new TbContentCategoryExample();
example.createCriteria().andIdEqualTo(id);
//创建pojo
TbContentCategory record = new TbContentCategory();
record.setName(name);
contentCategoryMapper.updateByExampleSelective(record, example);
}

controller层:

@RequestMapping("/content/category/update")
@ResponseBody
public void updateNodeCat(Long id,String name){
contentCatService.updateNodeCat(id, name);
}

当用户点击重命名(楼上已说)和删除后的逻辑代码(点击删除向服务器发送删除请求)

删除商品分类

service层:

	@Override
public void deleteNodeCat(Long id) {
contentCategoryMapper.deleteByPrimaryKey(id);
}

controller层:

@RequestMapping("/content/category/delete/")
@ResponseBody
public void deleteNodeCat(Long id){
contentCatService.deleteNodeCat(id); }

创建e3mall-content模块

同第一天略

e3mall商城的归纳总结5之修改商品分类、e3mall—content的搭建的更多相关文章

  1. e3mall商城的归纳总结9之activemq整合spring、redis的缓存

    敬给读者 本节主要给大家说一下activemq整合spring,该如何进行配置,上一节我们说了activemq的搭建和测试(单独测试),想看的可以点击时空隧道前去查看.讲完了之后我们还说一说在项目中使 ...

  2. e3mall商城的归纳总结1之项目的架构

    首先来谈谈e3mall商城,e3mall商城是黑马推出一个学习的项目,前身是淘淘商城.两个用的技术差不多.,但由于后期加了一些新技术,更名为e3mall商城.本商城为分布式商城,主要用到的技术使mav ...

  3. e3mall商城的归纳总结10之freemarker的使用和sso单点登录系统的简介

    敬给读者的话 本节主要讲解freemarker的使用以及sso单点登录系统,两种技术都是比较先进的技术,freemarker是一个模板,主要生成一个静态静态,能更快的响应给用户,提高用户体验. 而ss ...

  4. e3mall商城的归纳总结6之redis

    一.说在前面的话 前面几节我们主要对该项目的后端进行了增删改查,但是所有的数据都是存放在数据库中,这样的话数据库的压力显而易见是很大的,因此本节学习nosql的缓存,也就是redis的使用,在使用之前 ...

  5. e3mall商城的归纳总结4之图片服务器以及文本编辑器

    一.图片服务器 --1.认识图片服务器 大家可能都知道在分布式架构中使用图片上传可能会导致文件存放在某一个项目,而我们的项目基本上都采用集群的方式 ,因此这样会导致图片的问题比较难以存放,在这里我们有 ...

  6. e3mall商城的归纳总结2之认识dubbo、zookeeper

    由于本项目用的是soa架构,因此必须需要两个系统之间进行通信,目前的解决办法有三种(本人认为) Webservice:效率不高基于soap协议.项目中不推荐使用. 使用restful形式的服务:htt ...

  7. e3mall商城的归纳总结7之solr搭建和应用

    敬给读者的话 本文主要应用的技术是solr技术的搭建和应用,本文小编尽量写的更详细一些,让读者在不考虑项目的情况下也能正常完成solr的搭建,说完搭建之后,再说明运行solrj在项目中如何应用solr ...

  8. e3mall商城的归纳总结8之solr集群、activemq的搭建和使用

    由于本节内容比较分散,因此专门为这两个技术进行开展了帖子. solr集群的搭建 solr集群solrJ的测试 activemq的搭建 activemq的使用 引入activemq.jar包 我们先来说 ...

  9. e3mall商城的归纳总结3之后台商品节点、认识nginx

    一  后台商品节点 大家都知道后台创建商品的时候需要选择商品的分类,而这个商品的分类就就像一棵树一样,一层包含一层又包含一层.因此这里用的框架是easyUiTree.该分类前端使用的是异步加载模式(指 ...

随机推荐

  1. 2020牛客暑期多校训练营 第二场 A All with Pairs 字符串hash KMP

    LINK:All with Pairs 那天下午打这个东西的时候状态极差 推这个东西都推了1个多小时 (比赛是中午考试的我很困 没睡觉直接开肝果然不爽 一开始看错匹配的位置了 以为是\(1-l\)和\ ...

  2. js数组中如何去除重复值?

    在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的 ...

  3. CI4框架应用六 - 控制器应用

    这节我们来分析一下控制器的应用,我们看到系统提供的控制器都是继承自一个BaseController,我们来分析一下这个BaseController的作用 use CodeIgniter\Control ...

  4. 解读生成对抗网络(GAN) 之U-GAN-IT

    Unsupervised Generative Attentionnal Networks with Adapter Layer-In(U-GAN-IT) 从字面我们可以理解为无监督生成对抗网络和适配 ...

  5. DCGAN实现

    DCGAN实现 代码 dcgan.py #!/usr/bin/env python # -*- coding: utf-8 -*- import os import math import argpa ...

  6. MySQL数据库——连接查询

    1.基本含义 连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”. 实际上,两个表的完全的连接是这样的一个过程: 左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有 ...

  7. 2020-06-25:B+树和B树有什么区别?

    福哥答案2020-06-25: B树:1.叶子节点和非叶子节点都存数据.2.数据无链指针.B+树:1.只有叶子节点存数据.2.数据有链指针.B树优势:1.靠近根节点的数据,访问速度快.B+树优势:1. ...

  8. Vue $nextTick的一个使用场景

    $nextTick 官方解释 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM 使用场景 在页面上有2个表单元素和2个按钮 btnRequiredFi ...

  9. Vuex mapState的基本使用

    mapState把Store中的state映射到组件中的计算属性 Store文件 import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) ...

  10. CodeReview 的经验和原则

    资深的程序员都知道 Code Review 可以对代码质量,代码规范,团队代码能力提升带来很大的提升,还有著名的技术专家"左耳朵耗子"也说过: 我认为没有 Code Review ...