CMS 10.权限管理

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() {
        //生成验证码和token
        createCode();
        createToken();
        return "login";
    }

    @RequestMapping("login2")
    public ModelAndView login2() {
        ModelAndView modelAndView = new ModelAndView();
        //指定需要加载的视图
        modelAndView.setViewName("login2");
        //生成验证码和token
        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())) {
            //token错误,当前请求非法
            return ErrorBean.getInstance(3);
        }
        //先做其他数据验证,最终验证token

        //记录登录对象
        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");
        //判断登录 使用session
        HttpSession session = request.getSession();
        if (session.getAttribute("loginUser") == null) {
            //从cookie中读取用户名
            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> {
    /**
     * 查询所有的可作为父级权限列表
     *
     * @return 除了API之外所有的GET权限
     */
    List<UserRule> selectAllParentList();

    /**
     * 验证管理员权限,是否放行
     *
     * @param master 需要验证的管理员,一般情况验证的都是登录用户
     * @param method POST GET PUT
     * @param uri    无域名的请求路径 /master/index.do
     * @return true false
     */

    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();//GET POST PUT
        String uri =request.getRequestURI();//  /master/userRule.do
        //验证用户是否拥有访问权限,用户权限应该缓存于Redis中
        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;//此时权限未在系统中定义,无需对当前权限做限制,,直接开启访问
        //权限查两张表 masterRule routerRule 用于判断用户权限是否存在
        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())
            );
        }
        //TODO 查询管理员的页面导航列表
        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 &copy; 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(()=> {
     //获取input框的输入内容
     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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值