1. 创建maven项目
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.javabs</groupId> <artifactId>job</artifactId> <version>1.0.1-SNAPSHOT</version> <name>job</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--模板引擎--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!--SpringMVC的jar包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--springboot启动器--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope><!--运行时期--> <optional>true</optional> </dependency> <!--MySQL数据库驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--Lombok简化实体类的插件包--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--SpringBoot启动的测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <!--数据源连接池:德鲁伊--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> <!--mail--> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.5.1</version> </dependency> <!--上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <!--分页的插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> </dependencies>
2. 编写配置文件
# 服务器 server.port=8081 #json的时间格式: spring.jackson.date-format=yyyy-MM-dd HH:mm:ss #模板引擎 spring.thymeleaf.mode=HTML5 spring.thymeleaf.cache=false spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.encoding=UTF-8 # 静态资源的释放 spring.mvc.static-path-pattern=/static/** #文件上传的大小 spring.servlet.multipart.max-file-size=2MB # 定义 加载 开发环境下的 配置文件 #spring.profiles.active=dev spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/job?useUnicode=true&characterEncoding=utf-8&serverTimeZone=GMT spring.datasource.username=root spring.datasource.password=sorry mybatis.mapper-locations=classpath:/cn/javabs/job/mapper/*.xml #pagehelper分页插件配置 pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql pagehelper.pageSize = 10 #热部署 spring.devtools.restart.enabled=true
3. 编写实体类
package cn.javabs.job.entity; import lombok.Data; /** * 用户实体类设计 * 1. 应聘者: 学生 * 2. 招聘者: 公司人力资源 */ @Data public class User { // -----------------定义常量:-------------------- final int USER_SEX_MAN = 1; // 性别 男 final int USER_SEX_WOMAN = 2; // 性别 女 final int USER_SEX_UNKONW = 0; // 性别 未知 final String DEFAULT_HEAD_IMGAE = "common/default_img.jpg"; // 默认的用户头像 final String DEFAULT_WORK_EXP = "应届毕业生"; // 默认是应届毕业生 final String DEFAULT_DEGREE = "其他"; // 默认是其他、专科、本科、研究生 // -----------------变量:-------------------- private int userId; private String username; // 用户名 private String password;// 密码 private String email;// 邮箱地址 private String headPic = DEFAULT_HEAD_IMGAE; // 用户头像 private String workExp = DEFAULT_WORK_EXP; // 工作经验,默认是应届毕业生 private String degree = DEFAULT_DEGREE; // 学历,默认是其他 private int sex = USER_SEX_UNKONW ;// 用户性别 默认是未知 private int type ; // 用户类别, 0-学生(应聘者);1-(公司的HR)招聘者 private String mobile ; // 手机号码 private String selfDescription ; // 自我描述 }
4. 编写数据持久层接口
package cn.javabs.job.mapper; import cn.javabs.job.entity.User; import org.springframework.stereotype.Repository; import java.util.List; @Repository("userMapper") public interface UserMapper { /** * 后端获取所有用户的信息 * @return 返回的集合 */ List<User> findAllUserList(); /** * 按照邮箱查询用户的信息 * @param email * @return 返回的对象 */ User findUserByEmail(String email); /** * 按照条件(用户名或者性别或者学历)查询用户信息 返回的集合 * @param condition * @return */ List<User> findUserByCondition(String condition); /** * 按照用户id查询用户信息 * @param userId * @return 返回的对象 */ User findUserByUserId(int userId); /** * 用户登录 * 根据用户名和密码及用户类型执行 登录 * @param user * @return */ User login(User user); int addUser(User user); int delUser(int userId); int editUser(User user); }
5. 编写持久层映射文件
<?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="cn.javabs.job.mapper.UserMapper"> <!--添加用户--> <insert id="addUser" parameterType="cn.javabs.job.entity.User"> insert into user <trim prefix="(" suffix=") values" suffixOverrides=","> <if test="username != nul and username != '' "> username, </if> <if test="password != nul and password != '' "> password, </if> <if test="headPic != nul and headPic != '' "> headPic, </if> <if test="sex != nul and sex != '' "> sex, </if> <if test="email != nul and email != '' "> email, </if> <if test="mobile != nul and mobile != '' "> mobile, </if> <if test="degree != nul and degree != '' "> degree, </if> <if test="workExp != nul and workExp != '' "> workExp, </if> <if test="type != nul and type != '' "> type, </if> <if test="selfDescription != nul and selfDescription != '' "> selfDescription, </if> </trim> <trim prefix="(" suffix=")" suffixOverrides=","> <if test="username != nul and username != '' "> #{username}, </if> <if test="password != nul and password != '' "> #{password}, </if> <if test="headPic != nul and headPic != '' "> #{headPic}, </if> <if test="sex != nul and sex != '' "> #{sex}, </if> <if test="email != nul and email != '' "> #{email}, </if> <if test="mobile != nul and mobile != '' "> #{mobile}, </if> <if test="degree != nul and degree != '' "> #{degree}, </if> <if test="workExp != nul and workExp != '' "> #{workExp}, </if> <if test="type != nul and type != '' "> #{type}, </if> <if test="selfDescription != nul and selfDescription != '' "> #{selfDescription}, </if> </trim> </insert> <!--修改用户--> <update id="editUser" parameterType="cn.javabs.job.entity.User"> update user <set> <!-- <if test="username != nul and username != '' "> #{username}, </if>--> <if test="password != nul and password != '' "> #{password}, </if> <if test="headPic != nul and headPic != '' "> #{headPic}, </if> <if test="sex != nul and sex != '' "> #{sex}, </if> <if test="email != nul and email != '' "> #{email}, </if> <if test="mobile != nul and mobile != '' "> #{mobile}, </if> <if test="degree != nul and degree != '' "> #{degree}, </if> <if test="workExp != nul and workExp != '' "> #{workExp}, </if> <!-- <if test="type != nul and type != '' "> #{type}, </if>--> <if test="selfDescription != nul and selfDescription != '' "> #{selfDescription}, </if> </set> where userId = #{userId} </update> <!--删除用户--> <delete id="delUser" parameterType="int"> delete from user <where> <if test="userId != nul and userId != '' "> and userId = #{userId}, </if> </where> </delete> <!--查询所有用户--> <select id="findAllUserList" resultType="cn.javabs.job.entity.User"> select * from user </select> <!--按照邮箱查询用户的信息--> <select id="findUserByEmail" resultType="cn.javabs.job.entity.User" parameterType="String"> select * from user <where> <if test="email != nul and email != '' "> and email = #{email}, </if> </where> </select> <!--按照条件(用户名或者性别或者学历)查询用户信息 返回的集合--> <select id="findUserByCondition" resultType="cn.javabs.job.entity.User" parameterType="String"> select * from user <where> <!--用户名 进行模糊查询--> <if test="username != nul and username != '' "> and username like concat('%',#{username},'%'), </if> <if test="sex != nul and sex != '' "> and sex = #{sex}, </if> <if test="degree != nul and degree != '' "> and degree = #{degree}, </if> </where> </select> <!--根据用户编号查询用户信息--> <select id="findUserByUserId" resultType="cn.javabs.job.entity.User" parameterType="int"> select * from user <where> <if test="userId != nul and userId != '' "> and userId = #{userId} </if> </where> </select> <!--用户登录--> <select id="login" resultType="cn.javabs.job.entity.User" parameterType="cn.javabs.job.entity.User"> select * from user <where> <if test="username != nul and username != '' "> and username = #{username} </if> <if test="password != nul and password != '' "> and password = #{password} </if> <if test="type != nul and type != '' "> and type = #{type} </if> </where> </select> </mapper>
6. 编写业务逻辑层接口
package cn.javabs.job.service; import cn.javabs.job.entity.User; import java.util.List; public interface UserService { List<User> getAllUserList(); User getUserByEmail(String email); User getUserByUserId(int userId); List<User> getUserByCondition(String condition); User userLogin(User user); int deleteUser(int userId); int editUser(User user); int addUser(User user); }
7. 编写业务逻辑层接口的实现类
package cn.javabs.job.service.impl; import cn.javabs.job.entity.User; import cn.javabs.job.mapper.UserMapper; import cn.javabs.job.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; @Service("userService") @Transactional public class UserServiceImpl implements UserService { @Resource @Qualifier("userMapper") private UserMapper userMapper; @Override public List<User> getAllUserList() { return userMapper.findAllUserList(); } @Override public User getUserByEmail(String email) { return userMapper.findUserByEmail(email); } @Override public User getUserByUserId(int userId) { return userMapper.findUserByUserId(userId); } @Override public List<User> getUserByCondition(String condition) { return userMapper.findUserByCondition(condition); } @Override public User userLogin(User user) { return userMapper.login(user); } @Override public int deleteUser(int userId) { return userMapper.delUser(userId); } @Override public int editUser(User user) { return userMapper.editUser(user); } @Override public int addUser(User user) { return userMapper.addUser(user); } }
8. 编写控制器类
package cn.javabs.job.controller; import cn.javabs.job.entity.User; import cn.javabs.job.service.UserService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; 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 org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 后端用户管理的控制器 */ @Controller @RequestMapping("/admin/user") public class UserController { @Resource @Qualifier("userService") private UserService userService; @Value("${pagehelper.pageSize}") private int pageSize; @RequestMapping("userList") public ModelAndView userList(@RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum){ PageHelper.startPage(pageNum,pageSize); List<User> userList = userService.getAllUserList(); PageInfo<User> pageInfo = new PageInfo<>(userList); ModelAndView mv = new ModelAndView(); mv.addObject("userList",userList); mv.addObject("pageInfo",pageInfo); mv.setViewName("user"); return mv; } }
9. 编写页面,模板引擎
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>用户管理</title> <link rel="stylesheet" th:href="@{../static/component/style/components.css}" href="../static/component/style/components.css"> <link rel="stylesheet" th:href="@{../static/css/bootstrap.css}" href="../static/css/bootstrap.css"> <link rel="stylesheet" th:href="@{../static/css/plugins.css}" href="../static/css/plugins.css"> <link rel="stylesheet" th:href="@{../static/css/main.css}" href="../static/css/main.css"> <link rel="stylesheet" th:href="@{../static/css/themes.css}" href="../static/css/themes.css"> <script th:src="@{../static/component/js/JQuery2.1.4.js}"></script> <script th:src="@{../static/component/js/bootstrap.min.js}"></script> </head> <body> <div id="body"> <ol class="breadcrumb"> <li class="active"><a href="#">系统</a></li> <li>用户列表</li> </ol> <div class="barboxs"> <button class="btn btn-success pull-left " data-toggle="modal" data-target="#myModal" title="" data-placement="right" data-original-title="添加用户"> <i class="fa fa-pencil-square-o"></i> </button> <button class="btn btn-danger pull-left ml10" data-toggle="tooltip" title="" data-placement="right" data-original-title="删除用户"><i class="fa fa-trash-o"></i></button> <div class="leftbox"> <div class="liselect w300"> <div class="input-group"> <input type="text" id="example-input-typeahead" class="form-control example-typeahead" placeholder="请输入关键词"> <span class="input-group-btn"> <button class="btn btn-success"><i class="fa fa-search"></i></button> </span> </div> </div> </div> </div> <div class="tablebox"> <table class="table table-bordered"> <thead> <tr> <th class="text-center" width="50"><input type="checkbox" id="check5-all" name="check5-all"></th> <th class="text-center">序号</th> <th>用户账号</th> <th>用户密码</th> <th>电子邮件</th> <th>手机号码</th> <th>用户学历</th> <th>用户性别</th> <th>用户类别</th> <th>创建时间</th> <th class="text-center" width="85"><i class="fa fa-bolt"></i> 操作</th> </tr> </thead> <tbody> <tr th:each="user,userStatus:${userList}"> <td class="text-center"><input type="checkbox" id="check5-td1" name="check5-td1"></td> <td class="cell-small text-center"><span th:text="${userStatus.index}">序号</span></td> <td th:text="${user.username}">custom_admins</td> <td th:text="${user.password}">custom_admins</td> <td th:text="${user.email}">custom_admins</td> <td th:text="${user.mobile}">custom_admins</td> <td th:text="${user.degree}">custom_admins</td> <span th:if="${user.sex} == 0"> <td >未知</td> </span> <span th:if="${user.sex} == 1"> <td >男</td> </span> <span th:if="${user.sex} == 2"> <td >女</td> </span> <td th:text="${user.type}">custom_admins</td> <td>2021-3-22 11:04:49</td> <td class="text-center"> <div class="btn-group"> <a href="javascript:void(0)" class="btn btn-xs btn-info"><i class="fa fa-globe"></i></a> <a href="javascript:void(0)" class="btn btn-xs btn-success"><i class="fa fa-pencil"></i></a> <a href="javascript:void(0)" class="btn btn-xs btn-danger"><i class="fa fa-trash-o"></i></a> </div> </td> </tr> </tbody> </table> </div> </body> </html>