【原】无脑操作:IDEA + maven + SpringBoot + JPA + EasyUI实现CRUD及分页

背景:上一篇文章的界面太丑、没有条件查询功能。所以做一些改进,整合EasyUI做实现。(仅以此文纪念表格中出现的这些朋友工作六周年,祭奠一下逝去的青春^_^)

一、开发环境(参照上一篇文章)

补充:EasyUI直接从官网随便下载一个版本即可,本文用的版本是 1.3.3

二、程序结构:java目录下都是服务端代码,resources目录下templates目录存放页面文件,static目录下存放JavaScript文件、CSS文件、图片等资源文件

三、具体实现(Talk is cheap.Show your my code.该写的注释都在代码中^_^)

1、pom.xml(同上一篇)

2、resources目录下新建application.properties(当然喜欢用yaml的可以用yaml)(同上一篇)

3、创建SpringBoot程序启动类SpringbootApplication.java(同上一篇)

4、创建实体类Person.java

 1 package cn.temptation.model;
 2
 3 import javax.persistence.*;
 4
 5 //建库建表
 6 //DROP TABLE person;
 7 //
 8 //CREATE TABLE person
 9 //(
10 //personid INT AUTO_INCREMENT PRIMARY KEY,
11 //personname VARCHAR(10) NOT NULL,
12 //personage INT NOT NULL
13 //);
14 //
15 //INSERT INTO person VALUES
16 //(NULL, ‘张洋‘, 21), (NULL, ‘张兄家‘, 20), (NULL, ‘王生杰‘, 22),
17 //(NULL, ‘洪自军‘, 21), (NULL, ‘吴庆庆‘, 21), (NULL, ‘武建昌‘, 22), (NULL, ‘叶宇‘, 18);
18 //
19 //SELECT * FROM person;
20 @Entity
21 @Table(name = "person")
22 public class Person {
23     @Id
24     @GeneratedValue(strategy = GenerationType.IDENTITY)
25     @Column(name = "personid")
26     private Integer personid;
27     @Column(name = "personname")
28     private String personname;
29     @Column(name = "personage")
30     private Integer personage;
31
32     public Person() {
33     }
34
35     public Person(String personname, Integer personage) {
36         this.personname = personname;
37         this.personage = personage;
38     }
39
40     public Integer getPersonid() {
41         return personid;
42     }
43
44     public void setPersonid(Integer personid) {
45         this.personid = personid;
46     }
47
48     public String getPersonname() {
49         return personname;
50     }
51
52     public void setPersonname(String personname) {
53         this.personname = personname;
54     }
55
56     public Integer getPersonage() {
57         return personage;
58     }
59
60     public void setPersonage(Integer personage) {
61         this.personage = personage;
62     }
63 }

5、创建DAO接口PersonDao.java

 1 package cn.temptation.dao;
 2
 3 import cn.temptation.model.Person;
 4 import org.springframework.data.jpa.repository.JpaRepository;
 5 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 6
 7 /**
 8  * 因为需要使用分页和条件查询,所以从JpaRepository接口 和 JpaSpecificationExecutor接口继承
 9  */
10 public interface PersonDao extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person> {
11
12 }

6、创建控制器类PersonController.java

  1 package cn.temptation.web;
  2
  3 import cn.temptation.dao.PersonDao;
  4 import cn.temptation.model.Person;
  5 import cn.temptation.util.TypeUtil;
  6 import org.springframework.beans.factory.annotation.Autowired;
  7 import org.springframework.data.domain.Page;
  8 import org.springframework.data.domain.PageRequest;
  9 import org.springframework.data.domain.Pageable;
 10 import org.springframework.data.domain.Sort;
 11 import org.springframework.data.jpa.domain.Specification;
 12 import org.springframework.stereotype.Controller;
 13 import org.springframework.web.bind.annotation.RequestMapping;
 14 import org.springframework.web.bind.annotation.RequestParam;
 15 import org.springframework.web.bind.annotation.ResponseBody;
 16
 17 import javax.persistence.criteria.*;
 18 import java.util.HashMap;
 19 import java.util.List;
 20 import java.util.Map;
 21
 22 @Controller
 23 @RequestMapping("/person")
 24 public class PersonController {
 25     @Autowired
 26     private PersonDao personDao;
 27
 28     /**
 29      * 跳转至列表页
 30      *
 31      * @return
 32      */
 33     @RequestMapping("/view")
 34     public String view() {
 35         // 跳转至列表页
 36         return "personlist";
 37     }
 38
 39     /**
 40      * 查询列表信息
 41      *
 42      * @param searchcondition 查询条件
 43      * @param searchcontent   查询内容
 44      * @param page            页数
 45      * @param rows            每页记录数
 46      * @return
 47      */
 48     @RequestMapping("/list")
 49     @ResponseBody
 50     public Map<String, Object> list(@RequestParam(value = "searchcondition", required = false) String searchcondition,
 51                                     @RequestParam(value = "searchcontent", required = false) String searchcontent,
 52                                     @RequestParam(value = "page", required = false) Integer page,
 53                                     @RequestParam(value = "rows", required = false) Integer rows) {
 54         // 创建查询规格对象
 55         Specification<Person> specification = new Specification<Person>() {
 56             @Override
 57             public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
 58                 Predicate predicate = null;
 59                 Path path = null;
 60
 61                 if (searchcondition != null && !"".equals(searchcondition)
 62                         && searchcontent != null && !"".equals(searchcontent)) {
 63                     switch (searchcondition) {
 64                         case "personname":      // 人员名称
 65                             path = root.get("personname");
 66                             predicate = cb.like(path, "%" + searchcontent + "%");
 67                             break;
 68                         case "personage":       // 人员年龄
 69                             path = root.get("personage");
 70                             if (TypeUtil.isNum(searchcontent)) {
 71                                 predicate = cb.equal(path, Integer.parseInt(searchcontent));
 72                             }
 73                             break;
 74                     }
 75                 }
 76
 77                 return predicate;
 78             }
 79         };
 80
 81         Pageable pageable = new PageRequest(page - 1, rows, Sort.Direction.ASC, "personid");
 82         Page<Person> pagePerson = personDao.findAll(specification, pageable);
 83
 84         // 获取rows
 85         List<Person> list = pagePerson.getContent();
 86         // 获取count
 87         Long count = pagePerson.getTotalElements();
 88
 89         Map<String, Object> resultMap = new HashMap();
 90         resultMap.put("total", count);
 91         resultMap.put("rows", list);
 92         resultMap.put("success", true);
 93
 94         return resultMap;
 95     }
 96
 97     /**
 98      * 新增处理 和 修改处理
 99      *
100      * @param person
101      * @return
102      */
103     @RequestMapping("/save")
104     @ResponseBody
105     public Map<String, Object> personsave(Person person) {
106         Map<String, Object> resultMap = new HashMap<String, Object>();
107         personDao.save(person);
108         resultMap.put("success", true);
109         return resultMap;
110     }
111
112     /**
113      * 删除处理
114      *
115      * @param personid
116      * @return
117      */
118     @RequestMapping("/delete")
119     @ResponseBody
120     public Map<String, Object> persondelete(@RequestParam("id") String personid) {
121         Map<String, Object> resultMap = new HashMap<String, Object>();
122         personDao.deleteById(Integer.parseInt(personid));
123         resultMap.put("success", true);
124         return resultMap;
125     }
126 }

7、创建工具类TypeUtil.java

 1 package cn.temptation.util;
 2
 3 import java.util.regex.Pattern;
 4
 5 public class TypeUtil {
 6     /**
 7      * 验证是否整数
 8      *
 9      * @param str
10      * @return
11      */
12     public static boolean isNum(String str) {
13         Pattern pattern = Pattern.compile("^-?[0-9]+");
14         if (pattern.matcher(str).matches()) {
15             return true;
16         } else {
17             return false;
18         }
19     }
20
21     /**
22      * 验证是否小数
23      *
24      * @param str
25      * @return
26      */
27     public static boolean isNumEx(String str) {
28         Pattern pattern = Pattern.compile("^[-+]?[0-9]+(\\.[0-9]+)?$");
29         if (pattern.matcher(str).matches()) {
30             return true;
31         } else {
32             return false;
33         }
34     }
35 }

8、resources目录下新建templates目录,创建表现层:人员列表页面(personlist.html)

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>人员列表</title>
 6     <link rel="stylesheet" type="text/css" href="../easyui/themes/default/easyui.css">
 7     <link rel="stylesheet" type="text/css" href="../easyui/themes/icon.css">
 8     <script type="text/javascript" src="../easyui/jquery.min.js"></script>
 9     <script type="text/javascript" src="../easyui/jquery.easyui.min.js"></script>
10     <script type="text/javascript" src="../easyui/locale/easyui-lang-zh_CN.js"></script>
11     <script type="text/javascript" src="../biz/person.js"></script>
12 </head>
13 <body>
14 <!-- 表格 -->
15 <table id="dg">
16 </table>
17 <!-- 工具栏 -->
18 <div id="tb">
19     <table cellpadding="0" cellspacing="0">
20         <tr>
21             <td>
22                 <a href="javascript:loadAll()" class="easyui-linkbutton" iconCls="Arrowrefresh" plain="true">加载全部</a>
23             </td>
24             <td>
25                 <div class="datagrid-btn-separator"></div>
26             </td>
27             <td>
28                 &nbsp;检索条件:&nbsp;
29                 <select id="searchcondition" class="easyui-combobox" name="searchcondition" style="width:200px;">
30                     <option value="personname">人员名称</option>
31                     <option value="personage">人员年龄</option>
32                 </select>&nbsp;
33             </td>
34             <td>
35                 <input type="text" id="searchcontent" name="searchcontent" size="20" onkeydown="if(event.keyCode==13){ queryAction(); }"/>
36             </td>
37             <td><a href="javascript:queryAction()" class="easyui-linkbutton" iconCls="Magnifier" plain="true">搜索</a></td>
38             <td>
39                 <div class="datagrid-btn-separator"></div>
40             </td>
41             <td><a href="javascript:openAddDialog()" class="easyui-linkbutton" iconCls="icon-add" plain="true">新增</a></td>
42             <td>
43                 <div class="datagrid-btn-separator"></div>
44             </td>
45             <td><a href="javascript:openModifyDialog()" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a></td>
46             <td>
47                 <div class="datagrid-btn-separator"></div>
48             </td>
49             <td><a href="javascript:deleteAction()" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a></td>
50         </tr>
51     </table>
52 </div>
53 <!-- 弹出新增修改对话框 -->
54 <div id="dlg" class="easyui-dialog" style="width:300px;height:200px;padding: 10px 10px" closed="true"
55      buttons="#dialog-buttons" modal="true">
56     <form id="fm" method="post">
57         <table>
58             <tr>
59                 <td><label for="personname">人员名称</label></td>
60                 <td><input type="text" id="personname" name="personname" class="easyui-validatebox" required="true"/>
61                 </td>
62             </tr>
63             <tr>
64                 <td><label for="personage">人员年龄</label></td>
65                 <td><input type="text" id="personage" name="personage" class="easyui-validatebox" required="true"/>
66                 </td>
67             </tr>
68         </table>
69     </form>
70 </div>
71 <!-- 对话框按钮 -->
72 <div id="dialog-buttons">
73     <a href="javascript:saveAction()" class="easyui-linkbutton" iconCls="icon-ok">保存</a>
74     <a href="javascript:closeDialog()" class="easyui-linkbutton" iconCls="icon-cancel">关闭</a>
75 </div>
76 </body>
77 </html>

9、resources目录下新建static目录,创建表现层:人员管理用脚本文件(person.js)

  1 var url;
  2
  3 // 页面加载
  4 $(function () {
  5     $("#dg").datagrid({
  6         url: ‘list‘,
  7         queryParams: {},
  8         title: "人员列表",
  9         rownumbers: true,
 10         fit: true,
 11         toolbar: "#tb",
 12         collapsible: true,
 13         pagination: true,
 14         pageSize: 5,
 15         pageList: [5, 10],
 16         columns: [[
 17             {field: ‘personid‘, title: ‘人员编号‘, width: 50, align: ‘center‘, halign: ‘center‘, hidden: ‘true‘},
 18             {field: ‘personname‘, title: ‘人员名称‘, width: 200, align: ‘center‘, halign: ‘center‘},
 19             {field: ‘personage‘, title: ‘人员年龄‘, width: 200, align: ‘right‘, halign: ‘center‘}
 20         ]]
 21     });
 22 });
 23
 24 // 【加载全部】按钮押下处理
 25 var loadAll = function () {
 26     // 查询条件还原为默认状态
 27     $(‘#searchcondition‘).combobox(‘setValue‘, ‘personname‘);
 28     $(‘#searchcontent‘).val("");
 29
 30     // 表格重新加载
 31     var param = {};
 32     $("#dg").datagrid(‘load‘, param);
 33 };
 34
 35 // 【搜索】按钮押下处理
 36 var queryAction = function () {
 37     var param = {
 38         searchcondition: $(‘#searchcondition‘).combobox(‘getValue‘),
 39         searchcontent: $(‘#searchcontent‘).val()
 40     };
 41
 42     $("#dg").datagrid(‘load‘, param);
 43 };
 44
 45 // 重置表单内容
 46 var resetValue = function () {
 47     $(‘#fm‘)[0].reset();
 48 };
 49
 50 // 打开添加对话框
 51 var openAddDialog = function () {
 52     resetValue();
 53     $(‘#dlg‘).dialog({
 54         modal: true,
 55         title: ‘添加人员信息‘
 56     });
 57     $(‘#dlg‘).dialog("open");
 58     url = "save";
 59 };
 60
 61 // 新增处理
 62 var saveAction = function () {
 63     $("#fm").form("submit", {
 64         url: url,
 65         onSubmit: function () {
 66             return $(this).form("validate");
 67         },
 68         success: function (result) {
 69             var result = eval(‘(‘ + result + ‘)‘);
 70             if (result.success) {
 71                 $.messager.alert("系统提示", "保存成功!");
 72                 resetValue();
 73                 $("#dlg").dialog("close");
 74                 $("#dg").datagrid("reload");
 75             } else {
 76                 $.messager.alert("系统提示", "保存失败!");
 77                 return;
 78             }
 79         }
 80     });
 81 };
 82
 83 // 关闭对话框
 84 var closeDialog = function () {
 85     $("#dlg").dialog("close");
 86     resetValue();
 87 };
 88
 89 // 打开编辑对话框
 90 var openModifyDialog = function () {
 91     var selectedRows = $("#dg").datagrid("getSelections");
 92
 93     if (selectedRows.length != 1) {
 94         $.messager.alert("系统提示", "请选择一条要编辑的数据!");
 95         return;
 96     }
 97
 98     var row = selectedRows[0];
 99     $("#dlg").dialog("open").dialog("setTitle", "编辑人员信息");
100     $("#fm").form("load", row);
101     url = "save?personid=" + row.personid;
102 };
103
104 // 删除处理
105 var deleteAction = function () {
106     var selectedRows = $("#dg").datagrid("getSelections");
107
108     if (selectedRows.length == 0) {
109         $.messager.alert("系统提示", "请选择要删除的数据");
110         return;
111     }
112
113     $.messager.confirm("系统提示", "您确定要删除这<font color=red>" + selectedRows.length + "</font>条数据吗?", function (r) {
114         if (r) {
115             $.post("delete", {
116                 id: selectedRows[0].personid
117             }, function (result) {
118                 if (result.success) {
119                     $.messager.alert("系统提示", "数据已成功删除!");
120                     $("#dg").datagrid("reload");
121                 } else {
122                     $.messager.alert("系统提示", "数据删除失败,请联系工作人员!");
123                 }
124             }, "json");
125         }
126     });
127 };

四、启动项目,运行效果如下

原文地址:https://www.cnblogs.com/iflytek/p/8594103.html

时间: 2024-08-28 15:53:46

【原】无脑操作:IDEA + maven + SpringBoot + JPA + EasyUI实现CRUD及分页的相关文章

【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他URL,均跳转至登录页面 ② 登录涉及帐号和密码,帐号错误提示帐号错误,密码错误提示密码错误 ③ 登录成功跳转至首页,首页显示登录者帐号信息,并有注销帐号功能,点击注销退出系统 ------------------------------------------------------------------

【原】无脑操作:Eclipse + Maven + jFinal + MariaDB 环境搭建

一.开发环境 1.windows 7 企业版 2.Eclipse IDE for Enterprise Java Developers  Version: 2019-03 (4.11.0) 3.JDK 1.8 4.Maven 3.5.2 5.MariaDB 6.Tomcat 8.5 二.基础配置 1.Eclipse中Maven的设置如下图 2.数据库使用默认的test库,创建表category 1 CREATE TABLE category 2 ( 3 categoryid INT AUTO_I

【原】无脑操作:Windows 10 + MySQL 5.5 安装使用及免安装使用

本文介绍Windows 10环境下, MySQL 5.5的安装使用及免安装使用 资源下载: MySQL安装文件:http://download.csdn.net/detail/lf19820717/9892711 MySQL免安装文件:http://download.csdn.net/detail/lf19820717/9892716 ---------------------------------------------------------------------------------

【原】无脑操作:Webstorm集成Git/Github

Webstorm作为前端开发的主流工具,对Git及Github可以非常简便的集成. 1.开发环境:(如何安装就不说了) ① Webstorm 2018 ② git version 2.20.1 ③ Github注册用户 --------------------------------------------------------------------------------------------------------------- 2.Webstorm的工具设置: ① 菜单项File下的

【原】无脑操作:Windows下搭建Kafka运行环境

Kafka是一种高吞吐量的分布式发布订阅消息系统 1.优点:① 通过磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能.② 高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息.③ 支持通过Kafka服务器和消费机集群来分区消息.④ 支持Hadoop并行数据加载. 2.基本概念: ① Broker:Kafka集群包含的一个或多个服务器② Topic:每条发布到Kafka集群的消息都有一个类别主题.(物理上不同Topic的消息分开存储,逻辑上一

用Springboot+Jpa实现学生CRUD操作(含前端页面,含分页,自定义SQL)

在数据库中建student表 建包 1.编写entity包下实体类Student (一个Javabean规范) package com.example.stu.kudestu.stu.entity; import javax.persistence.*; @Entity @Table(name = "student") //@Entity 应用在实体类上 @Table(name = "student") 应用在实体类上,并且name属性为数据库表名 public c

MySQL轻量版使用,无需安装,无脑操作

不知道是否有想我一样的,开始用的都是安装版的,特别费事,卸载后注册表很难删除 下面介绍一下MySQL轻量级的如下 首先打开一个网址:www.oracle.com没错就是强大的Oracle官网 也可以直接点击MySQL不过有点慢http://dev.mysql.com/downloads/mysql/ 下一步如图操作 点进去之后如下 往下翻,按照如下操作 下载符合你电脑的配置,放到一个盘符下进行解压,打开cmd试下看看好不好用,觉得好用的给推荐一下!

centOS7安装mysql8.0完美教程!!只要按照步骤,无脑操作,一次成功!

查看防火墙systemctl status firewalld重启防火墙systemctl start firewalld 1.mysql 首先关闭防火墙 systemctl stop firewalld 1.1 检查系统是否已经安装过mysql rpm -qa|grep mariadb 如果查询到结果,证明已经安装过,必须先卸载 1.2 卸载mariadb rpm -e --nodeps mariadb-libs 1.3 由于mysql会产生临时文件存到/tmp文件夹中,如果使用非root管理

【原】Bootstrap+Knockout.JS+ASP.Net MVC3+PetaPOCO实现CRUD操作

1.需求: 1.1)页面要美观大气 1.2)前端代码要简洁清晰,要用MVC或是MVVM框架 1.3)服务端要用MVC框架,要Rest风格 1.4)数据访问要用ORM 2.效果: 2.1)列表 2.2)分页 2.3)新增 2.4)修改 3.技术考虑: 3.1)考虑到页面的美观大气,在没有美工的情况下,Bootstrap的确是一个很好的选择 3.2)前端框架选择了MVVM的Knockout.JS,大概是因为Microsoft在自己的项目模板里都自带了这个框架吧,所以一直对它挺有好感 3.3)ASP.