首页的大广告

JS效果:
1、 点击下面的序号选择查询哪个广告
2、 自动切换
3、 点击图片查询具体的页面

以上是由前端团队来开发。

数据结构

说明:必须提供6条数据,才能显示效果。

如何实现?
方案一:
1、 在后台系统中创建一张表,存储大广告位的广告数据
2、 在后台系统中对该表进行CRUD
3、 后台系统对外提供接口服务
4、 前台系统调用后台系统的提供的接口服务,即可获取到数据
5、 前台系统获取到数据后,封装成前端所需要的数据结构,功能即可实现

方案二:
1、 将首页显示的广告都抽象的看作是内容
2、 在后台系统中创建一张内容表
3、 创建一个内容分类表用于区分内容的分类
4、 后台系统对内容表以及分类表进行CRUD
5、 对外提供接口服务
6、 前端系统通过接口获取数据,进行封装,即可实现

内容管理系统(CMS)

内容分类管理

内容分类表

内容表

应该有的字段:
1、 图片
2、 连接
3、 标题
4、 子标题

表结构中字段是否添加索引判断依据是什么? – 字段是否是查询条件或者是排序条件。

是否将所有的字段都添加索引,来加快查询? – 不行的

1、 索引会占用存储空间,索引越多,使用的存储空间越多
2、 插入数据,存储索引也会消耗时间,索引越多,插入数据的速度越慢

实现

创建pojo

package com.taotao.manage.pojo;import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;@Table(name = "tb_content")
public class Content extends BasePojo {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "category_id")private Long categoryId;private String title;@Column(name = "sub_title")private String subTitle;@Column(name = "title_desc")private String titleDesc;private String url;private String pic;private String pic2;private String content;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getCategoryId() {return categoryId;}public void setCategoryId(Long categoryId) {this.categoryId = categoryId;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getSubTitle() {return subTitle;}public void setSubTitle(String subTitle) {this.subTitle = subTitle;}public String getTitleDesc() {return titleDesc;}public void setTitleDesc(String titleDesc) {this.titleDesc = titleDesc;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}public String getPic2() {return pic2;}public void setPic2(String pic2) {this.pic2 = pic2;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}}
package com.taotao.manage.pojo;import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;@Table(name = "tb_content_category")
public class ContentCategory extends BasePojo {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "parent_id")private Long parentId;private String name;private Integer status;@Column(name = "sort_order")private Integer sortOrder;@Column(name = "is_parent")private Boolean isParent;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getParentId() {return parentId;}public void setParentId(Long parentId) {this.parentId = parentId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public Integer getSortOrder() {return sortOrder;}public void setSortOrder(Integer sortOrder) {this.sortOrder = sortOrder;}public Boolean getIsParent() {return isParent;}public void setIsParent(Boolean isParent) {this.isParent = isParent;}// 扩展字段,用于EasyUI中tree结构public String getText() {return getName();}public String getState() {return getIsParent() ? "closed" : "open";}}

创建mapper

package com.taotao.manage.mapper;import com.github.abel533.mapper.Mapper;
import com.taotao.manage.pojo.Content;public interface ContentMapper extends Mapper<Content> {}
package com.taotao.manage.mapper;import com.github.abel533.mapper.Mapper;
import com.taotao.manage.pojo.ContentCategory;public interface ContentCategoryMapper extends Mapper<ContentCategory> {}

创建service

创建controller

内容分类管理

创建根节点:

分类列表查询

package com.taotao.manage.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;import com.taotao.manage.pojo.ContentCategory;
import com.taotao.manage.service.ContentCategoryService;@RequestMapping("content/category")
@Controller
public class ContentCategoryController {@Autowiredprivate ContentCategoryService contentCategoryService;/*** 根据父节点id查询内容分类列表* * @param pid* @return*/@RequestMapping(method = RequestMethod.GET)public ResponseEntity<List<ContentCategory>> queryListByParentId(@RequestParam(value = "id", defaultValue = "0") Long pid) {try {ContentCategory record = new ContentCategory();record.setParentId(pid);List<ContentCategory> list = this.contentCategoryService.queryListByWhere(record);if (null == list || list.isEmpty()) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);}return ResponseEntity.ok(list);} catch (Exception e) {e.printStackTrace();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}
}

效果:

节点的右键菜单


定义菜单:

右键触发菜单显示:

具体的菜单事件:

新增事件

JS实现:

按下回车,编辑完成事件:

后台实现:
Controller:

 /*** 新增节点* * @param contentCategory* @return*/@RequestMapping(method = RequestMethod.POST)public ResponseEntity<ContentCategory> saveContentCategory(ContentCategory contentCategory) {try {this.contentCategoryService.saveContentCategory(contentCategory);return ResponseEntity.status(HttpStatus.CREATED).body(contentCategory);} catch (Exception e) {e.printStackTrace();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}

Service:

 public void saveContentCategory(ContentCategory contentCategory) {contentCategory.setId(null);contentCategory.setIsParent(false);contentCategory.setSortOrder(1);contentCategory.setStatus(1);super.save(contentCategory);// 判断该节点的父节点的isParent是否为true,不是,需要修改为trueContentCategory parent = super.queryById(contentCategory.getParentId());if (!parent.getIsParent()) {parent.setIsParent(true);super.update(parent);}}

测试:

重命名

JS实现:

后端实现:

 /*** 重命名* * @param id* @param name* @return*/@RequestMapping(method = RequestMethod.PUT)public ResponseEntity<Void> rename(@RequestParam("id") Long id, @RequestParam("name") String name) {try {ContentCategory category = new ContentCategory();category.setId(id);category.setName(name);this.contentCategoryService.updateSelective(category);return ResponseEntity.status(HttpStatus.NO_CONTENT).build();} catch (Exception e) {e.printStackTrace();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();}

测试:

删除

JS实现:

过滤器:

后端实现:
Controller:

/*** 删除节点,包含它的所有子节点都被删除* * @param contentCategory* @return*/@RequestMapping(method = RequestMethod.DELETE)public ResponseEntity<Void> delete(ContentCategory contentCategory) {try {this.contentCategoryService.deleteAll(contentCategory);return ResponseEntity.status(HttpStatus.NO_CONTENT).build();} catch (Exception e) {e.printStackTrace();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();}

Service:

 public void deleteAll(ContentCategory contentCategory) {List<Object> ids = new ArrayList<Object>();ids.add(contentCategory.getId());// 递归查找该节点下的所有子节点idthis.findAllSubNode(ids, contentCategory.getId());//批量删除super.deleteByIds(ContentCategory.class, "id",ids);// 判断该节点是否还有兄弟节点,如果没有,修改父节点的isParent为falseContentCategory record = new ContentCategory();record.setParentId(contentCategory.getParentId());List<ContentCategory> list = super.queryListByWhere(record);if (null == list || list.isEmpty()) {ContentCategory parent = new ContentCategory();parent.setId(contentCategory.getParentId());parent.setIsParent(false);super.updateSelective(parent);}}private void findAllSubNode(List<Object> ids, Long pid) {ContentCategory record = new ContentCategory();record.setParentId(pid);List<ContentCategory> list = super.queryListByWhere(record);for (ContentCategory contentCategory : list) {ids.add(contentCategory.getId());// 判断该节点是否为父节点,如果是,继续调用该方法查找子节点if (contentCategory.getIsParent()) {// 开始递归findAllSubNode(ids, contentCategory.getId());}}}

测试:


内容管理

选择内容分类加载数据

新增内容

校验,必须选中内容分类才能创建内容数据:

新增内容页面:

点击提交事件

后端实现

@RequestMapping("content")
@Controller
public class ContentController {@Autowiredprivate ContentService contentService;/*** 新增内容* * @param content* @return*/@RequestMapping(method = RequestMethod.POST)public ResponseEntity<Void> saveContent(Content content) {try {content.setId(null);this.contentService.save(content);return ResponseEntity.status(HttpStatus.CREATED).build();} catch (Exception e) {e.printStackTrace();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();}}

测试:

查询内容列表

JS实现

Controller实现

 /***  根据内容分类id查询分类列表*  * @param categoryId* @param page* @param rows* @return*/@RequestMapping(method = RequestMethod.GET)public ResponseEntity<EasyUIResult> queryListByCategoryId(@RequestParam("categoryId") Long categoryId,@RequestParam(value = "page", defaultValue = "1") Integer page,@RequestParam(value = "rows", defaultValue = "10") Integer rows) {try {EasyUIResult easyUIResult = this.contentService.queryListByCategoryId(categoryId, page, rows);return ResponseEntity.ok(easyUIResult);} catch (Exception e) {e.printStackTrace();}return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);}

Service

package com.taotao.manage.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.taotao.common.bean.EasyUIResult;
import com.taotao.manage.mapper.ContentMapper;
import com.taotao.manage.pojo.Content;@Service
public class ContentService extends BaseService<Content> {@Autowiredprivate ContentMapper contentMapper;public EasyUIResult queryListByCategoryId(Long categoryId, Integer page, Integer rows) {PageHelper.startPage(page, rows);List<Content> list = this.contentMapper.queryContentList(categoryId);PageInfo<Content> pageInfo = new PageInfo<Content>(list);return new EasyUIResult(pageInfo.getTotal(), pageInfo.getList());}
}

Mapper

package com.taotao.manage.mapper;import java.util.List;import com.github.abel533.mapper.Mapper;
import com.taotao.manage.pojo.Content;public interface ContentMapper extends Mapper<Content> {/*** 根据categoryId查询内容列表,并且按照更新时间倒序排序* * @return*/public List<Content> queryContentList(Long categoryId);}

Mapper.xml

<?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.taotao.manage.mapper.ContentMapper"><select id="queryContentList" resultType="Content">SELECT * FROM tb_content WHERE category_id = #{categoryId} ORDER BY updated DESC</select></mapper>

在Spring和Mybatis的整合文件中读取Mapper.xml

测试:

【SSM分布式架构电商项目-14】后台CMS内容管理系统管理前台首页广告相关推荐

  1. 【SSM分布式架构电商项目-07】后台管理系统查询商品列表以及日志的书写

    查询商品列表 JS EasyUI的datagrid的格式化输出 默认情况下,会直接显示返回的数据,但是有些情况下不能直接显示,如:价格.日期.性别,需要指定formatter函数. 后台实现 Cont ...

  2. 【SSM分布式架构电商项目-02】实现后台管理系统的选择商品类目

    首页的js布局实现 这里采用的是easy-ui搭建的界面: 左中布局: 左侧菜单树: 效果: 菜单的点击事件 选择商品类目 功能描述:在新增商品时点击选择类目,弹出窗口,在窗口中显示商品类目数据. 点 ...

  3. vue尚品汇商城项目-day00【项目介绍:此项目是基于vue2的前台电商项目和后台管理系统】

    文章目录 本人其他相关文章链接 项目介绍:此项目是基于vue2的前台电商项目和后台管理系统 此项目为在线电商Web App (SPA) 包括首页, 搜索列表, 商品详情, 购物车, 订单, 支付, 用 ...

  4. 手把手教你SSM搭建Easymall电商项目 (二)

    SSM搭建Easymall电商项目 (二) 目录 SSM搭建Easymall电商项目 (二) 一.Easymall需求代码实现 1.测试类测试请求地址路径IndexController.java    ...

  5. 400集高并发分布式超级电商项目实战

    带走一盏渔火 让他温暖我的双眼 留下一段真情 让它停泊在枫桥边 久违的你 一定保存着那套网盘 许多年以后 躺在网盘里的视频 依然尘封未动 涛声依旧不见当初的夜晚 今天的你我 怎样重复昨天的故事 涛哥说 ...

  6. 前端学习之vue+element-ui电商项目(九)订单管理

    文章目录 0. 准备工作 1.界面样式 1.1 界面布局 1.2 导航区 2.订单数据列表 2.1 界面样式 2.2 数据添加 2.3 方法实现 3.分页区 3.1 界面样式 3.2 数据添加 3.3 ...

  7. 大型分布式redis+solr+Linux+nginx+springmvc+mybatis电商项目-任亮-专题视频课程

    大型分布式redis+solr+Linux+nginx+springmvc+mybatis电商项目-45845人已学习 课程介绍         中国移动省级网上商城项目,用于建立网上终端.营销案和号 ...

  8. 谷粒商城 - 微服务分布式电商项目

    谷粒商城 1.项目背景 谷粒商城项目是尚硅谷研究院最新推出的完整大型分布式架构电商平台,技术全面.业务深入,全网无出其右.技术涵盖:微服务架构 + 分布式 + 全栈 + 集群 + 部署 + 自动化运维 ...

  9. 微服务项目之电商--9.商城架构图及商城管理系统前端页面介绍及电商项目初步搭建(1)

    目录 一.商城架构图 前端: 二.商城管理系统前端页面 1.SPA介绍 2.webpack 四个核心概念 3.vue-cli 安装 4.项目测试 三.电商项目搭建 创建父模块管理 创建子模板注册中心l ...

  10. 电商项目——商品服务-API-属性分组——第十一章——上篇

    电商项目--初识电商--第一章--上篇 电商项目--分布式基础概念和电商项目微服务架构图,划分图的详解--第二章--上篇 电商项目--电商项目的虚拟机环境搭建_VirtualBox,Vagrant-- ...

最新文章

  1. PNAS-2018-病原菌在植物免疫下的转录组
  2. 2021年春季学期-信号与系统-第七次作业参考答案-第七小题
  3. 三国志战略版服务器维护延时,三国志战略版服务器爆满是多少人 爆满进不去怎么办...
  4. 从JDK 6升级到JDK 7过程中遇到的一个问题(卸载rpm)
  5. Atitit.多媒体区----web视频格式的选择总结
  6. Putty 重新启动 linux sqlserver服务
  7. mysql 数据透视_sql怎么做数据透视表
  8. 铁路售票系统_黑龙江一学生购买的火车票上惊现“学猪”字样!铁路部门给出回应...
  9. javascript中的一些核心知识点以及需要注意的地方
  10. 获取触发事件的元素的ID
  11. c语言 单片机模拟,【51单片机】普通I/O口模拟SPI口C语言程序
  12. (二)元学习算法MAML简介及代码分析
  13. latex中设置标题左对齐
  14. Win10画图实用小功能------反色
  15. 怎么用PS为一寸证件照更换底色背景色
  16. java语言中的变量有哪2种_变量类型有哪些-在C语言中的实型变量分为2种类型,它们是()和()-电气资讯 - 电工屋...
  17. python 获取项目根目录
  18. 服务器带宽打开网页很慢,为什么网速很快,但打开的网页速度却很慢?
  19. 【OpenGL】FBO渲染到纹理案例
  20. 计算机桌面下面那一栏如何调节,电脑底部的任务栏不见了,你可以尝试这样做,轻松恢复它...

热门文章

  1. su vary注册机_vray for sketchup2018下载
  2. 百度文库免费复制文字_我们有2种通过鼠标右键复制百度文库的方法要告诉你...
  3. 中科院-杨力祥视频教程 08课程
  4. 计算机字体安装按钮灰色,win10系统无法安装字体安装按钮灰色的的解决方法
  5. Axure RP 9 培训讲解---高级免费课程
  6. 知行EDI系统Excel方案对比集成业务系统方案
  7. 通信原理第七版樊昌信 课后习题答案详解
  8. 适应科技发展观的Steam教学实践
  9. 谷歌云实现Google Drive无限空间离线下载(完美版)
  10. CMYK、RGB颜色对照表