springboot:thymeleaf (2) 結(jié)合jpa斤蔓, adminlte呈現(xiàn)樹(shù)形結(jié)構(gòu)菜單

標(biāo)簽(空格分隔): jpa repository 樹(shù)形菜單 adminlte springboot thymeleaf


側(cè)邊欄樹(shù)形結(jié)構(gòu)菜單應(yīng)該是后臺(tái)管理系統(tǒng)的標(biāo)配吧植酥,這里講一下在選用的方案中有thymeleaf,jpa/repository弦牡,adminlte的情況下怎么實(shí)現(xiàn)這個(gè)功能友驮。

實(shí)現(xiàn)

功能雖然簡(jiǎn)單,但是要綜合三種工具來(lái)做驾锰,不太好說(shuō)卸留,所以下面一邊列代碼一遍做點(diǎn)說(shuō)明
layout.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" 
      xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>AdminLTE 2 | Dashboard</title>
  <!-- Tell the browser to be responsive to screen width -->
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  <!-- Bootstrap 3.3.7 -->
  <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="bower_components/font-awesome/css/font-awesome.min.css">
  <!-- Ionicons -->
  <link rel="stylesheet" href="bower_components/Ionicons/css/ionicons.min.css">
  <!-- Theme style -->
  <link rel="stylesheet" href="dist/css/AdminLTE.min.css">
  <!-- AdminLTE Skins. Choose a skin from the css/skins
       folder instead of downloading all of them to reduce the load. -->
  <link rel="stylesheet" href="dist/css/skins/_all-skins.min.css">
  <!-- Morris chart -->
  <link rel="stylesheet" href="bower_components/morris.js/morris.css">
  <!-- jvectormap -->
  <link rel="stylesheet" href="bower_components/jvectormap/jquery-jvectormap.css">
  <!-- Date Picker -->
  <link rel="stylesheet" href="bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css">
  <!-- Daterange picker -->
  <link rel="stylesheet" href="bower_components/bootstrap-daterangepicker/daterangepicker.css">
  <!-- bootstrap wysihtml5 - text editor -->
  <link rel="stylesheet" href="plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css">

  <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->

  <!-- Google Font -->
  <link rel="stylesheet" >
</head>
<body class="hold-transition skin-blue sidebar-mini">
<div class="wrapper">

    <header class="main-header">
      <!-- Logo -->
      <a href="index2.html" class="logo">
        <span class="logo-lg"><b>Ticket</b>Business</span>
      </a>
      <nav class="navbar navbar-static-top">
          <a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
            <span class="sr-only">Toggle navigation</span>
          </a>          
      </nav>
    </header>
    
  <!-- Left side column. contains the logo and sidebar -->
  <aside class="main-sidebar">
    <!-- sidebar: style can be found in sidebar.less -->
    <section class="sidebar">

      <!-- sidebar menu: : style can be found in sidebar.less -->
      <ul class="sidebar-menu" data-widget="tree">
        <li class="header">HEADER</li>
        <li class="treeview" th:each="FirstLevelItem : ${FirstLeveles}">
          <a href="#">
            <i class="fa fa-pie-chart"></i>
            <span th:text="${FirstLevelItem.name}">Multilevel</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>  
          <ul class="treeview-menu">
            <li><a th:each="SecondLevelItem : ${FirstLevelItem.GetSecondLevelItems()}" th:href="@{${SecondLevelItem.site}}" th:text="${SecondLevelItem.name}"><i class="fa fa-circle-o"></i>Link in level 2</a></li>
          </ul>         
        </li>
      </ul>
    </section>
    <!-- /.sidebar -->
  </aside>

  <!-- Content Wrapper. Contains page content -->
  <div class="content-wrapper" layout:fragment="contentWrapper">

  </div>

</div>
<!-- ./wrapper -->

<!-- jQuery 3 -->
<script src="bower_components/jquery/dist/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 -->
<script src="bower_components/jquery-ui/jquery-ui.min.js"></script>
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip -->
<script>
  $.widget.bridge('uibutton', $.ui.button);
</script>
<!-- Bootstrap 3.3.7 -->
<script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<!-- Morris.js charts -->
<script src="bower_components/raphael/raphael.min.js"></script>
<script src="bower_components/morris.js/morris.min.js"></script>
<!-- Sparkline -->
<script src="bower_components/jquery-sparkline/dist/jquery.sparkline.min.js"></script>
<!-- jvectormap -->
<script src="plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script>
<script src="plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script>
<!-- jQuery Knob Chart -->
<script src="bower_components/jquery-knob/dist/jquery.knob.min.js"></script>
<!-- daterangepicker -->
<script src="bower_components/moment/min/moment.min.js"></script>
<script src="bower_components/bootstrap-daterangepicker/daterangepicker.js"></script>
<!-- datepicker -->
<script src="bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
<!-- Bootstrap WYSIHTML5 -->
<script src="plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script>
<!-- Slimscroll -->
<script src="bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script>
<!-- FastClick -->
<script src="bower_components/fastclick/lib/fastclick.js"></script>
<!-- AdminLTE App -->
<script src="dist/js/adminlte.min.js"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) -->
<script src="dist/js/pages/dashboard.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="dist/js/demo.js"></script>
</body>
</html>

針對(duì)側(cè)邊欄樹(shù)形樹(shù)形菜單的這個(gè)功能,三個(gè)工具在layout.html中分別有以下的貢獻(xiàn):

  1. adminlte
class="treeview"
class="treeview-menu"

treeview是li的樣式椭豫,treeview-menu是ul的樣式

  1. thymeleaf
th:each
th:text

th:each 告訴thymeleaf耻瑟,需要循環(huán)渲染多次當(dāng)前這個(gè)標(biāo)簽(渲染一個(gè)樹(shù)形結(jié)構(gòu)必定是要依賴(lài)循環(huán)操作的);
th:text 告訴thymeleaf當(dāng)前標(biāo)簽的text是什么

  1. jpa/repository
${FirstLeveles}
${FirstLevelItem.GetSecondLevelItems()}

FirstLeveles對(duì)應(yīng)的是用jpa/repository從數(shù)據(jù)庫(kù)中讀取出來(lái)的第一層的數(shù)據(jù)赏酥;FirstLevelItem.GetSecondLevelItems()對(duì)應(yīng)的是從用jpa/repository從數(shù)據(jù)庫(kù)中讀取出來(lái)的第二層的數(shù)據(jù)喳整。

FirstLevelRepository.java

package springbootexample.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import springboot.entities.FirstLevel;

@Repository
public interface FirstLevelRepository extends JpaRepository<FirstLevels, Integer> {

}

FirstLevel.java

package springbootexample.entities;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.*;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;


/**
 * The persistent class for the firstlevel database table.
 * 
 */
@Entity
@Table(name="firstlevel")
@NamedQuery(name="FirstLevel.findAll", query="SELECT t FROM FirstLevel t")
public class FirstLevel implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="ID")
    private int id;

    @Column(name="NAME")
    private String name;

    public FirstLevel() {
    }
    
    public FirstLevel(String name) {
        this.name = name;
    }
    
    @Transient  //告訴hibernage不要固化這個(gè)變量
    @JsonSerialize  //雖然不固化,但是允許序列化
    @JsonDeserialize    //雖然不固化裸扶,但是允許反序列化
    private List<SecondLevel> secondLevels = new ArrayList<SecondLevel>();
    
    public void addSecondLevel(SecondLevel secondLevel) {
        this.secondLevels.add(secondLevel);
    }
    
    public List<SecondLevel> GetSecondLevels(){
        return this.secondLevels;
    }
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

SecondLevelRepository.java

package springbootexample.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import springboot.entities.SecondLevel;

@Repository
public interface SecondLevelRepository extends JpaRepository<SecondLevel, Integer> {

}

SecondLevel.java

package springbootexample.entities;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the secondlevel database table.
 * 
 */
@Entity
@Table(name="secondlevel")
@NamedQuery(name="SecondLevel.findAll", query="SELECT p FROM SecondLevel p")
public class SecondLevel implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="ID")
    private int id;

    @Column(name="NAME")
    private String name;

    @Column(name="SITE")
    private String site;

    @Column(name="FIRSTLEVEL_ID")
    private int firstlevelId;

    public SecondLevel() {
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSite() {
        return this.site;
    }

    public void setSite(String site) {
        this.site = site;
    }

    public int getFirstLevelId() {
        return this.firstlevelId;
    }

    public void setFirstLevelId(int firstelvelId) {
        this.firstelvelId = firstelvelId;
    }

}

上面列出來(lái)的是數(shù)據(jù)庫(kù)操作相關(guān)的主要的代碼框都,代碼的重要部分做了一點(diǎn)點(diǎn)的解釋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姓言,一起剝皮案震驚了整個(gè)濱河市瞬项,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌何荚,老刑警劉巖囱淋,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異餐塘,居然都是意外死亡妥衣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)戒傻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)税手,“玉大人,你說(shuō)我怎么就攤上這事需纳÷梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵不翩,是天一觀(guān)的道長(zhǎng)兵扬。 經(jīng)常有香客問(wèn)我麻裳,道長(zhǎng),這世上最難降的妖魔是什么器钟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任津坑,我火速辦了婚禮,結(jié)果婚禮上傲霸,老公的妹妹穿的比我還像新娘疆瑰。我一直安慰自己,他們只是感情好昙啄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布穆役。 她就那樣靜靜地躺著,像睡著了一般跟衅。 火紅的嫁衣襯著肌膚如雪孵睬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天伶跷,我揣著相機(jī)與錄音掰读,去河邊找鬼。 笑死叭莫,一個(gè)胖子當(dāng)著我的面吹牛蹈集,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雇初,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拢肆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了靖诗?” 一聲冷哼從身側(cè)響起郭怪,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刊橘,沒(méi)想到半個(gè)月后鄙才,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡促绵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年攒庵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片败晴。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浓冒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尖坤,到底是詐尸還是另有隱情稳懒,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布慢味,位于F島的核電站场梆,受9級(jí)特大地震影響佛致,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辙谜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望感昼。 院中可真熱鬧装哆,春花似錦、人聲如沸定嗓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宵溅。三九已至凌简,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恃逻,已是汗流浹背雏搂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寇损,地道東北人凸郑。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矛市,于是被迫代替她去往敵國(guó)和親芙沥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一. 什么是Thymeleaf Thymeleaf是面向Web和獨(dú)立環(huán)境的現(xiàn)代服務(wù)器端Java模板引擎浊吏。Thyme...
    低調(diào)的微胖閱讀 65,735評(píng)論 8 69
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • 結(jié)合上一章而昨,這次講下thymeleaf的詳細(xì)使用。 1找田、介紹 簡(jiǎn)單說(shuō)歌憨, Thymeleaf 是一個(gè)跟 Veloci...
    阿亮私語(yǔ)閱讀 675評(píng)論 0 3
  • 2017年8月21日 我原本只想簡(jiǎn)單記錄一下springboot中應(yīng)用Jpa的簡(jiǎn)單操作。不想由于hibernate...
    行者N閱讀 6,488評(píng)論 0 23
  • 它午阵,還是倒了躺孝,難逃被人為摧毀的厄運(yùn)。雖然前一刻還搖曳在微風(fēng)里底桂,還滿(mǎn)滿(mǎn)的傾其所有給了人們豐收的果實(shí)植袍。 我望著泥土里殘...
    絮絮歆語(yǔ)閱讀 690評(píng)論 3 4