CMS 11.管理员管理

1.project.properties

在这里插入图片描述

2.BaseModel.java

package db.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.Date;

@Getter
@Setter
@ToString

public class BaseModel {
    private Integer id;
    private Date addTime;
    private Date updateTime;
    private Integer delTime;

    public boolean isInsert() {
        return id == null || id ==0;
    }
    public void prepareEdit(){
        this.addTime =null;
        this.updateTime =null;
        this.delTime = null;
        if (this.isInsert()){
            this.id = null;
        }
    }
}

3.BootsTableRequest.java

package peanut.bean;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.apache.log4j.Logger;
import peanut.utils.PeanutUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;

@Getter
@Setter
@ToString
public class BootsTableRequest {
    private static final Logger LOG = Logger.getLogger(BootsTableRequest.class);
    private Integer limit; //限制每次查询获取到的数据条数
    private Integer offset; //从第几条数据开始查询
    private String order; //排序方式ASC DESC
    private String search; //参与排序的字段
    private String sort; //参与搜索的字段
    private Map<String, Object> extras; //额外的请求参数

    public void setLimit(Integer limit) {
        this.limit = limit == null ? 1 : limit > 1 ? limit : 1; //限定最少查询一条数据
    }

    public void setOffset(Integer offset) {
        this.offset = offset == null ? 0 : offset > 0 ? offset : 0;//限定最小值为0
    }

    public void setOrder(String order) {
        this.order = "ASC".equalsIgnoreCase(order) ? "ASC" : "DESC";//排序方式只有两种
    }

    public void setSort(String sort) {
        //参与排序的字段只允许出现数字 字母 下划线
        this.sort = sort;
        if (Pattern.matches("[0-9a-zA-Z_]+", sort)) {
            this.sort = PeanutUtils.humpToLine(sort);
        } else {
            this.sort = null;
        }
    }

    public void setSearch(String search) {
        //只能输入数字 字母 下划线 中文字符
        if (Pattern.matches("[0-9a-zA-Z_\u4300-\u9fa5]+", search)) {
            //如果是模糊查询需要拼接%%
            this.search = "%" + search + "%";
        } else {
            this.search = null;
        }
    }

    public Integer getInteger(String key) {
        return this.getExtra(key, Integer.class);
    }

    public String getString(String key) {
        return this.getExtra(key, String.class);
    }

    public <T> T getExtra(String key, Class<T> targetClass) {
        if (this.extras == null) return null;
        Object value = this.extras.get(key);
        if (value == null) return null;
        if (Objects.equals(value.getClass(), targetClass)) {
            return (T) value;
        }
        LOG.error(
                String.format("数据类型转换失败,原始类型是:%s,目标数据类型是:%s,原始数据类型是: ",
                        value.getClass().getName(),
                        targetClass.getName())
                        + value);
        return null;
    }

    public void setExtra(String key, Object value) {
        if (this.extras == null) this.extras = new HashMap<>();
        this.extras.put(key, value);
    }
}

4.UserRouterService.java接口

在这里插入图片描述

5.AbstractService

在这里插入图片描述

6. MasterController

package edu.td.peanut.controller;

import db.model.UserMaster;
import db.model.UserRouter;
import db.service.UserMasterService;
import db.service.UserRouterService;
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;

import javax.servlet.http.Cookie;
import java.util.List;

@Controller
@RequestMapping(value = "master", method = RequestMethod.GET)
public class MasterController extends PublicController {
    @Autowired
    private UserRuleService ruleService;
    @Autowired
    private UserMasterService masterService;
    @Autowired
    private UserRouterService routerService;

    @RequestMapping("login")
    public String login() {
        //删除用户登录状态,避免用户返回首页
        session.removeAttribute("loginUser");
        Cookie cookie = new Cookie("loginUser", null);
        cookie.setMaxAge(0);//用于删除cookie
        cookie.setHttpOnly(true);
        cookie.setPath("/master");
        response.addCookie(cookie);
        //生成验证码和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() {
        //删除用户登录状态,避免用户返回首页
        session.removeAttribute("loginUser");
        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";
    }

    @RequestMapping("userMaster")
    public String useMaster() {
        UserMaster master = (UserMaster) session.getAttribute("loginUser");
        //添加筛选项 - 角色筛选
        List<UserRouter> routerList = routerService.selectRouterList(master);
        modelMap.addAttribute("routerList", routerList);
        return "user/master/list";
    }
    @RequestMapping("userMasterEdit")
    public String userMasterEdit(Integer id) {
        UserMaster master = (UserMaster) session.getAttribute("loginUser");
        //添加用户所属角色
        List<UserRouter> routerList = routerService.selectRouterList(master);
        modelMap.addAttribute("routerList", routerList);
        //写入id
        modelMap.addAttribute("id", id);
        //写入查询对象
        modelMap.addAttribute("editItem", masterService.findByPrimaryKey(id));
        return "user/master/edit";
    }
}

7.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.beans.factory.annotation.Value;
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;
    @Value("${system.defaultMasterPassword}")
    private String defaultPassword;

    @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);
    }


    @RequestMapping("userMasterData")
    @ResponseBody
    public BootsTableResponse<UserMaster> userMasterData(@RequestBody BootsTableRequest tableRequest) {
        UserMaster master = (UserMaster) session.getAttribute("loginUser");
        //从Table的Extras参数内直接获取数据
        Integer routerId = tableRequest.getExtra("routerId", Integer.class);
        //超级管理员可以管理所有用户信息
        if (master.getRouterId() > 1) {
            if (routerId == null || routerId <= master.getRouterId()) {
                routerId = master.getRouterId() + 1;
                tableRequest.setExtra("routerId", routerId);
            }
        }
        return masterService.bootsData(tableRequest);
    }

    @RequestMapping("editUserMaster")
    @ResponseBody
    public ErrorBean editUserMaster(@RequestBody UserMaster userMaster) {
        if (userMaster == null) return ErrorBean.getInstance(1);
        int resultLines = 0;//返回数据影响的行数
        if (userMaster.isInsert()) {
            userMaster.setMasterPassword(PeanutUtils.md5(defaultPassword));
            resultLines = masterService.insertSelective(userMaster);
        } else {
            userMaster.setMasterPassword(null);
            resultLines = masterService.updateByPrimaryKey(userMaster);
        }
        if (resultLines > 0) return ErrorBean.getInstance(0);
        return ErrorBean.getInstance(4);
    }

    @RequestMapping("delUserMaster")
    @ResponseBody
    public ErrorBean delUserMaster(@RequestBody DeleteBean deleteBean) {
        if (deleteBean == null) return ErrorBean.getInstance(1);
        if (masterService.delElementByIdList(deleteBean.getIdList()) > 0) return ErrorBean.getInstance(0);
        return ErrorBean.getInstance(5);
    }
}

8.UserRuleServiceImpl

package edu.td.peanut.service;

import com.github.pagehelper.PageHelper;
import db.mapper.UserMasterRuleDynamicSqlSupport;
import db.mapper.UserRouterRuleDynamicSqlSupport;

import db.mapper.UserRuleMapper2;
import db.model.UserMaster;
import db.model.UserRule;
import db.model.UserRule2;
import db.service.AbstractService;
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 extends AbstractService 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());
            }
            //添加排序
            super.sortByOrder(tableRequest, entity, userRule);
            return entity;
        }));
    }
    @Override
    public int insertSelective(UserRule record) {
       record.prepareEdit();
        return ruleMapper.insertSelective(record);
    }

    @Override
    public int updateByPrimaryKey(UserRule record) {
        record.prepareEdit();
        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;
    }
}

9.BootsTableRequest

在这里插入图片描述

package peanut.bean;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.apache.log4j.Logger;
import peanut.utils.PeanutUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;

@Getter
@Setter
@ToString
public class BootsTableRequest {
    private static final Logger LOG = Logger.getLogger(BootsTableRequest.class);
    private Integer limit; //限制每次查询获取到的数据条数
    private Integer offset; //从第几条数据开始查询
    private String order; //排序方式ASC DESC
    private String search; //参与排序的字段
    private String sort; //参与搜索的字段
    private Map<String, Object> extras; //额外的请求参数

    public void setLimit(Integer limit) {
        this.limit = limit == null ? 1 : limit > 1 ? limit : 1; //限定最少查询一条数据
    }

    public void setOffset(Integer offset) {
        this.offset = offset == null ? 0 : offset > 0 ? offset : 0;//限定最小值为0
    }

    public void setOrder(String order) {
        this.order = "ASC".equalsIgnoreCase(order) ? "ASC" : "DESC";//排序方式只有两种
    }

    public void setSort(String sort) {
        //参与排序的字段只允许出现数字 字母 下划线
        this.sort = sort;
        if (Pattern.matches("[0-9a-zA-Z_]+", sort)) {
            this.sort = PeanutUtils.humpToLine(sort);
        } else {
            this.sort = null;
        }
    }

    public void setSearch(String search) {
        //只能输入数字 字母 下划线 中文字符
        if (Pattern.matches("[0-9a-zA-Z_\u4300-\u9fa5]+", search)) {
            //如果是模糊查询需要拼接%%
            this.search = "%" + search + "%";
        } else {
            this.search = null;
        }
    }

    public Integer getInteger(String key) {
        return this.getExtra(key, Integer.class);
    }

    public String getString(String key) {
        return this.getExtra(key, String.class);
    }

    public <T> T getExtra(String key, Class<T> targetClass) {
        if (this.extras == null) return null;
        Object value = this.extras.get(key);
        if (value == null) return null;
        if (Objects.equals(value.getClass(), targetClass)) {
            return (T) value;
        }
        LOG.error(
                String.format("数据类型转换失败,原始类型是:%s,目标数据类型是:%s,原始数据类型是: ",
                        value.getClass().getName(),
                        targetClass.getName())
                        + value);
        return null;
    }

    public void setExtra(String key, Object value) {
        if (this.extras == null) this.extras = new HashMap<>();
        this.extras.put(key, value);
    }
}

10.UserRouterServiceImpl

package edu.td.peanut.service;

import db.mapper.UserRouterMapper;
import db.model.UserMaster;
import db.model.UserRouter;
import db.service.AbstractService;
import db.service.UserRouterService;
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.UserRouterDynamicSqlSupport.*;

@Service
@Primary
public class UserRouterServiceImpl extends AbstractService implements UserRouterService {
    @Autowired
    private UserRouterMapper routerMapper;

    @Override
    public UserRouter findByPrimaryKey(Integer key) {
        return null;
    }

    @Override
    public BootsTableResponse<UserRouter> bootsData(BootsTableRequest tableRequest) {
        return null;
    }

    @Override
    public int insertSelective(UserRouter record) {
        return 0;
    }

    @Override
    public int updateByPrimaryKey(UserRouter record) {
        return 0;
    }

    @Override
    public int delElementByIdList(List<Integer> idList) {
        return 0;
    }

    @Override
    public List<UserRouter> selectRouterList(UserMaster master) {
        if (master==null) return null;
        return routerMapper.select(entity->{
            entity.where(delTime,isEqualTo(0));
            if (master.getRouterId()>1){
                entity.where().and(id,isGreaterThan(master.getRouterId()));
            }
            entity.orderBy(addTime.descending());
            return entity;
        });
    }
}


11.UserMasterServiceImpl

package edu.td.peanut.service;

import com.github.pagehelper.PageHelper;
import db.mapper.UserMasterMapper;
import db.model.UserMaster;
import db.service.AbstractService;
import db.service.UserMasterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import peanut.bean.BootsTableRequest;
import peanut.bean.BootsTableResponse;

import java.util.List;

import static org.mybatis.dynamic.sql.SqlBuilder.*;
import static db.mapper.UserMasterDynamicSqlSupport.*;

@Service//声明当前类是用于数据查询的服务类
@Primary//当实现接口MasterService有多个实现类的时候,@Primary用于声明当前类是默认实现类,同一个接口的众多实现类中只有一个实现类可以添加@Primary注解
public class UserMasterServiceImpl extends AbstractService implements UserMasterService {
    @Autowired
    private UserMasterMapper masterMapper;//初始化查询接口

    @Override
    public UserMaster findByPrimaryKey(Integer key) {
        if (key == null || key < 1) return null;
        return masterMapper.selectByPrimaryKey(key).orElse(null);
    }

    @Override
    public BootsTableResponse<UserMaster> bootsData(BootsTableRequest tableRequest) {
        if (tableRequest == null) return null;
        //数据分页
        PageHelper.offsetPage(tableRequest.getOffset(), tableRequest.getLimit());
        //数据查询
        return new BootsTableResponse<>(masterMapper.select(entity -> {
            entity.where(delTime, isEqualTo(0))
                    .and(masterName, isLikeWhenPresent(tableRequest.getSearch()))
                    .and(routerId, isEqualToWhenPresent(tableRequest.getInteger("routerId")));
           //添加排序
            super.sortByOrder(tableRequest,entity,userMaster);
            return entity;
        }));
    }

    @Override
    public int insertSelective(UserMaster record) {
        if (record == null) return 0;
        record.prepareEdit();
        record.setId(null);
        return masterMapper.insertSelective(record);
    }

    @Override
    public int updateByPrimaryKey(UserMaster record) {
        if (record == null) return 0;
        record.prepareEdit();
        return masterMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int delElementByIdList(List<Integer> idList) {
        if (idList == null || idList.isEmpty()) return 0;
        return masterMapper.update(entity -> entity
                .set(delTime).equalTo((int) (System.currentTimeMillis() / 1000))
        );
    }

    @Override
    public UserMaster findMasterByUsername(String userName) {
        if (StringUtils.isEmpty(userName)) return null;
        /*
        return masterMapper.selectOne(new SelectDSLCompleter() {
            @Override
            public Buildable<SelectModel> apply(QueryExpressionDSL<SelectModel> selectModelQueryExpressionDSL) {
                return selectModelQueryExpressionDSL
                        .where(UserMasterDynamicSqlSupport.delTime,isEqualTo(0))
                        .and(UserMasterDynamicSqlSupport.masterUsername,isEqualTo(userName));
            }
        }).orElse(null);
        */
        return masterMapper.selectOne(entity -> entity
                .where(delTime, isEqualTo(0))
                .and(masterUsername, isEqualTo(userName))
        ).orElse(null);
    }
}

12.user下新建master文件夹,new edit.jsp list.jsp

在这里插入图片描述
master-edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ include file="/WEB-INF/layout/header.jsp" %>
</head>
<body>
<form action="master/editUserMaster.do" method="post" class="container-fluid">
    <input type="hidden" name="id" value="${editItem.id}">
    <div class="form-group mb-2">
        <label>所属角色</label>
        <select class="form-control" name="routerId">
            <c:forEach items="${routerList}" var="item">
                <option
                        <c:if test="${editItem.routerId==item.id}">selected</c:if>
                        value="${item.id}">${item.routerName}</option>
            </c:forEach>
        </select>
    </div>
    <div class="form-group mb-2">
        <label>用户名称</label>
        <input class="form-control" name="masterName" value="${editItem.masterName}">
    </div>
    <div class="form-group mb-2">
        <label>用户头像</label>
        <input class="form-control" name="masterThumb" value="${editItem.masterThumb}">
    </div>
    <div class="form-group mb-2">
        <label>登录账号</label>
        <input class="form-control" name="masterUsername" value="${editItem.masterUsername}">
    </div>
    <div class="form-group mb-2">
        <label>联系电话</label>
        <input class="form-control" name="masterPhone" value="${editItem.masterPhone}">
    </div>
    <div class="form-group mb-2">
        <label>联系邮箱</label>
        <input class="form-control" name="masterMail" value="${editItem.masterMail}">
    </div>
</form>
<%@include file="/WEB-INF/layout/footer.jsp" %>
</body>
</html>

master-list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ include file="/WEB-INF/layout/header.jsp" %>
</head>
<body style="background-color: #e3e3e3;">
<div class="container-fluid mt-2">
    <div class="content">
        <div class="card">
            <section class="card-header">
                <h3 class="card-title">管理员列表</h3>
                <span class="float-right">
                    <a class="refresh-page text-dark" href="javascript:window.location.reload();" title="刷新当前页面">
                        <i class="fa fa-sync"></i>
                    </a>
                </span>
            </section>
            <section class="card-body">
                <div id="toolbar" class="input-group">
                    <button class="btn btn-success add-item mr-2">新增内容</button>
                    <button class="btn btn-danger del-checked mr-2">删除选中</button>
                    <select class="form-control" name="routerId">
                        <c:forEach items="${routerList}" var="i">
                            <option value="${i.id}">${i.routerName}</option>
                        </c:forEach>
                    </select>
                </div>
                <table id="bootstrapTable"></table>
            </section>
        </div>
    </div>
</div>
<%@include file="/WEB-INF/layout/footer.jsp" %>
<script>
    ($ => {
        const table = $("#bootstrapTable"); //获取Dom对象
        //初始化数据表格
        $(() => {
            table.bootstrapTable({
                url: "master/userMasterData.do", // 获取数据的ajax请求接口
                queryParams(params) {
                    return JSON.stringify($.extend({}, params, {
                        extras: {
                            routerId: parseInt($("#toolbar select[name='routerId']").val())
                        } // 附加的额外请求参数
                    }));
                },
                columns: [{   //代表一列的数据
                    checkbox: true
                }, {   //代表一列的数据
                    field: "id", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "编号",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "routerId", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "所属角色",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式
                    formatter(value) {
                        return $("#toolbar select[name='routerId']").find("option[value='" + value + "']").text();
                    }

                }, {   //代表一列的数据
                    field: "masterName", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "用户名称",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "masterThumb", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "用户头像",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式
                    formatter(value) {
                        if (value)
                            return `<img style="max-height:80px;max-width:80px;" src="${'${value}'}">`;
                    }

                }, {   //代表一列的数据
                    field: "masterUserName", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "登录账号",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "masterPhone", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "联系电话",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "masterMail", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "联系邮箱",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "addTime", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "添加时间",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "updateTime", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "修改时间",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式
                    visible: false, //默认隐藏当前列

                }, {   //代表一列的数据
                    field: "delTime", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "操作栏",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式
                    events: "actionEvents", //指定单元格内事件处理的对象名称 必须保存
                    formatter(value, row, index) {   //用于格式化显示内容

                        return [
                            '<a class="text-info edit"><i class="fa fa-edit"></i></a>',
                            '<a class="text-danger delete"><i class="fa fa-trash"></i></a>'
                        ].join("<span class='mr-2'></span>");
                    }
                }],  //是一个数组,用于定义列的名称,列的显示方式,列的显示字段
            });
            //设置筛选监听
            $("#toolbar").on("click", "button", function (e) {
                //需要用到this对象所以不用箭头函数
                //console.log(this,e.target,e.currentTarget);
                const target = $(this); //获取被点击对象
                if (target.hasClass("add-item")) {
                    //新增新内容
                    $.peanutPage.modal({
                        title: "新增管理员信息",
                        url: "master/userMasterEdit.do"
                    });
                } else if (target.hasClass("del-checked")) {
                    //删除所选项
                    $.peanutPage.delElement({
                        title: "删除警告",
                        text: "是否确认删除当前选中的用户",
                        url: "master/delUserMaster.do",
                        table: "#bootstrapTable"
                    });
                }
            });
            $("#toolbar select").change(() => {
                table.bootstrapTable("refresh");
            });
        });
        //设置表格内按钮的点击事件
        window.actionEvents = {
            "click .edit": function (e, value, row, index) {
                //修改栏目操作
                $.peanutPage.modal({
                    title: "修改用户信息",
                    url: "master/userMasterEdit.do?id=" + row.id
                });
            },
            "click .delete": function (e, value, row, index) {
                //删除当前栏目操作
                $.peanutPage.delElement({
                    title: "删除警告",
                    text: "是否确认删除当前用户:" + row["masterName"] + "?",
                    url: "master/delUserMaster.do",
                    data: {
                        idList: [row.id]
                    },
                    table: "#bootstrapTable"
                }); //删除结束
            }
        }; //优先于bootstrapTable初始化前定义执行
    })(jQuery);
</script>
</body>
</html>

rule-edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ include file="/WEB-INF/layout/header.jsp" %>
</head>
<body>
<form action="master/editUserRule.do" method="post" class="container-fluid">
    <input type="hidden" name="id" value="${editItem.id}">
    <div class="form-group mb-2">
        <label>父级权限</label>
        <select class="form-control" name="pid">
            <option value="">无父级权限</option>
            <c:forEach items="${ruleList}" var="item" varStatus="status">
                <option <c:if test="${editItem.pid==item.id}">selected</c:if> value="${item.id}">${item.ruleName}</option>
            </c:forEach>
        </select>
    </div>
    <div class="form-group mb-2">
        <label>权限名称</label>
        <input class="form-control" name="ruleName" value="${editItem.ruleName}">
    </div>
    <div class="form-group mb-2">
        <label>权限路径</label>
        <input class="form-control" name="ruleUrl" value="${editItem.ruleUrl}">
    </div>
    <div class="form-group mb-2">
        <label>请求方法</label>
        <select class="form-control" name="ruleMethod">
            <option value="GET">GET</option>
            <option <c:if test="${editItem.ruleMethod=='POST'}">selected</c:if> value="POST">POST</option>
        </select>
    </div>
    <div class="form-group mb-2">
        <label>权限类型</label>
        <select class="form-control" name="ruleType">
            <option value="API">API</option>
            <option <c:if test="${editItem.ruleType=='NAV'}">selected</c:if> value="NAV">NAV</option>
            <option <c:if test="${editItem.ruleType=='PAGE'}">selected</c:if> value="PAGE">PAGE</option>
        </select>
    </div>
    <div class="form-group mb-2">
        <label>权限图标</label>
        <select class="form-control" name="ruleIcon">
            <option value="user">图标:<i class="fa fa-user"></i></option>
        </select>
    </div>
    <div class="form-group mb-2">
        <label>解释文档</label>
        <textarea style="height: auto" class="form-control" name="ruleDes">${editItem.ruleDes}</textarea>
    </div>
</form>
<%@include file="/WEB-INF/layout/footer.jsp"%>
</body>
</html>

rule-list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ include file="/WEB-INF/layout/header.jsp" %>
</head>
<body style="background-color: #e3e3e3;">
<div class="container-fluid mt-2">
    <div class="content">
        <div class="card">
            <section class="card-header">
                <h3 class="card-title">权限配置</h3>
                <span class="float-right">
                    <a class="refresh-page text-dark" href="javascript:window.location.reload();" title="刷新当前页面">
                        <i class="fa fa-sync"></i>
                    </a>
                </span>
            </section>
            <section class="card-body">
                <div id="toolbar" class="input-group">
                    <button class="btn btn-success add-item mr-2">新增内容</button>
                    <button class="btn btn-danger del-checked mr-2">删除选中</button>
                    <select class="form-control" name="pid">
                        <option value="0">无父级权限</option>
                        <c:forEach items="${ruleList}" var="i">
                            <option value="${i.id}">${i.ruleName}</option>
                        </c:forEach>
                    </select>
                </div>
                <table id="bootstrapTable"></table>
            </section>
        </div>
    </div>
</div>
<%@include file="/WEB-INF/layout/footer.jsp" %>
<script>
    ($ => {
        $(() => {
            const table = $("#bootstrapTable"); //获取Dom对象
            //初始化数据表格
            table.bootstrapTable({
                url: "master/userRuleData.do", // 获取数据的ajax请求接口
                queryParams(params) {
                    return JSON.stringify($.extend({}, params, {
                        extras: {
                            pid:parseInt($("#toolbar select[name='pid']").val())
                        } // 附加的额外请求参数
                    }));
                },
                columns: [{   //代表一列的数据
                    checkbox: true
                }, {   //代表一列的数据
                    field: "id", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "编号",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "pid", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "父级权限",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "ruleName", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "权限名称",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "ruleUrl", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "访问路径",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "ruleMethod", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "方法",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "ruleType", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "类型",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "ruleIcon", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "图标",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "ruleDes", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "描述信息",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "addTime", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "添加时间",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式

                }, {   //代表一列的数据
                    field: "updateTime", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "修改时间",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式
                    visible: false, //默认隐藏当前列

                }, {   //代表一列的数据
                    field: "delTime", // 数据对象的属性名称,当前列展示当前属性的值
                    title: "操作栏",//当前列的标题名称
                    align: "center", //left center  right 单元格文字的对齐方式
                    events: "actionEvents", //指定单元格内事件处理的对象名称 必须保存
                    formatter(value, row, index) {   //用于格式化显示内容

                        return [
                            '<a class="text-info edit"><i class="fa fa-edit"></i></a>',
                            '<a class="text-danger delete"><i class="fa fa-trash"></i></a>'
                        ].join("<span class='mr-2'></span>");
                    }
                }],  //是一个数组,用于定义列的名称,列的显示方式,列的显示字段
            });
            //设置筛选监听
            $("#toolbar").on("click", "button", function (e) {
                //需要用到this对象所以不用箭头函数
                //console.log(this,e.target,e.currentTarget);
                const target = $(this); //获取被点击对象
                if (target.hasClass("add-item")) {
                    //新增新内容
                    $.peanutPage.modal({
                        title: "新增权限信息",
                        url: "master/userRuleEdit.do"
                    });
                } else if (target.hasClass("del-checked")) {
                    //删除所选项
                    $.peanutPage.delElement({
                        title: "删除警告",
                        text: "是否确认删除当前选中的权限",
                        url: "master/delUserRule.do",
                        table: "#bootstrapTable"
                    });
                }
            });
            $("#toolbar select").change(()=>{
                table.bootstrapTable("refresh");
            });
        });

        //设置表格内按钮的点击事件
        window.actionEvents = {
            "click .edit": function (e, value, row, index) {
                //修改栏目操作
                $.peanutPage.modal({
                    title: "修改权限信息",
                    url: "master/userRuleEdit.do?id=" + row.id
                });
            },
            "click .delete": function (e, value, row, index) {
                //删除当前栏目操作
                $.peanutPage.delElement({
                    title: "删除警告",
                    text: "是否确认删除当前权限:" + row["ruleName"] + "?",
                    url: "master/delUserRule.do",
                    data: {
                        idList: [row.id]
                    },
                    table: "#bootstrapTable"
                }); //删除结束
            }
        }; //优先于bootstrapTable初始化前定义执行
    })(jQuery);
</script>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值