基于SSM 和 layui 的增删查改

2023-11-18

开发工具: IDEA 2021 WebStorm 2021 Mysql 8.0
开发环境:JDK 8 TomCat 8.5.81 apache-maven-3.6.1
技术点:Spring + SpringMVC + Mybatis + Mysql + Html + layui + jquery

一、后端

前提条件:配置好 maven

链接:maven配置

  1. 基础环境搭建

1、导入依赖

打包方式 war

 <groupId>com.demo.ssm</groupId>
    <artifactId>ssm</artifactId>
    <packaging>war</packaging>
<properties>
    <spring.version>5.3.23</spring.version>
</properties>
<!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- mvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.7</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.1</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.4.2</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring5</artifactId>
            <version>3.0.15.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

②添加web模块

网址:TomCat

③配置TomCat

TomCat Server => Local

2、解决TomCat 乱码问题:-Dfile.encoding=UTF-8

3、配置web.xml

 <!--配置springMVC的编码过滤器-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 配置处理请求方式PUT和DELETE的过滤器 -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--自定义Spring配置文件的位置和名称-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
        <init-param>
            <!-- contextConfigLocation为固定值 -->
            <param-name>contextConfigLocation</param-name>
            <!-- 使用classpath:表示从类路径查找配置文件,
            例如maven工程中的src/main/resources -->
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <!--
            作为框架的核心组件,在启动过程中有大量的初始化操作要做
            而这些操作放在第一次请求时才执行会严重影响访问速度
            因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时
        -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--
            设置springMVC的核心控制器所能处理的请求的请求路径
            /所匹配的请求可以是/login或.html或.js或.css方式的请求路径
            但是/不能匹配.jsp请求路径的请求
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 整个web容器的动向由这个监听器进行监听. 这个监听器可以监听项目的启动. 从而直接加载核心配置文件 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

4、配置SpringMVC配置文件

<!--    扫描组件-->
    <context:component-scan base-package="com.demo.ssm.controller"/>
    <!-- 配置Thymeleaf视图解析器 -->
    <bean id="viewResolver"
          class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
    <!-- 配置访问首页的视图控制 -->
    <mvc:view-controller path="/" view-name="index"/>
    <!-- 配置默认的servlet处理静态资源 -->
    <mvc:default-servlet-handler />
    <!-- 开启MVC的注解驱动 -->
    <mvc:annotation-driven />

5、搭建MyBatis环境

①创建属性文件jdbc.properties

#驱动名
jdbc.driver=com.mysql.cj.jdbc.Driver
#url
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC&characterEncoding=UTF-8
#用户名
jdbc.username=root
#密码
jdbc.password=123456

②创建MyBatis的核心配置文件mybatis-config.xml

<configuration>
    <!--
    properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,
    objectWrapperFactory?,reflectorFactory?,plugins?,environments?,
    databaseIdProvider?,mappers?-->
    <!--将下划线_映射为驼峰    -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <plugins>
        <!--配置分页插件-->
        <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>
</configuration>

6、创建日志文件log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n"/>
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

7、创建Spring的配置文件并配置 applicationContext.xml

    <!--扫描组件-->
    <context:component-scan base-package="com.demo.ssm">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 引入jdbc.properties -->
    <context:property-placeholder location="classpath:mysql.properties"/>
    <!-- 配置Druid数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!-- 配置用于创建SqlSessionFactory的工厂bean  ==> mybatis核心配置文件的读取 -->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 设置MyBatis配置文件的路径(可以不设置) -->
        <property name="configLocation" value="classpath:mybatis-config.xml">
        </property>
        <property name="mapperLocations" value="classpath:com/demo/ssm/mapper/*.xml"/>
        <!-- 设置数据源 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 设置类型别名所对应的包 -->
        <property name="typeAliasesPackage" value="com.demo.ssm.pojo">
        </property>
    </bean>

    <!-- 开启基于注解的Aop-->
    <aop:aspectj-autoproxy/>
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--
    开启事务的注解驱动
    通过注解@Transactional所标识的方法或标识的类中所有的方法,都会被事务管理器管理事务
    -->
    <!-- transaction-manager属性的默认值是transactionManager,
    如果事务管理器bean的id正好就是这个默认值,则可以省略这个属性 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

    <!--
    配置mapper接口的扫描配置
    由mybatis-spring提供,可以将指定包下所有的mapper接口创建动态代理
    并将这些动态代理作为IOC容器的bean管理
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.demo.ssm.mapper"/>
    </bean>

8、数据库字段

CREATE TABLE `user`  (
  `user_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户id',
  `user_section` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '部门 市场部...',
  `card_no` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '身份证好',
  `user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
  `user_sex` int NULL DEFAULT NULL COMMENT '性别',
  `user_age` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '年龄',
  `user_role` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '角色 产品经理...',
  PRIMARY KEY (`user_id`) USING BTREE,
  INDEX `user_section`(`user_section` ASC) USING BTREE,
  CONSTRAINT `section` FOREIGN KEY (`user_section`) REFERENCES `user_section` (`user_section`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES ('556715', '研发部', '3432423', '高启胜', 1, '33', '技术研发');
INSERT INTO `user` VALUES ('556764', '后勤', '13123123123', '曹孟德', 1, '44', '卫生清洁');
INSERT INTO `user` VALUES ('556768', '财务', '2019212', '高启强', 1, '33', '老板');
INSERT INTO `user` VALUES ('556775', '市场部', '12312521', '胡佳玉', 0, '24', '产品维护');
INSERT INTO `user` VALUES ('556787', '财务', '1631263712', '老6', 1, '66', '会计');
INSERT INTO `user` VALUES ('556790', '研发部', '1312312', '花花', 1, '34', '技术研发');

SET FOREIGN_KEY_CHECKS = 1;
CREATE TABLE `user_section`  (
  `user_section` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '部门',
  INDEX `section`(`user_section` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

INSERT INTO `user_section` VALUES ('后勤');
INSERT INTO `user_section` VALUES ('售后服务');
INSERT INTO `user_section` VALUES ('市场部');
INSERT INTO `user_section` VALUES ('研发部');
INSERT INTO `user_section` VALUES ('财务');
INSERT INTO `user_section` VALUES ('销售');

SET FOREIGN_KEY_CHECKS = 1;

2、后端代码

  1. 目录结构

注意:resources 下的目录创建方式不是 . 是com/demo/ssm/mapper

2.1、代码

2.1、pojo 实体类

@Data
public class User {

  private String userId;//用户id
  private String userSection;//部门
  private String cardNo;//身份证号
  private String userName;//用户姓名
  private String userSex;//用户性别
  private String userAge;//用户年龄
  private String userRole;//用户角色

}

@Data
public class UserSection {

  private String userSection;

}

2.2、Controller层

@Controller
@RequestMapping(path = "/user")
@CrossOrigin  // 解决跨域问题
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/queryUserPage")
    @ResponseBody
    public Result getStudents(String page, String limit, String userName) {
        Result result = new Result();
        Map<String, Object> params = new HashMap<>();
        params.put("pageNum", page);
        params.put("pageSize", limit);
        params.put("userName", userName);
        result = userService.getUserList(params);
        return  result;
    }

    @RequestMapping("/createUser")
    @ResponseBody
    public Result createUser(User user) {
        Random random = new Random();
        Integer number = random.nextInt(100);
        user.setUserId( 5567 + String.valueOf(number));
        return userService.createUser(user);
    }

    @RequestMapping(value = "/deleteUserByIdList",method = RequestMethod.POST)
    @ResponseBody
    public Result deleteUserByIdList(String userId) {
        List userIds = new ArrayList();
        for (String userIdStr : userId.split(",")) {
            userIds.add(userIdStr.trim());
        }
     return userService.deleteUserByIdList(userIds);
    }

    @RequestMapping("/updateUserById")
    @ResponseBody
    public Result updateUserById(User user) {
        return userService.updateUserById(user);
    }

    @RequestMapping("/selectSection")
    @ResponseBody
    public Result selectSection(){
        return userService.selectSection();
    }
}

2.2、service层

public interface UserService {
    /**
     * 分页查询 User
     */
    Result getUserList(Map<String, Object> params);

    /**
     * 下拉框 部门 userSection
     * @return userSection
     */
    Result selectSection();

    /**
     * 添加 User
     * @param user
     * @return 返回码
     */
    Result createUser(User user);

    /**
     * 根据 userId 批量删除用户
     * @param userIds
     * @return
     */
    Result deleteUserByIdList(@Param("list") List userIds);

    /**
     * 根据 userId 更新用户
     * @return 返回码
     */
    Result updateUserById(User user);

}

2.3、vo层 状态码

@Data
public class Result {
    private Integer status;
    private String msg;
    private long count;
    private Object data;
}

2.4、serviceImpl层

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Transactional(readOnly = true)
    @Override
    public Result getUserList(Map<String, Object> params) {
        Result result = new Result();
        PageHelper.startPage(params);
        List<User> students = userMapper.getUserList(params);
        PageInfo info = new PageInfo(students);
        result.setStatus(0);//数据表格状态码成功 0(特殊)
        result.setMsg("查询成功");
        result.setCount(info.getTotal());
        result.setData(info.getList());
        return result;
    }
    @Transactional
    @Override
    public Result selectSection() {
        Result result = new Result();
        List<UserSection>sections = userMapper.selectSection();
        result.setData(sections);
        result.setStatus(1);
        result.setMsg("成功获取 部门信息");
        return result;
    }
    @Transactional
    @Override
    public Result createUser(User user) {
        Result result = new Result();
        int i = userMapper.createUser(user);
        if (1==i){
            result.setStatus(1);
            result.setMsg("添加成功");
        }
        return result;
    }
    @Transactional
    @Override
    public Result deleteUserByIdList(List userIds) {
        Result result = new Result();
        int i = userMapper.deleteUserByIdList(userIds);
        result.setData(i);
        result.setStatus(1);
        result.setMsg("删除成功");
        return result;
    }

    @Transactional
    @Override
    public Result updateUserById(User user) {
        Result result = new Result();
         int i= userMapper.updateUserById(user);
        result.setStatus(1);
        result.setMsg("更新成功");
        result.setData(i);
        return result;
    }
}

2.5、mapper层

@Mapper
public interface UserMapper {
    /**
     * 分页查询 User
     * @return List<User>
     */
    List<User> getUserList(Map<String, Object> params);

    /**
     * 添加 User
     * @param user
     * @return 返回码
     */
    Integer createUser(User user);


    /**
     * 根据 userId 批量删除用户
     * @param userIds
     * @return
     */
    Integer deleteUserByIdList(@Param("list") List userIds);

    /**
     * 根据 userId 更新用户
     * @return 返回码
     */
    Integer updateUserById(User user);

    /**
     * 下拉框 userSection
     * @return
     */
    List<UserSection> selectSection();
}

2.6、mapper映射文件

<!-- namespace :接口全定向名-->
<mapper namespace="com.demo.ssm.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.demo.ssm.pojo.User" >
        <id property="userId" column="user_id" jdbcType="VARCHAR" /><!--用户id-->
        <result property="userSection" column="user_section" jdbcType="VARCHAR" /><!--部门-->
        <result property="cardNo" column="card_no" jdbcType="VARCHAR" /><!--证件号码-->
        <result property="userName" column="user_name" jdbcType="VARCHAR" /><!--用户姓名-->
        <result property="userSex" column="user_sex" jdbcType="VARCHAR" /><!--用户性别-->
        <result property="userAge" column="user_age" jdbcType="VARCHAR" /><!--用户年龄-->
        <result property="userRole" column="user_role" jdbcType="VARCHAR" /><!--用户角色-->
    </resultMap>

    <sql id="Base_Column_List" >
        user_id, user_section, card_no, user_name, user_sex, user_age, user_role
    </sql>

    <select id="selectSection" resultMap="BaseResultMap" resultType="userSection">
        select user_section from user_section
    </select>

    <!--分页查询用户-->
    <select id="getUserList" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        select
        <include refid="Base_Column_List" />
        from user
    <where>
        <if test="userName !=null and userName != ''">
            user_name like '%${userName}%'
        </if>
    </where>
    </select>

    <!--添加用户信息-->
    <insert id="createUser" parameterType="com.demo.ssm.pojo.User" >
        insert into User(<include refid="Base_Column_List" />)
        values(#{userId}, #{userSection}, #{cardNo}, #{userName}, #{userSex}, #{userAge}, #{userRole})
    </insert>

    <!--根据 user_id 批量删除用户-->
    <delete id="deleteUserByIdList" parameterType="java.util.List">
        delete from user where user_id in <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">#{item,jdbcType=VARCHAR}</foreach>
    </delete>

    <!--根据 user_id 更新用户信息-->
    <update id="updateUserById" parameterType="com.demo.ssm.pojo.User" >
        update user
        <set >
            <if test="cardNo != null" >
                card_no = #{cardNo,jdbcType=VARCHAR},
            </if>
            <if test="userSection != null" >
                user_section = #{userSection,jdbcType=VARCHAR},
            </if>
            <if test="userName != null" >
                user_name = #{userName,jdbcType=VARCHAR},
            </if>
            <if test="userSex != null" >
                user_sex = #{userSex,jdbcType=VARCHAR},
            </if>
            <if test="userAge != null" >
                user_age = #{userAge,jdbcType=VARCHAR},
            </if>
            <if test="userRole != null" >
                user_role = #{userRole,jdbcType=VARCHAR}
            </if>
        </set>
        where 1 = 1
        and user_id = #{userId,jdbcType=VARCHAR}
    </update>
</mapper>

二、前端

3.1、资源:laui jquery-3.6.0.min.js

  1. 网址:layui

  1. 网址:jquery

jquery下载,复制下来自己保存为一个 jquery-3.6.0.min.js的文件

3.2、创建页面

1、index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>user_list</title>
  <link rel="stylesheet" href="./static/layui/css/layui.css">
  <script src="./static/jqury-3.6.0.min.js"></script>
<script src="./static/layui/layui.js"></script>
</head>
<body>
  <div id="box">
<!--原始容器-->
<script type="text/html" id="top">
    <div class="layui-inline">
        <input class="layui-input" name="userName" id="userName" autocomplete="off" placeholder="请输入姓名">
    </div>
    <button class="layui-btn layui-btn-sm" lay-event="search">查寻</button>
    <button class="layui-btn layui-btn-sm" lay-event="add">增加</button>
    <button class="layui-btn layui-btn-sm" lay-event="batch_delete">删除</button>
</script>
    <script type="text/html" id="sexTpl">
        {{#  if(d.userSex === '1'){ }}
        <span style="color: #ffb800;"><i class="fa fa-male" aria-hidden="true" style="color: #0c0c0c"></i>&nbsp;&nbsp;{{ '男' }}</span>
        {{#  } else if(d.userSex === '0'){ }}
        <span style="color: #F581B1;"><i class="fa fa-female" aria-hidden="true" style="color: #0c0c0c"></i>&nbsp;&nbsp;{{ '女' }}</span>
        {{#  }  }}
    </script>
    <script type="text/html" id="toolbarDemo">
        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
    </script>

    <table  id="user" lay-filter="test"></table>
</div>
<script>
    var userIdList= '';
    layui.use(['table', 'layer'], function () {
        var table = layui.table,
            layer = layui.layer,
            $ = layui.$;

        // 创建渲染实例
        table.render({
            elem: '#user'
            , url: 'http://localhost:8089/user/queryUserPage'   //数据接口
            , page: true   //开启分页
            ,toolbar: '#top'//开启头部工具栏 id
            ,defaultToolbar: ['filter', 'exports', 'print']
            , cols: [[   //表头
                {field: 'userId', title: 'ID', type: 'checkbox', align: 'center'}
                , {field: 'userSection', title: '部门', align: 'center'}
                , {field: 'cardNo', title: '身份证号', align: 'center'}
                , {field: 'userName', title: '姓名', align: 'center'}
                , {field: 'userSex', title: '性别', templet: '#sexTpl',width:70,align:'center'}
                , {field: 'userAge', title: '年龄', align: 'center'}
                , {field: 'userRole', title: '角色', align: 'center'}
                , {title: '操作', toolbar: '#toolbarDemo', align: 'center'}
            ]],parseData: function(res){ //res 即为原始返回的数据
                console.log(res);
                return {
                    "code": res.status, //解析接口状态
                    "msg": res.msg, //解析提示文本
                    "count": res.count, //解析数据长度
                    "data": res.data //解析数据列表
                };
            }
        });
        //头部工具栏
        table.on('toolbar(test)', function (obj) {
            switch (obj.event) {
                case 'search':
                    //先获得input框的值
                    var userName = $('#userName').val();
                    //重载表格
                    table.reload('user', {
                        where: {
                            'userName': userName,
                        }
                        , page: {
                            curr: 1//重新从第 1 页开始
                        }
                    });
                    break;
                case 'add':
                    layer.open({
                        type: 2,
                        title: '添加用户信息',
                        content: 'addPage.html',
                        area: ['500px', '400px']
                    });
                    break;
                case 'batch_delete':
                    //先获取到选中的行
                    var rowData = table.checkStatus('user').data;//'idTest' 即为基础参数 id 对应的值
                    console.log(rowData) //获取选中行的数据 可作为是否有选中行的条件
                    if (rowData.length == 0) {
                        layer.msg("未选择数据");
                        return;
                    }
                    layer.open({
                        content: '确认删除',
                        btn: '确认',
                        yes: function (index, layero) {
                            if(rowData.length > 0){
                                for(var  i in  rowData){
                                    userIdList += rowData[i].userId + ","
                                }
                                userIdList = userIdList.substring(0,userIdList.lastIndexOf(','))
                                console.log(userIdList)
                            }
                            $.ajax({
                                url:'http://localhost:8089/user/deleteUserByIdList',
                                type:'POST',
                                data: {'userId':userIdList},
                                dataType: 'json',
                                success: function (msg) {
                                    if (msg.status == 1) {
                                        layer.msg(msg.msg, {icon: 6, time: 900})
                                        table.reload('user')
                                    } else {
                                        layer.msg(msg.msg, {icon: 5, time: 900})
                                    }
                                }
                            })
                        }
                    });
                    break;
            }
        });
        //单元格事件
        table.on('tool(test)', function (obj) {
            //当前行的数据
            var data = obj.data;
            var layEvent = obj.event;
            if (layEvent === 'edit') {
                //拿到父页面该行的数据,将数据填充进子页面
                layer.open({
                    title: '修改用户信息',
                    type: 2,
                    content: 'updatePage.html',
                    area: ['500px', '400px'],
                    success: function (layero, index) {
                        var iframeWin = window[layero.find('iframe')[0]['name']];
                        //将父窗口拿到的值,填充进子窗口
                        iframeWin.layui.form.val('updateForm', {
                            'userId': data.userId,
                            'userSection':data.userSection,
                            'cardNo':data.cardNo,
                            'userName':data.userName,
                            'userSex':data.userSex,
                            'userAge':data.userAge,
                            'userRole':data.userRole   
                        });
                        iframeWin.layui.form.render();
                    }
                })
                return false;
            } else if (layEvent === 'del') {
                //拿到当前行的id
                userIdList = data.userId;
                $.ajax({
                    url: 'http://localhost:8089/user/deleteUserByIdList',
                    type: 'POST',
                    data: {'userId':userIdList},
                    dataType: 'json',
                    success: function (msg) {
                        if (msg.status == 1) {
                            layer.msg(msg.msg, {icon: 6, time: 900})
                            table.reload('user')
                        } else {
                            layer.msg(msg.msg, {icon: 5, time: 900})
                        }
                    }
                })
            }
        });
    });
</script>
</body>
</html>

2、addPage.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" type="text/css" href="./static/layui/css/layui.css">
    <script src="./static/layui/layui.js"></script>
    <script src="./static/jqury-3.6.0.min.js"></script>
</head>
<body>
<form class="layui-form">
    <div class="layui-form-item" style="width: 310px">
        <label class="layui-form-label">部门</label>
        <div class="layui-input-block">
            <select name="userSection" id="section" lay-verify="required">
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">证件号码</label>
        <div class="layui-input-block">
                            <!--校验身份证号:   required lay-verify="required|identity"-->
            <input type="text" style="width: 200px" name="cardNo" 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" style="width: 200px" 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-block">
            <input type="radio" name="userSex" value="1" title="男">
            <input type="radio" name="userSex" value="0" title="女" checked>
        </div>
    </div>
  <div class="layui-form-item">
        <label class="layui-form-label">年龄</label>
        <div class="layui-input-block">
            <input type="text" style="width: 200px" name="userAge" 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" style="width: 200px" name="userRole" 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="add">添加</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
<script>
    var sections = ''
    layui.use(['form', 'layer'], function () {
        var form = layui.form,
            layer = layui.layer,
            $ = layui.$;
        //拿到下拉框数据,从user_section表中,拿到 userSection
        $.ajax({
            url: 'http://localhost:8089/user/selectSection',
            type: 'POST',
            dataType: 'json',
            success: function (data) {
                // console.log(data.data)
                var option = '<option>部门</option>';
                var select = $('#section');
                sections = data.data;
                console.log(sections)
                for (var section of sections) {
                    // console.log(section.userSection)
                    option += '<option value="' + section.userSection + '">' + section.userSection + '</option>'
                }
                select.html(option);
                form.render('select')
            }
        });

        //监听表单并提交
        form.on('submit(add)', function (data) {
            $.ajax({
                url: 'http://localhost:8089/user/createUser',
                type: 'GET',
                data: data.field,
                dataType: 'json',
                success: function (data) {
                    if (data.status == 1) {
                        layer.msg(data.msg, {
                            icon: 1,
                            time:2000,
                        },function () {
                            //子页面拿到父页面的当前iframe层的索引,并关闭
                            var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
                            //子页面重载父页面
                            parent.layui.table.reload('user');
                            parent.layer.close(index); //再执行关闭
                        });
                    } else {
                        layer.msg(data.msg, {icon: 5})
                    }
                }
            })
            return false;
        });
    });
</script>
</body>
</html>

3、updatePage.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>更新</title>
    <link rel="stylesheet" type="text/css" href="./static/layui/css/layui.css">
    <script src="./static/layui/layui.js"></script>
    <script src="./static/jqury-3.6.0.min.js"></script>

</head>
<body>
<form class="layui-form" lay-filter="updateForm">
    <input type="hidden" name="userId">
    <div class="layui-form-item" style="width: 310px">
        <label class="layui-form-label">部门</label>
        <div class="layui-input-block">
            <select name="userSection" id="section" lay-verify="required">
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">身份证号</label>
        <div class="layui-input-block">
            <input type="text" style="width: 200px" name="cardNo" 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" style="width: 200px" 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-block">
            <input type="radio" name="userSex" value="1" title="男">
            <input type="radio" name="userSex" value="0" title="女" checked>
        </div>
    </div>
  <div class="layui-form-item">
        <label class="layui-form-label">年龄</label>
        <div class="layui-input-block">
            <input type="text" style="width: 200px" name="userAge" 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" style="width: 200px" name="userRole" 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="update">修改</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
<script>
    layui.use(['form', 'layer'], function () {
        var form = layui.form,
            layer = layui.layer,
            $ = layui.$;

        //拿到下拉框数据,从user_section表中,拿到 userSection
        $.ajax({
            url: 'http://localhost:8089/user/selectSection',
            type: 'POST',
            dataType: 'json',
            success: function (data) {
                console.log(data.data)
                var option = '<option>部门</option>';
                var select = $('#section');
                sections = data.data;
                // console.log(sections)
                for (var section of sections) {
                    // console.log(section.userSection)
                    option += '<option value="' + section.userSection + '">' + section.userSection + '</option>'
                }
                select.html(option);
                form.render('select')
            }
        });

        form.on('submit(update)', function (data) {
            $.ajax({
                url: 'http://localhost:8089/user/updateUserById',
                type:'GET',
                data: data.field,
                dataType: 'json',
                success: function (msg) {
                    if (msg.status == 1) {
                        layer.msg(
                            data.msg, {
                            icon: 1,
                            time:2000,
                        },function () {
                            //子页面拿到父页面的当前iframe层的索引,并关闭
                            var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
                            parent.layer.close(index); //再执行关闭
                            //子页面重载父页面
                            parent.layui.table.reload('user');
                        });
                    } else {
                        layer.msg(data.msg, {icon: 5})
                    }
                }
            })
            return false;
        });
    });
</script>
</body>
</html>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于SSM 和 layui 的增删查改 的相关文章

随机推荐

  • hive中如何取到每个顾客最新交易

    hive e use db select t advertId t exposureNum from select advertId exposureNum ROW NUMBER OVER PARTITION BY advertId ORD
  • 《计算机网络》——第四章知识点

    第四章思维导图如下 网络层向上只提供灵活的 无连接的 尽最大努力交付的数据报服务 主要任务是把分组 IP数据报 从通过路由选择与转发从源端传到目的端 为分组交换网上的不同主机提供通信服务 互联网可以由多种异构网络互连组成 IP数据包格式 I
  • 【突变检验方法二】MATLAB实现贝叶斯突变检测

    MATLAB实现贝叶斯突变检测 1 贝叶斯突变检测 2 原理 3 MATLAB相关代码 3 1 调用函数 3 2 案例 参考 另 其它语言实现贝叶斯突变检测 1 贝叶斯突变检测 贝叶斯突变检测属于概率突变检测方法 其特点是能给出突变点的概率
  • json数据如何存入到cookie中,如何获取

    1 引入相对应的cookie js插件如下 例如 button click function var username input name username val var password input name password val
  • scrapy爬虫爬取多网页内容

    摘要 此案例是爬取目标网站 https tipdm com 的新闻中心板块的公司新闻中所有新闻的标题 发布时间 访问量和新闻的文本内容 1 创建scrapy项目 我使用的是 Anaconda prompt 我们使用如下命令创建scrapy项
  • 视线估计、凝视目标估计相关评价指标

    1 TP TN FP FN qquad T F表示待分类目标的GT值 qquad P N表示预测到目标的正反例 在目标检测类任务中 qquad TP 表示正确检测到待检测目标
  • vcruntime140_1.dll丢失怎么办?vcruntime140_1.dll丢失最新解决方法

    如果您在使用某些软件或游戏时遇到了 vcruntime140 1 dll丢失 的错误提示 那么您需要采取一些措施来解决这个问题 以下三种解决方案都能解决vcruntime140 1 dll丢失问题 第一种解决方法 直接使用dll修复程序进行
  • C语言 mktime() gmtime()实现——亲测正确性

    前言 写此文章是因为有的嵌入式设备编程时不支持
  • node_modules安装及卸载

    1 安装 npm install 安装tb镜像 npm install g cnpm registry https registry npm taobao org 2 卸载 1 npm install rimraf g 2 rimraf n
  • Vue3 + Element-UI 搭建一个后台管理系统框架模板

    概述 本文将介绍如何基于Vue3和element ui搭建一个后台管理系统框架模板 我们将详细讲解代码流程 并提供详细的说明 技术栈 Vue3 Element ui Axios 前置知识 本文假设读者已经熟悉Vue3和Element ui的
  • Bootstrap插件(六)——警告框(alert.js)

    bootstrap中的alert和原本的alert弹框可不太一样 原来我们熟悉的弹框是在执行某个动作的时候 浏览器和我们弹出来的一个提示框 比如下面这样 而我们这里的警告框是在html内容之间的提示内容 只是他有着醒目的颜色 以此来达到提醒
  • h5标签上实现文字空格

    在vue项目中实现文字之间的空格 div class top p class groupLeader 组 xa0 xa0 xa0 长 span xxx span p p class standingGroupLeader 副组长 span
  • [YOLO专题-23]:YOLO V5 - ultralytics代码解析-网络子结构详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122369993 目录 第1章 网络总
  • [QT编程系列-2]:C++图形用户界面编程,QT框架快速入门培训 - 1- 预备知识

    目录 概述 1 前置条件 1 1 C 1 2 图形界面 1 3 图形程序集成开发环境 1 4 图形程序开发框架 1 5 跨平台特性 1 6 QT快速感知 1 6 1 QT的典型应用 1 6 2 QT的特点 1 6 3 QT跨平台集成开发环境
  • Qt QProcess

    目录 概述 实 现 一 函数接口 二 执行命令 三 管 道 概述 本文介绍 在Linux环境下 使用Qt中的QProcess类执行shell命令并获取输出 头文件 include
  • 区块链数字签名详解

    有一点比较难以理解的答案就是 私钥加密公钥可以解密 公钥加密私钥可以解密 RSA的原理 两个大质数 p q 乘积 n 难以逆向求解 所以pq是对等的 公钥和私钥也是对等的 区块链 从数字货币到信用社会 读书笔记 这张图来自于新生大学的周兵
  • 【Vue项目实战】Vue3动画神操作!教你如何实现PPT一样的动画效果!

    文章目录 前言 一 Animate css是什么 二 安装和使用 1 安装 2 基本用法 3 JavaScript用法 三 动画制作 1 弹入动画 总结 前言 最近写界面的时候 发现一个前端组件很好玩 他就是鼎鼎大名的 Animate cs
  • 海康工业摄像头调用(linux基于python和opencv)

    1 下载官网客户端 其中包含SDK 官方网站 海康机器人 机器视觉 下载中心 安装deb文件 sudo dpkg i deb文件名 2 运行客户端 cd opt MVS bin MVS sh 如果连不上 看看是不是usb3 0的接口 3 调
  • ThinkPHP 日志信息泄露漏洞复现

    ThinkPHP 日志信息泄露漏洞复现 漏洞简介 ThinkPHP在开启DEBUG的情况下会在Runtime目录下生成日志 而且debug很多网站都没有关 ThinkPHP默认安装后 也会在Runtime目录下生成日志 THINKPHP3
  • 基于SSM 和 layui 的增删查改

    开发工具 IDEA 2021 WebStorm 2021 Mysql 8 0 开发环境 JDK 8 TomCat 8 5 81 apache maven 3 6 1 技术点 Spring SpringMVC Mybatis Mysql Ht