一期项目实战:问卷调查—人事管理系统

导读:本篇文章讲解 一期项目实战:问卷调查—人事管理系统,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

项目功能框架:

在这里插入图片描述

项目前后台功能展示:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目整体框架:

在这里插入图片描述

配置、用户、部门、问卷主要代码部分:

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>questionnaire</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>questionnaire Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <servlet.version>4.0.1</servlet.version>
    <jsp.version>2.2</jsp.version>
    <jstl.version>1.2</jstl.version>
    <spring.version>5.3.14</spring.version>
    <commons-dbcp.version>1.4</commons-dbcp.version>
    <mybatis.version>3.4.6</mybatis.version>
    <mybatis-spring.version>1.3.3</mybatis-spring.version>
    <mysql-connector-java.version>8.0.11</mysql-connector-java.version>
    <fastjson.version>1.2.78</fastjson.version>
  </properties>
  <dependencies>
    <!--  添加javaEE支持  -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${servlet.version}</version>
      <!--  provided只在编译时支持,发布时不拷贝文件  -->
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>${jsp.version}</version>
      <!--  provided只在编译时支持,发布时不拷贝文件  -->
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>${jstl.version}</version>
    </dependency>
    <!-- 引入spring基础模块 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--dbcp连接池  -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>${commons-dbcp.version}</version>
    </dependency>
    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!--  mybatis spring整合  -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${mybatis-spring.version}</version>
    </dependency>
    <!-- mybatis插件PageHelper -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.0</version>
    </dependency>
    <!--通用mapper插件-->
     <dependency>
       <groupId>com.github.abel533</groupId>
       <artifactId>mapper</artifactId>
       <version>3.0.1</version>
     </dependency>
    <!--  mysql驱动类  -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql-connector-java.version}</version>
    </dependency>
    <!-- fastjson处理json数据 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>${fastjson.version}</version>
    </dependency>
    <!-- lombok 简化实体内容 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.11.2</version>
    </dependency>
    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.5.6</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.30</version>
    </dependency>
    <dependency>
      <groupId>com.github.xuwei-k</groupId>
      <artifactId>html2image</artifactId>
      <version>0.1.0</version>
    </dependency>

  </dependencies>
</project>


db.properties:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/proj_hr?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=123456

mybatis-config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 配置日志工具 -->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--配置将下划线字段转为小驼峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">

         </plugin>
        <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
            <!--主键自增回写方法,默认值MYSQL -->
            <property name="IDENTITY" value="MYSQL" />
            <!--通用Mapper默认接口 -->
            <property name="mappers" value="com.github.abel533.mapper.Mapper" />
        </plugin>
    </plugins>

</configuration>

spring-mvc.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--扫描包-->
    <context:component-scan base-package="com.que.controller"/>

    <!--开启注解驱动-->
    <mvc:annotation-driven>
        <!--配置时间转换器,将后台传到前台的日期数据格式化-->
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                        <property name="dateFormat">
                            <bean class="java.text.SimpleDateFormat">
                                <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
                            </bean>
                        </property>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/"/>
            <mvc:exclude-mapping path="/index.jsp"/>
            <mvc:exclude-mapping path="/toLogin"/>
            <mvc:exclude-mapping path="/user/loginSelect"/>
            <mvc:exclude-mapping path="/tester/toLogin"/>
            <mvc:exclude-mapping path="/tester/login"/>
            <mvc:exclude-mapping path="/tester/index"/>
            <mvc:exclude-mapping path="/tester/result"/>
            <mvc:exclude-mapping path="/tester/analyse"/>
            <mvc:exclude-mapping path="/tester/mailSend"/>
            <mvc:exclude-mapping path="/tester/insertResult"/>
            <mvc:exclude-mapping path="/question/query"/>
            <mvc:exclude-mapping path="/assets/**"/>
            <bean class="com.que.interceptor.LoginCheckInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    
    <!--防止静态资源被拦截-->
    <mvc:default-servlet-handler/>
</beans>

spring-mybatis.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--扫包-->
    <context:component-scan base-package="com.que.service"/>
    <!--配置数据库连接-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--配置数据库连接池-->
    <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <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>
    <!--配置MySQL的SQLsession对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--配置数据源-->
        <property name="dataSource" ref="ds"/>
        <!--配置类型别名-->
        <property name="typeAliasesPackage" value="com.que.entity"/>
        <!--配置mybatis主配置文件的路径,其内可以定义特定的配置-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--配置mapper文件路径-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!--配置mapper接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.que.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
</beans>

User :

package com.que.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

/*
 *@Auther jjk
 *@Date 2022/8/29*
 *@Description 用户表
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "tbl_user")
public class User {
    @Id
    @GeneratedValue(generator = "JDBC",strategy = GenerationType.IDENTITY)
    private Integer userId;
    private Integer deptId;
    private String loginName;
    private String userName;
    private String email;
    private String phonenumber;
    private String sex;
    private String avatar;
    private String password;
    private String salt;
    private String status;
    private String flag;
    private String createBy;
    private Date createTime;
    private String updateBy;
    private Date updateTime;
    private String remark;
}

Dept:

package com.que.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

/*
 *@Auther jjk
 *@Date 2022/8/29*
 *@Description 部门表
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "tbl_dept")
public class Dept {
    @Id
    private Integer deptId;
    private String deptName;
    private Integer orderNum;
    private String status;
    private String delFlag;
    private String createBy;
    private Date createTime;
    private String updateBy;
    private Date updateTime;
}

Questionnaire :

package com.que.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

/**
 * @Author sml
 * @Data 2022/8/29 11:54
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "tbl_questionnaire")
public class Questionnaire {
    @Id
    @GeneratedValue(generator = "JDBC",strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;
    private String anonymous;
    private String enabled;
    private String deleteFlag;
    private String createBy;
    private Date createTime;
    private String updateBy;
    private Date updateTime;
}

CommonResult:

package com.que.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/*
 *@Auther jjk
 *@Date 2022/8/29*
 *@Description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
    //编码:0成功,1失败
    private Integer code;
    //提示消息
    private String msg;
    //记录数
    private Integer count;
    //记录数据
    private Object data;

    //返回查询结果的成功信息:
    public static CommonResult success(Integer count, Object data){
        return new CommonResult(0,"success",count,data);
    }

    //返回增删改的成功信息
    public static CommonResult success(){
        return new CommonResult(0,"success",null,null);
    }

    //返回失败信息
    public static CommonResult fail(){
        return new CommonResult(1,"fail",null,null);
    }

}

UserMapper:

package com.que.mapper;

import com.github.abel533.mapper.Mapper;
import com.github.pagehelper.PageInfo;
import com.que.entity.User;
import com.que.entity.UserRole;
import org.apache.ibatis.annotations.Param;

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

public interface UserMapper extends Mapper<User> {
    //查询(条件)
    List<Map> listAll(@Param("userName") String userName,@Param("phonenumber")  String phonenumber); //注意:这里返回键值对列表,不适用一对一/多关联查询

    //登录查询
    User loginSelect(@Param("loginName") String loginName,@Param("password") String password);

    //修改密码(用户)
    int updatePassword();

    //插入(用户角色表)
    int insertRole(UserRole userRole);

    //修改(用户角色表)
    int updateRole(UserRole userRole);

    //删除(用户角色表)
    int deleteRole(Integer userId);

    //根据用户Id查询身份
    List selectCheckbox(Integer userId);

    //查用户名
    User selectLoginName(String loginName);
    //根据用户名查找用户数据
    User selectUserData(Integer userId);
}

DeptMapper :

package com.que.mapper;

import com.github.abel533.mapper.Mapper;
import com.que.entity.Dept;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface DeptMapper extends Mapper<Dept> {
    List<Dept> deptListAll();
    //条件查询
    List<Dept> deptListAll1(@Param("deptName") String deptName,@Param("creatBy") String creatBy,@Param("updateBy") String updateBy);

}

QuestionnaireMapper :

package com.que.mapper;

import com.que.entity.Questionnaire;
import com.github.abel533.mapper.Mapper;
import com.que.entity.QuestionnaireResult;
import org.apache.ibatis.annotations.Param;

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

/*
 *@Auther jjk
 *@Date 2022/9/2*
 *@Description
 */
public interface QuestionnaireMapper extends Mapper<Questionnaire> {
    List<Map> query(@Param("questionTitle")String questionTitle, @Param("createBy")String createBy);
    List<Map> getById(Integer id);
    int save(QuestionnaireResult q);
    int update(@Param("id")Integer id,@Param("enabled")String checked);
}

UserMapper.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.que.mapper.UserMapper">
    <!--用户和部门关联查询--> <!--定义键值对-->
    <select id="listAll" resultType="map"> <!--返回一个user对象(如果在user属性中定义的有dept对象,则用一对一)-->
        select
            u.user_id,u.login_name,u.user_name,u.email,u.phonenumber,u.sex,u.avatar,u.password,u.status,u.create_by,u.create_time,u.update_by,u.update_time,u.remark,
            d.dept_id,d.dept_name
        from tbl_user u
        join tbl_dept d
        on u.dept_id=d.dept_id
        <where>
                <if test="userName!=null and userName!='' ">
                    and user_name like concat('%',#{userName},'%')
                </if>
                <if test="phonenumber!=null and phonenumber!='' ">
                    and phonenumber like concat('%',#{phonenumber},'%')
                </if>
                and u.flag = 0
        </where>
    </select>

    <!--插入(角色角色表)-->
    <insert id="insertRole" >
        insert into tbl_user_role
        (user_id,role_id)
        values
        (#{userId},#{roleId})
    </insert>

    <!--删除(角色角色表)-->
    <delete id="deleteRole">
        delete from tbl_user_role
        where user_id=#{userId}
    </delete>

    <!--登陆查询-->
    <select id="loginSelect" resultType="com.que.entity.User">
        select * from tbl_user
        where login_name=#{loginName} and password=#{password}
    </select>

<!--    //根据用户Id查询身份-->
    <select id="selectCheckbox" resultType="int">
        select role_id from tbl_user_role
        where user_id=#{userId}
    </select>

<!--    //查用户名-->
    <select id="selectLoginName" resultType="user">
        select * from tbl_user
        where login_name=#{loginName}
    </select>

    <select id="selectUserData" resultType="user">
        select * from tbl_user where user_id=#{userId}
    </select>

</mapper>

DeptMapper.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.que.mapper.DeptMapper">
    <!--用户和部门关联查询--> <!--定义键值对-->
    <select id="deptListAll" resultType="map"> <!--返回一个user对象(如果在user属性中定义的有dept对象,则用一对一)-->
        select * from tbl_dept
    </select>

    <select id="deptListAll1" resultType="dept">
        select * from tbl_dept
        <where>
            <if test="deptName!=null and deptName!='' ">
                and dept_name like concat('%',#{deptName},'%')
            </if>
            <if test="creatBy!=null and creatBy!='' ">
                and create_by like concat('%',#{creatBy},'%')
            </if>
            <if test="updateBy!=null and updateBy!='' ">
                and update_by like concat('%',#{updateBy},'%')
            </if>
        </where>
    </select>

</mapper>

QuestionnaireMapper.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.que.mapper.QuestionnaireMapper">
    <insert id="save" parameterType="com.que.entity.QuestionnaireResult">
        insert into tbl_questionnaire_result
            (id,user_id,details_id,answer)
            value
            (default,#{userId},#{detailsId},#{answer})
    </insert>
    <update id="update">
        update tbl_questionnaire set
                enabled = #{enabled}
        where id = #{id}
    </update>

    <select id="query" resultType="map">
        select qn.*,count(qd.id) detailsCount,x.userCount
        from tbl_questionnaire qn
        left join  tbl_questionnaire_details qd
        on qn.id=qd.questionnaire_id
        join
        (
        SELECT qn.id,count(qu.id) userCount
        FROM tbl_questionnaire qn
        LEFT JOIN tbl_questionnaire_user qu
        on qu.questionnaire_id = qn.id
        GROUP BY qn.id
        ) x
        on qn.id=x.id
        <where>
            <if test="questionTitle != null and questionTitle != ''">
                and qn.title like concat('%',#{questionTitle},'%')
            </if>
            <if test="createBy != null and createBy != ''">
                and qn.create_by like concat('%',#{createBy},'%')
            </if>
            and qn.delete_flag = 0
        </where>
        group by qn.id
    </select>

    <select id="getById" resultType="Map">
        select id,title
        from tbl_questionnaire
        where id = #{id} and delete_flag = 0
    </select>

</mapper>

IUserService :

package com.que.service;

import com.github.pagehelper.PageInfo;
import com.que.entity.User;
import com.que.entity.UserRole;
import org.apache.ibatis.annotations.Param;

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

public interface IUserService {

    //按照条件分页查询用户列表
    PageInfo<Map> listAll(Integer page, Integer limit,String userName,String phonenumber); //动态sql

    //登录查询
    User loginSelect(String loginName, String password);

    //添加(用户表)
    int insertSelective(User user);
    //添加(用户角色表)
    int insertRole(UserRole userRole);

    //修改
    int update(User user);

    //删除(用户表)
    int delete(Integer userId);
    //删除(用户角色表)
    int deleteRole(Integer userId);

    //根据用户Id查询身份
    List selectCheckbox(Integer userId);

    //查用户名
    User selectLoginName(String loginName);

    //根据用户名查找用户数据
    User selectUserData(Integer userId);

}

IDeptService :

package com.que.service;

import com.github.pagehelper.PageInfo;
import com.que.entity.Dept;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface IDeptService {
    //查询(自定义实现)
    List<Dept> deptListAll();
    //按照条件分页查询部门列表(自定义实现)
    PageInfo<Dept> deptListAll1(Integer page, Integer limit, String deptName, String creatBy, String updateBy);
    //添加(mapper接口实现)
    int deptInsert(Dept dept);
    //修改(mapper接口实现)
    int deptUpdate(Dept dept);
    //删除(mapper接口实现)
    int deptDelete(Integer deptId);
}

IQuestionnaireService :

package com.que.service;

import com.que.entity.Questionnaire;
import com.que.entity.QuestionnaireResult;
import com.que.entity.QuestionnaireUser;
import com.que.entity.Tester;

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

/*
 *@Auther jjk
 *@Date 2022/9/2*
 *@Description
 */
public interface IQuestionnaireService {

    List<Map> findAll(String questionTitle,String createBy);

    //插入
    int questionnaireInsert(Questionnaire questionnaire);

    //修改
    int questionnaireUpdate(Questionnaire questionnaire);

    //根据问卷id查询问卷
    Questionnaire findById(Integer id);

    int save(QuestionnaireResult q);
    //删除
    int questionnaireDelete(Integer id);

    List<Map> getById(Integer id);

    int updateEnabled(Integer id,String checked);
}

UserServiceImpl :

package com.que.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.que.entity.User;
import com.que.entity.UserRole;
import com.que.mapper.UserMapper;
import com.que.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public PageInfo<Map> listAll(Integer page, Integer limit, String userName, String phonenumber) {
        System.out.println(page);
        System.out.println(limit);
        //使用分页插件,完成带条件的分页查询
        PageHelper.startPage(page,limit);
        //查询数据
        List<Map> userList= userMapper.listAll(userName,phonenumber);
        System.out.println(userList);
        //构建分页数据
        PageInfo<Map> pi=new PageInfo<>(userList);
        return pi;
    }

    @Override
    public User loginSelect(String loginName, String password) {
        return userMapper.loginSelect(loginName, password);
    }

    //插入(用户表)
    @Override
    public int insertSelective(User user) {
        return userMapper.insertSelective(user); //选择性插入
        //return userMapper.insert(user); //全部插入
    }
    //插入(用户角色表)
    @Override
    public int insertRole(UserRole userRole) {
        return userMapper.insertRole(userRole);
    }

    //修改
    @Override
    public int update(User user) {
//        return userMapper.updateByPrimaryKey(user);
        return userMapper.updateByPrimaryKeySelective(user);
    }

    //删除(用户表)
    @Override
    public int delete(Integer userId) {
        return userMapper.deleteByPrimaryKey(userId);
    }

    @Override
    public int deleteRole(Integer userId) {
        return userMapper.deleteRole(userId);
    }

    @Override
    public List selectCheckbox(Integer userId) {
        return userMapper.selectCheckbox(userId);
    }

    @Override
    public User selectLoginName(String loginName) {
        return userMapper.selectLoginName(loginName);
    }

    @Override
    public User selectUserData(Integer userId) {
        return userMapper.selectUserData(userId);
    }
}

DeptServiceImpl :

package com.que.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.que.entity.Dept;
import com.que.mapper.DeptMapper;
import com.que.service.IDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DeptServiceImpl implements IDeptService {
    @Autowired
    private DeptMapper deptMapper;

    @Override
    public List<Dept> deptListAll() {
        return deptMapper.deptListAll();
    }

    @Override
    public PageInfo<Dept> deptListAll1(Integer page, Integer limit,String deptName, String creatBy, String updateBy) {
        System.out.println("page:"+page);
        System.out.println("limit:"+limit);
        //使用分页插件,完成带条件的分页查询
        PageHelper.startPage(page,limit);
        //查询数据
        List<Dept> deptList=deptMapper.deptListAll1(deptName,creatBy,updateBy);
        System.out.println("deptList1:"+deptList);
        //构建分页数据
        PageInfo<Dept> pageInfo=new PageInfo<>(deptList);
        return pageInfo;
    }

    @Override
    public int deptInsert(Dept dept) {
        return deptMapper.insertSelective(dept);
    }

    @Override
    public int deptUpdate(Dept dept) {
        return deptMapper.updateByPrimaryKeySelective(dept);
    }

    @Override
    public int deptDelete(Integer deptId) {
        return deptMapper.deleteByPrimaryKey(deptId);
    }

}

UserController :

package com.que.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.que.entity.CommonResult;
import com.que.entity.User;
import com.que.entity.UserRole;
import com.que.service.IUserService;
import com.que.utils.Md5;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private IUserService iUserService; //接口

    //查询1
    @RequestMapping("/listAll1")
    public CommonResult listAll1(Integer page, Integer limit, String userName, String phonenumber){
        System.out.println("======listAll1========");
        PageInfo pageInfo=iUserService.listAll(page,limit,userName,phonenumber);
        return CommonResult.success((int)pageInfo.getTotal(),pageInfo.getList());
        //这里的日期格式定义为全局  在spring-mvc.xml中<!-- 配置时间转换器 -->
    }

    //插入
    @RequestMapping("/insert")
    public int insert(@RequestParam("user") String jsonStr,HttpSession session){
        System.out.println(jsonStr);
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        //System.out.println((String) jsonObject.get("login_name"));
        //创建用户对象
        User user=new User();
        //这里不需要set id,插入用户表之后,通过自增主键直接user.get id即可
        //登录时间 未set
        user.setLoginName((String) jsonObject.get("login_name"));
        user.setUserName((String) jsonObject.get("user_name"));
        user.setEmail((String) jsonObject.get("email"));
        user.setPhonenumber((String) jsonObject.get("phonenumber"));
        user.setSex((String) jsonObject.get("sex"));
        //头像 未set
        user.setPassword(Md5.encode((String) jsonObject.get("password")));
        user.setStatus((String) jsonObject.get("status"));
        //System.out.println(jsonObject.get("deptId"));
        user.setDeptId(Integer.valueOf((String) jsonObject.get("dept_id")));
        user.setCreateBy(((User)session.getAttribute("user")).getLoginName());
        user.setUpdateBy(((User)session.getAttribute("user")).getLoginName());
        user.setCreateTime(new Date()); //创建时间
        user.setUpdateTime(new Date()); //修改时间
        //修改人 修改时间 未set 修改时再set
        user.setRemark((String) jsonObject.get("remark"));
        //插入(用户表)
        int iUS=iUserService.insertSelective(user);
        int iRS=0;
        int a=0;
        for (int i = 0; i < 3; i++) {
            if(jsonObject.get("roles"+i)==null){
                a++;
                continue;
            }
            Integer role = Integer.valueOf((String) jsonObject.get("roles"+i));
            UserRole userRole=new UserRole(user.getUserId(),role);
            //插入(用户角色表)
            int count=iUserService.insertRole(userRole);
            iRS=count+iRS;
        }
        //判断两次插入的次数
        if(iUS==1 && iRS==3-a){
            return 0;
        }else {
            return 1;
        }
    }

    //修改
    @RequestMapping("/update")
    public int update(@RequestParam("user") String jsonStr,HttpSession session){
        System.out.println("======update========");
        System.out.println(jsonStr);
        JSONObject jsonObject=JSONObject.parseObject(jsonStr);

        User user=new User();
        user.setUserId(Integer.valueOf((String) jsonObject.get("user_id")));
        user.setLoginName((String) jsonObject.get("login_name"));
        user.setUserName((String) jsonObject.get("user_name"));
        user.setEmail((String) jsonObject.get("email"));
        user.setPhonenumber((String) jsonObject.get("phonenumber"));
        user.setSex((String) jsonObject.get("sex"));
        //头像 未set
        //user.setPassword(Md5.encode((String) jsonObject.get("password")));
        user.setStatus((String) jsonObject.get("status"));
        user.setDeptId(Integer.valueOf((String) jsonObject.get("dept_id")));
        //创建人 未set
        user.setUpdateTime(new Date());
        user.setUpdateBy(((User)session.getAttribute("user")).getLoginName());
        user.setRemark((String) jsonObject.get("remark"));

        //修改(用户表)
        int iUS= iUserService.update(user);
        //删除(用户角色表)
        int Del=iUserService.deleteRole(user.getUserId());
        //插入(用户角色表)
        int iRS=0;
        int a=0;
        for (int i = 0; i < 3; i++) {
            if(jsonObject.get("roles"+i)==null){
                a++;
                continue;
            }
            Integer role = Integer.valueOf((String) jsonObject.get("roles"+i));
            UserRole userRole=new UserRole(user.getUserId(),role);
            //插入(用户角色表)
            int count=iUserService.insertRole(userRole);
            iRS=count+iRS;
        }

        //判断修改、插入、删除的次数
        if(iUS==1 && Del==1 && iRS==3-a){
            return 0;
        }else {
            return 1;
        }

    }

    //修改
    @RequestMapping("/passwordUpdate")
    public int passwordUpdate(@RequestParam("userPw") String jsonStr){
        System.out.println("======passwordUpdate========");
        System.out.println("jsonStr:"+jsonStr);
        JSONObject jsonObject=JSONObject.parseObject(jsonStr);

        User user=new User();
        user.setUserId(Integer.valueOf((String) jsonObject.get("user_id")));
        user.setPassword((String) jsonObject.get("password"));

        //修改(用户表)
        int iUS= iUserService.update(user);

        //判断修改的次数
        if(iUS==1){
            return 0;
        }else {
            return 1;
        }
    }

    //删除
    @RequestMapping("/delete")
    public CommonResult delete(@RequestParam("idList")String idList){
        System.out.println("======delete========");
        //System.out.println(idList);
        int count =0;
        //int count1=0;
        JSONArray jsonArray = JSONArray.parseArray(idList);
        System.out.println(jsonArray);
        for(int i=0;i<jsonArray.size();i++){
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            Integer userId = (Integer)jsonObject.get("userId");
            //count = iUserService.delete(userId);
            User user=new User();
            user.setUserId(userId);
            user.setFlag("2");
            count=iUserService.update(user);
            //count1=iUserService.deleteRole(userId);  //保留数据,不做删除
        }
       //return count==1&&count1==1?CommonResult.success():CommonResult.fail();
        return count==1?CommonResult.success():CommonResult.fail();
    }


    //登陆查询
    @RequestMapping("/loginSelect")
    public CommonResult loginSelect(String username,String password,HttpSession session){
        System.out.println(username+" ======================= "+password);
        User user1 = iUserService.selectLoginName(username);
        if(user1!=null){
            User user2 = iUserService.loginSelect(username,Md5.encode(password));
            if(user2!=null){
                session.setAttribute("user",user2);
                return new CommonResult(0,"success",null,user2);
            }
            else {
                return new CommonResult(1,"fail",null,null);
            }
        }
        return new CommonResult(2,"fail",null,null);
    }

    //根据用户Id查询身份权限
    @RequestMapping("/selectCheckbox")
    public List selectCheckbox(Integer userId){
        List selectCheckbox = iUserService.selectCheckbox(userId);
        return selectCheckbox;
    }

    @RequestMapping("/selectUserData")
    public User selectUserData(Integer userId){
        User user = iUserService.selectUserData(userId);
        return user;
    }

}

DeptController :

package com.que.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.que.entity.CommonResult;
import com.que.entity.Dept;
import com.que.entity.User;
import com.que.entity.UserRole;
import com.que.service.IDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/dept")
public class DeptController {
    @Autowired
    private IDeptService iDeptService;

    @RequestMapping("/deptListAll")
    public List<Dept> deptListAll(){
        return iDeptService.deptListAll();
    }

    @RequestMapping("/deptListAll1")
    public CommonResult deptListAll1(Integer page,Integer limit,String deptName, String creatBy, String updateBy){
        System.out.println("=====deptListAll1========");
        System.out.println("page:"+page);
        System.out.println("limit:"+limit);
        PageInfo pageInfo=iDeptService.deptListAll1(page,limit,deptName,creatBy,updateBy);
        System.out.println("pageInfo:"+pageInfo);
        return CommonResult.success((int) pageInfo.getTotal(),pageInfo.getList());
    }

    @RequestMapping("/deptInsert")
    public int insert(@RequestParam("dept") String jsonStr, HttpSession session){
        System.out.println("=====deptInsert========");
        System.out.println(jsonStr);
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        //System.out.println((String) jsonObject.get("loginName"));
        //创建用户对象
        Dept dept=new Dept();
        dept.setDeptName((String) jsonObject.get("deptName"));
        dept.setCreateBy(((User)session.getAttribute("user")).getLoginName());
        dept.setUpdateBy(((User)session.getAttribute("user")).getLoginName());
        dept.setOrderNum(Integer.valueOf((String) jsonObject.get("orderNum")));
        dept.setStatus((String) jsonObject.get("status"));
        //dept.setCreateBy((String) jsonObject.get("createBy"));
        dept.setCreateTime(new Date()); //创建时间
        dept.setUpdateTime(new Date()); //修改时间 修改时UpdateTime还会再次更新
        System.out.println(dept);
        //插入(用户表)
        int iDS=iDeptService.deptInsert(dept);

        if(iDS==1){
            return 0;
        }else {
            return 1;
        }
    }

    //修改
    @RequestMapping("/deptUpdate")
    public int update(@RequestParam("dept") String jsonStr,HttpSession session){
        System.out.println("======update========");
        System.out.println("jsonStr"+jsonStr);
        JSONObject jsonObject=JSONObject.parseObject(jsonStr);
        Dept dept=new Dept();
        dept.setDeptId(Integer.valueOf((String) jsonObject.get("deptId")));
        dept.setDeptName((String) jsonObject.get("deptName"));
        dept.setUpdateBy(((User)session.getAttribute("user")).getLoginName());
        dept.setOrderNum(Integer.valueOf((String) jsonObject.get("orderNum")));
        dept.setStatus((String) jsonObject.get("status"));
        //dept.setCreateBy((String) jsonObject.get("create_by"));
        dept.setUpdateTime(new Date()); //修改时间 修改时UpdateTime还会再次更新

        //修改(用户表)
        int iDS= iDeptService.deptUpdate(dept);

        //判断
        if(iDS==1){
            return 0;
        }else {
            return 1;
        }

    }

    //删除
    @RequestMapping("/deptDelete")
    public CommonResult delete(@RequestParam("idList")String idList){
        System.out.println("======deptDelete========");
        System.out.println("idList:::::"+idList);
        int count =0;
        JSONArray jsonArray = JSONArray.parseArray(idList);
        for(int i=0;i<jsonArray.size();i++){
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            Integer deptId = (Integer)jsonObject.get("deptId");
            Dept dept=new Dept();
            dept.setDeptId(deptId);
            dept.setDelFlag("2");
            //count = iUserService.delete(userId);
            //count=iDeptService.deptDelete(deptId);
            count=iDeptService.deptUpdate(dept);
        }
        return count==1?CommonResult.success():CommonResult.fail();
    }

}

QuestionnaireController :

package com.que.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.que.entity.*;
import com.que.service.IQuestionnaireDetailsService;
import com.que.service.IQuestionnaireService;
import com.que.service.IQuestionnaireUserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import java.util.Map;

/*
 *@Auther jjk
 *@Date 2022/9/2*
 *@Description
 */
@Controller
@RequestMapping("/questionnaire")
public class QuestionnaireController {

    @Resource
    private IQuestionnaireService questionnaireService;

    @Resource
    private IQuestionnaireDetailsService questionnaireDetailsService;

    @Resource
    private IQuestionnaireUserService questionnaireUserService;

    //查询
    @ResponseBody
    @RequestMapping("/query")
    public CommonResult query(Integer page,Integer limit,String questionTitle,String createBy){
        PageHelper.startPage(page,limit);
        List<Map> all = questionnaireService.findAll(questionTitle,createBy);
        PageInfo pageInfo = new PageInfo(all);
        System.out.println(pageInfo.getList());
        return CommonResult.success((int) pageInfo.getTotal(),pageInfo.getList());
    }

    //插入
    @ResponseBody
    @RequestMapping("/questionnaireInsert")
    public CommonResult questionnaireInsert(@RequestParam("questionnaire") String jsonStr, HttpSession session){
        System.out.println("=====questionnaireInsert========");
        System.out.println("jsonStr:"+jsonStr);
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        //创建用户对象
        User user = (User) session.getAttribute("user");
        Questionnaire questionnaire=new Questionnaire();
        questionnaire.setTitle((String) jsonObject.get("title"));
        questionnaire.setAnonymous((String) jsonObject.get("anonymous"));
        questionnaire.setCreateBy(user.getLoginName());
         questionnaire.setCreateTime(new Date());
        questionnaire.setUpdateBy(user.getLoginName());
        questionnaire.setUpdateTime(new Date());
        questionnaire.setEnabled("1");
        questionnaire.setDeleteFlag("0");

        System.out.println(questionnaire);
        //插入
        int qNS= questionnaireService.questionnaireInsert(questionnaire);
        System.out.println(qNS);
        return qNS==1?CommonResult.success():CommonResult.fail();
    }

    //修改
    @ResponseBody
    @RequestMapping("/questionnaireUpdate")
    public CommonResult questionnaireUpdate(@RequestParam("questionnaire") String jsonStr,HttpSession session){
        System.out.println("======questionnaireUpdate========");
        //System.out.println(jsonStr);
        JSONObject jsonObject=JSONObject.parseObject(jsonStr);
        Questionnaire questionnaire=new Questionnaire();
        questionnaire.setId(Integer.valueOf((String)jsonObject.get("id")));
        questionnaire.setTitle((String) jsonObject.get("title"));
        questionnaire.setAnonymous((String) jsonObject.get("anonymous"));
        questionnaire.setUpdateBy(((User)session.getAttribute("user")).getLoginName());
        questionnaire.setUpdateTime(new Date());
        //修改
        int qNS=questionnaireService.questionnaireUpdate(questionnaire);
        //判断修改、插入、删除的次数
        return qNS==1?CommonResult.success():CommonResult.fail();

    }

    //删除
    @ResponseBody
    @RequestMapping("/questionnaireDelete")
    public CommonResult questionnaireDelete(@RequestParam("idList") String idList){
        System.out.println("======questionnaireDelete========");
        //System.out.println(idList);
        int count =0;
        JSONArray jsonArray = JSONArray.parseArray(idList);
        for(int i=0;i<jsonArray.size();i++){
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            Integer questionnaireId = (Integer)jsonObject.get("id");
            Questionnaire questionnaire=new Questionnaire();
            questionnaire.setId(questionnaireId);
            questionnaire.setDeleteFlag("1");
            //count = iUserService.delete(userId);
            //这里是修改delete_flag的值 0存在 1删除
            count=questionnaireService.questionnaireUpdate(questionnaire);
        }
        return count==1?CommonResult.success():CommonResult.fail();
    }

    @ResponseBody
    @RequestMapping("/login")
    public CommonResult login(QuestionnaireUser questionnaireUser){
        System.out.println(questionnaireUser);
        //判断是否做过问卷
        QuestionnaireUser register = questionnaireUserService.findByPhone(questionnaireUser.getPhone(), questionnaireUser.getQuestionnaireId());
        //没做过
        if(register==null){
            questionnaireUser.setCreateTime(new Date());
            int count = questionnaireUserService.save(questionnaireUser);
            QuestionnaireUser q = questionnaireUserService.findByPhone(questionnaireUser.getPhone(), questionnaireUser.getQuestionnaireId());
            return count==1?CommonResult.success(count,q):CommonResult.fail();
        }else {
            int flag = questionnaireUserService.count(register.getId());
            return flag==0?CommonResult.success(1,register):CommonResult.success(0,register);
        }
    }
    @ResponseBody
    @RequestMapping("/insert")
    public CommonResult insertResult(@RequestParam("list") String jsonStr){
        JSONArray jsonArray = JSONArray.parseArray(jsonStr);
        int count = 0;
        for(int i=0;i<jsonArray.size();i++){
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            Integer userId = jsonObject.getInteger("userId");
            Integer detailsId = jsonObject.getInteger("detailsId");
            String answer = jsonObject.getString("answer");
            QuestionnaireResult qr = new QuestionnaireResult();
            qr.setUserId(userId);
            qr.setAnswer(answer);
            qr.setDetailsId(detailsId);
            count += questionnaireService.save(qr);
        }
        return count==jsonArray.size()?CommonResult.success():CommonResult.fail();
    }
    @ResponseBody
    @RequestMapping("/copyQuestionnaire")
    public CommonResult copyQuestionnaire(@RequestParam("questionnaire")String jsonStr){
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        Integer id = jsonObject.getInteger("id");
        String anonymous = jsonObject.getString("anonymous");
        String title = jsonObject.getString("title");
        Questionnaire q = questionnaireService.findById(id);

        q.setId(null);
        q.setTitle(title);
        q.setAnonymous(anonymous);
        int count = questionnaireService.questionnaireInsert(q);

        Integer qId = q.getId();
        List<QuestionnaireDetails> list = questionnaireDetailsService.getById(id);
        int num = 0;
        for(QuestionnaireDetails qd : list){
            qd.setId(null);
            qd.setQuestionnaireId(qId);
            num += questionnaireDetailsService.insert(qd);
        }
        return count==1&&num==list.size()?CommonResult.success():CommonResult.fail();
    }

    @ResponseBody
    @RequestMapping("/updataEnabled")
    public CommonResult updateEnabled(String id,String checked){
        Integer uid = Integer.valueOf(id);
        if("false".equals(checked)){
            checked = "0";
        }else {
            checked = "1";
        }
        System.out.println(uid+" "+checked);
        int count = questionnaireService.updateEnabled(uid,checked);
        return count==1?CommonResult.success():CommonResult.fail();
    }
}

ForwardController:

package com.que.controller;

import com.que.entity.*;
import com.que.service.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.que.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.ui.Model;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.*;


@Controller
public class ForwardController {

    @Resource
    private IRoleService roleService;
    @Resource
    private IMenuCollectionService menuCollectionService;
    @Resource
    private IQuestionnaireService questionnaireService;
    @Autowired
    private IQuestionnaireDetailsService service;


    //用户管理页面
    @Autowired
    private IQuestionService questionService;
    @Autowired
    private IQuestionnaireDetailsService detailsService;
    @Autowired
    private IQuestionnaireUserService questionnaireUserService;

    @RequestMapping("/user/toUser")
    public String user(){
        return "/admin/user";
    }
    //跳转到问题管理页面
    //题目管理
    @RequestMapping("/question/toShowQuestion")
    public String question(){
        return "/admin/question";
    }

    //
    @RequestMapping("/tester/toLogin")
    public String toLogin(){
        return "/tester/login";
    }
    //
    @RequestMapping("/tester/index")
    public String index(Integer testerId, Model model){
        model.addAttribute("testerId",testerId);
        return "/tester/test";
    }
    //测试管理
    //跳转到测试管理页面
    @RequestMapping("/tester/toShowTester")
    public String testerManage(){
        return "/admin/testerManage";
    }
    //跳转到报表统计页面
    //报表统计
    @RequestMapping("/test/toMyBigShow")
    public String dailyTestNumber(){
        return "/admin/charts";
    }

    //跳转到结果页
    @RequestMapping("/tester/result")
    public String testResult(Integer testerId,Model model){
        System.out.println(testerId);
        model.addAttribute("testerId",testerId);
        return "/tester/result";
    }

    //日志管理页面
    @RequestMapping("/log/toShowLog")
    public String toLog(){
        return "/admin/log";
    }

    //部门管理页面
    @RequestMapping("/dept/toDept")
    public String dept(){
        return "/admin/dept";
    }
    //问卷管理
    @RequestMapping("/questionnaire/toQuestionnaire")
    public String questionnaire(){
        return "/admin/questionnaire_manage";
    }

    @RequestMapping("/toLogin")
    public String login(){
        return "/admin/login";
    }
    @RequestMapping("/toHome")
    public String home(Integer userId,Model model){
        model.addAttribute("userId",userId);
        UserRole byUserId = roleService.findByUserId(userId);
        List<MenuTree> treeList = menuCollectionService.findById(byUserId.getRoleId());
        model.addAttribute("treeList",treeList);
        return "/admin/menu";
    }
    /**
     * 问卷管理-添加题目
     * @param id
     * @param model
     * @return
     */
    @RequestMapping("/toQuestionnaireDetails/{id}")
    public String toQuestionnaireDetails(@PathVariable("id") Integer id,Model model){
        model.addAttribute("id",id);
        return "/admin/questionnaireDetails";
    }

    //问卷预览页面
    @RequestMapping("/toQuestionnairePreview/{id}")
    public String toQuestionnairePreview(@PathVariable("id") Integer id, Model model){
        List<QuestionnaireDetails> tqd = detailsService.getById(id);
        List<Map> tq = questionnaireService.getById(id);
        model.addAttribute("tqd",tqd);
        model.addAttribute("tq",tq);
        return "/admin/questionnairePreview";
    }

    //问卷结果页面
    @RequestMapping("/toQuestionnaireResult/{id}")
    public String toQuestionnaireResult(@PathVariable("id") Integer id, Model model){
        List<QuestionnaireDetails> tqd = detailsService.getById(id);
        List<Map> tq = questionnaireService.getById(id);
        List<Map> tqu = questionnaireUserService.getByQid(id);
        model.addAttribute("tqd",tqd);
        model.addAttribute("tq",tq);
        model.addAttribute("tqu",tqu);
        return "/admin/questionnaireResult";
    }

    //用户管理页面
    @RequestMapping("/menu/toMenu")
    public String menu(){
        return "/admin/menu_manager";
    }

    //角色管理页面
    @RequestMapping("/role/toRole")
    public String role(){
        return "/admin/role";
    }

    //退出登录
    @RequestMapping("/user/logOut")
    public String logOut(HttpSession session){
        session.invalidate();
        return "/admin/login";
    }

    @RequestMapping("/questionnaire/login/{id}")
    public String toLogin(@PathVariable("id")Integer id,Model model){
        System.out.println(id);
        Questionnaire que = questionnaireService.findById(id);
        model.addAttribute("questionnaire",que);
        return "/tester/questionnaire_login";
    }

    @RequestMapping("/questionnaire/index")
    public String toIndex(Integer userId,Integer questionnaireId,Model model){
        System.out.println(userId+" "+questionnaireId);
        Questionnaire questionnaire = questionnaireService.findById(questionnaireId);
        PageHelper.startPage(1,20);
        List<QuestionnaireDetails> list = service.getById(questionnaireId);
        PageInfo pi = new PageInfo(list);
        model.addAttribute("userId",userId);
        model.addAttribute("questionnaire",questionnaire);
        model.addAttribute("questionList",pi);
        System.out.println(pi.getList());
        return "/tester/questionnaire_test";
    }

}

QuestionnaireServiceImpl :

package com.que.service.impl;

import com.que.entity.Questionnaire;
import com.que.entity.QuestionnaireResult;
import com.que.entity.QuestionnaireUser;
import com.que.mapper.QuestionnaireMapper;
import com.que.service.IQuestionnaireService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/*
 *@Auther jjk
 *@Date 2022/9/2*
 *@Description
 */
@Service
public class QuestionnaireServiceImpl implements IQuestionnaireService {

    @Resource
    private QuestionnaireMapper questionnaireMapper;

    @Override
    public List<Map> findAll(String questionTitle,String createBy) {
        return questionnaireMapper.query(questionTitle,createBy);
    }

    @Override
    public int questionnaireInsert(Questionnaire questionnaire) {
        return questionnaireMapper.insert(questionnaire);
    }

    @Override
    public int questionnaireUpdate(Questionnaire questionnaire) {
        return questionnaireMapper.updateByPrimaryKeySelective(questionnaire);
    }


    @Override
    public Questionnaire findById(Integer id) {
        return questionnaireMapper.selectByPrimaryKey(id);
    }

    @Override
    public int save(QuestionnaireResult q) {
        return questionnaireMapper.save(q);
    }

    @Override
    public int questionnaireDelete(Integer id) {
        return questionnaireMapper.deleteByPrimaryKey(id);
    }

    @Override
    public List<Map> getById(Integer id) {
        return questionnaireMapper.getById(id);
    }

    @Override
    public int updateEnabled(Integer id, String checked) {
        return questionnaireMapper.update(id,checked);
    }
}

user.jsp:

<%--
  Created by IntelliJ IDEA.
  User: 33154
  Date: 2022/8/29
  Time: 15:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>用户管理</title>
    <!-- 引入 layui.css -->
    <%--    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/assets/plugins/layui-v2.6.8/layui/css/layui.css?t=<%=Math.random()%>"/>--%>
    <!-- 引入 layui.css -->
    <link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css">
</head>
<body>

<form class="layui-form" action="" style="margin-top: 20px">
    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">真实姓名:</label>
            <div class="layui-input-inline">
                <input type="text" name="userName" placeholder="请输入姓名" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-inline">
            <label class="layui-form-label">手机号:</label>
            <div class="layui-input-inline">
                <input type="text" name="phonenumber" placeholder="请输入手机号" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-block">
                <button type="button" class="layui-btn" lay-submit lay-filter="formDemo">查询</button>
                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
            </div>
        </div>
    </div>
</form>

<!--要渲染的数据表格-->
<table id="user" lay-filter="user"></table>

<!--弹出表单-->
<form class="layui-form" action="" style="display: none;margin:10px" id="userFrm" lay-filter="userFrm">
    <!--用户编号,修改的时候,需要传这个值-->
    <input type="hidden" id="user_id" name="user_id"/>
    <input type="hidden" id="creat_by" name="creat_by"/>
    <input type="hidden" id="update_by" name="update_by"/>
    <!--设置提交的地址-->
    <input type="hidden" id="action" name="action">


    <div class="layui-form-item">
        <label class="layui-form-label">登录名</label>
        <div class="layui-input-block">
            <input type="text" name="login_name"  lay-verify="required|login_name" 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"  lay-verify="required|number" 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="user_name"  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="email"  lay-verify="required|email" 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="phonenumber"  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="dept_id" id="dept_id" lay-verify="required">
                <option value=""></option>
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">性别</label>
        <div class="layui-input-block">
            <input type="radio" name="sex" value="男" title="男">
            <input type="radio" name="sex" value="女" title="女" checked>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">状态</label>
        <div class="layui-input-block">
            <input type="checkbox" checked="" name="status" value="1"  lay-skin="switch" lay-filter="switchTest" lay-text="启用|禁用">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">备注</label>
        <div class="layui-input-block">
            <input type="text" name="remark"  lay-verify="required" placeholder="请输入备注" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item" pane="">
        <label class="layui-form-label">原始复选框</label>
        <div class="layui-input-block">
            <input type="checkbox" name="roles1" value="1" lay-skin="primary" title="管理员" >
            <input type="checkbox" name="roles2" value="2" lay-skin="primary" title="普通角色" >
            <input type="checkbox" name="roles3" value="3" lay-skin="primary" title="测试人员" >
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button type="button" class="layui-btn" lay-submit lay-filter="userBtnSubmit">立即提交</button>
        </div>
    </div>
</form>

<%--弹出密码表单--%>
<form class="layui-form" action="" style="display: none;margin:10px" id="userPwFrm" lay-filter="userPwFrm">
    <!--用户编号,修改的时候,需要传这个值-->
    <input type="hidden"  name="user_id"/>
    <!--设置提交的地址-->
    <input type="hidden" id="actionPw" name="actionPw">
    <div class="layui-form-item">
        <label class="layui-form-label">密码</label>
        <div class="layui-input-block">
            <input type="text" name="password"  lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button type="button" class="layui-btn" lay-submit lay-filter="userPwBtnSubmit">提交</button>
        </div>
    </div>
</form>

<!--定义表格工具条-->
<script type="text/html" id="userBar">
    <div class="layui-btn-container">
        <!--lay-event:用于设置一个按钮的特定事件,事件名字自己定义-->
        <button type="button" class="layui-btn" lay-event="userAdd">添加</button>
        <button type="button" class="layui-btn layui-btn-danger" lay-event="userBatchDel">批量删除</button>
    </div>
</script>
<script type="text/html" id="userRowBar">
    <div  class="layui-btn-container">
        <!--lay-event:用于设置一个按钮的特定事件,事件名字自己定义-->
        <button type="button" class="layui-btn layui-btn-primary" lay-event="userReset">重置密码</button>
        <button type="button" class="layui-btn layui-btn-sm" lay-event="userEdit">编辑</button>
        <button type="button" class="layui-btn layui-btn-sm layui-btn-danger" lay-event="userDel">删除</button>
    </div>
</script>

<%--<script type="text/javascript" src="${pageContext.request.contextPath}/assets/plugins/layui-v2.6.8/layui/layui.js?t=<%=Math.random()%>"></script>--%>
<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.6.8/dist/layui.js"></script>
<script>
    layui.use(['table','layer','laydate','form'], function(){
        var table = layui.table //表格组件
            ,layer=layui.layer  //弹出层
            ,laydate=layui.laydate //日期
            ,form=layui.form //表单
            ,$ = layui.$; //jq


        //加载部门下拉框
        loadDeptInfo();

        form.on('submit(formDemo)',function (data) {
            console.log(data);
            //对表格进行重载
            table.reload('user', {
                where: { //设定异步数据接口的额外参数,任意设
                    userName: data.field.userName,
                    phonenumber: data.field.phonenumber
                },
                page: {
                    curr: 1 //重新从第 1 页开始
                }
            })
        })

        form.verify({
            login_name : function(value, item){ //value:表单的值、item:表单的DOM对象
                if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){
                    return '用户名不能有特殊字符';
                }
                if(/(^\_)|(\__)|(\_+$)/.test(value)){
                    return '用户名首尾不能出现下划线\'_\'';
                }
                if(/^\d+\d+\d$/.test(value)){
                    return '用户名不能全为数字';
                }

                //如果不想自动弹出默认提示框,可以直接返回 true,这时你可以通过其他任意方式提示(v2.5.7 新增)
                if(value === 'xxx'){
                    alert('用户名不能为敏感词');
                    return true;
                }
            }

            //我们既支持上述函数式的方式,也支持下述数组的形式
            //数组的两个值分别代表:[正则匹配、匹配不符时的提示文字]
            ,pass: [
                /^[\S]{6,12}$/
                ,'密码必须6到12位,且不能出现空格'
            ]
        });

        //渲染表格数据
        table.render({
            elem: '#user' //渲染的目标元素
            ,url: '${pageContext.request.contextPath}/user/listAll1' //发送请求获取数据
            //,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
            ,toolbar:"#userBar" //设置表格工具条
            //,defaultToolbar: ['filter']
            ,page:true //启用分页
            ,limit:20 //每页条数
            ,limits:[5,10,20,30] //可选条数
            ,cols: [[  //表格列的定义
                {title:"全选",type:"checkbox"}
                ,{field:'user_id',  title: 'ID', sort: true}
                ,{field:'login_name' ,width:100 , title: '登录名'}
                ,{field:'user_name',width:100, title: '真实姓名'}
                ,{field:'email' ,width:100, title: '邮箱'}
                ,{field:'password',width:100, title: '密码',hide:true}
                ,{field:'phonenumber',width:100,title: '电话'}
                ,{field:'sex', title: '性别', sort: true,templet:function (d){
                        //console.log(d);
                        if(d.sex==0)
                            return "<font color='blue'>男</font>";
                        else
                            return "<font color='red'>女</font>";
                    }}
                ,{field:'avatar',width:100, title: '头像'}
                ,{field:'status',  title: '状态', sort: true,templet:function (d){
                        //console.log(d);
                        if(d.status==0)
                            return "<font color='blue'>在线</font>";
                        else
                            return "<font color='red'>离线</font>";
                    }}
                ,{field:'dept_name',width:100,  title: '部门'}
                ,{field:'dept_id',  title: '部门编号'}
                ,{field:'create_time',width:180 , title: '创建时间'}
                ,{field:'create_by',width:100,  title: '创建人'}
                ,{field:'update_by',width:100,  title: '修改人'}
                ,{field:'update_time', width:180, title: '修改时间'}
                ,{field:'remark', title: '备注'}
                ,{title:"操作",width:250,fixed:"right",toolbar:"#userRowBar"}
            ]]
        });

        //通过table组件监听表格头部工具条触发的事件
        table.on("toolbar(user)",function (obj){
            console.log(obj);
            //根据触发的事件做特定处理
            switch (obj.event){
                case "userAdd":
                    //表单重置
                    clearFrm();
                    //弹出表单
                    $("#action").val("${pageContext.request.contextPath}/user/insert");
                    showUserFrm();
                    break;
                case "userBatchDel":
                    //点击批量删除,获取当前选中行的信息
                    var checkStatus = table.checkStatus('user'); //idTest 即为基础参数 id 对应的值

                    //判断当前是否有选中行
                    if(checkStatus.data.length==0){
                        layer.msg("请先选中一行");
                        return;
                    }
                    var ids = [];
                    for(var i=0;i<checkStatus.data.length;i++){
                        ids.push({userId: checkStatus.data[i].user_id});
                    }
                    //拼接数组中的id: 3,4,5,6
                    delUser(ids);
                    break;
            }
        })

        //通过table组件,监听行工具条事件
        table.on("tool(user)",function (obj){
            console.log(obj);
            //判断点击按钮的事件
            switch (obj.event){
                case "userEdit":
                    clearFrm();
                    //弹出表单
                    $("#action").val("${pageContext.request.contextPath}/user/update");
                    showUserFrm();
                    //为表单设值
                    console.log(obj.data);
                    form.val("userFrm",obj.data);
                    selectCheckbox(obj.data.user_id);
                    break;
                case "userReset":
                    clearPwFrm();
                    $("#actionPw").val("${pageContext.request.contextPath}/user/passwordUpdate");
                    showUserPwFrm();
                    form.val("userPwFrm",obj.data);
                    break;
                case "userDel":
                    layer.confirm("确定要删除么?",function (index){
                        console.log(obj)
                        var ids = [] ;
                        ids.push({userId:obj.data.user_id});
                        delUser(ids);
                        //关闭确认框
                        layer.close(index);
                    })
                    break;
            }
        })

        //获取复选框数据
        function selectCheckbox(userId) {
            $.ajax({
                url:"${pageContext.request.contextPath}/user/selectCheckbox",
                type:"get",
                data:{userId},
                dataType:"json",
                success:function (res) {
                    // $("#userFrm input[type='checkbox'][name='"+res+"']").val(true);
                    // form.val("userFrm",{"roles[1]": true});
                    $('#userFrm input[type="checkbox"][name="roles'+res+'"]').prop('checked', true);

                }
            })
        }

        //绑定表单中,提交按钮的提交事件
        form.on("submit(userBtnSubmit)",function (obj){
            console.log(obj);
            $.ajax({
                url:$("#action").val(),
                type:"post",
                data:{"user":JSON.stringify(obj.field)}, //表单数据
                dataType:"json",
                success:function (res){
                    console.log("从contorller返回的int:"+res);
                    if(res==0){
                        layer.msg("操作成功",{icon:6});
                        //关闭表单
                        layer.close(userFrmIndex);
                        //表单重置
                        //$("#userFrm")[0].reset();
                        clearFrm();
                        //刷新表格
                        table.reload('user', {
                            page: {
                                curr: 1 //重新从第 1 页开始
                            }
                        });
                    }else{
                        layer.msg("添加失败",{icon:5});
                    }
                }
            })
        })

        //绑定密码表单中,提交按钮的提交事件
        form.on("submit(userPwBtnSubmit)",function (obj){
            console.log(obj);
            $.ajax({
                url:$("#actionPw").val(),
                type:"post",
                data:{"userPw":JSON.stringify(obj.field)}, //表单数据
                dataType:"json",
                success:function (res){
                    console.log("从contorller返回的int:"+res);
                    if(res==0){
                        layer.msg("修改成功",{icon:6});
                        //关闭表单
                        layer.close(userPwFrmIndex);
                        //表单重置
                        clearPwFrm();
                        //刷新表格
                        table.reload('user', {
                            page: {
                                curr: 1 //重新从第 1 页开始
                            }
                        });
                    }else{
                        layer.msg("添加失败",{icon:5});
                    }
                }
            })
        })

        //删除用户
        function delUser(ids){
            console.log(ids)
            $.ajax({
                url:"${pageContext.request.contextPath}/user/delete",
                data:{"idList":JSON.stringify(ids)},
                type:"post",
                dataType:"json",
                success:function (res){
                    console.log(res);
                    if(res.code==0){
                        layer.msg("删除成功!",{icon:6});
                        //重新加载表格
                        //刷新表格
                        table.reload('user', {
                            page: {
                                curr: 1 //重新从第 1 页开始
                            }
                        });
                    }else{
                        layer.msg("删除失败!",{icon:5})
                    }
                }
            })
        }

        //加载部门数据
        function loadDeptInfo(){
            $.ajax({
                url:"${pageContext.request.contextPath}/dept/deptListAll",
                // data: {"page":1,"limit":20},
                type: "get",
                // dataType:"json",
                success:function (res){
                    console.log(res);
                    //循环数据,将班级添加到下拉框中
                    for(var i=0;i<res.length;i++){
                        var user = res[i];
                        $("#dept_id").append("<option value='"+user.dept_id+"'>"+user.dept_name+"</option>")
                    }

                    //重新渲染下拉框
                    form.render('select')
                }
            })
        }

        //表单重置
        function clearFrm(){
            $("#userFrm")[0].reset();
        }

        //密码表单重置
        function clearPwFrm(){
            $("#userPwFrm")[0].reset();

        }

        var userFrmIndex;
        //定义函数弹出学生表单
        function  showUserFrm(){
            //页面层
            userFrmIndex=layer.open({
                type: 1,
                area: ['600px',"400px"],
                title:"用户信息",
                content: $('#userFrm')   //弹出页面元素
            });
        }

        var userPwFrmIndex;
        //定义函数弹出学生密码空表单
        function showUserPwFrm(){
            //页面层
            userPwFrmIndex=layer.open({
                type: 1,
                area: ['600px',"400px"],
                title:"重置密码",
                content: $('#userPwFrm')   //弹出页面元素
            });
        }

    });
</script>
</body>
</html>


dept.jsp:

<%--
  Created by IntelliJ IDEA.
  User: 33154
  Date: 2022/9/2
  Time: 9:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>部门管理</title>
    <!-- 引入 layui.css -->
    <%--    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/assets/plugins/layui-v2.6.8/layui/css/layui.css?t=<%=Math.random()%>"/>--%>
    <!-- 引入 layui.css -->
    <link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css">
</head>
<body>

<form class="layui-form" action="" style="margin-top: 20px">
    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">部门名称:</label>
            <div class="layui-input-inline">
                <input type="text" name="deptName" placeholder="部门名称" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-inline">
            <label class="layui-form-label">创建人:</label>
            <div class="layui-input-inline">
                <input type="text" name="creatBy" placeholder="创建人" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-inline">
            <label class="layui-form-label">修改人:</label>
            <div class="layui-input-inline">
                <input type="text" name="updateBy" placeholder="修改人" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-block">
                <button type="button" class="layui-btn" lay-submit lay-filter="formDemo">查询</button>
                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
            </div>
        </div>
    </div>

</form>

<!--要渲染的数据表格-->
<table id="dept" lay-filter="dept"></table>

<!--弹出表单-->
<form class="layui-form" action="" style="display: none;margin:10px" id="deptFrm" lay-filter="deptFrm">
    <!--学生编号,修改的时候,需要传这个值-->
    <%--    <input type="hidden" id="studentId" name="studentId"/>--%>
    <input type="hidden" id="deptId" name="deptId"/>
    <input type="hidden" id="createBy" name="createBy" value="wwb" />  <!--默认为我自己,后期进行修改-->
    <input type="hidden" id="updateBy" name="updateBy" value="wwb"/> <!--默认为我自己,后期进行修改-->
    <!--设置提交的地址-->
    <input type="hidden" id="action" name="action">


    <div class="layui-form-item">
        <label class="layui-form-label">部门名称</label>
        <div class="layui-input-block">
            <input type="text" name="deptName"  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="orderNum"  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="checkbox" checked="" name="status" value="0"  lay-skin="switch" lay-filter="switchTest" lay-text="可用|不可用">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button type="button" class="layui-btn" lay-submit lay-filter="deptBtnSubmit">立即提交</button>
            <button type="reset" class="layui-btn" lay-filter="deptBtnReset">重置</button>
        </div>
    </div>
</form>



<!--定义表格工具条-->
<script type="text/html" id="deptBar">
    <div class="layui-btn-container">
        <!--lay-event:用于设置一个按钮的特定事件,事件名字自己定义-->
        <button type="button" class="layui-btn" lay-event="deptAdd">添加</button>
        <button type="button" class="layui-btn layui-btn-danger" lay-event="deptBatchDel">批量删除</button>
    </div>
</script>

<script type="text/html" id="deptRowBar">
    <div  class="layui-btn-container">
        <!--lay-event:用于设置一个按钮的特定事件,事件名字自己定义-->
        <button type="button" class="layui-btn layui-btn-sm" lay-event="deptEdit">编辑</button>
        <button type="button" class="layui-btn layui-btn-sm layui-btn-danger" lay-event="deptDel">删除</button>
    </div>
</script>

<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.6.8/dist/layui.js"></script>

<script>
    layui.use(['table','layer','laydate','form'], function(){
        var table = layui.table //表格组件
            ,layer=layui.layer  //弹出层
            ,laydate=layui.laydate //日期
            ,form=layui.form //表单
            ,$ = layui.$; //jq

        form.on('submit(formDemo)',function (data) {
            console.log(data);
            table.reload('dept', {
                where: { //设定异步数据接口的额外参数,任意设
                    deptName: data.field.deptName,
                    creatBy: data.field.creatBy,
                    updateBy:data.field.updateBy
                },
                page: {
                    curr: 1 //重新从第 1 页开始
                }
            })
        })

        //渲染表格数据
        table.render({
            elem: '#dept' //渲染的目标元素
            ,url: '${pageContext.request.contextPath}/dept/deptListAll1' //发送请求获取数据
            ,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
            ,toolbar:"#deptBar" //设置表格工具条
            ,defaultToolbar: ['filter']
            //,width:1000  //生成的表格,显示的宽度将被固定为1000
            ,page:true //启用分页
            ,limit:20 //每页条数
            ,limits:[5,10,20,30] //可选条数
            ,cols: [[  //表格列的定义
                {title:"全选",type:"checkbox"}
                //传进来的数据是dept对象,field用实体类中的属性(小驼峰)
                ,{field:'deptId', title: '编号', sort: true}
                ,{field:'deptName', width:100, title: '部门名称'}
                ,{field:'orderNum',  title: '排序',sort:true}
                ,{field:'status', width:100, title: '状态',templet:function (d){
                        //console.log(d);
                        if(d.status==0)
                            return '<button type="button" class="layui-btn layui-btn-sm">正常</button>';
                        else
                            return '<button type="button" class="layui-btn layui-btn-sm">异常</button>';
                    }}
                ,{field:'createBy', width:80, title: '创建人',sort: true}
                ,{field:'createTime', width:180, title: '创建时间',sort: true}
                ,{field:'updateBy', width:80, title: '修改人'}
                ,{field:'updateTime', width:180, title: '修改时间',sort: true}
                ,{title:"操作",width:150,fixed:"right",toolbar:"#deptRowBar"}
            ]]
        });

        //通过table组件监听表格头部工具条触发的事件
        table.on("toolbar(dept)",function (obj){
            console.log(obj);
            //根据触发的事件做特定处理
            switch (obj.event){
                case "deptAdd":
                    //弹出表单
                    $("#action").val("${pageContext.request.contextPath}/dept/deptInsert");
                    showDeptFrm();
                    break;
                case "deptBatchDel":
                    //点击批量删除,获取当前选中行的信息
                    var checkStatus = table.checkStatus('dept'); //idTest 即为基础参数 id 对应的值

                    //判断当前是否有选中行
                    if(checkStatus.data.length==0){
                        layer.msg("请先选中一行");
                        return;
                    }
                    var ids = [];
                    for(var i=0;i<checkStatus.data.length;i++){
                        ids.push({deptId: checkStatus.data[i].deptId});
                    }
                    //拼接数组中的id: 3,4,5,6
                    delDept(ids);
                    break;
            }
        })


        //通过table组件,监听行工具条事件
        table.on("tool(dept)",function (obj){
            console.log(obj);
            //判断点击按钮的事件
            switch (obj.event){
                case "deptEdit":
                    //弹出表单
                    $("#action").val("${pageContext.request.contextPath}/dept/deptUpdate");
                    showDeptFrm();
                    //为表单设值
                    console.log(obj);
                    form.val("deptFrm",obj.data);
                    break;
                case "deptDel":
                    layer.confirm("确定要删除么?",function (index){
                        var ids = [] ;
                        ids.push({deptId:obj.data.deptId});
                        delDept(ids);
                        //关闭确认框
                        layer.close(index);
                    })
                    break;
            }
        })

        //绑定表单中,提交按钮的提交事件
        form.on("submit(deptBtnSubmit)",function (obj){
            console.log(obj);
            if(obj.field.status==null){
                obj.field.status='1';
            }
            $.ajax({
                url:$("#action").val(),
                type:"post",
                data:{"dept":JSON.stringify(obj.field)}, //表单数据
                dataType:"json",
                success:function (res){
                    console.log("从contorller返回的int:"+res);
                    if(res==0){
                        layer.msg("添加成功",{icon:6});
                        //关闭表单
                        layer.close(deptFrmIndex);
                        //表单重置
                        $("#deptFrm")[0].reset();
                        //刷新表格
                        table.reload('dept', {
                            page: {
                                curr: 1 //重新从第 1 页开始
                            }
                        });
                    }else{
                        layer.msg("添加失败",{icon:5});
                    }
                }
            })
        })

        //删除用户
        function delDept(ids){
            console.log(ids)
            $.ajax({
                url:"${pageContext.request.contextPath}/dept/deptDelete",
                data:{"idList":JSON.stringify(ids)},
                type:"post",
                dataType:"json",
                success:function (res){
                    console.log(res);
                    if(res.code==0){
                        layer.msg("删除成功!",{icon:6});
                        //重新加载表格
                        //刷新表格
                        table.reload('dept', {
                            page: {
                                curr: 1 //重新从第 1 页开始
                            }
                        });
                    }else{
                        layer.msg("删除失败!",{icon:5})
                    }
                }
            })
        }

        var deptFrmIndex;
        //定义函数弹出学生表单
        function  showDeptFrm(){
            //页面层
            deptFrmIndex=layer.open({
                type: 1,
                area: ['600px',"400px"],
                title:"添加部门",
                content: $('#deptFrm')   //弹出页面元素
            });
        }

    });


</script>
</body>
</html>

questionnaire_manage.jsp:

<%--
  Created by IntelliJ IDEA.
  User: jjk
  Date: 2022/9/2
  Time: 9:01
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>question</title>
    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/assets/layui/css/layui.css"/>
    <script rel="script" type="text/javascript" src="${pageContext.request.contextPath}/assets/layui/layui.js"></script>
    <script rel="script" type="text/javascript" src="${pageContext.request.contextPath}/assets/jq/jquery-1.12.4.min.js"></script>
    <script rel="script" type="text/javascript" src="${pageContext.request.contextPath}/assets/jq/jquery.qrcode.min.js"></script>
</head>
<body>

<form class="layui-form" action="" id="addQuestionsFrm" lay-filter="addQuestionsFrm" style="display: none">
    <input type="hidden" id="id" name="id"/>
    <input type="hidden" id="enabled" name="enabled"/>
    <input type="hidden" id="action" name="action"/>
    <div class="layui-form-item">
        <label class="layui-form-label">问卷标题</label>
        <div class="layui-input-inline">
            <input type="text" name="title" lay-verify="title" placeholder="请输入问卷标题" autocomplete="off" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">记名/匿名</label>
            <div class="layui-input-inline">
                <input type="checkbox" name="anonymous" id="anonymous" lay-skin="switch" lay-text="记名|匿名" checked>
            </div>
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button type="button" class="layui-btn" lay-submit lay-filter="questionBtnSubmit">立即提交</button>
            <button type="reset" class="layui-btn layui-btn-primary" lay-filter="deptBtnReset">重置</button>
        </div>
    </div>
</form>
<form class="layui-form" action="" id="selFrm" lay-event="selFrm" style="margin-top: 20px">
    <div class="layui-form-item">
        <label class="layui-form-label">问卷标题:</label>
        <div class="layui-input-inline">
            <input type="text" name="questionTitle" id="questionTitle" placeholder="请输入问卷标题" autocomplete="off" class="layui-input">
        </div>
        <label class="layui-form-label">创建人:</label>
        <div class="layui-input-inline">
            <input type="text" name="createBy" id="createBy" placeholder="请输入创建者" autocomplete="off" class="layui-input">
        </div>
        <div class="layui-input-inline">
            <button type="button" class="layui-btn" lay-submit lay-filter="selFrm" id="search">搜索</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>

<%--表格--%>
<table id="questionnaires" lay-filter="questionnaires"></table>

<%--二维码--%>

<div id="div1" lay-filter="div1" style="display:none">
    <input cols="20" rows="10" id="url"  value="" style="margin-left: 33px" />
    <input id="copyBtn" type="button" class="layui-btn layui-btn-xs" value="复制链接" />
    <div id="div2" lay-event="div2" style="padding-left: 50px;margin-top: 10px"></div>
</div>


<script type="text/html" id="questionsBar" lay-filter="questionsBar">
    <div>
        <button type="button" class="layui-btn" id="btnAdd" lay-event="questionsAdd"><i class="layui-icon layui-icon-add-1"></i>添加问卷</button>
        <button type="button" class="layui-btn layui-btn-primary" id="questionCopy" lay-event="questionCopy"><i class="layui-icon layui-icon-add-1"></i>复制问卷</button>
        <button type="button" class="layui-btn layui-btn-warm" id="questionPreview" lay-event="questionPreview"><i class="layui-icon layui-icon-layer"></i>预览问卷</button>
        <button type="button" class="layui-btn layui-btn-normal" id="checkResult" lay-event="checkResult"><i class="layui-icon layui-icon-layer"></i>查看结果</button>
        <button type="button" class="layui-btn layui-btn-danger" id="testDelSel" lay-event="questionsDelSel"><i class="layui-icon layui-icon-delete"></i>批量删除</button>
    </div>
</script>
<script type="text/html" id="questionsTool" lay-filter="questionsTool">
    <button type="button" class="layui-btn layui-btn-xs" lay-event="questionsUpd">修改</button>
    <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" lay-event="addQuestions">添加题目</button>
    <button type="button" class="layui-btn layui-btn-warm layui-btn-xs" lay-event="relQuestion">发布问卷</button>
    <button type="button" class="layui-btn layui-btn-danger layui-btn-xs" lay-event="questionsDel">删除</button>
</script>
<script rel="script" type="text/javascript">
    layui.use(['table','layer','laydate','form'],function (){
        var table = layui.table,
            $ = layui.jquery,
            layer = layui.layer,
            form = layui.form;

        form.on('submit(selFrm)',function (data) {
            console.log(data);
            table.reload('questionnaires', {
                where: { //设定异步数据接口的额外参数,任意设
                    questionTitle: data.field.questionTitle,
                    createBy: data.field.createBy
                },
                page: {
                    curr: 1 //重新从第 1 页开始
                }
            })
        })

        //渲染表格
        table.render({
            elem:'#questionnaires',
            height:500,
            url:'${pageContext.request.contextPath}/questionnaire/query',
            page:true,
            limit:10,
            limits:[5,10,20,50,100],
            even: true,
            toolbar:"#questionsBar",
            cols:[[
                {title: "全选",type:"checkbox" , fixed: 'left'}
                , {field: 'id', title: '编号', sort: true, align: 'center', width: 80 , fixed: 'left'}
                , {field: 'title', title: '问卷标题', width: 120}
                //, {field: 'anonymous', title: '记名/匿名', width: 120}

                ,{field:'anonymous',  title: '记名/匿名', sort: true,templet:function (d){
                        //console.log(d);
                        if(d.anonymous==0)
                            return '匿名';
                        else
                            return '记名';
                    }}
                ,{field:'enabled',  title: '启用|禁用',width: 120, sort: true,templet:function (d){
                        //console.log(d);
                        if(d.enabled==0)
                            return ' <input type="checkbox" name="close" lay-filter="switchTest" lay-skin="switch" lay-text="ON|OFF">';
                        else
                            return '<input type="checkbox" checked name="open" lay-skin="switch" lay-filter="switchTest" lay-text="ON|OFF">';
                    }}
                //, {field: 'enabled', title: '启用|禁用', width: 120}
                , {field: 'detailsCount', title: '题目数', width: 120,sort: true}//题目数
                , {field: 'userCount', title: '人数', width: 120,sort: true}//用户数
                , {field: 'create_by', title: '创建人', width: 120}
                , {field: 'create_time', title: '创建时间', width: 160,sort: true}
                , {field: 'update_by', title: '修改人', width: 120}
                , {field: 'update_time', title: '修改时间', width: 120,sort: true}
                , {title: '操作', width: 360, toolbar: '#questionsTool', fixed: 'right'}
            ]],
            initSort: {
                field: 'id'//排序字段,对应 cols 设定的各字段名
                , type: 'asc' //排序方式  asc: 升序、desc: 降序、null: 默认排序
            }
        })

        form.on('switch(switchTest)',function (data) {
            //console.log();
            var id = data.elem.parentElement.parentElement.parentElement.children[1].children[0].innerText;
            var checked = data.elem.checked;
            console.log(id+" "+checked);
            $.ajax({
                url:"${pageContext.request.contextPath}/questionnaire/updataEnabled",
                method:'post',
                data:{"id":id,"checked":checked},
                dataType:'json',
                success:function (res) {
                    console.log(res.code);
                    table.reload('questionnaires', {
                        page: {
                            curr: 1 //重新从第 1 页开始
                        }
                    });
                }
            })
        })

        //通过table组件监听表格头部工具条触发的事件
        table.on('toolbar(questionnaires)',function (obj) {
            console.log(obj);
            var e = obj.event;
            switch (e) {
                case "questionsAdd":
                    clearFrm();
                    $("#action").val("${pageContext.request.contextPath}/questionnaire/questionnaireInsert");
                    showFrm();
                    break;
                case "questionCopy":
                    var checkStatus = table.checkStatus('questionnaires'); //idTest 即为基础参数 id 对应的值
                    //判断当前是否有选中行
                    if(checkStatus.data.length!=1){
                        layer.msg("需要选中一行");
                        return;
                    }
                    clearFrm();
                    $("#action").val("${pageContext.request.contextPath}/questionnaire/copyQuestionnaire");
                    console.log(checkStatus.data);
                    form.val("addQuestionsFrm",checkStatus.data[0]);
                    showFrm();
                    break;
                case "questionPreview":
                    var checkStatus = table.checkStatus('questionnaires'); //idTest 即为基础参数 id 对应的值
                    //判断当前是否有选中行
                    if(checkStatus.data.length!=1){
                        layer.msg("需要选中一行");
                        return;
                    }
                    var id = checkStatus.data[0].id;
                    window.location.href="${pageContext.request.contextPath}/toQuestionnairePreview/"+id;
                    break;
                case "checkResult":
                    var checkStatus = table.checkStatus('questionnaires'); //idTest 即为基础参数 id 对应的值
                    //判断当前是否有选中行
                    if(checkStatus.data.length!=1){
                        layer.msg("需要选中一行");
                        return;
                    }
                    var id = checkStatus.data[0].id;
                    window.location.href="${pageContext.request.contextPath}/toQuestionnaireResult/"+id;
                    break;
                case "questionsDelSel":
                    //点击批量删除,获取当前选中行的信息
                    var checkStatus = table.checkStatus('questionnaires'); //idTest 即为基础参数 id 对应的值
                    //判断当前是否有选中行
                    if(checkStatus.data.length==0){
                        layer.msg("请先选中一行");
                        return;
                    }
                    layer.confirm("确定删除吗?", function () {
                        var ids = [];
                        for(var i=0;i<checkStatus.data.length;i++){
                            ids.push({id: checkStatus.data[i].id});
                        }
                        //拼接数组中的id: 3,4,5,6
                        delUser(ids);
                    })
                    break;
            }
        })
        var id;
        //通过table组件监听表格右侧工具条触发的事件
        table.on('tool(questionnaires)',function (obj){
            // console.log(obj);
            var e = obj.event;
            switch(e){
                case "questionsUpd":
                    clearFrm();
                    //弹出表单
                    $("#action").val("${pageContext.request.contextPath}/questionnaire/questionnaireUpdate");
                    showFrm();
                    //为表单设值
                    console.log(obj.data);
                    form.val("addQuestionsFrm",obj.data);
                    break;
                case "questionsDel":
                    layer.confirm("确定要删除么?",function (index){
                        var ids = [] ;
                        ids.push({id:obj.data.id});
                        delUser(ids);
                        //关闭确认框
                        layer.close(index);
                    })
                    break;
                case "addQuestions":
                    id = obj.data.id;
                    window.location.href = "${pageContext.request.contextPath}/toQuestionnaireDetails/"+id;
                    break;
                case "relQuestion":
                    var enabled = obj.data.enabled;
                    console.log(obj.data);
                    console.log(obj);
                    if(enabled==0){
                        layer.msg('该问卷已被禁用',{icon:5});
                        return;
                    }
                    id=obj.data.id;
                    showDivFrm();
                    break;
            }
        })

        //绑定表单中,提交按钮的提交事件
        form.on("submit(questionBtnSubmit)",function (obj){
            if($('#anonymous').is(":checked")){
                obj.field.anonymous='1';
            }else {
                obj.field.anonymous='0';
            }
            console.log(obj);
            $.ajax({
                url:$("#action").val(),
                type:"post",
                data:{"questionnaire":JSON.stringify(obj.field)}, //表单数据
                dataType:"json",
                success:function (res){
                    console.log("从contorller返回的int:"+res);
                    if(res.code==0){
                        layer.msg("操作成功",{icon:6});
                        //关闭表单
                        layer.close(indexFrm);
                        //表单重置
                        //$("#deptFrm")[0].reset();
                        clearFrm();
                        //刷新表格
                        table.reload('questionnaires', {
                            page: {
                                curr: 1 //重新从第 1 页开始
                            }
                        });
                    }else{
                        layer.msg("操作失败",{icon:5});
                    }
                }
            })
        })

        //删除用户
        function delUser(ids){
            console.log(ids)
            $.ajax({
                url:"${pageContext.request.contextPath}/questionnaire/questionnaireDelete",
                data:{"idList":JSON.stringify(ids)},
                type:"post",
                dataType:"json",
                success:function (res){
                    console.log(res);
                    if(res.code==0){
                        layer.msg("删除成功!",{icon:6});
                        //重新加载表格
                        //刷新表格
                        table.reload('questionnaires', {
                            page: {
                                curr: 1 //重新从第 1 页开始
                            }
                        });
                    }else{
                        layer.msg("删除失败!",{icon:5})
                    }
                }
            })
        }

        //表单重置
        function clearFrm(){
            $("#addQuestionsFrm")[0].reset();
        }

        //复制粘贴函数
        $("#copyBtn").on('click',function (obj){
            console.log(obj);

            var Url=document.getElementById("url");
            Url.select(); // 选择对象
            document.execCommand("Copy"); // 执行浏览器复制命令
            alert("已复制好,可贴粘。");
        })

        //显示表单
        var indexFrm;
        function showFrm(){
            // $('#addQuestionsFrm').show();
            indexFrm = layer.open({
                type: 1,
                title: '添加问卷',
                // offset:['50px','200px'],
                // offset: 't',
                area: ['400px','300px'],
                content: $("#addQuestionsFrm"),
                // content: $("#questionsDiv"),
            })
        }

        //显示发布问卷表单
        function showDivFrm(){
            $('#url').val("http://localhost:8080${pageContext.request.contextPath}/questionnaire/login/"+id);
            //准备二维码的规格对象(JSON)
            var config  = {
                width:200,//值是number类型, 表示的单位是px  必须传递
                height:200,//值是number类型, 表示的单位是px  必须传递
                text:$("#url").val(),//text就表示二维码中存储的数据  必须传递
                correctLevel:0,//取值为0|1|2|3 表示二维码的纠错级别0:L/1:M/2:Q/3:H ,默认0  可选参数
                // background:"#rrggbb",//默认白色, 表示二维码的后景颜色 可选参数
                // foreground:"#rrggbb",//默认黑色, 表示二维码的前景颜色 可选参数
                render:"table"//取值:table/canvas , 默认table 可选参数
            };

            // 通过选择器, 查找到上述的div ,得到Jquery对象, 通过jquery对象的qrcode函数生成二维码
            $("#div2").qrcode(config);
            indexFrm = layer.open({
                type: 1,
                title: '添加问卷',
                // offset:['50px','200px'],
                // offset: 't',
                area: ['300px','300px'],
                content: $("#div1"),
                // content: $("#questionsDiv"),
            })
        }

        function valFrm(data){
            form.val('addQuestionsFrm',data);
            form.val('addQuestionsFrm', {
                "status":data.status==0?true:false,
            });
        }

    })
</script>
</body>
</html>

web.xml :

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <!--监听项目启动加载mybatis容器-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>

  <!--字符过滤器-->
  <filter>
    <filter-name>charactorEncoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>charactorEncoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

// A code block
var foo = 'bar';

// A code block
var foo = 'bar';

// A code block
var foo = 'bar';

// A code block
var foo = 'bar';

// A code block
var foo = 'bar';

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118035.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!