1.MasterController
package edu.td.peanut.controller;
import db.model.UserMaster;
import db.service.UserMasterService;
import db.service.UserRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import peanut.utils.PeanutUtils;
@Controller
@RequestMapping(value = "master", method = RequestMethod.GET)
public class MasterController extends PublicController {
@Autowired
private UserRuleService ruleService;
@Autowired
private UserMasterService masterService;
@RequestMapping("login")
public String login() {
createCode();
createToken();
return "login";
}
@RequestMapping("login2")
public ModelAndView login2() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("login2");
createCode();
createToken();
return modelAndView;
}
@RequestMapping("lockScreen")
public String lockScreen() {
LOG.debug("MasterController:lockScreen");
UserMaster master = (UserMaster) session.getAttribute("master");
if (master == null) {
master = masterService.findMasterByUsername(PeanutUtils.cookieValue(request, "loginUser"));
if (master == null) return "redirect:/master/login.do";
session.setAttribute("master", master);
}
return "lockScreen";
}
@RequestMapping("index")
public ModelAndView index(ModelAndView modelAndView) {
modelAndView.setViewName("index");
modelAndView.addObject("ruleList",ruleService.selectPageListByMaster((UserMaster)session.getAttribute("loginUser")));
return modelAndView;
}
@RequestMapping("userRule")
public String userRule() {
modelMap.addAttribute("ruleList", ruleService.selectAllParentList());
return "user/rule/list";
}
@RequestMapping("userRuleEdit")
public String userRuleEdit(Integer id) {
modelMap.addAttribute("editItem", ruleService.findByPrimaryKey(id));
modelMap.addAttribute("ruleList", ruleService.selectAllParentList());
return "user/rule/edit";
}
}
2.MasterApiController
package edu.td.peanut.controller;
import db.model.UserMaster;
import db.model.UserRule;
import db.service.UserMasterService;
import db.service.UserRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import peanut.bean.*;
import peanut.utils.PeanutUtils;
import java.util.Objects;
@Controller
@RequestMapping(value = "master", method = RequestMethod.POST)
public class MasterApiController extends PublicController {
@Autowired
private UserMasterService masterService;
@Autowired
private UserRuleService ruleService;
@RequestMapping("loginDeal")
@ResponseBody
public ErrorBean loginDeal(@RequestBody LoginBean loginBean) {
if (loginBean == null) {
return ErrorBean.getInstance(1);
}
if (!checkCode(loginBean.getTdCode())) {
return ErrorBean.getInstance(2);
}
UserMaster master = masterService.findMasterByUsername(loginBean.getTdUsername());
if (master == null) {
return ErrorBean.getInstance(101);
}
if (!Objects.equals(master.getMasterPassword(), PeanutUtils.md5(loginBean.getTdPassword()))) {
return ErrorBean.getInstance(102);
}
if (!checkToken(loginBean.getToken())) {
return ErrorBean.getInstance(3);
}
initMasterInfo(master);
return ErrorBean.getInstance(0)
.setTitle("登陆成功")
.setMsg("登陆成功,即将跳转首页")
.setUrl("/master/index.do");
}
@RequestMapping("loginDeal2")
public String loginDeal2(String tdUsername, String tdPassword, String tdCode, String token) {
if (!checkToken(token)) {
modelMap.addAttribute("url", "/master/login.do");
modelMap.addAttribute("msg", "token错误,当前请求非法");
return "error";
}
if (!checkCode(tdCode)) {
modelMap.addAttribute("url", "/master/login.do");
modelMap.addAttribute("msg", "验证码错误,请重试");
return "error";
}
if (!"admin".equals(tdUsername)) {
modelMap.addAttribute("url", "/master/login.do");
modelMap.addAttribute("msg", "用户名不存在,请重试");
return "error";
}
if (!"123456".equals(tdPassword)) {
modelMap.addAttribute("url", "/master/login.do");
modelMap.addAttribute("msg", "登录密码错误,请重试");
return "error";
}
session.setAttribute("loginUser", "admin");
return "redirect:/master/index.do";
}
@RequestMapping("unlock")
public String unlock(String password) {
UserMaster master = (UserMaster) session.getAttribute("master");
if (master == null) {
master = masterService.findMasterByUsername(PeanutUtils.cookieValue(request, "loginUser"));
if (master == null) return "redirect:/master/login.do";
}
if (master.getMasterPassword().equals(PeanutUtils.md5(password))) {
initMasterInfo(master);
return "redirect:/master/index.do";
}
return "redirect:/master/lockScreen.do";
}
@RequestMapping("userRuleData")
@ResponseBody
public BootsTableResponse<UserRule> userRuleData(@RequestBody BootsTableRequest tableRequest) {
return ruleService.bootsData(tableRequest);
}
@RequestMapping("editUserRule")
@ResponseBody
public ErrorBean editUserRule(@RequestBody UserRule record) {
if (record == null) return ErrorBean.getInstance(1);
int lineCount = 0;
if (record.getId() == null) {
lineCount = ruleService.insertSelective(record);
} else {
lineCount = ruleService.updateByPrimaryKey(record);
}
if (lineCount == 0) return ErrorBean.getInstance(4);
return ErrorBean.getInstance(0);
}
@RequestMapping("delUserRule")
@ResponseBody
public ErrorBean delUserRule(@RequestBody DeleteBean deleteBean) {
if (deleteBean == null || deleteBean.getIdList() == null) return ErrorBean.getInstance(1);
if (ruleService.delElementByIdList(deleteBean.getIdList()) == 0) return ErrorBean.getInstance(4);
return ErrorBean.getInstance(0);
}
}
3.MasterLoginInterceptor
package edu.td.peanut.interceptor;
import db.model.UserMaster;
import db.service.UserMasterService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import peanut.utils.PeanutUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class MasterLoginInterceptor extends HandlerInterceptorAdapter {
private Logger LOG = Logger.getLogger(this.getClass());
@Value("${system.debug}")
private boolean debug;
@Autowired
private UserMasterService masterService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
LOG.debug("MasterLoginInterceptor:preHandle");
HttpSession session = request.getSession();
if (session.getAttribute("loginUser") == null) {
String userName = PeanutUtils.cookieValue(request, "loginUser");
UserMaster userMaster = masterService.findMasterByUsername(userName);
if (userMaster != null) {
session.setAttribute("master", userMaster);
response.sendRedirect("/master/lockScreen.do");
return false;
}
if (debug) {
UserMaster master = masterService.findByPrimaryKey(1);
session.setAttribute("loginUser", master);
return true;
}
response.sendRedirect("/master/login.do");
return false;
}
return true;
}
}
4.spring-mvc添加登录验证拦截器

5.lockScreen.jsp

6.PeanutUtils新增工具类

7.UserRuleService新增方法类
package db.service;
import db.model.UserMaster;
import db.model.UserRule;
import db.model.UserRule2;
import java.util.List;
public interface UserRuleService extends BaseService<UserRule> {
List<UserRule> selectAllParentList();
boolean checkMasterRule(UserMaster master, String method, String uri);
List<UserRule2> selectPageListByMaster(UserMaster master);
}
8.UserRuleInterceptor验证用户是否拥有访问权限
package edu.td.peanut.interceptor;
import db.model.UserMaster;
import db.service.UserRuleService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserRuleInterceptor extends HandlerInterceptorAdapter {
private Logger LOG = Logger.getLogger(this.getClass());
@Autowired
private UserRuleService ruleService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
UserMaster master = (UserMaster) request.getSession().getAttribute("loginUser");
if (master == null) return false;
String method = request.getMethod();
String uri =request.getRequestURI();
return ruleService.checkMasterRule(master,method,uri);
}
}
9.model下新建UserRule2

10.mapper下新建UserRuleMapper2

package db.mapper;
import db.model.UserRule2;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.select.SelectDSLCompleter;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
import java.util.List;
import static db.mapper.UserRuleDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.*;
@Mapper
public interface UserRuleMapper2 extends UserRuleMapper {
default List<UserRule2> select2(SelectDSLCompleter completer) {
List<UserRule2> rule2List = MyBatis3Utils.selectList(this::selectMany2, selectList, userRule, completer);
if (rule2List != null) {
rule2List.forEach(record -> record.setChildList(select2(entity -> entity
.where(delTime, isEqualTo(0))
.and(ruleType, isEqualTo("NAV"))
.and(ruleMethod, isEqualTo("GET"))
.and(pid, isEqualTo(record.getId()))
)));
}
return rule2List;
}
@SelectProvider(type = SqlProviderAdapter.class, method = "select")
@Results(id = "UserRuleResult2", value = {
@Result(column = "id", property = "id", jdbcType = JdbcType.INTEGER, id = true),
@Result(column = "pid", property = "pid", jdbcType = JdbcType.INTEGER),
@Result(column = "rule_name", property = "ruleName", jdbcType = JdbcType.VARCHAR),
@Result(column = "rule_url", property = "ruleUrl", jdbcType = JdbcType.VARCHAR),
@Result(column = "rule_method", property = "ruleMethod", jdbcType = JdbcType.CHAR),
@Result(column = "rule_type", property = "ruleType", jdbcType = JdbcType.CHAR),
@Result(column = "rule_icon", property = "ruleIcon", jdbcType = JdbcType.VARCHAR),
@Result(column = "rule_des", property = "ruleDes", jdbcType = JdbcType.VARCHAR),
@Result(column = "add_time", property = "addTime", jdbcType = JdbcType.TIMESTAMP),
@Result(column = "update_time", property = "updateTime", jdbcType = JdbcType.TIMESTAMP),
@Result(column = "del_time", property = "delTime", jdbcType = JdbcType.INTEGER)
})
List<UserRule2> selectMany2(SelectStatementProvider selectStatement);
}
11.UserRuleServiceImpl

package edu.td.peanut.service;
import com.github.pagehelper.PageHelper;
import db.mapper.UserMasterRuleDynamicSqlSupport;
import db.mapper.UserRouterRuleDynamicSqlSupport;
import db.mapper.UserRuleMapper;
import db.mapper.UserRuleMapper2;
import db.model.UserMaster;
import db.model.UserRule;
import db.model.UserRule2;
import db.service.UserRuleService;
import org.mybatis.dynamic.sql.select.join.EqualTo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import peanut.bean.BootsTableRequest;
import peanut.bean.BootsTableResponse;
import java.util.List;
import static org.mybatis.dynamic.sql.SqlBuilder.*;
import static db.mapper.UserRuleDynamicSqlSupport.*;
@Service
@Primary
public class UserRuleServiceImpl implements UserRuleService {
@Autowired
private UserRuleMapper2 ruleMapper;
@Override
public UserRule findByPrimaryKey(Integer key) {
if (key == null || key < 1) return null;
return ruleMapper.selectByPrimaryKey(key).orElse(null);
}
@Override
public BootsTableResponse<UserRule> bootsData(BootsTableRequest tableRequest) {
if (tableRequest == null) return null;
PageHelper.offsetPage(tableRequest.getOffset(), tableRequest.getLimit());
return new BootsTableResponse<>(ruleMapper.select(entity -> {
entity.where(delTime, isEqualTo(0))
.and(
ruleName, isLikeWhenPresent(tableRequest.getSearch()),
or(ruleMethod, isLikeWhenPresent(tableRequest.getSearch())),
or(ruleType, isLikeWhenPresent(tableRequest.getSearch())),
or(ruleUrl, isLikeWhenPresent(tableRequest.getSearch()))
);
int _pid = (int) tableRequest.getExtras().get("pid");
if (_pid > 0) {
entity.where().and(pid, isEqualTo(_pid));
} else {
entity.where().and(pid, isNull());
}
if (tableRequest.getSort() == null) {
entity.orderBy(addTime.descending());
} else if ("ASC".equals(tableRequest.getOrder())) {
entity.orderBy(userRule.column(tableRequest.getSort()));
} else {
entity.orderBy(userRule.column(tableRequest.getSort()).descending());
}
return entity;
}));
}
@Override
public int insertSelective(UserRule record) {
record.setId(null);
record.setDelTime(null);
record.setUpdateTime(null);
record.setAddTime(null);
return ruleMapper.insertSelective(record);
}
@Override
public int updateByPrimaryKey(UserRule record) {
record.setDelTime(null);
record.setUpdateTime(null);
record.setAddTime(null);
return ruleMapper.updateByPrimaryKeySelective(record);
}
@Override
public int delElementByIdList(List<Integer> idList) {
if (idList == null || idList.isEmpty()) return 0;
return ruleMapper.update(entity -> entity
.set(delTime).equalTo((int) (System.currentTimeMillis() / 1000))
.where(id, isIn(idList))
);
}
@Override
public List<UserRule> selectAllParentList() {
return ruleMapper.select(entity -> entity
.where(delTime, isEqualTo(0))
.and(ruleType, isNotEqualTo("API"))
.and(ruleMethod, isEqualTo("GET"))
.orderBy(ruleType, ruleMethod, ruleName)
);
}
@Override
public boolean checkMasterRule(UserMaster master, String method, String uri) {
if (master == null) return false;
if (master.getRouterId() == 1) return true;
final String _method = "GET".equalsIgnoreCase(method) ? "GET" : "POST";
final String _uri = uri.startsWith("/") ? uri : ("/" + uri);
UserRule targetRule = ruleMapper.selectOne(entity -> entity
.where(delTime, isEqualTo(0))
.and(ruleMethod, isEqualTo(_method))
.and(ruleUrl, isEqualTo(_uri),
or(ruleUrl, isEqualTo(_uri.replaceFirst("/", "")))
)
).orElse(null);
if (targetRule == null) return true;
return ruleMapper.selectOne(entity -> entity
.leftJoin(UserMasterRuleDynamicSqlSupport.userMasterRule).on(UserMasterRuleDynamicSqlSupport.ruleId, new EqualTo(id))
.leftJoin(UserRouterRuleDynamicSqlSupport.userRouterRule).on(UserRouterRuleDynamicSqlSupport.ruleId, new EqualTo(id))
.where(delTime, isEqualTo(0))
.and(
UserMasterRuleDynamicSqlSupport.delTime, isEqualTo(0),
or(UserMasterRuleDynamicSqlSupport.delTime, isNull())
)
.and(
UserRouterRuleDynamicSqlSupport.delTime, isEqualTo(0),
or(UserRouterRuleDynamicSqlSupport.delTime, isNull())
)
.and(
UserMasterRuleDynamicSqlSupport.ruleState, isEqualTo("GRANTED"),
or(
UserRouterRuleDynamicSqlSupport.ruleState, isEqualTo("GRANTED"),
and(
UserMasterRuleDynamicSqlSupport.id, isNull()
)
)
)
.and(UserMasterRuleDynamicSqlSupport.masterId, isEqualTo(master.getId()))
.and(UserRouterRuleDynamicSqlSupport.routerId, isEqualTo(master.getRouterId()))
.and(id, isEqualTo(targetRule.getId()))
).orElse(null) != null;
}
@Override
public List<UserRule2> selectPageListByMaster(UserMaster master) {
if (master == null) return null;
if (master.getRouterId() == 1) {
return ruleMapper.select2(entity -> entity
.where(delTime, isEqualTo(0))
.and(ruleType, isEqualTo("NAV"))
.and(ruleMethod, isEqualTo("GET"))
.and(pid, isNull())
);
}
return null;
}
}
12.index_aside.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="index3.html" class="brand-link">
<img src="static/dist/img/user1122.jpeg" alt="User Image" class="brand-image img-circle elevation-3"
style="opacity: .8">
<span class="brand-text font-weight-light">Chadwick Boseman</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- SidebarSearch Form -->
<div class="form-inline mt-3">
<div class="input-group" data-widget="sidebar-search">
<input class="form-control form-control-sidebar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-sidebar">
<i class="fas fa-search fa-fw"></i>
</button>
</div>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<c:forEach items="${ruleList}" var="item">
<!-- item无子类-->
<c:if test="${fn:length(item.childList)==0}">
<!-- 单独说明标签-->
<c:if test="${item.ruleUrl=='' ||item.ruleUrl=='#'}">
<li class="nav-header">${item.ruleName}</li>
</c:if>
<!-- /单独说明标签-->
<!-- 无子菜单的导航-->
<c:if test="${fn:length(item.ruleUrl)>1}">
<li class="nav-item">
<a href="${item.ruleUrl}" class="nav-link">
<i class="nav-icon fa fa-${item.ruleIcon}"></i>
<p>${item.ruleName}</p>
</a>
</li>
</c:if>
<!-- /无子菜单的导航-->
</c:if>
<!-- /item无子类-->
<!-- item有子类-->
<c:if test="${fn:length(item.childList)>0}">
<!-- 如果href=# 那么就是单独说明标签,否则是有子菜单的导航-->
<c:if test="${item.ruleUrl=='#'}">
<!-- 单独说明标签-->
<li class="nav-header">${item.ruleName}</li>
<c:forEach items="${item.childList}" var="ii">
<!-- 无子菜单的导航-->
<c:if test="${fn:length(ii.childList)==0}">
<li class="nav-item">
<a href="${ii.ruleUrl}" class="nav-link">
<i class="nav-icon fa fa-${ii.ruleIcon}"></i>
<p>${ii.ruleName}</p>
</a>
</li>
</c:if>
<!-- /无子菜单的导航-->
<!-- 有子菜单的导航-->
<c:if test="${fn:length(ii.childList)>0}">
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fa fa-${ii.ruleIcon}"></i>
<p>${ii.ruleName}<i class="fas fa-angle-left right"></i></p>
</a>
<ul class="nav nav-treeview">
<c:forEach items="${ii.childList}" var="child">
<li class="nav-item">
<a href="${child.ruleUrl}" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>${child.ruleName}</p>
</a>
</li>
</c:forEach>
</ul>
</li>
</c:if>
<!-- /有子菜单的导航-->
</c:forEach>
</c:if>
<c:if test="${item.ruleUrl==''}">
<!-- 有子菜单的导航-->
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fa fa-${item.ruleIcon}"></i>
<p>${item.ruleName}<i class="fas fa-angle-left right"></i></p>
</a>
<ul class="nav nav-treeview">
<c:forEach items="${item.childList}" var="ii">
<li class="nav-item">
<a href="${ii.ruleUrl}" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>${ii.ruleName}</p>
</a>
</li>
</c:forEach>
</ul>
</li>
</c:if>
<!-- /如果href=# 那么就是单独说明标签,否则是有子菜单的导航-->
</c:if>
<!-- /item有子类-->
</c:forEach>
<!-- 原始导航留作参考 -->
<li class="nav-header">用户管理</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fa fa-user"></i>
<p>管理员管理<i class="fas fa-angle-left right"></i></p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="master/userMaster.do" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>管理员列表</p>
</a>
</li>
<li class="nav-item">
<a href="master/userMasterRule.do" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>管理员权限</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="#" class="nav-link">
<i class="nav-icon fa fa-user-friends"></i>
<p>角色管理<i class="fas fa-angle-left right"></i></p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="master/userRouter.do" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>角色列表</p>
</a>
</li>
<li class="nav-item">
<a href="master/userRouterRule.do" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>角色权限</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="master/userRule.do" class="nav-link">
<i class="nav-icon fa fa-keyboard"></i>
<p>权限配置</p>
</a>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>
13.index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ include file="../layout/header.jsp" %>
<!-- overlayScrollbars -->
<link rel="stylesheet" href="static/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
</head>
<body class="hold-transition sidebar-mini layout-fixed overflow-hidden" data-panel-auto-height-mode="height">
<div class="wrapper">
<%@ include file="item/index_navbar.jsp" %>
<%@ include file="item/index_aside.jsp" %>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper iframe-mode" data-widget="iframe" data-loading-screen="750">
<div class="nav navbar navbar-expand navbar-white navbar-light border-bottom p-0">
<div class="nav-item dropdown">
<a class="nav-link bg-danger dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Close</a>
<div class="dropdown-menu mt-0">
<a class="dropdown-item" href="#" data-widget="iframe-close" data-type="all">Close All</a>
<a class="dropdown-item" href="#" data-widget="iframe-close" data-type="all-other">Close All Other</a>
</div>
</div>
<a class="nav-link bg-light" data-widget="iframe-scrollleft"><i class="fas fa-angle-double-left"></i></a>
<ul class="navbar-nav overflow-hidden" role="tablist"></ul>
<a class="nav-link bg-light" data-widget="iframe-scrollright"><i class="fas fa-angle-double-right"></i></a>
<a class="nav-link bg-light" href="#" data-widget="iframe-fullscreen"><i class="fas fa-expand"></i></a>
</div>
<div class="tab-content">
<div class="tab-empty">
<h2 class="display-4">No tab selected!</h2>
</div>
<div class="tab-loading">
<div>
<h2 class="display-4">Tab is loading <i class="fa fa-sync fa-spin"></i></h2>
</div>
</div>
</div>
</div>
<!-- /.content-wrapper -->
<footer class="main-footer">
<strong>Copyright © 2014-2021 <a href="https://adminlte.io">AdminLTE.io</a>.</strong>
All rights reserved.
<div class="float-right d-none d-sm-inline-block">
<b>Version</b> 3.1.0
</div>
</footer>
<!-- Control Sidebar -->
<aside class="control-sidebar control-sidebar-dark">
<!-- Control sidebar content goes here -->
</aside>
<!-- /.control-sidebar -->
</div>
<!-- ./wrapper -->
<%@ include file="../layout/footer.jsp" %>
<!-- jQuery UI 1.11.4 -->
<script src="static/plugins/jquery-ui/jquery-ui.min.js"></script>
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip -->
<script>
$.widget.bridge('uibutton', $.ui.button)
</script>
<!-- overlayScrollbars -->
<script src="static/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<!-- AdminLTE -->
<script src="static/dist/js/adminlte.min.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="static/dist/js/demo.js"></script>
<script>
($=>{
$(()=>{
$(".navbar-search-block>form").submit(()=> {
const val =$(".navbar-search-block>form").find("input[type='search']").val();
if (!val) {
new swal({
icon:"warning",
title:"搜索警告",
text:"搜索内容不能为空!"
});
return false;
}
const aTag=$(document.createElement("a"));
aTag.attr("href","master/searchTag?param="+val);
aTag.text(val);
const pTag = $(document.createElement("p"));
pTag.text("搜索:"+val);
aTag.append(pTag);
aTag.IFrame("openTabSidebar",aTag[0]);
return false;
});
});
})(jQuery);
</script>
</body>
</html>