先从后台讲起

1.表的设计

  parent_id就是另外一条记录的id,无限极表设计可以参考  http://m.blog.csdn.net/Rookie_Or_Veteran/article/details/75711386

2.mysql查询很容易,关键是要把id,text,parentId查出来

<?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="bs.photo">
<select id="queryPhoto" parameterType="com.xgt.bean.bs.PhotoBean" resultType="com.xgt.dao.entity.bs.Photo">
SELECT
bp.id,
bb.`name` brandName,
bp.`name` text,
bp.photo_url photoUrl,
bp.number,
bp.add_time addTime,
bp.modify_time modifyTime,
bp.parent_id parentId,
bp.photo_number photoNumber,
bp.`description`,
bp.`condition`,
bp.specification,
bp.version_name versionName
FROM
bs_photo bp INNER JOIN bs_brand bb ON bp.brand_id = bb.id <include refid="sqlWhere"/>
<include refid="common.Pagination_Limit"/>
</select>
</mapper>
 

3.dao层

package com.xgt.dao.bs;

import com.xgt.bean.bs.PhotoBean;
import com.xgt.dao.entity.bs.Photo;
import org.jboss.resteasy.annotations.Query;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository; import java.util.List; /**
* Created by Administrator on 2017/8/21.
*/
@Repository
public class PhotoDao {
@Autowired
@Qualifier("sqlSession")
private SqlSessionTemplate sqlSession; public List<Photo> queryPhoto(PhotoBean photoBean){
return sqlSession.selectList("bs.photo.queryPhoto",photoBean);
}
}

4.service逻辑层

  关键逻辑在buildPhoto方法和getChildren方法,这里用了lamda表达式,lamda表达式可以参考我的博客:http://www.cnblogs.com/Java-Starter/p/7424229.html

package com.xgt.service.bs;

import com.xgt.bean.bs.PhotoBean;
import com.xgt.dao.bs.PhotoDao;
import com.xgt.dao.entity.bs.Brand;
import com.xgt.dao.entity.bs.Photo;
import org.apache.commons.collections.map.HashedMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.ArrayList;
import java.util.List;
import java.util.Map; /**
* Created by Administrator on 2017/8/21.
*/
@Service
public class PhotoService {
@Autowired
private PhotoDao photoDao; private List<Photo> photoList;
public List<Photo> queryPhotoArborescence(PhotoBean photoBean){
photoList = photoDao.queryPhoto(photoBean);
return buildPhoto();
}
/**
* 构建资源数
* @return list
*/
public List<Photo> buildPhoto() {
List<Photo> target = new ArrayList<>();
if (!photoList.isEmpty()) {
// 根元素
photoList.stream().filter(photo -> photo.getParentId() == 0).forEach(photo -> { // 根元素
List<Photo> children = getChildren(photo);
photo.setChildren(children);
target.add(photo);
});
}
return target;
} private List<Photo> getChildren(Photo photo) {
List<Photo> children = new ArrayList<>();
if (!photoList.isEmpty()) {
photoList.stream().filter(child -> photo.getId().equals(child.getParentId())).forEach(child -> {
List<Photo> tmp = getChildren(child);
child.setChildren(tmp);
if (tmp.isEmpty()) {
child.setLeaf(true);
}
children.add(child);
});
}
return children;
}
}

5.Controller层

  没什么操作

package com.xgt.controller;

import com.xgt.bean.bs.BrandBean;
import com.xgt.bean.bs.PhotoBean;
import com.xgt.common.BaseController;
import com.xgt.common.PcsResult;
import com.xgt.dao.entity.bs.Photo;
import com.xgt.exception.EnumPcsServiceError;
import com.xgt.service.bs.PhotoService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.jboss.resteasy.annotations.Form;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.Map; /**
* Created by Administrator on 2017/8/28.
*/
@Controller
@Path("/photo")
public class PhotoController extends BaseController{
@Autowired
private PhotoService photoService;   /**
* 遍历商品树状结构
* @param accessToken
* @param keyWord
* @return
*/
@GET
@Path("/queryPhotoArborescence")
@Produces(MediaType.APPLICATION_JSON)
public PcsResult queryPhotoArborescence(@QueryParam("keyWord") String keyWord) {
PhotoBean photoBean = new PhotoBean();
photoBean.setKeyWord(keyWord);
List<Photo> list = photoService.queryPhotoArborescence(photoBean);
if(list.size()==0){
return newResult(false);
}
return newResult(true).setData(list);
} }

前台部分

1.model层

  数据声明,便于查看有哪些数据,少一些数据不设置也可以

/**
* Created by C on 2017/08/05.
*/
Ext.define('Admin.model.photoArborescence.PhotoArborescence', {
extend: 'Admin.model.Base',
idProperty: 'id',
fields: [
{name: 'id', type: 'int'},
{name: 'name', type: 'string'},
{name: 'parentId', type: 'int'}
]
});

2.store层

  和后台连接的桥梁

/**
* Created by Cjy on 2017/08/05.
*/
Ext.define('Admin.store.photoArborescence.PhotoArborescence', {
extend: 'Ext.data.TreeStore', requires: [
'Common.Config'
], storeId: 'photoArborescence.PhotoArborescence', root: {
id: 0,
text: '效果图'
},
proxy: {
type: 'ajax',
api: {
read: Common.Config.requestPath('Photo', 'queryPhotoArborescence')
},
reader: {
type: 'json',
rootProperty: 'data'
}
}
});

3.View层

/**
* Created by Cjy on 2017/5/23.
*/
Ext.define('Admin.view.photoArborescence.PhotoArborescence', {
extend: 'Ext.container.Container', xtype: 'photoArborescence', requires: [
'Ext.tree.Panel',
'Admin.view.photoArborescence.PhotoArborescenceController'
], controller: 'photoArborescence', layout: 'fit', listeners: {
beforerender: 'pictureBeforeRender'
}, defaults: {
height: '100%'
},
autoHeight : true,// 自动高度,默认false
animate : true,// 展开动画
enableDrag : true,// 是否可以拖动(效果上)
enableDD : true,// 不进可以拖动,还可以改变节点层次结构
enableDrop : false,// 仅仅drop
rootVisible : true,// 是否显示根节点,默认true
height : 150, items: [{
title: '自主报价管理',
xtype: 'treepanel',
reference: 'photoTree',
valueField: 'name',
useArrows: true,
autoScroll:true,
height:1150,
store: 'photoArborescence.PhotoArborescence'
}]
});

4.Controller层

  js动作,执行前加载

/**
* Created by Cjy on 2017/5/23.
*/
Ext.define('Admin.view.photoArborescence.PhotoArborescenceController', {
extend: 'Admin.view.BaseViewController',
alias: 'controller.photoArborescence', /**
* 界面 渲染的时候加载 菜单 tree
*/
pictureBeforeRender: function () {
var store = this.lookupReference('photoTree').getStore();
console.log(store);
store.getRoot().set('expanded', true);
store.load();
} });

结果

基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)的更多相关文章

  1. SSM(SpringMVC+Spring+MyBatis)三大框架使用Maven快速搭建整合(实现数据库数据到页面进行展示)

    本文介绍使用SpringMVC+Spring+MyBatis三大框架使用Maven快速搭建一个demo,实现数据从数据库中查询返回到页面进行展示的过程. 技术选型:SpringMVC+Spring+M ...

  2. 3.springMVC+spring+Mybatis整合Demo(单表的增删该查,这里主要是贴代码,不多解释了)

    前面给大家讲了整合的思路和整合的过程,在这里就不在提了,直接把springMVC+spring+Mybatis整合的实例代码(单表的增删改查)贴给大家: 首先是目录结构: 仔细看看这个目录结构:我不详 ...

  3. SpringMVC+Spring+Mybatis+Maven+mysql整合

    一.准备工作1.工具:jdk1.7.0_80(64)+tomcat7.0.68+myeclipse10.6+mysql-5.5.48-win322. 开发环境安装配置.Maven项目创建(参考:htt ...

  4. springmvc spring mybatis插入mysql中文乱码

    springmvc 插入mysql数据库中文乱码问题: 1.将页面中的编码改成utf-8 2.用SQLyog右击->改变数据库 以上两步可以保证页面数据编码一致 3.在mybatis连接的地方加 ...

  5. SpringMVC+Spring+mybatis项目从零开始--分布式项目结构搭建

    转载出处: SpringMVC+Spring+mybatis+Redis项目从零开始--分布式项目结构搭建 /** 本文为博主原创文章,如转载请附链接. **/ SSM框架web项目从零开始--分布式 ...

  6. 基于SpringMVC+Spring+MyBatis实现秒杀系统【概况】

    前言 本教程使用SpringMVC+Spring+MyBatis+MySQL实现一个秒杀系统.教程素材来自慕课网视频教程[https://www.imooc.com/learn/631].有感兴趣的可 ...

  7. SpringMVC+Spring+Mybatis+Mysql项目搭建

    眼下俺在搭建一个自己的个人站点玩玩.一边练习.一边把用到的技术总结一下,日后好复习. 站点框架大致例如以下图所看到的: 眼下仅仅用到了SpringMVC+Spring+Mybatis+Mysql.把它 ...

  8. springmvc学习总结(二) -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

    @_@ 写在最前 之前分享过下面这几篇: mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上)(附demo和搭建过程遇到的问题解决方法) myba ...

  9. maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

    转自:https://www.cnblogs.com/lmei/p/7190755.html?utm_source=itdadao&utm_medium=referral @_@ 写在最前 之 ...

随机推荐

  1. JS - 实现简单易用的倒计时 x 天 x 时 x 分 x 秒

    <script> (function () { var tian = document.getElementsByClassName('JS-tian')[0]; var shi = do ...

  2. java核心机制

    Java中有两种核心机制:Java虚拟机(Java Virtual Machine).垃圾收集机制(Garbage collection) 一.核心机制之Java虚拟机 ① Java虚拟机可以理解成一 ...

  3. scroll事件实现监控滚动条并分页显示示例(zepto.js )

    今天做了一个类似于手机端京东首页的页面,效果图如下: 刷新页面的时候,标题栏(也就是搜索栏),背景是透明的,当我们往下滑的时候,可以改变标题栏的背景透明度(渐变效果): 当标题栏滑过轮播图后,透明度就 ...

  4. 用caffe一步一步实现人脸检测

    学习深度学习已有一段时间了,总想着拿它做点什么,今天终于完成了一个基于caffe的人脸检测,这篇博文将告诉你怎样通过caffe一步步实现人脸检测.本文主要参考唐宇迪老师的教程,在这里感谢老师的辛勤付出 ...

  5. POI读取excel工具类 返回实体bean集合(xls,xlsx通用)

    本文举个简单的实例 读取上图的 excel文件到 List<User>集合 首先 导入POi 相关 jar包 在pom.xml 加入 <!-- poi --> <depe ...

  6. Android开发之监听器

    一直都想进行安卓开发,最近上手了Android.刚开始学习一些基本控件,学习Android就如同进入一个新的世界,印象最深的是这个世界的规则. 最近学习了监听器,对于这个我的一点理解是监听键盘活动 B ...

  7. Spring核心--IOC

    先说说Spring框架 Spring框架 Spring框架的作用 Spring 的核心(IOC功能) SpringAOP功能 原有的业务流程:请求->servlet-->service-- ...

  8. Java 编程 订单、支付、退款、发货、退货等编号主动生成类

    订单.支付.退款.发货.退货等编号主动生成类 在商城网站中,订单编号的自动生成,ERP中各个单据的编号自动生成,都可以按照一下的方式来自动生成. 第一步:定义常量订单编号前缀.订单编号起始数.订单编号 ...

  9. InnoDB 索引原理

    InnoDB索引原理 索引能够提高访问的速率 B+树索引(最为常用和最为有效).全文索引.哈希索引. 数据库中的B+树索引可以分为聚集索引和辅助索引,但是不管是聚集还是辅助的索引,其内部都是B+树,是 ...

  10. NYOJ--19--next_permutation()--擅长排列的小明

    /* Name: NYOJ--19--擅长排列的小明 Date: 20/04/17 11:06 Description: 这道题可以DFS,然而用next_permutation更简单些 主要是全排列 ...