配置文件
pom包配置
pom包里面添加jpa和thymeleaf的相关包引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在application.properties中添加配置
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=hzx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.thymeleaf.cache=false
server.servlet.context-path=/crm
启动类
@SpringBootApplication
public class Ch07Application {
public static void main(String[] args) {
SpringApplication.run(Ch07Application.class, args);
}
}
数据库层代码
package com.bdqn.ch07.pojo;
import jakarta.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "sys_user")
public class SysUser implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "usr_id")
private Long usrId;
@Column(name = "usr_name")
private String usrName;
@Column(name = "usr_password")
private String usrPassword;
@ManyToOne(targetEntity = SysRole.class)
@Column(name = "usr_role_id")
private SysRole role;
@Column(name = "usr_flag")
private Long usrFlag;
public Long getUsrId() {
return usrId;
}
public void setUsrId(Long usrId) {
this.usrId = usrId;
}
public String getUsrName() {
return usrName;
}
public void setUsrName(String usrName) {
this.usrName = usrName;
}
public String getUsrPassword() {
return usrPassword;
}
public void setUsrPassword(String usrPassword) {
this.usrPassword = usrPassword;
}
public Long getUsrFlag() {
return usrFlag;
}
public void setUsrFlag(Long usrFlag) {
this.usrFlag = usrFlag;
}
}
业务层处理
public class SysUserServiceImpl implements SysUserService {
@Override
public SysUser login(String usrName, String usrPassword) {
return null;
}
@Override
public void saveUser(SysUser user) {
}
@Override
public void deleteUser(Long usrId) {
}
@Override
public SysUser getUser(Long usrId) {
return null;
}
@Override
public Page<SysUser> findUsers(String usrName, Long roleId, Pageable pageable) {
Specification<SysUser> specification = new Specification<SysUser>(){
@Override
public jakarta.persistence.criteria.Predicate toPredicate(Root<SysUser> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate>predicates = new ArrayList<>();
if (usrName != null && !usrName.equals("")){
predicates.add((Predicate) criteriaBuilder.like(root.get("usrName"),"%"+usrName+"%"));
}
if (roleId != null && roleId.longValue()!=01){
SysRole role = new SysRole();
role.setRoleId(roleId);
predicates.add(criteriaBuilder.equal(root.get("role"), role));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
return userRepository.findAll(specification,pageable);
}
Controller负责接收请求,处理完后将页面内容返回给前端。
public class UserController {
@Resource
private UserService userService;
@RequestMapping(value = "/dologin")
public String dologin(String usrName, String usrPassword, HttpSession request) {
User user = userService.login(usrName, usrPassword);
if (user!= null) {
request.setAttribute("loginUser", user);
return "main";
} else {
request.setAttribute("message", "用户名或密码错误");
return "login";
}
}
@RequestMapping(value = "/logout")
public String logout(HttpSession session) {
session.removeAttribute("loginUser");
return "login";
}
@GetMapping(value = "/user/list")
public String findUsers(String usrName, Long roleId, Model model) {
List<User> list=userService.findAllUsers();
model.addAttribute("users",list);
return "/user/list";
}
页面内容
add.html<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.w3.org/1999/xhtml" layout:decorate="~{main}"
xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout"
>
<head>
<title>用户管理</title>
<link th:href="@{/localcss/crmlist.css}" href="../../static/localcss/crmlist.css" rel="stylesheet">
</head>
<body>
<div layout:fragment="content">
<div class="">
<div class="clearfix"></div>
<div class="row">
<div class="col-md-12">
<div class="x_panel">
<div class="x_title">
<h2>
用户管理 <i class="fa fa-user"></i>
<small>
- 您可以通过搜索或者其他的筛选项对用户的信息进行编辑、删除等管理操作。^_^
</small>
</h2>
<div class="clearfix"></div>
</div>
<div class="x_content">
<form method="post" action="/user/list" th:action="@{/user/list}">
<input type="hidden" name="pageIndex" value="1" />
<ul>
<li>
<div class="form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-12">用户名称</label>
<div class="col-md-6 col-sm-6 col-xs-12">
<input name="usrName" type="text" th:value="${usrName}"
class="form-control col-md-6 col-xs-12" value="">
</div>
</div>
</li>
<li>
<div class="form-group">
<label class="control-label col-md-3 col-sm-3 col-xs-12">角色</label>
<div class="col-md-6 col-sm-6 col-xs-12">
<select name="roleId" id="roleId" class="form-control">
<option value="0">--请选择--</option>
<option th:selected="${role.roleId eq roleId}" th:each="role : ${roles}"
th:value="${role.roleId}" th:text="${role.roleName}" value="">
角色1
</option>
</select>
</div>
</div>
</li>
<li>
<button type="submit" class="btn btn-primary"> 查 询
</button>
</li>
</ul>
</form>
</div>
</div>
</div>
<div class="col-md-12 col-sm-12 col-xs-12">
<div class="x_panel">
<div class="x_content">
<p class="text-muted font-13 m-b-30"></p>
<div id="datatable-responsive_wrapper"
class="dataTables_wrapper form-inline dt-bootstrap no-footer">
<div class="row">
<div class="col-sm-12">
<a href="/user/add" th:href="@{/user/add}" class="btn btn-success btn-sm">新增用户信息</a>
<table id="datatable-responsive"
class="table table-striped table-bordered dt-responsive nowrap dataTable no-footer dtr-inline collapsed"
cellspacing="0" width="100%" role="grid"
aria-describedby="datatable-responsive_info" style="width: 100%;">
<thead>
<tr role="row">
<th class="sorting_asc" tabindex="0"
aria-controls="datatable-responsive" rowspan="1" colspan="1"
aria-label="First name: activate to sort column descending"
aria-sort="ascending">编号
</th>
<th class="sorting" tabindex="0"
aria-controls="datatable-responsive" rowspan="1" colspan="1"
aria-label="Last name: activate to sort column ascending">
用户名
</th>
<th class="sorting" tabindex="0"
aria-controls="datatable-responsive" rowspan="1" colspan="1"
aria-label="Last name: activate to sort column ascending">
角色
</th>
<th class="sorting" tabindex="0"
aria-controls="datatable-responsive" rowspan="1" colspan="1"
aria-label="Last name: activate to sort column ascending">
操作
</th>
</tr>
</thead>
<tbody>
<tr role="row" class="odd" th:each="user : ${userPager.records}">
<td tabindex="0" class="sorting_1" th:text="${user.usrId}">usrId</td>
<td th:text="${user.usrName}">usrName</td>
<td th:text="${user.role.roleName}">roleName</td>
<td>
<div class="btn-group">
<button type="button" class="btn btn-danger">点击操作</button>
<button type="button" class="btn btn-danger dropdown-toggle"
data-toggle="dropdown" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a class="editInfo"
href="/user/edit?usrId=1"
th:href="@{/user/edit(usrId=${user.usrId})}"
data-toggle="tooltip"
data-placement="top" title=""
data-original-title="编辑">编辑</a>
</li>
<li><a class="delInfo" id="del" href="#"
th:onclick="|doDel(this,${user.usrId})|"
data-toggle="tooltip" data-placement="top" title=""
data-original-title="删除">删除</a></li>
</ul>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-sm-5">
<div class="dataTables_info" id="datatable-responsive_info"
role="status" aria-live="polite">共<span th:text="${userPager.total }">1</span>条记录
<span th:text="${userPager.current }">1</span>/<span
th:text="${userPager.pages }">1</span>页
</div>
</div>
<div class="col-sm-7">
<div class="dataTables_paginate paging_simple_numbers"
id="datatable-responsive_paginate">
<ul class="pagination">
<li class="paginate_button previous" th:if="${userPager.current gt 0}"><a
href="javascript:page_nav(document.forms[0],1);"
aria-controls="datatable-responsive" data-dt-idx="0"
tabindex="0">首页</a>
</li>
<li class="paginate_button" th:if="${userPager.current gt 1}"><a href="#" th:onclick="'javascript:page_nav(document.forms[0],'+${userPager.current - 1 }+');'"
aria-controls="datatable-responsive"
data-dt-idx="1"
tabindex="0">上一页</a>
</li>
<li class="paginate_button "
th:if="${(userPager.current) lt userPager.pages}"><a
href="#"
th:onclick="'javascript:page_nav(document.forms[0],'+${userPager.current + 1 }+');'"
aria-controls="datatable-responsive" data-dt-idx="1"
tabindex="0">下一页</a>
</li>
<li class="paginate_button next"
th:if="${(userPager.current) lt userPager.total}"><a
href="#"
th:onclick="'javascript:page_nav(document.forms[0],'+${userPager.pages }+');'"
aria-controls="datatable-responsive" data-dt-idx="7"
tabindex="0">最后一页</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script layout:fragment="js" th:inline="javascript">
function doDel(obj, usrId) {
if (confirm("你确定需要删除该用户信息吗?")) {
$.ajax({
type: "POST",
url: ctxPath + "user/del/" + usrId,
dataType: "text",
success: function (data) {
if (data === "true") { // 删除成功:移除删除行
alert("删除成功!");
$(obj).parents("tr").remove();
}
},
error: function (data) {
alert("对不起,删除失败!");
}
});
}
}
</script>
</html>