Bootstrap4实现增删改查
BootStrap4.3.1 + SpringBoot2.1.5
一张图
1 引入JS
<meta name="viewpoint" content="width=device-width,initial-scale=1" />
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script src="https://cdn.bootcss.com/popper.js/1.14.7/umd/popper.min.js"></script>
<script type="text/javascript" src="bootstrap/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.min.css" />
设置设备大小viewport
2 基础排版样式
2.1 容器和网格系统
• container container-fluid //容器类前者固定宽度后者100%宽度
文字排版
• display //标题类 1-4
• small //小文本
• <abbr>
//文本底部下面一条虚线边框
2.2 栅格布局系统
栅格嵌套*
响应式布局
显示和隐藏样式
3 导航栏
• navbar、navbar-expand-sm、bg-light、bg-dark
• ul:navbar-nav li:nav-item
<div class="container-fluid">
<nav class="navbar navbar-expand-md bg-dark">
<div class="navbar-header">
<!-- <img src="/img/logo.png" class="img-rounded"> -->
<h2><a class="navbar-brand" href="../index.html">LOGO</a></h2>
</div>
<ul class="nav navbar-nav">
<li class="nav-item active" id="nav1Page"><a class="nav-link" href="#">主页</a></li>
<li class="nav-item" id="nav2Page"><a class="nav-link" href="#">基础管理</a></li>
<li class="nav-item" id="nav3Page"><a class="nav-link" href="#">业务管理</a></li>
<li class="nav-item" id="nav4Page"><a class="nav-link" href="#">消息管理</a></li>
<li class="nav-item" id="nav5Page"><a class="nav-link" href="#">系统管理</a></li>
</ul>
</nav>
4 下拉菜单
• dropdown //下拉菜单默认
• button设置dropdown-toggle data-toggle=“dropdown” //下拉button
• dropdown-menu //下拉菜单
• a设置样式dropdown-item
<div class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<span class="glyphicon glyphicon-user"></span>admin</a>
<ul class="dropdown-menu">
<li class="dropdown-item"><a href="#">个人中心</a></li>
<li class="dropdown-item"><a href="#">设置</a></li>
<li class="dropdown-item"><a href="#">关于</a></li>
<li class="dropdown-item"><a href="#">退出</a></li>
</ul>
</div>
5 列表组(含折叠)
• list-group //列表组
• list-group-item //列表li
• list-group-item-action
collapse类用于指定一个折叠元素,点击后控制内容的隐藏与显示,需要在元素上添加 data-toggle=“collapse” 属性。data-target="#id" 属性是对应折叠的内容。
<!-- 左侧栏 List Group -->
<div class="row">
<div class="col-md-2">
<ul class="list-group">
<li class="list-group-item"><a data-toggle="collapse"
data-target="#collapse1" href="#">基础管理</a>
<ul class="collapse show" id="collapse1">
<li>
<a class="list-group-item-action" href="#">部门管理
<span id="totalCount" class="badge badge-pill badge-secondary">0</span>
</a>
</li>
<li><a href="#">管理2</a></li>
<li><a href="#">管理3</a></li>
<li><a href="#">管理4</a></li>
</ul></li>
<li class="list-group-item"><a data-toggle="collapse"
data-target="#collapse2" href="#">权限管理</a>
<ul class="collapse" id="collapse2">
<li><a href="#">管理1</a></li>
<li><a href="#">管理2</a></li>
<li><a href="#">管理3</a></li>
<li><a href="#">管理4</a></li>
</ul></li>
</ul>
</div>
</div>
5.1 bootstrap-treeview
bootstrap-treeview是一款效果非常酷的基于bootstrap的jQuery多级列表树插件。该jQuery插件基于Twitter Bootstrap,以简单和优雅的方式来显示一些继承树结构,如视图树、列表树等等。
bootstrap-treeview
https://www.cnblogs.com/tangzeqi/p/8021637.html
5.2 左侧菜单
左侧菜单栏折叠展开效果
https://blog.csdn.net/caicai1171523597/article/details/88057386
6 表单样式
• form-group 可用于表单布局,对form中的div添加该样式进行布局,同时配合form的class进行布局。
• input-group 输入框组,是对表单的扩展,可在form的div中方便的组合span和input等
• label for email
• input class form-control
6.1 input-group
关键字检索
<!-- 关键字检索 -->
<div class="input-group justify-content-end">
<input type="text" class="form-control col-md-2" placeholder="输入关键字"/>
<span class="input-group-btn">
<button type="submit" class="btn btn-outline-primary">搜索</button>
</span>
</div>
6.2 form-group
右侧栏:查询条件+表格+分页
<!-- 右侧栏:查询条件 -->
<div class="col-md-10">
<div class="row form-inline form-group" id="manage_dept_query">
<div class="form-group col-md-3">
<label for="dept_id">部门ID</label>
<input type="text" id="dept_id" class="form-control"/>
</div>
<div class="form-group col-md-3">
<label for="dept_name">部门名称</label>
<input type="text" id="dept_name" class="form-control" value="" placeholder="请输入" />
</div>
<div class="form-group col-md-2">
<label for="dept_level">部门级别</label>
<select id="dept_level" class="form-control">
<option value="1">请选择</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</div>
<!-- 查询按钮 -->
<span class="col-md-1"><button class="btn btn-outline-primary" type="button" id="manage_query_button" onclick="queryDepts()">查询</button></span>
<span class="col-md-1"><button class="btn btn-outline-primary" type="button" id="manage_add_button" onclick="dept_add_model()">新增</button></span>
</div>
7 表格样式
<table>
标签样式有以下几种:
.table 表格基本样式
.table-striped 在 <tbody>
内添加斑马线形式的条纹 ( IE8 不支持)
.table-bordered 为所有表格的单元格添加边框
.table-hover 在 <tbody>
内的任一行启用鼠标悬停状态
.table-condensed 让表格更加紧凑
.table-responsive //响应式表格,可以让表格水平滚动以适应小型设备(小于 768px)。当在大于 768px 宽的大型设备上查看时,您将看不到任何的差别。
.table-dark //黑色背景表格
7.2 table
表格固定
<!-- 列表 -->
<div id="mamage_list" style="height: 550px; overflow: auto;">
<table class="table table-bordered table-hover text-center" id="manage_list_table">
<thead>
<tr>
<th>全选<input type='checkbox' id="cb0"/></th>
<th>序号</th>
<th>部门编号</th>
<th>部门名称</th>
<th>部门级别</th>
<th>操作</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
7.3 分页
• pagination //ul元素上添加
• page-item //在li元素上添加page-item
• page-link
分页静态界面
<!-- 分页查询 -->
<div class="input-group justify-content-end">
<ul class="pagination pagination-sm">
<li class="page-item"><a class="page-link" href="#">首页</a></li>
<li class="page-item disabled"><a class="page-link" href="#">上一页</a></li>
<li class="page-item active"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item"><a class="page-link" href="#">下一页</a></li>
<li class="page-item"><a class="page-link" href="#">尾页</a></li>
</ul>
<!-- Query Result -->
<span class="col-md-2"><label>共50条记录 第1/3页 </label></span>
<div class="input-group col-md-2">
<input type="text" id="table_page" class="form-control text-center col-md-4" value="1" placeholder="1"/>
<span class="input-group-addon"><button class="btn btn-outline-primary">GO</button></span>
</div>
分页动态界面
<body>
<!-- 分页查询 -->
<div class="input-group justify-content-end" id="paginationDiv">
<ul class="pagination pagination-sm" id="pagination">
</ul>
<!-- Query Result -->
<span class="col-md-2" id="pageInfo"><label>共0条记录 第1/1页</label></span>
<span class="input-group col-md-2">
<input type="text" id="pageInput" class="form-control text-center col-md-4" placeholder="1" />
<span class="input-group-addon">
<button class="btn btn-outline-primary" onclick="queryDepts()">GO</button></span>
</span>
</div>
</body>
脚本
<script type="text/javascript">
/* 分页查询JS. */
var pagination; //分页控件id
var homePage=1; //首页
var lastPage=0; //上一页(初始值为0)
var firstPage=1; //第一页(恒值1)
var pageNo=1; //页码(初始值为1)
var nextPage=0; //下一页(初始值为0)
var endPage=0; //末页(初始值为0)
var pageSize=20; //单页数量
var pageCount=1; //总页数(初始值为1)
var totalCount=0; //总数据量
// currentPage=pageNo; //当前页数(暂未使用)
// pageIndex=pageNo*pageSize; //起始页下标(放在后台计算)
// pageGoInput //页面跳转输入框
// pageGoBtn //页面跳转按钮
$(function(){
pagination = $("#pagination");
initPagination(200);
})
function initPagination(total)
{
/*
* totalCount = total == undefined ? 0 : total;
if(totalCount == 0)
{
//$('#pagination').hide();
return;
}
*/
/*
* 分页初始化计算方式
* homePage=1
* lastPage==pageNo ? pageNo : pageNo-1
* firstPage=1
* nextPage==pageNo ? pageNo : pageNo+1
* 如果firstPage=pageNo=endPage
*/
pageCount = Math.ceil(totalCount/pageSize);
pagination.html('');
pagination.append("<li class='page-item' id='homePage' pageNo='1'><a class='page-link' href='#'>首页</a></li>");
pagination.append("<li class='page-item' id='lastPage' pageNo='1'><a class='page-link' href='#'>上一页</a></li>");
//page 1 is default active
pagination.append("<li class='page-item active' id='firstPage' pageNo='1'><a class='page-link' href='#'>1</a></li>");
if(pageCount > 1)
{
for(var i=2; i<=pageCount; i++)
{
pagination.append("<li class='page-item' pageNo='"+i+"'><a class='page-link' href='#'>"+i+"</a></li>");
}
pagination.append("<li class='page-item' id='nextPage' pageNo='"+ (pageNo+1) +"'><a class='page-link' href='#'>下一页</a></li>");
}else
{
pagination.append("<li class='page-item disabled' id='nextPage' pageNo='1'><a class='page-link' href='#'>下一页</a></li>");
//pageNo='1' 或者 pageNo='"+pageCount+"' 或者 pageNo='"+pageNo+"'
//pagination.append("<li class='page-item disabled' id='nextPage' pageNo='"+pageNo+"'><a class='page-link' href='#'>下一页</a></li>");
}
endPage = pageCount;
pagination.append("<li class='page-item' id='endPage' pageNo='"+ pageCount +"'><a class='page-link' href='#'>末页</a></li>");
//pageInfo
$("#pageInfo").html("<label>共" + totalCount + "条记录 第"+pageNo+"/"+pageCount+"页 </label>");
//get pageNo
$("#pagination li").click(function()
{
pageination($(this));
});
//get next page btn
$("#nextPage").click(function() {
nextPageClick($(this));
});
}
function nextPageClick(page) {
// $("#pagination li").removeClass("active");
// //遍历测试
// $("#pagination li[pageNo]").each(function(i){
// var sortid=$(this).attr("pageNo");
// console.log(sortid)
// });
}
function pageination(page)
{
//获取当前页数
pageNo = Number(page.attr("pageNo"));
lastPage = pageNo-1;
nextPage = pageNo+1;
lastPage = lastPage <= 1 ? 1 : lastPage;
nextPage = nextPage >= pageCount ? pageCount : nextPage;
var newLastPage = $("#lastPage").attr("pageNo",lastPage);
var newNextPage = $("#nextPage").attr("pageNo",nextPage);
//设置样式
$("#pagination li").removeClass("active");
//点击nextPage 则去掉上一页样式,设置新的pageNo样式为active
if(page.attr("id")=="nextPage" || page.attr("id")=="lastPage")
{
//pageNo已是最新
$("#pagination li[pageNo="+pageNo+"]").addClass("active");
// //遍历测试
// $.each($("#pagination li[pageNo]"),function(i){
// if($(this).attr("pageNo")==nextPage)
// {
// alert($(this).attr("pageNo"))
// //console.log($(this).attr("pageNo"));
// }
// });
}
else {
if(!page.hasClass("active"))
{
page.addClass("active");
}
}
alert("pageId="+page.attr("id")+", pageNo="+pageNo+", lastPage="+lastPage+", nextPage="+nextPage)
console.log("pageId="+page.attr("id")+", pageNo="+pageNo+", lastPage="+lastPage+", nextPage="+nextPage)
}
</script>
8 模态窗口
新增
<!-- 新增-->
<span class="col-md-1"><button class="btn btn-outline-primary" type="button" id="manage_add_button" onclick="dept_add_model()">新增</button></span>
<!-- 新增界面-->
<div class="modal fade" id="dept_add_modal" tabindex="-1" role="dialog" data-backdrop="static" data-keyboard="false" aria-labelleyby="myModalLabel">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="myModalLabel">新增</h4>
<button type="button" class="btn-danger close" id="btn_close" aria-label="close" onclick="modal_hide()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form id="dept_add_form">
<div class="form-group">
<label class="control-label" for="dept_id">部门ID</label>
<input type="text" id="dept_id" class="form-control">
</div>
<div class="form-group">
<label>部门名称</label>
<input type="text" id="dept_name" class="form-control">
</div>
<div class="form-group">
<label for="dept_level">部门级别</label>
<select id="dept_level" class="form-control">
<option value="0">请选择</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="submit" class="btn btn-primary">保存</button>
</div>
</div>
</div></div>
data-backdrop=“static” data-keyboard=“false” //禁止模态框的关闭按钮和点击空白处关闭模态框
aria-label属性用来给当前元素加上的标签描述,接受字符串作为参数。是用不可视的方式给元素加label(如果被描述元素存在真实的描述元素,可使用 aria-labelledby 属性作为来绑定描述元素和被描述元素来代替)。
8.2 模态窗口显示、隐藏
隐藏模态窗口对表单重置:
//input清空
$(“input”).val("");
//select重置
$("#selectId option:first").prop(“selected”, ‘selected’)
//注:$("#formId")[0].reset();
//因为reset方法是js的,在jquery中使用时要将jQuery对象转成js对象
.
//显示模态窗口
function dept_add_model() {
$("#dept_add_model").modal();
}
//隐藏模态窗口
function modal_hide() {
if (confirm("是否取消操作?"))
{
//隐藏模态窗口
$("#dept_add_modal").modal('hide');
//$("input").val("");
$("#dept_add_form")[0].reset();
} else {
return false;
}}
信息提示框
• alert-success //成功提示信息
• alert-dismissable class=“close” data-dismiss=“alert” //关闭提示框
×
× 是 HTML 实体字符,来表示关闭操作
<div class="container">
<div class="alert alert-success alert-dismissible fade show">
<span><strong>信息:</strong>success</span>
<button type="button" class="close" data-dismiss="alert">×</button>
</div>
</div>
图片
• rounded //圆角效果
• rounded-circle //椭圆效果
• img-thumbnail //图片缩略图效果
• img-fluid //图片响应式效果
超大屏幕
• jumbotron // 屏幕
• jumbotron-fluid //没有圆角的全屏幕
按钮
• btn-primary //主要按钮
• btn-secondary //次要按钮
• btn-success //成功按钮
• btn-info //信息按钮
• btn-danger //危险
• btn-outline-primary //按钮边框
• btn-sm btn-lg //小大号按钮
• btn-block //块级按钮
• active //可用
• disabled //禁用
按钮组
• btn-group //按钮组
• btn-group-lg|sm|xs 控制按钮组大小
• btn-group-vertical 垂直按钮组
进度条
• progress //添加一个div
• progress-bar //在上面的div中添加一个progress-bar的div
卡片
• card、card-header、card-body、card-footer
• card-img-top //图片
• card-body、card-title、card-text //图片卡片
• card-img-overlay//设置图片为背景
提示框
• data-toggle=“tooltip” //创建提示框
• title=“我是提示内容!” //提示内容
• data-placement=“top” //指定提示框位置
$(document).ready(function(){ //初始化
$(’[data-toggle=“tooltip”]’).tooltip();
});
颜色
• text-muted 柔和
• text-primary 重要
• text-success 成功
• text-info 提示
• text-warning 警告
• text-danger 危险
• text-secondary 副标题
• text-dark 深灰色文字
• text-light 浅灰色
• text-white 白色
…
参考资料
Bootstrap4 中文文档
http://bs4.ntp.org.cn/examples.html
折叠导航栏
https://www.runoob.com/bootstrap4/bootstrap4-navbar.html
JQuery全局变量在函数中调用报错undefined
https://blog.csdn.net/qq_19636353/article/details/45244539
bootstrap-treeview
https://www.cnblogs.com/tangzeqi/p/8021637.html
其他
定义前端一些常用ID、方法
/* 查询. */
dept_id、dept_name、dept_level;//查询条件的属性id
$(#"query")、$(#"queryBtn")、$(#"queryDeptBtn") //查询按钮
queryDepts();、queryAll() //查询所有dept方法
queryDeptById(); //查询1个dept方法(通过id查询)
queryDeptList(); //查询列表方法
showDeptList(data) //显示加载查询列表
/* 新增. */
$("#addDeptId")、$("#addDeptName")、$("#addDeptLevel"); //新增参数ID定义
$("#addBtn")、$("#addDeptBtn") //新增按钮id
$("#addModal")、$("#addDeptModal");showAddDeptModal() //新增界面模态窗口ID、方法
$("#addDeptForm") //新增表单id
$("#saveBtn")、$("#addSaveBtn") //保存按钮id
addSaveDept();//保存方法
addDepts();//批量新增方法
/* 修改. */
$("#editDeptId")、$("#editDeptName")、$("#editDeptLevel") //修改参数
$("#edit1")、$("#editBtn1")、$("#editDeptBtn1") //修改按钮id(含多个)
$("#editForm")、$("#editDeptForm") //修改表单id
$("#editModal")、$("#editDeptModal");showEditDeptModal() //修改界面模态窗口id、方法
$("#editSaveBtn") //修改保存按钮
editSaveDept() //修改保存调用方法
editDepts() //批量修改方法
/* 删除. */
$("#del1")、$("#delBtn1")、$("#delDeptBtn1") //删除按钮id(含多个)
deleteDept() //删除方法
/* 分页查询. */
var pagination; //分页控件id
var homePage=1; //首页
var lastPage=0; //上一页(初始值为0)
var firstPage=1; //第一页(恒值1)
var pageNo=1; //页码(初始值为1)
var nextPage=0; //下一页(初始值为0)
var endPage=0; //末页(初始值为0)
var pageSize=30; //单页数量(默认30条记录)
var pageCount=1; //总页数(初始值为1)
var totalCount=0; //总数据量
// currentPage=pageNo; //当前页数(放在后台计算)
// pageIndex=pageNo*pageSize; //起始页下标=pageNo-1(放在后台计算)
// pageInput //分页输入框
// pageSearch //分页搜索按钮
/* 导出. */
exportDeptBtn; //导出dept按钮id
exportDepts(); //导出方法
/* 公共模块. */
btn_close