mybatis plus + layui + spring boot + shiro

mybatis plus + spring boot + shiro:

entity:

package com.aaa.entity;

import com.baomidou.mybatisplus.annotations.TableField;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * <p>
 * 用户信息表
 * </p>
 *
 * @author AAATeacherChen
 * @since 2020-07-09
 */
@Data
public class UserVo  implements  Serializable{

    private static final long serialVersionUID = 1L;

    /**
     * 用户ID
     */
    private Integer userId;
    /**
     * 部门ID
     */
    private Integer deptId;
    /**
     * 登录账号
     */
    private String loginName;
    /**
     * 用户昵称
     */
    private String userName;
    /**
     * 用户邮箱
     */
    private String email;
    /**
     * 手机号码
     */
    private String phonenumber;
    /**
     * 用户性别(0男 1女 2未知)
     */
    private String sex;
    private String avatar;
    /**
     * 密码
     */
    private String password;
    /**
     * 盐加密
     */
    private String salt;
    /**
     * 帐号状态(0正常 1停用)
     */
    private String status;
    /**
     * 删除标志(0代表存在 2代表删除)
     */
    private String delFlag;
    /**
     * 创建者
     */
    private String createBy;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 更新者
     */
    private String updateBy;
    /**
     * 更新时间
     */
    private Date updateTime;
    /**
     * 备注
     */
    private String remark;

    /**
     * 实体多对多
     */
    private Dept dept;
}

dao:

@Mapper
@Repository
//@CacheNamespace(implementation= MybatisCache.class,eviction=MybatisCache.class)
public interface UserDao extends BaseMapper<User> {
    List<UserVo> selectUserVoList(Page<UserVo> pageInfo, @Param("condition")  Map<String ,Object> condition);
    int updateUserColumById(User user);
    int resetPassword(User user);
}

service:

public interface UserService extends IService<User> {

    List<UserVo> selectUserVoList( Page<UserVo> pageInfo, Map<String ,Object> condition);
    boolean saveUserAndSalt(User user);
    boolean updateUserAndSalt(User user);
    boolean resetPassword(User user);

}

Impl:

package com.aaa.service.impl;

import com.aaa.dao.UserRoleDao;
import com.aaa.entity.User;
import com.aaa.dao.UserDao;
import com.aaa.entity.UserRole;
import com.aaa.entity.UserVo;
import com.aaa.service.UserService;
import com.aaa.shiro.ShiroUtil;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * 用户信息表 服务实现类
 * </p>
 *
 * @author AAATeacherChen
 * @since 2020-07-09
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    private UserRoleDao userRoleDao;


    @Override
    public List<UserVo> selectUserVoList( Page<UserVo> pageInfo, Map<String ,Object> condition) {
        List<UserVo> userVoList = userDao.selectUserVoList(pageInfo, condition);
        return userVoList;
    }

    /**
     * create by: Teacher陈
     * description: 保存用户之前,对密码进行加盐加密
     * create time: 2020/7/23 16:05
     *
     * @return a
     * @Param: null
     */
    @Override
    public boolean saveUserAndSalt(User user) {
        //获取从页面传入的角色id,因为salt是在后台生成,所有由salt属性传入角色id的集合
        String roleIds = user.getSalt();
        //生成随机码作为salt
        String salt = UUID.randomUUID().toString();
        //获取明文密码
        String message = user.getPassword();
        //获取密文密码
        String encryption = ShiroUtil.encryptionBySalt(salt, message);
        //设置user的密码属性
        user.setPassword(encryption);
        //设置user对象的盐值属性
        user.setSalt(salt);
        //将用户保存到数据库
        Integer insert = userDao.insert(user);
        //如果插入成功,并且页面传入的角色id不为空
        return updateRoleUser(user,roleIds);

    }
    @Override
    public boolean updateUserAndSalt(User user) {
        String roleIds = user.getSalt();
        //将用户保存到数据库
        Integer update = userDao.updateUserColumById(user);
        //如果插入成功,并且页面传入的角色id不为空
        if(update>0){
            boolean b = updateRoleUser(user, roleIds);
            if(b){
                return true;
            }
        }

        return false;
    }

    @Override
    public boolean resetPassword(User user) {
        //生成随机码作为salt
        String salt = UUID.randomUUID().toString();
        //获取明文密码
        String message = user.getPassword();
        //获取密文密码
        String encryption = ShiroUtil.encryptionBySalt(salt, message);
        //设置user的密码属性
        user.setPassword(encryption);
        //设置user对象的盐值属性
        user.setSalt(salt);
        //将用户保存到数据库
        Integer reset = userDao.resetPassword(user);
        if(reset>0){
            return true;
        }
        return false;
    }

    /**
     * @create by: Teacher陈
     * @description: 更新用户和角色中间表
     * @create time: 2020/7/19 13:37
     */
    private boolean updateRoleUser(User user,String roleIds) {
        if ( roleIds != null) {
            //删除此用户原有的角色
            Wrapper<UserRole> wrapper = new EntityWrapper();
            wrapper.eq("user_id", user.getUserId());
            userRoleDao.delete(wrapper);
            //添加此用户关联的新角色
            String[] strings = roleIds.split(",");
            for (String string : strings) {
                if (string != null && string != "") {
                    Integer roleID = Integer.parseInt(string);
                    UserRole userRole = new UserRole();
                    userRole.setUserId(user.getUserId());
                    userRole.setRoleId(roleID);
                    userRoleDao.insert(userRole);
                }
            }
            return true;
        }
        return false;
    }
}

controller:

package com.aaa.controller;


import com.aaa.aop.SaveOrUpdateEntityAnn;
import com.aaa.entity.*;
import com.aaa.service.DeptService;
import com.aaa.service.RoleService;
import com.aaa.service.UserService;
import com.aaa.util.MyConstants;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户信息表 前端控制器
 * </p>
 *
 * @author AAATeacherChen
 * @since 2020-07-09
 */
@Controller
@RequestMapping("/user")
public class UserController  extends  BaseController{
    @Autowired
    UserService userService;
    @Autowired
    DeptService deptService;
    @Autowired
    RoleService roleService;
    @RequestMapping("/toShowUser")
    public String toShowUser(Model model){
        //查询所有的部门信息,填充到页面下拉框中
        List<Dept> deptList = deptService.selectList(null);
        //查询所有的角色信息,填充到页面下拉框中
        List<Role> roleList = roleService.selectList(null);

        model.addAttribute("deptList", deptList);
        model.addAttribute("roleList", roleList);
        return "user/showUser";
    }

    /**
     * create by: Teacher陈
     * description: 返回所有的用户信息,包含部门信息
     * create time: 2020/7/20 17:20
     *
     * @Param:
     * @return java.lang.String
     */
    @RequestMapping("/selectAllUser")
    @ResponseBody
    public LayUiTable selectAllUser(HttpSession session,Integer page, Integer limit, String searchLoginName, String searchUserName, String searchPhonenumber){
/*        int sessionTimeout = session.getServletContext().getSessionTimeout();
        System.out.println(sessionTimeout);
        long timeout = SecurityUtils.getSubject().getSession().getTimeout();
        System.out.println(timeout);*/
        LayUiTable table = new LayUiTable();
        //多条件查询所需要的集合
        Map<String ,Object> condition= new HashMap(16);
        Wrapper wrapper = new EntityWrapper();
        //添加模糊查询的条件
        if (null != searchLoginName && !"".equals(searchLoginName)) {
            wrapper.like("login_name", searchLoginName);
            condition.put("login_name", searchLoginName);
        }
        if (null != searchUserName && !"".equals(searchUserName)) {
            condition.put("user_name", searchUserName);
        }
        if (null != searchPhonenumber && !"".equals(searchPhonenumber)) {
            condition.put("phonenumber", searchPhonenumber);
        }
        wrapper.eq("del_flag", 0);
        condition.put("del_flag", 0);
        int userListCount = userService.selectCount(wrapper);
        //如果表中没有数据。则不进行分页查询
        if(userListCount>0){
            //获取当前的系统毫秒数
            long start = System.currentTimeMillis();
            Page<UserVo> pageInfo = new Page(page, limit);
            List<UserVo> userVoList = userService.selectUserVoList(pageInfo,condition);
            //从分页结果中提取list集合
            table.setCode(MyConstants.OPERATION_SUCCESS_CODE);
            table.setMsg(MyConstants.OPERATION_SUCCESS_MESSAGE);
            table.setData(userVoList);
            table.setCount(userListCount);
            long end = System.currentTimeMillis();
           /* System.out.println("============查询花费时间:"+(end-start)+"============");*/
        }
        return table;

    }


    /**
     * create by: Teacher陈
     * description: 判断用户名是否存在,存在的话返回false,不存在返回true ,检验添加用户是否重复
     * create time: 2020/7/22 17:08
     * @Param: username
     * @return boolean
     */
    @RequestMapping("/checkUserName")
    @ResponseBody
    public Result checkUserName(String username){
        Wrapper<User> wrapper = new EntityWrapper<>();
        User user = userService.selectOne(wrapper.eq("login_name", username));
        if (user != null) {
           return  super.error(MyConstants.OPERATION_FAIL_CODE, username+"已经被占用");
        }
        return super.success();
    }


    /**
     * create by: Teacher陈
     * description: 保存用户
     * create time: 2020/7/23 15:43
     *
     * @return a
     * @Param: null
    */
    @RequestMapping("/saveUser")
    @ResponseBody
    @SaveOrUpdateEntityAnn(entityClass = User.class)
    public Result saveUser(User user){
        boolean insert = userService.saveUserAndSalt(user);
        if(insert){
            return success();
        }
        return error();
    }
    @RequestMapping("/updateUser")
    @ResponseBody
    @SaveOrUpdateEntityAnn(entityClass = User.class)
    /**
     * @create by: Teacher陈
     * @description: 修改用户
     * @create time: 2020/7/18 19:32
     * @param user
     * @return com.aaa.entity.Result
     */
    public Result updateUser(User user){
        boolean update = userService.updateUserAndSalt(user);
        if(update){
            return success();
        }
        return error();
    }
    /**
     * @create by: Teacher陈
     * @description: 删除用户(逻辑删除)
     * @create time: 2020/7/19 13:44
     */
    @RequestMapping("/deleteUser")
    @ResponseBody
    public Result deleteUser(User user){
        user.setDelFlag("1");
        boolean update = userService.updateById(user);
        if(update){
            return success();
        }
        return error();
    }
    /**
     * @create by: Teacher陈
     * @description: 根据用户id查询自己的角色
     * @create time: 2020/7/18 21:28
     */
    @RequestMapping("/getRoleCheckByUserId")
    @ResponseBody
    public Result getRoleCheckByUserId(Integer userId){
        List<Role> roleUserList = roleService.selectListByUserId(userId);
        List<Role> roleList = roleService.selectList(null);
        Map map = new HashMap();
        for (Role role : roleList) {
            //判断集合包含对象,必须重写equals和hashcode方法
            if(roleUserList.contains(role)){
                map.put(role.getRoleKey(), true);
            }else {
                map.put(role.getRoleKey(), false);
            }
        }
        System.out.println(map.toString());
        return success(map);
    }

    /**
     * @create by: Teacher陈
     * @description: 重置密码
     * @create time: 2020/7/19 15:16
     */
    @RequestMapping("/resetPassword")
    @ResponseBody
    public  Result resetPassword(User user){
        boolean update = userService.resetPassword(user);
        if(update){
            return success();
        }
        return error();
    }
    /**
     * @create by: Teacher陈
     * @description: 批量删除用户
     * @create time: 2020/7/19 15:20
     * @param userList
     * @return Result
     */
    @RequestMapping(value = "/deleteBatchUser")
    @ResponseBody
    public Result deleteBatchUser(@RequestBody List<User> userList) {
        List<User> userListNew = new ArrayList<>();
        //此处是逻辑删除,修改delflag
        for (User user : userList) {
            User userNew = new User();
            userNew.setDelFlag("1");
            userNew.setUserId(user.getUserId());
            userListNew.add(userNew);
        }
        boolean update = userService.updateBatchById(userListNew);
        if (update) {
            return super.success();
        } else {
            return super.error();
        }
    }
    /**
     * 去用户基本信息
     * @param model
     * @param request
     * @return
     */
    @RequestMapping("toUserInfo")
    public String toUserInfo(Model model,  HttpServletRequest request) {
        //获取session的userid
        String remoteUser = request.getRemoteUser();
        String[] split = remoteUser.split(",");
        String[] split1 = split[0].split("=");
        String id = split1[1];
        //转integer类型
        Integer userId = Integer.valueOf(id);
        //根据id查询user列表
        User user = userService.selectById(userId);
        //获取deptid
        Integer deptId = user.getDeptId();
        Dept dept = deptService.selectById(deptId);
        //获取roleid
//        UserController userController = new UserController();
//        Result roleCheckByUserId = userController.getRoleCheckByUserId(userId);
//        model.addAttribute("role", roleCheckByUserId);
        //查询所有的部门信息,填充到页面下拉框中
        List<Dept> deptList = deptService.selectList(null);
        //查询所有的角色信息,填充到页面下拉框中
        List<Role> roleList = roleService.selectList(null);
        model.addAttribute("user", user);
        model.addAttribute("dept", dept);
        model.addAttribute("deptList", deptList);
//        model.addAttribute("roleList", roleList);
        return "/user/userinfo";
    }

    /**
     * 修改基本信息
     * @param user
     * @return
     */
    @RequestMapping("/updateInfo")
    @ResponseBody
    @SaveOrUpdateEntityAnn(entityClass = User.class)
    public Result update(User user){
        user.setPassword(null);
        boolean update = userService.updateById(user);
        if(update){
            return success();
        }
        return error();
    }

    /**
     * 去修改用户基本信息
     * @param model
     * @param request
     * @return
     */
    @RequestMapping("toUpdateUser")
    public String toUpdateUser(Model model,  HttpServletRequest request) {
        //获取session的userid
        String remoteUser = request.getRemoteUser();
        String[] split = remoteUser.split(",");
        String[] split1 = split[0].split("=");
        String id = split1[1];
        Integer userId = Integer.valueOf(id);
        User user = userService.selectById(userId);
        Integer deptId = user.getDeptId();
        //根据id获取部门信息
        Dept dept = deptService.selectById(deptId);
        //查询所有的部门信息,填充到页面下拉框中
        List<Dept> deptList = deptService.selectList(null);
        //查询所有的角色信息,填充到页面下拉框中
        List<Role> roleList = roleService.selectList(null);
        model.addAttribute("user", user);
        model.addAttribute("dept", dept);
        model.addAttribute("deptList", deptList);
        return "/user/userinfoUpdate";
    }

    /**
     * 去修改用户密码
     * @return
     */
    @RequestMapping("toPassUser")
    public String toPasswordUser() {
        return "user/userinfoPassW";
    }

    /**
     * 修改个人密码
     * @param user
     * @param request
     * @return
     */
    @RequestMapping("/PasswordUser")
    @ResponseBody
    public  Result PasswordUser(User user,HttpServletRequest request){
        //获取session的userid
        String remoteUser = request.getRemoteUser();
        String[] split = remoteUser.split(",");
        String[] split1 = split[0].split("=");
        String id = split1[1];
        Integer userId = Integer.valueOf(id);
        //将id传入user中
        user.setUserId(userId);
        boolean update = userService.resetPassword(user);
        if(update){
            return success();
        }
        return error();
    }
}

UserDao.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aaa.dao.UserDao" >
 <!--<cache type="com.aaa.redis.MybatisCache" eviction="LRU"></cache>-->
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.aaa.entity.User">
        <id column="user_id" property="userId" />
        <result column="dept_id" property="deptId" />
        <result column="login_name" property="loginName" />
        <result column="user_name" property="userName" />
        <result column="email" property="email" />
        <result column="phonenumber" property="phonenumber" />
        <result column="sex" property="sex" />
        <result column="avatar" property="avatar" />
        <result column="password" property="password" />
        <result column="salt" property="salt" />
        <result column="status" property="status" />
        <result column="del_flag" property="delFlag" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="remark" property="remark" />
    </resultMap>
    <!-- 通用查询映射结果 -->
    <resultMap id="UserDeptResultMap" type="com.aaa.entity.UserVo">
        <id column="user_id" property="userId" />
        <result column="dept_id" property="deptId" />
        <result column="login_name" property="loginName" />
        <result column="user_name" property="userName" />
        <result column="email" property="email" />
        <result column="phonenumber" property="phonenumber" />
        <result column="sex" property="sex" />
        <result column="avatar" property="avatar" />
        <result column="password" property="password" />
        <result column="salt" property="salt" />
        <result column="status" property="status" />
        <result column="del_flag" property="delFlag" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="remark" property="remark" />
        <association property="dept" column="dept_id" javaType="com.aaa.entity.Dept">
            <result column="dept_name" property="deptName"></result>
        </association>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        user_id AS userId, dept_id AS deptId, login_name AS loginName, user_name AS userName, email, phonenumber, sex, avatar, password, salt, status, del_flag AS delFlag, create_by AS createBy, create_time AS createTime, update_by AS updateBy, update_time AS updateTime, remark
    </sql>
<!--    更新用户表的部分列-->
    <update id="updateUserColumById" parameterType="com.aaa.entity.User">
        update  tbl_user set
        user_name=#{userName},
        dept_id=#{deptId},
        email=#{email},
        phonenumber=#{phonenumber},
        sex=#{sex},
        avatar=#{avatar},
        status=#{status},
        update_by=#{updateBy},
        update_time=#{updateTime},
        remark=#{remark}
        where user_id=#{userId}
    </update>
<!--    重置密码-->
    <update id="resetPassword" parameterType="com.aaa.entity.User">
         update  tbl_user
            set password=#{password},
                salt=#{salt}
            where user_id=#{userId}
    </update>
    <!--多条件查询-->
    <select id="selectUserVoList" resultMap="UserDeptResultMap">
          select u.*,d.dept_name from tbl_user u INNER JOIN tbl_dept d on u.dept_id=d.dept_id
          <where>
              <if test="condition.login_name != null and condition.login_name != ''">
                  AND u.login_name like concat('%', #{condition.login_name},'%')
              </if>
              <if test="condition.user_name != null and condition.user_name != ''">
                  AND u.user_name like concat('%', #{condition.user_name},'%')
              </if>
              <if test="condition.phonenumber != null and condition.phonenumber != ''">
                  AND u.phonenumber like concat('%', #{condition.phonenumber},'%')
              </if>
              <if test="condition.del_flag != null ">
                  AND u.del_flag = #{condition.del_flag}
              </if>
          </where>
    </select>

</mapper>

lay ui:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8">
    <title>用户管理页面</title>
    <link rel="stylesheet" th:href="@{/layui/css/layui.css}">
    <script th:src="@{/layui/layui.js}"></script>
</head>
<body>
<script type="text/html" id="barDemo">
    <a class="layui-btn  layui-btn-normal layui-btn-xs" lay-event="resetPassword">重置密码</a>
    <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete"
       shiro:hasPermission="system:user:remove">删除</a>
    <!--<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete"  >删除</a>-->
</script>
<form class="layui-form" action="" id="save_user_form" style="display: none">
    <div class="layui-form-item">
        <label class="layui-form-label">登录名</label>
        <div class="layui-input-block">
            <input type="text" name="loginName" id="loginName" required lay-verify="required" placeholder="请输入登录名称"
                   autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">密 码</label>
        <div class="layui-input-block">
            <input type="text" name="password" required lay-verify="required" placeholder="请设置密码" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">真实姓名</label>
        <div class="layui-input-inline">
            <input type="text" name="userName" required lay-verify="required" placeholder="请输入真实姓名" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">邮箱</label>
        <div class="layui-input-inline">
            <input type="text" name="email" required lay-verify="email" placeholder="请输入电子邮箱" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">手机号</label>
        <div class="layui-input-inline">
            <input type="text" name="phonenumber" required lay-verify="required|phone" placeholder="请输入手机号"
                   autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">部门</label>
        <div class="layui-input-block">
            <select name="deptId" lay-verify="required">
                <option th:each="dept:${deptList}" th:value="${dept.deptId}" th:text="${dept.deptName}"></option>
            </select>
        </div>
    </div>

    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">状态</label>
            <div class="layui-input-block">
                <input type="checkbox" name="status" lay-skin="switch" lay-text="正常|禁用" checked value="0">
            </div>
        </div>
        <div class="layui-inline">
            <label class="layui-form-label">性别</label>
            <div class="layui-input-block">
                <input type="radio" name="sex" value="0" title="男" checked="">
                <input type="radio" name="sex" value="1" title="女">
            </div>
        </div>
    </div>
    <div class="layui-form-item" pane="">
        <label class="layui-form-label">角色</label>
        <div class="layui-input-block">
            <input  th:each="role:${roleList}" name="role" type="checkbox" th:value="${role.roleId}"
                   lay-skin="primary"
                   th:text="${role.roleName}">
        </div>
        <input hidden="hidden" name="salt">
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">备注</label>
        <div class="layui-input-inline">
            <input type="text" name="remark" required lay-verify="required" placeholder="请输入备注信息" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
<!--===========================================更新用户信息==============================================================-->
<form class="layui-form" action="" id="update_user_form" style="display: none" lay-filter="update_user_form">
    <!--隐藏输入框,保存主键-->
    <div style="margin-top: 2%"></div>
    <input type="hidden" name="userId">
    <input type="hidden" name="loginName">
    <input type="hidden" name="password">
    <div class="layui-form-item">
        <label class="layui-form-label">真实姓名</label>
        <div class="layui-input-inline">
            <input type="text" name="userName" required lay-verify="required" placeholder="请输入真实姓名" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">邮箱</label>
        <div class="layui-input-inline">
            <input type="text" name="email" required lay-verify="email" placeholder="请输入电子邮箱" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">手机号</label>
        <div class="layui-input-inline">
            <input type="text" name="phonenumber" required lay-verify="required|phone" placeholder="请输入手机号"
                   autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">部门</label>
        <div class="layui-input-block">
            <select name="deptId" lay-verify="required">
                <option th:each="dept:${deptList}" th:value="${dept.deptId}" th:text="${dept.deptName}"></option>
            </select>
        </div>
    </div>

    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">状态</label>
            <div class="layui-input-block">
                <input type="checkbox" name="status" lay-skin="switch" lay-text="正常|禁用" checked value="0">
            </div>
        </div>
        <div class="layui-inline">
            <label class="layui-form-label">性别</label>
            <div class="layui-input-block">
                <input type="radio" name="sex" value="0" title="男" checked="">
                <input type="radio" name="sex" value="1" title="女">
            </div>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">角色</label>
        <div class="layui-input-block">
            <input class="role_check" th:each="role:${roleList}" th:name="${role.roleKey}" type="checkbox"
                   th:value="${role.roleId}"
                   lay-skin="primary" th:text="${role.roleName}">
        </div>
        <input hidden="hidden" name="salt">
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">备注</label>
        <div class="layui-input-inline">
            <input type="text" name="remark" required lay-verify="required" placeholder="请输入备注信息" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="formUpdateUser">立即提交</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
<!--=========================================重置密码===============================-->
<form class="layui-form" action="" id="reset_password_form" style="display: none" lay-filter="reset_password_form">
    <!--隐藏输入框,保存主键-->
    <input type="hidden" name="userId">
    <div class="layui-form-item">
        <label class="layui-form-label">密码</label>
        <div class="layui-input-inline">
            <input type="text" name="password" required lay-verify="required" placeholder="请输入新密码" autocomplete="off"
                   class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="formResetPassword-flter">立即提交</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
<div class="layui-fluid">
    <!--=============================条件查询==================================-->
    <div class="layui-card" style="padding-top: 30px">
        <form class="layui-form">
            <div class="layui-inline">
                <label class="layui-form-label">登录名</label>
                <div class="layui-input-inline">
                    <input type="text" class="layui-input" id="searchLoginName" name="searchLoginName" placeholder="登录名"
                           width="80px">
                </div>
            </div>
            <div class="layui-inline">
                <label class="layui-form-label">真实姓名</label>
                <div class="layui-input-inline">
                    <input type="text" class="layui-input" id="searchUserName" name="searchUserName"
                           placeholder="真实姓名"
                           width="80px">
                </div>
            </div>
            <div class="layui-inline">
                <label class="layui-form-label">手机号</label>
                <div class="layui-input-inline">
                    <input type="text" class="layui-input" id="searchPhonenumber" name="searchPhonenumber"
                           placeholder="手机号"
                           width="80px">
                </div>
            </div>
            <div class="layui-inline">
                <button class="layui-btn" lay-submit="search_submits" lay-filter="search_filter">查询</button>
                 <button id="search_reset" class="layui-btn layui-btn-primary">重置</button>
            </div>
        </form>
    </div>
    <div class="layui-card">
        <table id="demo" lay-filter="userTable"></table>
    </div>
</div>
<script type="text/html" id="toolbarDemo">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" lay-event="addUser">添加</button>
        <button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="deleteBatch">删除</button>
    </div>
</script>
</body>
<script>
    layui.use(['layer', 'form', 'table', 'jquery'], function () {
        var table = layui.table;
        var form = layui.form;
        var $ = layui.jquery;

        //第一个实例
        var myTable = table.render({
            elem: '#demo'
            , id: 'tableReload'//重载数据表格
            , height: 420
            , url: '/user/selectAllUser' //数据接口
            , page: true //开启分页
            , limit: 5//默认一页显示5条数据
            , limits: [5, 10, 15, 20, 50, 100]//默认一页显示5条数据
            , toolbar: '#toolbarDemo'//此处的id是html代码段
            , cols: [
                [ //表头
                    {field: 'userId', title: '用户编号', sort: true, fixed: 'left', checkbox: true}
                    , {field: 'userId', title: '编号',  sort: true, width: '7%',}
                    , {field: 'loginName', title: '登录名', width: '9%',}
                    , {field: 'userName', title: '真实姓名', width: '7%',}
                    , {field: 'phonenumber', title: '手机号'}
                    , {
                    field: 'sex', title: '性别', width: '6%',
                    templet: function (d) {
                        if (d.sex == 0) {
                            return "男"
                        } else {
                            return "女"
                        }
                    }
                }
                    , {
                    field: 'status', title: '状态', width: '6%',
                    templet: function (d) {
                        if (d.status == 0) {
                            return '<button type="button" class="layui-btn layui-btn-xs">正常</button>'
                        } else {
                            return '<button type="button" class="layui-btn layui-btn-xs layui-btn-danger">禁用</button>'
                        }
                    }
                }
                    , {
                    field: 'deptName', title: '部门名称', width: '8%',
                    templet: function (d) {
                        return d.dept.deptName
                    }
                }
                    , {field: 'createTime', title: '创建时间'}
                    , {field: 'updateBy', title: '修改人',  hide: true}
                    , {field: 'updateTime', title: '修改时间',  hide: true}
                    , {field: 'remark', title: '备注', hide: true}
                    , {title: '操作', width: 235, toolbar: '#barDemo'}
                ]]
        });
        //监听头工具栏事件
        table.on('toolbar(userTable)', function (obj) {
            var checkStatus = table.checkStatus(obj.config.id)
                , data = checkStatus.data; //获取选中的数据
            switch (obj.event) {
                case 'addUser':
                    layer.open({
                        title: '添加员工',
                        type: 1,
                        content: $('#save_user_form'),
                        area: ['700px', '530px']
                    });
                    break;
                case 'update':
                    if (data.length === 0) {
                        layer.msg('请选择一行');
                    } else if (data.length > 1) {
                        layer.msg('只能同时编辑一个');
                    } else {
                        layer.alert('编辑 [id]:' + checkStatus.data[0].id);
                    }
                    break;
                case 'deleteBatch':
                    if (data.length === 0) {
                        layer.msg('请选择一行');
                    } else {
                        //对于删除或者是其他敏感操作,一定要让用户确认。
                        layer.confirm('确定要删除吗?', function () {
                            //请求后台批量删除接口
                            $.ajax({
                                url: '/user/deleteBatchUser',
                                dataType: 'json',
                                contentType: "application/json;charset=UTF-8",
                                type: 'POST',
                                data: JSON.stringify(data),//将js对象转成json串传入到后台
                                success: function (result) {
                                    layer.closeAll();//关闭对话框
                                    layer.msg(result.msg);
                                    myTable.reload();//重新加载表格数据
                                }
                            })

                        })

                    }
                    break;
            }
            ;
        });

        //监听保存用户表单的提交
        form.on('submit(formDemo)', function (data) {
            data.field.status = data.field.status ? 0 : 1;
            var checkeds = selectCheckeds("role");
            //盐值在添加的时候没有用处,所以将角色信息放入到盐值中传入后端
            data.field.salt = checkeds;
            console.log(checkeds);
            $.ajax({
                url: '/user/saveUser',
                dataType: 'json',
                type: 'POST',
                data: data.field,
                success: function (result) {
                    layer.closeAll();//关闭对话框
                    layer.msg(result.msg);
                    myTable.reload();//重新加载表格数据
                }
            })
            return false;
        });
        //监听修改用户表单的提交
        form.on('submit(formUpdateUser)', function (data) {
            data.field.status = data.field.status ? 0 : 1;
            var checkeds = selectCheckeds();
            //盐值在添加的时候没有用处,所以将角色信息放入到盐值中传入后端
            data.field.salt = checkeds;
            $.ajax({
                url: '/user/updateUser',
                dataType: 'json',
                type: 'POST',
                data: data.field,
                success: function (result) {
                    layer.closeAll();//关闭对话框
                    layer.msg(result.msg);
                    myTable.reload();//重新加载表格数据
                }
            })
            return false;
        });
        //登录名校验
        $("#loginName").blur(function () {
            var node = this;
            console.log(node)
            $.ajax({
                type: "POST",
                url: "/user/checkUserName",
                async: false, //改为同步请求
                data: {username: node.value},
                dataType: 'json',
                success: function (data) {
                    if (data.code == 0) {
                    } else {
                        node.focus();
                        layer.msg(data.msg, {icon: 5});
                    }
                }
            });
        });

        // 获取选中复选框项
        function selectCheckeds(name) {
            var checkeds = "";
            // 保存用户
            if (name != null) {
                $('input:checkbox[name="' + name + '"]:checked').each(function (i) {
                    if (0 == i) {
                        checkeds = $(this).val();
                    } else {
                        checkeds += ("," + $(this).val());
                    }
                });
            //修改用户
            } else {
                $('.role_check:checked').each(function (i) {
                    if (0 == i) {
                        checkeds = $(this).val();
                    } else {
                        checkeds += ("," + $(this).val());
                    }
                });
            }

            return checkeds;
        }

        //监听查询表单的提交事件
        form.on('submit(search_filter)', function (data) {
            var formData = data.field;
            //数据表格重载
            table.reload('tableReload', {
                page: {
                    curr: 1 //重新从第 1 页开始
                }
                , where: {//这里传参  向后台
                    searchLoginName: formData.searchLoginName,
                    searchUserName: formData.searchUserName,
                    searchPhonenumber: formData.searchPhonenumber
                }
            });
            return false;//false:阻止表单跳转  true:表单跳转
        });
        //监听重置密码表单的提交事件
        form.on('submit(formResetPassword-flter)', function (data) {
            $.ajax({
                url: '/user/resetPassword',
                dataType: 'json',
                type: 'POST',
                data: data.field,
                success: function (result) {
                    layer.closeAll();//关闭对话框
                    layer.msg(result.msg);
                }
            })
            return false;
        });
        //监听行工具事件
        table.on('tool(userTable)', function (obj) { //注:tool 是工具条事件名,userTable 是 table 原始容器的属性 lay-filter="对应的值"
            var data = obj.data //获得当前行数据
            var layEvent = obj.event; //获得 lay-event 对应的值
            if (layEvent === 'detail') {
                layer.msg('查看操作');
            } else if (layEvent === 'delete') {
                layer.confirm('真的删除行么', function (index) {
                    /*  obj.del(); //删除对应行(tr)的DOM结构
                      layer.close(index);*/
                    //向服务端发送删除指令
                    console.log(data);
                    $.ajax({
                        url: '/user/deleteUser',
                        dataType: 'json',
                        type: 'POST',
                        data: {userId: data.userId},
                        success: function (result) {
                            layer.closeAll();//关闭对话框
                            layer.msg(result.msg);
                            myTable.reload();//重新加载表格数据
                        }
                    })
                });
            }  else if (layEvent === 'resetPassword') {
                form.val('reset_password_form', {
                    "userId": data.userId});
                layer.open({
                    title: '重置密码',
                    type: 1,
                    content: $('#reset_password_form'),
                    area: ['400px', '150px']
                });
            } else if (layEvent === 'edit') {

                //将修改前的数据赋值给修改表单
                form.val('update_user_form', {
                    "userId": data.userId
                    , "loginName": data.loginName // "name": "value"
                    , "password": data.orderNum
                    , "userName": data.userName
                    , "email": data.email
                    , "phonenumber": data.phonenumber
                    , "deptId": data.deptId
                    , "status": data.status == 0 ? true : false //开关状态
                    , "sex": data.sex
                    , "remark": data.remark

                });
                //设置checkbox回显
                $.ajax({
                    url: '/user/getRoleCheckByUserId',
                    dataType: 'json',
                    type: 'POST',
                    data: {userId: data.userId},
                    success: function (result) {
                        console.log(result.data)
                        form.val('update_user_form', result.data);
                    }
                });
                layer.open({
                    title: '编辑用户',
                    type: 1,
                    content: $('#update_user_form'),
                    area: ['500px', '480px']
                });
            }
        });
        //点击重置按钮,清除查询关键字,并且重新加载表格数据
        $("#search_reset").on("click",function () {
            $("#searchLoginName").val=null;
            $("#searchUserName").val=null;
            $("#searchPhonenumber").val=null;
            myTable.reload();//重新加载表格数据
        })
    });
</script>
</html>

 application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/teacher?characterEncoding=utf-8&useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
#spring.datasource.password=203786
spring.datasource.password=123456
#mybatis.mapper-locations=classpath:mapper/*.xml
mybatis-plus.mapper-locations=classpath:mapper/*.xml
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

#\u65E5\u5FD7 debug info warn error feta
logging.level.com.aaa.dao=debug
#\u5F00\u542Fmybatisplus\u7684\u4E8C\u7EA7\u7F13\u5B58
#mybatis-plus.configuration.cache-enabled=true
#redis\u670D\u52A1\u5668\u7684IP\u5730\u5740
spring.redis.host=192.168.11.100
#redis\u7684\u7AEF\u53E3\u53F7
##spring.redis.port=6379



spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB

 

posted @ 2020-08-18 19:38  白描先生  阅读(306)  评论(0编辑  收藏  举报
}); });